diff --git a/DUTs/E_SlitSoftLimits.TcDUT b/DUTs/E_SlitSoftLimits.TcDUT new file mode 100644 index 00000000..c2610442 --- /dev/null +++ b/DUTs/E_SlitSoftLimits.TcDUT @@ -0,0 +1,17 @@ + + + + + + \ No newline at end of file diff --git a/POUs/Motion/FB_Axis.TcPOU b/POUs/Motion/FB_Axis.TcPOU index 4689df3d..5955d21b 100644 --- a/POUs/Motion/FB_Axis.TcPOU +++ b/POUs/Motion/FB_Axis.TcPOU @@ -638,16 +638,16 @@ IF _stAxis.stControl.eCommand = E_MotionFunctions.eGearInMultiMaster AND _stAxis //Transfer gear ratios to FB fbGearInMultiMaster.GearRatio1 := _stAxis.stConfig.astMultiMasterAxisLatched[1].fRatio; fbGearInMultiMaster.GearRatio2 := _stAxis.stConfig.astMultiMasterAxisLatched[2].fRatio; - fbGearInMultiMaster.GearRatio3 := _stAxis.stConfig.astMultiMasterAxisLatched[3].fRatio; - fbGearInMultiMaster.GearRatio4 := _stAxis.stConfig.astMultiMasterAxisLatched[4].fRatio; +// fbGearInMultiMaster.GearRatio3 := _stAxis.stConfig.astMultiMasterAxisLatched[3].fRatio; (Not in use, commented due to slits code) +// fbGearInMultiMaster.GearRatio4 := _stAxis.stConfig.astMultiMasterAxisLatched[4].fRatio; (Not in use, commented due to slits code) fbGearInMultiMaster.Enable := TRUE; END_IF fbGearInMultiMaster(Slave := _stAxis.Axis, Master1 := GVL.astAxes[_stAxis.stConfig.astMultiMasterAxisLatched[1].nIndex].Axis, - Master2 := GVL.astAxes[_stAxis.stConfig.astMultiMasterAxisLatched[2].nIndex].Axis, - Master3 := GVL.astAxes[_stAxis.stConfig.astMultiMasterAxisLatched[3].nIndex].Axis, - Master4 := GVL.astAxes[_stAxis.stConfig.astMultiMasterAxisLatched[4].nIndex].Axis); + Master2 := GVL.astAxes[_stAxis.stConfig.astMultiMasterAxisLatched[2].nIndex].Axis); +// Master3 := GVL.astAxes[_stAxis.stConfig.astMultiMasterAxisLatched[3].nIndex].Axis, +// Master4 := GVL.astAxes[_stAxis.stConfig.astMultiMasterAxisLatched[4].nIndex].Axis); fbGearInMultiMaster.Enable:= FALSE; IF fbGearInMultiMaster.InGear THEN diff --git a/POUs/Motion/FB_SlitPair.TcPOU b/POUs/Motion/FB_SlitPair.TcPOU index adde0016..78c2b4a4 100644 --- a/POUs/Motion/FB_SlitPair.TcPOU +++ b/POUs/Motion/FB_SlitPair.TcPOU @@ -1,17 +1,16 @@  - - 0) OR (GVL.astAxes[iBladePositive].stStatus.nErrorID >0) THEN + eSlitPairState := E_SlitPairStates.ERROR; END_IF E_SlitPairStates.HOME_GAP: //"Home" the virtual axes @@ -111,8 +131,9 @@ CASE eSlitPairState OF eSlitPairState := E_SlitPairStates.CHECK_GAP_HOME_COMPLETE; E_SlitPairStates.CHECK_GAP_HOME_COMPLETE: //Wait for virtual homing completion - IF bGapHomed THEN + IF bGapHomed AND NOT GVL.astAxes[iGapSize].stStatus.bBusy AND NOT GVL.astAxes[iGapCentre].stStatus.bBusy THEN eSlitPairState := E_SlitPairStates.GEARIN_SLITS; + bHomingRequested := FALSE; END_IF E_SlitPairStates.GEARIN_SLITS: //Setup gearing @@ -122,34 +143,41 @@ CASE eSlitPairState OF E_SlitPairStates.CHECK_GEARIN_SLITS_COMPLETE: //Wait for gearing complete IF bBladesCoupled THEN eSlitPairState := E_SlitPairStates.SLITS_OPERATIONAL; + ELSIF NOT GVL.astAxes[iGapSize].stStatus.bEnabled AND NOT GVL.astAxes[iGapCentre].stStatus.bEnabled THEN + eSlitPairState := E_SlitPairStates.ERROR_GEAROUT; END_IF E_SlitPairStates.SLITS_OPERATIONAL: //SLITS OPERATIONAL - Monitor for any gear outs and re-gear when no busy blades bEnabled := TRUE; - IF NOT bBladesCoupled AND NOT GVL.astAxes[iBladeNegative].stStatus.bBusy AND NOT GVL.astAxes[iBladePositive].stStatus.bBusy THEN + checkSoftLimits(); //Soft limits are updated when axes are stopped + IF (NOT bBladesCoupled OR NOT bEnable) AND NOT GVL.astAxes[iBladeNegative].stStatus.bBusy AND NOT GVL.astAxes[iBladePositive].stStatus.bBusy THEN + eSlitPairState := E_SlitPairStates.GEAROUT_BLADES; + END_IF + IF (GVL.astAxes[iGapSize].stControl.eCommand = E_MotionFunctions.eHome AND GVL.astAxes[iGapSize].stControl.bExecute) OR + (GVL.astAxes[iGapCentre].stControl.eCommand = E_MotionFunctions.eHome AND GVL.astAxes[iGapCentre].stControl.bExecute) THEN eSlitPairState := E_SlitPairStates.GEAROUT_BLADES; + bHomingRequested := TRUE; END_IF - E_SlitPairStates.GEAROUT_BLADES: //Clear amy residual gearing + E_SlitPairStates.GEAROUT_BLADES: //Clear any residual gearing actClearSlitGearing(); eSlitPairState := E_SlitPairStates.CHECK_GEAROUT_COMPLETE; E_SlitPairStates.CHECK_GEAROUT_COMPLETE: //Check gearing cleared IF bBladesUncoupled THEN - eSlitPairState := E_SlitPairStates.CLEAR_GAP_CALIBRATION; //Back to homing, this ensures the setpoint position of the axis is updated. - END_IF - - E_SlitPairStates.CLEAR_GAP_CALIBRATION: - mcHomeGapSize.Execute := TRUE; - mcHomeGapCentre.Execute := TRUE; - IF mcHomeGapSize.Done AND mcHomeGapCentre.Done THEN - eSlitPairState := E_SlitPairStates.HOME_GAP; //Back to homing, this ensures the setpoint position of the axis is updated. + IF bHomingRequested THEN + eSlitPairState := E_SlitPairStates.HOME_BLADES; + bEnabled := FALSE; + ELSE + eSlitPairState := E_SlitPairStates.INIT; + END_IF END_IF E_SlitPairStates.ERROR: //ERROR STATE resetCounterTimeout := 0; bError := TRUE; bEnabled := FALSE; + actStopAxes(); IF bReset THEN bResetting := TRUE; eSlitPairState := E_SlitPairStates.ERROR_GEAROUT; @@ -186,6 +214,7 @@ CASE eSlitPairState OF bResetting := FALSE; END_IF END_CASE + bReset := FALSE; ]]> @@ -196,6 +225,40 @@ GVL.astAxes[iBladeNegative].stControl.eCommand := E_MotionFunctions.eGearOut; GVL.astAxes[iBladePositive].stControl.eCommand := E_MotionFunctions.eGearOut; GVL.astAxes[iBladeNegative].stControl.bExecute := TRUE; GVL.astAxes[iBladePositive].stControl.bExecute := TRUE; +]]> + + + + + @@ -206,15 +269,25 @@ IF bResetting THEN //ignore setting in error state if FB going through a reset RETURN; END_IF +//RESET - Use the reset from the virtual axes in order to reset the slits +bReset := GVL.astAxes[iGapCentre].stControl.bReset OR GVL.astAxes[iGapSize].stControl.bReset; + IF NOT bError AND bAxisErrorsPresent THEN eSlitPairState := E_SlitPairStates.ERROR; END_IF -IF eSlitPairState <> E_SlitPairStates.INIT AND NOT bAxesEnabled THEN - eSlitPairState := E_SlitPairStates.ERROR; -END_IF -IF (eSlitPairState <> E_SlitPairStates.INIT AND NOT bFunctionInErrorState) AND NOT bEnable THEN - eSlitPairState := E_SlitPairStates.ERROR; + +//Report error to virtual axes +IF eSlitPairState = E_SlitPairStates.ERROR THEN + GVL.astAxes[iGapCentre].stStatus.bError := TRUE; + GVL.astAxes[iGapSize].stStatus.bError := TRUE; END_IF + +//IF eSlitPairState <> E_SlitPairStates.INIT AND NOT bAxesEnabled THEN +// eSlitPairState := E_SlitPairStates.ERROR; +//END_IF +//IF (eSlitPairState <> E_SlitPairStates.INIT AND NOT bFunctionInErrorState) AND NOT bEnable THEN +// eSlitPairState := E_SlitPairStates.ERROR; +//END_IF IF bEnabled AND NOT bBladesHomed THEN eSlitPairState := E_SlitPairStates.ERROR; END_IF @@ -223,11 +296,21 @@ END_IF - + + + + + = GVL.astAxes[iBladePositive].stStatus.fActPosition + OR GVL.astAxes[iBladeNegative].stControl.fPosition >= GVL.astAxes[iBladePositive].stStatus.fActPosition; +GVL.astAxes[iBladePositive].stControl.bInterlockBwd := GVL.astAxes[iBladePositive].stStatus.fActPosition <= GVL.astAxes[iBladeNegative].stStatus.fActPosition + OR GVL.astAxes[iBladePositive].stControl.fPosition <= GVL.astAxes[iBladeNegative].stStatus.fActPosition; ]]> @@ -257,12 +340,77 @@ GVL.astAxes[iBladePositive].stConfig.astMultiMasterAxis[2].nIndex := iGapCentre; GVL.astAxes[iBladePositive].stConfig.astMultiMasterAxis[2].fRatio := 1; GVL.astAxes[iBladeNegative].stControl.bExecute := TRUE; GVL.astAxes[iBladePositive].stControl.bExecute := TRUE; +]]> + + + + + + + + + + = 0.0 THEN + GVL.astAxes[iGapSize].stConfig.fWriteAxisParameter := 2 * ABS(GVL.astAxes[iBladePositive].stConfig.fMaxSoftPosLimit + - GVL.astAxes[iGapCentre].stStatus.fActPosition); + ELSE + GVL.astAxes[iGapSize].stConfig.fWriteAxisParameter := 2 * ABS(GVL.astAxes[iBladeNegative].stConfig.fMinSoftPosLimit + - GVL.astAxes[iGapCentre].stStatus.fActPosition); + END_IF + END_IF + +E_SlitSoftLimits.FINISH: //FINISHED WHEN LAST WRITING OF PARAMETERS IS DONE + IF GVL.astAxes[iGapSize].stStatus.bDone AND NOT GVL.astAxes[iGapSize].stControl.bExecute THEN + eSoftLimitsUpdate := E_SlitSoftLimits.START; + bUpdateSoftLimits := FALSE; + END_IF + +END_CASE ]]> - + + + + + + + + + + + +