SOU
Junior Member / Новичок
Участник № / Member № 802
отправлено / posted
Для реализации динамической модели объекта с запаздыванием нам необходима линия задержки на 1000 тактов. Мы написали программу задержки на 1000 тактов с использованием блоков LIMIT, LTN и вычитания, отладили ее и создали из нее FBD-блок. Затем этот FBD-блок использовали в программе динамической модели, которая создана как из стандартных FBD-блоков, так и созданных нами. Подключили эту модель к одному каналу, проверили все работает. Подключаем эту же программу к другому каналу - не работает ни первый ни второй канал (выход всегда равен нулю). Отключаем программу от второго канала - первый снова работает. Не поймем в чем дело. В документации сказано, что при вызове одной программы разными каналами для каждого из них создается свой набор ее переменных. (стр.191 "Руководства пользователя"). Т.е. линия задержки в 1000 тактов должна организоваться для каждого канала.
Сообщения / Posts 15 | Из / From: Россия
| IP / IP: IP адрес / IP address |
отправлено / posted
При вызове одной программы разными каналами для каждого из них действительно создается свой набор ее переменных. Однако, речь здесь идет о внутренних статических переменных программы. Их количество в любой FBD-программе не может превышать 255. Т.о., Вы никак не могли сделать задержку на 1000 шагов только на внутренних переменных. А если Вы использовали глобальные переменные, то они являются общими для всего узла. Такую задачу, видимо, лучше всего решать с помощью DLL-блока на VC++. Только не забыть организовать внутренние массивы статических переменных, локализуемые от специального входа функционального блока, имеющего функцию "реализация".
Сообщения / Posts 17320 | Из / From: Россия
| IP / IP: IP адрес / IP address |
SOU
Junior Member / Новичок
Участник № / Member № 802
отправлено / posted
С этим понятно. Как выяснить точное количество внутренних статических переменных программы?
Сообщения / Posts 15 | Из / From: Россия
| IP / IP: IP адрес / IP address |
отправлено / posted
К сожалению, доступного пользователю прозрачного механизма контроля количества переменных в FBD-программе у нас нет. Контроль ведется автоматически редактором FBD. Ориентировочно можно оценить следующим образом. К количеству выходов всех FB (независимо от того,используете Вы их или нет) прибавить количество констант и количество входов FB, являющихся независимыми аргументами. Погрешности определяются дополнительными внутренними статическими переменными в стандартных и IL-блоках, входящих в состав FBD. Количество внутренних статических переменных в FB не превышает 4. О наличии в FB статических переменных можно судить по описанию его математики. Примеры: PID, Скользящее среднее, Предсказание, Производная по трем точкам.
Сообщения / Posts 17320 | Из / From: Россия
| IP / IP: IP адрес / IP address |
SOU
Junior Member / Новичок
Участник № / Member № 802
отправлено / posted
Не совсем понятно как работать со специальным входом функционального блока, имеющего функцию "реализация". Вы не могли бы дать пример DLL-блока, реализующего запаздывание?
Сообщения / Posts 15 | Из / From: Россия
| IP / IP: IP адрес / IP address |
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; }
"In" - вход значения "Tm" - время необходимого запаздывания в секундах "Cycl" - цикл пересчета данной FBD в миллисекундах "Nj" - номер реализации "Out" - выход значения
Сообщения / Posts 17320 | Из / From: Россия
| IP / IP: IP адрес / IP address |
SOU
Junior Member / Новичок
Участник № / Member № 802