From b38dfe2eab942702b8765ef81fc4c6cd391d9e78 Mon Sep 17 00:00:00 2001 From: Gijs Molenaar Date: Tue, 13 Oct 2026 19:14:24 +0200 Subject: [PATCH] fix: strip space padding from the structured order code The S7-1200/1500 order code field is space padded, and only NUL bytes were stripped, so get_order_code returned "6ES7 212-1BE40-0XB0 " with a trailing space. The flat S7-300 parser already strips both. --- CHANGES.md | 3 +++ snap7/szl.py | 2 +- tests/test_server.py | 14 ++++++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index b9d296c5..6897013a 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -44,6 +44,9 @@ Unreleased block (method `0x12`) that real engineering tools send; both previously used the header of a request without data and an 8-byte parameter block (#942). +* `get_order_code` no longer keeps the trailing space padding of the order code on S7-1200/1500 CPUs, for example + `6ES7 212-1BE40-0XB0 ` is now `6ES7 212-1BE40-0XB0` (#949). + ### Documentation * Add a "Tested and Verified Hardware" section to the PLC support matrix, listing the CPUs, firmware versions and diff --git a/snap7/szl.py b/snap7/szl.py index e540ea61..1d539362 100644 --- a/snap7/szl.py +++ b/snap7/szl.py @@ -104,7 +104,7 @@ def _parse_order_code_structured(data: bytes, record_len: int, ndr: int, order_c if record_id == 0x0001 and record_len >= 22: found_structured = True - order_code.OrderCode = rec[2:22].rstrip(b"\x00") + order_code.OrderCode = rec[2:22].rstrip(b"\x00 ") if record_len >= 26 and not has_0x0007 and (rec[23] != 0 or rec[24] != 0): order_code.V1, order_code.V2, order_code.V3 = rec[23], rec[24], rec[25] diff --git a/tests/test_server.py b/tests/test_server.py index 79e38fbc..ccd8e482 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -857,6 +857,20 @@ def test_parse_order_code_s71516f(self) -> None: self.assertEqual(result.V2, 9) self.assertEqual(result.V3, 2) + def test_parse_order_code_strips_trailing_space(self) -> None: + """The structured MLFB field is space padded on real PLCs; the padding is not part of the order code.""" + from snap7.szl import parse_order_code_szl + from snap7.type import S7SZL + + payload = b"\x00\x1c\x00\x01\x00\x01" + b"6ES7 212-1BE40-0XB0 " + b"\x00\x00\x00\x02\x00\x00" + szl = S7SZL() + szl.Header.LengthDR = len(payload) + for i, b in enumerate(payload): + szl.Data[i] = b + + result = parse_order_code_szl(szl) + self.assertEqual(result.OrderCode, b"6ES7 212-1BE40-0XB0") + def test_parse_order_code_s71510sp(self) -> None: """Parse a real S7-1510SP dump — should use 0x0007 firmware, not 0x0081 boot loader.