Всем доброго времени суток. Скажите пожалуйста, есть ли в СПК207 возможность организовать вызов подпрограммы из основной программы по событию?
Вкратце о проблеме. Знакомые принесли данный девайс для того чтобы попробовать сделать на нем несложную систему управления климатом в цеху по выращиванию бройлеров. С ПЛК до этого не сталкивался. Только Arduino, AVR.
Весь алгоритм работы состоит в том чтобы поддерживать требуемую температуру, воздухообмен и влажность в помещении. Проблем не было и все хорошо эмулировалось в Codesys V3.5 SP5 Patch5, пока я не столкнулся с задачей калибровки вентиляционных форточек.
Как я это вижу
Из основной программы, допустим MAIN_PRG, которая бегает по кругу с периодом 10мс требуется вызвать другую программу PLC_PRG, при помощи которой происходит калибровка форточек, так чтобы действие основной программы прекратилось и возобновилось после окончания калибровки.
Привод форточек состоит из двигателя постоянного тока на 24В, двух концевиков и в качестве обратной связи оптический датчик в виде диска с прорезями.
Т.к. на все концевики в модуле дискретного ввода мне не хватило места я использовал подключение двух концевиков к одному входу дискретного ввода.
Для этого я набросал алгоритм калибровки следующим образом.
Если нажат концевик, то запускаем эмулятор либо движения окна либо его неподвижности. Эмулятор управляется пока только кнопкой верхнего концевика в визуализации и если верхний концевик был нажат, то приводим в движение форточки переменной dirDown при помощи PT таймера delayer в течение 4 секунд. Если значение счетчика из функционального блока COUNT при этом изменилось, то значит до этого был нажат верхний концевик и движемся дальше до касания с нижним, а далее уже не интересно.
Интересно другое(и как мне кажется собака зарыта тут, ну еще может и в функциональном блоке):

WHILE dirDown=TRUE DO //Пока выход счетчика TRUE
HANDLER(in_fb:=TRUE, out_fb=>counter); //Включить эмулятор работы двигателя
delayer(IN:=TRUE, PT:=T#4S, Q=>dirDown, ET=>); //Запустить счетчик на 4 секунды
END_WHILE

Счетчик, обернутый в цикл WHILE дает мне возможность задержать сигнал на 4 секунды, если не использовать WHILE, то счетчик не работает.
Вот так вот зависает контроллер при попытке запустить алгоритм из конфигурации задач по событию.

Рис.1 Собственно само событие
7.png
Рис.2 Функциональный блок COUNT
6.png
Рис. 3 Окно визуализации
5.png
Рис.4 Основная программа
4.png
Рис. 5, 6, 7 Программа калибровки
1.png
2.png
3.png

Помогите пожалуйста решить эту проблему. Если не в лоб, то какими либо обходными путями в виде таймеров, счетчиков и т.д.
Заранее всех благодарю.
С Уважением, Алексей.