Для себя уже смастерил, просто стоит задача, "развлекательная", упражнения для ума и тела, сделать систему которая впишется в шиток 12*2 автоматов. И так получилось что данная реализация совпала. А так как я за свободу информации, вот и выкладываем.
Как и обещал начинаю выкладывать описания на функциональные блоки для моего частного случая (использование плк 63 в качестве контролера отопления). Данный пример больше подходит для тепловых узлов и небольших котельных. Узел ГВС выполнен в виде бойлера. Основываясь на цели облегчения понимания работы данной программы принял решение писать модули на CFC и SFC. В тех случаях когда это сложно буду выкладывать два вида, т.е. дополнительный сделанный на других языках поддерживаемых CoDeSys. А в совсем сложных случаях предлагаю воспользоваться описанной функцией как готовым блоком. В будущем и возможно для кого то уже сейчас можно это все скомпоновать в библиотеку. Призываю всех желающих поучаствовать в написании функций и их устройства, не скупиться на комментарии.
ШАГ 1 — инициализация, обработка сигналов
Базовая часть программы используется стандартное PLC_PRG рекомендую использование SFC, так как в нем достаточно просто реализуется шаги МЭК для режима инициализации и работы. В конечной реализации программы в первом шаге будут производиться инициализация входов-выходов и другие действия «холодного старта» программы.
Первое с чем сталкивается пользователь это работа с датчиками, я не описываю в данном примере получение значений. Это хорошо описано в руководствах, хотя и будут примеры когда используются устройства подключенные по ModBus. Однако есть задача и со стороны программиста проверить корректность получаемых значений. Для этих целей я использую два функциональных блока SensorReal и jitter.
SensorReal контролирует диапазон получаемых значений и в случае выхода их из него выдает аварию датчика и Подменяет значение в случае выхода из диапазона, это может происходить в случае обрыва или короткого замыкания датчика. Данных функциональный блок в двух видах один в CFC другой на IL (делал из удовольствия и ностальгии по ассемблеру). Структура достаточно простая производятся сравнение с максимальным и минимальным значение и в случае выхода за диапазон выдается сигнал авария и одновременно с этим подставляется для выхода значение по умолчанию.
В некоторых случает значение параметра остается диапазоне но перестает меняться, что говорит тоже о неполадках с датчиком. Данный блок jitter (с анг. дрожать) состоит всего из трех элементов, первый сравнивает изменилось ли значение с последнего момента исполнения кода данного функционального блока, если разница есть, то второй блок это таймер задержки включения TON, в данном случае он выполняет функцию по задержке подачи аварийного сигнала, то есть дает время значению измениться, если это не происходит в течении указанного времени то на выходе появится аварийный сигнал. Третий элемент постоянно выполняет копирование значения со входа в память функционального блока в случае если есть между ними разница. Хотя можно было бы и не использовать EN/ENO и выполнять копирование постоянно, но так более правильно с точки зрения написания кода, например кто-то баловался с порядком обработки блоков и поменяет последовательность и копирование начнет теперь выполняться раньше чем было произведено сравнение, получится постоянная авария с этого функционального блока.
Дополнительный комментарий
Обработку сенсоров я предпочитаю выносить в отдельный программный блок, это более удобно, а здесь буду использовать вариант с шагами SFC чтобы показать стандартный порядок обработки данных и в нем сложнее допустить ошибку. Т.е. это не правило пишите так как вам удобно. Сначала описание базовой части производится без привязки к контролеру, однако к шестому шагу все соберется в одну кучу.
ШАГ 2 Два варианта вычисления погодозависимого графика
ШАГ 3 Работа с насосами (отопления, бойлера)
ШАГ 4 Работа с трехточечным сервоприводом отопления
ШАГ 5 Аварийные ситуации
ШАГ 6 Финальная сборка и привязка к ПЛК63
ШАГ 7 Отображение данных




Ответить с цитированием