1
- import asyncio
2
-
3
1
from dataclasses import dataclass
4
2
from typing import Optional
5
3
6
- from pymodbus .client .base import ModbusBaseClient
7
4
from pymodbus .client import (
8
5
AsyncModbusSerialClient ,
9
6
AsyncModbusTcpClient ,
10
7
AsyncModbusUdpClient ,
8
+ ModbusBaseClient ,
11
9
)
12
- from pymodbus .exceptions import ModbusException
13
10
11
+ from pymodbus .exceptions import ModbusException
14
12
from pymodbus .framer import Framer
15
- from pymodbus .pdu import ExceptionResponse
16
-
13
+ from pymodbus .pdu import ExceptionResponse , ModbusResponse
17
14
18
15
# Constants
19
16
CR = "\r "
@@ -27,29 +24,27 @@ class ModbusConnectionSettings:
27
24
port : int = 7001
28
25
slave : int = 0
29
26
30
- class ModbusConnection :
31
27
28
+ class ModbusConnection :
32
29
def __init__ (self , settings : ModbusConnectionSettings ) -> None :
33
-
34
30
self .host , self .port , self .slave = settings .host , settings .port , settings .slave
35
31
self .running : bool = False
36
32
37
33
self ._client : ModbusBaseClient
38
34
39
- async def connect (self , framer = Framer . SOCKET ) :
35
+ async def connect (self ) -> None :
40
36
raise NotImplementedError
41
37
42
-
43
38
def disconnect (self ):
44
39
self ._client .close ()
45
40
46
- async def _read (self , address : int , count : int = 2 ) -> Optional [str ]:
41
+ async def _read (self , address : int , count : int = 2 ) -> Optional [ModbusResponse ]:
47
42
# address -= 1 # modbus spec starts from 0 not 1
48
43
try :
49
44
# address_hex = hex(address)
50
45
rr = await self ._client .read_holding_registers (address , count = count , slave = self .slave ) # type: ignore
51
46
print (f"Response: { rr } " )
52
- except ModbusException as exc : # pragma no cover
47
+ except ModbusException : # pragma no cover
53
48
# Received ModbusException from library
54
49
self .disconnect ()
55
50
return
@@ -61,8 +56,11 @@ async def _read(self, address: int, count: int = 2) -> Optional[str]:
61
56
# Received Modbus library exception
62
57
# THIS IS NOT A PYTHON EXCEPTION, but a valid modbus message
63
58
self .disconnect ()
59
+ else :
60
+ return rr
61
+ return None
64
62
65
- async def send (self , address : int , value : int ) -> None :
63
+ async def send (self , address : int , value : int ) -> ModbusResponse | None :
66
64
"""Send a request.
67
65
68
66
Args:
@@ -71,14 +69,15 @@ async def send(self, address: int, value: int) -> None:
71
69
"""
72
70
await self ._client .write_registers (address , value , slave = self .slave )
73
71
resp = await self ._read (address , 2 )
72
+ return resp
74
73
75
- class ModbusSerialConnection (ModbusConnection ):
76
74
75
+ class ModbusSerialConnection (ModbusConnection ):
77
76
def __init__ (self , settings : ModbusConnectionSettings ) -> None :
78
77
super ().__init__ (settings )
79
78
80
- async def connect (self , framer = Framer .SOCKET ):
81
- self ._client : AsyncModbusSerialClient = AsyncModbusSerialClient (
79
+ async def connect (self , framer : Framer = Framer .SOCKET ):
80
+ self ._client = AsyncModbusSerialClient (
82
81
str (self .port ),
83
82
framer = framer ,
84
83
timeout = 10 ,
@@ -95,13 +94,13 @@ async def connect(self, framer=Framer.SOCKET):
95
94
await self ._client .connect ()
96
95
assert self ._client .connected
97
96
98
- class ModbusTcpConnection (ModbusConnection ):
99
97
98
+ class ModbusTcpConnection (ModbusConnection ):
100
99
def __init__ (self , settings : ModbusConnectionSettings ) -> None :
101
100
super ().__init__ (settings )
102
101
103
- async def connect (self , framer = Framer .SOCKET ):
104
- self ._client : AsyncModbusTcpClient = AsyncModbusTcpClient (
102
+ async def connect (self , framer : Framer = Framer .SOCKET ):
103
+ self ._client = AsyncModbusTcpClient (
105
104
self .host ,
106
105
self .port ,
107
106
framer = framer ,
@@ -116,13 +115,13 @@ async def connect(self, framer=Framer.SOCKET):
116
115
await self ._client .connect ()
117
116
assert self ._client .connected
118
117
119
- class ModbusUdpConnection (ModbusConnection ):
120
118
119
+ class ModbusUdpConnection (ModbusConnection ):
121
120
def __init__ (self , settings : ModbusConnectionSettings ) -> None :
122
121
super ().__init__ (settings )
123
122
124
- async def connect (self , framer = Framer .SOCKET ):
125
- self ._client : AsyncModbusUdpClient = AsyncModbusUdpClient (
123
+ async def connect (self , framer : Framer = Framer .SOCKET ):
124
+ self ._client = AsyncModbusUdpClient (
126
125
self .host ,
127
126
self .port ,
128
127
framer = framer ,
@@ -135,4 +134,4 @@ async def connect(self, framer=Framer.SOCKET):
135
134
)
136
135
137
136
await self ._client .connect ()
138
- assert self ._client .connected
137
+ assert self ._client .connected
0 commit comments