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: