DUTs

E_PositionState

{attribute 'qualified_only'}
{attribute 'strict'}
TYPE E_PositionState :
(
RETRACTED   := 0,
INSERTED    := 1,
MOVING      := 2,
INVALID :=3
);
END_TYPE
Related:

ST_MPA

TYPE ST_MPA :
STRUCT
    //Readbacks
    {attribute 'pytmc' := '
    pv: IN;
    io: i;
    '}
    i_bInLS :       BOOL;
    {attribute 'pytmc' := '
    pv: OUT;
    io: i;
    '}
    i_bOutLS        :       BOOL;
    //Controls
    {attribute 'pytmc' := '
    pv: INSERT_DO;
    io: i;
    '}
    q_bRetract      :       BOOL;
    {attribute 'pytmc' := '
    pv: RETRACT_DO;
    io: i;
    '}
    q_bInsert       :       BOOL;
//    q_xRetract_Do : Bool;


    //Logic and supervisory
    {attribute 'pytmc' := '
    pv: ILKOK;
    io: i;
    '}
    bILK_OK: BOOL;
    {attribute 'pytmc' := '
    pv: INSERT_OK;
    io: i;
    '}
    bInsertOK       :       BOOL;
    {attribute 'pytmc' := '
    pv: RETRACT_OK;
    io: i;
    '}
    bRetractOK      :       BOOL;
    {attribute 'pytmc' := '
    pv: IN_CMD;
    io: io;
    '}
    bInsert_SW              :       BOOL;
    {attribute 'pytmc' := '
    pv: OUT_CMD;
    io: io;
    '}
    bRetract_SW     :       BOOL;
    {attribute 'pytmc' := '
    pv: ERROR;
    io: io;
    '}
    bErrorPresent : BOOL;
    {attribute 'pytmc' := '
    pv: POS_STATE ;
    type: mbbi ;
    field: ZRST RETRACTED ;
    field: ONST INSERTED ;
    field: TWST MOVING ;
    field: THST INVALID ;
    io: i
    '}

    eState  :       E_PositionState := E_PositionState.INVALID;

END_STRUCT
END_TYPE
Related:

ST_PressureSensor

TYPE ST_PressureSensor :
STRUCT
    {attribute 'pytmc' := '
    pv: PRESS;
    io: i;
    '}
    rPRESS: REAL; //This is the human-readable pressure
    {attribute 'pytmc' := '
    pv: iPRESS;
    io: i;
    '}
    iPRESS_R : INT ; //input pressure in machine form
    {attribute 'pytmc' := '
    pv: PRESS_SP;
    io: io;
    '}
    rPressSP: REAL ; // EPICS Pressure setpoint
    {attribute 'pytmc' := '
    pv: MIN_SP;
    io: io;
    '}
    rMinPressSP : REAL;  // Low limit of pressure setpoint
    {attribute 'pytmc' := '
    pv: MAX_SP;
    io: io;
    '}
    rMaxPressSP : REAL;     // High limit of pressure setpoint
    {attribute 'pytmc' := '
    pv: SCALE;
    io: io;
    '}
    rFULL_SCALE: REAL; // Full scale
    {attribute 'pytmc' := '
    pv: ALARM;
    field: ZNAM Normal;
    field: ONAM Alarm;
    io: i;
    '}
    xPstateAlarm : BOOL; // 0:Normal, 1:Alarm


END_STRUCT
END_TYPE

GVLs

Global_Version

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

GVL_Control

VAR_GLOBAL
    {attribute 'pytmc' :=' pv: EM1L0:GEM:CNTRL:SP;
    field: HOPR 1000;
    field: LOPR 0;
    field: PREC 2;
    field: EGU "TORR";
    '}
    fGEM1SetpointValue : REAL:=0;
    {attribute 'pytmc' :=' pv: EM2L0:GEM:CNTRL:SP;
    field: HOPR 1000;
    field: LOPR 0;
    field: PREC 2;
    field: EGU "TORR";
    '}
    fGEM2SetpointValue : REAL:=0;


    {attribute 'pytmc' :=' pv: EM1L0:GEM:CNTRL:GO;
      field: ZNAM STOP;
     field: ONAM START;
     io: io;
     '}
    GEM1_GO : BOOL:=false;

    {attribute 'pytmc' :=' pv: EM2L0:GEM:CNTRL:GO;
     field: ZNAM STOP;
     field: ONAM START;
     io: io; '}
    GEM2_GO : BOOL:=false;
END_VAR

GVL_Devices

VAR_GLOBAL

    (*Upstream Interface*)
    (*Gauges*)
    USG_PIN: FB_TPIP_ADS;
    USG_GCC: FB_TGCC_ADS;
    DSG_PIN: FB_TPIP_ADS;
    (*Valves*)
    DSV_VGC: FB_Valve_Interface;

    iWatchdog:UDINT;//The watchdog variable name written to by the remote plc


(*EM1L0*)
(*Gauges*)
    {attribute 'pytmc' :=' pv: EM1L0:GEM:GCC:10 '}
    {attribute 'TcLinkTo' :=        '.i_iPRESS_R    :=      TIIB[MKS_E1 (EL3064)]^AI Standard Channel 1^Value;
                                 .q_xHV_DIS         :=      TIIB[MKS_E3 (EL2794)]^Channel 1^Output'}
    GEM1_GCC_10 : FB_MKS422;

    {attribute 'pytmc' :=' pv: EM1L0:GEM:GPI:10 '}
    {attribute 'TcLinkTo' :=        '.i_iPRESS_R    :=      TIIB[MKS_E1 (EL3064)]^AI Standard Channel 4^Value'}
    GEM1_GPI_10 : FB_MKS317A;

    {attribute 'pytmc' :=' pv: EM1L0:GEM:GCC:20 '}
    {attribute 'TcLinkTo' :=        '.i_iPRESS_R    :=      TIIB[MKS_E1 (EL3064)]^AI Standard Channel 3^Value;
                                 .q_xHV_DIS         :=      TIIB[MKS_E3 (EL2794)]^Channel 2^Output'}
    GEM1_GCC_20 : FB_MKS422;

    {attribute 'pytmc' :=' pv: EM1L0:GEM:GPI:20 '}
    {attribute 'TcLinkTo' :=        '.i_iPRESS_R    :=      TIIB[MKS_E2 (EL3064)]^AI Standard Channel 1^Value'}
    GEM1_GPI_20 : FB_MKS317A;

    {attribute 'pytmc' :=' pv: EM1L0:GEM:GCC:30 '}
    {attribute 'TcLinkTo' :=        '.i_iPRESS_R    :=      TIIB[MKS_E4 (EL3064)]^AI Standard Channel 1^Value;
                                 .q_xHV_DIS         :=      TIIB[MKS_E6 (EL2794)]^Channel 1^Output'}
    GEM1_GCC_30 : FB_MKS422;

    {attribute 'pytmc' :=' pv: EM1L0:GEM:GPI:30 '}
    {attribute 'TcLinkTo' :=        '.i_iPRESS_R    :=      TIIB[MKS_E4 (EL3064)]^AI Standard Channel 4^Value'}
    GEM1_GPI_30 : FB_MKS317A;

    {attribute 'pytmc' :=' pv: EM1L0:GEM:GCC:50 '}
    {attribute 'TcLinkTo' :=        '.i_iPRESS_R    :=      TIIB[MKS_E4 (EL3064)]^AI Standard Channel 3^Value;
                                 .q_xHV_DIS         :=      TIIB[MKS_E6 (EL2794)]^Channel 2^Output'}
    GEM1_GCC_50 : FB_MKS422;

    {attribute 'pytmc' :=' pv: EM1L0:GEM:GPI:50 '}
    {attribute 'TcLinkTo' :=        '.i_iPRESS_R    :=      TIIB[MKS_E5 (EL3064)]^AI Standard Channel 1^Value'}
    GEM1_GPI_50 : FB_MKS317A;

    {attribute 'pytmc' :=' pv: EM1L0:GEM:GPI:11 '}
    {attribute 'TcLinkTo' :=        '.i_iPRESS_R    :=      TIIB[L0S3_PNL_01_EB_5 (EP3174-0002)]^AI Standard Channel 3^Value'}
    GEM1_GPI_11 : FB_MKS275;

    {attribute 'pytmc' :=' pv: EM1L0:GEM:GPI:31 '}
    {attribute 'TcLinkTo' :=        '.i_iPRESS_R    :=      TIIB[L0S3_PNL_01_EB_5 (EP3174-0002)]^AI Standard Channel 4^Value'}
    GEM1_GPI_31 : FB_MKS275;

    {attribute 'pytmc' :=' pv: EM1L0:GEM:GPI:51 '}
    {attribute 'TcLinkTo' :=        '.i_iPRESS_R    :=      TIIB[L0S3_PNL_03_EB_4 (EP3174-0002)]^AI Standard Channel 3^Value'}
    GEM1_GPI_51 : FB_MKS275;

    {attribute 'pytmc' :=' pv: EM1L0:GEM:GPI:60 '}
    {attribute 'TcLinkTo' :=        '.i_iPRESS_R    :=      TIIB[MKS_E14 (EL3064)]^AI Standard Channel 1^Value'}
    GEM1_GPI_60 : FB_MKS317A;

    {attribute 'pytmc' :=' pv: EM1L0:GEM:GPI:61 '}
    {attribute 'TcLinkTo' :=        '.i_iPRESS_R    :=      TIIB[L0S3_PNL_03_EB_5 (EP3174-0002)]^AI Standard Channel 2^Value'}
    GEM1_GPI_61 : FB_MKS275;

    {attribute 'pytmc' :=' pv: EM1L0:GEM:GPI:71 '}
    {attribute 'TcLinkTo' :=        '.i_iPRESS_R    :=      TIIB[L0S3_PNL_03_EB_5 (EP3174-0002)]^AI Standard Channel 3^Value'}
    GEM1_GPI_71 : FB_MKS275;

(*detector*)
    {attribute 'pytmc' :=' pv: EM1L0:GEM:GCM:41 '}
    {attribute 'TcLinkTo' :=        '.i_iPRESS_R    :=      TIIB[L0S3_PNL_02_EB_4 (EP3174-0002)]^AI Standard Channel 1^Value'}
    GEM1_GCM_41 : FB_GCM;
    {attribute 'pytmc' :=' pv: EM1L0:GEM:GCM:42 '}
    {attribute 'TcLinkTo' :=        '.i_iPRESS_R    :=      TIIB[L0S3_PNL_02_EB_4 (EP3174-0002)]^AI Standard Channel 2^Value'}
    GEM1_GCM_42 : FB_GCM;
    (*Pseudo gauge device Structure to combine the readings of two GCM gauges*)
    {attribute 'pytmc' :=' pv: EM1L0:GEM:GCM:40 '}
    GEM1_GCM_40 : ST_VG;
(* N2 cutt off valve *)
    {attribute 'pytmc' :=' pv: EM1L0:GEM:VVC:40'}
    {attribute 'TcLinkTo' :=        '.q_xOPN_DO     :=      TIIB[L0S3_PNL_02_EB_2 (EP2338-0002)]^Channel 15^Output'}
    GEM1_VVC_40: FB_VVC;
(*Pressure Control valve*)
    {attribute 'pytmc' :=' pv: EM1L0:GEM:VCN:40 '}
    {attribute 'TcLinkTo' :=        '.q_iRawPosition        :=      TIIB[L0S3_PNL_02_EB_3 (EP4374-0002)]^AO Outputs Channel 4^Analog output'}
    GEM1_VCN_40 : FB_VCN;

(* aperture valves*)
    {attribute 'pytmc' :=' pv: EM1L0:GEM:VGC:10 '}
    {attribute 'TcLinkTo' :=        '.i_xOpnLS      :=      TIIB[L0S3_PNL_01_EB_1 (EP2338-0002)]^Channel 1^Input;
                                 .i_xClsLS  :=      TIIB[L0S3_PNL_01_EB_1 (EP2338-0002)]^Channel 2^Input;
                                 .q_xOPN_DO :=      TIIB[L0S3_PNL_01_EB_1 (EP2338-0002)]^Channel 11^Output'}
    GEM1_VGC_10: FB_VGC;

    {attribute 'pytmc' :=' pv: EM1L0:GEM:VGC:20 '}
    {attribute 'TcLinkTo' :=        '.i_xOpnLS      :=      TIIB[L0S3_PNL_01_EB_2 (EP2338-0002)]^Channel 1^Input;
                                 .i_xClsLS  :=      TIIB[L0S3_PNL_01_EB_2 (EP2338-0002)]^Channel 2^Input;
                                 .q_xOPN_DO :=      TIIB[L0S3_PNL_01_EB_2 (EP2338-0002)]^Channel 11^Output'}
    GEM1_VGC_20: FB_VGC;

    {attribute 'pytmc' :=' pv: EM1L0:GEM:VGC:30 '}
    {attribute 'TcLinkTo' :=        '.i_xOpnLS      :=      TIIB[L0S3_PNL_01_EB_2 (EP2338-0002)]^Channel 5^Input;
                                 .i_xClsLS  :=      TIIB[L0S3_PNL_01_EB_2 (EP2338-0002)]^Channel 6^Input;
                                 .q_xOPN_DO :=      TIIB[L0S3_PNL_01_EB_2 (EP2338-0002)]^Channel 15^Output'}
    GEM1_VGC_30: FB_VGC;

    {attribute 'pytmc' :=' pv: EM1L0:GEM:VGC:40 '}
    {attribute 'TcLinkTo' :=        '.i_xOpnLS      :=      TIIB[L0S3_PNL_02_EB_1 (EP2338-0002)]^Channel 1^Input;
                                 .i_xClsLS  :=      TIIB[L0S3_PNL_02_EB_1 (EP2338-0002)]^Channel 2^Input;
                                 .q_xOPN_DO :=      TIIB[L0S3_PNL_02_EB_1 (EP2338-0002)]^Channel 11^Output'}
    GEM1_VGC_40: FB_VGC;

    {attribute 'pytmc' :=' pv: EM1L0:GEM:VGC:50 '}
    {attribute 'TcLinkTo' :=        '.i_xOpnLS      :=      TIIB[L0S3_PNL_02_EB_1 (EP2338-0002)]^Channel 5^Input;
                                 .i_xClsLS  :=      TIIB[L0S3_PNL_02_EB_1 (EP2338-0002)]^Channel 6^Input;
                                 .q_xOPN_DO :=      TIIB[L0S3_PNL_02_EB_1 (EP2338-0002)]^Channel 15^Output'}
    GEM1_VGC_50: FB_VGC;

    {attribute 'pytmc' :=' pv: EM1L0:GEM:VGC:60 '}
    {attribute 'TcLinkTo' :=        '.i_xOpnLS      :=      TIIB[L0S3_PNL_03_EB_1 (EP2338-0002)]^Channel 5^Input;
                                 .i_xClsLS  :=      TIIB[L0S3_PNL_03_EB_1 (EP2338-0002)]^Channel 6^Input;
                                 .q_xOPN_DO :=      TIIB[L0S3_PNL_03_EB_1 (EP2338-0002)]^Channel 15^Output'}
    GEM1_VGC_60: FB_VGC;

    {attribute 'pytmc' :=' pv: EM1L0:GEM:VGC:70 '}
    {attribute 'TcLinkTo' :=        '.i_xOpnLS      :=      TIIB[L0S3_PNL_03_EB_3 (EP2338-0002)]^Channel 1^Input;
                                 .i_xClsLS  :=      TIIB[L0S3_PNL_03_EB_3 (EP2338-0002)]^Channel 2^Input;
                                 .q_xOPN_DO :=      TIIB[L0S3_PNL_03_EB_3 (EP2338-0002)]^Channel 11^Output'}
    GEM1_VGC_70: FB_VGC;

(*Turbo Isolation valves*)
    {attribute 'pytmc' :=' pv: EM1L0:GEM:VRC:10 '}
    {attribute 'TcLinkTo' :=        '.i_xOpnLS      :=      TIIB[L0S3_PNL_01_EB_1 (EP2338-0002)]^Channel 5^Input;
                                 .i_xClsLS  :=      TIIB[L0S3_PNL_01_EB_1 (EP2338-0002)]^Channel 6^Input;
                                 .q_xOPN_DO :=      TIIB[L0S3_PNL_01_EB_1 (EP2338-0002)]^Channel 15^Output'}
    GEM1_VRC_10: FB_VRC;

    {attribute 'pytmc' :=' pv: EM1L0:GEM:VRC:20 '}
    {attribute 'TcLinkTo' :=        '.i_xOpnLS      :=      TIIB[L0S3_PNL_01_EB_3 (EP2338-0002)]^Channel 5^Input;
                                 .i_xClsLS  :=      TIIB[L0S3_PNL_01_EB_3 (EP2338-0002)]^Channel 6^Input;
                                 .q_xOPN_DO :=      TIIB[L0S3_PNL_01_EB_3 (EP2338-0002)]^Channel 15^Output'}
    GEM1_VRC_20: FB_VRC;

    {attribute 'pytmc' :=' pv: EM1L0:GEM:VRC:30 '}
    {attribute 'TcLinkTo' :=        '.i_xOpnLS      :=      TIIB[L0S3_PNL_01_EB_4 (EP2338-0002)]^Channel 5^Input;
                                 .i_xClsLS  :=      TIIB[L0S3_PNL_01_EB_4 (EP2338-0002)]^Channel 6^Input;
                                 .q_xOPN_DO :=      TIIB[L0S3_PNL_01_EB_4 (EP2338-0002)]^Channel 15^Output'}
    GEM1_VRC_30: FB_VRC;

    {attribute 'pytmc' :=' pv: EM1L0:GEM:VRC:50 '}
    {attribute 'TcLinkTo' :=        '.i_xOpnLS      :=      TIIB[L0S3_PNL_03_EB_1 (EP2338-0002)]^Channel 1^Input;
                                 .i_xClsLS  :=      TIIB[L0S3_PNL_03_EB_1 (EP2338-0002)]^Channel 2^Input;
                                 .q_xOPN_DO :=      TIIB[L0S3_PNL_03_EB_1 (EP2338-0002)]^Channel 11^Output'}
    GEM1_VRC_50: FB_VRC;

(*Kashiyama Valves*)
    {attribute 'pytmc' :=' pv: EM1L0:GEM:VRC:60 '}
    {attribute 'TcLinkTo' :=        '.i_xOpnLS      :=      TIIB[L0S3_PNL_03_EB_2 (EP2338-0002)]^Channel 5^Input;
                                 .i_xClsLS  :=      TIIB[L0S3_PNL_03_EB_2 (EP2338-0002)]^Channel 6^Input;
                                 .q_xOPN_DO :=      TIIB[L0S3_PNL_03_EB_2 (EP2338-0002)]^Channel 15^Output'}
    GEM1_VRC_60:FB_Kashiyama_VRC;

    {attribute 'pytmc' :=' pv: EM1L0:GEM:VRC:70 '}
    {attribute 'TcLinkTo' :=        '.i_xOpnLS      :=      TIIB[L0S3_PNL_03_EB_3 (EP2338-0002)]^Channel 5^Input;
                                 .i_xClsLS  :=      TIIB[L0S3_PNL_03_EB_3 (EP2338-0002)]^Channel 6^Input;
                                 .q_xOPN_DO :=      TIIB[L0S3_PNL_03_EB_3 (EP2338-0002)]^Channel 15^Output'}
    GEM1_VRC_70:FB_Kashiyama_VRC;

(*Kashiyama pumps*)

    {attribute 'pytmc' :=' pv: EM1L0:GEM:PRO:60 '}
    {attribute 'TcLinkTo' :=        '.i_xIsRun      :=      TIIB[L0S3_PNL_03_EB_7 (EP2338-0002)]^Channel 1^Input;
                                 .i_xLocal  :=      TIIB[L0S3_PNL_03_EB_7 (EP2338-0002)]^Channel 2^Input;
                                 .i_xWarning :=     TIIB[L0S3_PNL_03_EB_7 (EP2338-0002)]^Channel 5^Input;
                                 .i_xAlarm :=       TIIB[L0S3_PNL_03_EB_7 (EP2338-0002)]^Channel 6^Input;
                                 .q_xRunDO  :=      TIIB[L0S3_PNL_03_EB_6 (EP2624-0002)]^Channel 1^Output;
                                 .q_xLspdDo :=      TIIB[L0S3_PNL_03_EB_6 (EP2624-0002)]^Channel 2^Output;
                                 .q_xResetDo:=      TIIB[L0S3_PNL_03_EB_6 (EP2624-0002)]^Channel 3^Output'}
    GEM1_PRO_60: FB_KashiyamaPump;

    {attribute 'pytmc' :=' pv: EM1L0:GEM:PRO:70 '}
    {attribute 'TcLinkTo' :=        '.i_xIsRun      :=      TIIB[L0S3_PNL_03_EB_9 (EP2338-0002)]^Channel 1^Input;
                                 .i_xLocal  :=      TIIB[L0S3_PNL_03_EB_9 (EP2338-0002)]^Channel 2^Input;
                                 .i_xWarning :=     TIIB[L0S3_PNL_03_EB_9 (EP2338-0002)]^Channel 5^Input;
                                 .i_xAlarm :=       TIIB[L0S3_PNL_03_EB_9 (EP2338-0002)]^Channel 6^Input;
                                 .q_xRunDO  :=      TIIB[L0S3_PNL_03_EB_8 (EP2624-0002)]^Channel 1^Output;
                                 .q_xLspdDo :=      TIIB[L0S3_PNL_03_EB_8 (EP2624-0002)]^Channel 2^Output;
                                 .q_xResetDo:=      TIIB[L0S3_PNL_03_EB_8 (EP2624-0002)]^Channel 3^Output'}
    GEM1_PRO_70: FB_KashiyamaPump;

(*Turbos*)
    (*{attribute 'pytmc' :=' pv: EM1L0:GEM:PTM:10 '}
    {attribute 'TcLinkTo' :=        '.i_xR1 :=      TIIB[PLC_EL_2 (EL1088)]^Channel 1^Input;
                                 .i_xLSpd :=        TIIB[PLC_EL_2 (EL1088)]^Channel 2^Input;
                                 .i_xSTART  :=      TIIB[PLC_EL_2 (EL1088)]^Channel 3^Input;
                                 .i_xFault  :=      TIIB[PLC_EL_2 (EL1088)]^Channel 4^Input;
                                 .i_iPowerMon := TIIB[PLC_EL_4 (EL3064)]^AI Standard Channel 1^Value;
                                 .q_RunDO   :=      TIIB[PLC_EL_1 (EL2088)]^Channel 1^Output'}
    GEM1_PTM_10 : FB_PTM_Agilent;*)

    {attribute 'pytmc' :=' pv: EM1L0:GEM:PTM:10 '}
    {attribute 'TcLinkTo' :=        '.i_xAtSpd      :=      TIIB[PTM_E21_EL1088]^Channel 1^Input;
                                 .i_xFault :=       TIIB[PTM_E21_EL1088]^Channel 2^Input;
                                 .q_RunDO   :=      TIIB[PTM_E20_EL2624]^Channel 1^Output'}
    GEM1_PTM_10 : FB_PTM_TwisTorr;
    (*{attribute 'pytmc' :=' pv: EM1L0:GEM:PTM:20 '}
    {attribute 'TcLinkTo' :=        '.i_xR1 :=      TIIB[PLC_EL_2 (EL1088)]^Channel 5^Input;
                                 .i_xLSpd :=        TIIB[PLC_EL_2 (EL1088)]^Channel 6^Input;
                                 .i_xSTART  :=      TIIB[PLC_EL_2 (EL1088)]^Channel 7^Input;
                                 .i_xFault  :=      TIIB[PLC_EL_2 (EL1088)]^Channel 8^Input;
                                 .i_iPowerMon := TIIB[PLC_EL_4 (EL3064)]^AI Standard Channel 2^Value;
                                 .q_RunDO   :=      TIIB[PLC_EL_1 (EL2088)]^Channel 2^Output'}
    GEM1_PTM_20 : FB_PTM_Agilent;*)

    {attribute 'pytmc' :=' pv: EM1L0:GEM:PTM:20 '}
    {attribute 'TcLinkTo' :=        '.i_xAtSpd      :=      TIIB[PTM_E21_EL1088]^Channel 3^Input;
                                 .i_xFault :=       TIIB[PTM_E21_EL1088]^Channel 4^Input;
                                 .q_RunDO   :=      TIIB[PTM_E20_EL2624]^Channel 2^Output'}
    GEM1_PTM_20 : FB_PTM_TwisTorr;

    {attribute 'pytmc' :=' pv: EM1L0:GEM:PTM:30 '}
    {attribute 'TcLinkTo' :=        '.i_xDecel      :=      TIIB[PTM_E1_EL1004]^Channel 1^Input;
                                 .i_xAtSpd  :=      TIIB[PTM_E1_EL1004]^Channel 2^Input;
                                 .i_xNCFault :=     TIIB[PTM_E1_EL1004]^Channel 3^Input;
                                 .i_xRotate :=      TIIB[PTM_E1_EL1004]^Channel 4^Input;
                                 .i_xAccel :=       TIIB[PTM_E2_EL1004]^Channel 1^Input;
                                 .i_iRawSpeed := TIIB[PTM_E4_EL3064]^AI Standard Channel 1^Value;
                                 .i_iCurrentMon := TIIB[PTM_E4_EL3064]^AI Standard Channel 2^Value;
                                 .i_iTempMon := TIIB[PTM_E4_EL3064]^AI Standard Channel 3^Value;
                                 .q_xReset  :=      TIIB[PTM_E3_EL2798]^Channel 1^Output;
                                 .q_xStart  :=      TIIB[PTM_E3_EL2798]^Channel 2^Output;
                                 .q_xStop   :=      TIIB[PTM_E3_EL2798]^Channel 3^Output;
                                 .q_xProtection     :=      TIIB[PTM_E3_EL2798]^Channel 4^Output;
                                 .q_xSetSpeed       :=      TIIB[PTM_E3_EL2798]^Channel 5^Output;
                                 .q_iSpeedSet       :=      TIIB[PTM_E5_EL4004]^AO Outputs Channel 1^Analog output'}
    GEM1_PTM_30 : FB_PTM_Ebara_010M;
    (*{attribute 'pytmc' :=' pv: EM1L0:GEM:PTM:50 '} REMOVE
    {attribute 'TcLinkTo' :=        '.i_xR1 :=      TIIB[PLC_EL_3 (EL1088)]^Channel 5^Input;
                                 .i_xLSpd :=        TIIB[PLC_EL_3 (EL1088)]^Channel 6^Input;
                                 .i_xSTART  :=      TIIB[PLC_EL_3 (EL1088)]^Channel 7^Input;
                                 .i_xFault  :=      TIIB[PLC_EL_3 (EL1088)]^Channel 8^Input;
                                 .i_iCurrentMon := TIIB[PLC_EL_4 (EL3064)]^AI Standard Channel 4^Value;
                                 .q_RunDO   :=      TIIB[PLC_EL_1 (EL2088)]^Channel 4^Output'}
    GEM1_PTM_50 : FB_PTM_Agilent;*)

    {attribute 'pytmc' :=' pv: EM1L0:GEM:PTM:50 '}
    {attribute 'TcLinkTo' :=        '.i_xDecel      :=      TIIB[PTM_E8_EL1004]^Channel 1^Input;
                                 .i_xAtSpd  :=      TIIB[PTM_E8_EL1004]^Channel 2^Input;
                                 .i_xNCFault :=     TIIB[PTM_E8_EL1004]^Channel 3^Input;
                                 .i_xRotate :=      TIIB[PTM_E8_EL1004]^Channel 4^Input;
                                 .i_xAccel :=       TIIB[PTM_E9_EL1004]^Channel 1^Input;
                                 .i_iRawSpeed := TIIB[PTM_E6_EL3064]^AI Standard Channel 1^Value;
                                 .i_iCurrentMon := TIIB[PTM_E6_EL3064]^AI Standard Channel 2^Value;
                                 .i_iTempMon := TIIB[PTM_E6_EL3064]^AI Standard Channel 3^Value;
                                 .q_xReset  :=      TIIB[PTM_E7_EL2798]^Channel 1^Output;
                                 .q_xStart  :=      TIIB[PTM_E7_EL2798]^Channel 2^Output;
                                 .q_xStop   :=      TIIB[PTM_E7_EL2798]^Channel 3^Output;
                                 .q_xProtection     :=      TIIB[PTM_E7_EL2798]^Channel 4^Output;
                                 .q_xSetSpeed       :=      TIIB[PTM_E7_EL2798]^Channel 5^Output;
                                 .q_iSpeedSet       :=      TIIB[PTM_E5_EL4004]^AO Outputs Channel 3^Analog output'}
    GEM1_PTM_50 : FB_PTM_Ebara_010M;


(*Turbo vent valves*) (*deprecated*)
    {attribute 'pytmc' :=' pv: EM1L0:GEM:VVC:20 '}
    {attribute 'TcLinkTo' :=        '.q_xCLS_DO     :=      TIIB[L0S3_PNL_01_EB_3 (EP2338-0002)]^Channel 11^Output'}
    GEM1_VVC_20: FB_TurbVentvalve_NO;
    {attribute 'pytmc' :=' pv: EM1L0:GEM:VVC:30 '}
    {attribute 'TcLinkTo' :=        '.q_xCLS_DO     :=      TIIB[L0S3_PNL_01_EB_4 (EP2338-0002)]^Channel 11^Output'}
    GEM1_VVC_30: FB_TurbVentvalve_NO;
    {attribute 'pytmc' :=' pv: EM1L0:GEM:VVC:50 '}
    {attribute 'TcLinkTo' :=        '.q_xCLS_DO     :=      TIIB[L0S3_PNL_03_EB_2 (EP2338-0002)]^Channel 11^Output'}
    GEM1_VVC_50: FB_TurbVentvalve_NO;

(*Scroll Pumps*)
    {attribute 'pytmc' :=' pv: EM1L0:GEM:PRO:20 '}
    {attribute 'TcLinkTo' :=        '.q_xRunDo      :=      TIIB[L0S3_PNL_03_EB_7 (EP2338-0002)]^Channel 11^Output'}
    GEM1_PRO_20 : FB_ScrollPump;
    {attribute 'pytmc' :=' pv: EM1L0:GEM:PRO:30 '}
    {attribute 'TcLinkTo' :=        '.q_xRunDo      :=      TIIB[L0S3_PNL_03_EB_7 (EP2338-0002)]^Channel 12^Output'}
    GEM1_PRO_30 : FB_ScrollPump;
    {attribute 'pytmc' :=' pv: EM1L0:GEM:PRO:50 '}
    {attribute 'TcLinkTo' :=        '.q_xRunDo      :=      TIIB[L0S3_PNL_03_EB_7 (EP2338-0002)]^Channel 15^Output'}
    GEM1_PRO_50 : FB_ScrollPump;

(******************)
(******AT1L0*******)
(******************)
(*Gauges*)
    {attribute 'pytmc' :=' pv: AT1L0:GAS:GPI:10 '}
    {attribute 'TcLinkTo' :=        '.i_iPRESS_R    :=      TIIB[MKS_E7 (EL3064)]^AI Standard Channel 2^Value'}
    GATT_GPI_10 : FB_MKS317A;

    {attribute 'pytmc' :=' pv: AT1L0:GAS:GCM:11 '}
    {attribute 'TcLinkTo' :=        '.i_iPRESS_R    :=      TIIB[L0S6_PNL_04_EB_3 (EP4374-0002)]^AI Inputs Channel 1^Value'}
    GATT_GMP_11 : FB_CMR362;
    {attribute 'pytmc' :=' pv: AT1L0:GAS:GCM:10 '}
    {attribute 'TcLinkTo' :=        '.i_iPRESS_R    :=      TIIB[L0S6_PNL_04_EB_2 (EP3174-0002)]^AI Standard Channel 2^Value'}
    GATT_GMP_10 : FB_GCM;
(*Valves*)
    {attribute 'pytmc' :=' pv: AT1L0:GAS:VCN:10 '}
    GATT_VCN_10 : FB_VCN;
    {attribute 'pytmc' :=' pv: AT1L0:GAS:VRC:10 '}
    {attribute 'TcLinkTo' :=        '.i_xOpnLS      :=      TIIB[L0S6_PNL_04_EB_1 (EP2338-0002)]^Channel 1^Input;
                                 .i_xClsLS  :=      TIIB[L0S6_PNL_04_EB_1 (EP2338-0002)]^Channel 2^Input;
                                 .q_xOPN_DO :=      TIIB[L0S6_PNL_04_EB_1 (EP2338-0002)]^Channel 11^Output'}
    GATT_VRC_10 : FB_VRC;

    {attribute 'pytmc' :=' pv: AT1L0:GAS:VVC:10 '}
    {attribute 'TcLinkTo' :=        '.q_xOPN_DO     :=      TIIB[L0S6_PNL_04_EB_1 (EP2338-0002)]^Channel 15^Output'}
    GATT_VVC_10: FB_VVC;



(******************)
(******EM2L0*******)
(******************)

(*Gauges*)
    {attribute 'pytmc' :=' pv: EM2L0:GEM:GPI:10 '}
    {attribute 'TcLinkTo' :=        '.i_iPRESS_R    :=      TIIB[MKS_E7 (EL3064)]^AI Standard Channel 4^Value'}
    GEM2_GPI_10 : FB_MKS317A;

    {attribute 'pytmc' :=' pv: EM2L0:GEM:GPI:11 '}
    {attribute 'TcLinkTo' :=        '.i_iPRESS_R    :=      TIIB[L0S6_PNL_01_EB_4 (EP3174-0002)]^AI Standard Channel 2^Value'}
    GEM2_GPI_11 : FB_MKS275;

    {attribute 'pytmc' :=' pv: EM2L0:GEM:GPI:21 '}
    {attribute 'TcLinkTo' :=        '.i_iPRESS_R    :=      TIIB[L0S6_PNL_01_EB_4 (EP3174-0002)]^AI Standard Channel 3^Value'}
    GEM2_GPI_21 : FB_MKS275;

    {attribute 'pytmc' :=' pv: EM2L0:GEM:GCC:30 '}
    {attribute 'TcLinkTo' :=        '.i_iPRESS_R    :=      TIIB[MKS_E7 (EL3064)]^AI Standard Channel 1^Value;
                                 .q_xHV_DIS         :=      TIIB[MKS_E9 (EL2794)]^Channel 1^Output'}
    GEM2_GCC_30 : FB_MKS422;

    {attribute 'pytmc' :=' pv: EM2L0:GEM:GPI:30 '}
    {attribute 'TcLinkTo' :=        '.i_iPRESS_R    :=      TIIB[MKS_E7 (EL3064)]^AI Standard Channel 3^Value'}
    GEM2_GPI_30 : FB_MKS317A;

    {attribute 'pytmc' :=' pv: EM2L0:GEM:GPI:31 '}
    {attribute 'TcLinkTo' :=        '.i_iPRESS_R    :=      TIIB[L0S6_PNL_01_EB_4 (EP3174-0002)]^AI Standard Channel 4^Value'}
    GEM2_GPI_31 : FB_MKS275;

    {attribute 'pytmc' :=' pv: EM2L0:GEM:GCC:50 '}
    {attribute 'TcLinkTo' :=        '.i_iPRESS_R    :=      TIIB[MKS_E10 (EL3064)]^AI Standard Channel 1^Value;
                                 .q_xHV_DIS         :=      TIIB[MKS_E12 (EL2794)]^Channel 1^Output'}
    GEM2_GCC_50 : FB_MKS422;

    {attribute 'pytmc' :=' pv: EM2L0:GEM:GPI:50 '}
    {attribute 'TcLinkTo' :=        '.i_iPRESS_R    :=      TIIB[MKS_E10 (EL3064)]^AI Standard Channel 4^Value'}
    GEM2_GPI_50 : FB_MKS317;

    {attribute 'pytmc' :=' pv: EM2L0:GEM:GPI:51 '}
    {attribute 'TcLinkTo' :=        '.i_iPRESS_R    :=      TIIB[L0S6_PNL_03_EB_6 (EP3174-0002)]^AI Standard Channel 2^Value'}
    GEM2_GPI_51 : FB_MKS275;

    {attribute 'pytmc' :=' pv: EM2L0:GEM:GCC:60 '}
    {attribute 'TcLinkTo' :=        '.i_iPRESS_R    :=      TIIB[MKS_E10 (EL3064)]^AI Standard Channel 3^Value;
                                 .q_xHV_DIS         :=      TIIB[MKS_E12 (EL2794)]^Channel 2^Output'}
    GEM2_GCC_60 : FB_MKS422;
    {attribute 'pytmc' :=' pv: EM2L0:GEM:GPI:60 '}
    {attribute 'TcLinkTo' :=        '.i_iPRESS_R    :=      TIIB[MKS_E11 (EL3064)]^AI Standard Channel 1^Value'}
    GEM2_GPI_60 : FB_MKS317A;

    {attribute 'pytmc' :=' pv: EM2L0:GEM:GPI:61 '}
    {attribute 'TcLinkTo' :=        '.i_iPRESS_R    :=      TIIB[L0S6_PNL_03_EB_6 (EP3174-0002)]^AI Standard Channel 1^Value'}
    GEM2_GPI_61 : FB_MKS275;

    {attribute 'pytmc' :=' pv: EM2L0:GEM:GCC:70 '}
    {attribute 'TcLinkTo' :=        '.i_iPRESS_R    :=      TIIB[MKS_E13 (EL3064)]^AI Standard Channel 1^Value;
                                 .q_xHV_DIS         :=      TIIB[MKS_E15 (EL2794)]^Channel 1^Output'}
    GEM2_GCC_70 : FB_MKS422;

    {attribute 'pytmc' :=' pv: EM2L0:GEM:GPI:70 '}
    {attribute 'TcLinkTo' :=        '.i_iPRESS_R    :=      TIIB[MKS_E13 (EL3064)]^AI Standard Channel 4^Value'}
    GEM2_GPI_70 : FB_MKS317A;

(* GAS Cell CM*)

    {attribute 'pytmc' :=' pv: EM2L0:GEM:GCM:41 '}
    {attribute 'TcLinkTo' :=        '.i_iPRESS_R    :=      TIIB[L0S6_PNL_02_EB_4 (EP3174-0002)]^AI Standard Channel 1^Value'}
    GEM2_GCM_41 : FB_GCM;
    {attribute 'pytmc' :=' pv: EM2L0:GEM:GCM:42 '}
    {attribute 'TcLinkTo' :=        '.i_iPRESS_R    :=      TIIB[L0S6_PNL_02_EB_4 (EP3174-0002)]^AI Standard Channel 2^Value'}
    GEM2_GCM_42 : FB_GCM;
    (*Pseudo gauge device Structure to combine the readings of two GCM gauges*)
    {attribute 'pytmc' :=' pv: EM2L0:GEM:GCM:40 '}
    GEM2_GCM_40 : ST_VG;

(*valves*)

    {attribute 'pytmc' :=' pv: EM2L0:GEM:VGC:10 '}
    {attribute 'TcLinkTo' :=        '.i_xOpnLS      :=      TIIB[L0S6_PNL_01_EB_1 (EP2338-0002)]^Channel 1^Input;
                                 .i_xClsLS  :=      TIIB[L0S6_PNL_01_EB_1 (EP2338-0002)]^Channel 2^Input;
                                 .q_xOPN_DO :=      TIIB[L0S6_PNL_01_EB_1 (EP2338-0002)]^Channel 11^Output'}
    GEM2_VGC_10: FB_VGC;

    {attribute 'pytmc' :=' pv: EM2L0:GEM:VGC:20'}
    {attribute 'TcLinkTo' :=        '.i_xOpnLS      :=      TIIB[L0S6_PNL_01_EB_1 (EP2338-0002)]^Channel 5^Input;
                                 .i_xClsLS  :=      TIIB[L0S6_PNL_01_EB_1 (EP2338-0002)]^Channel 6^Input;
                                 .q_xOPN_DO :=      TIIB[L0S6_PNL_01_EB_1 (EP2338-0002)]^Channel 15^Output'}
    GEM2_VGC_20: FB_VGC;

    {attribute 'pytmc' :=' pv: EM2L0:GEM:VGC:30 '}
    {attribute 'TcLinkTo' :=        '.i_xOpnLS      :=      TIIB[L0S6_PNL_02_EB_1 (EP2338-0002)]^Channel 1^Input;
                                 .i_xClsLS  :=      TIIB[L0S6_PNL_02_EB_1 (EP2338-0002)]^Channel 2^Input;
                                 .q_xOPN_DO :=      TIIB[L0S6_PNL_02_EB_1 (EP2338-0002)]^Channel 11^Output'}
    GEM2_VGC_30: FB_VGC;

    {attribute 'pytmc' :=' pv: EM2L0:GEM:VGC:40 '}
    {attribute 'TcLinkTo' :=        '.i_xOpnLS      :=      TIIB[L0S6_PNL_02_EB_1 (EP2338-0002)]^Channel 5^Input;
                                 .i_xClsLS  :=      TIIB[L0S6_PNL_02_EB_1 (EP2338-0002)]^Channel 6^Input;
                                 .q_xOPN_DO :=      TIIB[L0S6_PNL_02_EB_1 (EP2338-0002)]^Channel 15^Output'}
    GEM2_VGC_40: FB_VGC;

    {attribute 'pytmc' :=' pv: EM2L0:GEM:VGC:50 '}
    {attribute 'TcLinkTo' :=        '.i_xOpnLS      :=      TIIB[L0S6_PNL_03_EB_1 (EP2338-0002)]^Channel 1^Input;
                                 .i_xClsLS  :=      TIIB[L0S6_PNL_03_EB_1 (EP2338-0002)]^Channel 2^Input;
                                 .q_xOPN_DO :=      TIIB[L0S6_PNL_03_EB_1 (EP2338-0002)]^Channel 11^Output'}
    GEM2_VGC_50: FB_VGC;

    {attribute 'pytmc' :=' pv: EM2L0:GEM:VGC:60 '}
    {attribute 'TcLinkTo' :=        '.i_xOpnLS      :=      TIIB[L0S6_PNL_03_EB_3 (EP2338-0002)]^Channel 1^Input;
                                 .i_xClsLS  :=      TIIB[L0S6_PNL_03_EB_3 (EP2338-0002)]^Channel 2^Input;
                                 .q_xOPN_DO :=      TIIB[L0S6_PNL_03_EB_3 (EP2338-0002)]^Channel 11^Output'}
    GEM2_VGC_60: FB_VGC;

    {attribute 'pytmc' :=' pv: EM2L0:GEM:VGC:70 '}
    {attribute 'TcLinkTo' :=        '.i_xOpnLS      :=      TIIB[L0S6_PNL_03_EB_3 (EP2338-0002)]^Channel 5^Input;
                                 .i_xClsLS  :=      TIIB[L0S6_PNL_03_EB_3 (EP2338-0002)]^Channel 6^Input;
                                 .q_xOPN_DO :=      TIIB[L0S6_PNL_03_EB_3 (EP2338-0002)]^Channel 15^Output'}
    GEM2_VGC_70: FB_VGC;

(*Turbo isolation valves*)

    {attribute 'pytmc' :=' pv: EM2L0:GEM:VRC:30 '}
    {attribute 'TcLinkTo' :=        '.i_xOpnLS      :=      TIIB[L0S6_PNL_01_EB_3 (EP2338-0002)]^Channel 1^Input;
                                 .i_xClsLS  :=      TIIB[L0S6_PNL_01_EB_3 (EP2338-0002)]^Channel 2^Input;
                                 .q_xOPN_DO :=      TIIB[L0S6_PNL_01_EB_3 (EP2338-0002)]^Channel 11^Output'}
    GEM2_VRC_30: FB_VRC;
    {attribute 'pytmc' :=' pv: EM2L0:GEM:VRC:50 '}
    {attribute 'TcLinkTo' :=        '.i_xOpnLS      :=      TIIB[L0S6_PNL_03_EB_1 (EP2338-0002)]^Channel 5^Input;
                                 .i_xClsLS  :=      TIIB[L0S6_PNL_03_EB_1 (EP2338-0002)]^Channel 6^Input;
                                 .q_xOPN_DO :=      TIIB[L0S6_PNL_03_EB_1 (EP2338-0002)]^Channel 15^Output'}
    GEM2_VRC_50: FB_VRC;

    {attribute 'pytmc' :=' pv: EM2L0:GEM:VRC:60 '}
    {attribute 'TcLinkTo' :=        '.i_xOpnLS      :=      TIIB[L0S6_PNL_03_EB_2 (EP2338-0002)]^Channel 1^Input;
                                 .i_xClsLS  :=      TIIB[L0S6_PNL_03_EB_2 (EP2338-0002)]^Channel 2^Input;
                                 .q_xOPN_DO :=      TIIB[L0S6_PNL_03_EB_2 (EP2338-0002)]^Channel 11^Output'}
    GEM2_VRC_60: FB_VRC;

    {attribute 'pytmc' :=' pv: EM2L0:GEM:VRC:70 '}
    {attribute 'TcLinkTo' :=        '.i_xOpnLS      :=      TIIB[L0S6_PNL_03_EB_2 (EP2338-0002)]^Channel 5^Input;
                                 .i_xClsLS  :=      TIIB[L0S6_PNL_03_EB_2 (EP2338-0002)]^Channel 6^Input;
                                 .q_xOPN_DO :=      TIIB[L0S6_PNL_03_EB_2 (EP2338-0002)]^Channel 15^Output'}
    GEM2_VRC_70: FB_VRC;

(*Kashiyama*)
    {attribute 'pytmc' :=' pv: EM2L0:GEM:VRC:10 '}
    {attribute 'TcLinkTo' :=        '.i_xOpnLS      :=      TIIB[L0S6_PNL_01_EB_2 (EP2338-0002)]^Channel 1^Input;
                                 .i_xClsLS  :=      TIIB[L0S6_PNL_01_EB_2 (EP2338-0002)]^Channel 2^Input;
                                 .q_xOPN_DO :=      TIIB[L0S6_PNL_01_EB_2 (EP2338-0002)]^Channel 11^Output'}
    GEM2_VRC_10:FB_Kashiyama_VRC;

    {attribute 'pytmc' :=' pv: EM2L0:GEM:VRC:20 '}
    {attribute 'TcLinkTo' :=        '.i_xOpnLS      :=      TIIB[L0S6_PNL_01_EB_2 (EP2338-0002)]^Channel 5^Input;
                                 .i_xClsLS  :=      TIIB[L0S6_PNL_01_EB_2 (EP2338-0002)]^Channel 6^Input;
                                 .q_xOPN_DO :=      TIIB[L0S6_PNL_01_EB_2 (EP2338-0002)]^Channel 15^Output'}
    GEM2_VRC_20:FB_Kashiyama_VRC;

(*Turbo vent valves*) (*deprecated*)
    {attribute 'pytmc' :=' pv: EM2L0:GEM:VVC:30 '}
    {attribute 'TcLinkTo' :=        '.q_xCLS_DO     :=      TIIB[L0S6_PNL_01_EB_3 (EP2338-0002)]^Channel 15^Output'}
    GEM2_VVC_30: FB_TurbVentvalve_NO;
    {attribute 'pytmc' :=' pv: EM2L0:GEM:VVC:50 '}
    {attribute 'TcLinkTo' :=        '.q_xCLS_DO     :=      TIIB[L0S6_PNL_03_EB_4 (EP2338-0002)]^Channel 15^Output'}
    GEM2_VVC_50: FB_TurbVentvalve_NO;
    {attribute 'pytmc' :=' pv: EM2L0:GEM:VVC:70 '}
    {attribute 'TcLinkTo' :=        '.q_xCLS_DO     :=      TIIB[L0S6_PNL_03_EB_4 (EP2338-0002)]^Channel 16^Output'}
    GEM2_VVC_70: FB_TurbVentvalve_NO;

(*Gas cell vent valve*)
    {attribute 'pytmc' :=' pv: EM2L0:GEM:VVC:40 '}
    {attribute 'TcLinkTo' :=        '.q_xOPN_DO     :=      TIIB[L0S6_PNL_02_EB_2 (EP2338-0002)]^Channel 15^Output'}
    GEM2_VVC_40: FB_VVC;
(*Pressure Control Valve*)
    {attribute 'pytmc' :=' pv: EM2L0:GEM:VCN:40 '}
    {attribute 'TcLinkTo' :=        '.q_iRawPosition        :=      TIIB[L0S6_PNL_02_EB_3 (EP4374-0002)]^AO Outputs Channel 4^Analog output'}
    GEM2_VCN_40 : FB_VCN;


(*Pumps*)
(*Turbos*)
(*REMOVE
    {attribute 'pytmc' :=' pv: EM2L0:GEM:PTM:30 '}
    {attribute 'TcLinkTo' :=        '.i_xR1 :=      TIIB[PLC_EL_7 (EL1088)]^Channel 1^Input;
                                 .i_xLSpd :=        TIIB[PLC_EL_7 (EL1088)]^Channel 2^Input;
                                 .i_xSTART  :=      TIIB[PLC_EL_7 (EL1088)]^Channel 3^Input;
                                 .i_xFault  :=      TIIB[PLC_EL_7 (EL1088)]^Channel 4^Input;
                                 .i_iCurrentMon := TIIB[PLC_EL_5 (EL3064)]^AI Standard Channel 1^Value;
                                 .q_RunDO   :=      TIIB[PLC_EL_6 (EL2088)]^Channel 1^Output'}
    GEM2_PTM_30 : FB_PTM_Agilent;
    *)
    {attribute 'pytmc' :=' pv: EM2L0:GEM:PTM:30 '}
    {attribute 'TcLinkTo' :=        '.i_xDecel      :=      TIIB[PTM_E11_EL1004]^Channel 1^Input;
                                 .i_xAtSpd  :=      TIIB[PTM_E11_EL1004]^Channel 2^Input;
                                 .i_xNCFault :=     TIIB[PTM_E11_EL1004]^Channel 3^Input;
                                 .i_xRotate :=      TIIB[PTM_E11_EL1004]^Channel 4^Input;
                                 .i_xAccel :=       TIIB[PTM_E12_EL1004]^Channel 1^Input;
                                 .i_iRawSpeed := TIIB[PTM_E14_EL3064]^AI Standard Channel 1^Value;
                                 .i_iCurrentMon := TIIB[PTM_E14_EL3064]^AI Standard Channel 2^Value;
                                 .i_iTempMon := TIIB[PTM_E14_EL3064]^AI Standard Channel 3^Value;
                                 .q_xReset  :=      TIIB[PTM_E13_EL2798]^Channel 1^Output;
                                 .q_xStart  :=      TIIB[PTM_E13_EL2798]^Channel 2^Output;
                                 .q_xStop   :=      TIIB[PTM_E13_EL2798]^Channel 3^Output;
                                 .q_xProtection     :=      TIIB[PTM_E13_EL2798]^Channel 4^Output;
                                 .q_xSetSpeed       :=      TIIB[PTM_E13_EL2798]^Channel 5^Output;
                                 .q_iSpeedSet       :=      TIIB[PTM_E15_EL4004]^AO Outputs Channel 1^Analog output'}
    GEM2_PTM_30 : FB_PTM_Ebara_010M;
    (*REMOVE{attribute 'pytmc' :=' pv: EM2L0:GEM:PTM:50 '}
    {attribute 'TcLinkTo' :=        '.i_xR1 :=      TIIB[PLC_EL_7 (EL1088)]^Channel 5^Input;
                                 .i_xLSpd :=        TIIB[PLC_EL_7 (EL1088)]^Channel 6^Input;
                                 .i_xSTART  :=      TIIB[PLC_EL_7 (EL1088)]^Channel 7^Input;
                                 .i_xFault  :=      TIIB[PLC_EL_7 (EL1088)]^Channel 8^Input;
                                 .i_iCurrentMon := TIIB[PLC_EL_5 (EL3064)]^AI Standard Channel 2^Value;
                                 .q_RunDO   :=      TIIB[PLC_EL_6 (EL2088)]^Channel 2^Output'}
    GEM2_PTM_50 : FB_PTM_Agilent;*)

    {attribute 'pytmc' :=' pv: EM2L0:GEM:PTM:50 '}
    {attribute 'TcLinkTo' :=        '.i_xDecel      :=      TIIB[PTM_E18_EL1004]^Channel 1^Input;
                                 .i_xAtSpd  :=      TIIB[PTM_E18_EL1004]^Channel 2^Input;
                                 .i_xNCFault :=     TIIB[PTM_E18_EL1004]^Channel 3^Input;
                                 .i_xRotate :=      TIIB[PTM_E18_EL1004]^Channel 4^Input;
                                 .i_xAccel :=       TIIB[PTM_E19_EL1004]^Channel 1^Input;
                                 .i_iRawSpeed := TIIB[PTM_E16_EL3064]^AI Standard Channel 1^Value;
                                 .i_iCurrentMon := TIIB[PTM_E16_EL3064]^AI Standard Channel 2^Value;
                                 .i_iTempMon := TIIB[PTM_E16_EL3064]^AI Standard Channel 3^Value;
                                 .q_xReset  :=      TIIB[PTM_E17_EL2798]^Channel 1^Output;
                                 .q_xStart  :=      TIIB[PTM_E17_EL2798]^Channel 2^Output;
                                 .q_xStop   :=      TIIB[PTM_E17_EL2798]^Channel 3^Output;
                                 .q_xProtection     :=      TIIB[PTM_E17_EL2798]^Channel 4^Output;
                                 .q_xSetSpeed       :=      TIIB[PTM_E17_EL2798]^Channel 5^Output;
                                 .q_iSpeedSet       :=      TIIB[PTM_E15_EL4004]^AO Outputs Channel 3^Analog output'}
    GEM2_PTM_50 : FB_PTM_Ebara_010M;
    (*REMOVE{attribute 'pytmc' :=' pv: EM2L0:GEM:PTM:60 '}
    {attribute 'TcLinkTo' :=        '.i_xR1 :=      TIIB[PLC_EL_8 (EL1088)]^Channel 1^Input;
                                 .i_xLSpd :=        TIIB[PLC_EL_8 (EL1088)]^Channel 2^Input;
                                 .i_xSTART  :=      TIIB[PLC_EL_8 (EL1088)]^Channel 3^Input;
                                 .i_xFault  :=      TIIB[PLC_EL_8 (EL1088)]^Channel 4^Input;
                                 .i_iPowerMon := TIIB[PLC_EL_5 (EL3064)]^AI Standard Channel 3^Value;
                                 .q_RunDO   :=      TIIB[PLC_EL_6 (EL2088)]^Channel 3^Output'}
    GEM2_PTM_60 : FB_PTM_Agilent;
    *)
    {attribute 'pytmc' :=' pv: EM2L0:GEM:PTM:60 '}
    {attribute 'TcLinkTo' :=        '.i_xAtSpd      :=      TIIB[PTM_E21_EL1088]^Channel 5^Input;
                                 .i_xFault :=       TIIB[PTM_E21_EL1088]^Channel 6^Input;
                                 .q_RunDO   :=      TIIB[PTM_E20_EL2624]^Channel 3^Output'}
    GEM2_PTM_60 : FB_PTM_TwisTorr;
    {attribute 'pytmc' :=' pv: EM2L0:GEM:PTM:70 '}
    {attribute 'TcLinkTo' :=        '.i_xAtSpd      :=      TIIB[PTM_E21_EL1088]^Channel 7^Input;
                                 .i_xFault :=       TIIB[PTM_E21_EL1088]^Channel 8^Input;
                                 .q_RunDO   :=      TIIB[PTM_E20_EL2624]^Channel 4^Output'}
    GEM2_PTM_70 : FB_PTM_TwisTorr;//FB_PTM_Agilent;




(*Scroll Pumps*)
    {attribute 'pytmc' :=' pv: EM2L0:GEM:PRO:30 '}
    {attribute 'TcLinkTo' :=        '.q_xRunDo      :=      TIIB[L0S6_PNL_01_EB_7 (EP2338-0002)]^Channel 11^Output'}
    GEM2_PRO_30 : FB_ScrollPump;
    {attribute 'pytmc' :=' pv: EM2L0:GEM:PRO:50 '}
    {attribute 'TcLinkTo' :=        '.q_xRunDo      :=      TIIB[L0S6_PNL_01_EB_7 (EP2338-0002)]^Channel 12^Output'}
    GEM2_PRO_50 : FB_ScrollPump;
    {attribute 'pytmc' :=' pv: EM2L0:GEM:PRO:60 '}
    {attribute 'TcLinkTo' :=        '.q_xRunDo      :=      TIIB[L0S6_PNL_01_EB_7 (EP2338-0002)]^Channel 15^Output'}
    GEM2_PRO_60 : FB_ScrollPump;
(*Kashyiama Dry Pumps*)

    {attribute 'pytmc' :=' pv: EM2L0:GEM:PRO:10 '}
    {attribute 'TcLinkTo' :=        '.i_xIsRun      :=      TIIB[L0S6_PNL_01_EB_7 (EP2338-0002)]^Channel 1^Input;
                                 .i_xLocal  :=      TIIB[L0S6_PNL_01_EB_7 (EP2338-0002)]^Channel 2^Input;
                                 .i_xWarning :=     TIIB[L0S6_PNL_01_EB_7 (EP2338-0002)]^Channel 5^Input;
                                 .i_xAlarm :=       TIIB[L0S6_PNL_01_EB_7 (EP2338-0002)]^Channel 6^Input;
                                 .q_xRunDO  :=      TIIB[L0S6_PNL_01_EB_6 (EP2624-0002)]^Channel 1^Output;
                                 .q_xLspdDo :=      TIIB[L0S6_PNL_01_EB_6 (EP2624-0002)]^Channel 2^Output;
                                 .q_xResetDo:=      TIIB[L0S6_PNL_01_EB_6 (EP2624-0002)]^Channel 3^Output'}
    GEM2_PRO_10: FB_KashiyamaPump;
    {attribute 'pytmc' :=' pv: EM2L0:GEM:PRO:20 '}
    {attribute 'TcLinkTo' :=        '.i_xIsRun      :=      TIIB[L0S6_PNL_01_EB_9 (EP2338-0002)]^Channel 1^Input;
                                 .i_xLocal  :=      TIIB[L0S6_PNL_01_EB_9 (EP2338-0002)]^Channel 2^Input;
                                 .i_xWarning :=     TIIB[L0S6_PNL_01_EB_9 (EP2338-0002)]^Channel 5^Input;
                                 .i_xAlarm :=       TIIB[L0S6_PNL_01_EB_9 (EP2338-0002)]^Channel 6^Input;
                                 .q_xRunDO  :=      TIIB[L0S6_PNL_01_EB_8 (EP2624-0002)]^Channel 1^Output;
                                 .q_xLspdDo :=      TIIB[L0S6_PNL_01_EB_8 (EP2624-0002)]^Channel 2^Output;
                                 .q_xResetDo:=      TIIB[L0S6_PNL_01_EB_8 (EP2624-0002)]^Channel 3^Output'}
    GEM2_PRO_20: FB_KashiyamaPump;



(*************)
(*AT1L0-SOLID*)
(*************)

(*Pneumatic actuators*)
    {attribute 'pytmc' :=' pv: AT1L0:SOLID:MPA:01 '}
    {attribute 'TcLinkTo' :=        '.i_xRetractedLS:=      TIIB[L0S6_PNL_04_EB_4 (EP2338-0002)]^Channel 1^Input;
                                 .i_xInsertedLS     :=      TIIB[L0S6_PNL_04_EB_4 (EP2338-0002)]^Channel 2^Input;
                                 .q_xInsert_DO      :=      TIIB[L0S6_PNL_04_EB_4 (EP2338-0002)]^Channel 11^Output'}
    SATT_MPA_01: FB_MPA;
    {attribute 'pytmc' :=' pv: AT1L0:SOLID:MPA:02 '}
    {attribute 'TcLinkTo' :=        '.i_xRetractedLS:=      TIIB[L0S6_PNL_04_EB_4 (EP2338-0002)]^Channel 5^Input;
                                 .i_xInsertedLS     :=      TIIB[L0S6_PNL_04_EB_4 (EP2338-0002)]^Channel 6^Input;
                                 .q_xInsert_DO      :=      TIIB[L0S6_PNL_04_EB_4 (EP2338-0002)]^Channel 15^Output'}
    SATT_MPA_02: FB_MPA;
    {attribute 'pytmc' :=' pv: AT1L0:SOLID:MPA:03 '}
    {attribute 'TcLinkTo' :=        '.i_xRetractedLS:=      TIIB[L0S6_PNL_04_EB_5 (EP2338-0002)]^Channel 1^Input;
                                 .i_xInsertedLS     :=      TIIB[L0S6_PNL_04_EB_5 (EP2338-0002)]^Channel 2^Input;
                                 .q_xInsert_DO      :=      TIIB[L0S6_PNL_04_EB_5 (EP2338-0002)]^Channel 11^Output'}
    SATT_MPA_03: FB_MPA;
    {attribute 'pytmc' :=' pv: AT1L0:SOLID:MPA:04 '}
    {attribute 'TcLinkTo' :=        '.i_xRetractedLS:=      TIIB[L0S6_PNL_04_EB_5 (EP2338-0002)]^Channel 5^Input;
                                 .i_xInsertedLS     :=      TIIB[L0S6_PNL_04_EB_5 (EP2338-0002)]^Channel 6^Input;
                                 .q_xInsert_DO      :=      TIIB[L0S6_PNL_04_EB_5 (EP2338-0002)]^Channel 15^Output'}
    SATT_MPA_04: FB_MPA;
    {attribute 'pytmc' :=' pv: AT1L0:SOLID:MPA:05 '}
    {attribute 'TcLinkTo' :=        '.i_xRetractedLS:=      TIIB[L0S6_PNL_04_EB_6 (EP2338-0002)]^Channel 1^Input;
                                 .i_xInsertedLS     :=      TIIB[L0S6_PNL_04_EB_6 (EP2338-0002)]^Channel 2^Input;
                                 .q_xInsert_DO      :=      TIIB[L0S6_PNL_04_EB_6 (EP2338-0002)]^Channel 11^Output'}
    SATT_MPA_05: FB_MPA;
    {attribute 'pytmc' :=' pv: AT1L0:SOLID:MPA:06 '}
    {attribute 'TcLinkTo' :=        '.i_xRetractedLS:=      TIIB[L0S6_PNL_04_EB_6 (EP2338-0002)]^Channel 5^Input;
                                 .i_xInsertedLS     :=      TIIB[L0S6_PNL_04_EB_6 (EP2338-0002)]^Channel 6^Input;
                                 .q_xInsert_DO      :=      TIIB[L0S6_PNL_04_EB_6 (EP2338-0002)]^Channel 15^Output'}
    SATT_MPA_06: FB_MPA;
    {attribute 'pytmc' :=' pv: AT1L0:SOLID:MPA:07 '}
    {attribute 'TcLinkTo' :=        '.i_xRetractedLS:=      TIIB[L0S6_PNL_04_EB_7 (EP2338-0002)]^Channel 1^Input;
                                 .i_xInsertedLS     :=      TIIB[L0S6_PNL_04_EB_7 (EP2338-0002)]^Channel 2^Input;
                                 .q_xRetract_DO     :=      TIIB[L0S6_PNL_04_EB_7 (EP2338-0002)]^Channel 11^Output'}
    SATT_MPA_07: FB_MPA;
    {attribute 'pytmc' :=' pv: AT1L0:SOLID:MPA:08 '}
    {attribute 'TcLinkTo' :=        '.i_xRetractedLS:=      TIIB[L0S6_PNL_04_EB_7 (EP2338-0002)]^Channel 5^Input;
                                 .i_xInsertedLS     :=      TIIB[L0S6_PNL_04_EB_7 (EP2338-0002)]^Channel 6^Input;
                                 .q_xRetract_DO     :=      TIIB[L0S6_PNL_04_EB_7 (EP2338-0002)]^Channel 15^Output'}
    SATT_MPA_08: FB_MPA;
    {attribute 'pytmc' :=' pv: AT1L0:SOLID:MPA:09 '}
    {attribute 'TcLinkTo' :=        '.i_xRetractedLS:=      TIIB[L0S6_PNL_04_EB_8 (EP2338-0002)]^Channel 1^Input;
                                 .i_xInsertedLS     :=      TIIB[L0S6_PNL_04_EB_8 (EP2338-0002)]^Channel 2^Input;
                                 .q_xRetract_DO     :=      TIIB[L0S6_PNL_04_EB_8 (EP2338-0002)]^Channel 11^Output'}
    SATT_MPA_09: FB_MPA;


END_VAR
Related:

GVL_ILK

VAR_GLOBAL

    {attribute 'pytmc' := '
    pv: PLC:LFE:GEM:FFO:01
    '}
    {attribute 'TcLinkTo' := '.q_xFastFaultOut:=TIIB[PMPS_FFO]^Channel 1^Output'}
    g_FastFaultOutput1  :   FB_HardwareFFOutput :=(i_sNetID:='172.21.88.66.1.1');

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

    {attribute 'pytmc' := 'pv: EM1L0:GEM:ARB:01'}
    g_fbArbiter   :   FB_Arbiter(1);
    {attribute 'pytmc' := 'pv: EM1L0:GEM:ARB:02'}
    g_fbArbiter2   :   FB_Arbiter(2);
    {attribute 'pytmc' := 'pv: EM1L0:GEM:ARB:03'}
    g_fbArbiter3   :   FB_Arbiter(3);



    {attribute 'pytmc' := 'pv: EM1L0:GEM:VAC:OVRDON;
    field: ZNAM Override OFF;
    field: ONAM Override ON;
     io: io;
    '}
    xGEM1OverrideMode       :       BOOL; (* Global system override for the EM1L0*)
    {attribute 'pytmc' := 'pv: AT1L0:GAS:VAC:OVRDON;
    field: ZNAM Override OFF;
    field: ONAM Override ON;
     io: io;
    '}
    xGATTOverrideMode       :       BOOL; (* Global system override for the GATT*)
    {attribute 'pytmc' := 'pv: EM2L0:GEM:VAC:OVRDON;
    field: ZNAM Override OFF;
    field: ONAM Override ON;
     io: io;
    '}
    xGEM2OverrideMode       :       BOOL; (* Global system override for the EM2L0*)


(* Interlock related bits, local to the PLC*)
    GEM1_Turbo_Valves_Closed:  BOOL;
    GEM1_Turbo_Valves_Open:  BOOL;
    GEM2_Turbo_Valves_Closed: BOOL;
    GEM2_Turbo_Valves_Open:  BOOL;
    GEM1_Turbo_Running:  BOOL;
    GEM2_Turbo_Running:  BOOL;
    TwinscrewPumps_Valves_Closed: BOOL;
    GEM1_TwinscrewPumps_Valves_Open : BOOL;
    GEM2_TwinscrewPumps_Valves_Open : BOOL;
    GEM1_Aperture_Closed: BOOL;
    GEM2_Aperture_Closed: BOOL;

    xGEM1_AperturesOpnOK : BOOL;
    xGEM2_AperturesOpnOK : BOOL;



END_VAR

GVL_Sensors

VAR_GLOBAL

(*Pressure Meter*)
    {attribute 'pytmc' :=' pv: EM1L0:GEM:AIR:1 '}
    GEM1_AIR_1 :FB_PressureSensor_PX219;
    {attribute 'pytmc' :=' pv: EM1L0:GEM:AIR:2 '}
    GEM1_AIR_2 :FB_PressureSensor_PX219;
    {attribute 'pytmc' :=' pv: EM2L0:GEM:N2:1 '}
    GEM2_N2_1 :FB_PressureSensor_PX219;
    {attribute 'pytmc' :=' pv: EM2L0:GEM:N2:2 '}
    GEM2_N2_2 :FB_PressureSensor_PX219;
    (*Flow Meters*)
    {attribute 'pytmc' :=' pv: EM1L0:GEM:GFM:41 '}
    GEM1_GFM_41 :FB_PressureSensor_PX219;
    {attribute 'pytmc' :=' pv: EM1L0:GEM:GFM:42 '}
    GEM1_GFM_42 :FB_PressureSensor_PX219;
    {attribute 'pytmc' :=' pv: EM2L0:GEM:GFM:41 '}
    GEM2_GFM_41 :FB_PressureSensor_PX219;
    {attribute 'pytmc' :=' pv: EM2L0:GEM:GFM:42 '}
    GEM2_GFM_42 :FB_PressureSensor_PX219;

END_VAR
Related:

POUs

DIAGNOSTICS

PROGRAM DIAGNOSTICS
VAR
    //Change the PLC String Name to the actual PLC NAME
    sPLCName :STRING := 'PLC-LFE-GEM';
    //Link the sAMSNetID to the Etherat Master netID
    i_sAMSNetID AT %I*: AMSNETID;
    // DO NOT CHANGE
    sAMSNetID : STRING; //used for EPICS PV
    sLibVersion_LCLS_General : STRING;(* := stLibVersion_LCLS_General.sVersion*) ;
    fbEcatDiag:FB_EcatDiag;
    bAllSlaveStateGood : BOOL;
    bMasterStateGood :BOOL;
    iMasterState: WORD;
    sMasterState:STRING;
    nSlaveNumber : UINT;
    aiSlaveStates: ARRAY[1..256] OF BYTE;
    aEcSlaveInfo :  ARRAY[1..256] OF ST_EcDevice;
END_VAR
// Instaniating a call to the fbEcatDiag
fbEcatDiag(
    I_AMSNetId:=i_sAMSNetID ,
    i_xFirstPass:= _TaskInfo[1].FirstCycle,
    q_xAllSlaveStatesGood=> bAllSlaveStateGood ,
    q_anTermStates=> aiSlaveStates,
    q_xMasterStateGood=>bMasterStateGood ,
    q_nMasterState=> iMasterState,
    q_sMasterState=> sMasterState ,
    q_astEcConfSlaveInfo=> aEcSlaveInfo ,
    q_nSlaves=> nSlaveNumber);

END_PROGRAM

FB_MPA

FUNCTION_BLOCK FB_MPA
VAR_INPUT
    (*EPS Interlock Bits*)
    ibInsertOK: BOOL;
    ibRetractOK: BOOL;
    ibOverrideInterlock:BOOL; (*if true interlocks are ignored*)
    // Reset fault
    {attribute 'pytmc' := '
    pv: FF_Reset
    '}
    i_xReset: BOOL;
    i_sDevName : T_MaxString :=  'MPA'; // Device name for diagnostic
    i_nTransitionRootID: UDINT; //A unique transition Root ID that is equal to or greater than 1000
END_VAR
VAR_OUTPUT
    {attribute 'pytmc' := '
    pv:
    '}
    q_stAct         :       ST_MPA;
    {attribute 'pytmc' := '
    pv: MPS_FAULT
    '}
    xMPS_OK:BOOL;
    {attribute 'pytmc' := '
    pv: MOT_DONE
    '}
    xDone:Bool; // Motion is Done
END_VAR
VAR_IN_OUT
    io_fbFFHWO    :    FB_HardwareFFOutput;
    fbArbiter: FB_Arbiter();
END_VAR
VAR
    // PMPS
    tBPTMtimeout:TON;
    bMoving : BOOL;
    bDone :BOOL;
    ibPMPS_OK:BOOL;
    bptm: BeamParameterTransitionManager;
    // PMPS
    fbFF    :    FB_FastFault :=(
        i_DevName := 'MPA',
        i_Desc := 'Fault occurs when the device is moving',
        i_TypeCode := 16#1010);
    (*Init*)
    xFirstPass      :       BOOL;
    fbFSInit                :       R_TRIG;

    (* Timeouts*)
    tTimeOutDuration: TIME:= T#5S;
    tInserttimeout: TON;
    tRetracttimeout:TON;

    (*IO*)
    i_xInsertedLS   AT%I*: BOOL;
    i_xRetractedLS  AT%I*: BOOL;
    q_xInsert_DO    AT%Q*: BOOL;
    q_xRetract_DO   AT%Q*: BOOL;


    // For logging
    fbLogger : FB_LogMessage := (eSubsystem:=E_SubSystem.MOTION);
    ePrevState : E_PositionState;
    tErrorPresent : R_TRIG;
    tAction : R_TRIG; // Primary action of this device (OPN_DO, etc.)
    tOverrideActivated : R_TRIG;
END_VAR
(*Initialize*)
fbFSInit( CLK := TRUE, Q => xFirstPass);
(*IO Mapping*)
ACT_IO();

IF xFirstPass THEN
    q_stAct.eState := E_PositionState.INVALID;
    q_stAct.bRetract_SW := FALSE;
    q_stAct.bInsert_SW := FALSE;
    fbFF.i_DevName := i_sDevName;
END_IF


(* Manage States*)
IF q_stAct.i_bInLS AND  q_stAct.i_bOutLS THEN
    q_stAct.eState:=E_PositionState.INVALID;
ELSIF NOT q_stAct.i_bInLS AND q_stAct.i_bOutLS THEN
    q_stAct.eState:=E_PositionState.RETRACTED;
ELSIF q_stAct.i_bInLS AND NOT q_stAct.i_bOutLS THEN
    q_stAct.eState:=E_PositionState.INSERTED;
ELSIF NOT q_stAct.i_bInLS AND NOT q_stAct.i_bOutLS THEN
    q_stAct.eState:=E_PositionState.MOVING;
ELSE
    q_stAct.eState:=E_PositionState.INVALID;
END_IF

(*Set the Done signal*)
xDone := (q_stAct.bRetract_SW AND q_stAct.eState=E_PositionState.RETRACTED) OR (q_stAct.eState=E_PositionState.INSERTED AND q_stAct.bInsert_SW);


(*MPS FAULT*)
(**)
xMPS_OK := i_xInsertedLS XOR i_xRetractedLS;//(q_stAct.eState=RETRACTED) OR (q_stAct.eState=INSERTED);


(*PMPS PERMISSION*)


(* Can't have bRetract_SW and  bInsert_SW both be true*)
(*If (q_stAct.bRetract_SW) and (q_stAct.bInsert_SW) THEN
    q_stAct.bRetract_SW := FALSE;
    q_stAct.bInsert_SW := FALSE;
END_IF*)

q_stAct.bRetractOK := ibRetractOK;
q_stAct.bInsertOK := ibInsertOK;

(*Actuate the device*)
q_stAct.q_bRetract := q_stAct.bRetractOK AND q_stAct.bRetract_SW;
q_stAct.q_bInsert := q_stAct.bInsertOK AND q_stAct.bInsert_SW;

IF q_stAct.q_bInsert THEN
    q_stAct.q_bRetract := FALSE;
    q_stAct.bRetract_SW:= FALSE;
ELSIF q_stAct.q_bRetract THEN
    q_stAct.q_bInsert := FALSE;
    q_stAct.bInsert_SW:= FALSE;
END_IF;


(*Timers*)
tInserttimeout(IN:= q_stAct.q_bInsert, PT := tTimeOutDuration );
tRetracttimeout(IN:= q_stAct.q_bRetract, PT := tTimeOutDuration);

///Check moving postion timout
IF NOT q_stAct.i_bInLS AND tInserttimeout.Q THEN
    q_stAct.bErrorPresent := TRUE;
ELSIF NOT q_stAct.i_bOutLS AND tRetracttimeout.Q THEN
    q_stAct.bErrorPresent := TRUE;
END_IF


(*FAST FAULT*)
fbFF(i_xOK := xMPS_OK,
    i_xReset := i_xReset,
    i_xAutoReset :=TRUE,
    io_fbFFHWO := io_fbFFHWO);


(*Soft IO Mapping*)
ACT_IO();
(*Logger*)
ACT_Logger();
//ACT_PMPS();

END_FUNCTION_BLOCK

ACTION ACT_IO:
(*Inputs*)
q_stAct.i_bInLS :=  i_xInsertedLS;
q_stAct.i_bOutLS := i_xRetractedLS;

(*outputs*)
q_xInsert_DO:=q_stAct.q_bInsert;
q_xRetract_DO:=q_stAct.q_bRetract;
END_ACTION

ACTION ACT_Logger:
//Position STATE Logger
IF ePrevState <> q_stAct.eState THEN
      CASE q_stAct.eState OF
        E_PositionState.INVALID:
            fbLogger(sMsg:='Device is in invalid position.', eSevr:=TcEventSeverity.Critical);
          E_PositionState.MOVING:
            fbLogger(sMsg:='Device moving', eSevr:=TcEventSeverity.Warning);
        E_PositionState.RETRACTED:
            fbLogger(sMsg:='Device retracted.', eSevr:=TcEventSeverity.Info);
        E_PositionState.INSERTED:
            fbLogger(sMsg:='Device inserted.', eSevr:=TcEventSeverity.Info);
      END_CASE
      ePrevState := q_stAct.eState;
  END_IF



// Log valve open
tAction(CLK:= q_stAct.q_bRetract XOR q_stAct.q_bInsert);
IF tAction.Q THEN fbLogger(sMsg:='Device commanded to actuate', eSevr:=TcEventSeverity.Info); END_IF
END_ACTION

ACTION ACT_PMPS:
//bMoving := ((q_stAct.bRetract_SW OR NOT q_stAct.bInsert_SW) AND q_stAct.i_bInLS) XOR  ((NOT q_stAct.bRetract_SW OR q_stAct.bInsert_SW) AND q_stAct.i_bOutLS);
//bDone :=  ((q_stAct.bRetract_SW OR NOT q_stAct.bInsert_SW) AND q_stAct.i_bOutLS) XOR ((NOT q_stAct.bRetract_SW OR q_stAct.bInsert_SW) AND q_stAct.i_bInLS);

bptm(fbArbiter:=fbArbiter,
     i_TransitionAssertionID:=i_nTransitionRootID+2,
     i_stTransitionAssertion:=PMPS_GVL.cst0RateBeam,
     i_nRequestedAssertionID:=i_nTransitionRootID+ BOOL_TO_UDINT(q_stAct.bRetract_SW AND NOT q_stAct.bInsert_SW ),
     i_stRequestedAssertion:=,
     i_xMoving:=NOT xDone,
     i_xDoneMoving:= xDone,
     stCurrentBeamParameters:=PMPS_GVL.stCurrentBeamParameters,
     q_xTransitionAuthorized=>);

     // Timeout
tBPTMtimeout(IN:= bptm.i_xMoving AND NOT bptm.q_xTransitionAuthorized , PT:=T#1S);
ibPMPS_OK := bptm.q_xTransitionAuthorized OR tBPTMtimeout.Q;
END_ACTION
Related:

FB_PressureSensor_PX219

FUNCTION_BLOCK FB_PressureSensor_PX219
VAR_OUTPUT
    {attribute 'pytmc' := 'pv:'}
    Sensor : ST_PressureSensor;
END_VAR

VAR_INPUT
    rDefaultSP : REAL; (* Must assign a default value at instantiation*)
END_VAR

VAR
    v : REAL;
    AlarmTOF : TOF;


    (*IOs to be linked*)
    i_iPRESS_R AT %I* :INT; // input Pressure // Link to analog Input
END_VAR
// for Omega PX219-xxx, signal 0-5VDC, corresponding to 16383 max

(* Real-value calculation *)

  IF Sensor.iPRESS_R > 16383 THEN; //Px219 max signal 5VDC, equal to beckhoff AO input 16383
       Sensor.rPRESS := -1;
     Sensor.xPStateAlarm:= TRUE;
     ELSE
         V:= 5.0*INT_TO_REAL(Sensor.iPRESS_R)/16383;
         Sensor.rPRESS := LREAL_TO_REAL(V/5.0*Sensor.rFull_Scale); //FULL scale in Psi for pressure tranducer
  END_IF

 (* Validate setpoint *)
    IF (Sensor.rPressSP < Sensor.rMinPressSP OR Sensor.rPressSP > Sensor.rMaxPressSP) THEN;
        Sensor.rPressSP := rDefaultSP;
    END_IF

 (* Set alarm bit when pressure lower and equal to setpoint, delay off for 60s*)

  AlarmTOF (IN := Sensor.rPRESS <= Sensor.rPressSP, PT := T#60S, Q => Sensor.xPstateAlarm);



 (*Soft IO Mapping*)
  ACT_IO();

END_FUNCTION_BLOCK

ACTION ACT_IO:
Sensor.iPRESS_R := i_iPRESS_R;
END_ACTION
Related:

FB_VGC_1

(* This function block implements basic functionality for Isolation Gate Valves*)
(* This function block interlock is as follows:
1. The valve can be opened when the difference between the pressures on both sides is
less than the maximum differential pressure.
2. This rule persists until the pressures on both sides are lower than the vacuum-setpoint.
3. Once at-vac, the valve will close if the pressure on either side rises above the setpoint.*)
(*This function block also implements PMPS and EPS interlocks, as well as Fast MPS trigger*)
{attribute 'no_check'}
{attribute 'reflection'}
FUNCTION_BLOCK FB_VGC_1 Extends FB_Valve
VAR_IN_OUT

END_VAR
VAR_INPUT
    (*Upstream Gauge, usually ion gauge*)
    i_stUSG :       ST_VG;
    (*Downstream Gauge, usually ion gauge*)
    i_stDSG :       ST_VG;
    {attribute 'pytmc' := '
    pv: Dis_DPIlk
    '}
    i_xDis_DPIlk : BOOL := FALSE;  (* Set to true when calling the function to disable the differential pressure interlock *)
    {attribute 'pytmc' := '
    pv: EPS_OK
    '}
    i_xEPS_OK:      BOOL    := TRUE; (*External EPS interlock, Set to TRUE when no EPS interlock is required, otherwise set to correct interlock signal*)
    {attribute 'pytmc' := '
    pv: MPS_OK
    '}
    //i_xPMPS_OK:   BOOL    ; (*External MPS interlock, Set to TRUE when no PMPS interlock is required*)
    i_xExt_OK: BOOL; (*Other External Interlock, Set to True when no external interlock is required. If this Valve is neigboring a Fast Shutter this should be linked to the fast shutter xVAC_FAULT_OK*)
    i_xOverrideMode : BOOL; (*To be linked to global override bit. This Overrides Vacuum logic only, EPS, MPS and PMPS are still enforces*)
    // Reset fault
    {attribute 'pytmc' := '
    pv: FF_Reset
    '}
    i_xReset: BOOL;
    i_xIsAperture:BOOL :=FALSE; // Set tp True if this is an Aperture Valve, the MPS Fault will trip only when moving.
    i_sDevName : T_MaxString :=  'VGC'; // Device name for diagnostic
    i_nTransitionRootID: UDINT; //A unique transition Root ID that is equalt to or greater than 1000
END_VAR
VAR_OUTPUT
    {attribute 'pytmc' := '
    pv:
    '}
    iq_stValve : ST_VGC; (* All valve data and states will be in this struct*)

    {attribute 'pytmc' := '
    pv: MPS_FAULT_OK
    field: ZNAM MPS FAULT ;
    field: ONAM MPS OK ;
    '}
    xMPS_OK:        BOOL; (*MPS Fast OK, is set when the Valve is Open*)
END_VAR
VAR_IN_OUT
    io_fbFFHWO    :    FB_HardwareFFOutput;
    fbArbiter: FB_Arbiter();
END_VAR
VAR
    // PMPS
    bMoving : BOOL;
    bDone :BOOL;
    i_xPMPS_OK:     BOOL;
    bptm: BeamParameterTransitionManager;
    FFO    :    FB_FastFault :=(
        i_DevName := 'VGC',
        i_Desc := 'Fault occurs when the valve is not in open state',
        i_TypeCode := 16#1010);
    //g_FastFaultOutput1    :       FB_HardwareFFOutput;

    {attribute 'instance-path'}
    {attribute 'noinit'}
    sPath: STRING;

    rDiffPressAllowed       :       REAL := 22.5; // Torr, Default value comes from Vat Valve Manual
    rDiffPress : REAL;
    set : BOOL;
    reset: BOOL;

    xFirstPass      :       BOOL;
    fbFSInit                :       R_TRIG;

    tonDelOK : TON;
    rtOK    :       R_TRIG;
    tonOvrd :       TON;
    rtOpen  :       R_TRIG;
    ftClose: F_TRIG;

    tDelOK  :       TIME := T#60S;
    tOvrd   :       TIME := T#10s;


    (* Timeouts*)
    tTimeOutDuration: TIME:= T#30S;
    tOPNtimeout: TON;
    tCLStimeout:TON;
    tBPTMtimeout:TON;


    (*IO*)
    i_xOpnLS        AT%I*: BOOL;
    i_xClsLS        AT%I*: BOOL;
    q_xOPN_DO       AT%Q*: BOOL;

    // For logging
    eVGCPrevState : E_VGC;


END_VAR
(* Vacuum gate valve
A. Wallace
16-10-29

A gate valve isolates vacuum volumes. Ideally it can be opened when a system is vented
to allow for faster pumping, and will close when high vacuum is lost.

The following behavior is good for valves in something like a gas attenuator.
This function block does the following:
1. The valve can be opened when the difference between the pressures on both sides is
less than the maximum differential pressure.
2. This rule persists until the pressures on both sides are lower than the vacuum-setpoint.
3. Once at-vac, the valve will close if the pressure on either side rises above the setpoint.

Alternatively, the differential pressure interlock can be disabled so the valve may only be opened
if the pressure on both sides is lower than the at-vacuum-setpoint. You want this behavior if
the valve is to be used in a UHV section.

Hysteresis is employed to ensure a smooth transition from vented/pumping down, to at-vac.

Finally, an override system is built in so you can bypass all the interlocking logic and
get back online.
*)
(* 10/1/2018 Margaret Ghaly included EPS, PMPS Checkes and MPS trigger signals*)


fbFSInit( CLK := TRUE, Q => xFirstPass);
(*IO Mapping*)
ACT_IO();

(* On first PLC pass, put valve into vented state, which implies a closed valve *)
IF xFirstPass THEN
    iq_stValve.eVGC_State := Vented;
    iq_stValve.pv_xOPN_SW := FALSE;
    FFO.i_DevName := i_sDevName;
END_IF


///Check valve position
IF iq_stValve.i_xClsLS AND  iq_stValve.i_xOpnLS THEN
    iq_stValve.eState:=INVALID;
ELSIF NOT iq_stValve.i_xClsLS AND iq_stValve.i_xOpnLS AND iq_stValve.q_xOPN_DO THEN
    iq_stValve.eState:=OPEN;
ELSIF NOT iq_stValve.i_xClsLS AND iq_stValve.i_xOpnLS AND NOT iq_stValve.q_xOPN_DO THEN
    iq_stValve.eState:=OPEN_F;
ELSIF iq_stValve.i_xClsLS AND NOT iq_stValve.i_xOpnLS AND NOT iq_stValve.q_xOPN_DO THEN
    iq_stValve.eState:=CLOSED;
ELSIF NOT iq_stValve.i_xClsLS AND NOT iq_stValve.i_xOpnLS THEN
    iq_stValve.eState:=MOVING;
ELSE
    iq_stValve.eState:=INVALID;
END_IF

// Update hysteresis
///////////////////////////////////////////////////
IF iq_stValve.rAT_VAC_SP_LAST <> iq_stValve.rAT_VAC_SP OR xFirstPass THEN
    iq_stValve.rAT_VAC_SP_LAST := iq_stValve.rAT_VAC_SP;
    iq_stValve.rAT_VAC_HYS := iq_stValve.rHYST_PERC * iq_stValve.rAT_VAC_SP;
END_IF

iq_stValve.rAT_VAC_HYS := LIMIT(0, iq_stValve.rAT_VAC_HYS, iq_stValve.rAT_VAC_SP);
IF iq_stValve.rAT_VAC_SP <> 0 THEN
    IF iq_stValve.rHYST_PERC <> (iq_stValve.rAT_VAC_HYS / iq_stValve.rAT_VAC_SP) THEN
        iq_stValve.rHYST_PERC := LIMIT(0, (iq_stValve.rAT_VAC_HYS / iq_stValve.rAT_VAC_SP) ,1);
    END_IF
END_IF
// Valve at vacuum check
///////////////////////////////////////////////////
    set := i_stUSG.rPRESS < iq_stValve.rAT_VAC_HYS AND i_stDSG.rPRESS < iq_stValve.rAT_VAC_HYS AND i_stUSG.xPRESS_OK AND i_stDSG.xPRESS_OK;
     iq_stValve.xAT_VAC S= set;
    reset := i_stUSG.rPRESS > iq_stValve.rAT_VAC_SP OR i_stDSG.rPRESS > iq_stValve.rAT_VAC_SP OR NOT i_stUSG.xPRESS_OK OR NOT i_stDSG.xPRESS_OK;
    iq_stValve.xAT_VAC R= reset;

// Differential pressure check
///////////////////////////////////////////////////
    (* Calc the differential pressure across the valve *)
    rDiffPress := ABS(i_stUSG.rPRESS - i_stDSG.rPRESS);

    (* As long as the differential pressure is less than 30mbar, the valve is allowed to open *)
    IF rDiffPress <= rDiffPressAllowed AND i_stUSG.xPRESS_OK AND i_stDSG.xPRESS_OK THEN
        iq_stValve.xDP_OK := TRUE;
    ELSE
        iq_stValve.xDP_OK   := FALSE;
        (* If the differential pressure is exceeded, even when the valve is open,
        the state is unexpected and triggers a fault, because it suggests that something
        is wrong with the valve, or gauges or mapping or there is a major leak on one side.*)
        iq_stValve.eVGC_State := ERR_DiffPress;
        iq_stValve.xERR_DifPres := TRUE;
    END_IF

// Valve state
///////////////////////////////////////////////////
CASE iq_stValve.eVGC_State OF
    Vented: (* The Vented state is used during pump down *)
        (* Assuming the pump down went well, we are now at vacuum on both sides,
        so we move to the vacuum state, otherwise remain in the vented state *)
        IF iq_stValve.xAT_VAC AND (NOT (iq_stValve.xERR_DifPres)) AND (NOT (iq_stValve.xERR_SP)) AND (NOT (iq_stValve.xERR_ExtFault))THEN
            iq_stValve.eVGC_State := AtVacuum;
        ELSE
            iq_stValve.eVGC_State := Vented;
        END_IF

    AtVacuum:
        IF iq_stValve.xAT_VAC THEN
        (* If both pressure setpoints are made,
        then enable the differential pressure interlock, regardless of the valve state
        assuming we're using some kind of ion gauge where a pressure setpoint cannot be higher than 1E-4 T *)
        iq_stValve.eVGC_State := AtVacuum;

        ELSE

            (* If the valve is open (or in an unknown state) and either gauge is not at it's vacuum setpoint,
            we have a loss of vacuum error *)
            IF (iq_stValve.i_xOpnLS OR (NOT iq_stValve.i_xOpnLS AND NOT iq_stValve.i_xClsLS)) THEN
                iq_stValve.eVGC_State := ERR_LostVac;
                iq_stValve.xERR_SP := TRUE; //TAW changed this to the ERR_SP bool because I think that's what it was intended to be?

            (* Alternatively, if the valve is already closed and we lose pressure on one side,
            it was probably intentional venting, so we calmly move back to venting mode, and
            disable the differential pressure interlock *) //??
            ELSIF iq_stValve.i_xClsLS THEN
                iq_stValve.eVGC_State := Vented;
            END_IF

        END_IF

    ERR_DiffPress:
        IF NOT (iq_stValve.xERR_DifPres) THEN
            IF iq_stValve.xAT_VAC AND (NOT (iq_stValve.xERR_DifPres)) AND (NOT (iq_stValve.xERR_SP)) AND (NOT (iq_stValve.xERR_ExtFault))THEN
                iq_stValve.eVGC_State := AtVacuum;
            ELSE
                iq_stValve.eVGC_State := Vented;
            END_IF
        END_IF


    ERR_LostVac:
        IF NOT (iq_stValve.xERR_SP) THEN
            IF iq_stValve.xAT_VAC AND (NOT (iq_stValve.xERR_DifPres)) AND (NOT (iq_stValve.xERR_SP)) AND (NOT (iq_stValve.xERR_ExtFault))THEN
                iq_stValve.eVGC_State := AtVacuum;
            ELSE
                iq_stValve.eVGC_State := Vented;
            END_IF
        END_IF

    ERR_ExtFault:
        IF NOT (iq_stValve.xERR_ExtFault) AND (i_xExt_OK) THEN
            IF iq_stValve.xAT_VAC AND (NOT (iq_stValve.xERR_DifPres)) AND (NOT (iq_stValve.xERR_SP)) AND (NOT (iq_stValve.xERR_ExtFault))THEN
                iq_stValve.eVGC_State := AtVacuum;
            ELSE
                iq_stValve.eVGC_State := Vented;
            END_IF
        END_IF
END_CASE

IF (NOT i_xExt_OK) AND (iq_stValve.eState=OPEN)  THEN
    iq_stValve.eVGC_State := ERR_ExtFault;
    iq_stValve.xERR_ExtFault := TRUE;
END_IF

// Interlock evaluation - with bypass for DP ILK bypass
///////////////////////////////////////////////
IF i_xDis_DPIlk THEN
    iq_stValve.xOPN_OK := iq_stValve.xEXT_OK; // AND iq_stValve.xDP_OK ;
ELSE
    iq_stValve.xOPN_OK := iq_stValve.xEXT_OK AND iq_stValve.xAT_VAC;
END_IF


(* Valve operation *)

(* Override logic *)
(* Goal: give ability to override, but do so in a way that people won't forget it.
Solution: Override only after ten seconds of override, protect against blips,
when the valve permission goes true for more than ten seconds consistently, remove override
*)

tonDelOK(IN:=iq_stValve.xOPN_OK, PT:=tDelOK);
rtOK(CLK:=tonDelOK.Q);
IF rtOK.Q AND iq_stValve.pv_xOvrdOpn THEN
    iq_stValve.pv_xOvrdOpn :=FALSE;
    if (iq_stValve.eState = OPEN) AND (i_xOverrideMode) THEN iq_stValve.pv_xOPN_SW := TRUE; END_IF //for seamless transition
    //Log
    fbLogger(sMsg:='Override expired', eSevr:=TcEventSeverity.Warning);
END_IF
// Release the Force Open bit when the system override is false
IF NOT (i_xOverrideMode) THEN  iq_stValve.pv_xOvrdOpn :=FALSE; END_IF
//Override timer
tonOvrd(IN:=iq_stValve.pv_xOvrdOpn, PT:=tOvrd);


(* Valve operation *)
(* Here's where we evaluate sw actions and operate the valve *)
(* Valve operation *)

ftClose(CLK:= iq_stValve.pv_xOPN_SW);
rtOpen(CLK:= iq_stValve.pv_xOPN_SW);
(*when interlock is lost the Valve closes regardless of the status of the PMPS and EPS*)
IF NOT (iq_stValve.xOPN_OK) THEN
    iq_stValve.pv_xOPN_SW:= FALSE; // Reset switch after inlk is lost
    iq_stValve.q_xOPN_DO := (iq_stValve.pv_xOPN_SW  AND iq_stValve.xOPN_OK) OR (tonOvrd.Q AND i_xOverrideMode);
ELSIF i_xPMPS_OK THEN
    iq_stValve.q_xOPN_DO := (iq_stValve.pv_xOPN_SW  AND iq_stValve.xOPN_OK) OR (tonOvrd.Q AND i_xOverrideMode);
//ELSIF NOT (i_xPMPS_OK) THEN
    // Only override mode
//  iq_stValve.q_xOPN_DO := (tonOvrd.Q AND i_xOverrideMode);
END_IF


(*MPS Fault setting*)
If (i_xIsAperture ) THEN
    (* When the valve  is open or in Closed position MPS is OK, Fault while moving*)
    xMPS_OK := i_xOpnLS XOR i_xClsLS;
ELSE
    (* When the valve  is open MPS is OK*)
    xMPS_OK := i_xOpnLS AND NOT i_xClsLS AND q_xOPN_DO;
END_IF


///Check valve moving postion timout
IF NOT iq_stValve.i_xClsLS AND tCLStimeout.Q THEN
    iq_stValve.bErrorPresent := TRUE;
    iq_stValve.sErrorMessage := 'Close Timeout';
ELSIF NOT iq_stValve.i_xOpnLS AND tOPNtimeout.Q THEN
    iq_stValve.bErrorPresent := TRUE;
    iq_stValve.sErrorMessage := 'Open Timeout';
END_IF
IF (iq_stValve.eState=INVALID) THEN
    iq_stValve.bErrorPresent := TRUE;
    iq_stValve.sErrorMessage := CONCAT(sPath,'Invalid Valve Position');
END_IF


(*Timers*)
tOPNtimeout(IN:= iq_stValve.q_xOPN_DO, PT := tTimeOutDuration );
tCLStimeout(IN:= NOT iq_stValve.q_xOPN_DO, PT := tTimeOutDuration);


// Alarm reset
//////////////////////////////////////
ACT_ResetAlarms();

(*IO Mapping*)
ACT_IO();

// Log States and triggers
ACT_Logger();

(*FAST FAULT*)
FFO(i_xOK := xMPS_OK,
    i_xReset := i_xReset,
    i_xAutoReset :=TRUE,
    io_fbFFHWO := io_fbFFHWO);

(*PMPS*)
ACT_PMPS();

END_FUNCTION_BLOCK

ACTION ACT_IO:
(*inputs*)
iq_stValve.i_xOpnLS :=      i_xOpnLS;
iq_stValve.i_xClsLS:=       i_xClsLS;
iq_stValve.xEXT_OK := i_xEXT_OK;
iq_stValve.xOverrideMode := i_xOverrideMode;
(*outputs*)
q_xOPN_DO:= iq_stValve.q_xOPN_DO;

(*ILK Devices*)
iq_stValve.sIlkUSDeviceName := This^.i_stUSG.sPath;
iq_stValve.sIlkDSDeviceName := This^.i_stDSG.sPath;
END_ACTION

ACTION ACT_Logger:
// ILK logger

IF NOT (iq_stValve.xOPN_OK) AND (ePrevState = OPEN) AND NOT (TonOvrd.Q) THEN
         fbLogger(sMsg:='Lost interlock ok bit while valve was open.', eSevr:=TcEventSeverity.Critical);
END_IF


//Positiong STATE Logger
IF ePrevState <> iq_stValve.eState THEN
      CASE iq_stValve.eState OF
        INVALID:
            fbLogger(sMsg:='Valve invalid position.', eSevr:=TcEventSeverity.Critical);
          MOVING:
            fbLogger(sMsg:='Valve moving', eSevr:=TcEventSeverity.Warning);
        OPEN:
            fbLogger(sMsg:='Valve Open.', eSevr:=TcEventSeverity.Info);
        OPEN_F:
            fbLogger(sMsg:='Valve Open.', eSevr:=TcEventSeverity.Info);
        CLOSED:
            fbLogger(sMsg:='Valve closed.', eSevr:=TcEventSeverity.Info);
      END_CASE
      ePrevState := iq_stValve.eState;
  END_IF

 //Pressure STATE Logger
IF eVGCPrevState <> iq_stValve.eVGC_State THEN
      CASE iq_stValve.eVGC_State OF
        Vented:
             fbLogger(sMsg:='Vented', eSevr:=TcEventSeverity.Info);
          AtVacuum:
             fbLogger(sMsg:='Vacuum setpoint satisfied', eSevr:=TcEventSeverity.Info);
        ERR_DiffPress:
             fbLogger(sMsg:='Potential accidental vent.', eSevr:=TcEventSeverity.Critical);
        ERR_LostVac:
            fbLogger(sMsg:='Unexpected loss of vacuum while valve was open or moving.', eSevr:=TcEventSeverity.Critical);
        ERR_ExtFault:
             fbLogger(sMsg:='Lost external interlock while valve was open.', eSevr:=TcEventSeverity.Critical);
      END_CASE
      eVGCPrevState := iq_stValve.eVGC_State;
  END_IF



// Log valve timeouts
tErrorPresent(CLK:=iq_stValve.bErrorPresent);
IF tErrorPresent.Q THEN fbLogger(sMsg:=iq_stValve.sErrorMessage, eSevr:=TcEventSeverity.Warning); END_IF

// Log valve open
tAction(CLK:= iq_stValve.q_xOPN_DO);
IF tAction.Q THEN fbLogger(sMsg:='Valve commanded open', eSevr:=TcEventSeverity.Info); END_IF

// Log override mode enabled
tOverrideActivated(CLK:= (tonOvrd.Q AND i_xOverrideMode));
IF tOverrideActivated.Q THEN fbLogger(sMsg:='Valve override mode activated', eSevr:=TcEventSeverity.Warning); END_IF
END_ACTION

ACTION ACT_PMPS:
bMoving := (iq_stValve.pv_xOPN_SW AND iq_stValve.i_xClsLS) XOR (NOT iq_stValve.pv_xOPN_SW AND i_xOpnLS);
bDone := (iq_stValve.pv_xOPN_SW AND iq_stValve.i_xOpnLS) XOR (NOT iq_stValve.pv_xOPN_SW AND i_xClsLS);
If (i_xIsAperture ) OR (iq_stValve.pv_xOPN_SW )THEN
    bptm.i_stRequestedAssertion := PMPS_GVL.cstFullBeam;
ELSE  bptm.i_stRequestedAssertion := PMPS_GVL.cst0RateBeam;
END_IF
bptm(fbArbiter:=fbArbiter,
     i_TransitionAssertionID:=i_nTransitionRootID+2,
     i_stTransitionAssertion:=PMPS_GVL.cst0RateBeam,
     i_nRequestedAssertionID:=i_nTransitionRootID+ BOOL_TO_UDINT( iq_stValve.pv_xOPN_SW),
     i_stRequestedAssertion:=,
     i_xMoving:=bMoving,
     i_xDoneMoving:= bDone,
     stCurrentBeamParameters:=PMPS_GVL.stCurrentBeamParameters,
     q_xTransitionAuthorized=>);
// Timeout
tBPTMtimeout(IN:= bMoving AND NOT bptm.q_xTransitionAuthorized , PT:=T#1S);
i_xPMPS_OK := bptm.q_xTransitionAuthorized OR tBPTMtimeout.Q;
END_ACTION

ACTION ACT_ResetAlarms:
iq_stValve.xERR_DifPres R= iq_stValve.pv_xAlmRst;
iq_stValve.xERR_SP R= iq_stValve.pv_xAlmRst;
iq_stValve.bErrorPresent R= iq_stValve.pv_xAlmRst;
iq_stValve.xERR_ExtFault R= iq_stValve.pv_xAlmRst;

IF ( iq_stValve.pv_xAlmRst) THEN
    iq_stValve.sErrorMessage :='';
     iq_stValve.pv_xAlmRst := FALSE;
END_IF
END_ACTION

METHOD PUBLIC M_IsClosed : BOOL
VAR_INPUT
END_VAR
M_IsClosed := (This^.iq_stValve.eState = E_ValvePositionState.CLOSED);
END_METHOD

METHOD PUBLIC M_IsOpen : BOOL
VAR_INPUT
END_VAR
M_IsOpen := (This^.iq_stValve.eState = E_ValvePositionState.OPEN);
END_METHOD

// Use this Methode to Open or close the valve by setting the OPN_SW to the input value.
METHOD PUBLIC M_Set_OPN_SW : BOOL
VAR_INPUT
        value:BOOL;
END_VAR
This^.iq_stValve.pv_xOPN_SW := value;
END_METHOD

MAIN

PROGRAM MAIN
VAR
    iWatchdog:UDINT;//The watchdog variable name written to by the remote plc

    fbLogHandler: FB_LogHandler;
END_VAR
(*Ethercat Diagnostics*)
//DIAGNOSTICS();



(* Call all Programs*)
PRG_ILK();
PRG_GEM1_DIFF_PUMP();
PRG_GEM2_DIFF_PUMP();
PRG_ROOTS();
PRG_GATT();
PRG_GEM1();
PRG_GEM2();
PRG_SATT();
PRG_PMPS();
//Log Handler
fbLogHandler();

END_PROGRAM
Related:

PRG_GATT

PROGRAM PRG_GATT
VAR CONSTANT
        nDataTable_NumberOfRows : INT:=9;
END_VAR
VAR
    (*needle valve control position*)
    VCN_Req_Pos: REAL;

    fb_PID: FB_BasicPID;

    {attribute 'pytmc' :=' pv: AT1L0:GAS:CNTRL:SP '}
    fSetpointValue : REAL:=0.001;
    {attribute 'pytmc' :=' pv: AT1L0:GAS:CNTRL:Kp '}
    fKp : REAL:= 1.1;
    {attribute 'pytmc' :=' pv: AT1L0:GAS:CNTRL:Tn '}
    fTn : REAL:= 0.5;




    eMode                                                   : E_CTRL_MODE;
    stCTRL_PID_PARAMS               : ST_CTRL_PID_PARAMS;

    eErrorId                                                : E_CTRL_ERRORCODES;
    bError                                                  : BOOL;
    bARWactive                                      : BOOL;

    (* controller *)
    fbCTRL_PID                                      : FB_CTRL_PID;
    bInit                                                   : BOOL  := TRUE;

    stCTRL_LIN_INTERPOLATION_PARAMS         : ST_CTRL_LIN_INTERPOLATION_PARAMS;
    arrTable                                                                                        : ARRAY[1..nDataTable_NumberOfRows,1..2] OF FLOAT;

END_VAR
(*Gauges*)
GATT_GPI_10();
GATT_GMP_10(i_rFULL_SCALE := 2.0 (*Torr*));
GATT_GMP_11();

(*Valves*)
(*Gas Cell vent valve*)
GATT_VRC_10(i_xExtILK_OK:= GEM2_VGC_70.iq_stValve.i_xClsLS AND DSV_VGC.VGC.i_xClsLS AND GEM1_Turbo_Valves_Closed AND GEM2_Turbo_Valves_Closed AND TwinscrewPumps_Valves_Closed, i_xOverrideMode := xGATTOverrideMode);

(* N2 Cutt off valve*)
GATT_VVC_10(i_xExtILK_OK := GEM1_Aperture_Closed AND GEM1_Turbo_Valves_Open AND GEM1_Turbo_Running AND GEM2_Aperture_Closed AND GEM2_Turbo_Valves_Open AND GEM2_Turbo_Running AND GEM1_TwinscrewPumps_Valves_Open AND GEM2_TwinscrewPumps_Valves_Open);

END_PROGRAM

PRG_GEM1

PROGRAM PRG_GEM1
VAR
    {attribute 'pytmc' :=' pv: EM1L0:GEM:CNTRL:RESET;
     field: ZNAM FALSE;
     field: ONAM TRUE;
     io: io;
    '}
    bReset : BOOL;
    {attribute 'pytmc' :=' pv: EM1L0:GEM:CNTRL:ERROR;
     field: ZNAM FALSE;
     field: ONAM TRUE;
     io: io;
    '}
    bError : BOOL;
    {attribute 'pytmc' :=' pv: EM1L0:GEM:CNTRL:Kp1 '}
    fKp1 : REAL:= 0.4;
    {attribute 'pytmc' :=' pv: EM1L0:GEM:CNTRL:Tn1 '}
    fTn1 : REAL:= 0.5;
    {attribute 'pytmc' :=' pv: EM1L0:GEM:CNTRL:Kp2 '}
    fKp2 : REAL:= 0.01;
    {attribute 'pytmc' :=' pv: EM1L0:GEM:CNTRL:Tn2 '}
    fTn2 : REAL:= 0.5;
    arrTable_GEM1   : ARRAY[1..30,1..2] OF FLOAT;
    fManValue                                                                                       : FLOAT;
    bExtrapolate                                                                            : BOOL;
    eMode                                                   : E_CTRL_MODE;
    stCTRL_PID_PARAMS               : ST_CTRL_PID_PARAMS;
    bSync                                                   : BOOL;
    bHold                                                   : BOOL;
    eErrorId                                                : E_CTRL_ERRORCODES;
    bARWactive                                      : BOOL;
    (* controller *)
    fbCTRL_PID                                      : FB_CTRL_PID;
    bInit                                                   : BOOL  := TRUE;
    fbCTRL_LIN_INTERPOLATION                                        : FB_CTRL_LIN_INTERPOLATION;
    //stCTRL_LIN_INTERPOLATION_PARAMS               : ST_CTRL_LIN_INTERPOLATION_PARAMS;
    stCTRL_LIN_INTERPOLATION_PARAMS_GEM     : ST_CTRL_LIN_INTERPOLATION_PARAMS;
    fbCTRL_DEADBAND                                         : FB_CTRL_DEADBAND;
    stCTRL_DEADBAND_PARAMS                  : ST_CTRL_DEADBAND_PARAMS;
        //timer to switch the pid from manual to active 5seconds??? 10 seconds???
    pid_on :TON;
    wait : time := T#10S;
FTrig: F_TRIG;


END_VAR
(*Devices*)
(* GEM 1*)
(*Gauges*)
GEM1_GCM_41(i_rFULL_SCALE := 10.0 (*Torr*));
GEM1_GCM_42(i_rFULL_SCALE := 0.05 (*Torr*));
(*Assign reading to psuedo gauge*)
IF (GEM1_GCM_42.PG.rPRESS >=0.049) THEN GEM1_GCM_40 := GEM1_GCM_41.PG;
    ELSE
    GEM1_GCM_40 := GEM1_GCM_42.PG;
END_IF
(* Gauge selection *)
fbCTRL_PID.fActualValue := GEM1_GCM_40.rPRESS;
(*
IF (fGEM1SetpointValue >=0.049) THEN
    fbCTRL_PID.fActualValue := GEM1_GCM_41.PG.rPRESS;
ELSE
    fbCTRL_PID.fActualValue := GEM1_GCM_42.PG.rPRESS;
END_IF*)


(* N2 Cut Off Valves *)
GEM1_VVC_40(i_xExtILK_OK:= GEM1_Aperture_Closed AND GEM1_Turbo_Valves_Open AND GEM1_Turbo_Running);

(*Flow Control Valves*)
GEM1_VCN_40 (i_xExtIlkOK := (GEM1_Aperture_Closed AND GEM1_Turbo_Valves_Open AND GEM1_Turbo_Running),// AND  GEM1_VVC_40.M_IsOpen()),
             i_ReqPos:= fbCTRL_LIN_INTERPOLATION.fOut + fbCTRL_PID.fOut);
//GEM1_VPC_42 (i_xExtIlkOK := TRUE, i_rReqPos:= );



(*Iniitialization*)
IF bInit
THEN


    (* init array with the interpolation points  *)
    (*      fIn                                      |              fOut            *)
    arrTable_GEM1[1,1] := 0;                arrTable_GEM1[1,2] := 23.8;
    arrTable_GEM1[2,1] := 0.00178;          arrTable_GEM1[2,2] := 23.9;
    arrTable_GEM1[3,1] := 0.0025;           arrTable_GEM1[3,2] := 24;
    arrTable_GEM1[4,1] :=  0.005884;            arrTable_GEM1[4,2] := 25;
    arrTable_GEM1[5,1] :=  0.085;       arrTable_GEM1[5,2] := 35;
    arrTable_GEM1[6,1] := 0.1263;           arrTable_GEM1[6,2] := 40;
    arrTable_GEM1[7,1] := 0.1626;           arrTable_GEM1[7,2] := 42;
    arrTable_GEM1[8,1] := 0.19;         arrTable_GEM1[8,2] := 44;
    arrTable_GEM1[9,1] := 0.234;        arrTable_GEM1[9,2] := 46;
    arrTable_GEM1[10,1] := 0.32;            arrTable_GEM1[10,2] := 50;
    arrTable_GEM1[11,1] := 0.370;           arrTable_GEM1[11,2] := 52;
    arrTable_GEM1[12,1] := 0.43427;         arrTable_GEM1[12,2] := 54;
    arrTable_GEM1[13,1] := 0.5316;          arrTable_GEM1[13,2] := 55;
    arrTable_GEM1[14,1] := 0.61;            arrTable_GEM1[14,2] := 55.5;
    arrTable_GEM1[15,1] := 0.894;           arrTable_GEM1[15,2] := 56;
    arrTable_GEM1[16,1] := 1.215;           arrTable_GEM1[16,2] := 56.5;
    arrTable_GEM1[17,1] := 1.58;            arrTable_GEM1[17,2] := 57;
    arrTable_GEM1[18,1] := 2.025;       arrTable_GEM1[18,2] := 58;
    arrTable_GEM1[19,1] := 2.2;         arrTable_GEM1[19,2] :=58.1;
    arrTable_GEM1[20,1] := 2.9;             arrTable_GEM1[20,2] := 65;
    arrTable_GEM1[21,1] := 3;               arrTable_GEM1[21,2] := 69;
    arrTable_GEM1[22,1] :=  3.0448;     arrTable_GEM1[22,2] := 70;
    arrTable_GEM1[23,1] :=  3.31919;            arrTable_GEM1[23,2] := 72;
    arrTable_GEM1[24,1] :=3.324;            arrTable_GEM1[24,2] := 73.04;
    arrTable_GEM1[25,1] :=3.71941;          arrTable_GEM1[25,2] := 73.64;
    arrTable_GEM1[26,1] := 3.81941;         arrTable_GEM1[26,2] := 74.45;
    arrTable_GEM1[27,1] :=  3.963194;               arrTable_GEM1[27,2] :=74.46;
    arrTable_GEM1[28,1] := 3.99999; arrTable_GEM1[28,2] := 75;
    arrTable_GEM1[29,1] :=  4;              arrTable_GEM1[29,2] :=75.5;
    arrTable_GEM1[30,1] := 4.1;     arrTable_GEM1[30,2] := 75.505;

    (* init parameter struct *)
    stCTRL_LIN_INTERPOLATION_PARAMS_GEM.tCtrlCycleTime                                      := T#10ms;
    stCTRL_LIN_INTERPOLATION_PARAMS_GEM.tTaskCycleTime                                      := T#10ms;
    stCTRL_LIN_INTERPOLATION_PARAMS_GEM.nDataTable_NumberOfRows             := INT_TO_UINT(30);


    (* init parameter struct *)
    stCTRL_PID_PARAMS.tCtrlCycleTime                := T#10ms;
    stCTRL_PID_PARAMS.tTaskCycleTime                := T#10ms;
    stCTRL_PID_PARAMS.fKp                                   := fKp1;                        (* proportional gain Kp                         *)
    stCTRL_PID_PARAMS.tTn                                   := T#1s;                (*  Tn                                                                  *)
    stCTRL_PID_PARAMS.tTv                                   := T#200ms;     (*  Tv                                                                  *)
    stCTRL_PID_PARAMS.tTd                                   := T#200ms;     (*  Td                                                                  *)
    stCTRL_PID_PARAMS.fOutMaxLimit                  :=  5;                  (* maximum output limit                         *)
    stCTRL_PID_PARAMS.fOutMinLimit                  :=  -100;                       (* minimum output limit                         *)

    (* set the mode to ACTIVE --> normal operation *)
    eMode                                                   := eCTRL_MODE_PASSIVE    ;
    (* reset the init flag *)
    bInit                                                   := FALSE;
END_IF
(* set the addresses *)
stCTRL_LIN_INTERPOLATION_PARAMS_GEM.pDataTable_ADR                  := ADR(arrTable_GEM1);
stCTRL_LIN_INTERPOLATION_PARAMS_GEM.nDataTable_SIZEOF               := SIZEOF(arrTable_GEM1);


fGEM1SetpointValue:= LIMIT(0,fGEM1SetpointValue,2);
if (NOT (GEM1_VVC_40.i_xExtILK_OK) OR (GEM1_VVC_40.M_IsClosed())) THEN
        eMode                       :=eCTRL_MODE_PASSIVE;// eCTRL_MODE_RESET ;//eCTRL_MODE_PASSIVE;
        GEM1_VCN_40.M_ValveControl(CloseValve);
        fGEM1SetpointValue :=0;
 END_IF //Switch off the PID incase of interlock
if (GEM1_GO) THEN
    IF (bReset) THEN
        (* set the mode to RESET*)
        eMode                                                       := eCTRL_MODE_RESET   ;
        stCTRL_PID_PARAMS.fKp                                       := fKp1;                        (* proportional gain Kp                         *)
        GEM1_VCN_40.M_ValveControl(CloseValve);
        //bReset := False;
    ELSE(* set the mode to ACTIVE --> normal operation *)
        fbCTRL_PID.bSync := FALSE;
        eMode                                                       := eCTRL_MODE_ACTIVE   ;
        GEM1_VCN_40.M_ValveControl(PressureControl);
    END_IF
END_IF

If(FTrig.Q)THEN
        eMode                                                       :=eCTRL_MODE_PASSIVE;// eCTRL_MODE_RESET ;//eCTRL_MODE_PASSIVE;
        fbCTRL_PID.fManSyncValue :=0;
        fbCTRL_PID.bSync := TRUE;
        GEM1_VCN_40.M_ValveControl(CloseValve);
        fGEM1SetpointValue :=0;
END_IF


fbCTRL_LIN_INTERPOLATION(
    fIn:= fGEM1SetpointValue ,
    fManValue:= fManValue,
    bExtrapolate:= bExtrapolate,
    eMode:= eMode,
    fOut=> ,
    bInIsGreaterThanMaxElement=> ,
    bInIsLessThanMinElement=> ,
    eState=> ,
    eErrorId=> ,
    bError=> ,
    stParams:= stCTRL_LIN_INTERPOLATION_PARAMS_GEM );



(* call controller *)
fbCTRL_PID(         fSetpointValue          := fGEM1SetpointValue,
                    fActualValue            := ,
                    fManSyncValue   := ,
                    bSync                           := bSync,
                    eMode                           := eMode,
                    bHold                           := bHold,
                    stParams                        := stCTRL_PID_PARAMS,
                    fOut                            =>  ,
                    bARWactive              => bARWactive,
                    eErrorId                        => eErrorId,
                    bError                          =>
                );



(*deadband/clipper *)

(* call function block *)
stCTRL_DEADBAND_PARAMS.fThreshold   :=  fGEM1SetpointValue*0.0016 ;
(*fbCTRL_DEADBAND   (       fIn                                     := ,
                    stParams                        := stCTRL_DEADBAND_PARAMS,
                    bInIsUnderThreshold => ,
                    eErrorId                        => ,
                    bError                          =>
                );*)

bError := fbCTRL_PID.bError OR fbCTRL_LIN_INTERPOLATION.bError;


// or NOT???

//stCTRL_PID_PARAMS.bDInTheFeedbackPath := fbCTRL_DEADBAND.bInIsUnderThreshold;


//timer
//pid_on(IN:=, PT:= wait, Q=>, ET =>);
//IF (pid_on.Q) THEN eMode:= eCTRL_MODE_ACTIVE; pid_on.IN := FALSE; END_IF; //eCTRL_MODE_TUNE????

FTRIG(CLK := GEM1_GO);

END_PROGRAM

PRG_GEM1_DIFF_PUMP

PROGRAM PRG_GEM1_DIFF_PUMP
VAR
    rMaxBackingPressure : REAL := 0.7;//Torr
    bInit:BOOL:=TRUE;

END_VAR
If (bInit) THEN
    bInit := FALSE;
    //GEM1_PTM_10.M_SetPowerScale(15);
    //GEM1_PTM_20.M_SetPowerScale(15);
END_IF

(*Gauges*)
USG_PIN(sNetId:='172.21.88.138.1.1' , nPort:=851 , sVarName:='GVL_Devices.SL1L0_POWER_PIN_01',iWatchdog:=Main.iWatchdog,IG=> );
USG_GCC(sNetId:='172.21.88.138.1.1' , nPort:=851 , sVarName:='GVL_Devices.SL1L0_POWER_GCC_01',iWatchdog:=Main.iWatchdog,IG=> );

GEM1_GPI_10(PG=>);
GEM1_GCC_10(PG:=GEM1_GPI_10.PG,IG=>);
GEM1_GPI_20(PG=>);
GEM1_GCC_20(PG:=GEM1_GPI_20.PG,IG=>);
GEM1_GPI_30(PG=>);
GEM1_GCC_30(PG:=GEM1_GPI_30.PG,IG=>);
GEM1_GPI_50(PG=>);
GEM1_GCC_50(PG:=GEM1_GPI_50.PG,IG=>);
GEM1_GPI_11(PG=>);
GEM1_GPI_31(PG=>);
GEM1_GPI_51(PG=>);

(*VALVES*)
(*Aperture valve may open when Detector and Attenuator N2 valves are closed. Override provided *)
 (* to Include PMPS ILK with the EXTILK bit*)
(*apperture valves*)

GEM1_VGC_10(i_stUSG := USG_GCC.IG, i_stDSG:= GEM1_GCC_10.IG,i_xDis_DPIlk := FALSE, i_xEPS_OK := TRUE,
        i_xPMPS_OK := TRUE, i_xExt_OK := NOT (USG_GCC.bError), i_xOverrideMode := xGEM1OverrideMode,i_xReset := ,
        io_fbFFHWO :=g_FastFaultOutput1,i_sDevName:= 'EM1L0:GEM:VGC:10',fbArbiter:=g_fbArbiter,i_nTransitionRootID:=1100);
GEM1_VGC_20(i_stUSG := GEM1_GCC_10.IG, i_stDSG:= GEM1_GCC_20.IG,i_xDis_DPIlk := TRUE, i_xEPS_OK := TRUE,
        i_xPMPS_OK := TRUE, i_xExt_OK := xGEM1_AperturesOpnOK, i_xOverrideMode := xGEM1OverrideMode,i_xReset := , i_xIsAperture:= TRUE ,
        io_fbFFHWO :=g_FastFaultOutput1,i_sDevName:= 'EM1L0:GEM:VGC:20',fbArbiter:=g_fbArbiter,i_nTransitionRootID:=1200);
GEM1_VGC_30(i_stUSG := GEM1_GCC_20.IG, i_stDSG:= GEM1_GCC_30.IG,i_xDis_DPIlk := TRUE, i_xEPS_OK := TRUE,
        i_xPMPS_OK := TRUE, i_xExt_OK := xGEM1_AperturesOpnOK, i_xOverrideMode := xGEM1OverrideMode,i_xReset := , i_xIsAperture:= TRUE ,
        io_fbFFHWO :=g_FastFaultOutput1,i_sDevName:= 'EM1L0:GEM:VGC:30',fbArbiter:=g_fbArbiter,i_nTransitionRootID:=1300);
GEM1_VGC_40(i_stUSG := GEM1_GCC_30.IG, i_stDSG:= GEM1_GCC_30.IG,i_xDis_DPIlk := TRUE, i_xEPS_OK := TRUE,
        i_xPMPS_OK := TRUE, i_xExt_OK := xGEM1_AperturesOpnOK, i_xOverrideMode := xGEM1OverrideMode,i_xReset := , i_xIsAperture:= TRUE,
        io_fbFFHWO :=g_FastFaultOutput1,i_sDevName:= 'EM1L0:GEM:VGC:40',fbArbiter:=g_fbArbiter,i_nTransitionRootID:=1400);
GEM1_VGC_50(i_stUSG := GEM1_GCC_50.IG, i_stDSG:= GEM1_GCC_50.IG,i_xDis_DPIlk := TRUE, i_xEPS_OK := TRUE,
        i_xPMPS_OK := TRUE, i_xExt_OK := xGEM1_AperturesOpnOK, i_xOverrideMode := xGEM1OverrideMode,i_xReset := , i_xIsAperture:= TRUE ,
        io_fbFFHWO :=g_FastFaultOutput1,i_sDevName:= 'EM1L0:GEM:VGC:50',fbArbiter:=g_fbArbiter,i_nTransitionRootID:=1500);
GEM1_VGC_60(i_stUSG := GEM1_GCC_50.IG, i_stDSG:= GEM1_GCC_50.IG,i_xDis_DPIlk := TRUE, i_xEPS_OK := TRUE,
        i_xPMPS_OK := TRUE, i_xExt_OK := xGEM1_AperturesOpnOK, i_xOverrideMode := xGEM1OverrideMode,i_xReset := , i_xIsAperture:= TRUE ,
        io_fbFFHWO :=g_FastFaultOutput1,i_sDevName:= 'EM1L0:GEM:VGC:60',fbArbiter:=g_fbArbiter,i_nTransitionRootID:=1600);
GEM1_VGC_70(i_stUSG := GEM1_GCC_50.IG, i_stDSG:= GEM1_GCC_50.IG,i_xDis_DPIlk := TRUE, i_xEPS_OK := TRUE,
        i_xPMPS_OK := TRUE, i_xExt_OK := xGEM1_AperturesOpnOK, i_xOverrideMode := xGEM1OverrideMode,i_xReset := , i_xIsAperture:= TRUE ,
        io_fbFFHWO:=g_FastFaultOutput1,i_sDevName:= 'EM1L0:GEM:VGC:70',fbArbiter:=g_fbArbiter,i_nTransitionRootID:=1700);

(*Turbo Isolation Valves*)
 GEM1_VRC_10(i_xExtILK_OK := F_TurboGateValve_ILK(GEM1_PTM_10.iq_stPtm,GEM1_GPI_10.PG) AND GEM1_PTM_10.iq_stPtm.eState = pumpRUNNING ,i_xOverrideMode := xGEM1OverrideMode);
 GEM1_VRC_20(i_xExtILK_OK := F_TurboGateValve_ILK(GEM1_PTM_20.iq_stPtm,GEM1_GPI_20.PG) AND GEM1_PTM_20.iq_stPtm.eState = pumpRUNNING,i_xOverrideMode := xGEM1OverrideMode);
 GEM1_VRC_30(i_xExtILK_OK := F_TurboGateValve_ILK(GEM1_PTM_30.iq_stPtm,GEM1_GPI_30.PG) AND GEM1_PTM_30.iq_stPtm.eState = pumpRUNNING,i_xOverrideMode := xGEM1OverrideMode);
 GEM1_VRC_50(i_xExtILK_OK := F_TurboGateValve_ILK(GEM1_PTM_50.iq_stPtm,GEM1_GPI_50.PG) AND GEM1_PTM_50.iq_stPtm.eState = pumpRUNNING,i_xOverrideMode := xGEM1OverrideMode);


(*Turbo vent valves NO*) //Deprecated
//GEM1_VVC_20(i_stPTM :=GEM1_PTM_20.iq_stPtm);
//GEM1_VVC_30(i_stPTM :=GEM1_PTM_30.iq_stPtm);
//GEM1_VVC_50(i_stPTM :=GEM1_PTM_50.iq_stPtm);
(*This part was added to Close all the Turbo's NO vent valves, These valves are capped off, and wont be in use*)
//GEM1_VVC_20.M_Close(TRUE);
//GEM1_VVC_10.M_Close(TRUE);
//GEM1_VVC_50.M_Close(TRUE);


(*Turbo Isolation valves*)
(*GEM1_PTM_10.i_xExtILKOk := F_TurboExtILK_NO(GEM1_PTM_10.iq_stPtm, GEM1_GPI_11.PG,
                        GEM1_GPI_10.PG,GEM1_VVC_20.q_stValve,GEM1_PRO_20.iq_stPFO);
GEM1_PTM_10(i_stGauge:=GEM1_GPI_11.PG,i_rMaxBackingPressure :=rMaxBackingPressure);*)
GEM1_PTM_10( i_xExtILKOk := F_TurboExtILKLogic_2(GEM1_PTM_10.iq_stPtm, GEM1_GPI_11.PG,
                        GEM1_GPI_10.PG,GEM1_PRO_20.iq_stPFO));
(*GEM1_PTM_20.i_xExtILKOk := F_TurboExtILK_NO(GEM1_PTM_20.iq_stPtm,BackingGauge:= GEM1_GPI_11.PG,
                        InletGauge:=GEM1_GPI_20.PG,GEM1_VVC_20.q_stValve,GEM1_PRO_20.iq_stPFO);
GEM1_PTM_20(i_stGauge:=GEM1_GPI_11.PG,i_rMaxBackingPressure :=rMaxBackingPressure);*)
GEM1_PTM_20( i_xExtILKOk := F_TurboExtILKLogic_2(GEM1_PTM_20.iq_stPtm, GEM1_GPI_11.PG,
                        GEM1_GPI_20.PG,GEM1_PRO_20.iq_stPFO));
GEM1_PTM_30(i_xExtILKOK:=F_TurboExtILKLogic_2(GEM1_PTM_30.iq_stPtm, GEM1_GPI_31.PG,
                        GEM1_GPI_30.PG,GEM1_PRO_30.iq_stPFO));
GEM1_PTM_50(i_xExtILKOK:=F_TurboExtILKLogic_2(GEM1_PTM_50.iq_stPtm, GEM1_GPI_51.PG,
                        GEM1_GPI_50.PG,GEM1_PRO_50.iq_stPFO));

(*Roughing pumps*)
GEM1_PRO_20(xExtIlk:= TRUE, TurboIsOn:= (GEM1_PTM_10.iq_stPtm.q_RunDO OR GEM1_PTM_20.iq_stPtm.q_RunDO));
GEM1_PRO_30(xExtIlk:= TRUE, TurboIsOn:= GEM1_PTM_30.iq_stPtm.q_RunDO);
GEM1_PRO_50(xExtIlk:= TRUE, TurboIsOn:= GEM1_PTM_50.iq_stPtm.q_RunDO);

END_PROGRAM
Related:

PRG_GEM2

PROGRAM PRG_GEM2
VAR
    {attribute 'pytmc' :='
     pv: EM2L0:GEM:CNTRL:RESET;
     field: ZNAM FALSE;
     field: ONAM TRUE;
     io: io;
    '}
    bReset : BOOL;
    {attribute 'pytmc' :=' pv: EM2L0:GEM:CNTRL:ERROR;
     field: ZNAM FALSE;
     field: ONAM TRUE;
     io: io;
     '}
    bError : BOOL;
    {attribute 'pytmc' :=' pv: EM2L0:GEM:CNTRL:Kp1 '}
    fKp1 : REAL:= 0.25;
    {attribute 'pytmc' :=' pv: EM2L0:GEM:CNTRL:Tn1 '}
    fTn1 : REAL:= 1;//0.5;
    {attribute 'pytmc' :=' pv: EM2L0:GEM:CNTRL:Kp2 '}
    fKp2 : REAL:= 0.01;
    {attribute 'pytmc' :=' pv: EM2L0:GEM:CNTRL:Tn2 '}
    fTn2 : REAL:= 0.5;
    arrTable_GEM2   : ARRAY[1..31,1..2] OF FLOAT;
    fManValue                                                                                       : FLOAT;
    bExtrapolate                                                                            : BOOL;
    eMode                                                   : E_CTRL_MODE;
    stCTRL_PID_PARAMS               : ST_CTRL_PID_PARAMS;
    bSync                                                   : BOOL;
    bHold                                                   : BOOL;
    eErrorId                                                : E_CTRL_ERRORCODES;
    bARWactive                                      : BOOL;
    (* controller *)
    fbCTRL_PID                                      : FB_CTRL_PID;
    bInit                                                   : BOOL  := TRUE;
    fbCTRL_LIN_INTERPOLATION                                        : FB_CTRL_LIN_INTERPOLATION;
    //stCTRL_LIN_INTERPOLATION_PARAMS               : ST_CTRL_LIN_INTERPOLATION_PARAMS;
    stCTRL_LIN_INTERPOLATION_PARAMS_GEM     : ST_CTRL_LIN_INTERPOLATION_PARAMS;
    fbCTRL_DEADBAND                                         : FB_CTRL_DEADBAND;
    stCTRL_DEADBAND_PARAMS                  : ST_CTRL_DEADBAND_PARAMS;
        //timer to switch the pid from manual to active 5seconds??? 10 seconds???
    pid_on :TON;
    wait : time := T#10S;
    FTrig: F_TRIG;




END_VAR
(*Devices*)
(*Gauges*)
GEM2_GCM_41(i_rFULL_SCALE := 2.0 (*Torr*));
GEM2_GCM_42(i_rFULL_SCALE := 0.05 (*Torr*));
(*Assign reading to psuedo gauge*)
IF (GEM2_GCM_42.PG.rPRESS >0.04) THEN GEM2_GCM_40 := GEM2_GCM_41.PG;
    ELSE
    GEM2_GCM_40 := GEM2_GCM_42.PG;
END_IF
(* Gauge selection *)
    fbCTRL_PID.fActualValue := GEM2_GCM_40.rPRESS;
(*
IF (fGEM2SetpointValue >0.04) THEN
    fbCTRL_PID.fActualValue := GEM2_GCM_41.PG.rPRESS;
ELSE
    fbCTRL_PID.fActualValue := GEM2_GCM_42.PG.rPRESS;
END_IF*)
(* N2 Cut Off Valves *)
GEM2_VVC_40(i_xExtILK_OK:= GEM2_Aperture_Closed AND GEM2_Turbo_Valves_Open AND GEM2_Turbo_Running);
(*Flow Control Valves*)
GEM2_VCN_40 (i_xExtIlkOK := (GEM2_Aperture_Closed AND GEM2_Turbo_Valves_Open AND GEM2_Turbo_Running),// AND GEM2_VVC_40.M_IsOpen()),
            i_ReqPos:=  fbCTRL_LIN_INTERPOLATION.fOut + fbCTRL_PID.fOut);

(*Iniitialization*)
IF bInit
THEN
    (* init array with the interpolation points  *)
    (*      fIn                                      |              fOut            *)
    arrTable_GEM2[1,1] := 0;                arrTable_GEM2[1,2] := 38.7;
    arrTable_GEM2[2,1] := 0.0000412;                arrTable_GEM2[2,2] := 38.8;
    arrTable_GEM2[3,1] := 0.001282;         arrTable_GEM2[3,2] := 38.9;
    arrTable_GEM2[4,1] :=  0.002136;            arrTable_GEM2[4,2] := 39;
    arrTable_GEM2[5,1] :=  0.005884;            arrTable_GEM2[5,2] := 40;
    arrTable_GEM2[6,1] := 0.00907;          arrTable_GEM2[6,2] := 42;
    arrTable_GEM2[7,1] := 0.01183;          arrTable_GEM2[7,2] := 44;
    arrTable_GEM2[8,1] := 0.01799;      arrTable_GEM2[8,2] := 46;
    arrTable_GEM2[9,1] := 0.0302;       arrTable_GEM2[9,2] := 47;
    arrTable_GEM2[10,1] := 0.0417;          arrTable_GEM2[10,2] := 50;
    arrTable_GEM2[11,1] := 0.06635;         arrTable_GEM2[11,2] := 51;
    arrTable_GEM2[12,1] := 0.08118;         arrTable_GEM2[12,2] := 53;
    arrTable_GEM2[13,1] := 0.0998;          arrTable_GEM2[13,2] := 56;
    arrTable_GEM2[14,1] := 0.10644;         arrTable_GEM2[14,2] := 56.5;
    arrTable_GEM2[15,1] := 0.1359;          arrTable_GEM2[15,2] := 58;
    arrTable_GEM2[16,1] := 0.1929;          arrTable_GEM2[16,2] := 60;
    arrTable_GEM2[17,1] := 0.2922;          arrTable_GEM2[17,2] := 62;
    arrTable_GEM2[18,1] := 0.3428;      arrTable_GEM2[18,2] := 64;
    arrTable_GEM2[19,1] :=  0.405;;     arrTable_GEM2[19,2] :=66;
    arrTable_GEM2[20,1] := 0.481;           arrTable_GEM2[20,2] := 68;
    arrTable_GEM2[21,1] := 0.5542;          arrTable_GEM2[21,2] := 69;
    arrTable_GEM2[22,1] := 0.6333;      arrTable_GEM2[22,2] := 70;
    arrTable_GEM2[23,1] := 0.7901;      arrTable_GEM2[23,2] := 72;
    arrTable_GEM2[24,1] := 0.9307;          arrTable_GEM2[24,2] := 73.04;
    arrTable_GEM2[25,1] := 1.0448;          arrTable_GEM2[25,2] := 73.64;
    arrTable_GEM2[26,1] := 1.31919;;                arrTable_GEM2[26,2] := 74.45;
    arrTable_GEM2[27,1] :=  1.324;          arrTable_GEM2[27,2] :=74.46;
    arrTable_GEM2[28,1] := 1.71941; arrTable_GEM2[28,2] := 75;
    arrTable_GEM2[29,1] :=  1.963194;               arrTable_GEM2[29,2] :=75.5;
    arrTable_GEM2[30,1] := 1.99999; arrTable_GEM2[30,2] := 75.505;
    arrTable_GEM2[31,1] := 2;       arrTable_GEM2[31,2] := 75.55;
    (* init parameter struct *)
    stCTRL_LIN_INTERPOLATION_PARAMS_GEM.tCtrlCycleTime                                      := T#10ms;
    stCTRL_LIN_INTERPOLATION_PARAMS_GEM.tTaskCycleTime                                      := T#10ms;
    stCTRL_LIN_INTERPOLATION_PARAMS_GEM.nDataTable_NumberOfRows             := INT_TO_UINT(31);

    (*FBCNTRL*)
    (* init parameter struct *)
    stCTRL_PID_PARAMS.tCtrlCycleTime                := T#10ms;
    stCTRL_PID_PARAMS.tTaskCycleTime                := T#10ms;
    stCTRL_PID_PARAMS.fKp                                   := fKp1;                        (* proportional gain Kp                         *)
    stCTRL_PID_PARAMS.tTn                                   := T#500ms;             (*  Tn                                                                  *)
    stCTRL_PID_PARAMS.tTv                                   := T#200ms;     (*  Tv                                                                  *)
    stCTRL_PID_PARAMS.tTd                                   := T#200ms;     (*  Td                                                                  *)
    stCTRL_PID_PARAMS.fOutMaxLimit                  :=  7;                  (* maximum output limit                         *)
    stCTRL_PID_PARAMS.fOutMinLimit                  :=  -100;                       (* minimum output limit                         *)

    (* set the mode to ACTIVE --> normal operation *)
    eMode                                                   := eCTRL_MODE_PASSIVE   ;
    (* reset the init flag *)
    bInit                                                   := FALSE;
END_IF
(* set the addresses *)
    stCTRL_LIN_INTERPOLATION_PARAMS_GEM.pDataTable_ADR                      := ADR(arrTable_GEM2);
    stCTRL_LIN_INTERPOLATION_PARAMS_GEM.nDataTable_SIZEOF           := SIZEOF(arrTable_GEM2);

fGEM2SetpointValue:= LIMIT(0,fGEM2SetpointValue,2);
if (NOT (GEM2_VVC_40.i_xExtILK_OK) OR (GEM2_VVC_40.M_IsClosed())) THEN
         eMode      := eCTRL_MODE_PASSIVE;
        GEM2_VCN_40.M_ValveControl(CloseValve);
        fGEM2SetpointValue :=0;
END_IF //Switch off the PID incase of interlock
if (GEM2_GO) THEN
    IF (bReset) THEN
    (* set the mode to RESET*)
    eMode                                                   := eCTRL_MODE_RESET   ;
    stCTRL_PID_PARAMS.fKp                                   := fKp1;                        (* proportional gain Kp                         *)
    GEM2_VCN_40.M_ValveControl(CloseValve);
    //bReset := False;
    ELSE
        (* set the mode to ACTIVE --> normal operation *)
    eMode                                                   := eCTRL_MODE_ACTIVE   ;
     GEM2_VCN_40.M_ValveControl(PressureControl);
    END_IF
END_IF
If(FTrig.Q)THEN
        eMode                                                       := eCTRL_MODE_PASSIVE;
        GEM2_VCN_40.M_ValveControl(CloseValve);
        fGEM2SetpointValue :=0;
END_IF


fbCTRL_LIN_INTERPOLATION(
    fIn:= fGEM2SetpointValue ,
    fManValue:= fManValue ,
    bExtrapolate:= bExtrapolate,
    eMode:= eMode,
    stParams:= stCTRL_LIN_INTERPOLATION_PARAMS_GEM,
    fOut=> ,
    bInIsGreaterThanMaxElement=> ,
    bInIsLessThanMinElement=> ,
    eState=> ,
    eErrorId=> ,
    bError=> );



(* call controller *)
fbCTRL_PID(         fSetpointValue          := fGEM2SetpointValue,
                    fActualValue            := ,
                    fManSyncValue   := ,
                    bSync                           := bSync,
                    eMode                           := eMode,
                    bHold                           := bHold,
                    stParams                        := stCTRL_PID_PARAMS,
                    fOut                            => ,
                    bARWactive              => bARWactive,
                    eErrorId                        => eErrorId,
                    bError                          =>
                );


(*deadband/clipper *)

(* call function block *)
stCTRL_DEADBAND_PARAMS.fThreshold   :=  fGEM2SetpointValue*0.0016 ;
(*fbCTRL_DEADBAND   (       fIn                                     := ,
                    stParams                        := stCTRL_DEADBAND_PARAMS,
                    bInIsUnderThreshold => ,
                    eErrorId                        => ,
                    bError                          =>
                );*)

bError := fbCTRL_PID.bError OR fbCTRL_LIN_INTERPOLATION.bError;




// or NOT???

//stCTRL_PID_PARAMS.bDInTheFeedbackPath := fbCTRL_DEADBAND.bInIsUnderThreshold;


//timer
(*pid_on(IN:=, PT:= wait, Q=>, ET =>);
IF (pid_on.Q) THEN eMode:= eCTRL_MODE_ACTIVE; pid_on.IN := FALSE; END_IF; //eCTRL_MODE_TUNE????*)


FTRIG(CLK := GEM2_GO);

END_PROGRAM

PRG_GEM2_DIFF_PUMP

PROGRAM PRG_GEM2_DIFF_PUMP
VAR
    rMaxBackingPressure : REAL := 0.7;
    bInit: BOOL:=TRUE;
END_VAR
(*Gauges*)
DSG_PIN(sNetId:='172.21.88.138.1.1' , nPort:=851 , sVarName:='GVL_Devices.AT2L0_SOLID_PIN_01',iWatchdog:=Main.iWatchdog,IG=> ); // Downstream Gauge from Down Stream PLC System
(*EM2L0*)
GEM2_GPI_30(PG=>);
GEM2_GCC_30(PG:=GEM2_GPI_30.PG,IG=>);
GEM2_GPI_31(PG=>);
GEM2_GPI_50(PG=>);
GEM2_GCC_50(PG:=GEM2_GPI_50.PG,IG=>);
GEM2_GPI_51(PG=>);
GEM2_GPI_60(PG=>);
GEM2_GCC_60(PG:=GEM2_GPI_60.PG,IG=>);
GEM2_GPI_61(PG=>);
GEM2_GPI_70(PG=>);
GEM2_GCC_70(PG:=GEM2_GPI_70.PG,IG=>);

(*VALVES*)
(*Aperture valve may open when Detector and Attenuator N2 valves are closed. Override provided *)
 (* to Include PMPS ILK with the EXTILK bit*)
(*apperture valves*)
GEM2_VGC_10(i_stUSG := GEM2_GPI_10.PG, i_stDSG:= GEM2_GPI_10.PG,i_xDis_DPIlk := TRUE, i_xEPS_OK := TRUE,
        i_xPMPS_OK := TRUE, i_xExt_OK := xGEM2_AperturesOpnOK, i_xOverrideMode := xGEM2OverrideMode,i_xReset := , i_xIsAperture:= TRUE ,
        io_fbFFHWO :=g_FastFaultOutput1,i_sDevName:= 'EM2L0:GEM:VGC:10',fbArbiter:=g_fbArbiter2,i_nTransitionRootID:=2100);
GEM2_VGC_20(i_stUSG := GEM2_GPI_10.PG, i_stDSG:= GEM2_GCC_30.IG,i_xDis_DPIlk := TRUE, i_xEPS_OK := TRUE,
        i_xPMPS_OK := TRUE, i_xExt_OK := xGEM2_AperturesOpnOK, i_xOverrideMode := xGEM2OverrideMode,i_xReset := , i_xIsAperture:= TRUE ,
        io_fbFFHWO :=g_FastFaultOutput1,i_sDevName:= 'EM2L0:GEM:VGC:20',fbArbiter:=g_fbArbiter2,i_nTransitionRootID:=2200);;
GEM2_VGC_30(i_stUSG := GEM2_GCC_30.IG, i_stDSG:= GEM2_GCC_30.IG,i_xDis_DPIlk := TRUE, i_xEPS_OK := TRUE,
        i_xPMPS_OK := TRUE, i_xExt_OK := xGEM2_AperturesOpnOK, i_xOverrideMode := xGEM2OverrideMode,i_xReset := , i_xIsAperture:= TRUE ,
        io_fbFFHWO :=g_FastFaultOutput1,i_sDevName:= 'EM2L0:GEM:VGC:30',fbArbiter:=g_fbArbiter2,i_nTransitionRootID:=2300);
GEM2_VGC_40(i_stUSG := GEM2_GCC_50.IG, i_stDSG:= GEM2_GCC_50.IG,i_xDis_DPIlk := TRUE, i_xEPS_OK := TRUE,
        i_xPMPS_OK := TRUE, i_xExt_OK := xGEM2_AperturesOpnOK, i_xOverrideMode := xGEM2OverrideMode,i_xReset := , i_xIsAperture:= TRUE ,
        io_fbFFHWO :=g_FastFaultOutput1,i_sDevName:= 'EM2L0:GEM:VGC:40',fbArbiter:=g_fbArbiter2,i_nTransitionRootID:=2400);
GEM2_VGC_50(i_stUSG := GEM2_GCC_30.IG, i_stDSG:= GEM2_GCC_60.IG,i_xDis_DPIlk := TRUE, i_xEPS_OK := TRUE,
        i_xPMPS_OK := TRUE, i_xExt_OK := xGEM2_AperturesOpnOK, i_xOverrideMode := xGEM2OverrideMode,i_xReset := , i_xIsAperture:= TRUE ,
        io_fbFFHWO :=g_FastFaultOutput1,i_sDevName:= 'EM2L0:GEM:VGC:50',fbArbiter:=g_fbArbiter2,i_nTransitionRootID:=2500);
GEM2_VGC_60(i_stUSG := GEM2_GCC_60.IG, i_stDSG:= GEM2_GCC_70.IG,i_xDis_DPIlk := TRUE, i_xEPS_OK := TRUE,
        i_xPMPS_OK := TRUE, i_xExt_OK := xGEM2_AperturesOpnOK, i_xOverrideMode := xGEM2OverrideMode,i_xReset := , i_xIsAperture:= TRUE ,
        io_fbFFHWO :=g_FastFaultOutput1,i_sDevName:= 'EM2L0:GEM:VGC:60',fbArbiter:=g_fbArbiter2,i_nTransitionRootID:=2600);
(*downstream isolation valve*)
GEM2_VGC_70(i_stUSG := GEM2_GCC_70.IG, i_stDSG:= DSG_PIN.IG,i_xDis_DPIlk := FALSE, i_xEPS_OK := TRUE,
        i_xPMPS_OK := TRUE, i_xExt_OK := NOT (DSG_PIN.bError) , i_xOverrideMode := xGEM2OverrideMode,i_xReset := ,
        io_fbFFHWO :=g_FastFaultOutput1,i_sDevName:= 'EM2L0:GEM:VGC:70',fbArbiter:=g_fbArbiter2,i_nTransitionRootID:=2700);
DSV_VGC(VGC=>);

(*Turbo vent valves NO*)//Deprecated
//GEM2_VVC_30(i_stPTM :=GEM2_PTM_30.iq_stPtm);
//GEM2_VVC_50(i_stPTM :=GEM2_PTM_50.iq_stPtm);
//GEM2_VVC_70(i_stPTM :=GEM2_PTM_70.iq_stPtm);
(*This part was added to Close all the Turbo's NO vent valves, These valves are capped off, and wont be in use*)
//GEM2_VVC_30.M_Close(TRUE);
//GEM2_VVC_50.M_Close(TRUE);
//GEM2_VVC_70.M_Close(TRUE);


(*Turbo Isolation valves*)
 GEM2_VRC_30(i_xExtILK_OK := F_TurboGateValve_ILK(GEM2_PTM_30.iq_stPtm,GEM2_GPI_30.PG) AND GEM2_PTM_30.iq_stPtm.eState = pumpRUNNING,i_xOverrideMode := xGEM2OverrideMode);
 GEM2_VRC_50(i_xExtILK_OK := F_TurboGateValve_ILK(GEM2_PTM_50.iq_stPtm,GEM2_GPI_50.PG) AND GEM2_PTM_50.iq_stPtm.eState = pumpRUNNING,i_xOverrideMode := xGEM2OverrideMode);
 GEM2_VRC_60(i_xExtILK_OK := F_TurboGateValve_ILK(GEM2_PTM_60.iq_stPtm,GEM2_GPI_60.PG) AND GEM2_PTM_60.iq_stPtm.eState = pumpRUNNING,i_xOverrideMode := xGEM2OverrideMode);
 GEM2_VRC_70(i_xExtILK_OK := F_TurboGateValve_ILK(GEM2_PTM_70.iq_stPtm,GEM2_GPI_70.PG) AND GEM2_PTM_70.iq_stPtm.eState = pumpRUNNING,i_xOverrideMode := xGEM2OverrideMode);

(*Turbo Pumps*)
GEM2_PTM_30(i_xExtILKOK:=F_TurboExtILKLogic_2(GEM2_PTM_30.iq_stPtm, GEM2_GPI_31.PG,
                        GEM2_GPI_30.PG,GEM2_PRO_30.iq_stPFO));
GEM2_PTM_50(i_xExtILKOK:=F_TurboExtILKLogic_2(GEM2_PTM_50.iq_stPtm, GEM2_GPI_51.PG,
                        GEM2_GPI_50.PG,GEM2_PRO_50.iq_stPFO));
GEM2_PTM_60(i_xExtILKOK:=F_TurboExtILKLogic_2(GEM2_PTM_60.iq_stPtm, GEM2_GPI_61.PG,
                        GEM2_GPI_60.PG,GEM2_PRO_60.iq_stPFO));
GEM2_PTM_70(i_xExtILKOK:=F_TurboExtILKLogic_2(GEM2_PTM_70.iq_stPtm, GEM2_GPI_61.PG,
                        GEM2_GPI_70.PG,GEM2_PRO_60.iq_stPFO));


(*Roughing pumps*)
GEM2_PRO_30(xExtIlk:= TRUE, TurboIsOn:= GEM2_PTM_30.iq_stPtm.q_RunDO);
GEM2_PRO_50(xExtIlk:= TRUE, TurboIsOn:= GEM2_PTM_50.iq_stPtm.q_RunDO);
GEM2_PRO_60(xExtIlk:= TRUE, TurboIsOn:= (GEM2_PTM_60.iq_stPtm.q_RunDO OR GEM2_PTM_70.iq_stPtm.q_RunDO));

END_PROGRAM
Related:

PRG_ILK

PROGRAM PRG_ILK
VAR
END_VAR
(*Evaluate Global Interlocks*)

TwinscrewPumps_Valves_Closed := GEM1_VRC_60.q_stValve.i_xClsLS AND  GEM1_VRC_70.q_stValve.i_xClsLS AND GEM2_VRC_10.q_stValve.i_xClsLS AND GEM2_VRC_20.q_stValve.i_xClsLS;
GEM1_Turbo_Valves_Closed := GEM1_VRC_10.iq_stValve.i_xClsLS AND  GEM1_VRC_20.iq_stValve.i_xClsLS AND GEM1_VRC_30.iq_stValve.i_xClsLS AND GEM1_VRC_50.iq_stValve.i_xClsLS;
GEM2_Turbo_Valves_Closed := GEM2_VRC_30.iq_stValve.i_xClsLS AND  GEM2_VRC_50.iq_stValve.i_xClsLS AND GEM2_VRC_60.iq_stValve.i_xClsLS AND GEM2_VRC_70.iq_stValve.i_xClsLS;
GEM1_TwinscrewPumps_Valves_Open := (GEM1_VRC_60.q_stValve.i_xOpnLS AND GEM1_PRO_60.q_stPump.i_xIsRun) OR   (GEM1_VRC_70.q_stValve.i_xOpnLS AND GEM1_PRO_70.q_stPump.i_xIsRun);
GEM2_TwinscrewPumps_Valves_Open := (GEM2_VRC_10.q_stValve.i_xOpnLS AND GEM2_PRO_10.q_stPump.i_xIsRun) OR   (GEM2_VRC_20.q_stValve.i_xOpnLS AND GEM2_PRO_20.q_stPump.i_xIsRun);
GEM1_Turbo_Valves_Open := GEM1_VRC_10.iq_stValve.i_xOpnLS AND  GEM1_VRC_20.iq_stValve.i_xOpnLS AND GEM1_VRC_30.iq_stValve.i_xOpnLS AND GEM1_VRC_50.iq_stValve.i_xOpnLS;
GEM2_Turbo_Valves_Open := GEM2_VRC_30.iq_stValve.i_xOpnLS AND  GEM2_VRC_50.iq_stValve.i_xOpnLS AND GEM2_VRC_60.iq_stValve.i_xOpnLS AND GEM2_VRC_70.iq_stValve.i_xOpnLS; (*MG 03.09.20 Turbo is failing, but injection can run without it*)
GEM1_Aperture_Closed :=  GEM1_VGC_20.iq_stValve.i_xClsLS AND GEM1_VGC_30.iq_stValve.i_xClsLS AND GEM1_VGC_40.iq_stValve.i_xClsLS AND GEM1_VGC_50.iq_stValve.i_xClsLS AND GEM1_VGC_60.iq_stValve.i_xClsLS AND GEM1_VGC_70.iq_stValve.i_xClsLS ;
GEM2_Aperture_Closed := GEM2_VGC_10.iq_stValve.i_xClsLS AND GEM2_VGC_20.iq_stValve.i_xClsLS AND GEM2_VGC_30.iq_stValve.i_xClsLS AND GEM2_VGC_40.iq_stValve.i_xClsLS AND GEM2_VGC_50.iq_stValve.i_xClsLS AND GEM2_VGC_60.iq_stValve.i_xClsLS; ;
GEM1_Turbo_Running := (GEM1_PTM_10.iq_stPtm.eState = pumpRUNNING) AND (GEM1_PTM_20.iq_stPtm.eState = pumpRUNNING) AND (GEM1_PTM_30.iq_stPtm.eState = pumpRUNNING) AND (GEM1_PTM_50.iq_stPtm.eState = pumpRUNNING);
GEM2_Turbo_Running := (GEM2_PTM_30.iq_stPtm.eState = pumpRUNNING) AND (GEM2_PTM_50.iq_stPtm.eState = pumpRUNNING) AND (GEM2_PTM_60.iq_stPtm.eState = pumpRUNNING) AND (GEM2_PTM_70.iq_stPtm.eState = pumpRUNNING); (*MG 03.09.20 Turbo is failing, but injection can run without it*)

xGEM1_AperturesOpnOK := NOT GEM1_VVC_40.iq_stValve.q_xOPN_DO AND NOT GATT_VVC_10.iq_stValve.q_xOPN_DO; //AND VCN is closed
xGEM2_AperturesOpnOK := NOT GEM2_VVC_40.iq_stValve.q_xOPN_DO AND NOT GATT_VVC_10.iq_stValve.q_xOPN_DO; //AND VCN is closed

(* Link The correct override bit to the correct vacuum section*)



(*P/MPS FF*)

END_PROGRAM

PRG_PMPS

PROGRAM PRG_PMPS
VAR
 fbArbiterIO : FB_SubSysToArbiter_IO;
 test : bool;
 ar1 : bool;
 ar2 : bool;
  ar3 : bool;
 nReqID:UDINT;
 nReqRM:UDINT;
 bRemove:bool;
END_VAR
(*Fast Fault instantiation*)
g_FastFaultOutput1.bAutoReset :=TRUE;
g_FastFaultOutput2.bAutoReset :=TRUE;
g_FastFaultOutput1.Execute();
g_FastFaultOutput2.Execute();


(* Arbiter Instantiation*)
(*Arbiter one responsible for the aperture valves*)
fbArbiterIO(Arbiter := GVL_ILK.g_fbArbiter, fbFFHWO := GVL_ILK.g_FastFaultOutput1);
GVL_ILK.g_fbArbiter2.ElevateRequest(GVL_ILK.g_fbArbiter);
GVL_ILK.g_fbArbiter3.ElevateRequest(GVL_ILK.g_fbArbiter);

GVL_ILK.g_fbArbiter.AddRequest(nReqID:= 90  , stReqBP:= PMPS_GVL.cstFullBeam, sDevName := 'plc-lfe-gem');
GVL_ILK.g_fbArbiter2.AddRequest(nReqID:= 91  , stReqBP:= PMPS_GVL.cstFullBeam, sDevName := 'plc-lfe-gem');
GVL_ILK.g_fbArbiter3.AddRequest(nReqID:= 92  , stReqBP:= PMPS_GVL.cstFullBeam, sDevName := 'plc-lfe-gem');


ar1:=GVL_ILK.g_fbArbiter.CheckRequestInPool(nReqID);
ar2:=GVL_ILK.g_fbArbiter2.CheckRequestInPool(nReqID);
ar3:=GVL_ILK.g_fbArbiter3.CheckRequestInPool(nReqID);
if (bRemove) THEN
    GVL_ILK.g_fbArbiter.RemoveRequest(nReqRM);
     GVL_ILK.g_fbArbiter2.RemoveRequest(nReqRM);
    GVL_ILK.g_fbArbiter3.RemoveRequest(nReqRM);
END_IF

END_PROGRAM
Related:

PRG_ROOTS

PROGRAM PRG_ROOTS
VAR
END_VAR
(*EM1L0*)
(*Roots Pump Chamber 1*)
(*gauges*)
GEM1_GPI_60(PG=>);
GEM1_GPI_61(PG=>);
GEM1_GPI_71(PG=>);

(*Isolation Valve*)
GEM1_VRC_60(Pump:=GEM1_PRO_60.q_stPump,Gauge:=GEM1_GPI_60.PG,i_xExtILK_OK:=TRUE);
GEM1_VRC_70(Pump:=GEM1_PRO_70.q_stPump,Gauge:=GEM1_GPI_60.PG,i_xExtILK_OK:=TRUE);


(* dry pump*)
GEM1_PRO_60();
GEM1_PRO_70();




(*EM2L0*)
(*Roots Pump Chamber 1*)
(*gauges*)
GEM2_GPI_10(PG=>);
GEM2_GPI_11(PG=>);
GEM2_GPI_21(PG=>);

(*Isolation Valve*)
GEM2_VRC_10(Pump:=GEM2_PRO_10.q_stPump,Gauge:=GEM2_GPI_10.PG,i_xExtILK_OK:=TRUE);
GEM2_VRC_20(Pump:=GEM2_PRO_20.q_stPump,Gauge:=GEM2_GPI_10.PG,i_xExtILK_OK:=TRUE);

(* dry pump*)
GEM2_PRO_10();
GEM2_PRO_20();

END_PROGRAM

PRG_SATT

PROGRAM PRG_SATT
VAR
    PMPS_OK: BOOL := TRUE; // to be linked to pmps
END_VAR
SATT_MPA_01(
    ibInsertOK:= PMPS_OK,
    ibRetractOK:= PMPS_OK ,
    //ibPMPS_OK:= PMPS_OK ,
    ibOverrideInterlock:= ,
    q_stAct=> ,
    xMPS_OK=> ,
    xDone=> ,
    i_xReset := ,
    io_fbFFHWO :=g_FastFaultOutput2,i_sDevName:= 'AT1L0:SOLID:MPA:01',fbArbiter:=g_fbArbiter3,
    i_nTransitionRootID:=5100);

SATT_MPA_02(
    ibInsertOK:= PMPS_OK,
    ibRetractOK:= PMPS_OK ,
    //ibPMPS_OK:= PMPS_OK ,
    ibOverrideInterlock:= ,
    q_stAct=> ,
    xMPS_OK=> ,
    xDone=> ,
    i_xReset := ,io_fbFFHWO :=g_FastFaultOutput2,i_sDevName:= 'AT1L0:SOLID:MPA:02',fbArbiter:=g_fbArbiter3,
    i_nTransitionRootID:=5200);

SATT_MPA_03(
    ibInsertOK:= PMPS_OK,
    ibRetractOK:= PMPS_OK ,
    //ibPMPS_OK:= PMPS_OK ,
    ibOverrideInterlock:= ,
    q_stAct=> ,
    xMPS_OK=> ,
    xDone=> ,
    i_xReset := ,io_fbFFHWO :=g_FastFaultOutput2,i_sDevName:= 'AT1L0:SOLID:MPA:03',fbArbiter:=g_fbArbiter3,
    i_nTransitionRootID:=5300);

SATT_MPA_04(
    ibInsertOK:= PMPS_OK,
    ibRetractOK:= PMPS_OK ,
    //ibPMPS_OK:= PMPS_OK ,
    ibOverrideInterlock:= ,
    q_stAct=> ,
    xMPS_OK=> ,
    xDone=> ,
    i_xReset := ,io_fbFFHWO :=g_FastFaultOutput2,i_sDevName:= 'AT1L0:SOLID:MPA:04',fbArbiter:=g_fbArbiter3,
    i_nTransitionRootID:=5400);

SATT_MPA_05(
    ibInsertOK:= PMPS_OK,
    ibRetractOK:= PMPS_OK ,
    //ibPMPS_OK:= PMPS_OK ,
    ibOverrideInterlock:= ,
    q_stAct=> ,
    xMPS_OK=> ,
    xDone=> ,
    i_xReset := ,io_fbFFHWO :=g_FastFaultOutput2,i_sDevName:= 'AT1L0:SOLID:MPA:05',fbArbiter:=g_fbArbiter3,
    i_nTransitionRootID:=5500);

SATT_MPA_06(
    ibInsertOK:= PMPS_OK,
    ibRetractOK:= PMPS_OK ,
    //ibPMPS_OK:= PMPS_OK ,
    ibOverrideInterlock:= ,
    q_stAct=> ,
    xMPS_OK=> ,
    xDone=> ,
    i_xReset := ,io_fbFFHWO :=g_FastFaultOutput2,i_sDevName:= 'AT1L0:SOLID:MPA:06',fbArbiter:=g_fbArbiter3,
    i_nTransitionRootID:=5600);

SATT_MPA_07(
    ibInsertOK:= PMPS_OK,
    ibRetractOK:= PMPS_OK ,
    //ibPMPS_OK:= PMPS_OK ,
    ibOverrideInterlock:= ,
    q_stAct=> ,
    xMPS_OK=> ,
    xDone=> ,
    i_xReset := ,io_fbFFHWO :=g_FastFaultOutput2,i_sDevName:= 'AT1L0:SOLID:MPA:07',fbArbiter:=g_fbArbiter3,
    i_nTransitionRootID:=5700);

SATT_MPA_08(
    ibInsertOK:= PMPS_OK,
    ibRetractOK:= PMPS_OK ,
    //ibPMPS_OK:= PMPS_OK ,
    ibOverrideInterlock:= ,
    q_stAct=> ,
    xMPS_OK=> ,
    xDone=> ,
    i_xReset := ,io_fbFFHWO :=g_FastFaultOutput2,i_sDevName:= 'AT1L0:SOLID:MPA:08',fbArbiter:=g_fbArbiter3,
    i_nTransitionRootID:=5800);

SATT_MPA_09(
    ibInsertOK:= PMPS_OK,
    ibRetractOK:= PMPS_OK ,
    //ibPMPS_OK:= PMPS_OK ,
    ibOverrideInterlock:= ,
    q_stAct=> ,
    xMPS_OK=> ,
    xDone=> ,
    i_xReset := ,io_fbFFHWO :=g_FastFaultOutput2,i_sDevName:= 'AT1L0:SOLID:MPA:09',fbArbiter:=g_fbArbiter3,
    i_nTransitionRootID:=5900);

(*
MPA_321();
MPA_322();
MPA_323();
MPA_324();
MPA_325();
MPA_326();
MPA_327();
MPA_328();
MPA_329(); *)

END_PROGRAM

PRG_SENSORS

PROGRAM PRG_SENSORS
VAR
        // Sensor Range in Psi
    CDA_SENS_PRESS_RANGE : REAL := 200;
    NITR_SENS_PRESS_RANGE: REAL := 200;
    H2O_SENS_PRESS_RANGE: REAL := 200;

    // Mim pressure setpoint in Psi
    CDA_SENS_MIN_PRESS_SP: REAL := 30;
    NITR_SENS_MIN_PRESS_SP: REAL := 15;
    H2O_SENS_MIN_PRESS_SP: REAL := 15;

    // Maximum pressure setpoint in Psi
    CDA_SENS_MAX_PRESS_SP: REAL := 160;
    NITR_SENS_MAX_PRESS_SP: REAL := 55;
    H2O_SENS_MAX_PRESS_SP: REAL := 80;

    // Press default setpoint in Psi
    CDA_SENS_DEFAULT_SP: REAL := 60;
    NITR_SENS_DEFAULT_SP: REAL := 25;
    H2O_SENS_DEFAULT_SP: REAL := 30;


END_VAR
GEM1_AIR_1(rDefaultSP:= CDA_SENS_DEFAULT_SP);
GEM1_AIR_2(rDefaultSP:= CDA_SENS_DEFAULT_SP);

GEM2_N2_1 (rDefaultSP:= NITR_SENS_DEFAULT_SP);
GEM2_N2_2 (rDefaultSP:= NITR_SENS_DEFAULT_SP);

END_PROGRAM