Skip to content

Commit ea1b219

Browse files
authored
Refactor PDU diag. (#2421)
1 parent bc407f6 commit ea1b219

26 files changed

+966
-1923
lines changed

doc/source/library/pymodbus.rst

+1-6
Original file line numberDiff line numberDiff line change
@@ -76,12 +76,7 @@ PDU classes
7676
:show-inheritance:
7777
:noindex:
7878

79-
.. automodule:: pymodbus.pdu.register_read_message
80-
:members:
81-
:undoc-members:
82-
:show-inheritance:
83-
84-
.. automodule:: pymodbus.pdu.register_write_message
79+
.. automodule:: pymodbus.pdu.register_message
8580
:members:
8681
:undoc-members:
8782
:show-inheritance:

examples/client_custom_msg.py

+3-6
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,7 @@ class CustomModbusPDU(ModbusPDU):
3838

3939
def __init__(self, values=None, slave=1, transaction=0):
4040
"""Initialize."""
41-
super().__init__()
42-
super().setBaseData(slave, transaction)
41+
super().__init__(slave_id=slave, transaction_id=transaction)
4342
self.values = values or []
4443

4544
def encode(self):
@@ -71,8 +70,7 @@ class CustomRequest(ModbusPDU):
7170

7271
def __init__(self, address=None, slave=1, transaction=0):
7372
"""Initialize."""
74-
super().__init__()
75-
super().setBaseData(slave, transaction)
73+
super().__init__(slave_id=slave, transaction_id=transaction)
7674
self.address = address
7775
self.count = 16
7876

@@ -107,8 +105,7 @@ def __init__(self, address, slave=1, transaction=0):
107105
108106
:param address: The address to start reading from
109107
"""
110-
super().__init__()
111-
self.setData(address, 16, slave, transaction)
108+
super().__init__(address=address, count=16, slave_id=slave, transaction_id=transaction)
112109

113110

114111
# --------------------------------------------------------------------------- #

pymodbus/client/mixin.py

+160-46
Large diffs are not rendered by default.

pymodbus/pdu/bit_message.py

+11-89
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,6 @@ class ReadCoilsRequest(ModbusPDU):
1616
rtu_frame_size = 8
1717
function_code = 1
1818

19-
def __init__(self) -> None:
20-
"""Initialize the read request."""
21-
super().__init__()
22-
self.address: int = 0
23-
self.count: int = 0
24-
25-
def setData(self, address: int, count: int, slave_id: int, transaction_id: int) -> None:
26-
"""Set data."""
27-
super().setBaseData(slave_id, transaction_id)
28-
self.address = address
29-
self.count = count
30-
3119
def encode(self) -> bytes:
3220
"""Encode a request pdu."""
3321
return struct.pack(">HH", self.address, self.count)
@@ -54,15 +42,10 @@ async def update_datastore(self, context: ModbusSlaveContext) -> ModbusPDU:
5442
self.function_code, self.address, self.count
5543
))
5644
response = (ReadCoilsResponse if self.function_code == 1 else ReadDiscreteInputsResponse)()
57-
response.setData(values, self.slave_id, self.transaction_id)
45+
response.bits = values
5846
return response
5947

6048

61-
def __str__(self) -> str:
62-
"""Return a string representation of the instance."""
63-
return f"{self.__class__.__name__}({self.address},{self.count})"
64-
65-
6649
class ReadDiscreteInputsRequest(ReadCoilsRequest):
6750
"""ReadDiscreteInputsRequest."""
6851

@@ -75,11 +58,6 @@ class ReadCoilsResponse(ModbusPDU):
7558
function_code = 1
7659
rtu_byte_count_pos = 2
7760

78-
def setData(self, values: list[bool], slave_id: int, transaction_id: int) -> None:
79-
"""Set data."""
80-
super().setBaseData(slave_id, transaction_id)
81-
self.bits = values
82-
8361
def encode(self) -> bytes:
8462
"""Encode response pdu."""
8563
result = pack_bitstring(self.bits)
@@ -90,10 +68,6 @@ def decode(self, data):
9068
"""Decode response pdu."""
9169
self.bits = unpack_bitstring(data[1:])
9270

93-
def __str__(self):
94-
"""Return a string representation of the instance."""
95-
return f"{self.__class__.__name__}({len(self.bits)})"
96-
9771

9872
class ReadDiscreteInputsResponse(ReadCoilsResponse):
9973
"""ReadDiscreteInputsResponse."""
@@ -107,31 +81,15 @@ class WriteSingleCoilResponse(ModbusPDU):
10781
function_code = 5
10882
rtu_frame_size = 8
10983

110-
def __init__(self) -> None:
111-
"""Instancitate object."""
112-
super().__init__()
113-
self.address: int = 0
114-
self.value: bool = False
115-
116-
def setData(self, address: int, value: bool, slave_id: int, transaction_id: int) -> None:
117-
"""Set data."""
118-
super().setBaseData(slave_id, transaction_id)
119-
self.address = address
120-
self.value = value
121-
12284
def encode(self) -> bytes:
12385
"""Encode write coil request."""
124-
val = ModbusStatus.ON if self.value else ModbusStatus.OFF
86+
val = ModbusStatus.ON if self.bits[0] else ModbusStatus.OFF
12587
return struct.pack(">HH", self.address, val)
12688

12789
def decode(self, data: bytes) -> None:
12890
"""Decode a write coil request."""
12991
self.address, value = struct.unpack(">HH", data)
130-
self.value = value == ModbusStatus.ON
131-
132-
def __str__(self) -> str:
133-
"""Return a string representation of the instance."""
134-
return f"{self.__class__.__name__}({self.address}) => {self.value}"
92+
self.bits = [value == ModbusStatus.ON]
13593

13694

13795
class WriteSingleCoilRequest(WriteSingleCoilResponse):
@@ -142,11 +100,9 @@ async def update_datastore(self, context: ModbusSlaveContext) -> ModbusPDU:
142100
if not context.validate(self.function_code, self.address, 1):
143101
return self.doException(merror.IllegalAddress)
144102

145-
await context.async_setValues(self.function_code, self.address, [self.value])
103+
await context.async_setValues(self.function_code, self.address, self.bits)
146104
values = cast(list[bool], await context.async_getValues(self.function_code, self.address, 1))
147-
pdu = WriteSingleCoilResponse()
148-
pdu.setData(self.address, values[0], self.slave_id, self.transaction_id)
149-
return pdu
105+
return WriteSingleCoilResponse(address=self.address, bits=values, slave_id=self.slave_id, transaction_id=self.transaction_id)
150106

151107
def get_response_pdu_size(self) -> int:
152108
"""Get response pdu size.
@@ -162,50 +118,32 @@ class WriteMultipleCoilsRequest(ModbusPDU):
162118
function_code = 15
163119
rtu_byte_count_pos = 6
164120

165-
def __init__(self) -> None:
166-
"""Initialize a new instance."""
167-
super().__init__()
168-
self.address: int = 0
169-
self.values: list[bool] = []
170-
171-
def setData(self, address: int, values: list[bool], slave_id: int, transaction_id: int) -> None:
172-
"""Set data."""
173-
super().setBaseData(slave_id, transaction_id)
174-
self.address = address
175-
self.values = values
176-
177121
def encode(self) -> bytes:
178122
"""Encode write coils request."""
179-
count = len(self.values)
123+
count = len(self.bits)
180124
byte_count = (count + 7) // 8
181125
packet = struct.pack(">HHB", self.address, count, byte_count)
182-
packet += pack_bitstring(self.values)
126+
packet += pack_bitstring(self.bits)
183127
return packet
184128

185129
def decode(self, data: bytes) -> None:
186130
"""Decode a write coils request."""
187131
self.address, count, _ = struct.unpack(">HHB", data[0:5])
188132
values = unpack_bitstring(data[5:])
189-
self.values = values[:count]
133+
self.bits = values[:count]
190134

191135
async def update_datastore(self, context: ModbusSlaveContext) -> ModbusPDU:
192136
"""Run a request against a datastore."""
193-
count = len(self.values)
137+
count = len(self.bits)
194138
if not 1 <= count <= 0x07B0:
195139
return self.doException(merror.IllegalValue)
196140
if not context.validate(self.function_code, self.address, count):
197141
return self.doException(merror.IllegalAddress)
198142

199143
await context.async_setValues(
200-
self.function_code, self.address, self.values
144+
self.function_code, self.address, self.bits
201145
)
202-
pdu = WriteMultipleCoilsResponse()
203-
pdu.setData(self.address, count, self.slave_id, self.transaction_id)
204-
return pdu
205-
206-
def __str__(self) -> str:
207-
"""Return a string representation of the instance."""
208-
return f"{self.__class__.__name__}({self.address}) => {len(self.values)}"
146+
return WriteMultipleCoilsResponse(address=self.address, count=count, slave_id=self.slave_id, transaction_id=self.transaction_id)
209147

210148
def get_response_pdu_size(self) -> int:
211149
"""Get response pdu size.
@@ -222,26 +160,10 @@ class WriteMultipleCoilsResponse(ModbusPDU):
222160
function_code = 15
223161
rtu_frame_size = 8
224162

225-
def __init__(self) -> None:
226-
"""Initialize a new instance."""
227-
super().__init__()
228-
self.address: int = 0
229-
self.count: int = 0
230-
231-
def setData(self, address: int, count: int, slave_id: int, transaction_id: int) -> None:
232-
"""Set data."""
233-
super().setBaseData(slave_id, transaction_id)
234-
self.address = address
235-
self.count = count
236-
237163
def encode(self) -> bytes:
238164
"""Encode write coils response."""
239165
return struct.pack(">HH", self.address, self.count)
240166

241167
def decode(self, data: bytes) -> None:
242168
"""Decode a write coils response."""
243169
self.address, self.count = struct.unpack(">HH", data)
244-
245-
def __str__(self) -> str:
246-
"""Return a string representation of the instance."""
247-
return f"{self.__class__.__name__}({self.address}, {self.count})"

pymodbus/pdu/decoders.py

+7-8
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@
77
import pymodbus.pdu.mei_message as mei_msg
88
import pymodbus.pdu.other_message as o_msg
99
import pymodbus.pdu.pdu as base
10-
import pymodbus.pdu.register_read_message as reg_r_msg
11-
import pymodbus.pdu.register_write_message as reg_w_msg
10+
import pymodbus.pdu.register_message as reg_msg
1211
from pymodbus.exceptions import MessageRegisterException, ModbusException
1312
from pymodbus.logging import Log
1413

@@ -17,23 +16,23 @@ class DecodePDU:
1716
"""Decode pdu requests/responses (server/client)."""
1817

1918
_pdu_class_table: set[tuple[type[base.ModbusPDU], type[base.ModbusPDU]]] = {
20-
(reg_r_msg.ReadHoldingRegistersRequest, reg_r_msg.ReadHoldingRegistersResponse),
19+
(reg_msg.ReadHoldingRegistersRequest, reg_msg.ReadHoldingRegistersResponse),
2120
(bit_msg.ReadDiscreteInputsRequest, bit_msg.ReadDiscreteInputsResponse),
22-
(reg_r_msg.ReadInputRegistersRequest, reg_r_msg.ReadInputRegistersResponse),
21+
(reg_msg.ReadInputRegistersRequest, reg_msg.ReadInputRegistersResponse),
2322
(bit_msg.ReadCoilsRequest, bit_msg.ReadCoilsResponse),
2423
(bit_msg.WriteMultipleCoilsRequest, bit_msg.WriteMultipleCoilsResponse),
25-
(reg_w_msg.WriteMultipleRegistersRequest, reg_w_msg.WriteMultipleRegistersResponse),
26-
(reg_w_msg.WriteSingleRegisterRequest, reg_w_msg.WriteSingleRegisterResponse),
24+
(reg_msg.WriteMultipleRegistersRequest, reg_msg.WriteMultipleRegistersResponse),
25+
(reg_msg.WriteSingleRegisterRequest, reg_msg.WriteSingleRegisterResponse),
2726
(bit_msg.WriteSingleCoilRequest, bit_msg.WriteSingleCoilResponse),
28-
(reg_r_msg.ReadWriteMultipleRegistersRequest, reg_r_msg.ReadWriteMultipleRegistersResponse),
27+
(reg_msg.ReadWriteMultipleRegistersRequest, reg_msg.ReadWriteMultipleRegistersResponse),
2928
(diag_msg.DiagnosticStatusRequest, diag_msg.DiagnosticStatusResponse),
3029
(o_msg.ReadExceptionStatusRequest, o_msg.ReadExceptionStatusResponse),
3130
(o_msg.GetCommEventCounterRequest, o_msg.GetCommEventCounterResponse),
3231
(o_msg.GetCommEventLogRequest, o_msg.GetCommEventLogResponse),
3332
(o_msg.ReportSlaveIdRequest, o_msg.ReportSlaveIdResponse),
3433
(file_msg.ReadFileRecordRequest, file_msg.ReadFileRecordResponse),
3534
(file_msg.WriteFileRecordRequest, file_msg.WriteFileRecordResponse),
36-
(reg_w_msg.MaskWriteRegisterRequest, reg_w_msg.MaskWriteRegisterResponse),
35+
(reg_msg.MaskWriteRegisterRequest, reg_msg.MaskWriteRegisterResponse),
3736
(file_msg.ReadFifoQueueRequest, file_msg.ReadFifoQueueResponse),
3837
(mei_msg.ReadDeviceInformationRequest, mei_msg.ReadDeviceInformationResponse),
3938
}

0 commit comments

Comments
 (0)