Форум TRACE MODE: техническая поддержка   
мой профиль / my profile авторизация / login | регистрация / register | поиск / search | часто задаваемые вопросы / faq | начало / forum home

  Следующая старая тема / next oldest topic   Следующая новая тема / next newest topic
» Форум TRACE MODE: техническая поддержка » ТЕХНИЧЕСКАЯ ПОДДЕРЖКА / TECHNICAL SUPPORT TRACE MODE 5 » Языки программирования (IL/FBD) / Algorithm Programming Languages » Запаздывание на 1000 тактов

   
Автор / Author Тема / Topic: Запаздывание на 1000 тактов
SOU
Junior Member / Новичок
Участник № / Member № 802


Icon 8 отправлено / posted      Профиль для / Profile for SOU           Редактировать/удалить сообщение / Edit/Delete Post 
Для реализации динамической модели объекта с запаздыванием нам необходима линия задержки на 1000 тактов.
Мы написали программу задержки на 1000 тактов с использованием блоков LIMIT, LTN и вычитания, отладили ее и создали из нее FBD-блок. Затем этот FBD-блок использовали в программе динамической модели, которая создана как из стандартных FBD-блоков, так и созданных нами. Подключили эту модель к одному каналу, проверили все работает. Подключаем эту же программу к другому каналу - не работает ни первый ни второй канал (выход всегда равен нулю). Отключаем программу от второго канала - первый снова работает.
Не поймем в чем дело. В документации сказано, что при вызове одной программы разными каналами для каждого из них создается свой набор ее переменных. (стр.191 "Руководства пользователя"). Т.е. линия задержки в 1000 тактов должна организоваться для каждого канала.

Сообщения / Posts 15 | Из / From: Россия  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
АдАстра. Техподдержка
Administrator
Участник № / Member № 4


Icon 1 отправлено / posted      Профиль для / Profile for АдАстра. Техподдержка           Редактировать/удалить сообщение / Edit/Delete Post 
При вызове одной программы разными каналами для каждого из них действительно создается свой набор ее переменных. Однако, речь здесь идет о внутренних статических переменных программы. Их количество в любой FBD-программе не может превышать 255.
Т.о., Вы никак не могли сделать задержку на 1000 шагов только на внутренних переменных.
А если Вы использовали глобальные переменные, то они являются общими для всего узла.
Такую задачу, видимо, лучше всего решать с помощью DLL-блока на VC++. Только не забыть организовать внутренние массивы статических переменных, локализуемые от специального входа функционального блока, имеющего функцию "реализация".

Сообщения / Posts 17083 | Из / From: Россия  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
SOU
Junior Member / Новичок
Участник № / Member № 802


Icon 1 отправлено / posted      Профиль для / Profile for SOU           Редактировать/удалить сообщение / Edit/Delete Post 
С этим понятно. Как выяснить точное количество внутренних статических переменных программы?
Сообщения / Posts 15 | Из / From: Россия  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
АдАстра. Техподдержка
Administrator
Участник № / Member № 4


Icon 1 отправлено / posted      Профиль для / Profile for АдАстра. Техподдержка           Редактировать/удалить сообщение / Edit/Delete Post 
К сожалению, доступного пользователю прозрачного механизма контроля количества переменных в FBD-программе у нас нет. Контроль ведется автоматически редактором FBD.
Ориентировочно можно оценить следующим образом. К количеству выходов всех FB (независимо от того,используете Вы их или нет) прибавить количество констант и количество входов FB, являющихся независимыми аргументами.
Погрешности определяются дополнительными внутренними статическими переменными в стандартных и IL-блоках, входящих в состав FBD.
Количество внутренних статических переменных в FB не превышает 4.
О наличии в FB статических переменных можно судить по описанию его математики. Примеры: PID, Скользящее среднее, Предсказание, Производная по трем точкам.

Сообщения / Posts 17083 | Из / From: Россия  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
SOU
Junior Member / Новичок
Участник № / Member № 802


Icon 1 отправлено / posted      Профиль для / Profile for SOU           Редактировать/удалить сообщение / Edit/Delete Post 
Не совсем понятно как работать со специальным входом функционального блока, имеющего функцию "реализация".
Вы не могли бы дать пример DLL-блока, реализующего запаздывание?

Сообщения / Posts 15 | Из / From: Россия  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
АдАстра. Техподдержка
Administrator
Участник № / Member № 4


Icon 1 отправлено / posted      Профиль для / Profile for АдАстра. Техподдержка           Редактировать/удалить сообщение / Edit/Delete Post 
Пожалуйста - пример блока с запаздыванием на 30 реализаций:

code:
 
#include <string.h>
__declspec(dllexport) int FBD_DLL( float*, float*, int*, int* );
__declspec(dllexport) void zFBD_DLL_info( void* );
__declspec(dllexport) void zFBD_DLL_varname( char* );


typedef struct
{
int q_in; // Количество входов
int q_out; // Количество выходов
int q_int; // Зарезервировано
int type; // Номер в списке функциональных разделов.
// Должно быть равно 17
char name[8]; // Короткое имя для вывода на экран
char fname[8]; // Полное имя
} DO_DEFAULT;

int FBD_DLL( float *in, // Указатель на массив входов
float *out, // Указатель на массив выходов
int *l, int *rl ) // Зарезервировано
{
int i;
float s;
static float w[1000][30];
s=1000/in[2];
for(i=0;i<1000;i++)
w[i][(int)in[3]]=w[i+1][(int)in[3]];
w[1000][(int)in[3]]=in[0];
out[0]=w[(int)(1000-in[1]*s)][(int)in[3]];
return 0;
}

void zFBD_DLL_info( void *buf )
{
DO_DEFAULT *dd;
dd=(DO_DEFAULT *)buf;
strcpy( dd->name, "late_n" );
strcpy( dd->fname, "late_n" );
dd->q_in = 5;
dd->q_out = 1;
dd->type = 17;
dd->q_int = 0;
}

void zFBD_DLL_varname( char *varname )
{
strcpy( varname+0, "RUN" );
strcpy( varname+8, "In" );
strcpy( varname+16, "Tm" );
strcpy( varname+24, "Cycl" );
strcpy( varname+32, "Nj" );
strcpy( varname+40, "Out" );
}

"In" - вход значения
"Tm" - время необходимого запаздывания в секундах
"Cycl" - цикл пересчета данной FBD в миллисекундах
"Nj" - номер реализации
"Out" - выход значения

Сообщения / Posts 17083 | Из / From: Россия  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
SOU
Junior Member / Новичок
Участник № / Member № 802


Icon 1 отправлено / posted      Профиль для / Profile for SOU           Редактировать/удалить сообщение / Edit/Delete Post 
Спасибо, проблема решена. [fun / веселый]
Сообщения / Posts 15 | Из / From: Россия  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
   

   Закрыть тему / Close Topic   Feature Topic   Переместить топик / Move Topic   Удалить топик / Delete Topic Следующая старая тема / next oldest topic   Следующая новая тема / next newest topic
 - Printer-friendly view of this topic
Перейти к / Hop To


Новости АСУ ТП / News | SCADA / HMI | Обучение / Trainings | Свяжитесь с нами / Contact Us



Powered by Infopop Corporation
UBB.classic™ 6.7.2