Начало такое же, как и в теме Modbus_client и Modbus TCP :
Я на ESP-01 делаю адаптер для своего сигнализатора загазованности (СЗ) в котельной. Я хотел бы из него (адаптера) по Modbus TCP (чтобы не нагромождать адаптер ещё одним модулем RS-485 (один уже используется для чтения статуса с СЗ), тянуть провода и т.п.) считывать статус клапана и пищалки как discrete input.
Прототип набросал на основе примера - и он успешно работает с modbus_client на десктопе:
modbus_client --debug -mtcp 192.168.0.145 -t1 -r123
$ modbus_client --debug -mtcp 192.168.0.145 -t1 -r123
Connecting to 192.168.0.145:502
[00][01][00][00][00][06][01][01][00][7B][00][01]
Waiting for a confirmation...
<00><01><00><00><00><04><01><01><01><40>
SUCCESS: read 1 of elements:
Data: 0x00
$ modbus_client --debug -mtcp 192.168.0.145 -t5 -r123 1
Data to write: 0x1
Connecting to 192.168.0.145:502
[00][01][00][00][00][06][01][05][00][7B][FF][00]
Waiting for a confirmation...
<00><01><00><00><00><06><01><05><00><7B><FF><00>
SUCCESS: written 1 elements!
$ modbus_client --debug -mtcp 192.168.0.145 -t1 -r123
Connecting to 192.168.0.145:502
[00][01][00][00][00][06][01][01][00][7B][00][01]
Waiting for a confirmation...
<00><01><00><00><00><04><01><01><01><03>
SUCCESS: read 1 of elements:
Data: 0x01
$ modbus_client --debug -mtcp 192.168.0.145 -t5 -r123 0
Data to write: 0x0
Connecting to 192.168.0.145:502
[00][01][00][00][00][06][01][05][00][7B][00][00]
Waiting for a confirmation...
<00><01><00><00><00><06><01><05><00><7B><00><00>
SUCCESS: written 1 elements!
$ modbus_client --debug -mtcp 192.168.0.145 -t1 -r123
Connecting to 192.168.0.145:502
[00][01][00][00][00][06][01][01][00][7B][00][01]
Waiting for a confirmation...
<00><01><00><00><00><04><01><01><01><10>
SUCCESS: read 1 of elements:
Data: 0x00
светодиод включается-выключается - всё ок.
Завёл
шаблон устройства
шаблон устройства:
{
"device_type": "Gas alarm (SZ-3) sensor",
"device": {
"name": "Gas alaram (SZ-3) sensor",
"id": "sz-3-esp-01",
"frame_timeout_ms": 100,
"poll_interval": 1000,
"channels": [
{
"name": "Alarm",
"reg_type": "discrete",
"address": 123,
"type": "switch",
"readonly": true
}
]
}
}
Добавил в конфиг, выставил период чтения (для надёжности теста) 10 с.
Первое чтение - ок. Второе же чтение - отваливается.
Я для теста запускал в цикле множественное чтение и запись by modbus_client
- работает стабильно:
$ b=0; for i in $(seq 1000); do modbus_client --debug -mtcp 192.168.0.145 -t5 -r123 $b; let b=1-b; sleep 0.1;done
Что дало основание думать, что проблема - при обращении именно из WB.
В общем, я выделил
конфиг только для этого устройства
конфиг только для этого устройства:
$ cat ./wb-mqtt-serial.conf
{
"debug" : false,
"ports" :
[
{
"address" : "192.168.0.145",
"connection_max_fail_cycles" : 0,
"connection_timeout_ms" : 0,
"devices" :
[
{
"device_type" : "Gas alarm (SZ-3) sensor",
"enabled" : true,
"read_rate_limit_ms" : 10000,
"slave_id" : "21"
}
],
"enabled" : true,
"guard_interval_us" : 500000,
"port" : 502,
"port_type" : "modbus tcp",
"read_rate_limit_ms" : 0,
"response_timeout_ms" : 500
}
]
}
и
запустил sudo /usr/bin/wb-mqtt-serial -d 1 -c ./wb-mqtt-serial.conf
$ sudo /usr/bin/wb-mqtt-serial -d 1 -c ./wb-mqtt-serial.conf
<6>INFO: [mqtt] Default host and port detected, checking if UNIX socket exists on /var/run/mosquitto/mosquitto.sock
<6>INFO: [mqtt] UNIX socket not found, falling back to TCP connection
<6>INFO: [mqtt] connection estabilished with code "0" <success>
<6>INFO: [mqtt] subscription succeeded (message id 1)
<6>INFO: [mqtt] subscription succeeded (message id 2)
<7>DEBUG: [serial port driver] setting up devices at <192.168.0.145:502>
<7>DEBUG: [serial client] AddRegister: <modbus-tcp:21:coil: 123>
<6>INFO: [mqtt] subscription succeeded (message id 14)
<6>INFO: [mqtt] subscription succeeded (message id 15)
<6>INFO: [mqtt] subscription succeeded (message id 19)
<7>DEBUG: [port] Sleep 100000 us
<7>DEBUG: [port] Sleep 500000 us
<7>DEBUG: [port] Write: 00 01 00 00 00 06 15 01 00 7b 00 01
<7>DEBUG: [port] ReadFrame: 00 01 00 00 00 04 15
<7>DEBUG: [port] ReadFrame: 01 01 bc
<7>DEBUG: [register] new val for <modbus-tcp:21:coil: 123>: 0
<6>INFO: [serial device] device modbus-tcp:21 is connected
<7>DEBUG: [serial port driver] channel 'Alarm' of device 'sz-3-esp-01_21' <-- 0, error: ""
<7>DEBUG: [serial client] <192.168.0.145:502>347307181: Wait until 347316613
...
<7>DEBUG: [port] Sleep 500000 us
<7>DEBUG: [port] Write: 00 02 00 00 00 06 15 01 00 7b 00 01
<4>WARNING: [modbus] failed to read 1 coil(s) @ 123 of device modbus-tcp:21: Serial protocol error: socket closed
<7>DEBUG: [serial client] <192.168.0.145:502>347316699: Wait until 347326613
<7>DEBUG: [serial client] <192.168.0.145:502>347316799: Wait until 347326613
В это время проснифал трафик
modbus-tcp-3.pcap (1.5 КБ)
и вижу в нём (смотрел wireshark-ом, но сюда приведу текстовую версию)
tshark -r ~/d/modbus-tcp-3.pcap
$ tshark -r ~/d/modbus-tcp-3.pcap
1 2023-01-13 13:28:06,349785 0.000000 192.168.0.130 → 192.168.0.145 502 TCP 76 54638 → 502 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=1448650731 TSecr=0 WS=128
2 2023-01-13 13:28:06,405940 0.056155 192.168.0.145 → 192.168.0.130 54638 TCP 64 502 → 54638 [SYN, ACK] Seq=0 Ack=1 Win=2144 Len=0 MSS=536 SACK_PERM=1
3 2023-01-13 13:28:06,406124 0.056339 192.168.0.130 → 192.168.0.145 502 TCP 56 54638 → 502 [ACK] Seq=1 Ack=1 Win=64240 Len=0
4 2023-01-13 13:28:06,906665 0.556880 192.168.0.130 → 192.168.0.145 502 Modbus/TCP 68 Query: Trans: 1; Unit: 21, Func: 1: Read Coils
5 2023-01-13 13:28:06,923741 0.573956 192.168.0.145 → 192.168.0.130 54638 Modbus/TCP 66 Response: Trans: 1; Unit: 21, Func: 1: Read Coils
6 2023-01-13 13:28:06,924002 0.574217 192.168.0.130 → 192.168.0.145 502 TCP 56 54638 → 502 [ACK] Seq=13 Ack=11 Win=64230 Len=0
7 2023-01-13 13:28:06,926139 0.576354 192.168.0.145 → 192.168.0.130 54638 TCP 62 502 → 54638 [FIN, ACK] Seq=11 Ack=13 Win=2132 Len=0
8 2023-01-13 13:28:06,974460 0.624675 192.168.0.130 → 192.168.0.145 502 TCP 56 54638 → 502 [ACK] Seq=13 Ack=12 Win=64229 Len=0
9 2023-01-13 13:28:16,406674 10.056889 192.168.0.130 → 192.168.0.145 502 Modbus/TCP 68 Query: Trans: 2; Unit: 21, Func: 1: Read Coils
10 2023-01-13 13:28:16,406975 10.057190 192.168.0.130 → 192.168.0.145 502 TCP 56 54638 → 502 [FIN, ACK] Seq=25 Ack=12 Win=64229 Len=0
11 2023-01-13 13:28:16,408396 10.058611 192.168.0.130 → 192.168.0.145 502 TCP 76 54640 → 502 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=1448660789 TSecr=0 WS=128
12 2023-01-13 13:28:16,441952 10.092167 192.168.0.145 → 192.168.0.130 54638 TCP 62 502 → 54638 [RST, ACK] Seq=12 Ack=25 Win=24584 Len=0
13 2023-01-13 13:28:16,442231 10.092446 192.168.0.145 → 192.168.0.130 54638 TCP 62 502 → 54638 [RST, ACK] Seq=12 Ack=26 Win=24584 Len=0
14 2023-01-13 13:28:16,442546 10.092761 192.168.0.145 → 192.168.0.130 54640 TCP 64 502 → 54640 [SYN, ACK] Seq=0 Ack=1 Win=2144 Len=0 MSS=536 SACK_PERM=1
15 2023-01-13 13:28:16,442672 10.092887 192.168.0.130 → 192.168.0.145 502 TCP 56 54640 → 502 [ACK] Seq=1 Ack=1 Win=64240 Len=0
16 2023-01-13 13:28:19,463886 13.114101 192.168.0.145 → 192.168.0.130 54640 TCP 62 502 → 54640 [FIN, ACK] Seq=1 Ack=1 Win=2144 Len=0
17 2023-01-13 13:28:19,464407 13.114622 192.168.0.130 → 192.168.0.145 502 TCP 56 54640 → 502 [ACK] Seq=1 Ack=2 Win=64239 Len=0
18 2023-01-13 13:28:21,372325 15.022540 192.168.0.130 → 192.168.0.145 502 TCP 56 54640 → 502 [FIN, ACK] Seq=1 Ack=2 Win=64239 Len=0
19 2023-01-13 13:28:21,458758 15.108973 192.168.0.145 → 192.168.0.130 54640 TCP 62 502 → 54640 [ACK] Seq=2 Ack=2 Win=2143 Len=0
, что ESP (.145) после подтверждения получения пакета 5 ответа (пакет 6) закрывает соединение - пакет 7. Система WB подтверждает закрытие соединения - пакет 8.
Однако, в следующую итерацию WB шлёт запрос в том же соединении(?), как будто не знает, что соединение закрыто, на что ESP даёт отлуп…
Потом я проснифал чуть больше итераций
modbus-tcp-4.pcap (2.7 КБ)
и там видно, что WB, похоже, всё так же ещё не знает про закрытое уже соединение, и продолжает запрашивать данные по закрытому уже соединению(?).
tshark -r ~/d/modbus-tcp-4.pcap
$ tshark -r ~/d/modbus-tcp-4.pcap
1 2023-01-13 13:49:53,779938 0.000000 192.168.0.130 → 192.168.0.145 502 TCP 76 54736 → 502 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=1449958161 TSecr=0 WS=128
2 2023-01-13 13:49:53,818000 0.038062 192.168.0.145 → 192.168.0.130 54736 TCP 64 502 → 54736 [SYN, ACK] Seq=0 Ack=1 Win=2144 Len=0 MSS=536 SACK_PERM=1
3 2023-01-13 13:49:53,818141 0.038203 192.168.0.130 → 192.168.0.145 502 TCP 56 54736 → 502 [ACK] Seq=1 Ack=1 Win=64240 Len=0
4 2023-01-13 13:49:54,318549 0.538611 192.168.0.130 → 192.168.0.145 502 Modbus/TCP 68 Query: Trans: 1; Unit: 21, Func: 1: Read Coils
5 2023-01-13 13:49:54,384428 0.604490 192.168.0.145 → 192.168.0.130 54736 Modbus/TCP 66 Response: Trans: 1; Unit: 21, Func: 1: Read Coils
6 2023-01-13 13:49:54,384640 0.604702 192.168.0.130 → 192.168.0.145 502 TCP 56 54736 → 502 [ACK] Seq=13 Ack=11 Win=64230 Len=0
7 2023-01-13 13:49:54,386818 0.606880 192.168.0.145 → 192.168.0.130 54736 TCP 62 502 → 54736 [FIN, ACK] Seq=11 Ack=13 Win=2132 Len=0
8 2023-01-13 13:49:54,434393 0.654455 192.168.0.130 → 192.168.0.145 502 TCP 56 54736 → 502 [ACK] Seq=13 Ack=12 Win=64229 Len=0
9 2023-01-13 13:50:03,818573 10.038635 192.168.0.130 → 192.168.0.145 502 Modbus/TCP 68 Query: Trans: 2; Unit: 21, Func: 1: Read Coils
10 2023-01-13 13:50:03,818872 10.038934 192.168.0.130 → 192.168.0.145 502 TCP 56 54736 → 502 [FIN, ACK] Seq=25 Ack=12 Win=64229 Len=0
11 2023-01-13 13:50:03,820477 10.040539 192.168.0.130 → 192.168.0.145 502 TCP 76 54738 → 502 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=1449968202 TSecr=0 WS=128
12 2023-01-13 13:50:03,902582 10.122644 192.168.0.145 → 192.168.0.130 54736 TCP 62 502 → 54736 [RST, ACK] Seq=12 Ack=25 Win=24584 Len=0
13 2023-01-13 13:50:03,902974 10.123036 192.168.0.145 → 192.168.0.130 54736 TCP 62 502 → 54736 [RST, ACK] Seq=12 Ack=26 Win=24584 Len=0
14 2023-01-13 13:50:03,903188 10.123250 192.168.0.145 → 192.168.0.130 54738 TCP 64 502 → 54738 [SYN, ACK] Seq=0 Ack=1 Win=2144 Len=0 MSS=536 SACK_PERM=1
15 2023-01-13 13:50:03,903368 10.123430 192.168.0.130 → 192.168.0.145 502 TCP 56 54738 → 502 [ACK] Seq=1 Ack=1 Win=64240 Len=0
16 2023-01-13 13:50:06,924409 13.144471 192.168.0.145 → 192.168.0.130 54738 TCP 62 502 → 54738 [FIN, ACK] Seq=1 Ack=1 Win=2144 Len=0
17 2023-01-13 13:50:06,934495 13.154557 192.168.0.130 → 192.168.0.145 502 TCP 56 54738 → 502 [ACK] Seq=1 Ack=2 Win=64239 Len=0
18 2023-01-13 13:50:13,818838 20.038900 192.168.0.130 → 192.168.0.145 502 Modbus/TCP 68 Query: Trans: 3; Unit: 21, Func: 1: Read Coils
19 2023-01-13 13:50:13,819263 20.039325 192.168.0.130 → 192.168.0.145 502 TCP 56 54738 → 502 [FIN, ACK] Seq=13 Ack=2 Win=64239 Len=0
20 2023-01-13 13:50:13,820202 20.040264 192.168.0.130 → 192.168.0.145 502 TCP 76 54740 → 502 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=1449978201 TSecr=0 WS=128
21 2023-01-13 13:50:13,835937 20.055999 192.168.0.145 → 192.168.0.130 54738 TCP 62 502 → 54738 [RST, ACK] Seq=2 Ack=13 Win=24584 Len=0
22 2023-01-13 13:50:13,836173 20.056235 192.168.0.145 → 192.168.0.130 54738 TCP 62 502 → 54738 [RST, ACK] Seq=2 Ack=14 Win=24584 Len=0
23 2023-01-13 13:50:13,836536 20.056598 192.168.0.145 → 192.168.0.130 54740 TCP 64 502 → 54740 [SYN, ACK] Seq=0 Ack=1 Win=2144 Len=0 MSS=536 SACK_PERM=1
24 2023-01-13 13:50:13,836707 20.056769 192.168.0.130 → 192.168.0.145 502 TCP 56 54740 → 502 [ACK] Seq=1 Ack=1 Win=64240 Len=0
25 2023-01-13 13:50:16,857101 23.077163 192.168.0.145 → 192.168.0.130 54740 TCP 62 502 → 54740 [FIN, ACK] Seq=1 Ack=1 Win=2144 Len=0
26 2023-01-13 13:50:16,864450 23.084512 192.168.0.130 → 192.168.0.145 502 TCP 56 54740 → 502 [ACK] Seq=1 Ack=2 Win=64239 Len=0
27 2023-01-13 13:50:23,818934 30.038996 192.168.0.130 → 192.168.0.145 502 Modbus/TCP 68 Query: Trans: 4; Unit: 21, Func: 1: Read Coils
28 2023-01-13 13:50:23,819314 30.039376 192.168.0.130 → 192.168.0.145 502 TCP 56 54740 → 502 [FIN, ACK] Seq=13 Ack=2 Win=64239 Len=0
29 2023-01-13 13:50:23,820084 30.040146 192.168.0.130 → 192.168.0.145 502 TCP 76 54744 → 502 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=1449988201 TSecr=0 WS=128
30 2023-01-13 13:50:23,822196 30.042258 192.168.0.145 → 192.168.0.130 54740 TCP 62 502 → 54740 [RST, ACK] Seq=2 Ack=13 Win=24584 Len=0
31 2023-01-13 13:50:23,822568 30.042630 192.168.0.145 → 192.168.0.130 54740 TCP 62 502 → 54740 [RST, ACK] Seq=2 Ack=14 Win=24584 Len=0
32 2023-01-13 13:50:23,823011 30.043073 192.168.0.145 → 192.168.0.130 54744 TCP 64 502 → 54744 [SYN, ACK] Seq=0 Ack=1 Win=2144 Len=0 MSS=536 SACK_PERM=1
33 2023-01-13 13:50:23,823244 30.043306 192.168.0.130 → 192.168.0.145 502 TCP 56 54744 → 502 [ACK] Seq=1 Ack=1 Win=64240 Len=0
34 2023-01-13 13:50:25,238081 31.458143 192.168.0.130 → 192.168.0.145 502 TCP 56 54744 → 502 [FIN, ACK] Seq=1 Ack=1 Win=64240 Len=0
35 2023-01-13 13:50:25,240291 31.460353 192.168.0.145 → 192.168.0.130 54744 TCP 62 502 → 54744 [RST, ACK] Seq=1 Ack=2 Win=24584 Len=0