(* === DECLARATION === *) FUNCTION_BLOCK fb_light VAR_INPUT // Home Assistant Commands ha_on: BOOL; // HA command: Turn ON ha_off: BOOL; // HA command: Turn OFF // Zigbee Switch Input zigbee_sw: BOOL; // Zigbee switch (edge detected) // Status Feedback relay_status: BOOL; // Actual relay state (read from EtherCAT) END_VAR VAR_OUTPUT light_output: BOOL; // Control output to relay light_status: BOOL; // Status to send back (actual relay state) END_VAR VAR // Edge triggers r_trig_ha_on: R_TRIG; r_trig_ha_off: R_TRIG; r_trig_zigbee: R_TRIG; // Internal state light_state: BOOL := FALSE; END_VAR (* === IMPLEMENTATION === *) // ===================================================== // fb_light - Implementation (per redesign) // ===================================================== // Priority (highest to lowest): // 1. HA OFF command - Always turns light OFF // 2. HA ON command - Always turns light ON // 3. Zigbee toggle - Toggles current state // 4. Maintain current state // ===================================================== // Edge detection for commands r_trig_ha_on(CLK := ha_on); r_trig_ha_off(CLK := ha_off); r_trig_zigbee(CLK := zigbee_sw); // State machine IF r_trig_ha_off.Q THEN light_state := FALSE; ELSIF r_trig_ha_on.Q THEN light_state := TRUE; ELSIF r_trig_zigbee.Q THEN light_state := NOT light_state; END_IF; // Output assignment light_output := light_state; // Status feedback (read from actual relay) light_status := relay_status;