DUTs ---- GVLs ---- IO ^^ :: {attribute 'qualified_only'} VAR_GLOBAL {attribute 'TcLinkTo' := 'TIID^Device 1 (EtherCAT)^Term 19 (EK1200)^Term 23 (EK1122)^Term 24 (EK1100)^LensX-EL1004^Channel 1^Input'} bMyInput1 AT %I* : BOOL; {attribute 'TcLinkTo' := 'TIID^Device 1 (EtherCAT)^Term 19 (EK1200)^Term 23 (EK1122)^Term 24 (EK1100)^LensX-EL1004^Channel 2^Input'} bMyInput2 AT %I* : BOOL; END_VAR POUs ---- Main ^^^^ :: 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 Related: * `IO`_