DUTs

E_HomeState

TYPE E_HomeState :
(
    H_READY,
    H_INIT,
    H_RESET_LL,
    H_RESET_HL,
    H_ENABLE,
    H_MOVING,
    H_KEEP_MOVING,
    H_CHECK,
    H_RESET,
    H_SET_POS,
    H_ERROR,
    H_WRITE_LL,
    H_WRITE_HL,
    H_DONE

) UDINT;
END_TYPE
Related:

GVLs

Main

{attribute 'qualified_only'}
VAR_GLOBAL
    // ATM: 2 Axes
    {attribute 'pytmc' := 'pv: MFX:ATM:MMS:Y'}
    //{attribute 'TcLinkTo' := '.bLimitForwardEnable  := TIIB[MFX-ATM-EL7041-E1]^STM Status^Status^Digital input 1;
    //                          .bLimitBackwardEnable := TIIB[MFX-ATM-EL7041-E1]^STM Status^Status^Digital input 2;
    //                          .bBrakeRelease        := TIIB[MFX-ATM-EL2004-E4]^Channel 1^Output;
    //                          .nRawEncoderULINT     := TIIB[MFX-ATM-EL5042-E3]^FB Inputs Channel 1^Position'}
    {attribute 'TcLinkTo' := '.bLimitForwardEnable  := TIIB[MFX-ATM-EL7041-E1]^STM Status^Status^Digital input 1;
                              .bLimitBackwardEnable := TIIB[MFX-ATM-EL7041-E1]^STM Status^Status^Digital input 2;
                              .nRawEncoderULINT     := TIIB[MFX-ATM-EL5042-E3]^FB Inputs Channel 1^Position'}
    M1: DUT_MotionStage := (sName := 'MFX:ATM:MMS:Y');
    {attribute 'pytmc' := 'pv: MFX:ATM:MMS:X'}
    {attribute 'TcLinkTo' := '.nRawEncoderULINT     := TIIB[MFX-ATM-EL5042-E3]^FB Inputs Channel 2^Position'}
    M2: DUT_MotionStage := (sName := 'MFX:ATM:MMS:X');


    // LIB-: 4 Axes
    {attribute 'pytmc' := 'pv: MFX:LIB:MMS:01'}
    {attribute 'TcLinkTo' := '.bLimitForwardEnable  := TIIB[MFX-LIB-EL1088-E5]^Channel 1^Input;
                              .bLimitBackwardEnable := TIIB[MFX-LIB-EL1088-E5]^Channel 2^Input'}
    M3: DUT_MotionStage := (sName := 'MFX:LIB:MMS:01');
    {attribute 'pytmc' := 'pv: MFX:LIB:MMS:02'}
    {attribute 'TcLinkTo' := '.bLimitForwardEnable  := TIIB[MFX-LIB-EL1088-E5]^Channel 3^Input;
                              .bLimitBackwardEnable := TIIB[MFX-LIB-EL1088-E5]^Channel 4^Input'}
    M4: DUT_MotionStage := (sName := 'MFX:LIB:MMS:02');
    {attribute 'pytmc' := 'pv: MFX:LIB:MMS:03'}
    {attribute 'TcLinkTo' := '.bLimitForwardEnable  := TIIB[MFX-LIB-EL1088-E5]^Channel 5^Input;
                              .bLimitBackwardEnable := TIIB[MFX-LIB-EL1088-E5]^Channel 6^Input'}
    M5: DUT_MotionStage := (sName := 'MFX:LIB:MMS:03');
    {attribute 'pytmc' := 'pv: MFX:LIB:MMS:04'}
    {attribute 'TcLinkTo' := '.bLimitForwardEnable  := TIIB[MFX-LIB-EL1088-E5]^Channel 7^Input;
                              .bLimitBackwardEnable := TIIB[MFX-LIB-EL1088-E5]^Channel 8^Input'}
    M6: DUT_MotionStage := (sName := 'MFX:LIB:MMS:04');

    // LJ-: 8 Axes

    {attribute 'pytmc' := 'pv: MFX:LJH:JET:X'}
    {attribute 'TcLinkTo' := '.bLimitForwardEnable  := TIIB[MFX-LJ-EL1088-E3]^Channel 2^Input;
                              .bLimitBackwardEnable := TIIB[MFX-LJ-EL1088-E3]^Channel 1^Input'}
    M7: DUT_MotionStage := (sName := 'MFX:LJH:JET:X');

    {attribute 'pytmc' := 'pv: MFX:LJH:JET:Y'}
    {attribute 'TcLinkTo' := '.bLimitForwardEnable  := TIIB[MFX-LJ-EL1088-E3]^Channel 3^Input;
                              .bLimitBackwardEnable := TIIB[MFX-LJ-EL1088-E3]^Channel 4^Input'}
    M8: DUT_MotionStage := (sName := 'MFX:LJH:JET:Y');

    {attribute 'pytmc' := 'pv: MFX:LJH:JET:Z'}
    {attribute 'TcLinkTo' := '.bLimitForwardEnable  := TIIB[MFX-LJ-EL1088-E8]^Channel 1^Input;
                              .bLimitBackwardEnable := TIIB[MFX-LJ-EL1088-E8]^Channel 2^Input'}
    M9: DUT_MotionStage := (sName := 'MFX:LJH:JET:Z');

    {attribute 'pytmc' := 'pv: MFX:LJH:DET:X'}
    {attribute 'TcLinkTo' := '.bLimitForwardEnable  := TIIB[MFX-LJ-EL1088-E8]^Channel 4^Input;
                              .bLimitBackwardEnable := TIIB[MFX-LJ-EL1088-E8]^Channel 3^Input'}
    M10: DUT_MotionStage := (sName := 'MFX:LJH:DET:X');

    {attribute 'pytmc' := 'pv: MFX:LJH:SS:TOP_X'}
    {attribute 'TcLinkTo' := '.bLimitForwardEnable  := TIIB[MFX-LJ-EL1088-E12]^Channel 1^Input;
                              .bLimitBackwardEnable := TIIB[MFX-LJ-EL1088-E12]^Channel 2^Input'}
    M11: DUT_MotionStage := (sName := 'MFX:LJH:SS:TOP_X');

    {attribute 'pytmc' := 'pv: MFX:LJH:SS:TOP_Y'}
    {attribute 'TcLinkTo' := '.bLimitForwardEnable  := TIIB[MFX-LJ-EL1088-E12]^Channel 3^Input;
                              .bLimitBackwardEnable := TIIB[MFX-LJ-EL1088-E12]^Channel 4^Input'}
    M12: DUT_MotionStage := (sName := 'MFX:LJH:SS:TOP_Y');

    {attribute 'pytmc' := 'pv: MFX:LJH:SS:BOT_X'}
    {attribute 'TcLinkTo' := '.bLimitForwardEnable  := TIIB[MFX-LJ-EL1088-E12]^Channel 5^Input;
                              .bLimitBackwardEnable := TIIB[MFX-LJ-EL1088-E12]^Channel 6^Input'}
    M13: DUT_MotionStage := (sName := 'MFX:LJH:SS:BOT_X');

    {attribute 'pytmc' := 'pv: MFX:LJH:SS:BOT_Y'}
    {attribute 'TcLinkTo' := '.bLimitForwardEnable  := TIIB[MFX-LJ-EL1088-E12]^Channel 7^Input;
                              .bLimitBackwardEnable := TIIB[MFX-LJ-EL1088-E12]^Channel 8^Input'}
    M14: DUT_MotionStage := (sName := 'MFX:LJH:SS:BOT_Y');
END_VAR

PMPS

VAR_GLOBAL
    // Arbiter linked to the FFO and the MPS
//    {attribute 'pytmc' := 'pv: PLC:TMO:MOTION:ARB'}
    fbArbiter: FB_Arbiter(1);

    // Fast fault for before ST4K4 (Most Devices)
//    {attribute 'pytmc' := 'pv: PLC:TMO:MOTION:FFO:01'}
//    {attribute 'TcLinkTo' := '.q_xFastFaultOut:=TIIB[PMPS_FFO]^Channel 1^Output'}
    fbFastFaultOutput1: FB_HardwareFFOutput := (bAutoReset := TRUE, i_sNetID:='172.21.92.73.1.1');
    // Fast fault for after ST4K4 (Basically just DREAM)
//    {attribute 'pytmc' := 'pv: PLC:TMO:MOTION:FFO:02'}
//    {attribute 'TcLinkTo' := '.q_xFastFaultOut:=TIIB[PMPS_FFO]^Channel 2^Output'}
//    fbFastFaultOutput2: FB_HardwareFFOutput := (bAutoReset := TRUE, i_sNetID:='172.21.92.73.1.1');
END_VAR

POUs

FB_ATM_MFX

FUNCTION_BLOCK FB_ATM_MFX
VAR_IN_OUT // pass by reference, not value
    stYStage: DUT_MotionStage;
    stXStage: DUT_MotionStage;
    fbArbiter: FB_Arbiter;
    fbFFHWO: FB_HardwareFFOutput;
END_VAR
VAR_INPUT
    stOut: DUT_PositionState;
    stTarget1: DUT_PositionState;
    stTarget2: DUT_PositionState;
    stTarget3: DUT_PositionState;
    stTarget4: DUT_PositionState;
    stTarget5: DUT_PositionState;
    nTransitionAssertionID: UDINT;
    nUnknownAssertionID: UDINT;
END_VAR
VAR
    fbYStage: FB_MotionStage;
    fbXStage: FB_MotionStage;

    {attribute 'pytmc' := '
        pv: MMS:STATE
        io: i
        arrStates.array: 1..6
    '}
    fbStates: FB_MFX_ATM_States;

    {attribute 'pytmc' := '
        pv: STC:01
        io: input
    '}
    fbThermoCouple1: FB_TempSensor;

    // Only do some of the puts on init
    bInit: BOOL := FALSE;
END_VAR
fbYStage(stMotionStage:=stYStage);
IF NOT bInit THEN // Easier to debug if you can write to these
    stYStage.bHardwareEnable := TRUE;
    stYStage.bPowerSelf := TRUE; // Changed from standard because no PMPS
    stYStage.nEnableMode := ENUM_StageEnableMode.DURING_MOTION;
    //stYStage.nEnableMode := ENUM_StageEnableMode.NEVER;
END_IF

fbXStage(stMotionStage:=stXStage);
IF NOT bInit THEN // Easier to debug if you can write to these
    stXStage.bLimitForwardEnable := TRUE;
    stXStage.bLimitBackwardEnable := TRUE;
    stXStage.bHardwareEnable := TRUE;
    stXStage.bPowerSelf := TRUE;
    stXStage.nEnableMode := ENUM_StageEnableMode.DURING_MOTION;
    //stXStage.nEnableMode := ENUM_StageEnableMode.NEVER;
END_IF

fbStates(
//    fbArbiter:=fbArbiter,
//    fbFFHWO:=fbFFHWO,
//    nTransitionAssertionID:=nTransitionAssertionID,
//    nUnknownAssertionID:=nUnknownAssertionID,
    stMotionStage:=stYStage,
    bEnable := TRUE,
    stOut:=stOut,
    stTarget1:=stTarget1,
    stTarget2:=stTarget2,
    stTarget3:=stTarget3,
    stTarget4:=stTarget4,
    stTarget5:=stTarget5);

fbThermoCouple1();

IF NOT bInit THEN
    bInit := TRUE;
END_IF

END_FUNCTION_BLOCK
Related:

FB_MFX_ATM_States

FUNCTION_BLOCK FB_MFX_ATM_States EXTENDS FB_PositionStateBase
VAR_INPUT
    {attribute 'pytmc' := '
        pv: SET
        io: io
    '}
    enumSet: ENUM_ATM_states;

    stOut: DUT_PositionState;
    stTarget1: DUT_PositionState;
    stTarget2: DUT_PositionState;
    stTarget3: DUT_PositionState;
    stTarget4: DUT_PositionState;
    stTarget5: DUT_PositionState;

    bStatesLock: BOOL;
END_VAR
VAR_OUTPUT
    {attribute 'pytmc' := '
        pv: GET
        io: i
    '}
    enumGet: ENUM_ATM_States;
END_VAR
VAR
    bATMInit: BOOL;
END_VAR
VAR CONSTANT
    fInDelta: LREAL := 2;
    fOutDelta: LREAL := 2;
    fInVelocity: LREAL := 5;
    fOutVelocity: LREAL := 5;
    fAccel: LREAL := 200;
    fOutDecel: LREAL := 25;
END_VAR
IF NOT bATMInit THEN
    bATMInit := TRUE;

    stOut.sName := 'OUT';
    stOut.fVelocity := fOutVelocity;
    stOut.fDelta := fOutDelta;
    stOut.fAccel := fAccel;
    stOut.fDecel := fOutDecel;
    stOut.bMoveOk := TRUE;

    stTarget1.sName := 'TARGET1';
    stTarget1.fVelocity := fInVelocity;
    stTarget1.fDelta := fInDelta;
    stTarget1.fAccel := fAccel;
    stTarget1.fDecel := fAccel;
    stTarget1.bMoveOk := TRUE;

    stTarget2.sName := 'TARGET2';
    stTarget2.fVelocity := fInVelocity;
    stTarget2.fDelta := fInDelta;
    stTarget2.fAccel := fAccel;
    stTarget2.fDecel := fAccel;
    stTarget2.bMoveOk := TRUE;

    stTarget3.sName := 'TARGET3';
    stTarget3.fVelocity := fInVelocity;
    stTarget3.fDelta := fInDelta;
    stTarget3.fAccel := fAccel;
    stTarget3.fDecel := fAccel;
    stTarget3.bMoveOk := TRUE;

    stTarget4.sName := 'TARGET4';
    stTarget4.fVelocity := fInVelocity;
    stTarget4.fDelta := fInDelta;
    stTarget4.fAccel := fAccel;
    stTarget4.fDecel := fAccel;
    stTarget4.bMoveOk := TRUE;

    stTarget5.sName := 'TARGET5';
    stTarget5.fVelocity := fInVelocity;
    stTarget5.fDelta := fInDelta;
    stTarget5.fAccel := fAccel;
    stTarget5.fDecel := fAccel;
    stTarget5.bMoveOk := TRUE;

    arrStates[1] := stOut;
    arrStates[2] := stTarget1;
    arrStates[3] := stTarget2;
    arrStates[4] := stTarget3;
    arrStates[5] := stTarget4;
    arrStates[6] := stTarget5;
END_IF

setState := enumSet;
Exec();
enumGet := getState;
enumSet := setState;

END_FUNCTION_BLOCK

PRG_1_PlcTask

PROGRAM PRG_1_PlcTask
VAR
END_VAR
PRG_LIB();
PRG_ATM();
PRG_LJ();
PRG_4_LOG();

END_PROGRAM
Related:

PRG_4_LOG

PROGRAM PRG_4_LOG
VAR
    fbLogHandler: FB_LogHandler;
END_VAR
fbLogHandler();

END_PROGRAM

PRG_ATM

PROGRAM PRG_ATM
VAR
    {attribute 'pytmc' := '
        pv: MFX:ATM
        io: io
    '}
    {attribute 'TcLinkTo' := '.fbThermoCouple1.bError := TIIB[MFX-ATM-EL3314-E5]^TC Inputs Channel 1^Status^Error;
                              .fbThermoCouple1.bUnderrange := TIIB[MFX-ATM-EL3314-E5]^TC Inputs Channel 1^Status^Underrange;
                              .fbThermoCouple1.bOverrange := TIIB[MFX-ATM-EL3314-E5]^TC Inputs Channel 1^Status^Overrange;
                              .fbThermoCouple1.iRaw := TIIB[MFX-ATM-EL3314-E5]^TC Inputs Channel 1^Value'}
    fbATM: FB_ATM_MFX;

    {attribute 'TcLinkTo' := 'TIIB[MFX-ATM-EL2004-E4]^Channel 1^Output'}
    bBrakeRelease AT%Q*: bool;

    fbBrakeDelayTimer: TON;
END_VAR
fbATM.nTransitionAssertionID := 16#5140;
fbATM.nUnknownAssertionID := 16#5149;

fbATM.stOut.fPosition := -15;
fbATM.stOut.bUseRawCounts := FALSE;
fbATM.stOut.nRequestAssertionID := 16#5141;
fbATM.stOut.stBeamParams := PMPS_GVL.cstFullBeam;
fbATM.stOut.bValid := TRUE;

fbATM.stTarget1.fPosition := -39.124;
fbATM.stTarget1.bUseRawCounts := FALSE;
fbATM.stTarget1.nRequestAssertionID := 16#5142;
fbATM.stTarget1.stBeamParams := PMPS_GVL.cstFullBeam;
fbATM.stTarget1.bValid := TRUE;

fbATM.stTarget2.fPosition := -53.5;
fbATM.stTarget2.bUseRawCounts := FALSE;
fbATM.stTarget2.nRequestAssertionID := 16#5143;
fbATM.stTarget2.stBeamParams := PMPS_GVL.cstFullBeam;
fbATM.stTarget2.bValid := TRUE;

fbATM.stTarget3.fPosition := -67.874;
fbATM.stTarget3.bUseRawCounts := FALSE;
fbATM.stTarget3.nRequestAssertionID := 16#5144;
fbATM.stTarget3.stBeamParams := PMPS_GVL.cstFullBeam;
fbATM.stTarget3.bValid := TRUE;

fbATM.stTarget4.fPosition := -82.25;
fbATM.stTarget4.bUseRawCounts := FALSE;
fbATM.stTarget4.nRequestAssertionID := 16#5145;
fbATM.stTarget4.stBeamParams := PMPS_GVL.cstFullBeam;
fbATM.stTarget4.bValid := TRUE;

fbATM.stTarget5.fPosition := -96.623;
fbATM.stTarget5.bUseRawCounts := FALSE;
fbATM.stTarget5.nRequestAssertionID := 16#5146;
fbATM.stTarget5.stBeamParams := PMPS_GVL.cstFullBeam;
fbATM.stTarget5.bValid := TRUE;

fbATM(
    fbArbiter := fbArbiter,
    fbFFHWO := fbFastFaultOutput1,
    stYStage := Main.M1,
    stXStage := Main.M2);

// Add custom delay to the brakeRelease
fbBrakeDelayTimer(
    IN := main.M1.bBrakeRelease,
    PT := T#50ms);
bBrakeRelease := fbBrakeDelayTimer.Q;

END_PROGRAM
Related:

PRG_LIB

PROGRAM PRG_LIB
VAR
    fbLIB_1: FB_MotionStage;
    fbLIB_2: FB_MotionStage;
    fbLIB_3: FB_MotionStage;
    fbLIB_4: FB_MotionStage;

    // Only do some of the puts on init
    bInit: BOOL := FALSE;
END_VAR
fbLIB_1(stMotionStage:=Main.M3);
fbLIB_2(stMotionStage:=Main.M4);
fbLIB_3(stMotionStage:=Main.M5);
fbLIB_4(stMotionStage:=Main.M6);

IF NOT bInit THEN // Easier to debug if you can write to these
    Main.M3.bHardwareEnable := TRUE;
    Main.M3.bPowerSelf := TRUE;
    Main.M3.nEnableMode := ENUM_StageEnableMode.DURING_MOTION;
//  Main.M3.nHomingMode := ENUM_EpicsHomeCmd.LOW_LIMIT;
//    Main.M3.nEnableMode := ENUM_StageEnableMode.ALWAYS;

    Main.M4.bHardwareEnable := TRUE;
    Main.M4.bPowerSelf := TRUE;
    Main.M4.nEnableMode := ENUM_StageEnableMode.DURING_MOTION;
//  Main.M4.nHomingMode := ENUM_EpicsHomeCmd.LOW_LIMIT;
//    Main.M4.nEnableMode := ENUM_StageEnableMode.ALWAYS;

    Main.M5.bHardwareEnable := TRUE;
    Main.M5.bPowerSelf := TRUE;
    Main.M5.nEnableMode := ENUM_StageEnableMode.DURING_MOTION;
//  Main.M5.nHomingMode := ENUM_EpicsHomeCmd.LOW_LIMIT;
//    Main.M5.nEnableMode := ENUM_StageEnableMode.ALWAYS;

    Main.M6.bHardwareEnable := TRUE;
    Main.M6.bPowerSelf := TRUE;
    Main.M6.nEnableMode := ENUM_StageEnableMode.DURING_MOTION;
//  Main.M6.nHomingMode := ENUM_EpicsHomeCmd.LOW_LIMIT;
//    Main.M6.nEnableMode := ENUM_StageEnableMode.ALWAYS;

    bInit := True;
END_IF

END_PROGRAM
Related:

PRG_LJ

PROGRAM PRG_LJ
VAR
    fbLJ_1: FB_MotionStage;
    fbLJ_2: FB_MotionStage;
    fbLJ_3: FB_MotionStage;
    fbLJ_4: FB_MotionStage;
    fbLJ_5: FB_MotionStage;
    fbLJ_6: FB_MotionStage;
    fbLJ_7: FB_MotionStage;
    fbLJ_8: FB_MotionStage;

    // Only do some of the puts on init
    bInit: BOOL := FALSE;
END_VAR
fbLJ_1(stMotionStage:=Main.M7);
fbLJ_2(stMotionStage:=Main.M8);
fbLJ_3(stMotionStage:=Main.M9);
fbLJ_4(stMotionStage:=Main.M10);
fbLJ_5(stMotionStage:=Main.M11);
fbLJ_6(stMotionStage:=Main.M12);
fbLJ_7(stMotionStage:=Main.M13);
fbLJ_8(stMotionStage:=Main.M14);

IF NOT bInit THEN // Easier to debug if you can write to these
    Main.M7.bHardwareEnable := TRUE;
    Main.M7.bPowerSelf := TRUE;
    Main.M7.nEnableMode := ENUM_StageEnableMode.DURING_MOTION;
//  Main.M7.nHomingMode := ENUM_EpicsHomeCmd.LOW_LIMIT;
//    Main.M7.nEnableMode := ENUM_StageEnableMode.ALWAYS;

    Main.M8.bHardwareEnable := TRUE;
    Main.M8.bPowerSelf := TRUE;
    Main.M8.nEnableMode := ENUM_StageEnableMode.DURING_MOTION;
//  Main.M8.nHomingMode := ENUM_EpicsHomeCmd.LOW_LIMIT;
//    Main.M8.nEnableMode := ENUM_StageEnableMode.ALWAYS;

    Main.M9.bHardwareEnable := TRUE;
    Main.M9.bPowerSelf := TRUE;
    Main.M9.nEnableMode := ENUM_StageEnableMode.DURING_MOTION;
//  Main.M9.nHomingMode := ENUM_EpicsHomeCmd.LOW_LIMIT;
//    Main.M9.nEnableMode := ENUM_StageEnableMode.ALWAYS;

    Main.M10.bHardwareEnable := TRUE;
    Main.M10.bPowerSelf := TRUE;
    Main.M10.nEnableMode := ENUM_StageEnableMode.DURING_MOTION;
//  Main.M10.nHomingMode := ENUM_EpicsHomeCmd.LOW_LIMIT;
//    Main.M10.nEnableMode := ENUM_StageEnableMode.ALWAYS;

    Main.M11.bHardwareEnable := TRUE;
    Main.M11.bPowerSelf := TRUE;
    Main.M11.nEnableMode := ENUM_StageEnableMode.DURING_MOTION;
//  Main.M11.nHomingMode := ENUM_EpicsHomeCmd.LOW_LIMIT;
//    Main.M11.nEnableMode := ENUM_StageEnableMode.ALWAYS;

    Main.M12.bHardwareEnable := TRUE;
    Main.M12.bPowerSelf := TRUE;
    Main.M12.nEnableMode := ENUM_StageEnableMode.DURING_MOTION;
//  Main.M12.nHomingMode := ENUM_EpicsHomeCmd.LOW_LIMIT;
//    Main.M12.nEnableMode := ENUM_StageEnableMode.ALWAYS;

    Main.M13.bHardwareEnable := TRUE;
    Main.M13.bPowerSelf := TRUE;
    Main.M13.nEnableMode := ENUM_StageEnableMode.DURING_MOTION;
//  Main.M13.nHomingMode := ENUM_EpicsHomeCmd.LOW_LIMIT;
//    Main.M13.nEnableMode := ENUM_StageEnableMode.ALWAYS;

    Main.M14.bHardwareEnable := TRUE;
    Main.M14.bPowerSelf := TRUE;
    Main.M14.nEnableMode := ENUM_StageEnableMode.DURING_MOTION;
//  Main.M14.nHomingMode := ENUM_EpicsHomeCmd.LOW_LIMIT;
//    Main.M14.nEnableMode := ENUM_StageEnableMode.ALWAYS;

    bInit := True;
END_IF

END_PROGRAM
Related: