(* @PATH := '\/TASK2_ControlMain\/CIP' *) (* @SYMFILEFLAGS := '59392' *) PROGRAM Exec_Simple_CIP VAR_INPUT Start : BOOL ; Hold : BOOL ; StepUp : BOOL ; StepDown : BOOL ; Inizialize : BOOL ; Clock : BOOL ; END_VAR VAR mSteppingUp : BOOL ; mSteppingDown : BOOL ; mStepTimeValue : UINT ; mWordOut0 : ARRAY [0..15] OF BOOL ; (* Temporary Word Out0 To Valves *) mWordOut1 : ARRAY [0..15] OF BOOL ; (* Temporary Word Out1 To Valves *) mWordOut2 : ARRAY [0..15] OF BOOL ; (* Temporary Word Out2 To Valves *) mWordOut3 : ARRAY [0..15] OF BOOL ; (* Temporary Word Out3 To Valves *) mWaitEventReqWordTemp : WORD ; (* *) mWaitEventReqDWord : DWORD ; (* Waiting Conditions Word From Simple Program - Request - *) mWaitEventStatusDWord : DWORD ; (* Waiting Conditions Word From Simple Program *) mWaitAnyCond : BOOL ; (* WOR of the 2 Conditions Word *) mClock_ONS : R_TRIG ; mStepUp_ONS : R_TRIG ; mStepDown_ONS : R_TRIG ; mInizialize_ONS : R_TRIG ; mCycleCount : UINT ; mMemCopyResult : UDINT ; mDummy : BOOL ; END_VAR VAR_OUTPUT EN_Out : BOOL ; END_VAR (* @END_DECLARATION := '0' *) mInizialize_ONS(CLK:=Inizialize) ; mStepUp_ONS(CLK:=StepUp AND NOT gCIP_Completed) ; mStepDown_ONS(CLK:=StepDown AND NOT gCIP_Inizialized) ; mClock_ONS(CLK:=Clock) ; IF gCIP_ProgramLoaded THEN Exec_Simple_CIP.CopyCIPProgram ; END_IF IF mInizialize_ONS.Q THEN Exec_Simple_CIP.CIP_Prog_Inizialize ; ELSE IF gActualSimpleNum = 0 THEN gActualSimpleNum := 1 ; END_IF IF gActualSimpleNum>gCIPMaxSimpleNum THEN gActualSimpleNum := gCIPMaxSimpleNum ; END_IF IF gActualStepNum = 0 THEN gActualStepNum := 1 ; END_IF IF mStepUp_ONS.Q THEN Exec_Simple_CIP.CIP_Prog_StepUp ; END_IF IF mStepDown_ONS.Q THEN Exec_Simple_CIP.CIP_Prog_StepDown ; END_IF mStepTimeValue := gCIP_Run_Prog[gActualSimpleNum].CIP_SimpleArray[gActualStepNum].CIP_StepTime ; mCycleCount := 0 ; WHILE mStepTimeValue = 0 AND NOT gCIP_Completed AND NOT gCIP_Inizialized AND gActualStepNum<=gCIPMaxStepNum AND NOT (mCycleCount>gCIPMaxSimpleNum*gCIPMaxStepNum) DO mCycleCount := mCycleCount + 1 ; IF mStepUp_ONS.Q OR (gCIP_Run_Running AND mStepTimeValue = 0) THEN mSteppingUp := TRUE ; END_IF IF mStepDown_ONS.Q THEN mSteppingDown := TRUE ; END_IF IF mSteppingUp THEN Exec_Simple_CIP.CIP_Prog_StepUp ; ELSIF NOT (mSteppingUp OR mSteppingDown) THEN EXIT ; END_IF IF mSteppingDown THEN Exec_Simple_CIP.CIP_Prog_StepDown ; ELSIF NOT (mSteppingUp OR mSteppingDown) THEN EXIT ; END_IF mStepTimeValue := gCIP_Run_Prog[gActualSimpleNum].CIP_SimpleArray[gActualStepNum].CIP_StepTime ; END_WHILE mSteppingUp := FALSE ; mSteppingDown := FALSE ; IF mStepDown_ONS.Q THEN IF gStepActualTime=0 THEN gCIPTotalElapsedTime := gCIPTotalElapsedTime - mStepTimeValue ; ELSE gCIPTotalElapsedTime := gCIPTotalElapsedTime - gStepActualTime ; END_IF gStepActualTime := 0 ; END_IF IF Start THEN Exec_Simple_CIP.Exec_Step ; END_IF END_IF gH_Blender_CIP_LinkName := gActual_LinkProgName ; IF gCIP_Run_Prog[gActualSimpleNum].CIP_SimpleCode>0 THEN gH_Blender_CIP_SimpleName := gActual_ArrSimpleProgName[gCIP_Run_Prog[gActualSimpleNum].CIP_SimpleCode] ; END_IF gH_Blender_CIP_StepTime := LIMIT(0, ABS(mStepTimeValue - gStepActualTime), mStepTimeValue) ; gH_Blender_CIP_TotalTime := LIMIT(0, ABS(gCIPTotalTime - gCIPTotalElapsedTime), gCIPTotalTime) ; gH_Blender_CIP_StepNum := gActualStepNum ; IF gCIPTotalTime>0 THEN gH_Blender_CIP_LinkProgPerc := UDINT_TO_REAL(gCIPTotalElapsedTime) / UDINT_TO_REAL(gCIPTotalTime) * 100 ; END_IF IF mStepTimeValue>0 THEN gH_Blender_CIP_SimpleProgPerc := UINT_TO_REAL(gStepActualTime) / UINT_TO_REAL(mStepTimeValue) * 100 ; END_IF gH_Blender_CIP_PV_HighCond := gIn_C1_Conductivity_Caustic ; gH_Blender_CIP_PV_LowCond := gIn_C2_Conductivity_Water ; gH_Blender_CIPHeaterTempPV := gCIPHeaterTemp_PV ; gH_Blender_CIPReturnTempPV := gCIPReturnTemp_PV ; END_PROGRAM ACTION CIP_Prog_Completed: gCIP_Completed := TRUE ; mWaitAnyCond := FALSE ; mWordOut0 := _Word_To_BoolArray(0) ; mWordOut1 := mWordOut0 ; mWordOut2 := mWordOut0 ; mWordOut3 := mWordOut0 ; mWaitEventReqDWord := 0 ; mWaitEventStatusDWord := 0 ; END_ACTION ACTION CIP_Prog_Inizialize: _LD_BODY _NETWORKS : 1 _NETWORK _COMMENT _END_COMMENT _LD_ASSIGN _EMPTY _EXPRESSION _POSITIV ENABLELIST : 7 _ASSIGN _OPERATOR _BOX_EXPR : 1 _ENABLED _OPERAND _EXPRESSION _POSITIV 1 _EXPRESSION _POSITIV MOVE _EXPRESSION _POSITIV _OUTPUTS : 1 _OUTPUT _POSITIV _NO_SET gActualSimpleNum _ASSIGN _OPERATOR _BOX_EXPR : 1 _ENABLED _OPERAND _EXPRESSION _POSITIV 1 _EXPRESSION _POSITIV MOVE _EXPRESSION _POSITIV _OUTPUTS : 1 _OUTPUT _POSITIV _NO_SET gActualStepNum _ASSIGN _OPERATOR _BOX_EXPR : 1 _ENABLED _OPERAND _EXPRESSION _POSITIV FALSE _EXPRESSION _POSITIV MOVE _EXPRESSION _POSITIV _OUTPUTS : 1 _OUTPUT _POSITIV _NO_SET gCIP_Completed _ASSIGN _OPERATOR _BOX_EXPR : 1 _ENABLED _OPERAND _EXPRESSION _POSITIV FALSE _EXPRESSION _POSITIV MOVE _EXPRESSION _POSITIV _OUTPUTS : 1 _OUTPUT _POSITIV _NO_SET gCIP_WaitAnyCond _ASSIGN _OPERATOR _BOX_EXPR : 1 _ENABLED _OPERAND _EXPRESSION _POSITIV 0 _EXPRESSION _POSITIV MOVE _EXPRESSION _POSITIV _OUTPUTS : 1 _OUTPUT _POSITIV _NO_SET gStepActualTime _ASSIGN _OPERATOR _BOX_EXPR : 1 _ENABLED _OPERAND _EXPRESSION _POSITIV TRUE _EXPRESSION _POSITIV MOVE _EXPRESSION _POSITIV _OUTPUTS : 1 _OUTPUT _POSITIV _NO_SET gCIP_Inizialized _ASSIGN _OPERATOR _BOX_EXPR : 1 _ENABLED _OPERAND _EXPRESSION _POSITIV 0 _EXPRESSION _POSITIV MOVE _EXPRESSION _POSITIV _OUTPUTS : 1 _OUTPUT _POSITIV _NO_SET gCIPTotalElapsedTime ENABLELIST_END _OUTPUTS : 0 END_ACTION ACTION CIP_Prog_StepDown: IF gActualSimpleNum >= 1 THEN IF gActualStepNum > 1 THEN IF gStepActualTime<=0 THEN gActualStepNum := gActualStepNum - 1 ; END_IF ELSIF gActualSimpleNum>1 THEN gActualSimpleNum := gActualSimpleNum - 1 ; gActualStepNum := gCIPMaxStepNum ; END_IF END_IF IF gActualSimpleNum=1 AND gActualStepNum=1 THEN gCIP_Inizialized := TRUE ; ELSE gCIP_Inizialized := FALSE ; END_IF IF gCIP_Completed THEN gCIP_Completed := FALSE ; END_IF END_ACTION ACTION CIP_Prog_StepUp: IF gActualSimpleNum0 AND gH_Blender_CIP_ProgStepUp THEN gCIPTotalElapsedTime := gCIPTotalElapsedTime + LIMIT(0, (mStepTimeValue - gStepActualTime), mStepTimeValue) ; END_IF gStepActualTime := 0 ; END_ACTION ACTION CopyCIPProgram: _LD_BODY _NETWORKS : 3 _NETWORK _COMMENT _END_COMMENT _LD_ASSIGN _EMPTY _EXPRESSION _POSITIV ENABLELIST : 1 _ASSIGN _FUNCTION _BOX_EXPR : 3 _ENABLED _OPERATOR _BOX_EXPR : 1 _OPERAND _EXPRESSION _POSITIV gCIP_Run_Prog _EXPRESSION _POSITIV ADR _OPERATOR _BOX_EXPR : 1 _OPERAND _EXPRESSION _POSITIV gActualCIP_LinkProgram _EXPRESSION _POSITIV ADR _OPERATOR _BOX_EXPR : 1 _OPERAND _EXPRESSION _POSITIV gActualCIP_LinkProgram _EXPRESSION _POSITIV SIZEOF _EXPRESSION _POSITIV MEMCPY _EXPRESSION _POSITIV _OUTPUTS : 1 _OUTPUT _POSITIV _NO_SET mMemCopyResult ENABLELIST_END _OUTPUTS : 0 _NETWORK _COMMENT _END_COMMENT _LD_ASSIGN _LD_AND _LD_OPERATOR : 2 _LD_CONTACT gCIP_ProgramLoaded _EXPRESSION _POSITIV _LD_CONTACT gCIP_Completed _EXPRESSION _POSITIV _EXPRESSION _POSITIV _EXPRESSION _POSITIV ENABLELIST : 0 ENABLELIST_END _OUTPUTS : 1 _OUTPUT _NEGATIV _SET gCIP_Completed _NETWORK _COMMENT _END_COMMENT _LD_ASSIGN _LD_CONTACT gCIP_ProgramLoaded _EXPRESSION _POSITIV _EXPRESSION _POSITIV ENABLELIST : 0 ENABLELIST_END _OUTPUTS : 1 _OUTPUT _NEGATIV _SET gCIP_ProgramLoaded END_ACTION ACTION Exec_Step: IF mClock_ONS.Q THEN (* One Second Clock *) IF mStepTimeValue>gStepActualTime THEN gCIP_Simple_Exec := gCIP_Run_Prog[gActualSimpleNum] ; mWordOut0 := _Word_To_BoolArray(gCIP_Run_Prog[gActualSimpleNum].CIP_SimpleArray[gActualStepNum].CIP_OutWord_0) ; mWordOut1 := _Word_To_BoolArray(gCIP_Run_Prog[gActualSimpleNum].CIP_SimpleArray[gActualStepNum].CIP_OutWord_1) ; mWordOut2 := _Word_To_BoolArray(gCIP_Run_Prog[gActualSimpleNum].CIP_SimpleArray[gActualStepNum].CIP_OutWord_2) ; mWordOut3 := _Word_To_BoolArray(gCIP_Run_Prog[gActualSimpleNum].CIP_SimpleArray[gActualStepNum].CIP_OutWord_3) ; mWaitEventReqWordTemp:= gCIP_Run_Prog[gActualSimpleNum].CIP_SimpleArray[gActualStepNum].CIP_ControlWord1 ; mWaitEventReqDWord := mWaitEventReqDWord AND mWaitEventReqWordTemp ; mWaitEventReqDWord := SHL(mWaitEventReqDWord,16) ; mWaitEventReqWordTemp := gCIP_Run_Prog[gActualSimpleNum].CIP_SimpleArray[gActualStepNum].CIP_ControlWord0 ; mWaitEventReqDWord := mWaitEventReqDWord OR mWaitEventReqWordTemp ; gCIP_WaitEventReq_Array := _DWord_To_BoolArray(mWaitEventReqDWord) ; mWaitEventStatusDWord := _BoolArray_To_DWord(gCIP_WaitEventStatus_Array) ; (* mWaitEventStateWord1 := _BoolArray_To_Word(gCIP_WaitEventState_Array1) ;*) IF (mWaitEventReqDWord<>0) AND (mWaitEventReqDWord XOR mWaitEventStatusDWord)<>0 THEN gCIP_WaitAnyCond := TRUE ; ELSE gCIP_WaitAnyCond := FALSE ; END_IF gCIP_SPHigh_Cond := gCIP_Run_Prog[gActualSimpleNum].CIP_SetPoint_HighCond ; gCIP_SPLow_Cond := gCIP_Run_Prog[gActualSimpleNum].CIP_SetPoint_LowCond ; gCIP_SPTemperature := gCIP_Run_Prog[gActualSimpleNum].CIP_SetPoint_Temp ; IF NOT Hold AND NOT gCIP_Completed THEN gStepActualTime := gStepActualTime + 1 ; gCIPTotalElapsedTime := gCIPTotalElapsedTime + 1 ; END_IF ELSE gStepActualTime := 1 ; CIP_Prog_StepUp ; END_IF END_IF (***********************************************************************************************************) (* Transfer the X in the Simple program i-th Step to the Sp Sustain Memory *) (***********************************************************************************************************) gSp_CIP_Temp_En := mWordOut0[0] ; (* CIP Enable PID Control Temperature *) gSp_EV01 := mWordOut0[1] ; (* EV01 Deair Tank Water Level Control Valve *) gSp_EV02 := mWordOut0[2] ; (* EV02 Deair Tank Water Manual Valve *) gSp_EV03 := mWordOut0[3] ; (* EV03 Syrup Tank Syrup Level Control Valve *) gSp_EV04 := mWordOut0[4] ; (* EV04 Syrup Tank Syrup Manual Valve *) gSp_CIP_CO2_Inj := mWordOut0[5] ; (* Enable CO2 Injection Uring CIP *) gSp_EV14 := mWordOut0[6] ; (* EV14 Deair Tank Drain Valve *) gSp_EV15 := mWordOut0[7] ; (* EV15 Product Tank Drain Valve *) gSp_EV16 := mWordOut0[8] ; (* EV16 Syrup Tank Drain Valve *) (*gSp_EV17 := NOT mWordOut0[9] ; (* EV17 Deair + Product Tank SprayBall Valve *) (*gSp_EV61 := NOT mWordOut0[10] ; (* EV61 Syrup Tank SprayBall Valve *) gSp_EV23 := mWordOut0[11] ; (* EV23 Serpentine Drain Valve *) gSp_EV24 := NOT mWordOut0[12] ; (* EV24 Syrup Tank Recirc Valve *) gSp_EV31 := mWordOut0[13] ; (* EV31 Venturi Suction Valve *) gSp_EV32 := mWordOut0[14] ; (* EV32 Venturi Washing Valve *) gSp_EV33 := mWordOut0[15] ; (* EV33 Sanitizier Inlet Valve 1 - Caustic - *) gSp_EV34 := mWordOut1[0] ; (* EV34 Sanitizier Inlet Valve 2 *) gSp_EV35 := mWordOut1[1] ; (* EV35 Sanitizier Inlet Valve 3 *) gSp_EV36 := mWordOut1[2] ; (* EV36 Plant Recirc Valve *) gSp_EV37 := mWordOut1[3] ; (* EV37 Plant Drain Valve *) gSp_EV38 := mWordOut1[4] ; (* EV38 Plant Caustic Recovery Valve *) gSp_CIPRunning := mWordOut1[5] ; gSp_CIPDrainRequest := mWordOut1[6] ; gSp_CIPHotPhase := mWordOut1[7] ; mWordOut1[8] ; mWordOut1[9] ; gSp_P1 := mWordOut1[10] ; (* P1 Water Pump Run In CIP to get Prod Tank 100% level *) gSp_SyrRoomPump := mWordOut1[11] ; (* Syrup Room Pump Run In CIP *) mWordOut1[12] ; mWordOut1[13] ; mWordOut1[14] ; mWordOut1[15] ; mWordOut2[0] ; mWordOut2[1] ; mWordOut2[2] ; mWordOut2[3] ; mWordOut2[4] ; mWordOut2[5] ; mWordOut2[6] ; mWordOut2[7] ; mWordOut2[8] ; mWordOut2[9] ; mWordOut2[10] ; mWordOut2[11] ; mWordOut2[12] ; mWordOut2[13] ; mWordOut2[14] ; mWordOut2[15] ; mWordOut3[0] ; mWordOut3[1] ; mWordOut3[2] ; mWordOut3[3] ; mWordOut3[4] ; mWordOut3[5] ; mWordOut3[6] ; mWordOut3[7] ; mWordOut3[8] ; mWordOut3[9] ; mWordOut3[10] ; mWordOut3[11] ; mWordOut3[12] ; mWordOut3[13] ; mWordOut3[14] ; mWordOut3[15] ; END_ACTION