Добавить в цитаты Настройки чтения

Страница 244 из 371



      *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-ом на первом шаге моделирования ***/}

procedure zWSS(var zTF: Global; var runCount: longint); export; stdcall;

   begin buffer_x[0]:=0; buffer_x[1]:=0;

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

   help_y:=0; с:=0;

end;

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

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

procedure zWSE(var zTF: Global; var runCount: longint); export; stdcall;

begin

end;

exports

   zW index 1, {Имя базовой процедуры в DLL Его нужно будет указать в блоке   user Function }

   zWPA index 2, {Список вспомогательных процедур и функций для экспорта. Они будут}

   zWPI index 3, {вызываться Vissint-ом по окончаниям PA,PI,PC,SS,SE для базового имени.}

   zWPC index 4,

   zWSS index 5,

   zWSE index 6;

begin

end.

ЭТАП 5 — Проверка работоспособности спроектированного цифрового ПИД-регулятора

Успех любого проекта основан на проверке технических решений. На этом этапе сказывается нехватка инструментария пакета VisSim. Для моделей пользователя недоступны все выды анализа (возможна только симуляция движения). Можно включить дискретный ПИД-регулятор (рис. 7) в контур модели и проверить схожесть переходного процесса с исходным, но этого не достаточно. В опыте будет подтверждено относительное соответствие высокочастотной части ЛAЧX, те работоспособность П & Д-каналов регулятора, но не интегрального, который при наличии в системе статических звеньев с большими коэффициентами усиления не определяет заметные глазу изменения вида переходного процесса. Можно конечно проверить, как регулятор отрабатывает ошибку в установившихся режимах движения при изменении задания с постоянной скоростью, ускорением, приращением ускорения, но мы поступим иначе — используем возможность пакета VisSim включать в модель блоки пользователя. Библиотека AzFqRsp.dll позволяет выполнить виртуальные измерения ЧХ систем (блоки "PGL01" & "Lfi021" на рис. 8). Частотные характеристики разработанной программы ПИД-регулятора (блок "pid.dll.zW") приведены на верхних графиках. ЛAЧX & ЛФЧХ исходного непрерывного ПИД-регулятора получены с помощью инструментария программы VisSim и демонстрируются на нижних графиках. Результаты вполне удовлетворительны.

КОМПЬЮТЕР ДЛЯ НАЧИНАЮЩИХ

Локальная сеть из двух компьютеров