PDA

Просмотр полной версии : СПК207 и прерывания



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

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

murdemon
03.04.2017, 11:06
А что необходимо делать форточками? температуру поддерживать? И как я понял там только сигналы открыть/закрыть? (тут можно тогда такую же логику как и у КЗР в системе отопления и все будет работать)

neitwood
03.04.2017, 11:35
Величина открытия форточек определяет воздухообмен и скорость движения воздуха в помещении, а также небольшое разрежение в помещении путём прикрытия их на некоторую величину. Да там нужно подать сигнал открыть закрыть, но на определённый процент. Это доожно обеспечиваться определенным временем работы привода. Есть обратная связь положения форточек с генератора, так сказать, импульсов.

murdemon
03.04.2017, 11:41
как вариант использовать МВ110-16ДН в режиме счета импульсов. (как я понимаю число импульсов на полное открытие и закрытие известно) При начальном включении двигать форточку до датчика закрыт и после чего двигать пока счетчик не досчитает до определенного числа импульсов. Если закрываем то счет вести обратно. Только по 485 скорость обмена порядка 20мс на 1 переменную надо брать из этого расчета. (это зависит насколько быстро закрывается форточка если сек за 10 или больше то проблем сильных с ошибкой позиции не будет) Могу помочь в разработке ПО (напиши в личку)

neitwood
03.04.2017, 11:46
Вся калибровка состоит в том, что нужно довести форточку до крайнего положения, обнулиться, довести до другого крайнего положения. Посчитать количество импульсов и вернуть форточку на место. Но это занимает много времени, если учитывать что ПЛК крутит программу раз в 10мс. Поэтому программа на СПК виснет при попытке вызова калибровки а в кодесисе все работает.

murdemon
03.04.2017, 11:54
тут идеологии программы немного другая.. надо учить мат часть. А как считаете импульсы как счетчик надеюсь? или просто изменения входа в ПО считаете?

neitwood
03.04.2017, 12:02
Спасибо за наводку и за предложение, я кстати уже думал об счётчик в моудле ввода. Нужно не с эмуляторами возиться я так понял, а с реальным контроллером работать.
Не хочу вас сильно вопросами загружать, но мне все таки интересно, если допустим я нажал на калибровку и контроллер подал команду на закрытие форточек. Дальше идёт опрос. Вы говорите он занимает 20мс. Значит он один раз опросил, после этого выполняются какие то там команды, основной цикл программы закончился. Далее программа доходит до этого условия и ещё раз опрашивает, и если значение становится равным например 256, то убрать сигнал с привода?

neitwood
03.04.2017, 12:03
Считаю импульсы пока функциональным блоком ctu.

murdemon
03.04.2017, 17:16
Ну в общем случае да. Если проехал отправлено датчика до датчика и насчитал 100отсчетов. Потом закрыл полностью. И чтобы открыть. Надо сигнал на открытие и как досчитал до 20 это будет 20% то убрать стонал открытия. И запомнить относительную позицию где сейчас.

vniko
04.04.2017, 12:40
Может кто поправит, но у меня отложилась в памяти рекомендация от сотрудников ОВЕН: не рекомендуется устанавливать приоритет в конфигурации задач равным нулю.

neitwood
04.04.2017, 22:55
Спасибо большое murdemon за помощь и vniko за рекомендации.
Проблему зависания удалось решить отказом от циклов while, которые съедали время основного цикла. Обошелся одними условиями. Отныне только последовательный код, который всегда приводит к последней строчке перед ключевым словом return.