Skip to content

Commit aa7e556

Browse files
authored
Fix encoding & decoding of ReadFileRecordResponse (#2319)
1 parent 4f794f4 commit aa7e556

File tree

2 files changed

+16
-8
lines changed

2 files changed

+16
-8
lines changed

pymodbus/pdu/file_message.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ def encode(self):
170170
total = sum(record.response_length + 1 for record in self.records)
171171
packet = struct.pack("B", total)
172172
for record in self.records:
173-
packet += struct.pack(">BB", record.record_length, 0x06)
173+
packet += struct.pack(">BB", record.response_length, 0x06)
174174
packet += record.record_data
175175
return packet
176176

@@ -185,11 +185,14 @@ def decode(self, data):
185185
response_length, reference_type = struct.unpack(
186186
">BB", data[count : count + 2]
187187
)
188-
count += response_length + 1 # the count is not included
188+
count += 2
189+
190+
record_length = response_length - 1 # response length includes the type byte
189191
record = FileRecord(
190192
response_length=response_length,
191-
record_data=data[count - response_length + 1 : count],
193+
record_data=data[count : count + record_length],
192194
)
195+
count += record_length
193196
if reference_type == 0x06:
194197
self.records.append(record)
195198

test/test_file_message.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -163,17 +163,22 @@ def test_read_file_record_response_encode(self):
163163
records = [FileRecord(record_data=b"\x00\x01\x02\x03\x04\x05")]
164164
handle = ReadFileRecordResponse(records)
165165
result = handle.encode()
166-
assert result == b"\x08\x03\x06\x00\x01\x02\x03\x04\x05"
166+
assert result == b"\x08\x07\x06\x00\x01\x02\x03\x04\x05"
167167

168168
def test_read_file_record_response_decode(self):
169169
"""Test basic bit message encoding/decoding."""
170-
record = FileRecord(
170+
record1 = FileRecord(
171171
file_number=0x00, record_number=0x00, record_data=b"\x0d\xfe\x00\x20"
172172
)
173-
request = b"\x0c\x05\x06\x0d\xfe\x00\x20\x05\x05\x06\x33\xcd\x00\x40"
173+
record2 = FileRecord(
174+
file_number=0x00, record_number=0x00, record_data=b"\x33\xcd\x00\x40"
175+
)
176+
response = b"\x0c\x05\x06\x0d\xfe\x00\x20\x05\x06\x33\xcd\x00\x40"
174177
handle = ReadFileRecordResponse()
175-
handle.decode(request)
176-
assert handle.records[0] == record
178+
handle.decode(response)
179+
180+
assert handle.records[0] == record1
181+
assert handle.records[1] == record2
177182

178183
def test_read_file_record_response_rtu_frame_size(self):
179184
"""Test basic bit message encoding/decoding."""

0 commit comments

Comments
 (0)