FA-92191 / PLC ladder logic scan cycles / Open access
Alarm on-delay counts non-consecutive true scans · case 01
A chattering signal raises the alarm although it was never true for the required consecutive scans.
ROOT CAUSE
The duration counter holds its value on false scans instead of restarting.
VERIFIED REPAIR
Reset the duration counter whenever the condition is false.
Unsuccessful approach: Decrementing the counter on false scans still accumulates a chattering signal.
Case contract
Digital alarm instruction evaluated per scan; scans is a list of [condition, ack, reset], min_scans >= 1. The alarm activates when the condition has been true for min_scans consecutive scans; activation clears the acknowledged flag. A non-latched alarm clears when the condition goes false; a latched alarm clears only on a reset while the condition is false. ack sets acknowledged. Return [in_alarm, acknowledged] 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(min_scans, latched, scans):
in_alarm = False
acked = True
count = 0
out = []
for cond, ack, reset in scans:
count = count + 1 if cond else count
if count >= min_scans and cond and not in_alarm:
in_alarm = True
acked = False
elif in_alarm and not cond and (not latched or reset):
in_alarm = False
if ack and not acked:
acked = True
out.append([in_alarm, acked])
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: latched with ack and reset',
[2,
True,
[[True, False, False],
[True, False, False],
[False, False, False],
[False, True, False],
[False, False, True],
[True, False, False]]],
[[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]]],
['regression: chattering condition',
[3,
False,
[[True, False, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, False, False],
[True, False, False]]],
[[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]]],
['control: realarm after ack',
[1, False, [[True, False, False], [True, True, False], [False, False, False], [True, False, False]]],
[[True, False], [True, True], [False, True], [True, False]]],
['control: reset while condition true',
[1, False, [[True, False, False], [True, False, True], [True, False, False]]],
[[True, False], [True, False], [True, False]]],
['control: ack on latched alarm',
[1, True, [[True, False, False], [False, True, False], [False, False, False], [False, False, True]]],
[[True, False], [True, True], [True, True], [False, True]]],
['control: scenario 1',
[1,
False,
[[True, False, False],
[False, False, False],
[True, False, False],
[False, False, False],
[True, True, False],
[True, False, False],
[True, False, False],
[False, False, False],
[False, False, False],
[True, False, False]]],
[[True, False],
[False, False],
[True, False],
[False, False],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, False]]],
['control: scenario 2',
[1,
True,
[[False, False, False],
[True, False, False],
[True, False, False],
[False, False, False],
[False, False, False],
[True, False, False],
[False, False, False],
[False, False, True],
[False, False, False],
[False, True, False],
[True, False, False],
[False, False, False]]],
[[False, True],
[True, False],
[True, False],
[True, False],
[True, False],
[True, False],
[True, False],
[False, False],
[False, False],
[False, True],
[True, False],
[True, False]]],
['regression: scenario 3',
[3,
False,
[[True, False, False],
[True, False, True],
[False, False, False],
[False, False, False],
[False, False, True],
[True, False, False],
[True, True, False],
[False, True, False],
[False, False, False],
[True, False, False],
[True, False, False],
[True, False, False]]],
[[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, False]]]],
[['regression: chattering condition',
[3,
False,
[[True, False, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, False, False],
[True, False, False]]],
[[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]]],
['regression: scenario 12',
[2,
False,
[[False, False, True],
[False, False, False],
[False, False, False],
[True, False, False],
[True, True, True],
[True, False, True],
[False, False, True],
[False, False, False],
[True, False, False],
[True, False, False],
[True, True, False]]],
[[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, False],
[True, True]]],
['regression: latched with ack and reset',
[2,
True,
[[True, False, False],
[True, False, False],
[False, False, False],
[False, True, False],
[False, False, True],
[True, False, False]]],
[[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]]],
['control: realarm after ack',
[1, False, [[True, False, False], [True, True, False], [False, False, False], [True, False, False]]],
[[True, False], [True, True], [False, True], [True, False]]],
['control: reset while condition true',
[1, False, [[True, False, False], [True, False, True], [True, False, False]]],
[[True, False], [True, False], [True, False]]],
['control: ack on latched alarm',
[1, True, [[True, False, False], [False, True, False], [False, False, False], [False, False, True]]],
[[True, False], [True, True], [True, True], [False, True]]],
['control: scenario 1',
[1,
False,
[[False, False, False],
[False, False, True],
[False, False, False],
[True, True, False],
[False, False, False],
[True, True, False],
[True, False, False],
[True, False, False],
[True, False, False],
[False, False, True],
[True, False, False]]],
[[False, True],
[False, True],
[False, True],
[True, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[True, False]]],
['regression: scenario 2',
[3,
False,
[[False, False, False],
[True, False, False],
[False, False, False],
[False, False, False],
[False, False, True],
[False, True, False],
[True, False, False],
[False, False, False],
[True, True, False],
[True, False, False],
[True, False, False]]],
[[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, False]]]],
[['regression: scenario 1',
[3,
False,
[[True, False, False],
[True, False, False],
[True, False, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, False, False],
[True, False, False],
[False, False, True],
[False, False, True]]],
[[False, True],
[False, True],
[True, False],
[True, False],
[False, False],
[False, False],
[False, False],
[True, False],
[False, False],
[False, False]]],
['regression: scenario 8',
[2,
False,
[[True, False, False],
[True, False, False],
[False, False, False],
[False, False, False],
[False, False, False],
[False, False, False],
[False, False, False],
[True, False, False],
[True, True, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, False, False]]],
[[False, True],
[True, False],
[False, False],
[False, False],
[False, False],
[False, False],
[False, False],
[False, False],
[True, True],
[True, True],
[False, True],
[False, True],
[True, False]]],
['regression: latched with ack and reset',
[2,
True,
[[True, False, False],
[True, False, False],
[False, False, False],
[False, True, False],
[False, False, True],
[True, False, False]]],
[[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]]],
['regression: chattering condition',
[3,
False,
[[True, False, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, False, False],
[True, False, False]]],
[[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]]],
['control: realarm after ack',
[1, False, [[True, False, False], [True, True, False], [False, False, False], [True, False, False]]],
[[True, False], [True, True], [False, True], [True, False]]],
['control: reset while condition true',
[1, False, [[True, False, False], [True, False, True], [True, False, False]]],
[[True, False], [True, False], [True, False]]],
['control: ack on latched alarm',
[1, True, [[True, False, False], [False, True, False], [False, False, False], [False, False, True]]],
[[True, False], [True, True], [True, True], [False, True]]],
['control: scenario 2',
[2,
True,
[[False, True, False],
[True, False, False],
[True, False, False],
[True, False, False],
[False, False, False],
[True, False, True],
[True, False, False],
[False, False, False],
[False, True, False],
[True, False, False],
[False, False, False],
[False, False, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, True, True]]],
[[False, True],
[False, True],
[True, False],
[True, False],
[True, False],
[True, False],
[True, False],
[True, False],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True]]]],
[['regression: scenario 2',
[2,
False,
[[False, True, False],
[True, False, False],
[True, True, False],
[True, False, False],
[False, False, False],
[True, False, False],
[False, False, False],
[False, False, False],
[True, False, False],
[True, True, False],
[True, False, True],
[False, False, False],
[True, False, True],
[True, True, False],
[True, False, False]]],
[[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True]]],
['regression: scenario 10',
[2,
False,
[[True, False, False],
[False, False, True],
[False, False, False],
[True, False, False],
[True, True, True],
[True, False, False],
[False, False, False],
[False, False, True],
[True, False, False],
[False, False, False],
[True, False, False],
[True, False, False],
[False, True, False],
[False, False, True],
[True, False, False]]],
[[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, False],
[False, True],
[False, True],
[False, True]]],
['regression: latched with ack and reset',
[2,
True,
[[True, False, False],
[True, False, False],
[False, False, False],
[False, True, False],
[False, False, True],
[True, False, False]]],
[[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]]],
['regression: chattering condition',
[3,
False,
[[True, False, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, False, False],
[True, False, False]]],
[[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]]],
['control: realarm after ack',
[1, False, [[True, False, False], [True, True, False], [False, False, False], [True, False, False]]],
[[True, False], [True, True], [False, True], [True, False]]],
['control: reset while condition true',
[1, False, [[True, False, False], [True, False, True], [True, False, False]]],
[[True, False], [True, False], [True, False]]],
['control: ack on latched alarm',
[1, True, [[True, False, False], [False, True, False], [False, False, False], [False, False, True]]],
[[True, False], [True, True], [True, True], [False, True]]],
['regression: scenario 1',
[2,
True,
[[False, True, False],
[True, False, False],
[False, False, False],
[False, False, True],
[False, False, True],
[True, False, True],
[True, True, False],
[True, False, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, True, False],
[True, False, False]]],
[[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True]]]],
[['regression: scenario 4',
[3,
False,
[[True, False, False],
[True, False, True],
[True, False, True],
[True, False, True],
[False, False, False],
[True, False, True],
[False, False, False],
[False, False, False],
[False, False, False],
[False, False, True]]],
[[False, True],
[False, True],
[True, False],
[True, False],
[False, False],
[False, False],
[False, False],
[False, False],
[False, False],
[False, False]]],
['regression: scenario 13',
[2,
False,
[[True, True, False],
[True, True, False],
[True, False, False],
[False, True, False],
[False, False, False],
[False, False, False],
[True, True, False],
[True, False, True],
[True, False, False],
[True, False, True],
[False, False, False],
[True, False, False],
[False, False, False],
[True, True, False]]],
[[False, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, False],
[True, False],
[True, False],
[False, False],
[False, False],
[False, False],
[False, True]]],
['regression: latched with ack and reset',
[2,
True,
[[True, False, False],
[True, False, False],
[False, False, False],
[False, True, False],
[False, False, True],
[True, False, False]]],
[[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]]],
['regression: chattering condition',
[3,
False,
[[True, False, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, False, False],
[True, False, False]]],
[[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]]],
['control: realarm after ack',
[1, False, [[True, False, False], [True, True, False], [False, False, False], [True, False, False]]],
[[True, False], [True, True], [False, True], [True, False]]],
['control: reset while condition true',
[1, False, [[True, False, False], [True, False, True], [True, False, False]]],
[[True, False], [True, False], [True, False]]],
['control: ack on latched alarm',
[1, True, [[True, False, False], [False, True, False], [False, False, False], [False, False, True]]],
[[True, False], [True, True], [True, True], [False, True]]],
['regression: scenario 1',
[2,
False,
[[False, False, False],
[True, True, False],
[True, True, False],
[False, False, True],
[False, False, True],
[True, True, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, False, True]]],
[[False, True],
[False, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, False],
[False, False],
[False, False],
[True, False]]]]]
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: latched with ack and reset | [[False, True], [True, False], [True, False], [True, True], [False, True], [True, False]] | [[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]] | Failed |
| regression: chattering condition | [[False, True], [False, True], [False, True], [True, False], [True, False], [True, False]] | [[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]] | Failed |
| control: realarm after ack | [[True, False], [True, True], [False, True], [True, False]] | [[True, False], [True, True], [False, True], [True, False]] | Passed |
| control: reset while condition true | [[True, False], [True, False], [True, False]] | [[True, False], [True, False], [True, False]] | Passed |
| control: ack on latched alarm | [[True, False], [True, True], [True, True], [False, True]] | [[True, False], [True, True], [True, True], [False, True]] | Passed |
| control: scenario 1 | [[True, False], [False, False], [True, False], [False, False], [True, True], [True, True], [True, True], [False, True], [False, True], [True, False]] | [[True, False], [False, False], [True, False], [False, False], [True, True], [True, True], [True, True], [False, True], [False, True], [True, False]] | Passed |
| control: scenario 2 | [[False, True], [True, False], [True, False], [True, False], [True, False], [True, False], [True, False], [False, False], [False, False], [False, True], [True, False], [True, False]] | [[False, True], [True, False], [True, False], [True, False], [True, False], [True, False], [True, False], [False, False], [False, False], [False, True], [True, False], [True, False]] | Passed |
| regression: scenario 3 | [[False, True], [False, True], [False, True], [False, True], [False, True], [True, False], [True, True], [False, True], [False, True], [True, False], [True, False], [True, False]] | [[False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [True, False]] | Failed |
SHA-256 / 48717b1574591dcd58da8094f0e2b295a582546aa46b1727ee353adaa8d608ca
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(min_scans, latched, scans):
in_alarm = False
acked = True
count = 0
out = []
for cond, ack, reset in scans:
count = count + 1 if cond else max(count - 1, 0)
if count >= min_scans and cond and not in_alarm:
in_alarm = True
acked = False
elif in_alarm and not cond and (not latched or reset):
in_alarm = False
if ack and not acked:
acked = True
out.append([in_alarm, acked])
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: latched with ack and reset',
[2,
True,
[[True, False, False],
[True, False, False],
[False, False, False],
[False, True, False],
[False, False, True],
[True, False, False]]],
[[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]]],
['regression: chattering condition',
[3,
False,
[[True, False, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, False, False],
[True, False, False]]],
[[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]]],
['control: realarm after ack',
[1, False, [[True, False, False], [True, True, False], [False, False, False], [True, False, False]]],
[[True, False], [True, True], [False, True], [True, False]]],
['control: reset while condition true',
[1, False, [[True, False, False], [True, False, True], [True, False, False]]],
[[True, False], [True, False], [True, False]]],
['control: ack on latched alarm',
[1, True, [[True, False, False], [False, True, False], [False, False, False], [False, False, True]]],
[[True, False], [True, True], [True, True], [False, True]]],
['control: scenario 1',
[1,
False,
[[True, False, False],
[False, False, False],
[True, False, False],
[False, False, False],
[True, True, False],
[True, False, False],
[True, False, False],
[False, False, False],
[False, False, False],
[True, False, False]]],
[[True, False],
[False, False],
[True, False],
[False, False],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, False]]],
['control: scenario 2',
[1,
True,
[[False, False, False],
[True, False, False],
[True, False, False],
[False, False, False],
[False, False, False],
[True, False, False],
[False, False, False],
[False, False, True],
[False, False, False],
[False, True, False],
[True, False, False],
[False, False, False]]],
[[False, True],
[True, False],
[True, False],
[True, False],
[True, False],
[True, False],
[True, False],
[False, False],
[False, False],
[False, True],
[True, False],
[True, False]]],
['regression: scenario 3',
[3,
False,
[[True, False, False],
[True, False, True],
[False, False, False],
[False, False, False],
[False, False, True],
[True, False, False],
[True, True, False],
[False, True, False],
[False, False, False],
[True, False, False],
[True, False, False],
[True, False, False]]],
[[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, False]]]],
[['regression: chattering condition',
[3,
False,
[[True, False, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, False, False],
[True, False, False]]],
[[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]]],
['regression: scenario 12',
[2,
False,
[[False, False, True],
[False, False, False],
[False, False, False],
[True, False, False],
[True, True, True],
[True, False, True],
[False, False, True],
[False, False, False],
[True, False, False],
[True, False, False],
[True, True, False]]],
[[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, False],
[True, True]]],
['regression: latched with ack and reset',
[2,
True,
[[True, False, False],
[True, False, False],
[False, False, False],
[False, True, False],
[False, False, True],
[True, False, False]]],
[[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]]],
['control: realarm after ack',
[1, False, [[True, False, False], [True, True, False], [False, False, False], [True, False, False]]],
[[True, False], [True, True], [False, True], [True, False]]],
['control: reset while condition true',
[1, False, [[True, False, False], [True, False, True], [True, False, False]]],
[[True, False], [True, False], [True, False]]],
['control: ack on latched alarm',
[1, True, [[True, False, False], [False, True, False], [False, False, False], [False, False, True]]],
[[True, False], [True, True], [True, True], [False, True]]],
['control: scenario 1',
[1,
False,
[[False, False, False],
[False, False, True],
[False, False, False],
[True, True, False],
[False, False, False],
[True, True, False],
[True, False, False],
[True, False, False],
[True, False, False],
[False, False, True],
[True, False, False]]],
[[False, True],
[False, True],
[False, True],
[True, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[True, False]]],
['regression: scenario 2',
[3,
False,
[[False, False, False],
[True, False, False],
[False, False, False],
[False, False, False],
[False, False, True],
[False, True, False],
[True, False, False],
[False, False, False],
[True, True, False],
[True, False, False],
[True, False, False]]],
[[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, False]]]],
[['regression: scenario 1',
[3,
False,
[[True, False, False],
[True, False, False],
[True, False, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, False, False],
[True, False, False],
[False, False, True],
[False, False, True]]],
[[False, True],
[False, True],
[True, False],
[True, False],
[False, False],
[False, False],
[False, False],
[True, False],
[False, False],
[False, False]]],
['regression: scenario 8',
[2,
False,
[[True, False, False],
[True, False, False],
[False, False, False],
[False, False, False],
[False, False, False],
[False, False, False],
[False, False, False],
[True, False, False],
[True, True, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, False, False]]],
[[False, True],
[True, False],
[False, False],
[False, False],
[False, False],
[False, False],
[False, False],
[False, False],
[True, True],
[True, True],
[False, True],
[False, True],
[True, False]]],
['regression: latched with ack and reset',
[2,
True,
[[True, False, False],
[True, False, False],
[False, False, False],
[False, True, False],
[False, False, True],
[True, False, False]]],
[[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]]],
['regression: chattering condition',
[3,
False,
[[True, False, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, False, False],
[True, False, False]]],
[[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]]],
['control: realarm after ack',
[1, False, [[True, False, False], [True, True, False], [False, False, False], [True, False, False]]],
[[True, False], [True, True], [False, True], [True, False]]],
['control: reset while condition true',
[1, False, [[True, False, False], [True, False, True], [True, False, False]]],
[[True, False], [True, False], [True, False]]],
['control: ack on latched alarm',
[1, True, [[True, False, False], [False, True, False], [False, False, False], [False, False, True]]],
[[True, False], [True, True], [True, True], [False, True]]],
['control: scenario 2',
[2,
True,
[[False, True, False],
[True, False, False],
[True, False, False],
[True, False, False],
[False, False, False],
[True, False, True],
[True, False, False],
[False, False, False],
[False, True, False],
[True, False, False],
[False, False, False],
[False, False, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, True, True]]],
[[False, True],
[False, True],
[True, False],
[True, False],
[True, False],
[True, False],
[True, False],
[True, False],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True]]]],
[['regression: scenario 2',
[2,
False,
[[False, True, False],
[True, False, False],
[True, True, False],
[True, False, False],
[False, False, False],
[True, False, False],
[False, False, False],
[False, False, False],
[True, False, False],
[True, True, False],
[True, False, True],
[False, False, False],
[True, False, True],
[True, True, False],
[True, False, False]]],
[[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True]]],
['regression: scenario 10',
[2,
False,
[[True, False, False],
[False, False, True],
[False, False, False],
[True, False, False],
[True, True, True],
[True, False, False],
[False, False, False],
[False, False, True],
[True, False, False],
[False, False, False],
[True, False, False],
[True, False, False],
[False, True, False],
[False, False, True],
[True, False, False]]],
[[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, False],
[False, True],
[False, True],
[False, True]]],
['regression: latched with ack and reset',
[2,
True,
[[True, False, False],
[True, False, False],
[False, False, False],
[False, True, False],
[False, False, True],
[True, False, False]]],
[[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]]],
['regression: chattering condition',
[3,
False,
[[True, False, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, False, False],
[True, False, False]]],
[[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]]],
['control: realarm after ack',
[1, False, [[True, False, False], [True, True, False], [False, False, False], [True, False, False]]],
[[True, False], [True, True], [False, True], [True, False]]],
['control: reset while condition true',
[1, False, [[True, False, False], [True, False, True], [True, False, False]]],
[[True, False], [True, False], [True, False]]],
['control: ack on latched alarm',
[1, True, [[True, False, False], [False, True, False], [False, False, False], [False, False, True]]],
[[True, False], [True, True], [True, True], [False, True]]],
['regression: scenario 1',
[2,
True,
[[False, True, False],
[True, False, False],
[False, False, False],
[False, False, True],
[False, False, True],
[True, False, True],
[True, True, False],
[True, False, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, True, False],
[True, False, False]]],
[[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True]]]],
[['regression: scenario 4',
[3,
False,
[[True, False, False],
[True, False, True],
[True, False, True],
[True, False, True],
[False, False, False],
[True, False, True],
[False, False, False],
[False, False, False],
[False, False, False],
[False, False, True]]],
[[False, True],
[False, True],
[True, False],
[True, False],
[False, False],
[False, False],
[False, False],
[False, False],
[False, False],
[False, False]]],
['regression: scenario 13',
[2,
False,
[[True, True, False],
[True, True, False],
[True, False, False],
[False, True, False],
[False, False, False],
[False, False, False],
[True, True, False],
[True, False, True],
[True, False, False],
[True, False, True],
[False, False, False],
[True, False, False],
[False, False, False],
[True, True, False]]],
[[False, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, False],
[True, False],
[True, False],
[False, False],
[False, False],
[False, False],
[False, True]]],
['regression: latched with ack and reset',
[2,
True,
[[True, False, False],
[True, False, False],
[False, False, False],
[False, True, False],
[False, False, True],
[True, False, False]]],
[[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]]],
['regression: chattering condition',
[3,
False,
[[True, False, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, False, False],
[True, False, False]]],
[[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]]],
['control: realarm after ack',
[1, False, [[True, False, False], [True, True, False], [False, False, False], [True, False, False]]],
[[True, False], [True, True], [False, True], [True, False]]],
['control: reset while condition true',
[1, False, [[True, False, False], [True, False, True], [True, False, False]]],
[[True, False], [True, False], [True, False]]],
['control: ack on latched alarm',
[1, True, [[True, False, False], [False, True, False], [False, False, False], [False, False, True]]],
[[True, False], [True, True], [True, True], [False, True]]],
['regression: scenario 1',
[2,
False,
[[False, False, False],
[True, True, False],
[True, True, False],
[False, False, True],
[False, False, True],
[True, True, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, False, True]]],
[[False, True],
[False, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, False],
[False, False],
[False, False],
[True, False]]]]]
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: latched with ack and reset | [[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]] | [[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]] | Passed |
| regression: chattering condition | [[False, True], [False, True], [False, True], [False, True], [True, False], [True, False]] | [[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]] | Failed |
| control: realarm after ack | [[True, False], [True, True], [False, True], [True, False]] | [[True, False], [True, True], [False, True], [True, False]] | Passed |
| control: reset while condition true | [[True, False], [True, False], [True, False]] | [[True, False], [True, False], [True, False]] | Passed |
| control: ack on latched alarm | [[True, False], [True, True], [True, True], [False, True]] | [[True, False], [True, True], [True, True], [False, True]] | Passed |
| control: scenario 1 | [[True, False], [False, False], [True, False], [False, False], [True, True], [True, True], [True, True], [False, True], [False, True], [True, False]] | [[True, False], [False, False], [True, False], [False, False], [True, True], [True, True], [True, True], [False, True], [False, True], [True, False]] | Passed |
| control: scenario 2 | [[False, True], [True, False], [True, False], [True, False], [True, False], [True, False], [True, False], [False, False], [False, False], [False, True], [True, False], [True, False]] | [[False, True], [True, False], [True, False], [True, False], [True, False], [True, False], [True, False], [False, False], [False, False], [False, True], [True, False], [True, False]] | Passed |
| regression: scenario 3 | [[False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [True, False]] | [[False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [True, False]] | Passed |
SHA-256 / 7a4b7d255d41ef357e83a2a1cd40b89a0d15eda3790fb3cef26d82e1527ece7e
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(min_scans, latched, scans):
in_alarm = False
acked = True
count = 0
out = []
for cond, ack, reset in scans:
count = count + 1 if cond else 0
if count >= min_scans and cond and not in_alarm:
in_alarm = True
acked = False
elif in_alarm and not cond and (not latched or reset):
in_alarm = False
if ack and not acked:
acked = True
out.append([in_alarm, acked])
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: latched with ack and reset',
[2,
True,
[[True, False, False],
[True, False, False],
[False, False, False],
[False, True, False],
[False, False, True],
[True, False, False]]],
[[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]]],
['regression: chattering condition',
[3,
False,
[[True, False, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, False, False],
[True, False, False]]],
[[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]]],
['control: realarm after ack',
[1, False, [[True, False, False], [True, True, False], [False, False, False], [True, False, False]]],
[[True, False], [True, True], [False, True], [True, False]]],
['control: reset while condition true',
[1, False, [[True, False, False], [True, False, True], [True, False, False]]],
[[True, False], [True, False], [True, False]]],
['control: ack on latched alarm',
[1, True, [[True, False, False], [False, True, False], [False, False, False], [False, False, True]]],
[[True, False], [True, True], [True, True], [False, True]]],
['control: scenario 1',
[1,
False,
[[True, False, False],
[False, False, False],
[True, False, False],
[False, False, False],
[True, True, False],
[True, False, False],
[True, False, False],
[False, False, False],
[False, False, False],
[True, False, False]]],
[[True, False],
[False, False],
[True, False],
[False, False],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, False]]],
['control: scenario 2',
[1,
True,
[[False, False, False],
[True, False, False],
[True, False, False],
[False, False, False],
[False, False, False],
[True, False, False],
[False, False, False],
[False, False, True],
[False, False, False],
[False, True, False],
[True, False, False],
[False, False, False]]],
[[False, True],
[True, False],
[True, False],
[True, False],
[True, False],
[True, False],
[True, False],
[False, False],
[False, False],
[False, True],
[True, False],
[True, False]]],
['regression: scenario 3',
[3,
False,
[[True, False, False],
[True, False, True],
[False, False, False],
[False, False, False],
[False, False, True],
[True, False, False],
[True, True, False],
[False, True, False],
[False, False, False],
[True, False, False],
[True, False, False],
[True, False, False]]],
[[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, False]]]],
[['regression: chattering condition',
[3,
False,
[[True, False, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, False, False],
[True, False, False]]],
[[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]]],
['regression: scenario 12',
[2,
False,
[[False, False, True],
[False, False, False],
[False, False, False],
[True, False, False],
[True, True, True],
[True, False, True],
[False, False, True],
[False, False, False],
[True, False, False],
[True, False, False],
[True, True, False]]],
[[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, False],
[True, True]]],
['regression: latched with ack and reset',
[2,
True,
[[True, False, False],
[True, False, False],
[False, False, False],
[False, True, False],
[False, False, True],
[True, False, False]]],
[[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]]],
['control: realarm after ack',
[1, False, [[True, False, False], [True, True, False], [False, False, False], [True, False, False]]],
[[True, False], [True, True], [False, True], [True, False]]],
['control: reset while condition true',
[1, False, [[True, False, False], [True, False, True], [True, False, False]]],
[[True, False], [True, False], [True, False]]],
['control: ack on latched alarm',
[1, True, [[True, False, False], [False, True, False], [False, False, False], [False, False, True]]],
[[True, False], [True, True], [True, True], [False, True]]],
['control: scenario 1',
[1,
False,
[[False, False, False],
[False, False, True],
[False, False, False],
[True, True, False],
[False, False, False],
[True, True, False],
[True, False, False],
[True, False, False],
[True, False, False],
[False, False, True],
[True, False, False]]],
[[False, True],
[False, True],
[False, True],
[True, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[True, False]]],
['regression: scenario 2',
[3,
False,
[[False, False, False],
[True, False, False],
[False, False, False],
[False, False, False],
[False, False, True],
[False, True, False],
[True, False, False],
[False, False, False],
[True, True, False],
[True, False, False],
[True, False, False]]],
[[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, False]]]],
[['regression: scenario 1',
[3,
False,
[[True, False, False],
[True, False, False],
[True, False, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, False, False],
[True, False, False],
[False, False, True],
[False, False, True]]],
[[False, True],
[False, True],
[True, False],
[True, False],
[False, False],
[False, False],
[False, False],
[True, False],
[False, False],
[False, False]]],
['regression: scenario 8',
[2,
False,
[[True, False, False],
[True, False, False],
[False, False, False],
[False, False, False],
[False, False, False],
[False, False, False],
[False, False, False],
[True, False, False],
[True, True, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, False, False]]],
[[False, True],
[True, False],
[False, False],
[False, False],
[False, False],
[False, False],
[False, False],
[False, False],
[True, True],
[True, True],
[False, True],
[False, True],
[True, False]]],
['regression: latched with ack and reset',
[2,
True,
[[True, False, False],
[True, False, False],
[False, False, False],
[False, True, False],
[False, False, True],
[True, False, False]]],
[[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]]],
['regression: chattering condition',
[3,
False,
[[True, False, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, False, False],
[True, False, False]]],
[[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]]],
['control: realarm after ack',
[1, False, [[True, False, False], [True, True, False], [False, False, False], [True, False, False]]],
[[True, False], [True, True], [False, True], [True, False]]],
['control: reset while condition true',
[1, False, [[True, False, False], [True, False, True], [True, False, False]]],
[[True, False], [True, False], [True, False]]],
['control: ack on latched alarm',
[1, True, [[True, False, False], [False, True, False], [False, False, False], [False, False, True]]],
[[True, False], [True, True], [True, True], [False, True]]],
['control: scenario 2',
[2,
True,
[[False, True, False],
[True, False, False],
[True, False, False],
[True, False, False],
[False, False, False],
[True, False, True],
[True, False, False],
[False, False, False],
[False, True, False],
[True, False, False],
[False, False, False],
[False, False, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, True, True]]],
[[False, True],
[False, True],
[True, False],
[True, False],
[True, False],
[True, False],
[True, False],
[True, False],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True]]]],
[['regression: scenario 2',
[2,
False,
[[False, True, False],
[True, False, False],
[True, True, False],
[True, False, False],
[False, False, False],
[True, False, False],
[False, False, False],
[False, False, False],
[True, False, False],
[True, True, False],
[True, False, True],
[False, False, False],
[True, False, True],
[True, True, False],
[True, False, False]]],
[[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True]]],
['regression: scenario 10',
[2,
False,
[[True, False, False],
[False, False, True],
[False, False, False],
[True, False, False],
[True, True, True],
[True, False, False],
[False, False, False],
[False, False, True],
[True, False, False],
[False, False, False],
[True, False, False],
[True, False, False],
[False, True, False],
[False, False, True],
[True, False, False]]],
[[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, False],
[False, True],
[False, True],
[False, True]]],
['regression: latched with ack and reset',
[2,
True,
[[True, False, False],
[True, False, False],
[False, False, False],
[False, True, False],
[False, False, True],
[True, False, False]]],
[[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]]],
['regression: chattering condition',
[3,
False,
[[True, False, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, False, False],
[True, False, False]]],
[[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]]],
['control: realarm after ack',
[1, False, [[True, False, False], [True, True, False], [False, False, False], [True, False, False]]],
[[True, False], [True, True], [False, True], [True, False]]],
['control: reset while condition true',
[1, False, [[True, False, False], [True, False, True], [True, False, False]]],
[[True, False], [True, False], [True, False]]],
['control: ack on latched alarm',
[1, True, [[True, False, False], [False, True, False], [False, False, False], [False, False, True]]],
[[True, False], [True, True], [True, True], [False, True]]],
['regression: scenario 1',
[2,
True,
[[False, True, False],
[True, False, False],
[False, False, False],
[False, False, True],
[False, False, True],
[True, False, True],
[True, True, False],
[True, False, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, True, False],
[True, False, False]]],
[[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True]]]],
[['regression: scenario 4',
[3,
False,
[[True, False, False],
[True, False, True],
[True, False, True],
[True, False, True],
[False, False, False],
[True, False, True],
[False, False, False],
[False, False, False],
[False, False, False],
[False, False, True]]],
[[False, True],
[False, True],
[True, False],
[True, False],
[False, False],
[False, False],
[False, False],
[False, False],
[False, False],
[False, False]]],
['regression: scenario 13',
[2,
False,
[[True, True, False],
[True, True, False],
[True, False, False],
[False, True, False],
[False, False, False],
[False, False, False],
[True, True, False],
[True, False, True],
[True, False, False],
[True, False, True],
[False, False, False],
[True, False, False],
[False, False, False],
[True, True, False]]],
[[False, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, False],
[True, False],
[True, False],
[False, False],
[False, False],
[False, False],
[False, True]]],
['regression: latched with ack and reset',
[2,
True,
[[True, False, False],
[True, False, False],
[False, False, False],
[False, True, False],
[False, False, True],
[True, False, False]]],
[[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]]],
['regression: chattering condition',
[3,
False,
[[True, False, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, False, False],
[True, False, False]]],
[[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]]],
['control: realarm after ack',
[1, False, [[True, False, False], [True, True, False], [False, False, False], [True, False, False]]],
[[True, False], [True, True], [False, True], [True, False]]],
['control: reset while condition true',
[1, False, [[True, False, False], [True, False, True], [True, False, False]]],
[[True, False], [True, False], [True, False]]],
['control: ack on latched alarm',
[1, True, [[True, False, False], [False, True, False], [False, False, False], [False, False, True]]],
[[True, False], [True, True], [True, True], [False, True]]],
['regression: scenario 1',
[2,
False,
[[False, False, False],
[True, True, False],
[True, True, False],
[False, False, True],
[False, False, True],
[True, True, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, False, True]]],
[[False, True],
[False, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, False],
[False, False],
[False, False],
[True, False]]]]]
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: latched with ack and reset | [[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]] | [[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]] | Passed |
| regression: chattering condition | [[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]] | [[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]] | Passed |
| control: realarm after ack | [[True, False], [True, True], [False, True], [True, False]] | [[True, False], [True, True], [False, True], [True, False]] | Passed |
| control: reset while condition true | [[True, False], [True, False], [True, False]] | [[True, False], [True, False], [True, False]] | Passed |
| control: ack on latched alarm | [[True, False], [True, True], [True, True], [False, True]] | [[True, False], [True, True], [True, True], [False, True]] | Passed |
| control: scenario 1 | [[True, False], [False, False], [True, False], [False, False], [True, True], [True, True], [True, True], [False, True], [False, True], [True, False]] | [[True, False], [False, False], [True, False], [False, False], [True, True], [True, True], [True, True], [False, True], [False, True], [True, False]] | Passed |
| control: scenario 2 | [[False, True], [True, False], [True, False], [True, False], [True, False], [True, False], [True, False], [False, False], [False, False], [False, True], [True, False], [True, False]] | [[False, True], [True, False], [True, False], [True, False], [True, False], [True, False], [True, False], [False, False], [False, False], [False, True], [True, False], [True, False]] | Passed |
| regression: scenario 3 | [[False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [True, False]] | [[False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [True, False]] | Passed |
SHA-256 / 2d6cfc25b894fcd4c31e619b277b5cd9c462b3721769e041e8ed9f8e27217a2c
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:43.260773+00:00.
Case digest / e0efd57631b355192d2f3a3341a55981272f4e94c0ad726b49722ba0af2043e4