Спасибо всем за участие!
Походу запись выходного блока переменной в конце цикла и есть причина.
Все работает.
Спасибо всем за участие!
Походу запись выходного блока переменной в конце цикла и есть причина.
Все работает.
Здравствуйте,
требуется добавить возможность задания начальных значений для энергозависимых переменных, т.к. к элементам на экране можно привязать только их. Я произвожу их корректировку в программе, но все равно возникают ошибки в подпрограммах. Приходится в каждой подпрограмме проверять входные значения на ноль.
В переменных индексы массива. При запуске эмуляции выдает ошибку "индекс вне диапазона". Не знаю, будет ли работать на реальном железе. Я подозреваю, что подпрограмма где используются индексы запускается раньше, чем подпрограмма, которая исправляет переменные, хотя расположена ниже. Последовательность запуска ФБ установить нельзя, как я понимаю.
Немножко не так. Блоки, грубо говоря, работают одновременно, но блок инициализации записывает значение в выходную переменную, и во входную переменную это значение попадает только в следующем цикле. Это можно обмануть, подключив вход с помощью линии связи а не через переменную
1.png 2.png
Или же, обработку второго блока делать с задержкой
3.pngКод:function_block functionblock1 //имя функционального блока. var_input //объявление входных переменных U : udint; //входная переменная с типом данных bool end_var var_output //объявление выходных переменных Q : udint; //выходная переменная с типом данных udint end_var var init : bool; end_var if init then Q := 100 mod U; end_if init := true; end_function_block
Обычно, код должен быть сравнительно независимым от внешних факторов.
Поэтому при использовании CASE настоятельно рекомендуется использовать ветку ELSE, в которой обрабатываются нештатные ситуации с выходом переменной из ряда перечислений.
Поэтому, вместо фокусов с инициализацией я бы просто добавил на входе ФБ (или функции) на ST блок проверки корректности входных данных.
Если посмотреть примеры из библиотек OSCAT и CoDeSys - в самом начале строки проверки.
Кроме того, на входе в ФБ можно добавить вход EN, разрешающий работу алгоритма. Вход понадобится для приостановки алгоритма на период инициализации оборудования при включении питания - секунд на 5-10 - это значительно больше, чем один цикл.
Подскажите, если использовать st, в нём не поддерживаются всякие простые таймеры? типа ton/tof.
meta11ist87 вызов штатных вроде пока не поддержан. Откройте справку ОЛ, там же все есть про ST для ПР