Skip to content

Benchmarks

ISA-88 phase hold on permissive loss (graphical LD)

suite id g_phase_hold_permissive
domain chemical_batch
language LD-graphical
difficulty medium
validation status validated
origin authored
license CC-BY-4.0

Authored for this suite, modeling an ISA-88 phase HELD state entered on agitator-permissive loss

What is proved

From benchmarks/chemical_batch/g_phase_hold_permissive/props.yaml. What each kind claims, and what it becomes on either route, is on The properties we prove.

id kind claim requirement
P1 invariant !(held && heater) A phase held on permissive loss must keep the heater off; only clearing HELD through resume_command may re-enable heating.

Variants

file expected verdict violates method
clean.xml SAFE none expert
bomb.xml VIOLATION P1 fault-injection

Files

file what it is size sha256
benchmark.yml benchmark metadata 1.1 KB 6fae9d3dabb3
bomb.xml ladder program, PLCopen XML 3.8 KB 20267edcf036
clean.xml ladder program, PLCopen XML 3.4 KB 358665376987
props.yaml property file 0.2 KB 13e29f70444b

Structured text, derived

Read off the ladder graph by runner/ld_to_st.py: every rung's contacts and coils rewritten as IEC 61131-3 assignments, in the same series/parallel logic the PLCopen XML encodes. This is a reading aid, not a second source of expected verdicts; ESBMC verifies the ladder program shown above, never this rendering.

PROGRAM g_phase_hold_permissive_bomb
VAR_INPUT
    run_command : BOOL;
    agitator_ok : BOOL;
    resume_command : BOOL;
    maint : BOOL;
END_VAR

VAR_OUTPUT
    held : BOOL;
    heater : BOOL;
END_VAR


held := ((run_command AND NOT agitator_ok) OR (held AND NOT resume_command));
heater := (((run_command AND NOT held) AND agitator_ok) OR (held AND maint));

END_PROGRAM
PROGRAM g_phase_hold_permissive_clean
VAR_INPUT
    run_command : BOOL;
    agitator_ok : BOOL;
    resume_command : BOOL;
    maint : BOOL;
END_VAR

VAR_OUTPUT
    held : BOOL;
    heater : BOOL;
END_VAR


held := ((run_command AND NOT agitator_ok) OR (held AND NOT resume_command));
heater := ((run_command AND NOT held) AND agitator_ok);

END_PROGRAM

Recorded runs

A task can carry two routes. ld is ESBMC's ladder front end reading the program directly. via C is the same solver reached through Beremiz and MatIEC, which is the only route that reaches ST, IL, FBD and SFC; see How ESBMC-PLC works.

  • g_phase_hold_permissive__bomb (props.yaml, expected VIOLATION): v8.4 VIOLATION
  • g_phase_hold_permissive__clean (props.yaml, expected SAFE): v8.4 SAFE