Integrate ISO 13849-1 / IEC 62061 safety requirements into your AutomationView control logic.
In modern industrial automation:
+-------------------------------------------------------------------+
| SAFETY HIERARCHY |
| |
| [Hardware Safety Relay / F-PLC] ======= (Direct Power Cut-Off) |
| | | |
| | (Status Signals: bSafetyZone_OK) v |
| v [Servo / Valves] |
| [AutomationView SFC Logic] -----------------> [Motion Commands] |
+-------------------------------------------------------------------+
Always declare safety feedback inputs as normally closed (NC) high-true signals:
| Variable Name | Type | Meaning when TRUE | Meaning when FALSE |
|---|---|---|---|
bSafety_Gate_Closed |
BOOL |
Enclosure interlock switch locked | Door open (Operator inside) |
bLight_Curtain_Clear |
BOOL |
Optical beam path uninterrupted | Beam broken (Muting inactive) |
bE_Stop_Healthy |
BOOL |
All E-Stop buttons healthy | Emergency stop pressed |
bSafety_Zone_Permit |
BOOL |
Safety relay energized and reset | Power cut from drives/valves |
Every critical movement transition must include the safety permit in its receptivity:
from automation_machine import Sequence, StepType
class SafetyInterlockedCell(Sequence):
def setup(self):
s0 = self.add_step(StepType.INITIAL, name="Standby")
s1 = self.add_step(name="Advance_Hydraulic_Ram")
s_safe_hold = self.add_step(name="Safety_Interrupted_Hold")
self.add_transition(s0, s1, condition="bStart_Cmd AND bSafety_Zone_Permit AND bLight_Curtain_Clear")
self.add_transition(s1, s_safe_hold, condition="NOT bSafety_Zone_Permit")
self.add_transition(s_safe_hold, s1, condition="bSafety_Zone_Permit AND bResume_Pushbutton")
s1.add_action("cmd_Ram_Down", "Advance ram")
s_safe_hold.add_action("bHold_Lamp", "Illuminate safety hold indicator")
Safety_Interrupted_Hold.