PROGRAM Main
VAR
// Motors
// Spectrometer Axes
// {attribute 'TcLinkTo' := '.bMyInput1:=TIIB[LensX-EL1004]^Channel 1^Input;
// .bMyInput2:=TIIB[LensX-EL1004]^Channel 2^Input'}
{attribute 'pytmc' := '
pv: TMO:SPEC:MMS:01
'}
M1 : DUT_MotionStage := (bPowerSelf:=TRUE,
nEnableMode:=ENUM_StageEnableMode.DURING_MOTION,
// nEnableMode:=ENUM_StageEnableMode.ALWAYS,
nHomingMode := ENUM_EpicsHomeCmd.ABSOLUTE_SET); // Lens X
{attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[FoilX-EL7041]^STM Status^Status^Digital input 1;
.bLimitBackwardEnable:=TIIB[FoilX-EL7041]^STM Status^Status^Digital input 2'}
{attribute 'pytmc' := '
pv: TMO:SPEC:MMS:02
'}
M2 : DUT_MotionStage := (bPowerSelf:=TRUE,
nEnableMode:=ENUM_StageEnableMode.DURING_MOTION,
// nEnableMode:=ENUM_StageEnableMode.ALWAYS,
nHomingMode := ENUM_EpicsHomeCmd.ABSOLUTE_SET); // AL Foil X
{attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[ZonePlateX-EL7041]^STM Status^Status^Digital input 2;
.bLimitBackwardEnable:=TIIB[ZonePlateX-EL7041]^STM Status^Status^Digital input 1'}
{attribute 'pytmc' := '
pv: TMO:SPEC:MMS:03
'}
M3 : DUT_MotionStage := (bPowerSelf:=TRUE,
nEnableMode:=ENUM_StageEnableMode.DURING_MOTION,
// nEnableMode:=ENUM_StageEnableMode.ALWAYS,
nHomingMode := ENUM_EpicsHomeCmd.ABSOLUTE_SET); // Zone Plate X
{attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[ZonePlateY-EL7041]^STM Status^Status^Digital input 2;
.bLimitBackwardEnable:=TIIB[ZonePlateY-EL7041]^STM Status^Status^Digital input 1'}
{attribute 'pytmc' := '
pv: TMO:SPEC:MMS:04
'}
M4 : DUT_MotionStage := (bPowerSelf:=TRUE,
nEnableMode:=ENUM_StageEnableMode.DURING_MOTION,
// nEnableMode:=ENUM_StageEnableMode.ALWAYS,
nHomingMode := ENUM_EpicsHomeCmd.ABSOLUTE_SET); // Zone Plate Y
{attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[ZonePlateZ-EL7041]^STM Status^Status^Digital input 1;
.bLimitBackwardEnable:=TIIB[ZonePlateZ-EL7041]^STM Status^Status^Digital input 2'}
{attribute 'pytmc' := '
pv: TMO:SPEC:MMS:05
'}
M5 : DUT_MotionStage := (bPowerSelf:=TRUE,
nEnableMode:=ENUM_StageEnableMode.DURING_MOTION,
// nEnableMode:=ENUM_StageEnableMode.ALWAYS,
nHomingMode := ENUM_EpicsHomeCmd.ABSOLUTE_SET); // Zone Plate Z
{attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[YagX-EL7041]^STM Status^Status^Digital input 2;
.bLimitBackwardEnable:=TIIB[YagX-EL7041]^STM Status^Status^Digital input 1'}
{attribute 'pytmc' := '
pv: TMO:SPEC:MMS:06
'}
M6 : DUT_MotionStage := (bPowerSelf:=TRUE,
nEnableMode:=ENUM_StageEnableMode.DURING_MOTION,
// nEnableMode:=ENUM_StageEnableMode.ALWAYS,
nHomingMode := ENUM_EpicsHomeCmd.ABSOLUTE_SET); // Yag X
{attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[YagY-EL7041]^STM Status^Status^Digital input 1;
.bLimitBackwardEnable:=TIIB[YagY-EL7041]^STM Status^Status^Digital input 2'}
{attribute 'pytmc' := '
pv: TMO:SPEC:MMS:07
'}
M7 : DUT_MotionStage := (bPowerSelf:=TRUE,
nEnableMode:=ENUM_StageEnableMode.DURING_MOTION,
// nEnableMode:=ENUM_StageEnableMode.ALWAYS,
nHomingMode := ENUM_EpicsHomeCmd.ABSOLUTE_SET); // Yag Y
{attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[YagZ-EL7041]^STM Status^Status^Digital input 2;
.bLimitBackwardEnable:=TIIB[YagZ-EL7041]^STM Status^Status^Digital input 1'}
{attribute 'pytmc' := '
pv: TMO:SPEC:MMS:08
'}
M8 : DUT_MotionStage := (bPowerSelf:=TRUE,
nEnableMode:=ENUM_StageEnableMode.DURING_MOTION,
// nEnableMode:=ENUM_StageEnableMode.ALWAYS,
nHomingMode := ENUM_EpicsHomeCmd.ABSOLUTE_SET); // Yag Z
{attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[YagTheta-EL7041]^STM Status^Status^Digital input 1;
.bLimitBackwardEnable:=TIIB[YagTheta-EL7041]^STM Status^Status^Digital input 2'}
{attribute 'pytmc' := '
pv: TMO:SPEC:MMS:09
'}
M9 : DUT_MotionStage := (bPowerSelf:=TRUE,
nEnableMode:=ENUM_StageEnableMode.DURING_MOTION,
// nEnableMode:=ENUM_StageEnableMode.ALWAYS,
nHomingMode := ENUM_EpicsHomeCmd.ABSOLUTE_SET); // Yag Theta
// Spectrometer Axes
fbMotionStageM1 : FB_MotionStage;
fbMotionStageM2 : FB_MotionStage;
fbMotionStageM3 : FB_MotionStage;
fbMotionStageM4 : FB_MotionStage;
fbMotionStageM5 : FB_MotionStage;
fbMotionStageM6 : FB_MotionStage;
fbMotionStageM7 : FB_MotionStage;
fbMotionStageM8 : FB_MotionStage;
fbMotionStageM9 : FB_MotionStage;
// motorlimit: BOOL;
// bLimitForwardEnable: BOOL;
// bMyInput: BOOL;
// bMyInput2: BOOL;
// bMyInput1: BOOL;
END_VAR
(*
// Persistent Memory
fbWritePersistentData : WritePersistentData;
bInit : BOOL := TRUE;
fbWriteDelay : TON;
mcSetPosition : ARRAY [1..6] of MC_SetPosition;
VAR PERSISTENT
fLensXPos : LREAL;
fFoilXPos : LREAL;
fZonePlateXPos : LREAL;
fZonePlateYPos : LREAL;
fZonePlateZPos : LREAL;
fYagXPos : LREAL;
END_VAR
*)
(*IF bInit THEN
//Sets axes positions with persistent value
// Gas Nozzle
mcSetPosition[1](Axis:=M1.Axis, Position:=fLensXPos, Mode:=FALSE, Execute:=TRUE);
mcSetPosition[2](Axis:=M2.Axis, Position:=fFoilXPos, Mode:=FALSE, Execute:=TRUE);
mcSetPosition[3](Axis:=M3.Axis, Position:=fZonePlateXPos, Mode:=FALSE, Execute:=TRUE);
// Sample Paddle
mcSetPosition[4](Axis:=M4.Axis, Position:=fZonePlateYPos, Mode:=FALSE, Execute:=TRUE);
mcSetPosition[5](Axis:=M5.Axis, Position:=fZonePlateZPos, Mode:=FALSE, Execute:=TRUE);
mcSetPosition[6](Axis:=M6.Axis, Position:=fYagXPos, Mode:=FALSE, Execute:=TRUE);
if(mcSetPosition[1].Done and NOT mcSetPosition[1].Error) AND
(mcSetPosition[2].Done and NOT mcSetPosition[2].Error) AND
(mcSetPosition[3].Done and NOT mcSetPosition[3].Error) AND
(mcSetPosition[4].Done and NOT mcSetPosition[4].Error) AND
(mcSetPosition[5].Done and NOT mcSetPosition[5].Error) AND
(mcSetPosition[6].Done and Not mcSetPosition[6].Error) THEN
bInit:=FALSE;
mcSetPosition[1](Axis:=M1.Axis, Execute:=FALSE);
mcSetPosition[2](Axis:=M2.Axis, Execute:=FALSE);
mcSetPosition[3](Axis:=M3.Axis, Execute:=FALSE);
mcSetPosition[4](Axis:=M4.Axis, Execute:=FALSE);
mcSetPosition[5](Axis:=M5.Axis, Execute:=FALSE);
mcSetPosition[6](Axis:=M6.Axis, Execute:=FALSE);
END_IF
ELSE
*)
// Hardware Enable and fbMotionStage
//Lens X
M1.bHardwareEnable := TRUE;
fbMotionStageM1(stMotionStage:=M1);
// AL Foil X
M2.bHardwareEnable := TRUE;
fbMotionStageM2(stMotionStage:=M2);
//Zone Plate
M3.bHardwareEnable := TRUE;
fbMotionStageM3(stMotionStage:=M3);
M4.bHardwareEnable := TRUE;
fbMotionStageM4(stMotionStage:=M4);
M5.bHardwareEnable := TRUE;
fbMotionStageM5(stMotionStage:=M5);
// YAG
M6.bHardwareEnable := TRUE;
fbMotionStageM6(stMotionStage:=M6);
M7.bHardwareEnable := TRUE;
fbMotionStageM7(stMotionStage:=M7);
M8.bHardwareEnable := TRUE;
fbMotionStageM8(stMotionStage:=M8);
M9.bHardwareEnable := TRUE;
fbMotionStageM9(stMotionStage:=M9);
// M1.bLimitForwardEnable:=not io.bMyInput;
M1.bLimitForwardEnable:=not IO.bMyInput1;
M1.bLimitBackwardEnable:=not IO.bMyInput2;
(*
// Keep track of position
fLensXPos := M1.Axis.NcToPlc.ActPos;
fFoilXPos := M2.Axis.NcToPlc.ActPos;
fZonePlateXPos := M3.Axis.NcToPlc.ActPos;
fZonePlateYPos := M4.Axis.NcToPlc.ActPos;
fZonePlateZPos := M5.Axis.NcToPlc.ActPos;
fYagXPos := M6.Axis.NcToPlc.ActPos;
// Persistent Memory
IF fbWriteDelay.Q THEN
fbWritePersistentData(NETID:='', PORT:=851, START:=TRUE, TMOUT:=T#1S);
fbWriteDelay(IN:=FALSE);
ELSE
fbWritePersistentData(START:=FALSE);
fbWriteDelay(IN:=TRUE, PT:=T#0.5S);
END_IF
END_IF;
*)
END_PROGRAM