Федосов Борис Трофимович
РИИ, Рудный, Казахстан

УДК 681.51.01
Ф338

Создание блока пользователя для программы VisSim 5 в среде MS Visual C++6 с использованием мастера dllWizard

  1. Постановка задачи по созданию блока пользователя
  2. Включение в оболочку MS Visual C++6 мастера dllWizard
  3. Создание основы кода DLL пользователя
  4. Редактирование файлов проекта для получения блока
    с типовым диалоговым окном, отладка и компиляция.
  5. Сопроводительная документация
  6. Создание диалогового окна, вид которого определяется
    пользователем при создании блока
  7. Советы по просмотру примеров
  8. Заключение
  9. Литература

Статья предназначена для тех, кто хочет дополнить коллекцию базовых блоков VisSim’а своим собственным, но не является программистом-профессионалом и не владеет глубоко программированием. Использование разработанного фирмой Visual Solution мастера dllWizard создания основы программного кода блока, позволяет существенно упростить процесс создания блока пользователя, не углубляясь в тонкости программирования. Более того, статья может служить и первым кратким введением в MS Visual C++6 для тех, кто до этого вообще не имел дела с этой программой. Мастер dllWizard позволяет создавать блоки пользователя для версии VisSim 5.0 и выше. Для версии FAP VisSim 3.0 необходимо применять стандартные средства создания DLL пользователя в программах Visual C++6, Delphy, Visual Basic и др., методические указания для этого имеются в [1, 2].

Разработчики программно-моделирующей среды VisSim очень тонко и точно выбрали компромисс между эффективностью процесса моделирования, простотой интерфейса и построения схем, а также объемом программы. На первый взгляд графический интерфейс VisSim’а кажется простоватым, но при более глубоком знакомстве с программой становится понятно, что скупой интерфейс позволяет вполне комфортно моделировать объекты и системы, и, главное, использовать при этом быстрый, очень малый по размерам код. Быстродействие VisSim’а при решении сходных задач куда выше, чем, например, у программы общего назначения Mathcad. Сказанное относится и к создаваемым с помощью мастера блокам пользователя. При скромном виде типового диалогового окна, которое, впрочем, можно заменить своим, получающийся блок может отвечать всем пожеланиям пользователя в отношении его работоспособности.

1. Постановка задачи по созданию блока пользователя

Будем считать, что пользователь лучше знает, какой блок ему нужен, а значит, знает и может реализовать алгоритм его работы. Поэтому сосредоточимся на изложении технологии создания блока, представляющего собой, для примера, статическую нелинейность с характеристикой, аппроксимируемой несколькими отрезками линейно-ломаной (рис. 1):

gif-file, 20KB

Рис. 1. Статическая характеристика создаваемого нелинейного безинерционного блока состоит из трех отрезков и двух лучей. Крайние лучи задаются коэффициентами наклона, промежуточные отрезки – координатами концов. Блок позволяет реализовывать широкий спектр нелинейностей. Значения b1, b2, b3 и b4 должны задаваться в возрастающем порядке, значения коэффициентов k1, k2 и сk могут быть любыми

Выбор примера обусловлен тем, что в Vissim’е блок expression (выражение) не допускает применения условных выражений и операторов, а построение блока с рассматриваемой статической характеристикой из стандартных блоков громоздко. Наконец, блок с такой характеристикой может оказаться полезным при моделировании.

В результате дополнения блоком пользователя базовой библиотеки блоков VisSim’а, интерфейс VisSim’а примет вид:

gif-file, 20KB

Рис. 2. Окно программы VisSim, меню которой дополнено пунктом вызова блока Non_Lin_St пользователя. На осциллограмме изображен пример статической характеристики блока

В данной работе рассматривается порядок создания блока пользователя наикратчайшим путем. Более подробно создание блока рассмотрено в прилагаемом файле VisDLLWiz.chm.zip размером 337 КБ.

2. Включение в оболочку MS Visual C++ 6.0 мастера dllWizard

На компьютере с установленной программой MS Visual C++ 6 следует запустить dllWizard.exe - файл, размером 210 КБ можно взять на ftp-сервере фирмы Visual Solution.

3. Создание основы кода DLL пользователя

После завершения установки мастера и открытия нового проекта в среде Visual C++ 6.0: File – New, появится окно выбора типа проекта, в котором станет возможным выбирать VisSim DLL Wizard:

gif-file, 20KB

Рис. 3. Выбор вида проекта VisSim DLL Wizard, задание его названия и местоположения

В окне New перейдем на вкладку видов проектов Project. Назовем проект (Project Name) Non_Lin_St и, создав предварительно папку с названием VC++ в корневом каталоге диска С, с помощью кнопки справа от поля ввода Location укажем путь к этой папке в открывшемся окне диалога. В результате ввода окно диалога New примет вид рис. 3.

После нажатия кнопки ОК, последовательно начнут появляться окна DLL-мастера, в которых следует заполнить требуемые позиции. Сделаем это.

Первый шаг:

gif-file, 20KB

Рис. 4. Первое окно мастера dllWizard построения основы кода блока пользователя. Приглашение к созданию блока и пояснение, что в построенную мастером основу программного кода потребуется внести дополнения, с тем, чтобы блок работал в соответствии с предъявляемыми к нему пользователем требованиями

Второй шаг:

В окне рис. 4. щелкнуть по кнопке Next. Появляется окно VisSim DLL Wizard - Step 2 of 7, в котором следует ввести названия базовой функции и блока. К базовой функции VisSim обращается на каждом шаге моделирования, выполняя свойственные блоку действия с сигналами. Название блока появляется на его изображении на рабочем пространстве VisSim’a. Названия могут быть разными, но для того, чтобы проще было запомнить название базовой функции, сохраним ее название: myFunc. Это название нужно знать при одном из способов выноса блока на рабочее пространство VisSim’а, посредством пункта userFunctions меню Blocks. Ввести название блока в виде: Nonlin\nSt Char. Это название будет написано в две строки на блоке (см. рис. 1), вынесенном на рабочее пространство VisSim’а. \n – знак переноса на новую строку.

Щелкнуть по кнопке Next.

Третий шаг:

В появившемся окне VisSim DLL Wizard - Step 3 of 7 необходимо ввести количество входов и выходов блока, которые требуются для его предполагаемой работы. В данном случае необходим один вход и один выход. Для задания этих значений следует ввести название входа (Labels), например in, и щелкнуть по кнопке +. Счетчик числа входов Block Input Count покажет единицу, а в списке входов появится название входа in. Аналогично вводится название выхода, в примере это out, и щелчком по кнопке +, добавляется в список выходов. Названия входов и выходов блоков могут быть и иными. Эти названия будут отображаться на изображении блока на рабочем пространстве VisSim.

Щелкнуть по кнопке Next.

Четвертый шаг:

В окне VisSim DLL Wizard - Step 4 of 7 устанавливаются типы входной и выходной переменных блока. В первой, простейшей DLL, когда скорость вычислений не является критичной и алгоритм обработки сигнала блоком сравнительно простой, целесообразно ничего не изменять в этом окне. Галочку в квадратике Want Custom Data Types не ставим.

Щелкнуть по кнопке Next.

Пятый шаг:

В окне VisSim DLL Wizard - Step 5 of 7 поставим галочку в пункте I want my blok to genetate C code. Это позволит, при необходимости, компилировать диаграмму VisSim’а, содержащую создаваемый блок для ускорения работы модели в десять и более раз.

Щелкнуть по кнопке Next.

Шестой шаг:

В окне VisSim DLL Wizard - Step 6 of 7 укажем расположение пункта меню VisSim’а, из которого предполагается выносить блок пользователя на рабочее пространство. Блок можно поместить в главном меню, но это не очень скромно, хотя, если его предполагается использовать часто, то допустимо. Поскольку здесь рассматривается создание нелинейного блока, то его целесообразно поместить в подменю Nonlinear меню Blocks. Однако мастер во избежание путаницы защищает оригинальные подменю, не позволяя помещать туда блоки, созданные пользователями. Поэтому выберем категорию Top Level Menu Name: Blocks, а подкатегорию Block Category Name (optional): назовем Nonlinear 2. Назовем пункт меню Non_Lin_St, записав это имя в подкатегории Block Name.

В простейшем примере не будем добавлять галочку в Include Custom MFC Dialog. Типовое диалоговое окно, которое будет появляться при щелчке правой кнопкой мыши по создаваемому блоку на рабочем пространстве диаграммы, для введения пользователем параметров блока, будет выглядеть аскетически скромным, но свою задачу – введение значений параметров с последующим их сохранением выполнять будет.

Щелкнем по кнопке Next.

Седьмой шаг:

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

Щелкнем по кнопке Finish.

В результате работы мастера dllWizard появится окно New Project Information, в котором сообщается, что сейчас будет создан проект, напоминается название базовой функции myFunc блока и указывается на файл vsi.cpp, в котором и придется вводить код пользователя.

Нажав ОК, перейдем в среду Visual C++ 6:

gif-file, 20KB

Рис. 5. Окна Microsoft Visual C++ 6 после завершения работы dllWizard. Отмечен файл vsi.cpp, подлежащий редактированию и кнопка построения (сборки) и компиляции библиотеки (dll)

4. Редактирование файлов проекта для получения блока с типовым диалоговым окном, отладка и компиляция

4.1. Редактирование файла vsi.cpp

На вкладке FileView проекта рис. 5 значительное количество файлов, но для создания блока VisSim с типовым диалоговым окном, чем мы сейчас и займемся, достаточно отредактировать только файл vsi.cpp, что значительно упрощает работу. Пусть вас не смущает кажущаяся, на первый взгляд, громоздкость добавляемого кода. При разборе этого примера его можно просто копировать из этого документа в окно редактора программного кода MS Visual C++ 6.

Двойным щелчком по названию файла vsi.cpp рис.5, откроем файл для редактирования в правом окне MS Visual C++. Заремаркируем объявление переменных, даваемых dllWizard’ом для примера, и добавим переменные, соответствующие координатам концов отрезков статической характеристики и коэффициентам наклона крайних лучей (рис. 1) в структуре:

typedef struct {
//int myInt; // Add your structure contents here
//double myDouble;
//char *myStr;
       double EB1;
       double EC1;
       double EB2;
       double EC2;
       double EB3;
       double EC3;
       double EB4;
       double EC4;
       double EK1;
       double EK2;
} NON_LIN_ST_INFO;

Мы не будем в текущем примере удалять те строки кода, которые дает для примера мастер основы, с тем, чтобы легче было находить требуемые места. Но, чтобы исключить их из программы, будем их ремаркировать.

Далее, сообщим, что требуется сохранять в 64-битном формате объявленные выше переменные, значения которых будут задаваться в типовом диалоговом окне. Число этих переменных 10, поэтому в кавычках нужно десять раз повторить букву F.

// This string tells VisSim what structure elements to save to .vsm
// I=int, F=64 bit float, f=32 bit float, s=string, c=char, b=byte
//#define NON_LIN_ST_INFO_STR "IFsF"
// 10 elements F-tipe save to .vsm
       #define NON_LIN_ST_INFO_STR "FFFFFFFFFF"

В разделе
/* User menu Table */
USER_MENU_ITEM um1[]
указывается расположение пункта меню для вызова блока, название блока и базовой функции, число входов и выходов блока и др. сведения. Познакомьтесь с ними.

Далее заменим типовую строку сведений о блоке EXPORT32 LPSTR PASCAL aboutEvent на более содержательную:

//MessageBox(vsmHWnd, "Non_Lin_St Block Version 1.0\nCopyright ©2002", "About Non_Lin_St", MB_OK);
// My version of MessageBox:

MessageBox(vsmHWnd, " Non_Lin_St Block Version 1.6 \n It is nonlinear block for VisSim, allowing to user change its \n static characteristic. Base Function: myFunc \n Author Fedosov B.T. defbort@mail.kz \n Copyright ©2003", "About Nonlinear Static Characteristic Block", MB_OK);

Весь этот текст нужно поместить в одну строку.

Теперь насытим содержанием базовую функцию. Смысл здесь в том, что в зависимости от того, какой величины сигнал поступает на блок, выходной сигнал высчитывается по той или иной формуле. В случае если х - координаты точек слома характеристики заданы не правильно, не в возрастающем порядке, выходной сигнал должен принимать значение 0. Обозначение pi->EB1 означает: переменная EB1 из структуры NON_LIN_ST_INFO.

Текст базовой функции myFunc должен принять вид:

EXPORT32 void EXPORT PASCAL
myFunc(NON_LIN_ST_INFO *pi, double inSig[], double outSig[])
{ /* outSig[0] = inSig[0] + inSig[1]; // this produces sum of two inputs */

// My operators. Output signal is determined
// depending on a carried out condition

if ((pi->EB1 <= pi->EB2) && (pi->EB2< = pi->EB3 ) && (pi->EB3< = pi->EB4 )) )
{
if (inSig[0]<= pi->EB1)
outSig[0]= pi->EC1+ pi->EK1*(inSig[0] -pi->EB1);
else if (inSig[0]<= pi->EB2)
outSig[0]=pi->EC1 + (pi->EC2-pi->EC1)/(pi->EB2- pi->EB1)*(inSig[0] -pi->EB1);
else if (inSig[0]<= pi->EB3 )
outSig[0]=pi->EC2+ (pi->EC3-pi->EC2)/(pi->EB3-pi->EB2)*(inSig[0] -pi->EB2);
else if (inSig[0]<= pi->EB4 )
outSig[0]=pi->EC3+ (pi->EC4-pi->EC3)/(pi->EB4-pi->EB3)*(inSig[0] -pi->EB3);
else
outSig[0]= pi->EC4+ pi->EK2*(inSig[0] -pi->EB4);
}
else
outSig[0] = 0;
}

Зададим исходные значения параметров так, чтобы вначале, при выносе на рабочее пространство VisSim’а блок был линейным, с единичным коэффициентом усиления:

/* Parameter Initialization function - executed once after "PA" function above */
EXPORT32 void EXPORT PASCAL myFuncPI(NON_LIN_ST_INFO *pi)
{
//Initial values of parameters - block linear
pi->EB1 = -2;
pi->EC1= -2;
pi->EB2 = -1;
pi->EC2 = -1;
pi->EB3 = 1;
pi->EC3 = 1;
pi->EB4 = 2;
pi->EC4 = 2;
pi->EK1 = 1;
pi->EK2 = 1;
} /* myFuncPI */

Потребуем, чтобы в случае, если процесс моделирования запускается при неверно введенных Х-координатах точек слома статической характеристики, появлялось сообщение об этом:

/* Simulation Start function - executed once on sim start */
EXPORT32 void EXPORT PASCAL myFuncSS(NON_LIN_ST_INFO *pi, long *runCount)
{
if ((pi->EB1 <= pi->EB2) && (pi->EB2< = pi->EB3 ) && (pi->EB3< = pi->EB4 ) )
;
else
// The message on wrong introduction of input coordinates
MessageBox(vsmHWnd, " Error input of coordinate!\nThe values x-coordinates of points\n should be entered in the growing\n order:\n b1 <= b2 < = b3 < = b4", "Error NonLinStCh", MB_OK);
}

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

"b1(<=b2);c1;b2(<=b3);c2;b3(<=b4);c3;b4;c4;k1;k2."

Фрагмент текста программы примет вид:

EXPORT32 LPSTR EXPORT PASCAL myFuncPC(NON_LIN_ST_INFO *pi, long *runCount)
{
// AFX_MANAGE_STATE( AfxGetStaticModuleState() );

//The standard dialogue VisSim will be used
//CVsmDialog dlg;
// dlg.m_myInt = pi->myInt;
// dlg.m_myDouble = pi->myDouble;
// dlg.m_myString = pi->myStr;
// if (dlg.DoModal() == IDCANCEL)
// return 0;
// pi->myInt= dlg.m_myInt;
//pi->myDouble = dlg.m_myDouble;
//pi->myStr = (LPSTR)grealloc(pi->myStr, dlg.m_myString.GetLength()+1);
// strcpy( pi->myStr, (LPCSTR) dlg.m_myString);

if ((pi->EB1 <= pi->EB2) && (pi->EB2< = pi->EB3 ) && (pi->EB3< = pi->EB4 ))
;
else
MessageBox(vsmHWnd, " Error input of coordinate!\nThe values x-coordinates of points\n should be entered in the growing\n order:\n b1 <= b2 < = b3 < = b4", "Error NonLinStCh", MB_OK);
//return "my int; my double;my string";
//The standard dialogue VisSim will be used

return "b1(<=b2);c1;b2(<=b3);c2;b3(<=b4);c3;b4;c4;k1;k2";
//return 0;
}

Проект готов к пробной компиляции в режиме отладки Debug. Образец исходных файлов проекта со стандартным диалоговым окном.

4.2. Пробная компиляция в режиме Debug

Щелкнуть по кнопке с изображением восклицательного знака на панели инструментов MS VC++ 6 (рис.5) или выбрать в меню Build – Execute. Появится окно с предложением создать файлы проекта, в котором следует щелкнуть по кнопке ОК. Через некоторое время в нижнем окне появится сообщение об ошибке: отсутствует файл vsuser.h.

Этот файл vsuser.h следует скопировать из папки с установленным VisSim’ом C:\VisSim50\Vsdk\INCLUDE в папку проекта C:\VC++\Non_Lin_St и снова запустить компиляцию.

Если не было ошибок при вводе, то в нижнем окне Visual C++ 6 появится сообщение: Non_Lin_St.dll - 0 error(s), 0 warning(s), а в папке проекта появится папка Debug с набором файлов, один из которых, верхний Non_Lin_St.dll, размером 105 КБ, и есть созданная динамическая библиотека, содержащая блок VisSim с нелинейной статической характеристикой.

4.3. Подключение DLL пользователя к программе VisSim

Запустить VisSim 5, в меню Edit выбрать Preferences, перейти на вкладку Addons. Щелкнуть дважды по строке с многоточием (…) и в появившемся окне диалога указать путь к только что созданной библиотеке: C:\VC++\Non_Lin_St\Debug. Открыть файл Non_Lin_St.dll.

gif-file, 20KB

Рис. 6. Добавление библиотеки Non_Lin_St.dll в VisSim

В окне Preferences щелкнуть по кнопке ОК. В результате, библиотека будет присоединена к VisSim’у, и в меню программы появятся новые пункты, как показано на рис. 1.

Другой способ выноса блока на рабочее пространство VisSim, без подключения DLL, состоит в использовании пункта userFunctions в меню Blocks. Для этого нужно вынести на рабочее пространство блок userFunction, двойным щелчком по блоку вызвать диалоговое окно и указать путь к файлу Non_Lin_St.dll с помощью кнопки Select в верхнем поле ввода, а в нижнем поле указать название базовой функции, в данном случае это myFunc. После щелчка по кнопке ОК, блок приобретет вид и свойства, заложенные в библиотеке. В этом случае в меню Blocks пункт Nonlinear 2 будет, естественно, отсутствовать.

4.4. Тестирование блока

Щелкнем по пункту меню Blocks – Nonlinear 2 - About Non_Lin_St Block. Должно появиться окно с сообщением о блоке. Полезно сравнить текст в нем и соответствующий текст в файле vsi.cpp (см. п. 4.1). Щелкнуть по кнопке ОК.

Вынести блок статической нелинейности Non_Lin_St на рабочее пространство VisSim, добавить генератор линейно растущего сигнала (ramp), генератор константы (const) и сумматор (SummingJunction), установить пределы времени моделирования от -5 сек до 5 сек, значение константы -5, задержку линейно растущего сигнала -5. Соединить блоки так, как показано на рис.7 и запустить процесс моделирования.

gif-file, 20KB

Рис. 7. Первая проверка работоспособности блока статической нелинейности. В исходном состоянии блок – линейный

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

gif-file, 20KB

Рис. 8. Задание значений координат точек слома и коэффициентов наклона крайних лучей статической характеристики. Горизонтальные координаты точек следует вводить в возрастающем порядке

Щелкнуть по кнопке ОК и запустить процесс моделирования. В результате будет построена ломаная, показанная на рис. 1.

Остается проверить, как ведет себя программа при вводе неверных значений. Введите значение b1 равное 3 и запустите модель. Появится сообщение рис. 9.

gif-file, 20KB

Рис. 9. Сообщение об ошибке, появляющееся при попытке запустить модель с неправильно введенными значениями х-координат. Такое же сообщение появляется при последующем открытии диалогового окна блока

4.5.Окончательная компиляция библиотеки

В главном окне MS Visual C++ выбрать в меню Build – Set Active Configuration. В появившемся окне выбрать Non_Lin_St – Win32Release. Щелкнуть ОК. Вновь запустить компиляцию, щелкнув по кнопке с восклицательным знаком (см. рис. 5). По окончании компиляции в папке проекта C:\VC++\Non_Lin_St появится еще одна папка, с названием Release (Выпуск). В этой папке помещен окончательный вариант библиотеки, значительно меньшего размера (24 кБ), чем в папке Debug. Его то теперь и нужно использовать, подключив к VisSim’у и убрав там ссылку на библиотеку их папки Debug.

Завершить работу MS Visual C++6, закрыть VisSim 5.

Справка. Чтобы открыть проект заново, нужно дважды щелкнуть по файлу Non_Lin_St.dsw в папке проекта C:\VC++\Non_Lin_St.

5. Сопроводительная документация

Итак, блок создан и работает. Типовое диалоговое окно рис. 8 позволяет вводить значения, но выглядит довольно скромно, не дает подсказки, что это за блок и как должны вводиться коэффициенты. Зато его просто создавать. Поэтому созданную библиотеку следует сопроводить файлом Readme.txt, в котором сообщить о свойствах блока, о том, как с ним нужно работать, и сведения об авторе. Желательно добавить рисунок статической характеристики и пример диаграммы.

Пример DLL и файлов сопровождения приведен в прилагаемом архиве NonLin_St_Dlg.zip, размером 9.3 кБ. Исходные файлы проекта приложены в архиве Initial_Stand_Dial.zip, размером 59.1 КБ.

6. Создание диалогового окна, вид которого определяется пользователем при создании блока

Мастер dllWizard позволяет создавать пользователю и более содержательные диалоговые окна, в том числе и с рисунками. Порядок создания таких окон, за недостатком места здесь, рассмотрен в прилагаемом файле в формате chm-справки.

Пример DLL с развитым диалоговым окном и файлов сопровождения приведен в прилагаемом архиве NonLin_my_Dlg.zip, размером 8.5 кБ. Исходные файлы проекта приложены в архиве Initial_Files_My_Dialog.zip, размером 48.3 КБ.

7. Советы по просмотру примеров

В приложении к этой статье имеются примеры VisSim-диаграмм, содержащих блоки, построенные в соответствии с рассмотренными выше указаниями. Для просмотра этих диаграмм требуется VisSim 5, к которому следует вначале подключить DLL в соответствии с пунктом 4.3, а затем открывать пример диаграммы. При этом в меню Blocks появится пункт Nonlinear 2 со всем его содержимым, рассмотренным выше (рис. 2).

Однако нужно отметить, что для просмотра уже созданной диаграммы с блоком пользователя достаточно иметь DLL (библиотеку) в той папке, откуда открывается диаграмма. При запуске диаграммы VisSim’а с блоком пользователя по умолчанию просматривается та папка, из которой запускается диаграмма, на наличие в ней необходимых библиотек и они подключаются к работе. В этом случае в меню Blocks пункт Nonlinear 2 не появляется, но диаграмма работает.

Заключение

Вы познакомились с принципами создания дополнительных блоков для VisSim’а. Конкретное их наполнение функциональными возможностями во многом зависит от поставленной задачи и вашей фантазии. Следует помнить, что MS Visual C++ 6 в связке с VisSim dllWizard обладает куда более широкими возможностями, чем продемонстрировано в данной статье. Это относится, в частности, к вопросу обработки внешних событий, в том числе восприятию создаваемым блоком нажатий клавиш, что позволит использовать не только мышь, но и клавиатуру для вмешательства в процесс моделирования.

Литература

  1. Клиначёв Н.В. Технология создания внешних "dll-моделей" для моделирующей программы VisSim. - Website: http://model.exponenta.ru/mydll.html, Челябинск, 2000.
  2. Клиначёв Н.В. Пример проектирования дискретного ПИД-регулятора с применением инструментария моделирующих пакетов. - Website: http://model.exponenta.ru/z_tf_pid.html, Челябинск, 2001.

4.11.2003