@@ -23,7 +23,7 @@ def x_calculateRtuFrameSize(cls, data: bytes) -> int:
2323 """Calculate the size of a PDU."""
2424 return 8
2525
26- def encode (self ) -> bytes :
26+ def x_encode (self ) -> bytes :
2727 """Encode a request pdu."""
2828 self .verifyCount (self .MAX_COUNT )
2929 self .verifyAddress ()
@@ -43,20 +43,49 @@ async def datastore_update(
4343 )
4444 if isinstance (values , ExcCodes ):
4545 return ExceptionResponse (self .function_code , values )
46- response_class = (
47- ReadCoilsResponse if self .function_code == 1 else ReadDiscreteInputsResponse
48- )
49- return response_class (
46+ return ReadCoilsResponse (
5047 dev_id = self .dev_id ,
5148 transaction_id = self .transaction_id ,
5249 bits = cast (list [bool ], values ),
5350 )
5451
5552
56- class ReadDiscreteInputsRequest (ReadCoilsRequest ):
53+ class ReadDiscreteInputsRequest (ModbusPDU ):
5754 """ReadDiscreteInputsRequest."""
5855
5956 function_code = 2
57+ MAX_COUNT = 2000
58+
59+ @classmethod
60+ def x_calculateRtuFrameSize (cls , data : bytes ) -> int :
61+ """Calculate the size of a PDU."""
62+ return 8
63+
64+ def x_encode (self ) -> bytes :
65+ """Encode a request pdu."""
66+ self .verifyCount (self .MAX_COUNT )
67+ self .verifyAddress ()
68+ return struct .pack (">HH" , self .address , self .count )
69+
70+ def x_decode (self , data : bytes ) -> None :
71+ """Decode a request pdu."""
72+ self .address , self .count = struct .unpack (">HH" , data [:4 ])
73+ self .verifyCount (self .MAX_COUNT )
74+
75+ async def datastore_update (
76+ self , context : ModbusServerContext , device_id : int
77+ ) -> ModbusPDU :
78+ """Run request against a datastore."""
79+ values = await context .async_getValues (
80+ device_id , self .function_code , self .address , self .count
81+ )
82+ if isinstance (values , ExcCodes ):
83+ return ExceptionResponse (self .function_code , values )
84+ return ReadDiscreteInputsResponse (
85+ dev_id = self .dev_id ,
86+ transaction_id = self .transaction_id ,
87+ bits = cast (list [bool ], values ),
88+ )
6089
6190
6291class ReadCoilsResponse (ModbusPDU ):
@@ -69,7 +98,7 @@ def x_calculateRtuFrameSize(cls, data: bytes) -> int:
6998 """Calculate the size of a PDU."""
7099 return int (data [2 ]) + 2 + 3
71100
72- def encode (self ) -> bytes :
101+ def x_encode (self ) -> bytes :
73102 """Encode response pdu."""
74103 result = pack_bitstring (self .bits )
75104 return struct .pack (">B" , len (result )) + result
@@ -79,11 +108,25 @@ def x_decode(self, data: bytes) -> None:
79108 self .bits = unpack_bitstring (data [1 :])
80109
81110
82- class ReadDiscreteInputsResponse (ReadCoilsResponse ):
111+ class ReadDiscreteInputsResponse (ModbusPDU ):
83112 """ReadDiscreteInputsResponse."""
84113
85114 function_code = 2
86115
116+ @classmethod
117+ def x_calculateRtuFrameSize (cls , data : bytes ) -> int :
118+ """Calculate the size of a PDU."""
119+ return int (data [2 ]) + 2 + 3
120+
121+ def x_encode (self ) -> bytes :
122+ """Encode response pdu."""
123+ result = pack_bitstring (self .bits )
124+ return struct .pack (">B" , len (result )) + result
125+
126+ def x_decode (self , data : bytes ) -> None :
127+ """Decode response pdu."""
128+ self .bits = unpack_bitstring (data [1 :])
129+
87130
88131class WriteSingleCoilResponse (ModbusPDU ):
89132 """WriteSingleCoilResponse."""
@@ -95,7 +138,7 @@ def x_calculateRtuFrameSize(cls, data: bytes) -> int:
95138 """Calculate the size of a PDU."""
96139 return 8
97140
98- def encode (self ) -> bytes :
141+ def x_encode (self ) -> bytes :
99142 """Encode write coil request."""
100143 self .verifyAddress ()
101144 val = ModbusStatus .ON if self .bits [0 ] else ModbusStatus .OFF
@@ -107,9 +150,27 @@ def x_decode(self, data: bytes) -> None:
107150 self .bits = [bool (value )]
108151
109152
110- class WriteSingleCoilRequest (WriteSingleCoilResponse ):
153+ class WriteSingleCoilRequest (ModbusPDU ):
111154 """WriteSingleCoilRequest."""
112155
156+ function_code = 5
157+
158+ @classmethod
159+ def x_calculateRtuFrameSize (cls , data : bytes ) -> int :
160+ """Calculate the size of a PDU."""
161+ return 8
162+
163+ def x_encode (self ) -> bytes :
164+ """Encode write coil request."""
165+ self .verifyAddress ()
166+ val = ModbusStatus .ON if self .bits [0 ] else ModbusStatus .OFF
167+ return struct .pack (">HH" , self .address , val )
168+
169+ def x_decode (self , data : bytes ) -> None :
170+ """Decode a write coil request."""
171+ self .address , value = struct .unpack (">HH" , data [:4 ])
172+ self .bits = [bool (value )]
173+
113174 async def datastore_update (
114175 self , context : ModbusServerContext , device_id : int
115176 ) -> ModbusPDU :
@@ -163,7 +224,7 @@ def __init__(
163224 self .byte_count = None
164225 self .data_byte_count = 0
165226
166- def encode (self ) -> bytes :
227+ def x_encode (self ) -> bytes :
167228 """Encode write coils request."""
168229 self .count = len (self .bits )
169230 self .verifyAddress ()
@@ -219,7 +280,7 @@ def x_calculateRtuFrameSize(cls, data: bytes) -> int:
219280 """Calculate the size of a PDU."""
220281 return 8
221282
222- def encode (self ) -> bytes :
283+ def x_encode (self ) -> bytes :
223284 """Encode write coils response."""
224285 return struct .pack (">HH" , self .address , self .count )
225286
0 commit comments