﻿<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
  <POU Name="KN75" Id="{26a0b26b-02ec-447a-8515-0661cc23182a}" SpecialFunc="None">
    <Declaration><![CDATA[FUNCTION_BLOCK KN75 EXTENDS BaseHandlingController
(*This "crane" have no contact to the radio, have no operation over crane movements. 
activate & deactivate and is more of a monitoring / utility controller...
Have a local Danfoss controller with heavylift program.*)
VAR_INPUT
	Config			: REFERENCE TO KN75_Config;
	IO_In			: REFERENCE TO KN75_IO_In;
	IO_Out			: REFERENCE TO KN75_IO_Out;
END_VAR

VAR(*HMI*)
	HMI_IO_In			: KN75_HMI_IO_In;
	HMI_IO_Out			: KN75_HMI_IO_Out;
END_VAR
]]></Declaration>
    <Implementation>
      <ST><![CDATA[update(); //Local SM
SUPER^(); //General Logic handled by Parent
]]></ST>
    </Implementation>
    <Method Name="ioUpdate" Id="{56c03783-3742-4e7e-b583-e820b652391a}">
      <Declaration><![CDATA[METHOD ioUpdate : BOOL

]]></Declaration>
      <Implementation>
        <ST><![CDATA[(*Cabinet IO*)
_Manuel := IO_In.Manuel;
_Auto := IO_In.Auto; 


(*system indication*)
IF _activate THEN //active blink within service position, else normal on
	IO_Out.LedActive := TRUE;
ELSE
	IO_Out.LedActive := FALSE;
END_IF


(*Estop is being handled within Controller*)
IF emergencyStop.Activated THEN
	IO_Out.LedEmergencyStop := TRUE;
ELSE
	IO_Out.LedEmergencyStop := FALSE;
END_IF



(*HPU Request*)
IF IO_In.StartHPU THEN 
	IO_Out.ReqStartHPU := TRUE;
	_StartHPU := TRUE;
ELSE
	IO_Out.ReqStartHPU := FALSE;
	_StartHPU := FALSE;
END_IF
IF IO_In.StopHPU THEN 
	IO_Out.ReqStopHPU := TRUE;
	_StopHPU := TRUE;
ELSE
	IO_Out.ReqStopHPU := FALSE;
	_StopHPU := FALSE;
END_IF


(*HMI*)
HMI_IO_Out.Active := THIS^.Active;
HMI_IO_Out.Alarm := THIS^.Alarm;
HMI_IO_Out.Warning := THIS^.Warning;
HMI_IO_Out.floodlightOn := _toggleFloodlight.value;
]]></ST>
      </Implementation>
    </Method>
    <Method Name="Floodlight" Id="{ba5310d6-85d9-4e2a-8c6d-b51acbc3c34e}">
      <Declaration><![CDATA[METHOD Floodlight : BOOL

]]></Declaration>
      <Implementation>
        <ST><![CDATA[(*Toggle options between Radio panel and HMI*)
_toggleFloodlight(ToggleInput := IO_In.Floodlight OR HMI_IO_In.floodlight);

(*switches & panel toggle button*)
IF _toggleFloodlight.value THEN
	IO_Out.FloodLight := TRUE;
ELSE
	IO_Out.FloodLight := FALSE;
END_IF
]]></ST>
      </Implementation>
    </Method>
    <Method Name="update" Id="{c3106345-aaa6-4001-b575-b11d034c1d39}">
      <Declaration><![CDATA[METHOD PROTECTED  update : BOOL
VAR_INST
	//_signalTimeout : TON;
	//_signalStop : R_TRIG;
	_signalStart : BOOL;//R_TRIG;
	//_signalPanelNotOK : BOOL;
END_VAR
]]></Declaration>
      <Implementation>
        <ST><![CDATA[ioUpdate();
Floodlight();

(*Have no startup, simply activated and stays active until shut down*)
_signalStart := IO_In.Auto AND IO_In.ActivateCrane;


(*Logic*)
CASE _state OF 
	CtrlHandlingSM.ESTOP: // is in Estop until reset, then goes to startup
		IF NOT emergencyStop.Activated THEN
			_state := CtrlHandlingSM.IDLE;
		END_IF
		
		
	CtrlHandlingSM.IDLE: // we eigther go on manuel or auto mode
		IF emergencyStop.Activated THEN
			_state := CtrlHandlingSM.ESTOP;	
		END_IF
		
		IF _Auto THEN // hardware check and startup sequense
			IF _signalStart THEN
				_state := CtrlHandlingSM.AUTO_OP;
			END_IF
		ELSIF _Manuel THEN
			_state := CtrlHandlingSM.MANUAL_OP;	
		END_IF

		
	CtrlHandlingSM.MANUAL_OP: 
		IF emergencyStop.Activated THEN
			_state := CtrlHandlingSM.ESTOP;	
		END_IF
		
		IF NOT _Manuel THEN
			_state := CtrlHandlingSM.IDLE;
		END_IF
		
		
	CtrlHandlingSM.AUTO_OP:
		IF emergencyStop.Activated THEN
			_state := CtrlHandlingSM.ESTOP;	
		END_IF
		
		IF NOT _Auto OR NOT _signalStart THEN
			_state := CtrlHandlingSM.IDLE;
		END_IF
		
END_CASE

(*Output*)
CASE _state OF
	CtrlhandlingSM.ESTOP:
		_activated := FALSE;

	CtrlhandlingSM.IDLE:
		_activated := FALSE;
		
	CtrlhandlingSM.MANUAL_OP:
		_activated := FALSE;
	
	CtrlhandlingSM.AUTO_OP: 
		_activated := TRUE;
END_CASE]]></ST>
      </Implementation>
    </Method>
  </POU>
</TcPlcObject>