Выбрать главу

Таблица 1

Файл pid.cpp

#include <math.h>

#include <condefs.h>

#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;

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