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
]]>
-
+
+
+
+
+
+
+
+
+
+
+
+