DUTs

E_MR1L0_CoatingStates

{attribute 'qualified_only'}
{attribute 'strict'}
TYPE E_MR1L0_CoatingStates :
(
    Unknown := 0,
    L0B4C := 1,
    L0Ni := 2,
    L1B4C := 3,
    L1Ni := 4
) UINT;
END_TYPE
Related:

E_MR2L0_CoatingStates

{attribute 'qualified_only'}
{attribute 'strict'}
TYPE E_MR2L0_CoatingStates :
(
    Unknown := 0,
    B4C := 1,
    Ni := 2
) UINT;
END_TYPE

GVLs

Global_Version

{attribute 'TcGenerated'}
{attribute 'no-analysis'}
{attribute 'linkalways'}
// This function has been automatically generated from the project information.
VAR_GLOBAL CONSTANT
    {attribute 'const_non_replaced'}
    stLibVersion_lcls_plc_lfe_optics : ST_LibVersion := (iMajor := 3, iMinor := 0, iBuild := 0, iRevision := 0, nFlags := 1, sVersion := '3.0.0');
END_VAR

GVL_COM_Buffers

VAR_GLOBAL
    // M1L0
    Serial_RXBuffer_M1L0 : ComBuffer;
    Serial_TXBuffer_M1L0 : ComBuffer;

    // M2L0
    Serial_RXBuffer_M2L0 : ComBuffer;
    Serial_TXBuffer_M2L0 : ComBuffer;
END_VAR

GVL_M1L0

{attribute 'qualified_only'}
VAR_GLOBAL
    // Pitch Mechanism:
    {attribute 'TcLinkTo' := '.diEncCnt:=TIIB[EL5042_M1L0_PitchBender]^FB Inputs Channel 1^Position'}
    M1L0_Pitch : HOMS_PitchMechanism := (ReqPosLimHi := 120.0,
                                         ReqPosLimLo := -182.0,
                                         diEncPosLimHi := 8662020,
                                         diEncPosLimLo := 8507095);
END_VAR

GVL_M1L0_Constants

{attribute 'qualified_only'}
VAR_GLOBAL CONSTANT
    // Encoder reference values in counts = nm
    // Enc Ref Vals from alignment 2020-5-27
    nYUP_ENC_REF : ULINT := 16171800;
    nYDWN_ENC_REF : ULINT := 14866900;
    nXUP_ENC_REF : ULINT := 24901730;
    nXDWN_ENC_REF : ULINT := 22921460;
END_VAR

GVL_M2L0

{attribute 'qualified_only'}
VAR_GLOBAL
    // Pitch Mechanism
    {attribute 'TcLinkTo' := '.diEncCnt:=TIIB[EL5042_M2L0_PitchBender]^FB Inputs Channel 1^Position'}
    M2L0_Pitch : HOMS_PitchMechanism := (ReqPosLimHi := 154.9,
                                         ReqPosLimLo := -45.1,
                                         diEncPosLimHi := 9550777,
                                         diEncPosLimLo := 9448178);
END_VAR

GVL_M2L0_Constants

{attribute 'qualified_only'}
VAR_GLOBAL CONSTANT
    // Encoder reference values in counts = nm
    // Encoder reference values after alignment 5-29-20
    nYUP_ENC_REF : ULINT := 12018200;
    nYDWN_ENC_REF : ULINT := 15143700;
    nXUP_ENC_REF : ULINT := 25363400;
    nXDWN_ENC_REF : ULINT := 24398100;
END_VAR

GVL_PMPS

{attribute 'qualified_only'}
VAR_GLOBAL
    // Implementation of the FFO
    {attribute 'pytmc' := '
        pv: PLC:LFE:OPTICS:FFO:01
    '}
    {attribute 'TcLinkTo' := '.q_xFastFaultOut:=TIIB[PMPS_FFO]^Channel 1^Output'}
    g_FastFaultOutput1 : FB_HardwareFFOutput := (bAutoReset:=TRUE, i_sNetID:='172.21.88.66.1.1');

    {attribute 'pytmc' := '
        pv: PLC:LFE:OPTICS:FFO:02
    '}
    {attribute 'TcLinkTo' := '.q_xFastFaultOut:=TIIB[PMPS_FFO]^Channel 2^Output'}
    g_FastFaultOutput2 : FB_HardwareFFOutput := (bAutoReset:=TRUE, i_sNetID:='172.21.88.66.1.1');

    {attribute 'pytmc' := '
        pv: PLC:LFE:OPTICS:ARB:01
    '}
    g_fbArbiter1 : FB_Arbiter(1);

    {attribute 'pytmc' := '
        pv: PLC:LFE:OPTICS:ARB:02
    '}
    g_fbArbiter2 : FB_Arbiter(2);
END_VAR

GVL_SerialIO

VAR_GLOBAL
    //Better have your inputs and outputs!
    // M1L0
    Serial_stComIn_M1L0 AT %I* : EL6inData22B; // M1L0 In Serial Comm Array
    Serial_stComOut_M1L0 AT %Q* : EL6outData22B; // M1L0 Out Serual Comm Array

    // M2L0
    Serial_stComIn_M2L0 AT %I* : EL6inData22B; // M2L0 In Serial Comm Array
    Serial_stComOut_M2L0 AT %Q* : EL6outData22B; // M2L0 Out Serial Comm Array
END_VAR

GVL_States

{attribute 'qualified_only'}
VAR_GLOBAL
    stDefaultY : ST_PositionState := (
        fDelta:=100,
        fVelocity:=100,
        fAccel:=200,
        fDecel:=200,
        bMoveOk:=TRUE,
        bValid:=TRUE,
        bUseRawCounts:=TRUE
    );
END_VAR

POUs

Main

PROGRAM Main
VAR
    // M1L0
    // Motors
    {attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[EL7041-1000_M1L0_Yup]^STM Status^Status^Digital input 1;
                              .bLimitBackwardEnable:=TIIB[EL7041-1000_M1L0_Yup]^STM Status^Status^Digital input 2;
                              .nRawEncoderULINT:=TIIB[EL5042_M1L0_Yupdwn]^FB Inputs Channel 1^Position'}
    {attribute 'pytmc' := '
        pv: MR1L0:HOMS:MMS:YUP
    '}
    M1 : ST_MotionStage := (fVelocity:=200.0, nEnableMode:=ENUM_StageEnableMode.ALWAYS, bPowerSelf:=TRUE, sName:='MR1L0_YUP'); // M1L0 Yup
    fbMotionStage_m1 : FB_MotionStage;

    {attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[EL7041-1000_M1L0_Ydwn]^STM Status^Status^Digital input 1;
                              .bLimitBackwardEnable:=TIIB[EL7041-1000_M1L0_Ydwn]^STM Status^Status^Digital input 2'}
    {attribute 'pytmc' := '
        pv: MR1L0:HOMS:MMS:YDWN
    '}
    M2 : ST_MotionStage := (fVelocity:=200.0, nEnableMode:=ENUM_StageEnableMode.ALWAYS, bPowerSelf:=TRUE, sName:='MR1L0_YDWN'); // M1L0 Ydwn
    fbMotionStage_m2 : FB_MotionStage;

    {attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[EL7041-1000_M1L0_Xup]^STM Status^Status^Digital input 1;
                              .bLimitBackwardEnable:=TIIB[EL7041-1000_M1L0_Xup]^STM Status^Status^Digital input 2;
                              .nRawEncoderULINT:=TIIB[EL5042_M1L0_Xupdwn]^FB Inputs Channel 1^Position'}
    {attribute 'pytmc' := '
        pv: MR1L0:HOMS:MMS:XUP
    '}
    M3 : ST_MotionStage := (fVelocity:=1000.0, nEnableMode:=ENUM_StageEnableMode.ALWAYS, bPowerSelf:=TRUE, sName:='MR1L0_XUP'); // M1L0 Xup
    fbMotionStage_m3 : FB_MotionStage;

    {attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[EL7041-1000_M1L0_Xdwn]^STM Status^Status^Digital input 1;
                              .bLimitBackwardEnable:=TIIB[EL7041-1000_M1L0_Xdwn]^STM Status^Status^Digital input 2'}
    {attribute 'pytmc' := '
        pv: MR1L0:HOMS:MMS:XDWN
    '}
    M4 : ST_MotionStage := (fVelocity:=1000.0, nEnableMode:=ENUM_StageEnableMode.ALWAYS, bPowerSelf:=TRUE, sName:='MR1L0_XDWN'); // M1L0 Xdwn
    fbMotionStage_m4 : FB_MotionStage;

    {attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[EL7041-1000_M1L0_PitchCoarse]^STM Status^Status^Digital input 1;
                              .bLimitBackwardEnable:=TIIB[EL7041-1000_M1L0_PitchCoarse]^STM Status^Status^Digital input 2;
                              .nRawEncoderULINT:=TIIB[EL5042_M1L0_PitchBender]^FB Inputs Channel 1^Position'}
    {attribute 'pytmc' := '
        pv: MR1L0:HOMS:MMS:PITCH
    '}
    M5 : ST_MotionStage := (fVelocity:=150.0,nEnableMode:=ENUM_StageEnableMode.ALWAYS, bPowerSelf:=TRUE, sName:='MR1L0_PITCH'); // M1L0 Pitch Stepper
    fbMotionStage_m5 : FB_MotionStage;

    {attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[EL7041-1000_M1L0_Bender]^STM Status^Status^Digital input 1;
                              .bLimitBackwardEnable:=TIIB[EL7041-1000_M1L0_Bender]^STM Status^Status^Digital input 2;
                              .nRawEncoderULINT:=TIIB[EL5042_M1L0_PitchBender]^FB Inputs Channel 2^Position'}
    {attribute 'pytmc' := '
        pv: MR1L0:HOMS:MMS:BENDER
    '}
    M6 : ST_MotionStage := (fVelocity:=150.0, nEnableMode:=ENUM_StageEnableMode.ALWAYS, bPowerSelf:=TRUE, sName:='MR1L0_BENDER'); // M1L0 Bender
    fbMotionStage_m6 : FB_MotionStage;

    {attribute 'TcLinkTo' := '.fbRunHOMS.bSTOEnable1:=TIIB[EL1004_M1L0_STO]^Channel 1^Input;
                              .fbRunHOMS.bSTOEnable2:=TIIB[EL1004_M1L0_STO]^Channel 2^Input;
                              .fbRunHOMS.stYupEnc.Count:=TIIB[EL5042_M1L0_Yupdwn]^FB Inputs Channel 1^Position;
                              .fbRunHOMS.stYdwnEnc.Count:=TIIB[EL5042_M1L0_Yupdwn]^FB Inputs Channel 2^Position;
                              .fbRunHOMS.stXupEnc.Count:=TIIB[EL5042_M1L0_Xupdwn]^FB Inputs Channel 1^Position;
                              .fbRunHOMS.stXdwnEnc.Count:=TIIB[EL5042_M1L0_Xupdwn]^FB Inputs Channel 2^Position'}
    {attribute 'pytmc' := '
        pv: MR1L0:HOMS
    '}
    M1L0 : DUT_HOMS;
    {attribute 'pytmc' := '
        pv: MR1L0:HOMS:STATS
    '}
    fbMR1L0GantryStats : FB_HomsStats;

    // Encoder Arrays/RMS Watch:
    {attribute 'pytmc' := '
        pv: MR1L0:HOMS:ENC:Y
    '}
    fbYRMSErrorM1L0 : FB_RMSWatch;
    fMaxYRMSErrorM1L0 : LREAL;
    fMinYRMSErrorM1L0 : LREAL;

    {attribute 'pytmc' := '
        pv: MR1L0:HOMS:ENC:X
    '}
    fbXRMSErrorM1L0 : FB_RMSWatch;
    fMaxXRMSErrorM1L0 : LREAL;
    fMinXRMSErrorM1L0 : LREAL;

    {attribute 'pytmc' := '
        pv: MR1L0:HOMS:ENC:PITCH
    '}
    fbPitchRMSErrorM1L0 : FB_RMSWatch;
    fMaxPitchRMSErrorM1L0 : LREAL;
    fMinPitchRMSErrorM1L0 : LREAL;

    {attribute 'pytmc' := '
        pv: MR1L0:HOMS:ENC:BENDER
    '}
    fbBenderRMSErrorM1L0 : FB_RMSWatch;
    fMaxBenderRMSErrorM1L0 : LREAL;
    fMinBenderRMSErrorM1L0 : LREAL;

    // Pitch Control
    //fbM1L0PitchControl : FB_PitchControl;
    //bM1L0PitchDone : BOOL;
    //bM1L0PitchBusy : BOOL;

    // Bender Control
    fbBenderM1L0 : FB_Bender;

    // Raw Encoder Counts
    {attribute 'pytmc' := '
        pv: MR1L0:HOMS:ENC:YUP:CNT
        field: EGU cnt
        io: i
    '}
    nEncCntYupM1L0 : UDINT;
    {attribute 'pytmc' := '
        pv: MR1L0:HOMS:ENC:YDWN:CNT
        field: EGU cnt
        io: i
    '}
    nEncCntYdwnM1L0 : UDINT;
    {attribute 'pytmc' := '
        pv: MR1L0:HOMS:ENC:XUP:CNT
        field: EGU cnt
        io: i
    '}
    nEncCntXupM1L0 : UDINT;
    {attribute 'pytmc' := '
        pv: MR1L0:HOMS:ENC:XDWN:CNT
        field: EGU cnt
        io: i
    '}
    nEncCntXdwnM1L0 : UDINT;
    {attribute 'pytmc' := '
        pv: MR1L0:HOMS:ENC:PITCH:CNT
        field: EGU cnt
        io: i
    '}
    nEncCntPitchM1L0 : UDINT;

    // Encoder Reference Values
    {attribute 'pytmc' := '
        pv: MR1L0:HOMS:ENC:YUP:REF
        field: EGU cnt
        io: i
    '}
    nEncRefYupM1L0 : UDINT;
    {attribute 'pytmc' := '
        pv: MR1L0:HOMS:ENC:YDWN:REF
        field: EGU cnt
        io: i
    '}
    nEncRefYdwnM1L0 : UDINT;
    {attribute 'pytmc' := '
        pv: MR1L0:HOMS:ENC:XUP:REF
        field: EGU cnt
        io: i
    '}
    nEncRefXupM1L0 : UDINT;
    {attribute 'pytmc' := '
        pv: MR1L0:HOMS:ENC:XDWN:REF
        field: EGU cnt
        io: i
    '}
    nEncRefXdwnM1L0 : UDINT;
    {attribute 'pytmc' := '
        pv: MR1L0:HOMS:ENC:PITCH:REF
        field: EGU cnt
        io: i
    '}
    nEncRefPitchM1L0 : UDINT;
    mcReadParameterPitchM1L0 : MC_ReadParameter;
    fEncRefPitchM1L0_urad : LREAL; // Current Pitch encoder offset in urad


    // M2L0
    // Motors
    {attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[EL7041-1000_M2L0_Yup]^STM Status^Status^Digital input 1;
                              .bLimitBackwardEnable:=TIIB[EL7041-1000_M2L0_Yup]^STM Status^Status^Digital input 2;
                              .nRawEncoderULINT:=TIIB[EL5042_M2L0_Yupdwn]^FB Inputs Channel 1^Position'}
    {attribute 'pytmc' := '
        pv: MR2L0:HOMS:MMS:YUP
    '}
    M7 : ST_MotionStage := (fVelocity:=200.0, nEnableMode:=ENUM_StageEnableMode.ALWAYS, bPowerSelf:=TRUE, sName:='MR2L0_YUP'); // M2L0 Yup
    fbMotionStage_m7 : FB_MotionStage;

    {attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[EL7041-1000_M2L0_Ydwn]^STM Status^Status^Digital input 1;
                              .bLimitBackwardEnable:=TIIB[EL7041-1000_M2L0_Ydwn]^STM Status^Status^Digital input 2'}
    {attribute 'pytmc' := '
        pv: MR2L0:HOMS:MMS:YDWN
    '}
    M8 : ST_MotionStage := (fVelocity:=200.0, nEnableMode:=ENUM_StageEnableMode.ALWAYS, bPowerSelf:=TRUE, sName:='MR2L0_YDWN'); // M2L0 Ydwn
    fbMotionStage_m8 : FB_MotionStage;

    {attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[EL7041-1000_M2L0_Xup]^STM Status^Status^Digital input 1;
                              .bLimitBackwardEnable:=TIIB[EL7041-1000_M2L0_Xup]^STM Status^Status^Digital input 2;
                              .nRawEncoderULINT:=TIIB[EL5042_M1L0_Xupdwn]^FB Inputs Channel 1^Position'}
    {attribute 'pytmc' := '
        pv: MR2L0:HOMS:MMS:XUP
    '}
    M9 : ST_MotionStage := (fVelocity:=1000.0, nEnableMode:=ENUM_StageEnableMode.ALWAYS, bPowerSelf:=TRUE, sName:='MR2L0_XUP'); // M2L0 Xup
    fbMotionStage_m9 : FB_MotionStage;

    {attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[EL7041-1000_M2L0_Xdwn]^STM Status^Status^Digital input 1;
                              .bLimitBackwardEnable:=TIIB[EL7041-1000_M2L0_Xdwn]^STM Status^Status^Digital input 2'}
    {attribute 'pytmc' := '
        pv: MR2L0:HOMS:MMS:XDWN
    '}
    M10 : ST_MotionStage := (fVelocity:=1000.0, nEnableMode:=ENUM_StageEnableMode.ALWAYS, bPowerSelf:=TRUE, sName:='MR2L0_XDWN'); // M2L0 Xdwn
    fbMotionStage_m10 : FB_MotionStage;

    {attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[EL7041-1000_M2L0_PitchCoarse]^STM Status^Status^Digital input 1;
                              .bLimitBackwardEnable:=TIIB[EL7041-1000_M2L0_PitchCoarse]^STM Status^Status^Digital input 2;
                              .nRawEncoderULINT:=TIIB[EL5042_M2L0_PitchBender]^FB Inputs Channel 1^Position'}
    {attribute 'pytmc' := '
        pv: MR2L0:HOMS:MMS:PITCH
    '}
    M11 : ST_MotionStage := (fVelocity:=150.0, nEnableMode:=ENUM_StageEnableMode.ALWAYS, bPowerSelf:=TRUE, sName:='MR2L0_PITCH'); // M2L0 Pitch Stepper
    fbMotionStage_m11 : FB_MotionStage;
    {attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[EL7041-1000_M2L0_Bender]^STM Status^Status^Digital input 1;
                              .bLimitBackwardEnable:=TIIB[EL7041-1000_M2L0_Bender]^STM Status^Status^Digital input 2;
                              .nRawEncoderULINT:=TIIB[EL5042_M2L0_PitchBender]^FB Inputs Channel 2^Position'}
    {attribute 'pytmc' := '
        pv: MR2L0:HOMS:MMS:BENDER
    '}
    M12 : ST_MotionStage := (fVelocity:=150.0, nEnableMode:=ENUM_StageEnableMode.ALWAYS, bPowerSelf:=TRUE, sName:='MR2L0_BENDER'); // M2L0 Bender
    fbMotionStage_m12 : FB_MotionStage;

    {attribute 'TcLinkTo' := '.fbRunHOMS.bSTOEnable1:=TIIB[EL1004_M2L0_STO]^Channel 1^Input;
                              .fbRunHOMS.bSTOEnable2:=TIIB[EL1004_M2L0_STO]^Channel 2^Input;
                              .fbRunHOMS.stYupEnc.Count:=TIIB[EL5042_M2L0_Yupdwn]^FB Inputs Channel 1^Position;
                              .fbRunHOMS.stYdwnEnc.Count:=TIIB[EL5042_M2L0_Yupdwn]^FB Inputs Channel 2^Position;
                              .fbRunHOMS.stXupEnc.Count:=TIIB[EL5042_M2L0_Xupdwn]^FB Inputs Channel 1^Position;
                              .fbRunHOMS.stXdwnEnc.Count:=TIIB[EL5042_M2L0_Xupdwn]^FB Inputs Channel 2^Position'}
    {attribute 'pytmc' := '
        pv: MR2L0:HOMS
    '}
    M2L0 : DUT_HOMS;
    {attribute 'pytmc' := '
        pv: MR2L0:HOMS:STATS
    '}
    fbMR2L0GantryStats : FB_HomsStats;

    // Encoder Arrays/RMS Watch:
    {attribute 'pytmc' := '
        pv: MR2L0:HOMS:ENC:Y
    '}
    fbYRMSErrorM2L0 : FB_RMSWatch;
    fMaxYRMSErrorM2L0 : LREAL;
    fMinYRMSErrorM2L0 : LREAL;

    {attribute 'pytmc' := '
        pv: MR2L0:HOMS:ENC:X
    '}
    fbXRMSErrorM2L0 : FB_RMSWatch;
    fMaxXRMSErrorM2L0 : LREAL;
    fMinXRMSErrorM2L0 : LREAL;

    {attribute 'pytmc' := '
        pv: MR2L0:HOMS:ENC:PITCH
    '}
    fbPitchRMSErrorM2L0 : FB_RMSWatch;
    fMaxPitchRMSErrorM2L0 : LREAL;
    fMinPitchRMSErrorM2L0 : LREAL;

    {attribute 'pytmc' := '
        pv: MR2L0:HOMS:ENC:BENDER
    '}
    fbBenderRMSErrorM2L0 : FB_RMSWatch;
    fMaxBenderRMSErrorM2L0 : LREAL;
    fMinBenderRMSErrorM2L0 : LREAL;

    // Pitch Control
    //fbM2L0PitchControl : FB_PitchControl;
    //bM2L0PitchDone : BOOL;
    //bM2L0PitchBusy : BOOL;

    // Bender Control
    fbBenderM2L0 : FB_Bender;

    // Raw Encoder Counts
    {attribute 'pytmc' := '
        pv: MR2L0:HOMS:ENC:YUP:CNT
        field: EGU cnt
        io: i
    '}
    nEncCntYupM2L0 : UDINT;
    {attribute 'pytmc' := '
        pv: MR2L0:HOMS:ENC:YDWN:CNT
        field: EGU cnt
        io: i
    '}
    nEncCntYdwnM2L0 : UDINT;
    {attribute 'pytmc' := '
        pv: MR2L0:HOMS:ENC:XUP:CNT
        field: EGU cnt
        io: i
    '}
    nEncCntXupM2L0 : UDINT;
    {attribute 'pytmc' := '
        pv: MR2L0:HOMS:ENC:XDWN:CNT
        field: EGU cnt
        io: i
    '}
    nEncCntXdwnM2L0 : UDINT;
    {attribute 'pytmc' := '
        pv: MR2L0:HOMS:ENC:PITCH:CNT
        field: EGU cnt
        io: i
    '}
    nEncCntPitchM2L0 : UDINT;

    // Encoder Reference Values
    {attribute 'pytmc' := '
        pv: MR2L0:HOMS:ENC:YUP:REF
        field: EGU cnt
        io: i
    '}
    nEncRefYupM2L0 : UDINT;
    {attribute 'pytmc' := '
        pv: MR2L0:HOMS:ENC:YDWN:REF
        field: EGU cnt
        io: i
    '}
    nEncRefYdwnM2L0 : UDINT;
    {attribute 'pytmc' := '
        pv: MR2L0:HOMS:ENC:XUP:REF
        field: EGU cnt
        io: i
    '}
    nEncRefXupM2L0 : UDINT;
    {attribute 'pytmc' := '
        pv: MR2L0:HOMS:ENC:XDWN:REF
        field: EGU cnt
        io: i
    '}
    nEncRefXdwnM2L0 : UDINT;
    {attribute 'pytmc' := '
        pv: MR2L0:HOMS:ENC:PITCH:REF
        field: EGU cnt
        io: i
    '}
    nEncRefPitchM2L0 : UDINT;
    mcReadParameterPitchM2L0 : MC_ReadParameter;
    fEncRefPitchM2L0_urad : LREAL; // Current Pitch encoder offset in urad






    // Common
    fEncLeverArm_mm : LREAL := 513.0;
    // Logging
    fbLogHandler : FB_LogHandler;




END_VAR
// M1L0
M1L0.fbRunHOMS(stYup:=M1,
               stYdwn:=M2,
               stXup:=M3,
               stXdwn:=M4,
               stPitch:=M5,
               nYupEncRef:=GVL_M1L0_Constants.nYUP_ENC_REF,
               nYdwnEncRef:=GVL_M1L0_Constants.nYDWN_ENC_REF,
               nXupEncRef:=GVL_M1L0_Constants.nXUP_ENC_REF,
               nXdwnEncRef:=GVL_M1L0_Constants.nXDWN_ENC_REF,
               bExecuteCoupleY:=M1L0.bExecuteCoupleY,
               bExecuteCoupleX:=M1L0.bExecuteCoupleX,
               bExecuteDecoupleY:=M1L0.bExecuteDecoupleY,
               bExecuteDecoupleX:=M1L0.bExecuteDecoupleX,
               bGantryAlreadyCoupledY=>M1L0.bGantryAlreadyCoupledY,
               bGantryAlreadyCoupledX=>M1L0.bGantryAlreadyCoupledX,
               nCurrGantryY=>M1L0.nCurrGantryY,
               nCurrGantryX=>M1L0.nCurrGantryX);
fbBenderM1L0(stBender:=M6,
             bSTOEnable1:=M1L0.fbRunHOMS.bSTOEnable1,
             bSTOEnable2:=M1L0.fbRunHOMS.bSTOEnable2);
// No slave motion through Epics
M2.bExecute := FALSE; // M1L0-Ydwn
M4.bExecute := FALSE; // M1L0-Xdwn

// Convert nCurrGantry to um (smaller number) to read out in epics
M1L0.fCurrGantryY_um := LINT_TO_REAL(M1L0.nCurrGantryY) / 1000.0;
M1L0.fCurrGantryX_um := LINT_TO_REAL(M1L0.nCurrGantryX) / 1000.0;

// FB_MotionStage's for non-piezo axes
fbMotionStage_m1(stMotionStage:=M1);
fbMotionStage_m2(stMotionStage:=M2);
fbMotionStage_m3(stMotionStage:=M3);
fbMotionStage_m4(stMotionStage:=M4);
fbMotionStage_m5(stMotionStage:=M5);
fbMotionStage_m6(stMotionStage:=M6);

// Calulate Gantry Stats:
fbMR1L0GantryStats(homs:=M1L0, fbUpStreamY:=M1, fbUpStreamX:=M3);
fbMR2L0GantryStats(homs:=M2L0, fbUpStreamY:=M7, fbUpStreamX:=M9);


// Calculate Pitch RMS Error:
fbYRMSErrorM1L0(stMotionStage:=M1,
                fMaxRMSError=>fMaxYRMSErrorM1L0,
                fMinRMSError=>fMinYRMSErrorM1L0);

fbXRMSErrorM1L0(stMotionStage:=M3,
                fMaxRMSError=>fMaxXRMSErrorM1L0,
                fMinRMSError=>fMinXRMSErrorM1L0);

fbPitchRMSErrorM1L0(stMotionStage:=M5,
                    fMaxRMSError=>fMaxPitchRMSErrorM1L0,
                    fMinRMSError=>fMinPitchRMSErrorM1L0);

fbBenderRMSErrorM1L0(stMotionStage:=M6,
                     fMaxRMSError=>fMaxBenderRMSErrorM1L0,
                     fMinRMSError=>fMinBenderRMSErrorM1L0);
// Pitch Control
//fbM1L0PitchControl(Pitch:=GVL_M1L0.M1L0_Pitch,
                   //Stepper:=M5,
                   //lrCurrentSetpoint:=M5.fPosition,
                   //q_bDone=>bM1L0PitchDone,
                   //q_bBusy=>bM1L0PitchBusy);
// When STO hit, need to reset SP
//IF NOT M5.bHardwareEnable THEN
    //M5.fPosition := M5.stAxisStatus.fActPosition;
//END_IF

// Raw Encoder Counts For Epics
nEncCntYupM1L0 := ULINT_TO_UDINT(M1L0.fbRunHOMS.stYupEnc.Count);
nEncCntYdwnM1L0 := ULINT_TO_UDINT(M1L0.fbRunHOMS.stYdwnEnc.Count);
nEncCntXupM1L0 := ULINT_TO_UDINT(M1L0.fbRunHOMS.stXupEnc.Count);
nEncCntXdwnM1L0 := ULINT_TO_UDINT(M1L0.fbRunHOMS.stXdwnEnc.Count);
nEncCntPitchM1L0 := LINT_TO_UDINT(GVL_M1L0.M1L0_Pitch.diEncCnt);

// Encoder Reference Values For Epics
nEncRefYupM1L0 := ULINT_TO_UDINT(GVL_M1L0_Constants.nYUP_ENC_REF);
nEncRefYdwnM1L0 := ULINT_TO_UDINT(GVL_M1L0_Constants.nYDWN_ENC_REF);
nEncRefXupM1L0 := ULINT_TO_UDINT(GVL_M1L0_Constants.nXUP_ENC_REF);
nEncRefXdwnM1L0 := ULINT_TO_UDINT(GVL_M1L0_Constants.nXDWN_ENC_REF);
mcReadParameterPitchM1L0(Axis:=M5.Axis,
                         Enable:=TRUE,
                         ParameterNumber:=MC_AxisParameter.AxisEncoderOffset,
                         ReadMode:=READMODE_CYCLIC,
                         Value=>fEncRefPitchM1L0_urad);

nEncRefPitchM1L0 := LREAL_TO_UDINT(ABS(fEncRefPitchM1L0_urad) * fEncLeverArm_mm);

//Coatings States With PMPS
M1.bPowerSelf :=FALSE;
M5.bPowerSelf := FALSE;




// M2L0
M2L0.fbRunHOMS(stYup:=M7,
               stYdwn:=M8,
               stXup:=M9,
               stXdwn:=M10,
               stPitch:=M11,
               nYupEncRef:=GVL_M2L0_Constants.nYUP_ENC_REF,
               nYdwnEncRef:=GVL_M2L0_Constants.nYDWN_ENC_REF,
               nXupEncRef:=GVL_M2L0_Constants.nXUP_ENC_REF,
               nXdwnEncRef:=GVL_M2L0_Constants.nXDWN_ENC_REF,
               bExecuteCoupleY:=M2L0.bExecuteCoupleY,
               bExecuteCoupleX:=M2L0.bExecuteCoupleX,
               bExecuteDecoupleY:=M2L0.bExecuteDecoupleY,
               bExecuteDecoupleX:=M2L0.bExecuteDecoupleX,
               bGantryAlreadyCoupledY=>M2L0.bGantryAlreadyCoupledY,
               bGantryAlreadyCoupledX=>M2L0.bGantryAlreadyCoupledX,
               nCurrGantryY=>M2L0.nCurrGantryY,
               nCurrGantryX=>M2L0.nCurrGantryX);
fbBenderM2L0(stBender:=M12,
             bSTOEnable1:=M2L0.fbRunHOMS.bSTOEnable1,
             bSTOEnable2:=M2L0.fbRunHOMS.bSTOEnable2);
// No slave motion through Epics
M8.bExecute := FALSE; // M2L0-Ydwn
M10.bExecute := FALSE; // M2L0-Xdwn

// Convert nCurrGantry to um (smaller number) to read out in epics
M2L0.fCurrGantryY_um := LINT_TO_REAL(M2L0.nCurrGantryY) / 1000;
M2L0.fCurrGantryX_um := LINT_TO_REAL(M2L0.nCurrGantryX) / 1000;

// FB_MotionStage's for non-piezo axes
fbMotionStage_m7(stMotionStage:=M7);
fbMotionStage_m8(stMotionStage:=M8);
fbMotionStage_m9(stMotionStage:=M9);
fbMotionStage_m10(stMotionStage:=M10);
fbMotionStage_m11(stMotionStage:=M11);
fbMotionStage_m12(stMotionStage:=M12);

// Calculate RMS Error:
fbYRMSErrorM2L0(stMotionStage:=M7,
                fMaxRMSError=>fMaxYRMSErrorM2L0,
                fMinRMSError=>fMinYRMSErrorM2L0);

fbXRMSErrorM2L0(stMotionStage:=M9,
                fMaxRMSError=>fMaxXRMSErrorM2L0,
                fMinRMSError=>fMinXRMSErrorM2L0);

fbPitchRMSErrorM2L0(stMotionStage:=M11,
                fMaxRMSError=>fMaxPitchRMSErrorM2L0,
                fMinRMSError=>fMinPitchRMSErrorM2L0);

fbBenderRMSErrorM2L0(stMotionStage:=M12,
                fMaxRMSError=>fMaxBenderRMSErrorM2L0,
                fMinRMSError=>fMinBenderRMSErrorM2L0);

// Pitch Control
//fbM2L0PitchControl(Pitch:=GVL_M2L0.M2L0_Pitch,
                   //Stepper:=M11,
                   //lrCurrentSetpoint:=M11.fPosition,
                   //q_bDone=>bM2L0PitchDone,
                   //q_bBusy=>bM2L0PitchBusy);
// When STO hit, need to reset SP
//IF NOT M11.bHardwareEnable THEN
    //M11.fPosition := M11.stAxisStatus.fActPosition;
//END_IF

// Raw Encoder Counts For Epics
nEncCntYupM2L0 := ULINT_TO_UDINT(M2L0.fbRunHOMS.stYupEnc.Count);
nEncCntYdwnM2L0 := ULINT_TO_UDINT(M2L0.fbRunHOMS.stYdwnEnc.Count);
nEncCntXupM2L0 := ULINT_TO_UDINT(M2L0.fbRunHOMS.stXupEnc.Count);
nEncCntXdwnM2L0 := ULINT_TO_UDINT(M2L0.fbRunHOMS.stXdwnEnc.Count);
nEncCntPitchM2L0 := LINT_TO_UDINT(GVL_M2L0.M2L0_Pitch.diEncCnt);

// Encoder Reference Values For Epics
nEncRefYupM2L0 := ULINT_TO_UDINT(GVL_M2L0_Constants.nYUP_ENC_REF);
nEncRefYdwnM2L0 := ULINT_TO_UDINT(GVL_M2L0_Constants.nYDWN_ENC_REF);
nEncRefXupM2L0 := ULINT_TO_UDINT(GVL_M2L0_Constants.nXUP_ENC_REF);
nEncRefXdwnM2L0 := ULINT_TO_UDINT(GVL_M2L0_Constants.nXDWN_ENC_REF);
mcReadParameterPitchM2L0(Axis:=M11.Axis,
                         Enable:=TRUE,
                         ParameterNumber:=MC_AxisParameter.AxisEncoderOffset,
                         ReadMode:=READMODE_CYCLIC,
                         Value=>fEncRefPitchM2L0_urad);

nEncRefPitchM2L0 := LREAL_TO_UDINT(ABS(fEncRefPitchM2L0_urad) * fEncLeverArm_mm);

//Coatings States With PMPS
M7.bPowerSelf :=FALSE;

P_CoatingProtections();

// Logging
fbLogHandler();

END_PROGRAM
Related:

P_CoatingProtections

PROGRAM P_CoatingProtections
VAR
        fbStripProtMR1L0 : FB_MirrorTwoCoatingProtection := (
            sDevName := 'MR1L0:HOMS',
            nUpperCoatingBoundary := 13300000,
            sUpperCoatingType := 'L0-B4C',
            nLowerCoatingBoundary := 11800000,
            sLowerCoatingType := 'L0-NICKEL');

        fbStripProtMR2L0 : FB_MirrorTwoCoatingProtection := (
            sDevName := 'MR2L0:HOMS',
            nUpperCoatingBoundary := 14300000,
            sUpperCoatingType := 'NICKEL',
            nLowerCoatingBoundary := 12800000,
            sLowerCoatingType := 'B4C');
END_VAR
fbStripProtMR1L0(
    FFO := GVL_PMPS.g_FastFaultOutput1,
    nCurrentEncoderCount := MAIN.nEncCntYupM1L0,
    neVRange := PMPS.PMPS_GVL.stCurrentBeamParameters.neVRange,
    bReadPmpsDb:= MOTION_GVL.fbStandardPMPSDB.bReadPmpsDb,
    bUsePmpsDb := TRUE,
   );

fbStripProtMR2L0(
    FFO := GVL_PMPS.g_FastFaultOutput1,
    nCurrentEncoderCount := MAIN.nEncCntYupM2L0,
    neVRange := PMPS.PMPS_GVL.stCurrentBeamParameters.neVRange,
    bReadPmpsDb:= MOTION_GVL.fbStandardPMPSDB.bReadPmpsDb,
    bUsePmpsDb := TRUE,
);

END_PROGRAM
Related:

P_Serial_Com

PROGRAM P_Serial_Com
VAR
    fbSerialLineControl_EL6001_M1L0: SerialLineControl; // M1L0 Serial Comm Function Block
    fbSerialLineControl_EL6001_M2L0: SerialLineControl; // M2L0 Serial Comm Function Block
END_VAR
// These are the global IOs...don't forget to copy your data into them

(* EL6001 Serial port 0 com function *)
fbSerialLineControl_EL6001_M1L0(Mode:= SERIALLINEMODE_EL6_22B,
                                pComIn:= ADR(Serial_stComIn_M1L0),
                                   pComOut:=ADR(Serial_stComOut_M1L0),
                                SizeComIn:= SIZEOF(Serial_stComIn_M1L0),
                                TxBuffer:= Serial_TXBuffer_M1L0,
                                RxBuffer:= Serial_RXBuffer_M1L0,
                                Error=>,
                                ErrorID=>);

fbSerialLineControl_EL6001_M2L0(Mode:= SERIALLINEMODE_EL6_22B,
                                pComIn:= ADR(Serial_stComIn_M2L0),
                                   pComOut:=ADR(Serial_stComOut_M2L0),
                                SizeComIn:= SIZEOF(Serial_stComIn_M2L0),
                                TxBuffer:= Serial_TXBuffer_M2L0,
                                RxBuffer:= Serial_RXBuffer_M2L0,
                                Error=>,
                                ErrorID=>);

END_PROGRAM

PiezoSerial

PROGRAM PiezoSerial
VAR
    //PI Serial
    fbE621SerialDriver_M1L0 : FB_PI_E621_SerialDriver;
    rtInitParams_M1L0       :       R_TRIG;
    tonTimeoutRst_M1L0      : TON := (PT:=T#2S); //For timeout reset

    fbE621SerialDriver_M2L0 : FB_PI_E621_SerialDriver;
    rtInitParams_M2L0       :       R_TRIG;
    tonTimeoutRst_M2L0      : TON := (PT:=T#2S); //For timeout reset
END_VAR
//Piezo E-621
///////////////////////
fbE621SerialDriver_M1L0.i_xExecute := TRUE;
fbE621SerialDriver_M1L0.i_xExecute R= fbE621SerialDriver_M1L0.q_xDone;
fbE621SerialDriver_M1L0(iq_stPiezoAxis:= GVL_M1L0.M1L0_Pitch.Piezo,
                        iq_stSerialRXBuffer:= Serial_RXBuffer_M1L0,
                        iq_stSerialTXBuffer:= Serial_TXBuffer_M1L0);

fbE621SerialDriver_M2L0.i_xExecute := TRUE;
fbE621SerialDriver_M2L0.i_xExecute R= fbE621SerialDriver_M2L0.q_xDone;
fbE621SerialDriver_M2L0(iq_stPiezoAxis:= GVL_M2L0.M2L0_Pitch.Piezo,
                        iq_stSerialRXBuffer:= Serial_RXBuffer_M2L0,
                        iq_stSerialTXBuffer:= Serial_TXBuffer_M2L0);

END_PROGRAM
Related:

PRG_1_PlcTask

PROGRAM PRG_1_PlcTask
VAR

END_VAR
PRG_MR1L0_HOMS();
PRG_MR2L0_HOMS();
PRG_PMPS();

END_PROGRAM
Related:

PRG_MR1L0_HOMS

PROGRAM PRG_MR1L0_HOMS
VAR
    {attribute 'pytmc' := 'pv: MR1L0:HOMS:COATING'}
    fbCoatingStates: FB_PositionStatePMPS2D;
    {attribute 'pytmc' := '
      pv: MR1L0:HOMS:COATING:STATE:SET
      io: io
    '}
    eStateSet: E_MR1L0_CoatingStates;
    {attribute 'pytmc' := '
      pv: MR1L0:HOMS:COATING:STATE:GET
      io: i
    '}
    eStateGet: E_MR1L0_CoatingStates;

    fbYSetup: FB_StateSetupHelper;

    fbPitchSetup: FB_StateSetupHelper;
    stDefaultPitch : ST_PositionState := (
        fDelta:=194.94,
        fVelocity:=100,
        fAccel:=390,
        fDecel:=390,
        bMoveOk:=TRUE,
        bValid:=TRUE,
        bUseRawCounts:=TRUE
    );
    astCoatingStatesY: ARRAY[1..GeneralConstants.MAX_STATES] OF ST_PositionState;
    astCoatingStatesPitch: ARRAY[1..GeneralConstants.MAX_STATES] OF ST_PositionState;

        // MR1L0 Flow Press Sensors
    {attribute 'TcLinkTo' := '.fbFlow_1.iRaw := TIIB[EL3054_M1L0_FWM_PRSM]^AI Standard Channel 1^Value;
                                 .fbFlow_2.iRaw := TIIB[EL3054_M1L0_FWM_PRSM]^AI Standard Channel 2^Value;
                              .fbPress_1.iRaw := TIIB[EL3054_M1L0_FWM_PRSM]^AI Standard Channel 3^Value
    '}
    {attribute 'pytmc' := '
        pv: MR1L0:HOMS
    '}
    fbCoolingPanel : FB_Axilon_Cooling_2f1p;
    {attribute 'TcLinkTo' := 'TIIB[EP2008-0001_M1M2_VCV]^Channel 1^Output'}
    {attribute 'pytmc' := '
        pv: MR1L0:HOMS:VCV
        io: io
        field: ZNAM OFF
        field: ONAM ON
    '}
    bActivateVarCoolMR1L0 AT %Q* : BOOL;
END_VAR
fbYSetup(stPositionState:=GVL_States.stDefaultY, bSetDefault:=TRUE);
fbPitchSetup(stPositionState:=stDefaultPitch, bSetDefault:=TRUE);

// MR1L0 B4C
fbYSetup(stPositionState:=astCoatingStatesY[E_MR1L0_CoatingStates.L0B4C],
    sName:='L0B4C',
    sPmpsState:='MR1L0:HOMS-L0-B4C',
    nEncoderCount:=21171800
);
fbPitchSetup(stPositionState:=astCoatingStatesPitch[E_MR1L0_CoatingStates.L0B4C],
    sName:='L0B4C',
    sPmpsState:='MR1L0:HOMS-L0-B4C',
    nEncoderCount:=8602330
);

// MR1L0 Ni
fbYSetup(stPositionState:=astCoatingStatesY[E_MR1L0_CoatingStates.L0Ni],
    sName:='L0Ni',
    sPmpsState:='MR1L0:HOMS-L0-NICKEL',
    nEncoderCount:=9171800
);
fbPitchSetup(stPositionState:=astCoatingStatesPitch[E_MR1L0_CoatingStates.L0Ni],
    sName:='L0Ni',
    sPmpsState:='MR1L0:HOMS-L0-NICKEL',
    nEncoderCount:=8602330
);

// MR1L0_L1 B4C
fbYSetup(stPositionState:=astCoatingStatesY[E_MR1L0_CoatingStates.L1B4C],
    bValid:=FALSE,
    sName:='L1B4C',
    sPmpsState:='MR1L0:HOMS-L1-B4C',
    nEncoderCount:=21171800
);
fbPitchSetup(stPositionState:=astCoatingStatesPitch[E_MR1L0_CoatingStates.L1B4C],
    bValid:=FALSE,
    sName:='L1B4C',
    sPmpsState:='MR1L0:HOMS-L1-B4C',
    nEncoderCount:=11116030,
    fDelta:=974.66
);

// MR1L0_L1 Ni
fbYSetup(stPositionState:=astCoatingStatesY[E_MR1L0_CoatingStates.L1Ni],
    bValid:=FALSE,
    sName:='L1Ni',
    sPmpsState:='MR1L0:HOMS-L1-NICKEL',
    nEncoderCount:=9171800
);
fbPitchSetup(stPositionState:=astCoatingStatesPitch[E_MR1L0_CoatingStates.L1Ni],
    bValid:=FALSE,
    sName:='L1Ni',
    sPmpsState:='MR1L0:HOMS-L1-NICKEL',
    nEncoderCount:=11116030,
    fDelta:=974.66
);

fbCoatingStates(
    stMotionStage1:=Main.M1,
    stMotionStage2:=Main.M5,
    astPositionState1:=astCoatingStatesY,
    astPositionState2:=astCoatingStatesPitch,
    eEnumSet:=eStateSet,
    eEnumGet:=eStateGet,
    fbFFHWO:=GVL_PMPS.g_FastFaultOutput1,
    fbArbiter:=GVL_PMPS.g_fbArbiter1,
    bEnableMotion:=TRUE,
    bEnableBeamParams:=TRUE,
    sDeviceName:='MR1L0:HOMS',
    sTransitionKey:='MR1L0:HOMS-TRANSITION',
);

fbCoolingPanel();

END_PROGRAM
Related:

PRG_MR2L0_HOMS

PROGRAM PRG_MR2L0_HOMS
VAR
    {attribute 'pytmc' := 'pv: MR2L0:HOMS:COATING'}
    fbCoatingStates: FB_PositionStatePMPS1D;
    {attribute 'pytmc' := '
      pv: MR2L0:HOMS:COATING:STATE:SET
      io: io
    '}
    eStateSet: E_MR2L0_CoatingStates;
    {attribute 'pytmc' := '
      pv: MR2L0:HOMS:COATING:STATE:GET
      io: i
    '}
    eStateGet: E_MR2L0_CoatingStates;
    fbYSetup: FB_StateSetupHelper;
    astCoatingStatesY: ARRAY[1..GeneralConstants.MAX_STATES] OF ST_PositionState;

    // MR2L0 Flow Press Sensors
    {attribute 'TcLinkTo' := '.fbFlow_1.iRaw := TIIB[EL3054_M2L0_FWM_PRSM]^AI Standard Channel 1^Value;
                                 .fbFlow_2.iRaw := TIIB[EL3054_M2L0_FWM_PRSM]^AI Standard Channel 2^Value;
                              .fbPress_1.iRaw := TIIB[EL3054_M2L0_FWM_PRSM]^AI Standard Channel 3^Value
    '}
    {attribute 'pytmc' := '
        pv: MR2L0:HOMS
    '}
    fbCoolingPanel : FB_Axilon_Cooling_2f1p;
        {attribute 'TcLinkTo' := 'TIIB[EP2008-0001_M1M2_VCV]^Channel 2^Output'}
    {attribute 'pytmc' := '
        pv: MR2L0:HOMS:VCV
        io: io
        field: ZNAM OFF
        field: ONAM ON
    '}
    bActivateVarCoolMR2L0 AT %Q* : BOOL;

END_VAR
fbYSetup(stPositionState:=GVL_States.stDefaultY, bSetDefault:=TRUE);

// MR2L0 B4C
fbYSetup(stPositionState:=astCoatingStatesY[E_MR2L0_CoatingStates.B4C],
    sName:='B4C',
    sPmpsState:='MR2L0:HOMS-B4C',
    nEncoderCount:=7018200
);

// MR2L0 Ni
fbYSetup(stPositionState:=astCoatingStatesY[E_MR2L0_CoatingStates.Ni],
    sName:='Ni',
    sPmpsState:='MR2L0:HOMS-NICKEL',
    nEncoderCount:= 16018200
);

fbCoatingStates(
    stMotionStage:=Main.M7,
    astPositionState:=astCoatingStatesY,
    eEnumSet:=eStateSet,
    eEnumGet:=eStateGet,
    fbFFHWO:=GVL_PMPS.g_FastFaultOutput1,
    fbArbiter:=GVL_PMPS.g_fbArbiter1,
    bEnableMotion:=TRUE,
    bEnableBeamParams:=TRUE,
    sDeviceName:='MR2L0:HOMS',
    sTransitionKey:='MR2L0:HOMS-TRANSITION',
);

fbCoolingPanel();

END_PROGRAM
Related:

PRG_PMPS

PROGRAM PRG_PMPS
VAR
    // PMPS arbiter interface
    fbArbiterIO : FB_SubSysToArbiter_IO;
    {attribute 'TcLinkTo' := 'TIIB[PMPS_PRE]^IO Outputs^MR1L0_Pitch_ENC'}
    nMR1L0_Pitch_ENC_PMPS AT %Q* : ULINT;

END_VAR
// PMPS
MOTION_GVL.fbStandardPMPSDB(
    io_fbFFHWO:=GVL_PMPS.g_FastFaultOutput1,
    bEnable:=TRUE,
    sPLCName:='plc-lfe-optics'
);

GVL_PMPS.g_fbArbiter1.AddRequest(16#5, PMPS_GVL.cstFullBeam, 'LFE Optics');
fbArbiterIO(Arbiter := GVL_PMPS.g_fbArbiter1, fbFFHWO := GVL_PMPS.g_FastFaultOutput1);
GVL_PMPS.g_FastFaultOutput1.Execute(i_xVeto:=);
GVL_PMPS.g_FastFaultOutput2.Execute(i_xVeto:=);

 nMR1L0_Pitch_ENC_PMPS := Main.M5.nRawEncoderULINT;

END_PROGRAM
Related: