FA-92006 / PLC ladder logic scan cycles / Open access
Overload trip resets itself when the contact recloses · case 01
The motor restarts on the next start press after the overload cools, without an operator reset.
ROOT CAUSE
The trip state follows the overload contact directly instead of latching.
VERIFIED REPAIR
Latch the trip on an open overload and clear it only with reset.
Unsuccessful approach: Holding the trip until reset or start still lets a start press clear it.
Case contract
Three-wire motor starter rung evaluated per scan. Each scan is a dict with optional keys start (pushbutton, default false), stop_nc (normally-closed stop contact: true means not pressed, default true), ol_nc (normally-closed overload contact, default true), reset (default false) and power (default true). An open overload contact latches a trip (retentive); reset clears it only on a scan where the overload contact is closed. The motor runs on start or its own seal-in, and only while stop_nc is closed and no trip is latched; stop and trip dominate start. A power-loss scan drops the motor and requires the start button to be seen released before it can start again. Return [motor, tripped] per scan.
Why this case matters
Ladder programs are executed as repeated scans; each defect here changes what a rung, timer, counter or data-table instruction reports on a particular scan, which is how commissioning and field faults are actually observed.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(scans):
motor = False
tripped = False
need_release = False
out = []
for s in scans:
if not s.get('power', True):
motor = False
need_release = True
out.append([False, tripped])
continue
start = s.get('start', False)
if not start:
need_release = False
tripped = not s.get('ol_nc', True)
run_cmd = (start and not need_release) or motor
motor = run_cmd and s.get('stop_nc', True) and not tripped
out.append([motor, tripped])
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: overload trip and reset',
[[{'start': True}, {'ol_nc': False}, {}, {'start': True}, {'reset': True}, {'start': True}]],
[[True, False], [False, True], [False, True], [False, True], [False, False], [True, False]]],
['regression: reset while overload open',
[[{'start': True}, {'ol_nc': False, 'reset': True}, {'start': True}]],
[[True, False], [False, True], [False, True]]],
['control: start seal stop',
[[{'start': True}, {}, {'stop_nc': False}, {}, {'start': True}]],
[[True, False], [True, False], [False, False], [False, False], [True, False]]],
['control: power loss with start held',
[[{'start': True}, {'power': False}, {'start': True}, {}, {'start': True}]],
[[True, False], [False, False], [False, False], [False, False], [True, False]]],
['control: stop and start together',
[[{'start': True, 'stop_nc': False}, {'start': True}, {'start': True, 'stop_nc': False}]],
[[False, False], [True, False], [False, False]]],
['regression: trip across power loss',
[[{'start': True}, {'ol_nc': False}, {'power': False}, {}, {'start': True}]],
[[True, False], [False, True], [False, True], [False, True], [False, True]]],
['regression: start after overload recovers',
[[{'start': True}, {'ol_nc': False}, {}, {'start': True}, {}]],
[[True, False], [False, True], [False, True], [False, True], [False, True]]],
['control: reset while running',
[[{'start': True}, {}, {'reset': True}, {}]],
[[True, False], [True, False], [True, False], [True, False]]]],
[['regression: reset while overload open',
[[{'start': True}, {'ol_nc': False, 'reset': True}, {'start': True}]],
[[True, False], [False, True], [False, True]]],
['regression: trip across power loss',
[[{'start': True}, {'ol_nc': False}, {'power': False}, {}, {'start': True}]],
[[True, False], [False, True], [False, True], [False, True], [False, True]]],
['control: start seal stop',
[[{'start': True}, {}, {'stop_nc': False}, {}, {'start': True}]],
[[True, False], [True, False], [False, False], [False, False], [True, False]]],
['control: power loss with start held',
[[{'start': True}, {'power': False}, {'start': True}, {}, {'start': True}]],
[[True, False], [False, False], [False, False], [False, False], [True, False]]],
['regression: overload trip and reset',
[[{'start': True}, {'ol_nc': False}, {}, {'start': True}, {'reset': True}, {'start': True}]],
[[True, False], [False, True], [False, True], [False, True], [False, False], [True, False]]],
['control: stop and start together',
[[{'start': True, 'stop_nc': False}, {'start': True}, {'start': True, 'stop_nc': False}]],
[[False, False], [True, False], [False, False]]],
['regression: start after overload recovers',
[[{'start': True}, {'ol_nc': False}, {}, {'start': True}, {}]],
[[True, False], [False, True], [False, True], [False, True], [False, True]]],
['control: reset while running',
[[{'start': True}, {}, {'reset': True}, {}]],
[[True, False], [True, False], [True, False], [True, False]]]],
[['regression: trip across power loss',
[[{'start': True}, {'ol_nc': False}, {'power': False}, {}, {'start': True}]],
[[True, False], [False, True], [False, True], [False, True], [False, True]]],
['regression: start after overload recovers',
[[{'start': True}, {'ol_nc': False}, {}, {'start': True}, {}]],
[[True, False], [False, True], [False, True], [False, True], [False, True]]],
['control: start seal stop',
[[{'start': True}, {}, {'stop_nc': False}, {}, {'start': True}]],
[[True, False], [True, False], [False, False], [False, False], [True, False]]],
['control: power loss with start held',
[[{'start': True}, {'power': False}, {'start': True}, {}, {'start': True}]],
[[True, False], [False, False], [False, False], [False, False], [True, False]]],
['regression: overload trip and reset',
[[{'start': True}, {'ol_nc': False}, {}, {'start': True}, {'reset': True}, {'start': True}]],
[[True, False], [False, True], [False, True], [False, True], [False, False], [True, False]]],
['regression: reset while overload open',
[[{'start': True}, {'ol_nc': False, 'reset': True}, {'start': True}]],
[[True, False], [False, True], [False, True]]],
['control: stop and start together',
[[{'start': True, 'stop_nc': False}, {'start': True}, {'start': True, 'stop_nc': False}]],
[[False, False], [True, False], [False, False]]],
['control: reset while running',
[[{'start': True}, {}, {'reset': True}, {}]],
[[True, False], [True, False], [True, False], [True, False]]]],
[['regression: start after overload recovers',
[[{'start': True}, {'ol_nc': False}, {}, {'start': True}, {}]],
[[True, False], [False, True], [False, True], [False, True], [False, True]]],
['regression: scenario 2',
[[{'reset': True},
{'start': False, 'stop_nc': True, 'reset': True},
{'start': False, 'reset': True},
{'ol_nc': False},
{'reset': True},
{},
{'start': False, 'stop_nc': True, 'ol_nc': False, 'reset': True},
{'start': True, 'ol_nc': True},
{'stop_nc': True},
{'reset': True}]],
[[False, False],
[False, False],
[False, False],
[False, True],
[False, False],
[False, False],
[False, True],
[False, True],
[False, True],
[False, False]]],
['control: start seal stop',
[[{'start': True}, {}, {'stop_nc': False}, {}, {'start': True}]],
[[True, False], [True, False], [False, False], [False, False], [True, False]]],
['control: power loss with start held',
[[{'start': True}, {'power': False}, {'start': True}, {}, {'start': True}]],
[[True, False], [False, False], [False, False], [False, False], [True, False]]],
['regression: overload trip and reset',
[[{'start': True}, {'ol_nc': False}, {}, {'start': True}, {'reset': True}, {'start': True}]],
[[True, False], [False, True], [False, True], [False, True], [False, False], [True, False]]],
['regression: reset while overload open',
[[{'start': True}, {'ol_nc': False, 'reset': True}, {'start': True}]],
[[True, False], [False, True], [False, True]]],
['control: stop and start together',
[[{'start': True, 'stop_nc': False}, {'start': True}, {'start': True, 'stop_nc': False}]],
[[False, False], [True, False], [False, False]]],
['regression: trip across power loss',
[[{'start': True}, {'ol_nc': False}, {'power': False}, {}, {'start': True}]],
[[True, False], [False, True], [False, True], [False, True], [False, True]]]],
[['regression: scenario 1',
[[{'start': False, 'stop_nc': False, 'ol_nc': True},
{'start': True},
{'stop_nc': True, 'ol_nc': True},
{'stop_nc': True},
{'start': False},
{},
{},
{},
{'stop_nc': False, 'ol_nc': False},
{'start': False, 'stop_nc': False},
{'start': False}]],
[[False, False],
[True, False],
[True, False],
[True, False],
[True, False],
[True, False],
[True, False],
[True, False],
[False, True],
[False, True],
[False, True]]],
['regression: scenario 7',
[[{'start': True, 'ol_nc': False},
{'stop_nc': False},
{'start': True, 'stop_nc': True},
{'start': False, 'stop_nc': True},
{'ol_nc': False},
{'start': True, 'stop_nc': True, 'reset': True},
{'stop_nc': True}]],
[[False, True], [False, True], [False, True], [False, True], [False, True], [True, False], [True, False]]],
['control: start seal stop',
[[{'start': True}, {}, {'stop_nc': False}, {}, {'start': True}]],
[[True, False], [True, False], [False, False], [False, False], [True, False]]],
['control: power loss with start held',
[[{'start': True}, {'power': False}, {'start': True}, {}, {'start': True}]],
[[True, False], [False, False], [False, False], [False, False], [True, False]]],
['regression: overload trip and reset',
[[{'start': True}, {'ol_nc': False}, {}, {'start': True}, {'reset': True}, {'start': True}]],
[[True, False], [False, True], [False, True], [False, True], [False, False], [True, False]]],
['regression: reset while overload open',
[[{'start': True}, {'ol_nc': False, 'reset': True}, {'start': True}]],
[[True, False], [False, True], [False, True]]],
['control: stop and start together',
[[{'start': True, 'stop_nc': False}, {'start': True}, {'start': True, 'stop_nc': False}]],
[[False, False], [True, False], [False, False]]],
['regression: trip across power loss',
[[{'start': True}, {'ol_nc': False}, {'power': False}, {}, {'start': True}]],
[[True, False], [False, True], [False, True], [False, True], [False, True]]]]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: overload trip and reset | [[True, False], [False, True], [False, False], [True, False], [True, False], [True, False]] | [[True, False], [False, True], [False, True], [False, True], [False, False], [True, False]] | Failed |
| regression: reset while overload open | [[True, False], [False, True], [True, False]] | [[True, False], [False, True], [False, True]] | Failed |
| control: start seal stop | [[True, False], [True, False], [False, False], [False, False], [True, False]] | [[True, False], [True, False], [False, False], [False, False], [True, False]] | Passed |
| control: power loss with start held | [[True, False], [False, False], [False, False], [False, False], [True, False]] | [[True, False], [False, False], [False, False], [False, False], [True, False]] | Passed |
| control: stop and start together | [[False, False], [True, False], [False, False]] | [[False, False], [True, False], [False, False]] | Passed |
| regression: trip across power loss | [[True, False], [False, True], [False, True], [False, False], [True, False]] | [[True, False], [False, True], [False, True], [False, True], [False, True]] | Failed |
| regression: start after overload recovers | [[True, False], [False, True], [False, False], [True, False], [True, False]] | [[True, False], [False, True], [False, True], [False, True], [False, True]] | Failed |
| control: reset while running | [[True, False], [True, False], [True, False], [True, False]] | [[True, False], [True, False], [True, False], [True, False]] | Passed |
SHA-256 / 963eba329dcb91aa325d684533b383b58489910f8027897855872691770dea6e
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(scans):
motor = False
tripped = False
need_release = False
out = []
for s in scans:
if not s.get('power', True):
motor = False
need_release = True
out.append([False, tripped])
continue
start = s.get('start', False)
if not start:
need_release = False
tripped = not s.get('ol_nc', True) or (tripped and not s.get('reset', False) and not start)
run_cmd = (start and not need_release) or motor
motor = run_cmd and s.get('stop_nc', True) and not tripped
out.append([motor, tripped])
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: overload trip and reset',
[[{'start': True}, {'ol_nc': False}, {}, {'start': True}, {'reset': True}, {'start': True}]],
[[True, False], [False, True], [False, True], [False, True], [False, False], [True, False]]],
['regression: reset while overload open',
[[{'start': True}, {'ol_nc': False, 'reset': True}, {'start': True}]],
[[True, False], [False, True], [False, True]]],
['control: start seal stop',
[[{'start': True}, {}, {'stop_nc': False}, {}, {'start': True}]],
[[True, False], [True, False], [False, False], [False, False], [True, False]]],
['control: power loss with start held',
[[{'start': True}, {'power': False}, {'start': True}, {}, {'start': True}]],
[[True, False], [False, False], [False, False], [False, False], [True, False]]],
['control: stop and start together',
[[{'start': True, 'stop_nc': False}, {'start': True}, {'start': True, 'stop_nc': False}]],
[[False, False], [True, False], [False, False]]],
['regression: trip across power loss',
[[{'start': True}, {'ol_nc': False}, {'power': False}, {}, {'start': True}]],
[[True, False], [False, True], [False, True], [False, True], [False, True]]],
['regression: start after overload recovers',
[[{'start': True}, {'ol_nc': False}, {}, {'start': True}, {}]],
[[True, False], [False, True], [False, True], [False, True], [False, True]]],
['control: reset while running',
[[{'start': True}, {}, {'reset': True}, {}]],
[[True, False], [True, False], [True, False], [True, False]]]],
[['regression: reset while overload open',
[[{'start': True}, {'ol_nc': False, 'reset': True}, {'start': True}]],
[[True, False], [False, True], [False, True]]],
['regression: trip across power loss',
[[{'start': True}, {'ol_nc': False}, {'power': False}, {}, {'start': True}]],
[[True, False], [False, True], [False, True], [False, True], [False, True]]],
['control: start seal stop',
[[{'start': True}, {}, {'stop_nc': False}, {}, {'start': True}]],
[[True, False], [True, False], [False, False], [False, False], [True, False]]],
['control: power loss with start held',
[[{'start': True}, {'power': False}, {'start': True}, {}, {'start': True}]],
[[True, False], [False, False], [False, False], [False, False], [True, False]]],
['regression: overload trip and reset',
[[{'start': True}, {'ol_nc': False}, {}, {'start': True}, {'reset': True}, {'start': True}]],
[[True, False], [False, True], [False, True], [False, True], [False, False], [True, False]]],
['control: stop and start together',
[[{'start': True, 'stop_nc': False}, {'start': True}, {'start': True, 'stop_nc': False}]],
[[False, False], [True, False], [False, False]]],
['regression: start after overload recovers',
[[{'start': True}, {'ol_nc': False}, {}, {'start': True}, {}]],
[[True, False], [False, True], [False, True], [False, True], [False, True]]],
['control: reset while running',
[[{'start': True}, {}, {'reset': True}, {}]],
[[True, False], [True, False], [True, False], [True, False]]]],
[['regression: trip across power loss',
[[{'start': True}, {'ol_nc': False}, {'power': False}, {}, {'start': True}]],
[[True, False], [False, True], [False, True], [False, True], [False, True]]],
['regression: start after overload recovers',
[[{'start': True}, {'ol_nc': False}, {}, {'start': True}, {}]],
[[True, False], [False, True], [False, True], [False, True], [False, True]]],
['control: start seal stop',
[[{'start': True}, {}, {'stop_nc': False}, {}, {'start': True}]],
[[True, False], [True, False], [False, False], [False, False], [True, False]]],
['control: power loss with start held',
[[{'start': True}, {'power': False}, {'start': True}, {}, {'start': True}]],
[[True, False], [False, False], [False, False], [False, False], [True, False]]],
['regression: overload trip and reset',
[[{'start': True}, {'ol_nc': False}, {}, {'start': True}, {'reset': True}, {'start': True}]],
[[True, False], [False, True], [False, True], [False, True], [False, False], [True, False]]],
['regression: reset while overload open',
[[{'start': True}, {'ol_nc': False, 'reset': True}, {'start': True}]],
[[True, False], [False, True], [False, True]]],
['control: stop and start together',
[[{'start': True, 'stop_nc': False}, {'start': True}, {'start': True, 'stop_nc': False}]],
[[False, False], [True, False], [False, False]]],
['control: reset while running',
[[{'start': True}, {}, {'reset': True}, {}]],
[[True, False], [True, False], [True, False], [True, False]]]],
[['regression: start after overload recovers',
[[{'start': True}, {'ol_nc': False}, {}, {'start': True}, {}]],
[[True, False], [False, True], [False, True], [False, True], [False, True]]],
['regression: scenario 2',
[[{'reset': True},
{'start': False, 'stop_nc': True, 'reset': True},
{'start': False, 'reset': True},
{'ol_nc': False},
{'reset': True},
{},
{'start': False, 'stop_nc': True, 'ol_nc': False, 'reset': True},
{'start': True, 'ol_nc': True},
{'stop_nc': True},
{'reset': True}]],
[[False, False],
[False, False],
[False, False],
[False, True],
[False, False],
[False, False],
[False, True],
[False, True],
[False, True],
[False, False]]],
['control: start seal stop',
[[{'start': True}, {}, {'stop_nc': False}, {}, {'start': True}]],
[[True, False], [True, False], [False, False], [False, False], [True, False]]],
['control: power loss with start held',
[[{'start': True}, {'power': False}, {'start': True}, {}, {'start': True}]],
[[True, False], [False, False], [False, False], [False, False], [True, False]]],
['regression: overload trip and reset',
[[{'start': True}, {'ol_nc': False}, {}, {'start': True}, {'reset': True}, {'start': True}]],
[[True, False], [False, True], [False, True], [False, True], [False, False], [True, False]]],
['regression: reset while overload open',
[[{'start': True}, {'ol_nc': False, 'reset': True}, {'start': True}]],
[[True, False], [False, True], [False, True]]],
['control: stop and start together',
[[{'start': True, 'stop_nc': False}, {'start': True}, {'start': True, 'stop_nc': False}]],
[[False, False], [True, False], [False, False]]],
['regression: trip across power loss',
[[{'start': True}, {'ol_nc': False}, {'power': False}, {}, {'start': True}]],
[[True, False], [False, True], [False, True], [False, True], [False, True]]]],
[['regression: scenario 1',
[[{'start': False, 'stop_nc': False, 'ol_nc': True},
{'start': True},
{'stop_nc': True, 'ol_nc': True},
{'stop_nc': True},
{'start': False},
{},
{},
{},
{'stop_nc': False, 'ol_nc': False},
{'start': False, 'stop_nc': False},
{'start': False}]],
[[False, False],
[True, False],
[True, False],
[True, False],
[True, False],
[True, False],
[True, False],
[True, False],
[False, True],
[False, True],
[False, True]]],
['regression: scenario 7',
[[{'start': True, 'ol_nc': False},
{'stop_nc': False},
{'start': True, 'stop_nc': True},
{'start': False, 'stop_nc': True},
{'ol_nc': False},
{'start': True, 'stop_nc': True, 'reset': True},
{'stop_nc': True}]],
[[False, True], [False, True], [False, True], [False, True], [False, True], [True, False], [True, False]]],
['control: start seal stop',
[[{'start': True}, {}, {'stop_nc': False}, {}, {'start': True}]],
[[True, False], [True, False], [False, False], [False, False], [True, False]]],
['control: power loss with start held',
[[{'start': True}, {'power': False}, {'start': True}, {}, {'start': True}]],
[[True, False], [False, False], [False, False], [False, False], [True, False]]],
['regression: overload trip and reset',
[[{'start': True}, {'ol_nc': False}, {}, {'start': True}, {'reset': True}, {'start': True}]],
[[True, False], [False, True], [False, True], [False, True], [False, False], [True, False]]],
['regression: reset while overload open',
[[{'start': True}, {'ol_nc': False, 'reset': True}, {'start': True}]],
[[True, False], [False, True], [False, True]]],
['control: stop and start together',
[[{'start': True, 'stop_nc': False}, {'start': True}, {'start': True, 'stop_nc': False}]],
[[False, False], [True, False], [False, False]]],
['regression: trip across power loss',
[[{'start': True}, {'ol_nc': False}, {'power': False}, {}, {'start': True}]],
[[True, False], [False, True], [False, True], [False, True], [False, True]]]]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: overload trip and reset | [[True, False], [False, True], [False, True], [True, False], [True, False], [True, False]] | [[True, False], [False, True], [False, True], [False, True], [False, False], [True, False]] | Failed |
| regression: reset while overload open | [[True, False], [False, True], [True, False]] | [[True, False], [False, True], [False, True]] | Failed |
| control: start seal stop | [[True, False], [True, False], [False, False], [False, False], [True, False]] | [[True, False], [True, False], [False, False], [False, False], [True, False]] | Passed |
| control: power loss with start held | [[True, False], [False, False], [False, False], [False, False], [True, False]] | [[True, False], [False, False], [False, False], [False, False], [True, False]] | Passed |
| control: stop and start together | [[False, False], [True, False], [False, False]] | [[False, False], [True, False], [False, False]] | Passed |
| regression: trip across power loss | [[True, False], [False, True], [False, True], [False, True], [True, False]] | [[True, False], [False, True], [False, True], [False, True], [False, True]] | Failed |
| regression: start after overload recovers | [[True, False], [False, True], [False, True], [True, False], [True, False]] | [[True, False], [False, True], [False, True], [False, True], [False, True]] | Failed |
| control: reset while running | [[True, False], [True, False], [True, False], [True, False]] | [[True, False], [True, False], [True, False], [True, False]] | Passed |
SHA-256 / 7cb8172c261e9532ec4a74aa9896c5beb1f1d2dbbcce380b36fb5d9eaebe43f9
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(scans):
motor = False
tripped = False
need_release = False
out = []
for s in scans:
if not s.get('power', True):
motor = False
need_release = True
out.append([False, tripped])
continue
start = s.get('start', False)
if not start:
need_release = False
if not s.get('ol_nc', True):
tripped = True
elif s.get('reset', False):
tripped = False
run_cmd = (start and not need_release) or motor
motor = run_cmd and s.get('stop_nc', True) and not tripped
out.append([motor, tripped])
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: overload trip and reset',
[[{'start': True}, {'ol_nc': False}, {}, {'start': True}, {'reset': True}, {'start': True}]],
[[True, False], [False, True], [False, True], [False, True], [False, False], [True, False]]],
['regression: reset while overload open',
[[{'start': True}, {'ol_nc': False, 'reset': True}, {'start': True}]],
[[True, False], [False, True], [False, True]]],
['control: start seal stop',
[[{'start': True}, {}, {'stop_nc': False}, {}, {'start': True}]],
[[True, False], [True, False], [False, False], [False, False], [True, False]]],
['control: power loss with start held',
[[{'start': True}, {'power': False}, {'start': True}, {}, {'start': True}]],
[[True, False], [False, False], [False, False], [False, False], [True, False]]],
['control: stop and start together',
[[{'start': True, 'stop_nc': False}, {'start': True}, {'start': True, 'stop_nc': False}]],
[[False, False], [True, False], [False, False]]],
['regression: trip across power loss',
[[{'start': True}, {'ol_nc': False}, {'power': False}, {}, {'start': True}]],
[[True, False], [False, True], [False, True], [False, True], [False, True]]],
['regression: start after overload recovers',
[[{'start': True}, {'ol_nc': False}, {}, {'start': True}, {}]],
[[True, False], [False, True], [False, True], [False, True], [False, True]]],
['control: reset while running',
[[{'start': True}, {}, {'reset': True}, {}]],
[[True, False], [True, False], [True, False], [True, False]]]],
[['regression: reset while overload open',
[[{'start': True}, {'ol_nc': False, 'reset': True}, {'start': True}]],
[[True, False], [False, True], [False, True]]],
['regression: trip across power loss',
[[{'start': True}, {'ol_nc': False}, {'power': False}, {}, {'start': True}]],
[[True, False], [False, True], [False, True], [False, True], [False, True]]],
['control: start seal stop',
[[{'start': True}, {}, {'stop_nc': False}, {}, {'start': True}]],
[[True, False], [True, False], [False, False], [False, False], [True, False]]],
['control: power loss with start held',
[[{'start': True}, {'power': False}, {'start': True}, {}, {'start': True}]],
[[True, False], [False, False], [False, False], [False, False], [True, False]]],
['regression: overload trip and reset',
[[{'start': True}, {'ol_nc': False}, {}, {'start': True}, {'reset': True}, {'start': True}]],
[[True, False], [False, True], [False, True], [False, True], [False, False], [True, False]]],
['control: stop and start together',
[[{'start': True, 'stop_nc': False}, {'start': True}, {'start': True, 'stop_nc': False}]],
[[False, False], [True, False], [False, False]]],
['regression: start after overload recovers',
[[{'start': True}, {'ol_nc': False}, {}, {'start': True}, {}]],
[[True, False], [False, True], [False, True], [False, True], [False, True]]],
['control: reset while running',
[[{'start': True}, {}, {'reset': True}, {}]],
[[True, False], [True, False], [True, False], [True, False]]]],
[['regression: trip across power loss',
[[{'start': True}, {'ol_nc': False}, {'power': False}, {}, {'start': True}]],
[[True, False], [False, True], [False, True], [False, True], [False, True]]],
['regression: start after overload recovers',
[[{'start': True}, {'ol_nc': False}, {}, {'start': True}, {}]],
[[True, False], [False, True], [False, True], [False, True], [False, True]]],
['control: start seal stop',
[[{'start': True}, {}, {'stop_nc': False}, {}, {'start': True}]],
[[True, False], [True, False], [False, False], [False, False], [True, False]]],
['control: power loss with start held',
[[{'start': True}, {'power': False}, {'start': True}, {}, {'start': True}]],
[[True, False], [False, False], [False, False], [False, False], [True, False]]],
['regression: overload trip and reset',
[[{'start': True}, {'ol_nc': False}, {}, {'start': True}, {'reset': True}, {'start': True}]],
[[True, False], [False, True], [False, True], [False, True], [False, False], [True, False]]],
['regression: reset while overload open',
[[{'start': True}, {'ol_nc': False, 'reset': True}, {'start': True}]],
[[True, False], [False, True], [False, True]]],
['control: stop and start together',
[[{'start': True, 'stop_nc': False}, {'start': True}, {'start': True, 'stop_nc': False}]],
[[False, False], [True, False], [False, False]]],
['control: reset while running',
[[{'start': True}, {}, {'reset': True}, {}]],
[[True, False], [True, False], [True, False], [True, False]]]],
[['regression: start after overload recovers',
[[{'start': True}, {'ol_nc': False}, {}, {'start': True}, {}]],
[[True, False], [False, True], [False, True], [False, True], [False, True]]],
['regression: scenario 2',
[[{'reset': True},
{'start': False, 'stop_nc': True, 'reset': True},
{'start': False, 'reset': True},
{'ol_nc': False},
{'reset': True},
{},
{'start': False, 'stop_nc': True, 'ol_nc': False, 'reset': True},
{'start': True, 'ol_nc': True},
{'stop_nc': True},
{'reset': True}]],
[[False, False],
[False, False],
[False, False],
[False, True],
[False, False],
[False, False],
[False, True],
[False, True],
[False, True],
[False, False]]],
['control: start seal stop',
[[{'start': True}, {}, {'stop_nc': False}, {}, {'start': True}]],
[[True, False], [True, False], [False, False], [False, False], [True, False]]],
['control: power loss with start held',
[[{'start': True}, {'power': False}, {'start': True}, {}, {'start': True}]],
[[True, False], [False, False], [False, False], [False, False], [True, False]]],
['regression: overload trip and reset',
[[{'start': True}, {'ol_nc': False}, {}, {'start': True}, {'reset': True}, {'start': True}]],
[[True, False], [False, True], [False, True], [False, True], [False, False], [True, False]]],
['regression: reset while overload open',
[[{'start': True}, {'ol_nc': False, 'reset': True}, {'start': True}]],
[[True, False], [False, True], [False, True]]],
['control: stop and start together',
[[{'start': True, 'stop_nc': False}, {'start': True}, {'start': True, 'stop_nc': False}]],
[[False, False], [True, False], [False, False]]],
['regression: trip across power loss',
[[{'start': True}, {'ol_nc': False}, {'power': False}, {}, {'start': True}]],
[[True, False], [False, True], [False, True], [False, True], [False, True]]]],
[['regression: scenario 1',
[[{'start': False, 'stop_nc': False, 'ol_nc': True},
{'start': True},
{'stop_nc': True, 'ol_nc': True},
{'stop_nc': True},
{'start': False},
{},
{},
{},
{'stop_nc': False, 'ol_nc': False},
{'start': False, 'stop_nc': False},
{'start': False}]],
[[False, False],
[True, False],
[True, False],
[True, False],
[True, False],
[True, False],
[True, False],
[True, False],
[False, True],
[False, True],
[False, True]]],
['regression: scenario 7',
[[{'start': True, 'ol_nc': False},
{'stop_nc': False},
{'start': True, 'stop_nc': True},
{'start': False, 'stop_nc': True},
{'ol_nc': False},
{'start': True, 'stop_nc': True, 'reset': True},
{'stop_nc': True}]],
[[False, True], [False, True], [False, True], [False, True], [False, True], [True, False], [True, False]]],
['control: start seal stop',
[[{'start': True}, {}, {'stop_nc': False}, {}, {'start': True}]],
[[True, False], [True, False], [False, False], [False, False], [True, False]]],
['control: power loss with start held',
[[{'start': True}, {'power': False}, {'start': True}, {}, {'start': True}]],
[[True, False], [False, False], [False, False], [False, False], [True, False]]],
['regression: overload trip and reset',
[[{'start': True}, {'ol_nc': False}, {}, {'start': True}, {'reset': True}, {'start': True}]],
[[True, False], [False, True], [False, True], [False, True], [False, False], [True, False]]],
['regression: reset while overload open',
[[{'start': True}, {'ol_nc': False, 'reset': True}, {'start': True}]],
[[True, False], [False, True], [False, True]]],
['control: stop and start together',
[[{'start': True, 'stop_nc': False}, {'start': True}, {'start': True, 'stop_nc': False}]],
[[False, False], [True, False], [False, False]]],
['regression: trip across power loss',
[[{'start': True}, {'ol_nc': False}, {'power': False}, {}, {'start': True}]],
[[True, False], [False, True], [False, True], [False, True], [False, True]]]]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: overload trip and reset | [[True, False], [False, True], [False, True], [False, True], [False, False], [True, False]] | [[True, False], [False, True], [False, True], [False, True], [False, False], [True, False]] | Passed |
| regression: reset while overload open | [[True, False], [False, True], [False, True]] | [[True, False], [False, True], [False, True]] | Passed |
| control: start seal stop | [[True, False], [True, False], [False, False], [False, False], [True, False]] | [[True, False], [True, False], [False, False], [False, False], [True, False]] | Passed |
| control: power loss with start held | [[True, False], [False, False], [False, False], [False, False], [True, False]] | [[True, False], [False, False], [False, False], [False, False], [True, False]] | Passed |
| control: stop and start together | [[False, False], [True, False], [False, False]] | [[False, False], [True, False], [False, False]] | Passed |
| regression: trip across power loss | [[True, False], [False, True], [False, True], [False, True], [False, True]] | [[True, False], [False, True], [False, True], [False, True], [False, True]] | Passed |
| regression: start after overload recovers | [[True, False], [False, True], [False, True], [False, True], [False, True]] | [[True, False], [False, True], [False, True], [False, True], [False, True]] | Passed |
| control: reset while running | [[True, False], [True, False], [True, False], [True, False]] | [[True, False], [True, False], [True, False], [True, False]] | Passed |
SHA-256 / a5e5cbcff74b0c9c7fb2bdc788d8110b174b84b0ed4bb2589711151da439ec2b
Verification & scope
A deterministic bounded teaching model of one PLC instruction or rung pattern evaluated scan by scan. The stated contract is a stipulated toy convention, not a claim of conformance to any vendor controller or IEC 61131-3 runtime. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.
Observations recorded using Python 3.12.14 at 2026-09-29T14:51:41.678284+00:00.
Case digest / acb916f4c3b46e281a01ecae6e272bc1e0f4772890d4b202a03c2d417ef77297