Repository navigation
[hardware test]: S7-1200 CPU 1212C V4.7.3, classic S7 — pass (13/13), rerun after #908 #919
Copy link
Copy link
Closed
Labels
hardware-testStructured result from a real PLC acceptance runStructured result from a real PLC acceptance runtest-result: passAll selected applicable real-PLC scenarios passedAll selected applicable real-PLC scenarios passed
Description
Source revision
28bb2c8 (master, 2026-10-04)
Overall result
pass
PLC family, model, and order code
S7-1200, CPU 1212C; order code 6ES7 212-1BE40-0XB0, read by the runner
Firmware and security mode
V4.7.3, PUT/GET enabled, non-optimized fixture DBs (DB1 read-only, DB2 scratch)
Host environment
Python 3.11.2 (CPython), Linux x86_64; pytest-bdd 8.1.0, python-snap7 3.2.1; dependencies from uv sync --extra test
Run time (UTC)
2026-10-04T17:05:53Z (the scratch-write run; a read-only smoke run at 17:05:50Z also passed 5/5)
Sanitized report artifacts
JSON report
{
"ended_at": "2026-10-04T17:05:55.408340+00:00",
"environment": {
"architecture": "x86_64",
"implementation": "CPython",
"os": "Linux",
"os_release": "6.1.0-53-amd64",
"pytest_bdd": "8.1.0",
"python": "3.11.2",
"python_snap7": "3.2.1"
},
"overall_result": "pass",
"plc": {
"cpu_state": "S7CpuStatusRun",
"family": "S7-1200",
"firmware": "4.7.3",
"model": "CPU 1212C",
"order_code": "6ES7 212-1BE40-0XB0 ",
"protocol_path": "classic_s7",
"rack": 0,
"security_mode": "PUT/GET enabled, non-optimized fixture DBs",
"slot": 1,
"tia_configuration": ""
},
"scenarios": [
{
"diagnostic": null,
"duration_seconds": 0.09529815788846463,
"scenario_id": "tests/real_plc/test_acceptance.py::test_establish_and_close_a_session",
"status": "passed",
"tags": [
"classic_s7",
"real_plc",
"smoke"
]
},
{
"diagnostic": null,
"duration_seconds": 0.18189957505092025,
"scenario_id": "tests/real_plc/test_acceptance.py::test_read_the_canonical_fixture",
"status": "passed",
"tags": [
"classic_s7",
"real_plc",
"smoke"
]
},
{
"diagnostic": null,
"duration_seconds": 0.15687081194482744,
"scenario_id": "tests/real_plc/test_acceptance.py::test_read_multiple_values_in_one_request",
"status": "passed",
"tags": [
"classic_s7",
"real_plc",
"smoke"
]
},
{
"diagnostic": null,
"duration_seconds": 0.16853883198928088,
"scenario_id": "tests/real_plc/test_acceptance.py::test_reconnect_after_a_clean_disconnect",
"status": "passed",
"tags": [
"classic_s7",
"real_plc",
"smoke"
]
},
{
"diagnostic": null,
"duration_seconds": 0.18978801602497697,
"scenario_id": "tests/real_plc/test_acceptance.py::test_repeated_operations_do_not_corrupt_the_session",
"status": "passed",
"tags": [
"classic_s7",
"real_plc",
"smoke"
]
},
{
"diagnostic": null,
"duration_seconds": 0.1343038659542799,
"scenario_id": "tests/real_plc/test_acceptance.py::test_roundtrip_a_value_and_restore_the_plc[INT]",
"status": "passed",
"tags": [
"classic_s7",
"real_plc",
"write"
]
},
{
"diagnostic": null,
"duration_seconds": 0.1339357029646635,
"scenario_id": "tests/real_plc/test_acceptance.py::test_roundtrip_a_value_and_restore_the_plc[REAL]",
"status": "passed",
"tags": [
"classic_s7",
"real_plc",
"write"
]
},
{
"diagnostic": null,
"duration_seconds": 0.13321368000470102,
"scenario_id": "tests/real_plc/test_acceptance.py::test_roundtrip_a_value_and_restore_the_plc[BYTE]",
"status": "passed",
"tags": [
"classic_s7",
"real_plc",
"write"
]
},
{
"diagnostic": null,
"duration_seconds": 0.13397326890844852,
"scenario_id": "tests/real_plc/test_acceptance.py::test_roundtrip_a_value_and_restore_the_plc[WORD]",
"status": "passed",
"tags": [
"classic_s7",
"real_plc",
"write"
]
},
{
"diagnostic": null,
"duration_seconds": 0.14829852001275867,
"scenario_id": "tests/real_plc/test_acceptance.py::test_roundtrip_a_value_and_restore_the_plc[DWORD]",
"status": "passed",
"tags": [
"classic_s7",
"real_plc",
"write"
]
},
{
"diagnostic": null,
"duration_seconds": 0.14464689197484404,
"scenario_id": "tests/real_plc/test_acceptance.py::test_roundtrip_a_value_and_restore_the_plc[DINT]",
"status": "passed",
"tags": [
"classic_s7",
"real_plc",
"write"
]
},
{
"diagnostic": null,
"duration_seconds": 0.13274372706655413,
"scenario_id": "tests/real_plc/test_acceptance.py::test_roundtrip_a_value_and_restore_the_plc[CHAR]",
"status": "passed",
"tags": [
"classic_s7",
"real_plc",
"write"
]
},
{
"diagnostic": null,
"duration_seconds": 0.13434770703315735,
"scenario_id": "tests/real_plc/test_acceptance.py::test_roundtrip_a_value_and_restore_the_plc[BOOL]",
"status": "passed",
"tags": [
"classic_s7",
"real_plc",
"write"
]
}
],
"schema_version": "1.0",
"source": {
"commit": "28bb2c89bde92795af76e61ecc201cf61c0f42b1",
"dirty": false,
"kind": "git"
},
"started_at": "2026-10-04T17:05:53.364712+00:00",
"tester": "@russwing"
}JUnit XML
<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="0" failures="0" skipped="0" tests="13" time="2.040" timestamp="2026-10-04T17:05:53.367872+00:00"><testcase classname="tests.real_plc.test_acceptance" name="test_establish_and_close_a_session" time="0.096" /><testcase classname="tests.real_plc.test_acceptance" name="test_read_the_canonical_fixture" time="0.182" /><testcase classname="tests.real_plc.test_acceptance" name="test_read_multiple_values_in_one_request" time="0.157" /><testcase classname="tests.real_plc.test_acceptance" name="test_reconnect_after_a_clean_disconnect" time="0.169" /><testcase classname="tests.real_plc.test_acceptance" name="test_repeated_operations_do_not_corrupt_the_session" time="0.190" /><testcase classname="tests.real_plc.test_acceptance" name="test_roundtrip_a_value_and_restore_the_plc[INT]" time="0.135" /><testcase classname="tests.real_plc.test_acceptance" name="test_roundtrip_a_value_and_restore_the_plc[REAL]" time="0.135" /><testcase classname="tests.real_plc.test_acceptance" name="test_roundtrip_a_value_and_restore_the_plc[BYTE]" time="0.134" /><testcase classname="tests.real_plc.test_acceptance" name="test_roundtrip_a_value_and_restore_the_plc[WORD]" time="0.135" /><testcase classname="tests.real_plc.test_acceptance" name="test_roundtrip_a_value_and_restore_the_plc[DWORD]" time="0.149" /><testcase classname="tests.real_plc.test_acceptance" name="test_roundtrip_a_value_and_restore_the_plc[DINT]" time="0.145" /><testcase classname="tests.real_plc.test_acceptance" name="test_roundtrip_a_value_and_restore_the_plc[CHAR]" time="0.133" /><testcase classname="tests.real_plc.test_acceptance" name="test_roundtrip_a_value_and_restore_the_plc[BOOL]" time="0.135" /></testsuite></testsuites>Skips, failures, and notes
- A rerun of [hardware test]: S7-1200 CPU 1212C V4.7.3, classic S7 — pass (13/13) #907 on the same CPU, after the runner fixes in test: keep PLC and host details out of real-PLC artifacts #908.
- Smoke (read-only): 5/5. Scratch writes (
--allow-write, DB2 only): 8/8 types (INT, REAL, BYTE, WORD, DWORD, DINT, CHAR, BOOL), each restored and read back.--allow-adminoff. - Both fixes hold. The order code is recorded, and the JUnit XML carries no
hostnameand no PLC address, so nothing needed redacting this time. - One small thing: the recorded order code keeps a trailing space (
"6ES7 212-1BE40-0XB0 "). The runner strips NUL bytes and not the space. - DB2 was read whole before and after the write pass: byte-identical (all 38 bytes compared).
- The manual upload and download check from Formalize real-PLC acceptance testing with Gherkin scenarios #840 was not repeated.
Safety confirmation
- I reviewed the attachments and they contain no PLC address, credentials, private keys, plant/site identifiers, or proprietary PLC program.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
hardware-testStructured result from a real PLC acceptance runStructured result from a real PLC acceptance runtest-result: passAll selected applicable real-PLC scenarios passedAll selected applicable real-PLC scenarios passed
Activity
gijzelaerr commentedon Oct 13, 2026
Recorded in the new Tested and Verified Hardware section of the PLC support matrix (#947). Thanks for the runs!