This is topic Запаздывание на 1000 тактов in forum Языки программирования (IL/FBD) / Algorithm Programming Languages at Форум TRACE MODE: техническая поддержка.


To visit this topic, use this URL:
http://forum.adastra.ru/ultimatebb.php/ubb/get_topic/f/11/t/000045.html

Posted by SOU (Участник № / Member № 802) on :
 
Для реализации динамической модели объекта с запаздыванием нам необходима линия задержки на 1000 тактов.
Мы написали программу задержки на 1000 тактов с использованием блоков LIMIT, LTN и вычитания, отладили ее и создали из нее FBD-блок. Затем этот FBD-блок использовали в программе динамической модели, которая создана как из стандартных FBD-блоков, так и созданных нами. Подключили эту модель к одному каналу, проверили все работает. Подключаем эту же программу к другому каналу - не работает ни первый ни второй канал (выход всегда равен нулю). Отключаем программу от второго канала - первый снова работает.
Не поймем в чем дело. В документации сказано, что при вызове одной программы разными каналами для каждого из них создается свой набор ее переменных. (стр.191 "Руководства пользователя"). Т.е. линия задержки в 1000 тактов должна организоваться для каждого канала.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
При вызове одной программы разными каналами для каждого из них действительно создается свой набор ее переменных. Однако, речь здесь идет о внутренних статических переменных программы. Их количество в любой FBD-программе не может превышать 255.
Т.о., Вы никак не могли сделать задержку на 1000 шагов только на внутренних переменных.
А если Вы использовали глобальные переменные, то они являются общими для всего узла.
Такую задачу, видимо, лучше всего решать с помощью DLL-блока на VC++. Только не забыть организовать внутренние массивы статических переменных, локализуемые от специального входа функционального блока, имеющего функцию "реализация".
 
Posted by SOU (Участник № / Member № 802) on :
 
С этим понятно. Как выяснить точное количество внутренних статических переменных программы?
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
К сожалению, доступного пользователю прозрачного механизма контроля количества переменных в FBD-программе у нас нет. Контроль ведется автоматически редактором FBD.
Ориентировочно можно оценить следующим образом. К количеству выходов всех FB (независимо от того,используете Вы их или нет) прибавить количество констант и количество входов FB, являющихся независимыми аргументами.
Погрешности определяются дополнительными внутренними статическими переменными в стандартных и IL-блоках, входящих в состав FBD.
Количество внутренних статических переменных в FB не превышает 4.
О наличии в FB статических переменных можно судить по описанию его математики. Примеры: PID, Скользящее среднее, Предсказание, Производная по трем точкам.
 
Posted by SOU (Участник № / Member № 802) on :
 
Не совсем понятно как работать со специальным входом функционального блока, имеющего функцию "реализация".
Вы не могли бы дать пример DLL-блока, реализующего запаздывание?
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Пожалуйста - пример блока с запаздыванием на 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" - выход значения
 
Posted by SOU (Участник № / Member № 802) on :
 
Спасибо, проблема решена. [fun / веселый]
 


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



Powered by Infopop Corporation
UBB.classic™ 6.7.2