Skip to content

Commit 0fc7b42

Browse files
authored
Clean PDU init. (#2399)
1 parent be46b60 commit 0fc7b42

17 files changed

+123
-151
lines changed

examples/client_custom_msg.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ class CustomModbusPDU(ModbusPDU):
3838

3939
def __init__(self, values=None, slave=1, transaction=0, skip_encode=False):
4040
"""Initialize."""
41-
ModbusPDU.__init__(self, slave, transaction, skip_encode)
41+
super().__init__()
42+
super().setData(slave, transaction, skip_encode)
4243
self.values = values or []
4344

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

7172
def __init__(self, address=None, slave=1, transaction=0, skip_encode=False):
7273
"""Initialize."""
73-
ModbusPDU.__init__(self, slave, transaction, skip_encode)
74+
super().__init__()
75+
super().setData(slave, transaction, skip_encode)
7476
self.address = address
7577
self.count = 16
7678

pymodbus/pdu/bit_read_message.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ def __init__(self, address, count, slave, transaction, skip_encode):
2020
:param count: The number of bits after "address" to read
2121
:param slave: Modbus slave slave ID
2222
"""
23-
ModbusPDU.__init__(self, slave, transaction, skip_encode)
23+
super().__init__()
24+
super().setData(slave, transaction, skip_encode)
2425
self.address = address
2526
self.count = count
2627

@@ -70,7 +71,8 @@ def __init__(self, values, slave, transaction, skip_encode):
7071
:param values: The requested values to be returned
7172
:param slave: Modbus slave slave ID
7273
"""
73-
ModbusPDU.__init__(self, slave, transaction, skip_encode)
74+
super().__init__()
75+
super().setData(slave, transaction, skip_encode)
7476

7577
#: A list of booleans representing bit values
7678
self.bits = values or []

pymodbus/pdu/bit_write_message.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ def __init__(self, address=None, value=None, slave=None, transaction=0, skip_enc
4949
:param address: The variable address to write
5050
:param value: The value to write at address
5151
"""
52-
ModbusPDU.__init__(self, slave, transaction, skip_encode)
52+
super().__init__()
53+
super().setData(slave, transaction, skip_encode)
5354
self.address = address
5455
self.value = bool(value)
5556

@@ -116,7 +117,8 @@ def __init__(self, address=None, value=None, slave=1, transaction=0, skip_encode
116117
:param address: The variable address written to
117118
:param value: The value written at address
118119
"""
119-
ModbusPDU.__init__(self, slave, transaction, skip_encode)
120+
super().__init__()
121+
super().setData(slave, transaction, skip_encode)
120122
self.address = address
121123
self.value = value
122124

@@ -170,7 +172,8 @@ def __init__(self, address=0, values=None, slave=None, transaction=0, skip_encod
170172
:param address: The starting request address
171173
:param values: The values to write
172174
"""
173-
ModbusPDU.__init__(self, slave, transaction, skip_encode)
175+
super().__init__()
176+
super().setData(slave, transaction, skip_encode)
174177
self.address = address
175178
if values is None: # pragma: no cover
176179
values = []
@@ -246,7 +249,8 @@ def __init__(self, address=None, count=None, slave=1, transaction=0, skip_encode
246249
:param address: The starting variable address written to
247250
:param count: The number of values written
248251
"""
249-
ModbusPDU.__init__(self, slave, transaction, skip_encode)
252+
super().__init__()
253+
super().setData(slave, transaction, skip_encode)
250254
self.address = address
251255
self.count = count
252256

pymodbus/pdu/decoders.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,8 @@ def decode(self, frame: bytes) -> base.ModbusPDU | None:
9898
if not (pdu_type := self.lookup.get(function_code, None)):
9999
Log.debug("decode PDU failed for function code {}", function_code)
100100
raise ModbusException(f"Unknown response {function_code}")
101-
pdu = pdu_type(0, 0, False)
101+
pdu = pdu_type()
102+
pdu.setData(0, 0, False)
102103
Log.debug("decode PDU for {}", function_code)
103104
pdu.decode(frame[1:])
104105

pymodbus/pdu/diag_message.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ class DiagnosticStatusRequest(ModbusPDU):
3434

3535
def __init__(self, slave=1, transaction=0, skip_encode=False):
3636
"""Initialize a diagnostic request."""
37-
ModbusPDU.__init__(self, slave, transaction, skip_encode)
37+
super().__init__()
38+
super().setData(slave, transaction, skip_encode)
3839
self.message = None
3940

4041
def encode(self):
@@ -95,7 +96,8 @@ class DiagnosticStatusResponse(ModbusPDU):
9596

9697
def __init__(self, slave=1, transaction=0, skip_encode=False):
9798
"""Initialize a diagnostic response."""
98-
ModbusPDU.__init__(self, slave, transaction, skip_encode)
99+
super().__init__()
100+
super().setData(slave, transaction, skip_encode)
99101
self.message = None
100102

101103
def encode(self):

pymodbus/pdu/file_message.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,8 @@ def __init__(self, records=None, slave=1, transaction=0, skip_encode=False):
9494
9595
:param records: The file record requests to be read
9696
"""
97-
ModbusPDU.__init__(self, slave, transaction, skip_encode)
97+
super().__init__()
98+
super().setData(slave, transaction, skip_encode)
9899
self.records = records or []
99100

100101
def encode(self):
@@ -159,7 +160,8 @@ def __init__(self, records=None, slave=1, transaction=0, skip_encode=False):
159160
160161
:param records: The requested file records
161162
"""
162-
ModbusPDU.__init__(self, slave, transaction, skip_encode)
163+
super().__init__()
164+
super().setData(slave, transaction, skip_encode)
163165
self.records = records or []
164166

165167
def encode(self):
@@ -215,7 +217,8 @@ def __init__(self, records=None, slave=1, transaction=0, skip_encode=False):
215217
216218
:param records: The file record requests to be read
217219
"""
218-
ModbusPDU.__init__(self, slave, transaction, skip_encode)
220+
super().__init__()
221+
super().setData(slave, transaction, skip_encode)
219222
self.records = records or []
220223

221224
def encode(self):
@@ -279,7 +282,8 @@ def __init__(self, records=None, slave=1, transaction=0, skip_encode=False):
279282
280283
:param records: The file record requests to be read
281284
"""
282-
ModbusPDU.__init__(self, slave, transaction, skip_encode)
285+
super().__init__()
286+
super().setData(slave, transaction, skip_encode)
283287
self.records = records or []
284288

285289
def encode(self):
@@ -344,7 +348,8 @@ def __init__(self, address=0x0000, slave=1, transaction=0, skip_encode=False):
344348
345349
:param address: The fifo pointer address (0x0000 to 0xffff)
346350
"""
347-
ModbusPDU.__init__(self, slave, transaction, skip_encode)
351+
super().__init__()
352+
super().setData(slave, transaction, skip_encode)
348353
self.address = address
349354
self.values = [] # this should be added to the context
350355

@@ -405,7 +410,8 @@ def __init__(self, values=None, slave=1, transaction=0, skip_encode=False):
405410
406411
:param values: The list of values of the fifo to return
407412
"""
408-
ModbusPDU.__init__(self, slave, transaction, skip_encode)
413+
super().__init__()
414+
super().setData(slave, transaction, skip_encode)
409415
self.values = values or []
410416

411417
def encode(self):

pymodbus/pdu/mei_message.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ def __init__(self, read_code=None, object_id=0x00, slave=1, transaction=0, skip_
5858
:param read_code: The device information read code
5959
:param object_id: The object to read from
6060
"""
61-
ModbusPDU.__init__(self, slave, transaction, skip_encode)
61+
super().__init__()
62+
super().setData(slave, transaction, skip_encode)
6263
self.read_code = read_code or DeviceInformation.BASIC
6364
self.object_id = object_id
6465

@@ -136,7 +137,8 @@ def __init__(self, read_code=None, information=None, slave=1, transaction=0, ski
136137
:param read_code: The device information read code
137138
:param information: The requested information request
138139
"""
139-
ModbusPDU.__init__(self, slave, transaction, skip_encode)
140+
super().__init__()
141+
super().setData(slave, transaction, skip_encode)
140142
self.read_code = read_code or DeviceInformation.BASIC
141143
self.information = information or {}
142144
self.number_of_objects = 0

pymodbus/pdu/other_message.py

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ class ReadExceptionStatusRequest(ModbusPDU):
3232

3333
def __init__(self, slave=None, transaction=0, skip_encode=0):
3434
"""Initialize a new instance."""
35-
ModbusPDU.__init__(self, slave, transaction, skip_encode)
35+
super().__init__()
36+
super().setData(slave, transaction, skip_encode)
3637

3738
def encode(self):
3839
"""Encode the message."""
@@ -74,7 +75,8 @@ def __init__(self, status=0x00, slave=1, transaction=0, skip_encode=False):
7475
7576
:param status: The status response to report
7677
"""
77-
ModbusPDU.__init__(self, slave, transaction, skip_encode)
78+
super().__init__()
79+
super().setData(slave, transaction, skip_encode)
7880
self.status = status if status < 256 else 255
7981

8082
def encode(self):
@@ -131,7 +133,8 @@ class GetCommEventCounterRequest(ModbusPDU):
131133

132134
def __init__(self, slave=1, transaction=0, skip_encode=False):
133135
"""Initialize a new instance."""
134-
ModbusPDU.__init__(self, slave, transaction, skip_encode)
136+
super().__init__()
137+
super().setData(slave, transaction, skip_encode)
135138

136139
def encode(self):
137140
"""Encode the message."""
@@ -174,7 +177,8 @@ def __init__(self, count=0x0000, slave=1, transaction=0, skip_encode=False):
174177
175178
:param count: The current event counter value
176179
"""
177-
ModbusPDU.__init__(self, slave, transaction, skip_encode)
180+
super().__init__()
181+
super().setData(slave, transaction, skip_encode)
178182
self.count = count
179183
self.status = True # this means we are ready, not waiting
180184

@@ -236,7 +240,8 @@ class GetCommEventLogRequest(ModbusPDU):
236240

237241
def __init__(self, slave=1, transaction=0, skip_encode=False):
238242
"""Initialize a new instance."""
239-
ModbusPDU.__init__(self, slave, transaction, skip_encode)
243+
super().__init__()
244+
super().setData(slave, transaction, skip_encode)
240245

241246
def encode(self):
242247
"""Encode the message."""
@@ -289,7 +294,8 @@ def __init__(self, status=True, message_count=0, event_count=0, events=None, sla
289294
:param event_count: The current event count
290295
:param events: The collection of events to send
291296
"""
292-
ModbusPDU.__init__(self, slave, transaction, skip_encode)
297+
super().__init__()
298+
super().setData(slave, transaction, skip_encode)
293299
self.status = status
294300
self.message_count = message_count
295301
self.event_count = event_count
@@ -361,7 +367,8 @@ def __init__(self, slave=1, transaction=0, skip_encode=False):
361367
:param slave: Modbus slave slave ID
362368
363369
"""
364-
ModbusPDU.__init__(self, slave, transaction, skip_encode)
370+
super().__init__()
371+
super().setData(slave, transaction, skip_encode)
365372

366373
def encode(self):
367374
"""Encode the message."""
@@ -420,7 +427,8 @@ def __init__(self, identifier=b"\x00", status=True, slave=1, transaction=0, skip
420427
:param identifier: The identifier of the slave
421428
:param status: The status response to report
422429
"""
423-
ModbusPDU.__init__(self, slave, transaction, skip_encode)
430+
super().__init__()
431+
super().setData(slave, transaction, skip_encode)
424432
self.identifier = identifier
425433
self.status = status
426434
self.byte_count = None

pymodbus/pdu/pdu.py

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,22 +17,20 @@ class ModbusPDU:
1717
_rtu_frame_size: int = 0
1818
_rtu_byte_count_pos: int = 0
1919

20-
def __init__(self, slave: int, transaction: int, skip_encode: bool) -> None:
20+
def __init__(self) -> None:
2121
"""Initialize the base data for a modbus request."""
22+
self.transaction_id: int
23+
self.slave_id: int
24+
self.skip_encode: bool
25+
self.bits: list[bool]
26+
self.registers: list[int]
27+
self.fut: asyncio.Future
28+
29+
def setData(self, slave: int, transaction: int, skip_encode: bool) -> None:
30+
"""Set data common for all PDU."""
2231
self.transaction_id = transaction
2332
self.slave_id = slave
2433
self.skip_encode = skip_encode
25-
self.bits: list[bool] = []
26-
self.registers: list[int] = []
27-
self.fut: asyncio.Future | None = None
28-
29-
@abstractmethod
30-
def encode(self) -> bytes:
31-
"""Encode the message."""
32-
33-
@abstractmethod
34-
def decode(self, data: bytes) -> None:
35-
"""Decode data part of the message."""
3634

3735
def doException(self, exception: int) -> ExceptionResponse:
3836
"""Build an error response based on the function."""
@@ -48,6 +46,14 @@ def get_response_pdu_size(self) -> int:
4846
"""Calculate response pdu size."""
4947
return 0
5048

49+
@abstractmethod
50+
def encode(self) -> bytes:
51+
"""Encode the message."""
52+
53+
@abstractmethod
54+
def decode(self, data: bytes) -> None:
55+
"""Decode data part of the message."""
56+
5157

5258
@classmethod
5359
def calculateRtuFrameSize(cls, data: bytes) -> int:
@@ -63,7 +69,6 @@ def calculateRtuFrameSize(cls, data: bytes) -> int:
6369
)
6470

6571

66-
6772
class ModbusExceptions: # pylint: disable=too-few-public-methods
6873
"""An enumeration of the valid modbus exceptions."""
6974

@@ -102,7 +107,8 @@ def __init__(
102107
transaction: int = 0,
103108
skip_encode: bool = False) -> None:
104109
"""Initialize the modbus exception response."""
105-
super().__init__(slave, transaction, skip_encode)
110+
super().__init__()
111+
super().setData(slave, transaction, skip_encode)
106112
self.function_code = function_code | 0x80
107113
self.exception_code = exception_code
108114

pymodbus/pdu/register_read_message.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ def __init__(self, address, count, slave=1, transaction=0, skip_encode=False):
2121
:param count: The number of registers to read
2222
:param slave: Modbus slave slave ID
2323
"""
24-
super().__init__(slave, transaction, skip_encode)
24+
super().__init__()
25+
super().setData(slave, transaction, skip_encode)
2526
self.address = address
2627
self.count = count
2728

@@ -68,7 +69,8 @@ def __init__(self, values, slave=1, transaction=0, skip_encode=False):
6869
:param values: The values to write to
6970
:param slave: Modbus slave slave ID
7071
"""
71-
super().__init__(slave, transaction, skip_encode)
72+
super().__init__()
73+
super().setData(slave, transaction, skip_encode)
7274

7375
#: A list of register values
7476
self.registers = values or []
@@ -263,7 +265,8 @@ def __init__(self, read_address=0x00, read_count=0, write_address=0x00, write_re
263265
:param write_address: The address to start writing to
264266
:param write_registers: The registers to write to the specified address
265267
"""
266-
super().__init__(slave, transaction, skip_encode)
268+
super().__init__()
269+
super().setData(slave, transaction, skip_encode)
267270
self.read_address = read_address
268271
self.read_count = read_count
269272
self.write_address = write_address

0 commit comments

Comments
 (0)