Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Reset flags
- IF #Inputs.ResetButton OR #Master.Reset THEN
- #tStartFlag := FALSE;
- #tStartFlag2 := FALSE;
- END_IF;
- #tControl := #Control;//Get current status of VFD control word
- #tControl.DecRamp := #Settings.ConveyorDecRamp;
- #tControl.AccRamp := #Settings.ConveyorAccRamp;
- //MANUAL----------------------------------------------------------------------------------------------------------------
- //**********************************************************************************************************************
- IF NOT #Inputs.SW_Auto AND "FB_HMI_DB".MAN_Conveyor AND "MAN_Screen" AND NOT #Alarms.Active THEN
- "FC_VALUE_SCALE"(EngUnitsMax := 2160,
- EngUnitsMin := 0.01,
- InputRaw := #Settings.SpeedConveyor,
- InputRawMin := 1,
- InputRawMax := 25.8,
- ScaledValue => #tScale);
- #Manual := TRUE;
- IF #Inputs.CON_Drive_Reverse THEN
- #tSpeed := REAL_TO_INT(#tScale);
- ELSIF #Inputs.CON_Drive_Forward THEN
- #tSpeed := REAL_TO_INT(#tScale);
- #tSpeed := #tSpeed * -1;
- END_IF;
- ELSE
- #Manual := FALSE;
- END_IF;
- //AUTOMATIC-------------------------------------------------------------------------------------------------------------
- //**********************************************************************************************************************
- //Complete handshake and enable transfer
- IF #Trolley.Auto AND #Trolley.InPosition AND (#Master.JobType > 0 AND #Master.JobType < 5) AND NOT #Alarms.Active AND "DB_PROFIDRIVE_DRIVE".STATUS.Speed <= 0 AND NOT #Inputs.CON_Drive_Brake THEN
- "FC_CONVEYOR_HANDSHAKE"(Enable := #Master.JobEnable AND #Trolley.Block = "DB_MASTER".Navigation.Destination.Final,
- Auto := #Trolley.Auto,
- Occupied := #Trolley.Occupied,
- InPosition := #Trolley.InPosition,
- JobType := #Master.JobType,
- EnableTransfer => #tTransfer); //Allow transfer
- ELSE
- #tTransfer := FALSE;
- "DB_STATUS".Handshake.Load.Ready := FALSE;
- "DB_STATUS".Handshake.Load.Running := FALSE;
- "DB_STATUS".Handshake.Unload.Ready := FALSE;
- "DB_STATUS".Handshake.Unload.Running := FALSE;
- END_IF;
- IF #tTransfer THEN
- "FC_VALUE_SCALE"(EngUnitsMax := 2160,
- EngUnitsMin := 0.01,
- InputRaw := #Settings.SpeedConveyor,
- InputRawMin := 1,
- InputRawMax := 25.8,
- ScaledValue => #tScale);
- //Speed converted from velocity
- #tSpeed := REAL_TO_INT(#tScale);
- //1=Load from left, 2=Load from right, 3=Unload to left, 4=Unload to right, 5=Position and end mission
- CASE #Master.JobType OF
- 1:
- #tStart := #Inputs.PE_Pallet_OH_Left;
- #tEnd := #Inputs.PE_Pallet_OH_Right;
- #tStart2 := #Inputs.PE_Pallet_Stop_Left;
- #tStop := #Inputs.PE_Pallet_Stop_Right;
- #tSpeed := #tSpeed * -1; //Reverse speed;
- 2:
- #tStart := #Inputs.PE_Pallet_OH_Right;
- #tEnd := #Inputs.PE_Pallet_OH_Left;
- #tStart2 := #Inputs.PE_Pallet_Stop_Right;
- #tStop := #Inputs.PE_Pallet_Stop_Left;
- 3:
- #tStart := #Inputs.PE_Pallet_OH_Left;
- #tStop := #Inputs.PE_Pallet_OH_Right;
- 4:
- #tStart := #Inputs.PE_Pallet_OH_Right;
- #tStop := #Inputs.PE_Pallet_OH_Left;
- #tSpeed := #tSpeed * -1; //Reverse speed
- ELSE:
- //Invalid job type
- IF #Master.JobType <> 5 THEN
- #tControl.Enable := FALSE;
- #tControl.SpeedSet := 0;
- END_IF;
- END_CASE;
- ELSE
- // #tStartFlag := FALSE; //Reset flags when we lose tTransfer
- #tStartFlag2 := FALSE;
- #LoadComplete := FALSE;
- END_IF;
- //-------------------------------LOADING-----------------------------------------------------
- IF (#Master.JobType = 1 OR #Master.JobType = 2) AND (#tTransfer OR #tStartFlag OR #LoadComplete) AND NOT #Alarms.Active THEN
- //Check sensors are flagged in correct order while loading.
- IF #tStart THEN
- #tStartFlag := TRUE; //Start Photoeye made
- END_IF;
- IF #tStartFlag AND #tStart2 THEN
- #tStartFlag2 := TRUE; //Opposite stop photoeye made
- END_IF;
- IF (NOT #tStart AND #tStartFlag AND (NOT #Inputs.PE_Pallet_OH_Left AND NOT #Inputs.PE_Pallet_OH_Right) AND #tStop) OR #LoadComplete THEN
- #tSpeed := 0;
- #Control.SpeedSet := 0;
- #LoadComplete := TRUE;
- END_IF;
- IF #LoadComplete AND (#tStop OR #tStart2) AND (NOT #Inputs.PE_Pallet_OH_Left OR NOT #Inputs.PE_Pallet_OH_Right) AND NOT #tEnd AND #VFDStatus.Speed = 0 THEN
- #tSpeed := 0;
- #Control.SpeedSet := 0;
- #Trolley.Occupied := TRUE;
- #LoadComplete := FALSE;
- END_IF;
- IF #tEnd THEN //-----------------------------------OVERHANG ALARM-----------------------------------
- #Alarms.Overhang := TRUE;
- #Alarms.Active := TRUE;
- END_IF;
- END_IF;
- //------------------------------UNLOADING----------------------------------------------------
- #Unloading := #tStartFlag AND (#Master.JobType = 3 OR #Master.JobType = 4) AND #Trolley.Occupied; //Keep transfer active until unoccupied.
- //Set occupied false when we lose master jobenable and empty
- IF (#Master.JobType = 3 OR #Master.JobType = 4) AND (#tTransfer OR #Unloading) AND NOT #Alarms.Active AND #Trolley.InPosition THEN
- #tStartFlag := TRUE; //Set start flag when transfer begins
- //Occupied = false when sensors are clear
- #UnloadSensors(IN := NOT #Inputs.PE_Pallet_Stop_Left AND NOT #Inputs.PE_Pallet_Stop_Right AND NOT #tStart AND NOT #tStop,
- PT := T#500MS);
- IF #UnloadSensors.Q THEN
- //Force ready handshaking after transfer completes
- "DB_STATUS".Handshake.Unload.Running := FALSE;
- "DB_STATUS".Handshake.Unload.Ready := TRUE;
- #Trolley.Occupied := FALSE;
- #tSpeed := 0;
- #tControl.SpeedSet := 0;
- #tStartFlag := FALSE;
- END_IF;
- IF #tStop THEN //-------------------------------------OVERHANG ALARM-----------------------------------
- #Alarms.Active := TRUE;
- #Alarms.Overhang := TRUE;
- END_IF;
- ELSIF (#Master.JobType = 3 OR #Master.JobType = 4) AND #Alarms.Active THEN //Reset unloading start flag if an alarm is active
- #tStartFlag := FALSE;
- END_IF;
- //Job type 5
- IF #Master.JobType = 5 AND #Trolley.InPosition THEN
- "DB_STATUS".Handshake.Mission.End := TRUE;
- END_IF;
- //-----------------------------DRIVE AND BRAKE----------------------------------------------
- IF ((#Master.JobType >= 1 AND #Master.JobType <= 4) AND #tTransfer) OR ((#Inputs.CON_Drive_Forward OR #Inputs.CON_Drive_Reverse) AND "FB_HMI_DB".MAN_Conveyor AND #Manual) AND NOT #Alarms.Active THEN
- IF #Settings.SpeedConveyor <> 0 THEN
- #tControl.SpeedSet := #tSpeed; //Set VFD speed
- #tControl.Enable := #Inputs.CON_Conveyor_Brake; //Run VFD once brake is released
- "ConveyorBrake" := TRUE;
- ELSE
- #tControl.Enable := FALSE;
- #tControl.SpeedSet := 0;
- "ConveyorBrake" := NOT (#VFDStatus.Speed <= 5 AND #VFDStatus.Speed >= -5);
- END_IF;//Release the brake if no alarms
- ELSE
- #tControl.Enable := FALSE;
- #tControl.SpeedSet := 0;
- "ConveyorBrake" := NOT (#VFDStatus.Speed <= 5 AND #VFDStatus.Speed >= -5);
- END_IF;
- //Write speed + control word for vfd
- #Control := #tControl;
- //**********************************************************************************************************************
- //END AUTOMATIC---------------------------------------------------------------------------------------------------------
- //-------------------------------ALARMS-------------------------------------------------------
- #tTimeout(IN:= #tTransfer, //Start timer when transfer is active
- PT:= #Settings.TransferTimeout);
- IF #tTimeout.Q AND (#Master.JobType = 1 OR #Master.JobType = 2) THEN //Timeout Loading
- #Alarms.TimeoutLoading := TRUE;
- #Alarms.Active := TRUE;
- ELSIF #tTimeout.Q AND (#Master.JobType = 3 OR #Master.JobType = 4) THEN //Timeout Unloading
- #Alarms.TimeoutUnloading := TRUE;
- #Alarms.Active := TRUE;
- END_IF;
- IF (NOT #tTransfer AND NOT #Unloading) AND (#Inputs.PE_Pallet_OH_Left OR #Inputs.PE_Pallet_OH_Right) AND #Inputs.SW_Auto THEN //OVERHANG
- #Alarms.Overhang := TRUE;
- #Alarms.Active := TRUE;
- END_IF;
- IF #Master.JobType = 1 AND #tTransfer AND #tStart2 AND NOT #tStartFlag THEN //SENSOR: Overhang Left
- #Alarms.SensorOHLeft := TRUE;
- #Alarms.Active := TRUE;
- ELSIF #Master.JobType = 1 AND NOT #tStartFlag2 AND #tStop THEN //SENSOR: Stop Left
- #Alarms.SensorStopLeft := TRUE;
- #Alarms.Active := TRUE;
- END_IF;
- IF #Master.JobType = 2 AND #tTransfer AND #tStart2 AND NOT #tStartFlag THEN //SENSOR: Overhang Right
- #Alarms.SensorOHRight := TRUE;
- #Alarms.Active := TRUE;
- ELSIF #Master.JobType = 2 AND NOT #tStartFlag2 AND #tStop THEN //SENSOR: Stop Right
- #Alarms.SensorStopRight := TRUE;
- #Alarms.Active := TRUE;
- END_IF;
- //Pallet Present
- IF (NOT #tTransfer AND NOT #Unloading) AND (#Master.JobType = 1 OR #Master.JobType = 2) AND (#Inputs.PE_Pallet_Stop_Left OR #Inputs.PE_Pallet_Stop_Right) AND NOT #tStartFlag AND #Inputs.SW_Auto THEN
- #Alarms.PalletPresent := TRUE;
- #Alarms.Active := TRUE; //Pallet Missing
- ELSIF (NOT #tTransfer OR NOT #Unloading) AND (#Master.JobType = 3 OR #Master.JobType = 4) AND NOT (#Inputs.PE_Pallet_Stop_Left OR #Inputs.PE_Pallet_Stop_Right) AND NOT #tStartFlag AND #Trolley.Occupied AND #Inputs.SW_Auto THEN
- #Alarms.PalletMissing := TRUE;
- #Alarms.Active := TRUE;
- END_IF;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement