Skip to content

Commit da63fe2

Browse files
committed
Allow sub_function_code is custom PDU.
1 parent b4fd9e7 commit da63fe2

File tree

4 files changed

+17
-5
lines changed

4 files changed

+17
-5
lines changed

pymodbus/pdu/decoders.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,7 @@ def lookupPduClass(self, data: bytes) -> type[ModbusPDU] | None:
2727
if not (pdu := self.pdu_table.get(func_code, (None, None))[self.pdu_inx]):
2828
return None
2929

30-
if func_code == 0x2B: # mei message, sub_function_code is 1 byte
31-
sub_func_code = int(data[2])
32-
elif func_code == 0x08: # diag message, sub_function_code is 2 bytes
33-
sub_func_code = int.from_bytes(data[2:4], "big")
34-
else:
30+
if (sub_func_code := pdu.decode_sub_function_code(data) < 0):
3531
return pdu
3632
return self.pdu_sub_table[func_code].get(sub_func_code, (None, None))[self.pdu_inx]
3733

pymodbus/pdu/diag_message.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ def encode(self) -> bytes:
4444
raise TypeError(f"UNKNOWN DIAG message type: {type(self.message)}")
4545
return packet
4646

47+
def decode_sub_function_code(self, data: bytes) -> int:
48+
"""Decode sub function code (2 bytes)."""
49+
return int.from_bytes(data[2:4], "big")
50+
4751
def decode(self, data: bytes) -> None:
4852
"""Decode a diagnostic request."""
4953
(self.sub_function_code, ) = struct.unpack(">H", data[:2])

pymodbus/pdu/mei_message.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ def encode(self) -> bytes:
5050
)
5151
return packet
5252

53+
def decode_sub_function_code(self, data: bytes) -> int:
54+
"""Decode sub function code (1 byte)."""
55+
return int(data[2])
56+
5357
def decode(self, data: bytes) -> None:
5458
"""Decode data part of the message."""
5559
self.sub_function_code, self.read_code, self.object_id = struct.unpack(">BBB", data[:3])
@@ -134,6 +138,10 @@ def encode(self) -> bytes:
134138
packet += objects
135139
return packet
136140

141+
def decode_sub_function_code(self, data: bytes) -> int:
142+
"""Decode sub function code (1 byte)."""
143+
return int(data[2])
144+
137145
def decode(self, data: bytes) -> None:
138146
"""Decode a the response."""
139147
params = struct.unpack(">BBBBBB", data[0:6])

pymodbus/pdu/pdu.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@ def verifyAddress(self, address: int = -1) -> None:
5858
if not 0 <= address <= 65535:
5959
raise ValueError(f"0 < address {address} < 65535 !")
6060

61+
def decode_sub_function_code(self, data: bytes) -> int:
62+
"""Decode sub function code."""
63+
return -1
64+
6165
def __str__(self) -> str:
6266
"""Build a representation of a Modbus response."""
6367
return (

0 commit comments

Comments
 (0)