7
7
import logging
8
8
import struct
9
9
from enum import Enum
10
- from typing import Callable , Iterable , Union , overload , List
10
+ import time
11
+ from typing import Any , Callable , Iterable , Optional , Union , overload , List
11
12
12
13
import pymodbus
13
14
from pymodbus .client .sync import ModbusTcpClient , ModbusSerialClient
@@ -46,29 +47,41 @@ def __init__(self, bits: int, decoding_method: str):
46
47
47
48
48
49
class ModbusClient :
49
- def __init__ (self , delegate : Union [ModbusSerialClient , ModbusTcpClient ], address : str , port : int = 502 ):
50
- self .delegate = delegate
50
+ def __init__ (self ,
51
+ delegate : Union [ModbusSerialClient , ModbusTcpClient ],
52
+ address : str , port : int = 502 ,
53
+ sleep_after_connect : Optional [int ] = 0 ):
54
+ self ._delegate = delegate
51
55
self .address = address
52
56
self .port = port
57
+ self .sleep_after_connect = sleep_after_connect
53
58
54
59
def __enter__ (self ):
55
60
try :
56
- self .delegate .__enter__ ()
61
+ self ._delegate .__enter__ ()
62
+ time .sleep (self .sleep_after_connect )
57
63
except pymodbus .exceptions .ConnectionException as e :
58
64
e .args += (NO_CONNECTION .format (self .address , self .port ),)
59
65
raise e
60
66
return self
61
67
62
68
def __exit__ (self , exc_type , exc_value , exc_traceback ):
63
- self .delegate .__exit__ (exc_type , exc_value , exc_traceback )
69
+ self ._delegate .__exit__ (exc_type , exc_value , exc_traceback )
64
70
65
- def close_connection (self ) -> None :
71
+ def connect (self ) -> None :
72
+ self ._delegate .connect ()
73
+ time .sleep (self .sleep_after_connect )
74
+
75
+ def close (self ) -> None :
66
76
try :
67
77
log .debug ("Close Modbus TCP connection" )
68
- self .delegate .close ()
78
+ self ._delegate .close ()
69
79
except Exception as e :
70
80
raise Exception (__name__ + " " + str (type (e ))+ " " + str (e )) from e
71
81
82
+ def is_socket_open (self ) -> bool :
83
+ return self ._delegate .is_socket_open ()
84
+
72
85
def __read_registers (self , read_register_method : Callable ,
73
86
address : int ,
74
87
types : Union [Iterable [ModbusDataType ], ModbusDataType ],
@@ -118,7 +131,7 @@ def read_holding_registers(self, address: int,
118
131
wordorder : Endian = Endian .Big ,
119
132
** kwargs ):
120
133
return self .__read_registers (
121
- self .delegate .read_holding_registers , address , types , byteorder , wordorder , ** kwargs
134
+ self ._delegate .read_holding_registers , address , types , byteorder , wordorder , ** kwargs
122
135
)
123
136
124
137
@overload
@@ -137,7 +150,12 @@ def read_input_registers(self, address: int,
137
150
byteorder : Endian = Endian .Big ,
138
151
wordorder : Endian = Endian .Big ,
139
152
** kwargs ):
140
- return self .__read_registers (self .delegate .read_input_registers , address , types , byteorder , wordorder , ** kwargs )
153
+ return self .__read_registers (self ._delegate .read_input_registers ,
154
+ address ,
155
+ types ,
156
+ byteorder ,
157
+ wordorder ,
158
+ ** kwargs )
141
159
142
160
@overload
143
161
def read_coils (self , address : int , types : Iterable [ModbusDataType ], byteorder : Endian = Endian .Big ,
@@ -151,7 +169,7 @@ def read_coils(self, address: int, count: int, **kwargs) -> bool:
151
169
152
170
def read_coils (self , address : int , count : int , ** kwargs ):
153
171
try :
154
- response = self .delegate .read_coils (address , count , ** kwargs )
172
+ response = self ._delegate .read_coils (address , count , ** kwargs )
155
173
if response .isError ():
156
174
raise Exception (__name__ + " " + str (response ))
157
175
return response .bits [0 ] if count == 1 else response .bits [:count ]
@@ -162,18 +180,35 @@ def read_coils(self, address: int, count: int, **kwargs):
162
180
e .args += (NO_VALUES .format (self .address , self .port ),)
163
181
raise e
164
182
183
+ def write_registers (self , address : int , value : Any , types : ModbusDataType ):
184
+ self ._delegate .write_registers (address , value , types )
185
+
165
186
166
187
class ModbusTcpClient_ (ModbusClient ):
167
- def __init__ (self , address : str , port : int = 502 ):
188
+ def __init__ (self ,
189
+ address : str ,
190
+ port : int = 502 ,
191
+ sleep_after_connect : Optional [int ] = None ,
192
+ ** kwargs ):
168
193
parsed_url = parse_url (address )
169
194
host = parsed_url .host
170
195
if parsed_url .port is not None :
171
196
port = parsed_url .port
172
- super ().__init__ (ModbusTcpClient (host , port ), address , port )
197
+ super ().__init__ (ModbusTcpClient (host , port , ** kwargs ), address , port , sleep_after_connect )
173
198
174
199
175
200
class ModbusSerialClient_ (ModbusClient ):
176
- def __init__ (self , port : int ):
177
- super ().__init__ (ModbusSerialClient (method = "rtu" , port = port , baudrate = 9600 , stopbits = 1 , bytesize = 8 , timeout = 1 ),
201
+ def __init__ (self ,
202
+ port : int ,
203
+ sleep_after_connect : Optional [int ] = None ,
204
+ ** kwargs ):
205
+ super ().__init__ (ModbusSerialClient (method = "rtu" ,
206
+ port = port ,
207
+ baudrate = 9600 ,
208
+ stopbits = 1 ,
209
+ bytesize = 8 ,
210
+ timeout = 1 ,
211
+ ** kwargs ),
178
212
"Serial" ,
179
- port )
213
+ port ,
214
+ sleep_after_connect )
0 commit comments