Плагин Modbus



  • @Erik:

    Пытаюсь заставить скрипт проверять режим комнаты (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);
        } 
    ;
    
    


  • @intrapro:

    Просто в сценарии нужно объявить устройства, с которыми он работает

    Если вы не хотите использовать мультисценарий, достаточно написать так

    Сравнение с нулем оказывается 3 знака равенства (===) 🙂

    Скрипт работает, спасибо.

    Но.

    Скрипт изменяет значение, но в поле оно сразу не отображается. Оно улетает на контроллер функцией FC6, потом считывается функцией FC3, и только потом отображается. Контроллер у меня не спешный, и между нажатиям и изменением отображаемого значения проходит 1-2 секунды.

    Нужно модбас устройство, которое имеет только функцию записи (FC6). Чтобы в виждете устройство отображало цифру, введенную на сервере, и писало ее в контроллер при изменении.

    С одной стороны тут бы как раз параметры из свойств устройств модбаса пригодились.

    Создать модбас устройство не привязанное к своему регистру, но с параметром, записывающим чужой регистр?



  • @Erik:

    Мультисценарий не понимаю, как сделать.

    В другой комнате все актуаторы другие.

    Передавать сценарию номера 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 куда подставлять?



  • @Erik:

    каким образом скрипт разберется какой ActorA куда подставлять?

    По имени

    scene_dev_set.png



  • @Erik:

    Скрипт работает, спасибо.

    Но.

    Скрипт изменяет значение, но в поле оно сразу не отображается. Оно улетает на контроллер функцией FC6, потом считывается функцией FC3, и только потом отображается. Контроллер у меня не спешный, и между нажатиям и изменением отображаемого значения проходит 1-2 секунды.

    Нужно модбас устройство, которое имеет только функцию записи (FC6). Чтобы в виждете устройство отображало цифру, введенную на сервере, и писало ее в контроллер при изменении.

    Тогда теряем обратную связь 😞 Нет гарантии, что записанное нами принято контроллером

    В Berry у нас был флаг "Односторонняя связь" для устройств, в которые можно только писать. Его же применяли для "задумчивых" устройств.

    В этом случае значение принимается сервером как текущее в момент отправки.

    Мы как раз планировали добавить этот флаг. Будет при следующем обновлении системы.



  • Сделал обзор IH на форуме производителя моего контроллера.

    http://www.hydrotherm.ru/proba/phorum/read.php?1,3475



  • Отлично! 😄



  • Опубликован описание плагина 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' } ] }
    
    

    Перезапуск плагина не помог.

    Перезапуск сервера не помог.

    ТСР соединение с контроллером открывается на секунду, и закрывается.

    Сам контроллер работает. Могу на него войти. По команде выдает текущие значения регистров модбас на страничку.

    Как его оживить?



  • Перезагрузка сервера целиком не помогла (ВМ перезапустил).

    А спустя какое то время после очередного перезапуска плагина заработало.

    А нет ли там каких нибудь таймаутов многочасовых?



  • @Erik:

    Сегодня протестировалась ситуация с потерей связи между сервером и контроллером.

    При пропадании связи через 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 минут при потере связи?



  • @Erik:

    В прошедшие выходные отключалось электричество на 8 часов. Сервер работал, контроллер был не доступен.

    После включения плагин не восстановил работу с контроллером. Пришлось перезапускать плагин.

    Это так и планировалось?

    Нет, плагин должен при потере связи перезагрузиться и пытаться восстановить связь 😞

    Проверим.

    @Erik:

    Можно автоматизировать перезапуск плагина раз в 30 минут при потере связи?

    Для этого у всех плагинов есть параметр на вкладке Общие - Время рестарта (сек).

    Если бы плагин завершил работу при потере связи - он бы перезагрузился.



  • @intrapro:

    Для этого у всех плагинов есть параметр на вкладке Общие - Время рестарта (сек).

    Если бы плагин завершил работу при потере связи - он бы перезагрузился.

    стоит 5 секунд.

    Но до перезапуска вручную ничего не работало.

    У меня на коротких перерывах все восстанавливается само.

    А дважды случались длительные, один час, второй восемь часов, оба раза были проблемы.



  • @Erik:

    @intrapro:

    Для этого у всех плагинов есть параметр на вкладке Общие - Время рестарта (сек).

    Если бы плагин завершил работу при потере связи - он бы перезагрузился.

    стоит 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
    
    

    После третьего перезапуска плагина заработало.


Авторизуйтесь, чтобы ответить