Свободные функции (FreeFunctions) и Мультисцены (MultiScene) в системе Умный Дом EasyHome

     Не смотря на разнообразие и продуманность встроенных функций системы Умный Дом EasyHome, периодически возникает потребность сделать что-то новое, индивидуальное, не предсказуемое, не логичное для общего случая, но необходимое в конкретной ситуации автоматизации процессов и т.д. Для таких задач разработан встроенный интерпритатор логических функциональных блоков, оперирующих напрямую с памятью ввода-вывода интерфейса ModbusTCP и резервной внутренней памятью. Для освоения данного универсального инструмента создания логических функций и схем придётся познакомится с общим принципом организации машинной памяти, логических и арифметических операций. 
     В контроллере системы предусмотрена память на 255 свободных функций и память на 255 шагов мультисцен. Доступ к таблице редактирования осуществляется через инженерный раздел Настройки ПЛК -> Свободные функции. Свободные функции работают каждый цикл базовых алгоритмов работы в ПЛК - 10 раз в одну секунду.
     Мультисцены срабатывают разово по получению команды в байт запуска с интерфейса, от Глобальной сцены или от Свободных функций. Мультисцена выполняет ряд простых действий по шагам - запись в указанные адреса указанных значений, период шага регулируется. Обработчик мультисцен одноканальный, т.е. пока выполняется запуск одной мультисцены, другая мультисцена, одновременно запускаемая, будет проигнорирована, если её приоритет такой же.

Одна свободная функция выглядит следующим образом:

             

Таблица функций:


   Входные параметры

   

   

Результат

 

A1

A2

 - первый аргумент

 - второй аргумент
 


FUNCTION ( A1 , A2 )

 


 ->  OUT

 

 

 

Одна МультиСцена выглядит следующим образом:

             

Таблица мультисцены:

Заголовок Мультисцены     Номер, например 3      
Время шага мультисцены   (не обязательно)    (по умолчанию 0.1сек)
Команда 1 (Тип данных)   Значение 1   Адрес вывода ->  OUT
Команда 2 .....   .....   ....
Пустая строка или заголовок   - конец мультисцены    
 

 

Возможные значения аргументов и вывода данных:

Аргументы 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 в адрес отвечающий ВКЛ-ВЫКЛ нужных групп света)
2) Связываем 4 виртуальные пары штор 3<->151, 4<->154, 5<->152,  7<->149 в таблице 11.  .
3) Шторы 3,4,5,6 привязываем к датчику освещённости (ДД204). Шторы 149,151,152,154 привязываем к Расписанию N1 через раздел Освещие. Активируем там нужные галочки разрешений.
4) В строках 43..46 формуруем флаг "Постановка или Взят раздел 3 охранной сигнализации" - Bit3 MEM12.
5) В строке 47 - При появлении флага разово пишем команду Мультисцена MS-2 (Закрывает все физические шторы 35..38)
6) В строках 48..51 - При пропадании флага разово записываем в шторы 35..38 значения из виртуальных штор 3,4,5,7
7) В строках 52..56 - Если нет флага, то копируем изменения состояния ВКЛ-ВЫКЛ от реальных штор (и отображаемых на интерфейсе) в виртуальные
8) В строках 210..214 - Если нет флага, то копируем изменения состояния ВКЛ-ВЫКЛ от виртуальных штор (и отображаемых на интерфейсе) в реальные
т.е. пункты 7 и 8 включают связку виртаульных штор работающих от датчиков и расписаний и физических штор, пока Снято с охраны.

     
 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 минуту.
2) В строке 2 ставим счётчик минут в выводим его на интерфейс через FreeAO-3..4 (Word %MB2302)
3) Сигнал с импульсного выхода счётчика воды заводим в строках 3 и 4 на таймеры TON и TOF. В качестве времени работы настройка с пользовательского интерфейса через FreeAO-5..6 (Word %MB2304).
4) В строке 5 с помощью логики XOR (исключающее или) проверяем, что один таймер ожидает включения или другой ожидает выключения, т.е. изменение входного сигнала было недавно.
5) Если оба таймера приняли одно значение, значит время для перезапуска вышло (5 часов в задании, 10 минут на скриншоте), то сбрасываем счётчик минут, отображающий наличие потока воды.
6) Если же счётчик времени потока воды превысил порог, то выдаём внутреннюю аварию IN.HlthAlarm-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. Управление шторами не слайдером, а через три кнопки на интерфейсе "Открыть-Стоп-Закрыть"
Управление шторой с Умного Дома через три кнопки на интерфейсе EasyHome   Штатное управление позиционированием шторы выполняется через слайдер, однако с помощью свободных функций можно реализовать и управление тремя кнопками с интерфейса "Открыть-Стоп-Закрыть". Кнопки Закрыть и Открыть являеются выходами управлением мотора 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 в режиме приёма данных драйвера кластера контроллеров.