Читаем Интернет-журнал "Домашняя лаборатория", 2007 №9 полностью

В табл. 1 и 2 представлены программы рекурсивного цифрового фильтра второго порядка. Они написаны на языках C++ и Паскале в средах разработки Borland C++Builder 4 и Borland Delphi 4 в соответствии с технологией создания моделей пользователя для программы VisSim. При трансляции получается файл pid.dll, главная функция которого "zW" может быть включена в модель программы VisSim с помощью блока "userFunction" (см. рис. 7). При записи коэффициентов РУ (*) в параметры блока и стробировании частотой 2000 Гц — это и будет модель искомого дискретного ПИД-регулятора.



Таблица 1

Файл pid.cpp

#include

#include

#pragma hdrstop

#define EXPORT32 declspec(dllexport)


//-----------

struct z TF_INFO {

       double k; // коэффициент усиления double

       double b0,b1,Ь2; // коэффициенты полинома числителя

       double a0, a1, a2; //коэффициенты полинома знаменателя

};


//----------

extern "С" {

       double buffer_x[2]={0,0}, buffer_y[]={0,0};

       double с, help_y;

//*** функция размещения параметров ***

//*** Вызывается VisSim-ом при создании блока ****

EXPORT32 long WINAPI zWPA(short FAR *ppCount){

      *ppCount=7; // число записываемых в файл vsm параметров модели пользователя

        return sizeof(z_TF_INFO);

}

//*** Процедура инициализации параметров ***

//*** Вызывается VisSim-ом после РА функции ***

XPORT32 void WINAPI zWPI(z_TF_INFO *zTF){

        zTF->k=31.9016459416667;

        zTF->b0=1;

        zTF->b1=-1.9894401341982;

        zTF->b2=0.98945592544195;

        zTF->a0=1;

        zTF->a1=-1.3333333333333;

        zTF->a2=0.33333333333333;

}

//*** функция изменения параметров ***

//*** Вызывается VisSim-ом при нажатии правой клавиши мыши ***

EXPORT32 LPSTR WINAPI zWPC(z_TF_INFO *zTF){

       return "k;Ь0;b1;b2;a0;a1;a2";

}

//*** Процедура Simulation Start ***

//*** Вызывается VisSim-ом на первом шаге моделирования ***

EXPORT32 long WINAPI zWSS(z_TF_INFO *zTF, long *runCount){

       buffer_x[0]=0; buffer_x[1]=0;

       buffer_y[0]=0; buffer_y[1]=0;

       help_y=0; c=0;

       return 0;

}

//*** Процедура Simulation End ***

//*** Вызывается VisSim-ом на последнем шаге моделирования ***

EXPORT32 long WINAPI zWSE(z_TF_INFO *zTF, long *runCount){

        return 0;

}

//*** Это базовая процедура в DLL ***

//*** Вызывается VisSim-ом на каждом шаге моделирования ***

EXPORT32 void WINAPI zW(z_TF_INFO *zTF, double FAR x[], double FAR y[])

        { if (x[0]==1 && c==0) {

//Непосредственный алгоритм с двумя буферами

        help_y=(zTF->k*(х[1]*zTF->b0+buffer_x[0]*zTF->b1+buffer_x[1]*zTF->b2)

              — (buffer_y[0]*zTF->a1+buffer_y[1]*zTF->a2)) / zTF->a0;

        buffer_x[1]=buffer_x[0]; buffer_x[0]=x[1];

        buffer_y[1]=buffer_y[0]; buffer_y[0]=help_y;

//Непосредственный алгоритм с одним буфером

/* double help;

help=(x[1]-(buffer_xf0/*zTF->a1+buffer_xfх[1]*zTF->a2))/zTF->aO;

help_y=(help*zTF->b0+buffer_x[0]*zTF->b1+buffer_x[1]*zTF->b2) *zTF->k; buffer_x[l]=buffer_x[0]; buffer_x[0]=help; */

}

у[0]=help_y;

c=x [0]; // организованна синхронизация блока no фронту

};


//----------

}//end extern "С" {

//----------

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*){

      return 1;

}


Таблица 2

Файл pid.dpr

library PID;


type

   InVector = array [0..9] of Double; {тип входной переменной: входов — 10}

   OutVector = array [0..9] of Double; {тип выходной переменной: выходов — 10}

   Global = record {запись параметров, и координат "dll"-модели}

       k: double;

       Ь0, b1 Ь2: double;

       а0, a1, а2: double;

end;


var buffer_x, buffer_y: array [0..1] of double;

    c, help_y: double;

{/*** базовая процедура в DLL ****/}

{/*** Вызывается VisSim-ом на каждом шаге моделирования ***/}

procedure zW(var zTF: Global; var x: InVector; var у: OutVector); export; stdcall;

var help: double;

begin

    if (x[0]=l)and(c=0) then

    begin

{Непосредственный алгоритм с двумя буферами}

       help_y:=(zTF.k*(х[1]*zTF.b0+buffer_x[0]*zTF.b1+buffer_x[1]*zTF.Ь2)

           — (buffer_y[0]*zTF.a1+buffer_y[1]*zTF.a2))/zTF.a0;

       buffer_x[1]:=buffer_x[0]; buffer_x[0]:=x[l];

       buffer_y[1]:=buffer_y[0]; buffer_y[0]:=help_y;{}

{Непосредственный алгоритм с одним буфером}

{help:=(x[1]-(buffer_x[0]*zTF.a1+buffer_x[1]*zTF.a2))/zTF.a0;

help_y:=(help*zTF.b0+buffer_x[0]*zTF.b1+buffer_x[1]*zTF.b2)*zTF.k;

buffer_x[1]:=buffer_x[0]; buffer_x[0]: =help;{}

end;

У[0]:=help_y;

с: =x [0]; {организованна синхронизация блока no фронту}

   end;


{/***функция размещения параметров***/}

{/*** Вызывается VisSim-ом при создании блока ***/}

function zWPA(var pCount: integer):Longint; export; stdcall;

begin

   pCount: = 7; {число записываемых в файл параметров диалогового окна}

   zWPA:= sizeof (Global); {размер памяти необходимый под параметры}

end;


{/*** Процедура инициализации параметров***/}

{/*** Вызывается VisSim-ом после РА функции ***/}

procedure zWPI(var zTF: Global); export; stdcall;

begin

   zTF.k:=31.9016459416667;

   zTF.b0:=1;

   zTF.b1:=-1.9894401341982;

   zTF.b2:=0.98945592544195;

   zTF.a0:=1;

   zTF.a1:=-1.3333333333333;

   zTF.a2:=0.33333333333333;

end;


{/*** функция изменения параметров ***/}

{/*** Вызывается VisSim-ом при нажатии правой клавиши мыши ***/}

function zWPC(var zTF: Global):Pchar; export; stdcall;

begin

   zWPC: ='k; b0; b1; b2; a0; a1; a2'; {названия могут быть любые}

end;


{/*** Процедура Simulation Start ***/}

{/*** Вызывается VisSim-ом на первом шаге моделирования ***/}

Перейти на страницу:

Похожие книги

Гостиная
Гостиная

Эта книга предназначена для тех, кто хотел бы собственными руками обустроить свою гостиную, сделав ее уютной и удобной. Здесь вы найдете исчерпывающие советы по созданию гармоничного интерьера, удобному освещению, размещению ковров, цветов и картин, а также других мелочей, которые превратят вашу гостиную в комфортабельную комнату, удовлетворяющую потребностям каждого члена семьи.В этой книге также даны подробные рекомендации по ремонту гостиной, которые помогут осуществить задуманное вами преобразование. Методы, описанные здесь, вполне доступны каждому. Надеемся, что эта книга поможет вам подойти к обустройству гостиной творчески, а ремонтные работы доставят истинное удовольствие.

Линиза Жалпанова , Линиза Жувановна Жалпанова , Наталья Михайловна Сухинина , Наталья Сухинина

Сделай сам / Дом и досуг