Плагин Modbus
-
то же самое.
2 соединения.
Старое на 23 часа,\
и новое на 0 сек.
Научился повторять проблему.
У меня дача с квартирой VPN связана. Проблема возникает, если VPN рубануть.
VPN восстанавливается, а работа модбас - нет. VPN между двумя микротиками поднят.
Видимо соединение контроллер - микротик является ключем к проблеме.
-
Совсем то же самое.
Настройки порта плагина сделаны, но игнорируется.
-
Сам отвечаю.
Нужно было обязательно сервер IH перезагрузить, чтобы настройка заработала.
Но с ней стало все намного хуже.
Т.е. связь не восстанавливается вообще.
Даже после перезагрузки контроллера.
Выключил фиксированный порт, перезапустил контроллер - заработало.
Перезапуск микротика на стороне контроллера на помогает ни в каком случае.
-
Сам отвечаю.
Нужно было обязательно сервер IH перезагрузить, чтобы настройка заработала.
Нет, достаточно перезагрузить плагин
Но с ней стало все намного хуже.
Т.е. связь не восстанавливается вообще.
Даже после перезагрузки контроллера.
Выключил фиксированный порт, перезапустил контроллер - заработало.
А какая ошибка в плагине?
При переиспользовании порта проходит некоторое время, пока ОС его освобождает даже при нормальном отключении.
Перезапуск микротика на стороне контроллера на помогает ни в каком случае.
Раз вы можете моделировать ситуацию, попробуйте радикально уменьшить "TCP Established Timeout" на микротике на стороне контроллера
https://frm.intrahouse.ru/viewtopic.php?f=18&t=5493&start=80
-
Чтобы локализовать проблему предлагаю установить любой modbus клиент на свой компьютер.
1. При нормальной работе плагина попробовать зайти на контроллер с помощью modbus клиента.
Если не получается, значит контроллер не разрешает несколько одновременных подключений по modbus
Тогда ситуация становится понятнее. Контроллер не закрывает старое соединение и при этом не разрешает новое.
2. Отключить плагин. Подключиться modbus клиентом. Cмоделировать ситуацию с отключением. Сможет ли modbus клиент подключиться к контроллеру?
-
Связь после обрыва не восстанавливается.
Вот пакеты попытки старта плагина.
Результат анализа дампов:
Удачное соединение (первый отправленный файл)
Трехэтапное рукопожатие
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 клиент подключиться к контроллеру?
Сделаю на выходных.
-
Почему контроллер категорически отказывается соединяться - в этом вопрос.
Скопировал на форум контроллера.
Но они не быстрые там совсем.
-
Сам отвечаю.
Нужно было обязательно сервер IH перезагрузить, чтобы настройка заработала.
Нет, достаточно перезагрузить плагин
Оказалось не достаточно. Я его перезапускал, провел эксперимент с обрывом связи, в результате которого плагин сам перезапускался, и все время он работал от других портов.
Написанный в настройках взял только после перезагрузки IH.
Но с ней стало все намного хуже.
Т.е. связь не восстанавливается вообще.
Даже после перезагрузки контроллера.
Выключил фиксированный порт, перезапустил контроллер - заработало.
А какая ошибка в плагине?При переиспользовании порта проходит некоторое время, пока ОС его освобождает даже при нормальном отключении.
Та же самая ошибка. Но она не прекращается и после перезагрузки контроллера. Может порт 7999 не допустим для модбаса?
Перезапуск микротика на стороне контроллера на помогает ни в каком случае.
Раз вы можете моделировать ситуацию, попробуйте радикально уменьшить "TCP Established Timeout" на микротике на стороне контроллера
https://frm.intrahouse.ru/viewtopic.php?f=18&t=5493&start=80
Попробую.
-
Скопировал на форум контроллера.
Но они не быстрые там совсем.
Ответили практически сразу.
<quote>> Он считает что у него уже занято одно соединение по Modbus-TCP.
Такую же ситуацию можно наблюдать если соединиться с ним одновременно с двух клиентов.
-
Скопировал на форум контроллера.
Но они не быстрые там совсем.
Ответили практически сразу.
<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?