Плагин Modbus
-
Пытаюсь заставить скрипт проверять режим комнаты (ACTORA3), и в зависимости от его значения увеличивать уставки соответствующего режима.
И ничего не просиходит. Ни ошибок, ни действий.
Сделайте в блоках арифметику, пожалуйста
Из-за "+1" заставлять учить синтаксис - это же геноцид!!!
Все нормально у вас с синтаксисом
Просто в сценарии нужно объявить устройства, с которыми он работает
Если вы не хотите использовать мультисценарий, достаточно написать так
/** * @name Увеличение уставки T комнаты на шаг * @desc * @version 4 */ const ACTORA3 = Device("ACTORA3"); const ACTORA7 = Device("ACTORA7"); const ACTORA8 = Device("ACTORA8"); const ACTORA9 = Device("ACTORA9"); script({ start(step) { step = Number(step); let newvalue1 = ACTORA7.value+step; if (ACTORA3.value == 0) ACTORA7.setValue(newvalue1); let newvalue2 = ACTORA8.value+step; if (ACTORA3.value == 1) ACTORA8.setValue(newvalue2); let newvalue3 = ACTORA9.value+step; if (ACTORA3.value == 3) ACTORA9.setValue(newvalue3); } });
И операция проверки равенства это ==
Одиночный = это присваивание
Увидеть ошибку сценария после его запуска можно в PM - Рабочие сценарии. Там ошибка должна быть, что устройства не определены
Также там есть Отладчик, аналогичный отладчику плагина. Можно в отдельной вкладке открыть PM, встать на сценарий, выбрать Отладчик, нажать play, там будет виден ход выполнения сценария.
Насчет арифметики в блок-схеме - да, вы правы, сделаем.Но не в ближайшем будущем
-
Спасибо.
Мультисценарий не понимаю, как сделать.
В другой комнате все актуаторы другие.
Передавать сценарию номера 4-х актуаторовв и значение шага через запятую?
А в сценарии парсить строку параметров?
Что-то типа
const ao = Device("ActorA","Регулируемый актуатор"); start(A,B,C,D,step) { A = Number(A,,,,); B = Number(,B,,,); C = Number(,,C,,); D = Number(,,,D,); step = Number(,,,,step); let newvalue1 = aoB.value+step; if ((aoA.value == 0)) aoB.setValue(newvalue1); let newvalue2 = aoC.value+step; if ((aoA.value == 1)) aoC.setValue(newvalue2); let newvalue3 = aoD.value+step; if ((aoA.value == 3)) aoD.setValue(newvalue3); } ;
-
Просто в сценарии нужно объявить устройства, с которыми он работает
Если вы не хотите использовать мультисценарий, достаточно написать так
Сравнение с нулем оказывается 3 знака равенства (===)
Скрипт работает, спасибо.
Но.
Скрипт изменяет значение, но в поле оно сразу не отображается. Оно улетает на контроллер функцией FC6, потом считывается функцией FC3, и только потом отображается. Контроллер у меня не спешный, и между нажатиям и изменением отображаемого значения проходит 1-2 секунды.
Нужно модбас устройство, которое имеет только функцию записи (FC6). Чтобы в виждете устройство отображало цифру, введенную на сервере, и писало ее в контроллер при изменении.
С одной стороны тут бы как раз параметры из свойств устройств модбаса пригодились.
Создать модбас устройство не привязанное к своему регистру, но с параметром, записывающим чужой регистр?
-
Мультисценарий не понимаю, как сделать.
В другой комнате все актуаторы другие.
Передавать сценарию номера 4-х актуаторовв и значение шага через запятую?
А в сценарии парсить строку параметров?
Идея мультисценария в том, что в Device задается не конкретное устройство, а класс: "SensorD", "SensorA", "ActorD", "ActorA", "Meter"
То есть это шаблон сценария. Затем можно формировать наборы конкретных устройств. Для каждого набора создается экземпляр рабочего сценария.
Чтобы из простого сценария сделать мульти, нужно:
1. Вместо конкретных устройств проставить класс - в вашем случае ActorD или ActorA.
Чтобы ориентироваться в таблице "Запуск для устройств" можно добавить названия каждого параметра
/** * @name Увеличение уставки комнаты на шаг * @desc * @version 4 */ const ACTORA3 = Device("ActorA", "Режим"); const ACTORA7 = Device("ActorA", "Уставка комфорт"); const ACTORA8 = Device("ActorA", "Уставка ночь"); const ACTORA9 = Device("ActorA", "Уставка эконом"); script({ start(step) { step = Number(step); let newvalue1 = ACTORA7.value+step; if (ACTORA3.value == 0) ACTORA7.setValue(newvalue1); let newvalue2 = ACTORA8.value+step; if (ACTORA3.value == 1) ACTORA8.setValue(newvalue2); let newvalue3 = ACTORA9.value+step; if (ACTORA3.value == 3) ACTORA9.setValue(newvalue3); } });
Сами названия устройств - параметров можно оставить как есть, можно заменить на более общие - неважно
Сохранить скрипт
2. В нижней табличке (там же где скрипт) выбрать "Запуск для устройств" и создать наборы для комнат:
Там все просто - выбираются устройства для каждого параметра.
В результате получаются сценарии:
Увеличение уставки комнаты на шаг(ACTORA3, ACTORA7, ACTORA8, ACTORA9) - для одной комнаты
Увеличение уставки комнаты на шаг(ACTORA3, ACTORA17, ACTORA18, ACTORA19) - для другой комнаты
и т д
3. На кнопку теперь нужно привязать конкретный сценарий. Они все будут доступны в списке
А параметр (step) - остается как есть
-
каким образом скрипт разберется какой ActorA куда подставлять?
-
-
Скрипт работает, спасибо.
Но.
Скрипт изменяет значение, но в поле оно сразу не отображается. Оно улетает на контроллер функцией FC6, потом считывается функцией FC3, и только потом отображается. Контроллер у меня не спешный, и между нажатиям и изменением отображаемого значения проходит 1-2 секунды.
Нужно модбас устройство, которое имеет только функцию записи (FC6). Чтобы в виждете устройство отображало цифру, введенную на сервере, и писало ее в контроллер при изменении.
Тогда теряем обратную связь Нет гарантии, что записанное нами принято контроллером
В Berry у нас был флаг "Односторонняя связь" для устройств, в которые можно только писать. Его же применяли для "задумчивых" устройств.
В этом случае значение принимается сервером как текущее в момент отправки.
Мы как раз планировали добавить этот флаг. Будет при следующем обновлении системы.
-
Сделал обзор IH на форуме производителя моего контроллера.
-
Отлично!
-
Опубликован описание плагина Modbus https://ih-systems.com/ru/product/plugin-modbus/
Плагин (v0.0.6) доступен для скачивания и обновления.
-
Сегодня протестировалась ситуация с потерей связи между сервером и контроллером.
При пропадании связи через 120 сек на объектах загорелся индикатор аварии (как настроено)
При восстановлении связи работа плагина не восстановилась. индикаторы не гаснут, и скрипты изменения уставок не работают.
Отладчик показывает
14.02 09:34:19.247 IH: command [ { dn: 'ACTORA31', prop: 'set', val: 16 } ] 14.02 09:34:19.249 IH: send { type: 'act', data: [ { chan: 'TSuEco', id: 'TSuEco', vartype: 'int16', usek: false, ks: 100, ks0: 0, gr: false, pollp: true, value: 160, desc: 'AO', kh0: 0, address: '3784', fcr: '3', useactions: false, kh: 100, unitid: 1, calc_outfn: [Function: anonymous], command: 'set' } ] } 14.02 09:35:03.648 IH: command [ { dn: 'ACTORA31', prop: 'set', val: 13 } ] 14.02 09:35:03.649 IH: send { type: 'act', data: [ { chan: 'TSuEco', id: 'TSuEco', vartype: 'int16', usek: false, ks: 100, ks0: 0, gr: false, pollp: true, value: 130, desc: 'AO', kh0: 0, address: '3784', fcr: '3', useactions: false, kh: 100, unitid: 1, calc_outfn: [Function: anonymous], command: 'set' } ] }
Перезапуск плагина не помог.
Перезапуск сервера не помог.
ТСР соединение с контроллером открывается на секунду, и закрывается.
Сам контроллер работает. Могу на него войти. По команде выдает текущие значения регистров модбас на страничку.
Как его оживить?
-
Перезагрузка сервера целиком не помогла (ВМ перезапустил).
А спустя какое то время после очередного перезапуска плагина заработало.
А нет ли там каких нибудь таймаутов многочасовых?
-
Сегодня протестировалась ситуация с потерей связи между сервером и контроллером.
При пропадании связи через 120 сек на объектах загорелся индикатор аварии (как настроено)
При восстановлении связи работа плагина не восстановилась. индикаторы не гаснут, и скрипты изменения уставок не работают.
Перезапуск плагина не помог.
Перезапуск сервера не помог.
ТСР соединение с контроллером открывается на секунду, и закрывается.
Сам контроллер работает. Могу на него войти. По команде выдает текущие значения регистров модбас на страничку.
Как его оживить?
Нужно отследить, что происходит при запуске плагина.
Установите Уровень отладочных сообщений - Средний.
Откройте отладчик плагина.
На другой вкладке сделайте Остановить плагин - Запустить плагин.
В отладчике должны быть сообщения начиная с Run
14.02 13:58:47.889 IH: Run /var/lib/intrahouse-c/plugins/modbus/modbus.js modbus1 14.02 13:58:48.961 modbus1: Plugin modbus1 has started. 14.02 13:58:49.083 modbus1: Connected to 192.168.0.240:502 14.02 13:58:49.085 modbus1: READ unitid=1 FC=1 address=16384 (0x4000) length=1 ........
Если соединение разрывается - должно быть сообщение об ошибке
-
вечером попробую повторить ситуацию выдергиванием пачкорда.
Сейчас оживилось все, и штатно отрабатывает включение/отключения плагина.
-
Не получается повторить проблему.
Восстанавливаю соединение, и тут же восстанавливается обмен по модбас.
-
В прошедшие выходные отключалось электричество на 8 часов. Сервер работал, контроллер был не доступен.
После включения плагин не восстановил работу с контроллером. Пришлось перезапускать плагин.
Это так и планироваалось?
Можно автоматизировать перезапуск плагина раз в 30 минут при потере связи?
-
В прошедшие выходные отключалось электричество на 8 часов. Сервер работал, контроллер был не доступен.
После включения плагин не восстановил работу с контроллером. Пришлось перезапускать плагин.
Это так и планировалось?
Нет, плагин должен при потере связи перезагрузиться и пытаться восстановить связь
Проверим.
Можно автоматизировать перезапуск плагина раз в 30 минут при потере связи?
Для этого у всех плагинов есть параметр на вкладке Общие - Время рестарта (сек).
Если бы плагин завершил работу при потере связи - он бы перезагрузился.
-
Для этого у всех плагинов есть параметр на вкладке Общие - Время рестарта (сек).
Если бы плагин завершил работу при потере связи - он бы перезагрузился.
стоит 5 секунд.
Но до перезапуска вручную ничего не работало.
У меня на коротких перерывах все восстанавливается само.
А дважды случались длительные, один час, второй восемь часов, оба раза были проблемы.
-
Для этого у всех плагинов есть параметр на вкладке Общие - Время рестарта (сек).
Если бы плагин завершил работу при потере связи - он бы перезагрузился.
стоит 5 секунд.
Но до перезапуска вручную ничего не работало.
У меня на коротких перерывах все восстанавливается само.
А дважды случались длительные, один час, второй восемь часов, оба раза были проблемы.
Да, проблема понятна.
Разберемся, выпустим обновление
-
Другая проблема (или ее проявление)
После грубой перезагрузки сервера IH связь по модбасу не восстанавливается.
В логе
19.02 06:49:11.317 IH: Send SIGTERM. 19.02 06:49:11.321 IH: Plugin exit 19.02 06:49:16.968 IH: Run /var/lib/intrahouse-c/plugins/modbus/modbus.js modbus1 19.02 06:49:17.270 modbus1: Plugin modbus1 has started. 19.02 06:49:17.340 modbus1: Connected to 192.168.13.25:502 19.02 06:49:17.340 modbus1: READ unitid=1 FC=3 address=141 (0x8d) length=1
После третьего перезапуска плагина заработало.