neitwood
03.04.2017, 00:41
Всем доброго времени суток. Скажите пожалуйста, есть ли в СПК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, то счетчик не работает.
Вот так вот зависает контроллер при попытке запустить алгоритм из конфигурации задач по событию.
https://youtu.be/2n-Gz_0Ivi4
Рис.1 Собственно само событие
30364
Рис.2 Функциональный блок COUNT
30365
Рис. 3 Окно визуализации
30366
Рис.4 Основная программа
30367
Рис. 5, 6, 7 Программа калибровки
30368
30369
30370
Помогите пожалуйста решить эту проблему. Если не в лоб, то какими либо обходными путями в виде таймеров, счетчиков и т.д.
Заранее всех благодарю.
С Уважением, Алексей.
Вкратце о проблеме. Знакомые принесли данный девайс для того чтобы попробовать сделать на нем несложную систему управления климатом в цеху по выращиванию бройлеров. С ПЛК до этого не сталкивался. Только 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, то счетчик не работает.
Вот так вот зависает контроллер при попытке запустить алгоритм из конфигурации задач по событию.
https://youtu.be/2n-Gz_0Ivi4
Рис.1 Собственно само событие
30364
Рис.2 Функциональный блок COUNT
30365
Рис. 3 Окно визуализации
30366
Рис.4 Основная программа
30367
Рис. 5, 6, 7 Программа калибровки
30368
30369
30370
Помогите пожалуйста решить эту проблему. Если не в лоб, то какими либо обходными путями в виде таймеров, счетчиков и т.д.
Заранее всех благодарю.
С Уважением, Алексей.