Свободные функции (FreeFunctions) и Мультисцены (MultiScene) в системе Умный Дом EasyHome
Не смотря на разнообразие и продуманность встроенных функций системы Умный Дом EasyHome, периодически возникает потребность сделать что-то новое, индивидуальное, не предсказуемое, не логичное для общего случая, но необходимое в конкретной ситуации автоматизации процессов и т.д. Для таких задач разработан встроенный интерпритатор логических функциональных блоков, оперирующих напрямую с памятью ввода-вывода интерфейса ModbusTCP и резервной внутренней памятью. Для освоения данного универсального инструмента создания логических функций и схем придётся познакомится с общим принципом организации машинной памяти, логических и арифметических операций.
В контроллере системы предусмотрена память на 255 свободных функций и память на 255 шагов мультисцен. Доступ к таблице редактирования осуществляется через инженерный раздел Настройки ПЛК -> Свободные функции. Свободные функции работают каждый цикл базовых алгоритмов работы в ПЛК - 10 раз в одну секунду.
Мультисцены срабатывают разово по получению команды в байт запуска с интерфейса, от Глобальной сцены или от Свободных функций. Мультисцена выполняет ряд простых действий по шагам - запись в указанные адреса указанных значений, период шага регулируется. Обработчик мультисцен одноканальный, т.е. пока выполняется запуск одной мультисцены, другая мультисцена, одновременно запускаемая, будет проигнорирована, если её приоритет такой же.
Одна свободная функция выглядит следующим образом: |
Таблица функций: |
|||||||||||||||
|
Возможные значения аргументов и вывода данных:
Аргументы A1 и A2 | Результат в OUT | Примечания и обозначения | ||||
Номер типа | Обозначение | Обозначение | ||||
0 | - - - - - | - - - - - | - | Не выбрано, свободная функция не работает | ||
1 | Constant | - | Константа - возможные значения 0..65535 (тип Word) | |||
10..17 | Bit N MB% | Bit N MB% | - | N - номер бита в байте 0..7 (тип Bool ) | ||
18 | Byte MB% | Byte MB% | - | Byte - байт, состоит из 8ми бит, возможные значения 0..255 | ||
19 | Word MB% | Word MB% | - | Word - два байта, возможные значения 0..65535 | ||
20..27 | Bit N MEM | Bit N MEM | - | MEM - оперативная память 200 байт для данных свободных функций | ||
28 | Byte MEM | Byte MEM | MB% - память визуализации и приёма команд по протоколу ModbusTCP | |||
29 | Word MEM | Word MEM | ||||
30 | IN.HlthAlrms | - | Запись во входной буфер для эмуляции сигналов IN.HlthAlarms-1..16 | |||
110..117 | ! Bit N MB% | ! Bit N MB% | - | ! - значёк инверсии значения бита (байт/ворд приводится к биту по ">0") | ||
118 | ! Byte MB% | ! Byte MB% | ||||
119 | ! Word MB% | ! Word MB% | ||||
120..127 | ! Bit N MEM | ! Bit N MEM | ||||
128 | ! Byte MEM | ! Byte MEM | ||||
129 | ! Word MEM | ! Word MEM |
Возможные функции (реализованы в стиле CoDeSys и дополнены):
Номер типа |
Обозначение | Примечания | Номер типа |
Обозначение |
||||
0 | - - - - - | - пусто | ||||||
Записывают Результат в OUT постоянно: | Записывают Результат в OUT при изменении: | |||||||
1 | A1 AND A2 | Работают побитово для Byte и Word |
101 | Vary A1 AND A2 | ||||
2 | A1 OR A2 | 102 | Vary A1 OR A2 | |||||
3 | A1 AND NOT A2 | 103 | Vary A1 AND NOT A2 | |||||
4 | A1 XOR A2 | 104 | Vary A1 XOR A2 | |||||
5 | A1 > A2 | 105 | Vary A1 > A2 | |||||
6 | A1 >= A2 | 106 | Vary A1 >= A2 | |||||
7 | A1 = A2 | 107 | Vary A1 = A2 | |||||
8 | A1 <= A2 | 108 | Vary A1 <= A2 | |||||
9 | A1 < A2 | 109 | Vary A1 < A2 | |||||
10 | A1 < > A2 | 110 | Vary A1 < > A2 | |||||
11 | A1 + A2 | 111 | Vary A1 + A2 | |||||
12 | A1 - A2 | 112 | Vary A1 - A2 | |||||
13 | A1 * A2 | 113 | Vary A1 * A2 | |||||
14 | A1 / A2 | 114 | Vary A1 / A2 | |||||
15 | MAX(A1,A2) | 115 | Vary MAX(A1,A2) | |||||
16 | MIN(A1,A2) | 116 | Vary MIN(A1,A2) | |||||
17 | ABS(A1-A2) | 117 | Vary ABS(A1-A2) | |||||
18 | (A1+A2) /2 | 118 | Vary (A1+A2) /2 | |||||
19 | A1 MOD A2 | 119 | Vary A1 MOD A2 | |||||
20 | IF A1>0 THEN Out=A2 | 120* | IF A1>0 THEN Once A2 | |||||
21 | IF A1=0 THEN Out=A2 | 121* | IF A1=0 THEN Once A2 | |||||
22 | IF A1>0 THEN Out=NOT A2 | 122* | IF A1>0 THEN Once NOT A2 | |||||
23 | IF A1=0 THEN Out=NOT A2 | 123* | IF A1=0 THEN Once NOT A2 | |||||
30 | TON(IN=A1>0,PT=A2 Sec) | Таймеры включения |
130 | Vary TON(IN=A1>0,PT=A2 sec) | ||||
31 | TON(IN=A1>0,PT=A2 Min) | 131 | Vary TON(IN=A1>0,PT=A2 Min) | |||||
32 | TOF(IN=A1>0,PT=A2 Sec) | Таймеры вЫключения |
132 | Vary TOF(IN=A1>0,PT=A2 Sec) | ||||
33 | TOF(IN=A1>0,PT=A2 Min) | 133 | Vary TOF(IN=A1>0,PT=A2 Min) | |||||
34 | TP(IN=A1>0,PT=A2 Sec) | Таймеры импульса |
134 | Vary TP(IN=A1>0,PT=A2 Sec) | ||||
35 | TP(IN=A1>0,PT=A2 Min) | 135 | Vary TP(IN=A1>0,PT=A2 Min) | |||||
40 | IF A1>0 THEN GoToN(A2>N) | - не требует указания OUT, обеспечивает переход обработчика кода на указанную строку с номером больше текущей. |
||||||
41 | IF A1=0 THEN GoToN(A2>N) |
Пояснения по функциям:
1) Типы 120..123* - IF A1 ?? 0 THEN Once ?? A2 - записывают Результат в OUT Разово при выполнении условия
2) Для таймеров TON, TOF, PT параметр PT - время, в секундах (Sec) или минутах(Min), берётся из аргумента A2.
Таймер TON (Включения) | Таймер TOF (Выключения) | Таймер TP (Импульса) | ||
Задержка на включение выходного сигнала вслед за входным IN. Выключение сразу, перезапускается таймер пока IN в сбросе. |
Включение сразу, перезапускается таймер пока есть сигнал IN. Задержка на вЫключение выходного сигнала вслед за входным IN. |
Выдаёт импульс выходного сигнала после появления IN, отсчёт времени НЕ перезапускается. |
Примечания:
1) Обработчик свободных функций выполняется до основных алгоритмов света и климата и подсистем и позволяет запуск глобальной или локальной сцены в текущем цикле
2) Память MEM - оперативная, при старте её значения - нули
3) Для создания полностью независимых алгоритмов рекомендуется использовать наборы свободных переменных входов-выходов: IN.FreeDI-1..255; IN.FreeAI-1..100; OUT.FreeDO-1..255; OUT.FreeAO-1..100;
4) Состояние OUT.FreeDO-1..255 и OUT.FreeAO-1..100 отображаемое / управляемое с интерфейса запоминается в файл при нажатии кнопки "Записать Файлы Настроек" или автоматически при сбое питания для ПЛК Beckhoff и ОВЕН ПЛК. При рестарте контроллера значения в этих адресах инициализируются сохранёнными до сбоя питания. Эти ячейки памяти целесообразно использовать для различных настроек алгоритмов, которые должны сохраняться.
5) Для получения данных с физических входов любых групп IN.xxx необходимо найти отображение входных сигналов в инженерном интерфейсе в соответсвующем разделе, и там через кнопку "Свойства элемента" выяснить байтовый адрес в интерфейсе ModbusTCP - адрес обозначаемый MB%, для битовых переменных - обратить внимание на номер бита в байте. Его и следует использовать в качестве аргументов.
6) Управление физическими выходами возможно через интерфейс пользователя или инженерный. Их визуализацию следует найти на инженерном интерфейсе и через свойства выяснить их байтовый и битовый адреc MB%. Примеры таких переменных:
OUT.FreeDO-1..255 и OUT.FreeAO-1..100 - не управляются штатными алгоритмами, их визуализация находится в разделе инженерного интерфейса "Подсистемы"
Аналогично можно со свободных функций управлять некоторыми выходами паралельно работы штатных алгоритмов и манипуляциям пользователя:
OUT.Light-1..255; OUT.Dimmer-1..255 - управляются алгоритмами освещения, но так же могут управляться с интерфейса и, следовательно, с выхода свободных функций.
OUT.Loads-X-1..32 - управляются алгоритмами электроснабжения, но возможно их управление через интерфейс, если алгоритм защиты от перегрузки не блокирует их.
OUT.VitazhkaSU-1..8, OUT.ExtHeatsZones-1..8, OUT.SIRENA, OUT,StartGenerator, OUT.StopGenerator - аналогично.
7) Использование функций пишуших Результат в OUT постоянно (в каждом цикле) делает невозможным паралельную работу штатных алгоритмов или управление с пользовательского интерфейса. Поэтому, в большинстве случаев, для записи Результата в память интерфейса ModbusTCP разумно применять функции пишущие результат разово, по событиям изменения вычисленного результата или возникновения условия для разовой записи.
8) Память ModbusTCP (обозначаемая как MB% ) внутри контроллера EasyHome и в интерфейсе пользователя/инженера адресуется по байтам, т.е. указывается номер байта для доступа в память. (В самом протоколе ModbusTCP адресация пространства выполняется по Регистрам, т.е. по парам байт. Эти преобразования незаметно выполняет сам интерфейс, приводя адресацию к байтовой).
9) Адреса памяти ModbusTCP частично представлены в таблице BLANK_KlimateZonesandLights.xls и частично в друкментации в разделе техподдержки. Полный достоверный список адресов всегда доступен в актуальном инженерном интерфейсе и периодически дорабатывается, проверяёте адреса через "Cвойства элемента". Скачать можно на главной странице раздела техподдержка.
10) Битовые адреса в байте принято указывать через точку от номера байта, например запись %MB 2432.6 означает 6й бит в байте 2432 в памяти интерфейса ModbusTCP.
Примеры простых алгоритмов свободных функций для контроллера Умного Дома :
1. Для тёплых полов (с чувствительным паркетом) ограничиваем уставку Т не более 30С | ||
- Берём из таблицы BLANK_KlimateZonesandLights.xls адреса параметра TempSetted для термостатов полов для комнат 32,33,34,44,55. - Берём константу Byte = 150 , которая соответсвует для масштаба термостата температуре 30С (0-50С отображается как 0-250 byte) - Пропускаем эти два аргумента через функцию MIN (A1, A2) которая выдаёт Результатом МЕНЬШЕЕ из аргументов - Выход записываем постоянно обратно в TempSetted. |
||
2. Запуск обогрева ЛК (Ливниевой Канализации) от датчика обогрева IN.ExtHeatZones-1 только в разрешённое время настраиваемое пользователем независимо от других расписаний и сцен | ||
- В первых двух строках алгоритма сравниваем системное време часов по адресу MB% 610 (Страница с системными часами и календарём есть в инженерном интерфейсе в разделе системных страниц) c установленными часами "Нагрев разрешён С" (FreeAO-1, MB% 2300) и "Нагрев разрешён ПО" (FreeAO-2, MB% 2301) и формируем в памяти MEM1 биты 0 и 1. - В третьей строке для случая обратного указания времени (например с 23х до 8ми) ставим флаг в MEM1 bit2 (MEM1.2) - В четвёртной и пятой строке оба варианта указания времен сводим к флагу нахождения текущего времени в указаном периоде С..ПО в флаг MEM1 bit4 (MEM1.4) - Сверяем с галкой пользовательского интерфейса "Разрешение работы только по времени" FreeDO-1 по адресу MB% 2432.0 - Если от подсистемы внешних обогревов приходит сигнал на включение (OUT.HeatOUT-1 по адресу MB% 1937.0) и нет стоит галка "Разрешение работы только по времени" или время в нужном диапазоне, то выводим команд включения электронагрузок OUT.Loads-RST-3 и 4 по адресам MB%1803.6 и MB%1804.6. - Далее, алгоритм защиты от электроперегрузок разрешает реальное включение электронагрузок при наличии запаса мощности и с выдержкой паузы. |
||
3. При уровне топлива в баке генератора менее 15% отправлять СМС | ||
- Сравниваем уровень топлива отображаемый на визуализации драйвера генератора с константой 15 - Результат записываем в эмулятор входных сигналов внутренних тревог IN.HealthAlarm-1 - Корректируем файл с текстами СМС сообщений SMS_rus.txt, для этого сообщения, обновляем его в контроллере - При необходимости, корркетируем текст для журнала аварий интерфейса для этого сообщения в файле config.xml - Включаем в журнале аварий флаг СМС по этому сообщению |
||
4. Если Т уличная превысила Т порога установленное пользователем и стоит галочка Закрывать Шторы на Жаре, то ЗАКРЫТИЕ штор для которых выбрана эта галочка. | ||
1) Располагаем на пользовательсоком интерфейсе контрол Byte (тип Word) cо свойствами аналогичными индикаторы уличной температуры, используем адреса FreeAO-11..12 2) Располагаем на интерфейсе пользователя для каждой шторы галку FreeDO-18..21, для активации данной функции пользователем 3) В верхней строке свободных функций сравниваем Т ул и Т порога и ставим флаг Bit0 MEM10. 4) Для каждой шторы генерируем флаг превышения Т и наличия галки - Bit1 MEM10 и т.д. 5) При появлении флага "Закрытия по жаре" для шторы - один раз записываем в лампу отвечвющую за ней bit0 по её адресу на MB% 892 (для лампы/injhs N35 ) |
||
5. Работа 4x штор от расписания и от освещённости (штатно решается). При постановке на охрану раздела N3 - ЗАКРЫТИЕ (Мультисценой MS-2). При снятии охраны ВОЗВРАТ штор в состояние которое было бы без цикла охраны. | ||
1) Задаём мультсцену MS-2, которая закрывает все шторы (записывеет бит 0 в адрес отвечающий ВКЛ-ВЫКЛ нужных групп света) |
||
6. Работа тепловентилятора в качестве второй ступени нагрева от радиатора | ||
1) Для основного Радиатора и вспомогательного Тепловентилятора используем два разных термостата от одного датчика температуры 2) Для термостата Тепловентилятора ставим галку "Исключение", чтоб он не реагировал на глобальные команды и "Выключить весь климат". 3) В строке свободной функции берём уставку желаемой Т от термостата Радиатора, вычитаем 10 (2С по шкале 50С = 250byte), и записываем в уставку термостата Тепловентилятора. В ИТОГЕ: Тепловентилятор включается только при провалах температуры и при прогреве помещения после включения климата. |
||
7. Защита НАСОСА водоснабжения от холостого хода, от залипания реле давления, от прорыва магистрали | ||
1) Наличие напряжения на насос с реле давления подключаем через промежуточное реле как вход счётчика импульсов IN.Counters-2. 2) В строке 3 при появлении сигнала с реле давления сбрасываем счётчик времени работы в памяти FreeAO-1..2 (Word MB%2300). 3) В стоке 4 берём значение счётчика времени работы, прибавляем сигнал IN.Counters-2 и записываем в эту же ячейку памяти. Получаем индикатор времени работы насоса после пуска. 4) В строке 5 сравниваем время работы насоса у установленным порогом в ячейках FreeAO-3..4 (Word MB% 2302). Если время работы более порога безопасной длительности, то результат пришем в эмулятор внутренних тревог IN.HlthAlrms-2 - АВАРИЯ НАСОСА. Тем самым генерируем запись в общем журнале аварий и отправляем СМС об аварии насоса. 5) Проверяем наличие сигнала Перекрыть СТОЯК от системы защиты протечек по датчикам и наличие АВАРИИ НАСОСА. При любом из двух - выключаем питание реле давления и насоса через выход FreeDO-1. 6) Для сброса АВАРИИ НАСОСА добавляем кнопку обнуляющую счётчик длительности работы на интерфейсе. |
||
8. Детектор утечки по присутствию сигналов со счётчика воды всегда не реже 5ти часов | ||
1) В строке 1 настраиваем самоперезапукаемый таймер TON на 1 минуту. |
||
9. Детектор утечки, если ночью тратится более 50ти литров воды | ||
1) В первой строке очищаем байт служебной памяти MEM-0 2) В качестве задатчика времени работы алгоритма устанавливаем рабочий период счётчика IN.Counter-7 в настройках и берём индикатор разрешения его работы по времени Enable-7 3) При появлении индикатор разрешения работы по времени (Bit6 %MB 547) (наступил учётный период) - сбрасываем счётчик импульсов расположенный по адресу FreeAO-3..4 (Word %MB2302) 4) Если Есть сигнал со счётчика IN.Counter-1 (Bit0 %MB 546) и есть индикатор разрешения работы по времени, то формируем промежуточный флаг Bit0 MEM-0 5) Складываем импульсы флага Bit0 MEM-0 в счётчик импульсов (Word %MB2302) 6) Если количество импульсов накопилось больше установленного порога в (Word %MB2300), то генерируем внутреннюю тревогу IN.HealthAlarm-1, от которой получаем запись в журнале аварий и СМС сообщение. |
||
10. Мультсцена выполняемая в таблице свободных функций | ||
При нехватке памяти или возможностей мультисцен на простые действия можно задействовать память свободных функций: 1) Проверяем командный байт для запуска мультисцен %MB24, куда записывается команда из глобальной сцены или с интерфейса пользователя и при нужном номере ставим флаг Bit1 MEM-0 2) Функция GoTo делает обход блока строк, если флаг равен нулю, т.е. пока нет команды. 3) В состоянии выбранных лампочек с помощью операции "AND Constant=15 (в бинарном виде это 00001111 )" - обнуляем 4 бита отвечающие за грубую яркость, т.е. яркость сбрасываем на 0%, но состояние ВКЛ-ВЫКЛ, Активность ДД и другие остаются прежними. 4) Сбрасывать комнадный байт %MB24 не надо, он сбрасывается сам, после выполнения всех программ в цикле ПЛК. |
||
11. Управление вытяжками санузлов "наоборот" - с паузой на запуск от включения светильника | ||
Штатное управление вытяжками санузлов предлагает запуск вентилятора по сигналу с датчика движения или от включения лампочки или от датчика влажности и работу в течении некоторого времени. Но можно реализовать и другой алгоритм работы, данный пример для управления двумя вентиляторами: 1) По галочке со штатной настройки определяем нужно ли включать вытяжки в АВТО режиме 2) При включении определённой группы света запускаем таймер TON на время указанное в штатных настройках. В течении этого времени выход таймера указанный на FreeDO выключен. Т.е. вентилятор вытяжки в течении этого времени выключен. По истечении указанного времени таймер TON включается и запускает вытяжку. При выключении группы света таймер TON сразу сбрасывается и выключает вытяжку. |
||
12. Управление шторами не слайдером, а через три кнопки на интерфейсе "Открыть-Стоп-Закрыть" | ||
Штатное управление позиционированием шторы выполняется через слайдер, однако с помощью свободных функций можно реализовать и управление тремя кнопками с интерфейса "Открыть-Стоп-Закрыть". Кнопки Закрыть и Открыть являеются выходами управлением мотора FreeDO-105 и FreeDO-106 в данном примере и их можно включать с интерфейса. 1) В первой строке алгоритма получаем данные со штатного контрола "Лампа N3" (%MB 636.0 ) на случай управления выключателями или шторами и при изменении состояния записываем результат "1" или "2" в байт %MB2445, первые два бита в котором соответствуют выходам FreeDO-105 и FreeDO-106, а остальные биты соответствуют FreeDO-107..112 и не используются. 2) Во 2й и 3й строках, при включении открывания или закрывания записываем настройку длительности из Word %MB 2380 (FreeAO-79..80) в таймер в Word %MB 2382 (FreeAO-81..82). 4) Если значение таймера больше нуля, то включаем служебный бит FreeDO-12 5) Вычитаем из таймера служебный бит, таким образом, таймер отсчитывает записанное в него изначально время в сторону уменьшения - на 1 за каждый цикл 0.1 секунды. 6) Когда таймер доходит до нуля - записываем 0 в байт %MB2445, таким образом выходы управления мотором FreeDO-105 и FreeDO-106 и их визуализация выключается. Обратная связь от алгоритма в визуализацию состояния "Лампа N3" не раелизована в данном примере за ненадобностью в конкретном случае. |
||
13. Управление вытяжками санузлов "наоборот" - на период после выключения светильника | ||
Если вытяжка в санузле/ванной при работе сознадаёт дискомфорт, то можно задать нештатный алгоритм - вытяжка включается после выключения светильника и работает отведённое таймеров время. | ||
14. Включение-выключение FreeDO (лампочка) при включении FreeDI (кнопка) | ||
Если неободимо кнопкой включать-выключать определённую нагрузку, и функцию управления освещением нельзя использовать (или все лампочки или выключатели уже использованы), то можно это реализовать с помощью простой функции переключающей один раз состояние при определённом событии. | ||
15. Организация 3й зонны системы защиты от протечек | ||
Штатная система защиты от протечек расчитана на работу одной зоны перекрытия стояка от 32х датчиков или двух отдельных зон перекрытия стяков со своим набором по 16 датчиков. Если требуется организовать работу 3х или 4х отдельных зон от того же набора датчиков (по 8 датчиков на зону), то необходимо добавить этот функционал с помощью свободных функций. | ||
16. Организация температуры зоны климата как среднеарифметической от нескольких датчиков | ||
Если возникает необходимость корректировать показания датчиков температуры сложной функцией или вычислять среднее с нескольких датчиков температуры и использовать откорректированную температуру в качестве управляющей в зоне климата, то это реализуется с помощью возможности принимать показания датчиков с интерфейса Modbus в режиме приёма данных драйвера кластера контроллеров. | ||