Skip to content

Commit 0ce5417

Browse files
authored
fix: Retry on timeout (#4)
1 parent d97985c commit 0ce5417

File tree

3 files changed

+7
-35
lines changed

3 files changed

+7
-35
lines changed

examples/example.py

+1-6
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,7 @@
33
from aiosocks import Socks5Addr
44

55
from tcp_modbus_aio.client import TCPModbusClient
6-
from tcp_modbus_aio.exceptions import (
7-
ModbusCommunicationFailureError,
8-
ModbusCommunicationTimeoutError,
9-
)
6+
from tcp_modbus_aio.exceptions import ModbusCommunicationFailureError
107
from tcp_modbus_aio.typed_functions import ReadCoils
118

129
DIGITAL_IN_COILS = list(range(8))
@@ -32,8 +29,6 @@ async def example() -> None:
3229
)
3330
assert response is not None, "we expect a response from ReadCoils"
3431
print(response.data) # noqa: T201
35-
except ModbusCommunicationTimeoutError as e:
36-
print(f"{type(e).__name__}({e})")
3732
except ModbusCommunicationFailureError as e:
3833
print(f"{type(e).__name__}({e})")
3934

tcp_modbus_aio/client.py

+4-21
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
from tcp_modbus_aio.exceptions import (
1515
ModbusCommunicationFailureError,
16-
ModbusCommunicationTimeoutError,
16+
ModbusConcurrencyError,
1717
ModbusNotConnectedError,
1818
)
1919
from tcp_modbus_aio.ping import ping_ip
@@ -57,7 +57,6 @@ class TCPModbusClient:
5757
KEEPALIVE_MAX_FAILS: ClassVar = 5
5858

5959
PING_LOOP_PERIOD: ClassVar = 1
60-
CONSECUTIVE_TIMEOUTS_TO_RECONNECT: ClassVar = 5
6160
COOLDOWN_BEFORE_RECONNECTING_SEC: ClassVar = 0.01
6261

6362
def __init__(
@@ -90,9 +89,6 @@ def __init__(
9089
self._reader: asyncio.StreamReader | None = None
9190
self._writer: asyncio.StreamWriter | None = None
9291

93-
# Number of current consecutive modbus calls that resulted in a timeout
94-
self._consecutive_timeouts = 0
95-
9692
# Last ping time in seconds from ping loop, or None if the last ping failed
9793
self._last_ping: float | None = None
9894

@@ -192,7 +188,7 @@ async def _get_tcp_connection(
192188
)
193189
if self.logger is not None:
194190
self.logger.warning(f"[{self}][_get_tcp_connection] {msg}")
195-
raise ModbusCommunicationTimeoutError(msg)
191+
raise ModbusCommunicationFailureError(msg)
196192
except OSError:
197193
msg = f"Cannot connect to TCP modbus device at {self.host}:{self.port}"
198194
if self.logger is not None:
@@ -447,7 +443,7 @@ async def send_modbus_message(
447443
self._comms_lock.acquire(), time_budget_remaining
448444
)
449445
except asyncio.TimeoutError:
450-
raise ModbusCommunicationTimeoutError(
446+
raise ModbusConcurrencyError(
451447
f"Failed to acquire lock to send request {msg_str} to modbus device {self.host}"
452448
)
453449
time_budget_remaining -= lock_t()
@@ -515,20 +511,7 @@ async def send_modbus_message(
515511
return None
516512

517513
raise
518-
except asyncio.TimeoutError as e:
519-
self._consecutive_timeouts += 1
520-
if self._consecutive_timeouts >= self.CONSECUTIVE_TIMEOUTS_TO_RECONNECT:
521-
if self.logger is not None:
522-
self.logger.warning(
523-
f"[{self}][send_modbus_message] {self._consecutive_timeouts} consecutive timeouts, "
524-
"clearing connection"
525-
)
526-
self.clear_tcp_connection()
527-
528-
raise ModbusCommunicationTimeoutError(
529-
f"Request {msg_str} timed out to {self.host}:{self.port}"
530-
) from e
531-
except (OSError, EOFError) as e:
514+
except (OSError, EOFError, asyncio.TimeoutError) as e:
532515
if self.logger is not None:
533516
self.logger.warning(
534517
f"[{self}][send_modbus_message] {type(e).__name__}({e}) while sending request {msg_str}, "

tcp_modbus_aio/exceptions.py

+2-8
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,10 @@
44
class ModbusCommunicationFailureError(ModbusError):
55
"""Generic modbus communication error."""
66

7-
pass
87

9-
10-
class ModbusCommunicationTimeoutError(ModbusCommunicationFailureError):
11-
"""Timeout in communicating with modbus device."""
12-
13-
pass
8+
class ModbusConcurrencyError(ModbusError):
9+
"""Too many concurrent requests"""
1410

1511

1612
class ModbusNotConnectedError(ModbusCommunicationFailureError):
1713
"""Modbus not connected error."""
18-
19-
pass

0 commit comments

Comments
 (0)