Плагин Modbus



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

    1. При нормальной работе плагина попробовать зайти на контроллер с помощью modbus клиента.

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

    Тогда ситуация становится понятнее. Контроллер не закрывает старое соединение и при этом не разрешает новое.

    2. Отключить плагин. Подключиться modbus клиентом. Cмоделировать ситуацию с отключением. Сможет ли modbus клиент подключиться к контроллеру?



  • @Erik:

    Связь после обрыва не восстанавливается.

    Вот пакеты попытки старта плагина.

    https://yadi.sk/d/N_AurooQUkBZxA

    Результат анализа дампов:

    Удачное соединение (первый отправленный файл)

    Трехэтапное рукопожатие

    13 2.823605 192.168.88.46 192.168.13.25 TCP 74 33770 → 502 [SYN, ECN, CWR]

    16 2.841734 192.168.13.25 192.168.88.46 TCP 60 502 → 33770 [SYN, ACK]

    19 2.854543 192.168.88.46 192.168.13.25 TCP 54 33770 → 502 [ACK]

    Обмен данными

    22 2.863566 192.168.88.46 192.168.13.25 Modbus/TCP 66 Query: Trans: 1; Unit: 1, Func: 3: Read Holding Registers

    25 2.870976 192.168.13.25 192.168.88.46 Modbus/TCP 65 Response: Trans: 1; Unit: 1, Func: 3: Read Holding Registers

    28 2.880465 192.168.88.46 192.168.13.25 TCP 54 33770 → 502 [ACK]

    ….

    Неудачное соединение

    Трехэтапное рукопожатие - все нормально

    53 12.880903 192.168.88.46 192.168.13.25 TCP 74 38416 → 502 [SYN, ECN, CWR]

    56 12.883667 192.168.13.25 192.168.88.46 TCP 60 502 → 38416 [SYN, ACK]

    59 12.892805 192.168.88.46 192.168.13.25 TCP 54 38416 → 502 [ACK]

    Но контроллер сразу отправляет пакет FIN - завершение

    62 12.895657 192.168.13.25 192.168.88.46 TCP 60 502 → 38416 [FIN, ACK]

    Сервер после рукопожатия успел отправить первый запрос

    65 12.900399 192.168.88.46 192.168.13.25 Modbus/TCP 66 Query: Trans: 1; Unit: 1, Func: 3: Read Holding Registers

    Но контроллер кроме FIN завершения еще посылает RST - прекратить немедленно (обычно используется или FIN или RST)

    68 12.903004 192.168.13.25 192.168.88.46 TCP 60 502 → 38416 [RST, ACK]

    69 12.903004 192.168.13.25 192.168.88.46 TCP 60 502 → 38416 [RST, ACK]

    70 12.903147 192.168.13.25 192.168.88.46 TCP 54 502 → 38416 [RST, ACK]

    Сервер соглашается завершить

    71 12.905900 192.168.88.46 192.168.13.25 TCP 54 38416 → 502 [ACK]

    74 12.907799 192.168.88.46 192.168.13.25 TCP 54 38416 → 502 [FIN, ACK]

    Контроллер еще пять раз присылает прекратить

    77 12.908491 192.168.13.25 192.168.88.46 TCP 60 502 → 38416 [RST, ACK]

    ….....

    На этом сеанс завершается. При следующей попытке все повторяется

    Почему контроллер категорически отказывается соединяться - в этом вопрос.



  • @intrahouse:

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

    1. При нормальной работе плагина попробовать зайти на контроллер с помощью modbus клиента.

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

    Тогда ситуация становится понятнее. Контроллер не закрывает старое соединение и при этом не разрешает новое.

    2. Отключить плагин. Подключиться modbus клиентом. Cмоделировать ситуацию с отключением. Сможет ли modbus клиент подключиться к контроллеру?

    Сделаю на выходных.



  • @intrapro:

    Почему контроллер категорически отказывается соединяться - в этом вопрос.

    Скопировал на форум контроллера.

    Но они не быстрые там совсем. 😞



  • @intrapro:

    @Erik:

    Сам отвечаю.

    Нужно было обязательно сервер IH перезагрузить, чтобы настройка заработала.

    Нет, достаточно перезагрузить плагин

    Оказалось не достаточно. Я его перезапускал, провел эксперимент с обрывом связи, в результате которого плагин сам перезапускался, и все время он работал от других портов.

    Написанный в настройках взял только после перезагрузки IH.

    @intrapro:

    @Erik:

    Но с ней стало все намного хуже.

    Т.е. связь не восстанавливается вообще.

    Даже после перезагрузки контроллера.

    Выключил фиксированный порт, перезапустил контроллер - заработало.
    А какая ошибка в плагине?

    При переиспользовании порта проходит некоторое время, пока ОС его освобождает даже при нормальном отключении.

    Та же самая ошибка. Но она не прекращается и после перезагрузки контроллера. Может порт 7999 не допустим для модбаса?

    @intrapro:

    @Erik:

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

    Раз вы можете моделировать ситуацию, попробуйте радикально уменьшить "TCP Established Timeout" на микротике на стороне контроллера

    https://frm.intrahouse.ru/viewtopic.php?f=18&t=5493&start=80

    Попробую.



  • @Erik:

    Скопировал на форум контроллера.

    Но они не быстрые там совсем. 😞

    Ответили практически сразу.

    <quote>> Он считает что у него уже занято одно соединение по Modbus-TCP.

    Такую же ситуацию можно наблюдать если соединиться с ним одновременно с двух клиентов.



  • @Erik:

    @Erik:

    Скопировал на форум контроллера.

    Но они не быстрые там совсем. 😞

    Ответили практически сразу.

    <quote>> Он считает что у него уже занято одно соединение по Modbus-TCP.

    Такую же ситуацию можно наблюдать если соединиться с ним одновременно с двух клиентов.

    То есть контроллер разрешает только одно соединение по Modbus.

    Следующий вопрос - как долго контроллер считает, что соединение занято, при потере связи.



  • Проблема решена.

    Ребята из Гидролого сделали прошивку с другими правилами установки соединения по Модбас.



  • Подскажите: имеются исполнительные модули которые работают по протоколу Modbus RTU (RS-485). Можно ли работать с такими модулями с помощью плагина Modbus через преобразователь интерфейсов из RS-485 (Modbus) в Ethernet (IP)?

    Вот такой преобразователь - https://wirenboard.com/ru/product/WB-MGE/

    Был ли у кого подобный опыт работы с подобными преобразователями?



  • На следующей неделе будем закупать некоторое оборудование wiremboard.

    Доделаем плагин для Modbus для протокола modbus RTU и протестируем с этим преобразователем.



  • Спасибо! Буду ждать результат.



  • Есть ли результат по плагину modbus-rtu?

    Пытаюсь считать показания тепловычислителя: ТМК-Н130. Подсоединен через преобразователь интерфейсов Ethernet/RS-232. Всё что поступает через Ethernet отправляется на интерфейс RS-232 тепловычислителя. modpoll работает нормально:

    Пример опроса (Количество тепловой энергии Q1), считываем регистр хранения 30018 (целая часть) и 30020 (дробная часть).

    В регистрах счетчика данные хранятся в формате little-endian.

    e:\Ivan\Проекты\modbus\soft\modpoll.3.4\win32>modpoll -m enc -a 0 -c 1 -r 17 -t 3:int -1 -0 -i -f -p 45016 77.244.70.15

    e:\Ivan\Проекты\modbus\soft\modpoll.3.4\win32>modpoll -m enc -a 0 -c 1 -r 19 -t 3:float -1 -0 -i -f -p 45016 77.244.70.15

    С плагином modbus-tcp работать не хочет, лог выдает:

    8.06 19:36:36.138 IH: Run /var/lib/intrahouse-c/plugins/modbus/modbus.js modbus2
    28.06 19:36:36.609 modbus2: Plugin modbus2 has started.
    28.06 19:36:36.632 modbus2: Connecting options { port: 45016, host: '77.244.70.15' }
    28.06 19:36:36.697 modbus2: Connected to 77.244.70.15:45016
    28.06 19:36:36.699 modbus2: READ unitid=1 FC=3 address=30018 (0x7542) length=2
    28.06 19:36:36.906 modbus2: Network ERROR: ETIMEDOUT
    28.06 19:36:36.914 IH: Plugin exit with code 1
    28.06 19:36:36.914 IH: restart timer 5
    28.06 19:36:42.164 IH: Run /var/lib/intrahouse-c/plugins/modbus/modbus.js modbus2
    28.06 19:36:42.640 modbus2: Plugin modbus2 has started.
    28.06 19:36:42.662 modbus2: Connecting options { port: 45016, host: '77.244.70.15' }
    28.06 19:36:42.747 modbus2: Connected to 77.244.70.15:45016
    28.06 19:36:42.749 modbus2: READ unitid=1 FC=3 address=30018 (0x7542) length=2
    28.06 19:36:42.957 modbus2: Network ERROR: ETIMEDOUT
    28.06 19:36:42.964 IH: Plugin exit with code 1
    28.06 19:36:42.965 IH: restart timer 5
    
    

    В чем может быть проблема?



  • @gis:

    Есть ли результат по плагину modbus-rtu?

    Пытаюсь считать показания тепловычислителя: ТМК-Н130. Подсоединен через преобразователь интерфейсов Ethernet/RS-232. Всё что поступает через Ethernet отправляется на интерфейс RS-232 тепловычислителя. modpoll работает нормально:

    Пример опроса (Количество тепловой энергии Q1), считываем регистр хранения 30018 (целая часть) и 30020 (дробная часть).

    В регистрах счетчика данные хранятся в формате little-endian.

    e:\Ivan\Проекты\modbus\soft\modpoll.3.4\win32>modpoll -m enc -a 0 -c 1 -r 17 -t 3:int -1 -0 -i -f -p 45016 77.244.70.15

    e:\Ivan\Проекты\modbus\soft\modpoll.3.4\win32>modpoll -m enc -a 0 -c 1 -r 19 -t 3:float -1 -0 -i -f -p 45016 77.244.70.15

    С плагином modbus-tcp работать не хочет, лог выдает:

    В чем может быть проблема?

    Если это простой преобразователь интерфейса, то пакеты RTU передаются в TCP сокет без преобразования. То есть это не Modbus-TCP, а Modbus RTU over TCP

    Попробуйте скачать новый релиз плагина v0.0.9 с github: https://github.com/intrahouseio/intraHouse.plugin-Modbus/releases

    В нем добавлен этот транспорт. Не выкладываем для обновления, так как протестировано пока только на одном виде оборудования.



  • Скачал плагин v0.0.9 с github. Показания не считываются, выдает вот такой лог:

    01.07 07:32:51.201 modbus2: Plugin modbus2 has started.
    01.07 07:32:51.220 modbus2: config=[ { id: 'ch1',
        vartype: 'uint16',
        unit: 'modbus2',
        usek: false,
        ks: 100,
        ks0: 0,
        gr: false,
        pollp: true,
        desc: 'AI',
        chan: 'ch1',
        kh0: 0,
        address: '30018',
        fcr: '3',
        useactions: false,
        actions: [ [Object] ],
        kh: 100,
        unitid: 0,
        inv: false,
        inv_out: false,
        prop: '',
        op: '',
        value: '',
        calc_out: '',
        dn: 'T',
        calc: '',
        nofb: false } ]
    01.07 07:32:51.225 modbus2: polls=[ { length: 1,
        unitid: 0,
        desc: 'AI',
        fcr: '3',
        address: 30018,
        ref: [ [Object] ] } ]
    01.07 07:32:51.300 modbus2: Connected to 77.244.70.15:45016
    01.07 07:32:51.301 modbus2: sendNext item={ length: 1,
      unitid: 0,
      desc: 'AI',
      fcr: '3',
      address: 30018,
      ref: [ { id: 'ch1', vartype: 'uint16le', widx: 0 } ] }
    01.07 07:32:51.302 modbus2: READ unitid=0 FC=3 address=30018 (0x7542) length=1
    01.07 07:32:51.355 modbus2: ERROR: Error: Modbus exception 2
        at TelnetPort. <anonymous>(/var/lib/intrahouse-c/plugins/modbus/node_modules/modbus-serial/index.js:288:42)
        at emitOne (events.js:115:13)
        at TelnetPort.emit (events.js:210:7)
        at TelnetPort._emitData (/var/lib/intrahouse-c/plugins/modbus/node_modules/modbus-serial/ports/telnetport.js:154:10)
        at Socket.onData (/var/lib/intrahouse-c/plugins/modbus/node_modules/modbus-serial/ports/telnetport.js:100:22)
        at emitOne (events.js:115:13)
        at Socket.emit (events.js:210:7)
        at addChunk (_stream_readable.js:264:12)
        at readableAddChunk (_stream_readable.js:251:11)
        at Socket.Readable.push (_stream_readable.js:209:10)
    01.07 07:32:51.364 IH: Plugin exit with code 1
    01.07 07:32:51.365 IH: restart timer 5</anonymous>
    
    


  • @gis:

    Скачал плагин v0.0.9 с github. Показания не считываются, выдает вот такой лог:

    > 01.07 07:32:51.302 modbus2: READ unitid=0 FC=3 address=30018 (0x7542) length=1
    > 01.07 07:32:51.355 modbus2: ERROR: Error: Modbus exception 2
    > 
    > 
    

    Не указан Unit ID (адрес устройства на шине).

    Проверьте, пожалуйста, в настройке канала



  • Спасибо! Согласно инструкции на тепловычислитель, если используется подключение RS232 (а оно используется через преобразователь интерфейсов), то адрес устройства = 0. Я такой адрес и установил в настройках плагина. Следует ли использовать адрес устройства =1?



  • Поставил адрес устройства =1 Аналогичная картина:

    01.07 18:48:17.041 modbus2: sendNext item={ length: 1,
      unitid: 1,
      desc: 'AI',
      fcr: '3',
      address: 30018,
      ref: [ { id: 'ch1', vartype: 'uint16le', widx: 0 } ] }
    01.07 18:48:17.042 modbus2: READ unitid=1 FC=3 address=30018 (0x7542) length=1
    01.07 18:48:17.092 modbus2: ERROR: Error: Modbus exception 2
    
    

    Что означает ERROR: Error: Modbus exception 2



  • @gis:

    Поставил адрес устройства =1 Аналогичная картина:

    > 01.07 18:48:17.042 modbus2: READ unitid=1 FC=3 address=30018 (0x7542) length=1
    > 01.07 18:48:17.092 modbus2: ERROR: Error: Modbus exception 2
    > 
    

    Что означает ERROR: Error: Modbus exception 2

    Сейчас подключение у Вас произошло. 2 - это стандартная ошибка адресации уровня Modbus:

    Modbus exception 2 - Illegal Data Address. The data address received in the query is not an allowable address for the slave

    Попробуйте адресоваться внутри таблицы, как в modpoll - адрес 17



  • Похоже проблема с адресаций. Поставил 17 ошибок не выдает:

    1.07 22:52:17.171 modbus2: sendNext item={ length: 2,
      unitid: 0,
      desc: 'AI',
      fcr: '3',
      address: 17,
      ref: [ { id: 'ch1', vartype: 'int32le', widx: 0 } ] }
    01.07 22:52:17.172 modbus2: READ unitid=0 FC=3 address=17 (0x11) length=2
    01.07 22:52:17.220 IH: set {"T":{"aval":0,"err":0}}
    01.07 22:52:17.221 modbus2: {"type":"Buffer","data":[0,0,0,0]}
    01.07 22:52:17.721 modbus2: sendNext item={ length: 2,
      unitid: 0,
      desc: 'AI',
      fcr: '3',
      address: 17,
      ref: [ { id: 'ch1', vartype: 'int32le', widx: 0 } ] }
    01.07 22:52:17.723 modbus2: READ unitid=0 FC=3 address=17 (0x11) length=2
    01.07 22:52:17.770 IH: set {"T":{"aval":0,"err":0}}
    01.07 22:52:17.771 modbus2: {"type":"Buffer","data":[0,0,0,0]}
    
    

    Но значение =0

    modpoll при этом выдает значение 1160.



  • @gis:

    Похоже проблема с адресаций. Поставил 17 ошибок не выдает:

    Но значение =0

    modpoll при этом выдает значение 1160.

    Можно для эксперимента соседние адреса почитать.


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