Skip to content

Bugfix/fix slave does not gracefully close sockets - #162

Open
alisitsyn wants to merge 2 commits into
mainfrom
bugfix/fix_slave_error_disconnected_node
Open

Bugfix/fix slave does not gracefully close sockets#162
alisitsyn wants to merge 2 commits into
mainfrom
bugfix/fix_slave_error_disconnected_node

Conversation

@alisitsyn

@alisitsyn alisitsyn commented Mar 13, 2026

Copy link
Copy Markdown
Collaborator

Description

This PR fixes the issue when the TCP master connects to the slave, sends the data, disconnects then repeat this cycle. The TCP slave is not able to process the disconnection event correctly and does not gracefully close sockets (when master send FIN packet to slave).

Related

#161 (EPROT-55)
#138 (EPROT-4)
#140 (EPROT-5)

Test results

The TCP slave updated and is able to close connection from master immediately when receive the FIN packet. All other possible errors are processed with timeout to allow the master to repair connection.
It is possible to communicate with slave using the TCP master which uses connect - send request - disconnect flow.
The communication reliability is increased significantly due to improvements in event handlers. The race conditions are possible in case of incorrect response time configuration. The users need to respect the response time option and need to calculate this properly for their multi-master environment.

Communication log with four modbus tcp masters connected to one esp_tcp_modbus_slave over wifi. Masters set with response time = 1000ms (causes the race condition after some time), then changed to 1300ms. Each master reads four types of registers. Max calculated response time for request = 38ms.

wifi_4_tcp_masters_to_tcp_slave_resp_time=1000_then_1300_conn_disconn.log

Checklist

Before submitting a Pull Request, please ensure the following:

  • 🚨 This PR does not introduce breaking changes.
  • All CI checks (GH Actions) pass.
  • Documentation is updated as needed.
  • Tests are updated or added as necessary.
  • Code is well-commented, especially in complex areas.
  • Git history is clean — commits are squashed to the minimum necessary.

@alisitsyn alisitsyn changed the title Bugfix/fix slave error disconnected node Bugfix/fix slave does not gracefully close sockets Mar 13, 2026
@alisitsyn alisitsyn self-assigned this Mar 13, 2026
@MD-Richards

Copy link
Copy Markdown

Hello,
I believe I'm having a problem related to this issue. I have merged the 7 files into my project, it did not solve the problem.
I have 2 Modbus TCP clients. Once client seems to be held up waiting for the other. If I disconnect one client, the other hangs. Here is the output of the serial monitor, I placed inline comments to narrate what is happening....
`Startup.......

rst:0x1 (POWERON_RESET),boot:0x12 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0030,len:6280
load:0x40078000,len:15864
load:0x40080400,len:3920
entry 0x4008063c
I (27) boot: ESP-IDF 5.5.3 2nd stage bootloader
I (27) boot: compile time Mar 23 2026 15:00:41
I (28) boot: Multicore bootloader
I (29) boot: chip revision: v3.1
I (31) boot.esp32: SPI Speed : 40MHz
I (35) boot.esp32: SPI Mode : DIO
I (39) boot.esp32: SPI Flash Size : 4MB
I (42) boot: Enabling RNG early entropy source...
I (47) boot: Partition Table:
I (49) boot: ## Label Usage Type ST Offset Length
I (56) boot: 0 nvs WiFi data 01 02 00009000 00006000
I (62) boot: 1 phy_init RF data 01 01 0000f000 00001000
I (69) boot: 2 factory factory app 00 00 00010000 00100000
I (75) boot: End of partition table
I (79) esp_image: segment 0: paddr=00010020 vaddr=3f400020 size=19dc4h (105924) map
I (122) esp_image: segment 1: paddr=00029dec vaddr=3ffb0000 size=02ce0h ( 11488) load
I (127) esp_image: segment 2: paddr=0002cad4 vaddr=40080000 size=03544h ( 13636) load
I (132) esp_image: segment 3: paddr=00030020 vaddr=400d0020 size=4a984h (305540) map
I (238) esp_image: segment 4: paddr=0007a9ac vaddr=40083544 size=0be8ch ( 48780) load
I (257) esp_image: segment 5: paddr=00086840 vaddr=50000000 size=00020h ( 32) load
I (265) boot: Loaded app from partition at offset 0x10000
I (265) boot: Disabling RNG early entropy source...
I (278) cpu_start: Multicore app
I (286) cpu_start: GPIO 3 and 1 are used as console UART I/O pins
I (286) cpu_start: Pro cpu start user code
I (286) cpu_start: cpu freq: 160000000 Hz
I (288) app_init: Application information:
I (292) app_init: Project name: modbus_tcp_slave
I (297) app_init: App version: 1
I (300) app_init: Compile time: Mar 23 2026 15:00:06
I (305) app_init: ELF file SHA256: 4e2e26b5d...
I (309) app_init: ESP-IDF: 5.5.3
I (313) efuse_init: Min chip rev: v0.0
I (317) efuse_init: Max chip rev: v3.99
I (321) efuse_init: Chip rev: v3.1
I (325) heap_init: Initializing. RAM available for dynamic allocation:
I (331) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
I (336) heap_init: At 3FFB4ED8 len 0002B128 (172 KiB): DRAM
I (341) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
I (347) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (352) heap_init: At 4008F3D0 len 00010C30 (67 KiB): IRAM
I (359) spi_flash: detected chip: generic
I (361) spi_flash: flash io: dio
I (365) main_task: Started on CPU0
I (375) main_task: Calling app_main()
I (465) esp_eth.netif.netif_glue: d4:8c:49:a6:af:23
I (465) esp_eth.netif.netif_glue: ethernet attached to netif
I (2565) ethernet_connect: Waiting for IP(s).
I (3565) esp_netif_handlers: example_netif_eth ip: 192.168.1.220, mask: 255.255.255.0, gw: 192.168.1.1
I (3565) ethernet_connect: Got IPv4 event: Interface "example_netif_eth" address: 192.168.1.220
I (3565) example_common: Connected to example_netif_eth
I (3575) example_common: - IPv4 address: 192.168.1.220,
I (3795) mdns_mem: mDNS task will be created from internal RAM
I (3795) port.utils: hostname set to: [mb_slave_tcp_a6af23]
I (3795) port.utils: mdns delegate hostname set to: [mb_slave_tcp_01]
I (3795) port.utils: IP: 192.168.1.220
I (3805) port.utils: GW: 192.168.1.1
I (3805) port.utils: NETMASK: 255.255.255.0
D (3815) mb_object.slave: created object mbs_tcp@0x3ffbe404
I (3815) port.utils: Socket (#54), listener on port: 1502, errno=0
I (3825) mb_port.tcp.slave: loop:0x3ffbfe88 mbs_on_ready: fd: -1, bind is done
D (3825) mb_object.slave: 0x3ffbe404:EV_READY
D (3835) mb_object.slave: 0x3ffbe404:EV_READY
I (3835) MB_TCP_SLAVE: Slave TCP started (app_main)
I (3845) MB_TCP_SLAVE: Slave TCP is started
I (3845) MB_TCP_SLAVE: Start Modbus server...

HMI connects here (192.168.1.86 polling 2 input registers at approx. 1,000ms...)

I (4235) port.utils: Socket (#55), accept client connection from address[port]: 192.168.1.86[52071]
D (4825) mb_object.slave: 0x3ffbe404:EV_READY
D (5245) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (5245) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (5245) mb_object.slave: 0x3ffbe404: function (0x4), invoke handler 0x400d59e0.
D (5245) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (5255) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (5255) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (5265) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 15999
I (5265) MB_TCP_SLAVE: INPUT READ: offset=0 type=8 size=2
D (6315) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (6315) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (6315) mb_object.slave: 0x3ffbe404: function (0x4), invoke handler 0x400d59e0.
D (6325) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (6325) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (6335) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (6335) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 16050
I (6345) MB_TCP_SLAVE: INPUT READ: offset=0 type=8 size=2
D (7355) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (7355) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (7355) mb_object.slave: 0x3ffbe404: function (0x4), invoke handler 0x400d59e0.
D (7365) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (7365) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (7375) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (7375) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 16027
I (7385) MB_TCP_SLAVE: INPUT READ: offset=0 type=8 size=2
D (8425) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (8425) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (8425) mb_object.slave: 0x3ffbe404: function (0x4), invoke handler 0x400d59e0.
D (8435) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (8435) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (8435) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (8445) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 15959
I (8445) MB_TCP_SLAVE: INPUT READ: offset=0 type=8 size=2
D (9455) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (9455) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (9455) mb_object.slave: 0x3ffbe404: function (0x4), invoke handler 0x400d59e0.
D (9465) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (9465) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (9475) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (9475) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 16007
I (9485) MB_TCP_SLAVE: INPUT READ: offset=0 type=8 size=2

2nd client connects here (PC 192.168.1.120 running Mosbus Poll software - polling 2 holding registers at approx. 80ms)
Note that we now have alternating HOLDING READS and INPUT READS (more HOLDING READS based on the different polling rate).
At this point, the client reading the HOLDING registers experiences regular timeouts, presumably waiting for the other slower client to read.

I (10215) port.utils: Socket (#56), accept client connection from address[port]: 192.168.1.120[59633]
D (10265) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (10265) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (10265) mb_object.slave: 0x3ffbe404: function (0x3), invoke handler 0x400d5874.
D (10275) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (10275) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (10285) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (10285) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 16374
I (10295) MB_TCP_SLAVE: HOLDING READ: offset=4 type=2 size=2
D (10365) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (10365) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (10365) mb_object.slave: 0x3ffbe404: function (0x3), invoke handler 0x400d5874.
D (10375) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (10375) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (10385) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (10385) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 16394
I (10395) MB_TCP_SLAVE: HOLDING READ: offset=4 type=2 size=2
D (10465) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (10465) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (10465) mb_object.slave: 0x3ffbe404: function (0x3), invoke handler 0x400d5874.
D (10475) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (10475) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (10485) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (10485) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 16330
I (10495) MB_TCP_SLAVE: HOLDING READ: offset=4 type=2 size=2
D (10565) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (10565) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (10565) mb_object.slave: 0x3ffbe404: function (0x4), invoke handler 0x400d59e0.
D (10575) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (10575) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (10585) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (10585) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 16378
I (10595) MB_TCP_SLAVE: INPUT READ: offset=0 type=8 size=2
D (11515) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (11515) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (11515) mb_object.slave: 0x3ffbe404: function (0x3), invoke handler 0x400d5874.
W (11525) mb_port.tcp.slave: 0x3ffbfe88, node #1, socket(#56)(192.168.1.120), handling time [ms]: 957, exceeds slave response time in master.
D (11535) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (11535) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (11545) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (11545) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 28763
I (11555) MB_TCP_SLAVE: HOLDING READ: offset=4 type=2 size=2
D (11615) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (11615) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (11615) mb_object.slave: 0x3ffbe404: function (0x3), invoke handler 0x400d5874.
D (11625) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (11625) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (11635) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (11635) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 16387
I (11645) MB_TCP_SLAVE: HOLDING READ: offset=4 type=2 size=2
D (11715) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (11715) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (11715) mb_object.slave: 0x3ffbe404: function (0x4), invoke handler 0x400d59e0.
D (11725) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (11725) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (11735) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (11735) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 16326
I (11745) MB_TCP_SLAVE: INPUT READ: offset=0 type=8 size=2
D (12665) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (12665) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (12665) mb_object.slave: 0x3ffbe404: function (0x3), invoke handler 0x400d5874.
W (12675) mb_port.tcp.slave: 0x3ffbfe88, node #1, socket(#56)(192.168.1.120), handling time [ms]: 957, exceeds slave response time in master.
D (12685) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (12685) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (12695) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (12695) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 28772
I (12705) MB_TCP_SLAVE: HOLDING READ: offset=4 type=2 size=2
D (12775) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (12775) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (12775) mb_object.slave: 0x3ffbe404: function (0x3), invoke handler 0x400d5874.
D (12785) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (12785) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (12795) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (12795) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 16398
I (12805) MB_TCP_SLAVE: HOLDING READ: offset=4 type=2 size=2
D (12875) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (12875) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (12875) mb_object.slave: 0x3ffbe404: function (0x4), invoke handler 0x400d59e0.
D (12885) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (12885) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (12895) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (12895) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 16315
I (12905) MB_TCP_SLAVE: INPUT READ: offset=0 type=8 size=2
D (13825) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (13825) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (13825) mb_object.slave: 0x3ffbe404: function (0x3), invoke handler 0x400d5874.
W (13825) mb_port.tcp.slave: 0x3ffbfe88, node #1, socket(#56)(192.168.1.120), handling time [ms]: 953, exceeds slave response time in master.
D (13835) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (13845) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (13845) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (13855) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 28772
I (13865) MB_TCP_SLAVE: HOLDING READ: offset=4 type=2 size=2
D (13925) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (13925) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (13925) mb_object.slave: 0x3ffbe404: function (0x3), invoke handler 0x400d5874.
D (13935) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (13935) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (13945) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (13945) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 16445
I (13955) MB_TCP_SLAVE: HOLDING READ: offset=4 type=2 size=2
D (14025) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (14025) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (14025) mb_object.slave: 0x3ffbe404: function (0x4), invoke handler 0x400d59e0.
D (14035) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (14035) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (14045) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (14045) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 16335
I (14055) MB_TCP_SLAVE: INPUT READ: offset=0 type=8 size=2
D (14975) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (14975) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (14975) mb_object.slave: 0x3ffbe404: function (0x3), invoke handler 0x400d5874.
W (14975) mb_port.tcp.slave: 0x3ffbfe88, node #1, socket(#56)(192.168.1.120), handling time [ms]: 954, exceeds slave response time in master.
D (14985) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (14995) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (15005) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (15005) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 28791
I (15015) MB_TCP_SLAVE: HOLDING READ: offset=4 type=2 size=2
D (15075) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (15075) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (15075) mb_object.slave: 0x3ffbe404: function (0x3), invoke handler 0x400d5874.
D (15085) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (15085) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (15095) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (15095) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 16972
I (15105) MB_TCP_SLAVE: HOLDING READ: offset=4 type=2 size=2
D (15175) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (15175) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (15175) mb_object.slave: 0x3ffbe404: function (0x4), invoke handler 0x400d59e0.
D (15185) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (15185) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (15195) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (15195) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 16307
I (15205) MB_TCP_SLAVE: INPUT READ: offset=0 type=8 size=2
D (16125) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (16125) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (16125) mb_object.slave: 0x3ffbe404: function (0x3), invoke handler 0x400d5874.
W (16125) mb_port.tcp.slave: 0x3ffbfe88, node #1, socket(#56)(192.168.1.120), handling time [ms]: 955, exceeds slave response time in master.
D (16145) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (16145) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (16155) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (16155) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 28759
I (16165) MB_TCP_SLAVE: HOLDING READ: offset=4 type=2 size=2
D (16225) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (16225) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (16225) mb_object.slave: 0x3ffbe404: function (0x3), invoke handler 0x400d5874.
D (16235) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (16235) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (16245) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (16245) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 16406
I (16255) MB_TCP_SLAVE: HOLDING READ: offset=4 type=2 size=2
D (16325) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (16325) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (16325) mb_object.slave: 0x3ffbe404: function (0x4), invoke handler 0x400d59e0.
D (16335) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (16335) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (16345) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (16345) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 16311
I (16355) MB_TCP_SLAVE: INPUT READ: offset=0 type=8 size=2
D (17275) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (17275) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (17275) mb_object.slave: 0x3ffbe404: function (0x3), invoke handler 0x400d5874.
W (17275) mb_port.tcp.slave: 0x3ffbfe88, node #1, socket(#56)(192.168.1.120), handling time [ms]: 956, exceeds slave response time in master.
D (17295) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (17295) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (17305) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (17305) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 28771
I (17315) MB_TCP_SLAVE: HOLDING READ: offset=4 type=2 size=2
D (17395) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (17395) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (17395) mb_object.slave: 0x3ffbe404: function (0x3), invoke handler 0x400d5874.
D (17405) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (17405) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (17415) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (17415) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 16390
I (17425) MB_TCP_SLAVE: HOLDING READ: offset=4 type=2 size=2
D (17495) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (17495) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (17495) mb_object.slave: 0x3ffbe404: function (0x4), invoke handler 0x400d59e0.
D (17505) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (17505) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (17515) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (17515) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 16331
I (17525) MB_TCP_SLAVE: INPUT READ: offset=0 type=8 size=2
D (18445) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (18445) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (18445) mb_object.slave: 0x3ffbe404: function (0x3), invoke handler 0x400d5874.
W (18455) mb_port.tcp.slave: 0x3ffbfe88, node #1, socket(#56)(192.168.1.120), handling time [ms]: 957, exceeds slave response time in master.
D (18465) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (18465) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (18475) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (18475) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 28815
I (18485) MB_TCP_SLAVE: HOLDING READ: offset=4 type=2 size=2
D (18545) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (18545) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (18545) mb_object.slave: 0x3ffbe404: function (0x3), invoke handler 0x400d5874.
D (18555) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (18555) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (18565) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (18565) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 16394
I (18575) MB_TCP_SLAVE: HOLDING READ: offset=4 type=2 size=2
D (18645) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (18645) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (18645) mb_object.slave: 0x3ffbe404: function (0x4), invoke handler 0x400d59e0.
D (18655) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (18655) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (18665) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (18665) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 16323
I (18675) MB_TCP_SLAVE: INPUT READ: offset=0 type=8 size=2
D (19745) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (19745) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (19745) mb_object.slave: 0x3ffbe404: function (0x3), invoke handler 0x400d5874.
D (19755) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (19755) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (19765) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (19765) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 16370
I (19775) MB_TCP_SLAVE: HOLDING READ: offset=4 type=2 size=2

2nd client disconnect here (PC 192.168.1.120)
from here on, there are only INPUT READS in the output, but this is wrong, as the 1st HMI client still online is requesting HOLDING READS.
1st client is now stuck in permanent response timeout and no longer is able to make any sucsessful reads.

E (20145) mb_port.tcp.slave: 0x3ffbfc44, node #1, socket(#56)(192.168.1.120), communication fail, err= -11
I (20715) port.utils: Socket (#56), accept client connection from address[port]: 192.168.1.86[52083]
D (22715) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (22715) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (22715) mb_object.slave: 0x3ffbe404: function (0x4), invoke handler 0x400d59e0.
D (22725) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (22725) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (22735) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (22735) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 16390
I (22745) MB_TCP_SLAVE: INPUT READ: offset=0 type=8 size=2
E (22965) mb_port.tcp.slave: 0x3ffbfc44, node #0, socket(#55)(192.168.1.86), communication fail, err= -11
I (23705) port.utils: Socket (#55), accept client connection from address[port]: 192.168.1.86[52086]
D (25705) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (25705) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (25705) mb_object.slave: 0x3ffbe404: function (0x4), invoke handler 0x400d59e0.
D (25715) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (25715) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (25725) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (25725) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 16608
I (25735) MB_TCP_SLAVE: INPUT READ: offset=0 type=8 size=2
E (25955) mb_port.tcp.slave: 0x3ffbfc44, node #1, socket(#56)(192.168.1.86), communication fail, err= -11
I (26705) port.utils: Socket (#56), accept client connection from address[port]: 192.168.1.86[52088]
D (28705) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (28705) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (28705) mb_object.slave: 0x3ffbe404: function (0x4), invoke handler 0x400d59e0.
D (28715) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (28715) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (28725) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (28725) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 16422
I (28735) MB_TCP_SLAVE: INPUT READ: offset=0 type=8 size=2
E (28955) mb_port.tcp.slave: 0x3ffbfc44, node #0, socket(#55)(192.168.1.86), communication fail, err= -11
I (29705) port.utils: Socket (#55), accept client connection from address[port]: 192.168.1.86[52091]
D (31735) mb_object.slave: 0x3ffbe404: Unexpected event 0x40 or timeout?
D (31755) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (31755) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (31755) mb_object.slave: 0x3ffbe404: function (0x4), invoke handler 0x400d59e0.
D (31765) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (31765) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (31775) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (31775) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 16291

I (2100715) MB_TCP_SLAVE: INPUT READ: offset=0 type=8 size=2
E (2100935) mb_port.tcp.slave: 0x3ffbfc44, node #1, socket(#56)(192.168.1.86), communication fail, err= -11
I (2101685) port.utils: Socket (#56), accept client connection from address[port]: 192.168.1.86[53932]
D (2103685) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (2103685) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (2103685) mb_object.slave: 0x3ffbe404: function (0x4), invoke handler 0x400d59e0.
D (2103695) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (2103695) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (2103705) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (2103705) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 17277
I (2103715) MB_TCP_SLAVE: INPUT READ: offset=0 type=8 size=2
E (2103935) mb_port.tcp.slave: 0x3ffbfc44, node #0, socket(#55)(192.168.1.86), communication fail, err= -11
I (2104685) port.utils: Socket (#55), accept client connection from address[port]: 192.168.1.86[53935]
I (2105485) port.utils: Socket (#57), accept client connection from address[port]: 192.168.1.120[61943]
D (2105535) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (2105535) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (2105535) mb_object.slave: 0x3ffbe404: function (0x4), invoke handler 0x400d59e0.
D (2105545) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (2105545) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (2105555) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (2105555) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 17209
I (2105565) MB_TCP_SLAVE: INPUT READ: offset=0 type=8 size=2
E (2105835) mb_port.tcp.slave: 0x3ffbfc44, node #1, socket(#56)(192.168.1.86), communication fail, err= -11
D (2106505) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (2106505) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (2106505) mb_object.slave: 0x3ffbe404: function (0x3), invoke handler 0x400d5874.

Reconnected 2nd client at 192.168.1.120 here.....
1st client comes back on line and every thing returns to normal, except still getting the regular timeouts from the second client.

W (2106505) mb_port.tcp.slave: 0x3ffbfe88, node #2, socket(#57)(192.168.1.120), handling time [ms]: 974, exceeds slave response time in master.
D (2106525) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (2106525) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (2106535) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (2106535) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 29839
I (2106545) MB_TCP_SLAVE: HOLDING READ: offset=4 type=2 size=2
D (2106685) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (2106685) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (2106685) mb_object.slave: 0x3ffbe404: function (0x3), invoke handler 0x400d5874.
D (2106695) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (2106695) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (2106705) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (2106705) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 17265
I (2106715) MB_TCP_SLAVE: HOLDING READ: offset=4 type=2 size=2
D (2106785) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (2106785) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (2106785) mb_object.slave: 0x3ffbe404: function (0x4), invoke handler 0x400d59e0.
D (2106795) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (2106795) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (2106805) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (2106805) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 17225
I (2106815) MB_TCP_SLAVE: INPUT READ: offset=0 type=8 size=2
D (2107745) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (2107745) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (2107745) mb_object.slave: 0x3ffbe404: function (0x3), invoke handler 0x400d5874.
W (2107755) mb_port.tcp.slave: 0x3ffbfe88, node #2, socket(#57)(192.168.1.120), handling time [ms]: 967, exceeds slave response time in master.
D (2107765) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (2107765) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (2107775) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (2107775) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 29816
I (2107785) MB_TCP_SLAVE: HOLDING READ: offset=4 type=2 size=2
D (2107845) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (2107845) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (2107845) mb_object.slave: 0x3ffbe404: function (0x3), invoke handler 0x400d5874.
D (2107855) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (2107855) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (2107865) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (2107865) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 18245
I (2107875) MB_TCP_SLAVE: HOLDING READ: offset=4 type=2 size=2
D (2107945) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (2107945) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (2107945) mb_object.slave: 0x3ffbe404: function (0x4), invoke handler 0x400d59e0.
D (2107955) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (2107955) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (2107965) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (2107965) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 17189
I (2107975) MB_TCP_SLAVE: INPUT READ: offset=0 type=8 size=2
D (2108895) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (2108895) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (2108895) mb_object.slave: 0x3ffbe404: function (0x3), invoke handler 0x400d5874.
W (2108905) mb_port.tcp.slave: 0x3ffbfe88, node #2, socket(#57)(192.168.1.120), handling time [ms]: 957, exceeds slave response time in master.
D (2108915) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (2108915) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (2108925) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (2108925) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 29819
I (2108935) MB_TCP_SLAVE: HOLDING READ: offset=4 type=2 size=2
D (2109005) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (2109005) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (2109005) mb_object.slave: 0x3ffbe404: function (0x3), invoke handler 0x400d5874.
D (2109015) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (2109025) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (2109025) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (2109035) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 18412
I (2109035) MB_TCP_SLAVE: HOLDING READ: offset=4 type=2 size=2
D (2109105) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (2109105) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (2109105) mb_object.slave: 0x3ffbe404: function (0x4), invoke handler 0x400d59e0.
D (2109115) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (2109115) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (2109125) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (2109125) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 17229
I (2109135) MB_TCP_SLAVE: INPUT READ: offset=0 type=8 size=2
D (2110045) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (2110045) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (2110045) mb_object.slave: 0x3ffbe404: function (0x3), invoke handler 0x400d5874.
W (2110055) mb_port.tcp.slave: 0x3ffbfe88, node #2, socket(#57)(192.168.1.120), handling time [ms]: 950, exceeds slave response time in master.
D (2110065) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (2110075) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (2110075) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (2110085) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 29828
I (2110085) MB_TCP_SLAVE: HOLDING READ: offset=4 type=2 size=2
D (2110155) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (2110155) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (2110155) mb_object.slave: 0x3ffbe404: function (0x3), invoke handler 0x400d5874.
D (2110165) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (2110175) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (2110175) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (2110185) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 17269
I (2110185) MB_TCP_SLAVE: HOLDING READ: offset=4 type=2 size=2
D (2110255) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (2110255) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (2110255) mb_object.slave: 0x3ffbe404: function (0x4), invoke handler 0x400d59e0.
D (2110265) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (2110265) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (2110275) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (2110275) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 17225
I (2110285) MB_TCP_SLAVE: INPUT READ: offset=0 type=8 size=2
D (2111215) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (2111215) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (2111215) mb_object.slave: 0x3ffbe404: function (0x3), invoke handler 0x400d5874.
W (2111225) mb_port.tcp.slave: 0x3ffbfe88, node #2, socket(#57)(192.168.1.120), handling time [ms]: 971, exceeds slave response time in master.
D (2111235) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (2111245) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (2111245) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (2111255) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 29824
I (2111255) MB_TCP_SLAVE: HOLDING READ: offset=4 type=2 size=2
D (2111315) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (2111325) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (2111325) mb_object.slave: 0x3ffbe404: function (0x3), invoke handler 0x400d5874.
D (2111325) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (2111335) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (2111335) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (2111345) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 17269
I (2111345) MB_TCP_SLAVE: HOLDING READ: offset=4 type=2 size=2
D (2111415) mb_object.slave: 0x3ffbe404:EV_FRAME_RECEIVED
D (2111415) mb_object.slave: 0x3ffbe404:EV_EXECUTE
D (2111415) mb_object.slave: 0x3ffbe404: function (0x4), invoke handler 0x400d59e0.
D (2111425) mb_object.slave: 0x3ffbe404:EV_MASTER_FRAME_SENT
D (2111425) mb_object.slave: 0x3ffbe404, set event EV_ERROR_OK
D (2111435) mb_object.slave: 0x3ffbe404:EV_ERROR_PROCESS
D (2111435) mb_object.slave: 0x3ffbe404, transaction processing time(us) = 17190
`

Thank you.

@alisitsyn

Copy link
Copy Markdown
Collaborator Author

Hello, @MD-Richards,

Thank you for report. Your logs will help to fix the issue. This fix is simple but applies to many scenarios and should be tested adequately. I remember I saw this already during first testing. I see that the race condition happens on slave after disconnection. Unfortunately, I can not return to this immediately but I will do this ASAP.

@jnlee4838

Copy link
Copy Markdown

I have same phenomenon. please visit my repo. https://github.com/jnlee4838/ss_modbus_tcp_sht4x. if you look at the WireShark capture, it (ESP32 Modbus Slave) transmits "ACK" back to Master about "FIN". it should have transmitted "FIN" to Master back immediately and waited for the final ACK from Master for graceful disconnect. instead, it starts to transmit "KEEPALIVE"...Finally "RST" signal like "E (xxxxx) mb_port.tcp.slave: 0x3ffbfc44, node #0, socket(#55)(192.168.0.2), communication fail, err= -11"

@alisitsyn

Copy link
Copy Markdown
Collaborator Author

@jnlee4838,

Thanks for your report and log. I can reproduce this and it looks strange. I will continue with investigation of this issue but am pretty busy. I will inform you once the solution is found.

@alisitsyn
alisitsyn force-pushed the bugfix/fix_slave_error_disconnected_node branch from c5f69fa to f96b106 Compare April 2, 2026 14:28
@alisitsyn

Copy link
Copy Markdown
Collaborator Author

@jnlee4838,

I think the issue is fixed. PTAL to updated fix in the branch and help to test on your side. Thanks.

@ram-bt

ram-bt commented Apr 16, 2026

Copy link
Copy Markdown

I have 2 devices polling the slave every 5 seconds:

  1. Open ModScan polling for discrete register 0,1
image
  1. MB TCP Master polling for discrete register 0,1
static mb_parameter_descriptor_t device_params[] = {
    {.cid = 0,
     .param_key = "DI_0_1",
     .param_units = "--",
     .mb_slave_addr = 1,
     .mb_param_type = MB_PARAM_DISCRETE,
     .mb_reg_start = 0,
     .mb_size = 2,
     .param_offset = 0,
     .param_type = PARAM_TYPE_U8,
     .param_size = sizeof(uint8_t),
     .param_opts = {.opt1 = 0, .opt2 = 0, .opt3 = 0},
     .access = PAR_PERMS_READ_TRIGGER}};

After missing to respond to the 1st device the slave enters a cycle of W (32323574) mb_port.tcp.slave: 0x3ffbc2c8, node #0, socket(#58)(192.168.4.187), handling time [ms]: 5096, exceeds slave response time in master. and unless a reconnect is performed the slave doesn't server data to any device polling it.

W (32323574) mb_port.tcp.slave: 0x3ffbc2c8, node #0, socket(#58)(192.168.4.187), handling time [ms]: 5096, exceeds slave response time in master.
W (32325444) mb_port.tcp.slave: 0x3ffbc2c8, node #1, socket(#59)(192.168.4.157), handling time [ms]: 5102, exceeds slave response time in master.
W (32328574) mb_port.tcp.slave: 0x3ffbc2c8, node #0, socket(#58)(192.168.4.187), handling time [ms]: 5095, exceeds slave response time in master.
W (32330444) mb_port.tcp.slave: 0x3ffbc2c8, node #1, socket(#59)(192.168.4.157), handling time [ms]: 5098, exceeds slave response time in master.
W (32333574) mb_port.tcp.slave: 0x3ffbc2c8, node #0, socket(#58)(192.168.4.187), handling time [ms]: 5096, exceeds slave response time in master.
W (32335454) mb_port.tcp.slave: 0x3ffbc2c8, node #1, socket(#59)(192.168.4.157), handling time [ms]: 5110, exceeds slave response time in master.

I'm using the esp-modbus component from bugfix/fix_slave_error_disconnected_node latest commit https://github.com/espressif/esp-modbus/commit/ca8027a228b8cfd0f6632134bbc817e4ec2a3c3f

@alisitsyn

Copy link
Copy Markdown
Collaborator Author

@ram-bt ,

Please try to not exceed the value of CONFIG_FMB_MASTER_TIMEOUT_MS_RESPOND=3000 or change the below value in the local component folder
esp-modbus/modbus/mb_controller/common/mbc_master.h
#define MB_MAX_RESP_DELAY_MS (15000)

Try again and this would make the issue more clear.

@ram-bt

ram-bt commented Apr 16, 2026

Copy link
Copy Markdown

Please try to not exceed the value of CONFIG_FMB_MASTER_TIMEOUT_MS_RESPOND=3000 or change the below value in the local component folder esp-modbus/modbus/mb_controller/common/mbc_master.h #define MB_MAX_RESP_DELAY_MS (15000)

Alex when you mention the CONFIG_FMB_MASTER_TIMEOUT_MS_RESPOND do you mean the scan rate of the master?

Let me make the changes and get back to you.

Thank you.

@alisitsyn

alisitsyn commented May 12, 2026

Copy link
Copy Markdown
Collaborator Author

ram-bt,

Alex when you mention the CONFIG_FMB_MASTER_TIMEOUT_MS_RESPOND do you mean the scan rate of the master?

The CONFIG_FMB_MASTER_TIMEOUT_MS_RESPOND parameter characterizes the time during which the master waits for slave response, if the response does not come during this time the master sends next request. If the CONFIG_FMB_MASTER_TIMEOUT_MS_RESPOND decreased the scan rate is increased. However, there is no set scan rate for Modbus, it depends on the number of devices connected to the link, the baud rate of the link, and the amount of data each device is asked for. If you know all of this data for a system, you can calculate the max polling rate possible. In many systems the quantity of data changes regularly, and some devices may be polled 2 or 3 times (retries) before a different node is polled again if one is of higher priority to keep data to.

@alisitsyn
alisitsyn force-pushed the bugfix/fix_slave_error_disconnected_node branch from ca8027a to c165252 Compare May 13, 2026 12:09
@ram-bt

ram-bt commented May 18, 2026

Copy link
Copy Markdown

Please try to not exceed the value of CONFIG_FMB_MASTER_TIMEOUT_MS_RESPOND=3000

Alex when you say not to exceed the value of 3S (i have set the response timeout for slave as 3S) Does this mean that i should be respecting the same on the master side right?

@alisitsyn

alisitsyn commented May 19, 2026

Copy link
Copy Markdown
Collaborator Author

@ram-bt ,

Alex when you say not to exceed the value of 3S (i have set the response timeout for slave as 3S) Does this mean that i should be respecting the same on the master side right?

The requirement not to exceed the value of 3S in CONFIG_FMB_MASTER_TIMEOUT_MS_RESPOND applies to master tcp example. It is better to set this time less than 3 sec ~= 2500 ms. With external tcp master should not be an issue but try to use the same time on Modscan side for now.

Example connection settings of ModbusPoll (on my side):
image

I will try to reproduce your issues with Modscan as well a bit later. Could you also try the ModbusPoll and check if the issue remaining?

@ram-bt

ram-bt commented May 19, 2026

Copy link
Copy Markdown

Understood Alex. Let me make the changes and get back to you

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants