@@ -34,11 +34,13 @@ def get_response_pdu_size(self) -> int:
34
34
35
35
async def update_datastore (self , context : ModbusDeviceContext ) -> ModbusPDU :
36
36
"""Run a read holding request against a datastore."""
37
- values = cast ( list [ int ], await context .async_getValues (
37
+ values = await context .async_getValues (
38
38
self .function_code , self .address , self .count
39
- ))
39
+ )
40
+ if isinstance (values , int ):
41
+ return ExceptionResponse (self .function_code , values )
40
42
response_class = (ReadHoldingRegistersResponse if self .function_code == 3 else ReadInputRegistersResponse )
41
- return response_class (registers = values , dev_id = self .dev_id , transaction_id = self .transaction_id )
43
+ return response_class (registers = cast ( list [ int ], values ) , dev_id = self .dev_id , transaction_id = self .transaction_id )
42
44
43
45
44
46
class ReadHoldingRegistersResponse (ModbusPDU ):
@@ -137,13 +139,17 @@ async def update_datastore(self, context: ModbusDeviceContext) -> ModbusPDU:
137
139
return ExceptionResponse (self .function_code , ExceptionResponse .ILLEGAL_VALUE )
138
140
if not 1 <= self .write_count <= 0x079 :
139
141
return ExceptionResponse (self .function_code , ExceptionResponse .ILLEGAL_VALUE )
140
- await context .async_setValues (
142
+ rc = await context .async_setValues (
141
143
self .function_code , self .write_address , self .write_registers
142
144
)
143
- registers = cast (list [int ], await context .async_getValues (
145
+ if rc :
146
+ return ExceptionResponse (self .function_code , rc )
147
+ registers = await context .async_getValues (
144
148
self .function_code , self .read_address , self .read_count
145
- ))
146
- return ReadWriteMultipleRegistersResponse (registers = registers , dev_id = self .dev_id , transaction_id = self .transaction_id )
149
+ )
150
+ if isinstance (registers , int ):
151
+ return ExceptionResponse (self .function_code , registers )
152
+ return ReadWriteMultipleRegistersResponse (registers = cast (list [int ], registers ), dev_id = self .dev_id , transaction_id = self .transaction_id )
147
153
148
154
def get_response_pdu_size (self ) -> int :
149
155
"""Get response pdu size.
@@ -182,11 +188,15 @@ async def update_datastore(self, context: ModbusDeviceContext) -> ModbusPDU:
182
188
"""Run a write single register request against a datastore."""
183
189
if not 0 <= self .registers [0 ] <= 0xFFFF :
184
190
return ExceptionResponse (self .function_code , ExceptionResponse .ILLEGAL_VALUE )
185
- await context .async_setValues (
191
+ rc = await context .async_setValues (
186
192
self .function_code , self .address , self .registers
187
193
)
188
- values = cast (list [int ], await context .async_getValues (self .function_code , self .address , 1 ))
189
- return WriteSingleRegisterResponse (address = self .address , registers = values )
194
+ if rc :
195
+ return ExceptionResponse (self .function_code , rc )
196
+ values = await context .async_getValues (self .function_code , self .address , 1 )
197
+ if isinstance (values , int ):
198
+ return ExceptionResponse (self .function_code , values )
199
+ return WriteSingleRegisterResponse (address = self .address , registers = cast (list [int ], values ))
190
200
191
201
def get_response_pdu_size (self ) -> int :
192
202
"""Get response pdu size.
@@ -221,9 +231,11 @@ async def update_datastore(self, context: ModbusDeviceContext) -> ModbusPDU:
221
231
"""Run a write single register request against a datastore."""
222
232
if not 1 <= self .count <= 0x07B :
223
233
return ExceptionResponse (self .function_code , ExceptionResponse .ILLEGAL_VALUE )
224
- await context .async_setValues (
234
+ rc = await context .async_setValues (
225
235
self .function_code , self .address , self .registers
226
236
)
237
+ if rc :
238
+ return ExceptionResponse (self .function_code , rc )
227
239
return WriteMultipleRegistersResponse (address = self .address , count = self .count , dev_id = self .dev_id , transaction_id = self .transaction_id )
228
240
229
241
def get_response_pdu_size (self ) -> int :
@@ -275,11 +287,15 @@ async def update_datastore(self, context: ModbusDeviceContext) -> ModbusPDU:
275
287
return ExceptionResponse (self .function_code , ExceptionResponse .ILLEGAL_VALUE )
276
288
if not 0x0000 <= self .or_mask <= 0xFFFF :
277
289
return ExceptionResponse (self .function_code , ExceptionResponse .ILLEGAL_VALUE )
278
- values = (await context .async_getValues (self .function_code , self .address , 1 ))[0 ]
279
- values = (values & self .and_mask ) | (self .or_mask & ~ self .and_mask )
280
- await context .async_setValues (
281
- self .function_code , self .address , [values ]
290
+ values = await context .async_getValues (self .function_code , self .address , 1 )
291
+ if isinstance (values , int ):
292
+ return ExceptionResponse (self .function_code , values )
293
+ values = (values [0 ] & self .and_mask ) | (self .or_mask & ~ self .and_mask )
294
+ rc = await context .async_setValues (
295
+ self .function_code , self .address , cast (list [int ], [values ])
282
296
)
297
+ if rc :
298
+ return ExceptionResponse (self .function_code , rc )
283
299
return MaskWriteRegisterResponse (address = self .address , and_mask = self .and_mask , or_mask = self .or_mask , dev_id = self .dev_id , transaction_id = self .transaction_id )
284
300
285
301
0 commit comments