DUTs ---- DUT_SATT_Filter ^^^^^^^^^^^^^^^ :: TYPE DUT_SATT_Filter : STRUCT {attribute 'pytmc' := ' pv: MATERIAL io: input field: DESC Filter material name '} sFilterMaterial : STRING; {attribute 'pytmc' := ' pv: THICKNESS io: input field: DESC Filter material thickness field: EGU um '} fFilterThickness_um : LREAL; END_STRUCT END_TYPE Related: * `DUT_SATT_Filter`_ ENUM_SXR_SATT_Position ^^^^^^^^^^^^^^^^^^^^^^ :: {attribute 'qualified_only'} TYPE ENUM_SXR_SATT_Position : ( UNKNOWN := 0, // UNKNOWN must be in slot 0 or the FB breaks OUT := 1, // OUT at slot 1 is a convention FILTER1 := 2, FILTER2 := 3, FILTER3 := 4, FILTER4 := 5, FILTER5 := 6, FILTER6 := 7, FILTER7 := 8, FILTER8 := 9 ); END_TYPE ENUM_TM2K2_States ^^^^^^^^^^^^^^^^^ :: {attribute 'qualified_only'} TYPE ENUM_TM2K2_States : // Adapted from ENUM_ATM_States to add TARGET6 ( Unknown := 0, OUT := 1, TARGET1 := 2, TARGET2 := 3, TARGET3 := 4, TARGET4 := 5, TARGET5 := 6, TARGET6 := 7 ); 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_plc_kfe_rix_motion : ST_LibVersion := (iMajor := 2, iMinor := 1, iBuild := 0, iRevision := 0, sVersion := '2.1.0'); END_VAR GVL ^^^ :: {attribute 'qualified_only'} VAR_GLOBAL {attribute 'pytmc' := 'pv: PLC:RIX:MOTION:ARB:01'} fbArbiter1: FB_Arbiter(1); {attribute 'pytmc' := 'pv: PLC:RIX:MOTION:ARB:02'} fbArbiter2: FB_Arbiter(2); // For devices between the mirror and the stopper {attribute 'pytmc' := 'pv: PLC:RIX:MOTION:FFO:01'} {attribute 'TcLinkTo' := '.q_xFastFaultOut:=TIIB[PMPS_FFO]^Channel 1^Output'} fbFastFaultOutput1: FB_HardwareFFOutput := (bAutoReset := TRUE, i_sNetID:='172.21.42.126.1.1'); // For devices after the stopper {attribute 'pytmc' := 'pv: PLC:RIX:MOTION:FFO:02'} {attribute 'TcLinkTo' := '.q_xFastFaultOut:=TIIB[PMPS_FFO]^Channel 2^Output'} fbFastFaultOutput2: FB_HardwareFFOutput := (bAutoReset := TRUE, i_sNetID:='172.21.42.126.1.1'); fbAtomicMass : FB_AtomicMass; fbAttenuatorElementDensity : FB_AttenuatorElementDensity; {attribute 'pytmc' := 'pv: PLC:RIX:MOTION:PMPS:ReqTrans'} rReqTrans AT %I* : ARRAY [1..PMPS_GVL.AUX_ATTENUATORS] OF ST_PMPS_Attenuator_IO; {attribute 'pytmc' := 'pv: PLC:RIX:MOTION:PMPS:CurTrans'} rCurTrans AT %Q* : ARRAY [1..PMPS_GVL.AUX_ATTENUATORS] OF ST_PMPS_Attenuator_IO; END_VAR VAR_GLOBAL CONSTANT iFiltersPerSATTBlade : INT := 8; END_VAR Related: * `FB_AttenuatorElementDensity`_ Main ^^^^ :: {attribute 'qualified_only'} VAR_GLOBAL // IM1K1-PPM-MMS {attribute 'pytmc' := 'pv: IM1K1:PPM:MMS'} {attribute 'TcLinkTo' := '.bLimitForwardEnable := TIIB[IM1K1-EL7041]^STM Status^Status^Digital input 1; .bLimitBackwardEnable := TIIB[IM1K1-EL7041]^STM Status^Status^Digital input 2; .bBrakeRelease := TIIB[IM1K1-EL2004]^Channel 1^Output'} M1: DUT_MotionStage := (sName := 'IM1K1:PPM:MMS'); // IM2K1-PPM-MMS {attribute 'pytmc' := 'pv: IM2K1:PPM:MMS'} {attribute 'TcLinkTo' := '.bLimitForwardEnable := TIIB[IM2K1-EL7041]^STM Status^Status^Digital input 1; .bLimitBackwardEnable := TIIB[IM2K1-EL7041]^STM Status^Status^Digital input 2; .bBrakeRelease := TIIB[IM2K1-EL2004]^Channel 1^Output'} M2: DUT_MotionStage := (sName := 'IM2K1:PPM:MMS'); // SPARE (Previously ZOS) M3: DUT_MotionStage; // IM1K2-PPM-MMS {attribute 'pytmc' := 'pv: IM1K2:PPM:MMS'} {attribute 'TcLinkTo' := '.bLimitForwardEnable := TIIB[IM1K2-EL7041-E1]^STM Status^Status^Digital input 1; .bLimitBackwardEnable := TIIB[IM1K2-EL7041-E1]^STM Status^Status^Digital input 2; .bBrakeRelease := TIIB[IM1K2-EL2004-E3]^Channel 1^Output'} M4: DUT_MotionStage := (sName := 'IM1K2:PPM:MMS'); // AL1K2-L2SI: 1 Axis {attribute 'pytmc' := 'pv: AL1K2:L2SI:MMS'} {attribute 'TcLinkTo' := '.bLimitForwardEnable := TIIB[AL1K2-EL7041-E1]^STM Status^Status^Digital input 1; .bLimitBackwardEnable := TIIB[AL1K2-EL7041-E1]^STM Status^Status^Digital input 2; .bBrakeRelease := TIIB[AL1K2-EL2004-E3]^Channel 1^Output; .nRawEncoderULINT := TIIB[AL1K2-EL5042-E2]^FB Inputs Channel 1^Position'} M5: DUT_MotionStage := (sName := 'AL1K2:L2SI:MMS'); // IM2K2-PPM-MMS {attribute 'pytmc' := 'pv: IM2K2:PPM:MMS'} {attribute 'TcLinkTo' := '.bLimitForwardEnable := TIIB[IM2K2-EL7041-E1]^STM Status^Status^Digital input 1; .bLimitBackwardEnable := TIIB[IM2K2-EL7041-E1]^STM Status^Status^Digital input 2; .bBrakeRelease := TIIB[IM2K2-EL2004-E3]^Channel 1^Output'} M6: DUT_MotionStage := (sName := 'IM2K2:PPM:MMS'); // IM3K2-PPM-MMS {attribute 'pytmc' := 'pv: IM3K2:PPM:MMS'} {attribute 'TcLinkTo' := '.bLimitForwardEnable := TIIB[IM3K2-EL7041-E1]^STM Status^Status^Digital input 1; .bLimitBackwardEnable := TIIB[IM3K2-EL7041-E1]^STM Status^Status^Digital input 2; .bBrakeRelease := TIIB[IM3K2-EL2004-E3]^Channel 1^Output'} M7: DUT_MotionStage := (sName := 'IM3K2:PPM:MMS'); // IM4K2-PPM-MMS {attribute 'pytmc' := 'pv: IM4K2:PPM:MMS'} {attribute 'TcLinkTo' := '.bLimitForwardEnable := TIIB[IM4K2-EL7041-E1]^STM Status^Status^Digital input 1; .bLimitBackwardEnable := TIIB[IM4K2-EL7041-E1]^STM Status^Status^Digital input 2; .bBrakeRelease := TIIB[IM4K2-EL2004-E3]^Channel 1^Output'} M8: DUT_MotionStage := (sName := 'IM4K2:PPM:MMS'); // TM1K2: 2 Axes {attribute 'pytmc' := 'pv: TM1K2:ATM:MMS:Y'} {attribute 'TcLinkTo' := '.bLimitForwardEnable := TIIB[TM1K2-EL7041-E1]^STM Status^Status^Digital input 1; .bLimitBackwardEnable := TIIB[TM1K2-EL7041-E1]^STM Status^Status^Digital input 2; .bBrakeRelease := TIIB[TM1K2-EL2004-E4]^Channel 1^Output; .nRawEncoderULINT := TIIB[TM1K2-EL5042-E3]^FB Inputs Channel 1^Position'} M9: DUT_MotionStage := (sName := 'TM1K2:ATM:MMS:Y'); {attribute 'pytmc' := 'pv: TM1K2:ATM:MMS:X'} {attribute 'TcLinkTo' := '.nRawEncoderULINT := TIIB[TM1K2-EL5042-E3]^FB Inputs Channel 2^Position'} M10: DUT_MotionStage := (sName := 'TM1K2:ATM:MMS:X'); // LI2K2-K2A_OUT: 1 Axis {attribute 'pytmc' := 'pv: LI2K2:K2A:MMS'} {attribute 'TcLinkTo' := '.bLimitForwardEnable := TIIB[LI2K2-EL7041-E1]^STM Status^Status^Digital input 1; .bLimitBackwardEnable := TIIB[LI2K2-EL7041-E1]^STM Status^Status^Digital input 2; .bBrakeRelease := TIIB[LI2K2-EL2004-E2]^Channel 1^Output; .nRawEncoderULINT := TIIB[LI2K2-EL5042-E3]^FB Inputs Channel 1^Position'} M11: DUT_MotionStage := (sName := 'LI2K2:K2A:MMS'); // PF1K2-WFS: 2 Axes {attribute 'pytmc' := 'pv: PF1K2:WFS:MMS:Y'} {attribute 'TcLinkTo' := '.bLimitForwardEnable := TIIB[PF1K2-EL7041-E1]^STM Status^Status^Digital input 1; .bLimitBackwardEnable := TIIB[PF1K2-EL7041-E1]^STM Status^Status^Digital input 2; .bBrakeRelease := TIIB[PF1K2-EL2004-E4]^Channel 1^Output; .nRawEncoderULINT := TIIB[PF1K2-EL5042-E3]^FB Inputs Channel 2^Position'} M12: DUT_MotionStage := (sName := 'PF1K2:WFS:MMS:Y'); {attribute 'pytmc' := 'pv: PF1K2:WFS:MMS:Z'} {attribute 'TcLinkTo' := '.nRawEncoderULINT := TIIB[PF1K2-EL5042-E3]^FB Inputs Channel 1^Position'} M13: DUT_MotionStage := (sName := 'PF1K2:WFS:MMS:Z'); // IM5K2-PPM-MMS {attribute 'pytmc' := 'pv: IM5K2:PPM:MMS'} {attribute 'TcLinkTo' := '.bLimitForwardEnable := TIIB[IM5K2-EL7041-E1]^STM Status^Status^Digital input 1; .bLimitBackwardEnable := TIIB[IM5K2-EL7041-E1]^STM Status^Status^Digital input 2; .bBrakeRelease := TIIB[IM5K2-EL2004-E3]^Channel 1^Output'} M14: DUT_MotionStage := (sName := 'IM5K2:PPM:MMS'); // TM2K2: 2 Axes {attribute 'pytmc' := 'pv: TM2K2:ATM:MMS:Y'} {attribute 'TcLinkTo' := '.bLimitForwardEnable := TIIB[TM2K2-EL7041-E1]^STM Status^Status^Digital input 1; .bLimitBackwardEnable := TIIB[TM2K2-EL7041-E1]^STM Status^Status^Digital input 2; .bBrakeRelease := TIIB[TM2K2-EL2004-E4]^Channel 1^Output; .nRawEncoderULINT := TIIB[TM2K2-EL5042-E3]^FB Inputs Channel 1^Position'} M15: DUT_MotionStage := (sName := 'TM2K2:ATM:MMS:Y'); {attribute 'pytmc' := 'pv: TM2K2:ATM:MMS:X'} {attribute 'TcLinkTo' := '.nRawEncoderULINT := TIIB[TM2K2-EL5042-E3]^FB Inputs Channel 2^Position'} M16: DUT_MotionStage := (sName := 'TM2K2:ATM:MMS:X'); //AT2K2: 4 Axes (* AT2K2 Solid Attenuator notes (JJ-xray SN-11343) JJ Label EPICS Stage NC Location 1087 1 MMS:01 fbStage1 M17 Upstream-most 1088 2 MMS:02 fbStage2 M18 1086 3 MMS:03 fbStage3 M19 1089 4 MMS:04 fbStage4 M20 Downstream-most *) {attribute 'pytmc' := 'pv: AT2K2:L2SI:MMS:01'} {attribute 'TcLinkTo' := ' .bLimitForwardEnable := TIIB[AT2K2-EL7047-01]^STM Status^Status^Digital input 1; .bLimitBackwardEnable := TIIB[AT2K2-EL7047-01]^STM Status^Status^Digital input 2; .nRawEncoderULINT := TIIB[AT2K2-EL5042-01]^FB Inputs Channel 1^Position; '} M17: DUT_MotionStage := (sName := 'AT2K2:L2SI:MMS:01'); {attribute 'pytmc' := 'pv: AT2K2:L2SI:MMS:02'} {attribute 'TcLinkTo' := ' .bLimitForwardEnable := TIIB[AT2K2-EL7047-02]^STM Status^Status^Digital input 1; .bLimitBackwardEnable := TIIB[AT2K2-EL7047-02]^STM Status^Status^Digital input 2; .nRawEncoderULINT := TIIB[AT2K2-EL5042-01]^FB Inputs Channel 2^Position; '} M18: DUT_MotionStage := (sName := 'AT2K2:L2SI:MMS:02'); {attribute 'pytmc' := 'pv: AT2K2:L2SI:MMS:03'} {attribute 'TcLinkTo' := ' .bLimitForwardEnable := TIIB[AT2K2-EL7047-03]^STM Status^Status^Digital input 1; .bLimitBackwardEnable := TIIB[AT2K2-EL7047-03]^STM Status^Status^Digital input 2; .nRawEncoderULINT := TIIB[AT2K2-EL5042-02]^FB Inputs Channel 1^Position; '} M19: DUT_MotionStage := (sName := 'AT2K2:L2SI:MMS:03'); {attribute 'pytmc' := 'pv: AT2K2:L2SI:MMS:04'} {attribute 'TcLinkTo' := ' .bLimitForwardEnable := TIIB[AT2K2-EL7047-04]^STM Status^Status^Digital input 1; .bLimitBackwardEnable := TIIB[AT2K2-EL7047-04]^STM Status^Status^Digital input 2; .nRawEncoderULINT := TIIB[AT2K2-EL5042-02]^FB Inputs Channel 2^Position; '} M20: DUT_MotionStage := (sName := 'AT2K2:L2SI:MMS:04'); //LI3K2-K2B: 1 Axis {attribute 'pytmc' := 'pv: LI3K2:K2B:MMS'} {attribute 'TcLinkTo' := '.bLimitForwardEnable := TIIB[LI3K2-EL7041-E1]^STM Status^Status^Digital input 1; .bLimitBackwardEnable := TIIB[LI3K2-EL7041-E1]^STM Status^Status^Digital input 2; .bBrakeRelease := TIIB[LI3K2-EL2004-E3]^Channel 1^Output; .nRawEncoderULINT := TIIB[LI3K2-EL5042-E2]^FB Inputs Channel 1^Position'} M21: DUT_MotionStage := (sName := 'LI3K2:K2B:MMS'); //PF2K2: 2 Axes {attribute 'pytmc' := 'pv: PF2K2:WFS:MMS:Y'} {attribute 'TcLinkTo' := '.bLimitForwardEnable := TIIB[PF2K2-EL7041-E1]^STM Status^Status^Digital input 1; .bLimitBackwardEnable := TIIB[PF2K2-EL7041-E1]^STM Status^Status^Digital input 2; .bBrakeRelease := TIIB[PF2K2-EL2004-E4]^Channel 1^Output; .nRawEncoderULINT := TIIB[PF2K2-EL5042-E3]^FB Inputs Channel 2^Position'} M22: DUT_MotionStage := (sName := 'PF2K2:WFS:MMS:Y'); {attribute 'pytmc' := 'pv: PF2K2:WFS:MMS:Z'} {attribute 'TcLinkTo' := '.nRawEncoderULINT := TIIB[PF2K2-EL5042-E3]^FB Inputs Channel 1^Position'} M23: DUT_MotionStage := (sName := 'PF2K2:WFS:MMS:Z'); //IM6K2: 1 Axis {attribute 'pytmc' := 'pv: IM6K2:PPM:MMS'} {attribute 'TcLinkTo' := '.bLimitForwardEnable := TIIB[IM6K2-EL7041-E1]^STM Status^Status^Digital input 1; .bLimitBackwardEnable := TIIB[IM6K2-EL7041-E1]^STM Status^Status^Digital input 2; .bBrakeRelease := TIIB[IM6K2-EL2004-E3]^Channel 1^Output'} M24: DUT_MotionStage := (sName := 'IM6K2:PPM:MMS'); //AT1K2: Blade 1 {attribute 'pytmc' := 'pv: AT1K2:L2SI:MMS:01'} {attribute 'TcLinkTo' := ' .bLimitForwardEnable := TIIB[AT1K2-EL7047-01]^STM Status^Status^Digital input 1; .bLimitBackwardEnable := TIIB[AT1K2-EL7047-01]^STM Status^Status^Digital input 2; .nRawEncoderULINT := TIIB[AT1K2-EL5042-01]^FB Inputs Channel 1^Position'; ;} M25: DUT_MotionStage := (sName := 'AT1K2:L2SI:MMS:01'); //AT1K2: Blade 2 {attribute 'pytmc' := 'pv: AT1K2:L2SI:MMS:02'} {attribute 'TcLinkTo' := ' .bLimitForwardEnable := TIIB[AT1K2-EL7047-02]^STM Status^Status^Digital input 1; .bLimitBackwardEnable := TIIB[AT1K2-EL7047-02]^STM Status^Status^Digital input 2; .nRawEncoderULINT := TIIB[AT1K2-EL5042-01]^FB Inputs Channel 2^Position'; ;} M26: DUT_MotionStage := (sName := 'AT1K2:L2SI:MMS:02'); //AT1K2: Mirror {attribute 'pytmc' := 'pv: AT1K2:L2SI:MMS:03'} {attribute 'TcLinkTo' := ' .nRawEncoderULINT := TIIB[AT1K2-EL5042-02]^FB Inputs Channel 1^Position'; ;} M27: DUT_MotionStage := (sName := 'AT1K2:L2SI:MMS:03'); END_VAR POUs ---- FB_AT1K2 ^^^^^^^^ :: FUNCTION_BLOCK FB_AT1K2 VAR_IN_OUT fbFFHWO: FB_HardwareFFOutput; stAxis: DUT_MotionStage; END_VAR VAR_INPUT nEnableMode : ENUM_StageEnableMode; stOut : DUT_PositionState; stIn : DUT_PositionState; END_VAR VAR_OUTPUT fTransmission : LREAL; bMirrorOut : BOOL; END_VAR VAR fbMotion: FB_MotionStage; {attribute 'pytmc' := ' pv: STATE '} fbState: FB_PositionStateInOut; bInitialized: BOOL := FALSE; fbFF: FB_FastFault := (i_Desc := 'Device is moving', i_TypeCode := 16#2100, i_xAutoReset := TRUE); END_VAR IF NOT bInitialized THEN bInitialized := TRUE; (* Defaults for DUT_MotionStage *) stAxis.bHardwareEnable := TRUE; stAxis.bLimitBackwardEnable := TRUE; stAxis.bLimitForwardEnable := TRUE; stAxis.bPowerSelf := TRUE; stAxis.nBrakeMode := ENUM_StageBrakeMode.NO_BRAKE; stAxis.nHomingMode := ENUM_EpicsHomeCmd.NONE; END_IF stAxis.nEnableMode := nEnableMode; fbMotion(stMotionStage:=stAxis); fbState( bEnable:=TRUE, stMotionStage:=stAxis, stOut:=stOut, stIn:=stIn, ); bMirrorOut := fbState.enumGet = ENUM_EpicsInOut.OUT; // If Mirror is in, fTransmission of mirror is 0. If out, fTransmission is 1 IF bMirrorOut THEN fTransmission := 1.0; ELSE fTransmission := 0.0; END_IF fbFF( i_DevName:=stAxis.sName, i_xOK:= fbState.enumGet = ENUM_EpicsInOut.OUT, io_fbFFHWO := fbFFHWO ); END_FUNCTION_BLOCK FB_AttenuatorElementDensity ^^^^^^^^^^^^^^^^^^^^^^^^^^^ :: FUNCTION_BLOCK FB_AttenuatorElementDensity VAR_INPUT sName : STRING; END_VAR VAR_OUTPUT fDensity : LREAL; bFound : BOOL; END_VAR VAR fbElementDensity : FB_ElementDensity; fDensity_gm3 : LREAL; END_VAR IF sName = 'C' THEN (* Special-case diamond here *) fDensity := 3.51E6; (* C (Diamond) g/m^3 *) ELSE fbElementDensity(sName:=sName); IF fbElementDensity.bFound THEN fDensity := fbElementDensity.fValue * 1.0E6; (* g/cm^3 -> g/m^3 *) ELSE fDensity := 0.0; END_IF END_IF END_FUNCTION_BLOCK FB_SXR_SATT_PositionState ^^^^^^^^^^^^^^^^^^^^^^^^^ :: FUNCTION_BLOCK FB_SXR_SATT_PositionState EXTENDS FB_PositionStateBase VAR_INPUT // The enum position to move to {attribute 'pytmc' := ' pv: SET io: io '} enumSet: ENUM_SXR_SATT_Position; // NOTE: Do not pragma these, let it happen in the manager. // Information about the OUT position stOut : DUT_PositionState; stFilter1 : DUT_PositionState; stFilter2 : DUT_PositionState; stFilter3 : DUT_PositionState; stFilter4 : DUT_PositionState; stFilter5 : DUT_PositionState; stFilter6 : DUT_PositionState; stFilter7 : DUT_PositionState; stFilter8 : DUT_PositionState; END_VAR VAR_OUTPUT // The enum state readback {attribute 'pytmc' := ' pv: GET io: i '} enumGet: ENUM_SXR_SATT_Position; END_VAR VAR bInitialized: BOOL := FALSE; END_VAR IF NOT bInitialized THEN bInitialized := TRUE; arrStates[1] := stOut; arrStates[2] := stFilter1; arrStates[3] := stFilter2; arrStates[4] := stFilter3; arrStates[5] := stFilter4; arrStates[6] := stFilter5; arrStates[7] := stFilter6; arrStates[8] := stFilter7; arrStates[9] := stFilter8; END_IF setState := enumSet; Exec(); enumGet := getState; enumSet := setState; END_FUNCTION_BLOCK Related: * `ENUM_SXR_SATT_Position`_ FB_SXR_SATT_Stage ^^^^^^^^^^^^^^^^^ :: FUNCTION_BLOCK FB_SXR_SATT_Stage VAR_IN_OUT stAxis : DUT_MotionStage; fbFFHWO: FB_HardwareFFOutput; END_VAR VAR_INPUT nEnableMode : ENUM_StageEnableMode; stOut : DUT_PositionState; stFilter1 : DUT_PositionState; stFilter2 : DUT_PositionState; stFilter3 : DUT_PositionState; stFilter4 : DUT_PositionState; stFilter5 : DUT_PositionState; stFilter6 : DUT_PositionState; stFilter7 : DUT_PositionState; stFilter8 : DUT_PositionState; {attribute 'pytmc' := 'pv: FILTERS'} arrFilters: ARRAY[1..8] OF DUT_SATT_Filter; END_VAR VAR_OUTPUT // stExtra : DUT_MotionStage_Extras; fTemp1 : LREAL; fTemp2 : LREAL; bIsStationary : BOOL; bError : BOOL; {attribute 'pytmc' := ' pv: MATERIAL io: i '} sActiveFilterMaterial : STRING; {attribute 'pytmc' := ' pv: THICKNESS io: i field: EGU um '} fActiveFilterThickness_um : LREAL; {attribute 'pytmc' := ' pv: TRANSMISSION io: i field: DESC Filter transmission '} fTransmission : LREAL; fActiveFilterDensity : LREAL; fActiveFilterAtomicMass : LREAL; fAbsorptionConstant : LREAL; iFilterIndex: INT := 0; END_VAR VAR fbMotion: FB_MotionStage; {attribute 'pytmc' := ' pv: STATE '} fbState : FB_SXR_SATT_PositionState; bInitialized: BOOL := FALSE; fbAtomicMass : FB_AtomicMass; fbAttenuatorElementDensity : FB_AttenuatorElementDensity; (* EL3202-0020: 0.01 °C per digit *) {attribute 'pytmc' := 'pv: RTD:1'} fbRTD_1: FB_TempSensor := ( fResolution:=0.01 ); {attribute 'pytmc' := 'pv: RTD:2'} fbRTD_2: FB_TempSensor := ( fResolution:=0.01 ); fbFF: FB_FastFault := (i_Desc := 'Device is moving', i_TypeCode := 16#2100, i_xAutoReset := TRUE); END_VAR IF NOT bInitialized THEN bInitialized := TRUE; (* Defaults for DUT_MotionStage *) stAxis.bHardwareEnable := TRUE; stAxis.bLimitBackwardEnable := TRUE; stAxis.bLimitForwardEnable := TRUE; stAxis.bPowerSelf := TRUE; stAxis.nBrakeMode := ENUM_StageBrakeMode.NO_BRAKE; stAxis.nHomingMode := ENUM_EpicsHomeCmd.NONE; (* Defaults for visualization *) // stExtra.fVisuStep := 0.1; END_IF fbRTD_1(); fTemp1 := fbRTD_1.fTemp; fbRTD_2(); fTemp2 := fbRTD_2.fTemp; stAxis.nEnableMode := nEnableMode; fbMotion(stMotionStage:=stAxis); fbState( bEnable:=TRUE, stMotionStage:=stAxis, stOut:=stOut, stFilter1:=stFilter1, stFilter2:=stFilter2, stFilter3:=stFilter3, stFilter4:=stFilter4, stFilter5:=stFilter5, stFilter6:=stFilter6, stFilter7:=stFilter7, stFilter8:=stFilter8, ); (* Filter indices are off by one due to "Out" being in position 1. *) iFilterIndex := fbState.enumGet - 1; IF iFilterIndex >= 1 AND iFilterIndex <= GVL.iFiltersPerSATTBlade THEN sActiveFilterMaterial := arrFilters[iFilterIndex].sFilterMaterial; fActiveFilterThickness_um := arrFilters[iFilterIndex].fFilterThickness_um; fbAtomicMass(sName:=sActiveFilterMaterial, fValue=>fActiveFilterAtomicMass); fbAttenuatorElementDensity(sName:=sActiveFilterMaterial, fDensity=>fActiveFilterDensity); fAbsorptionConstant := F_CalculateAbsorptionConstant( sElement:=sActiveFilterMaterial, fEnergyEV:=PMPS_GVL.stCurrentBeamParameters.neV, fDensity_gm3:=fActiveFilterDensity, fAtomicWeight:=fActiveFilterAtomicMass, bError=>bError, ); fTransmission := F_CalculateTransmission( fAbsorptionConstant:=fAbsorptionConstant, fThickness_in_m:=fActiveFilterThickness_um * 1.0E-6 ); ELSE sActiveFilterMaterial := ''; fActiveFilterThickness_um := 0.0; fAbsorptionConstant := 0.0; fActiveFilterDensity := 0.0; fActiveFilterAtomicMass := 0.0; fTransmission := 1.0; END_IF bIsStationary := NOT stAxis.Axis.Status.Moving; fbFF( i_DevName:=stAxis.sName, i_xOK:=bIsStationary AND fbState.enumGet <> ENUM_SXR_SATT_Position.UNKNOWN, io_fbFFHWO := fbFFHWO ); // stExtra.bVisuHighLim := NOT stAxis.bAllForwardEnable; // stExtra.bVisuLowLim := NOT stAxis.bAllBackwardEnable; END_FUNCTION_BLOCK Related: * `DUT_SATT_Filter`_ * `ENUM_SXR_SATT_Position`_ * `FB_AttenuatorElementDensity`_ * `FB_SXR_SATT_PositionState`_ * `GVL`_ FB_TM2K2 ^^^^^^^^ :: FUNCTION_BLOCK FB_TM2K2 (* Adapted from FB_ATM to: - Add stTarget6 to the inputs - Change the arrStates.array pragma from 1..6 to 1..7 (out and 6 in states, up from 5) - Swap out FB_ATM_States for FB_TM2K2_States *) VAR_IN_OUT stYStage: DUT_MotionStage; stXStage: DUT_MotionStage; fbArbiter: FB_Arbiter; fbFFHWO: FB_HardwareFFOutput; END_VAR VAR_INPUT stOut: DUT_PositionState; stTarget1: DUT_PositionState; stTarget2: DUT_PositionState; stTarget3: DUT_PositionState; stTarget4: DUT_PositionState; stTarget5: DUT_PositionState; stTarget6: DUT_PositionState; sPmpsDeviceName: STRING; sTransitionKey: STRING; END_VAR VAR fbYStage: FB_MotionStage; fbXStage: FB_MotionStage; {attribute 'pytmc' := ' pv: MMS:STATE io: i arrStates.array: 1..7 '} fbStates: FB_TM2K2_States; {attribute 'pytmc' := ' pv: STC:01 io: input '} fbThermoCouple1: FB_TempSensor; END_VAR fbYStage(stMotionStage:=stYStage); stYStage.bHardwareEnable := TRUE; stYStage.bPowerSelf := FALSE; stYStage.nEnableMode := ENUM_StageEnableMode.DURING_MOTION; fbXStage(stMotionStage:=stXStage); stXStage.bLimitForwardEnable := TRUE; stXStage.bLimitBackwardEnable := TRUE; stXStage.bHardwareEnable := TRUE; stXStage.bPowerSelf := TRUE; stXStage.nEnableMode := ENUM_StageEnableMode.DURING_MOTION; fbStates( fbArbiter:=fbArbiter, fbFFHWO:=fbFFHWO, stMotionStage:=stYStage, bEnable := TRUE, stOut:=stOut, stTarget1:=stTarget1, stTarget2:=stTarget2, stTarget3:=stTarget3, stTarget4:=stTarget4, stTarget5:=stTarget5, stTarget6:=stTarget6, sPmpsDeviceName:=sPmpsDeviceName, sTransitionKey:=sTransitionKey); fbThermoCouple1(); END_FUNCTION_BLOCK Related: * `FB_TM2K2_States`_ FB_TM2K2_States ^^^^^^^^^^^^^^^ :: FUNCTION_BLOCK FB_TM2K2_States EXTENDS FB_PositionStateBase_WithPMPS // Adapted from TB_ATM_States to add TARGET6 and to switch the enumSet and enumGet ENUM types VAR_INPUT {attribute 'pytmc' := ' pv: SET io: io '} enumSet: ENUM_TM2K2_states; stOut: DUT_PositionState; stTarget1: DUT_PositionState; stTarget2: DUT_PositionState; stTarget3: DUT_PositionState; stTarget4: DUT_PositionState; stTarget5: DUT_PositionState; stTarget6: DUT_PositionState; bStatesLock: BOOL; END_VAR VAR_OUTPUT {attribute 'pytmc' := ' pv: GET io: i '} enumGet: ENUM_TM2K2_States; END_VAR VAR bATMInit: BOOL; END_VAR VAR CONSTANT fInDelta: LREAL := 2; fOutDelta: LREAL := 2; fInVelocity: LREAL := 5; fOutVelocity: LREAL := 5; fAccel: LREAL := 200; fOutDecel: LREAL := 25; END_VAR IF NOT bATMInit THEN bATMInit := TRUE; stOut.sName := 'OUT'; stOut.fVelocity := fOutVelocity; stOut.fDelta := fOutDelta; stOut.fAccel := fAccel; stOut.fDecel := fOutDecel; stOut.bMoveOk := TRUE; stTarget1.sName := 'TARGET1'; stTarget1.fVelocity := fInVelocity; stTarget1.fDelta := fInDelta; stTarget1.fAccel := fAccel; stTarget1.fDecel := fAccel; stTarget1.bMoveOk := TRUE; stTarget2.sName := 'TARGET2'; stTarget2.fVelocity := fInVelocity; stTarget2.fDelta := fInDelta; stTarget2.fAccel := fAccel; stTarget2.fDecel := fAccel; stTarget2.bMoveOk := TRUE; stTarget3.sName := 'TARGET3'; stTarget3.fVelocity := fInVelocity; stTarget3.fDelta := fInDelta; stTarget3.fAccel := fAccel; stTarget3.fDecel := fAccel; stTarget3.bMoveOk := TRUE; stTarget4.sName := 'TARGET4'; stTarget4.fVelocity := fInVelocity; stTarget4.fDelta := fInDelta; stTarget4.fAccel := fAccel; stTarget4.fDecel := fAccel; stTarget4.bMoveOk := TRUE; stTarget5.sName := 'TARGET5'; stTarget5.fVelocity := fInVelocity; stTarget5.fDelta := fInDelta; stTarget5.fAccel := fAccel; stTarget5.fDecel := fAccel; stTarget5.bMoveOk := TRUE; stTarget6.sName := 'TARGET6'; stTarget6.fVelocity := fInVelocity; stTarget6.fDelta := fInDelta; stTarget6.fAccel := fAccel; stTarget6.fDecel := fAccel; stTarget6.bMoveOk := TRUE; arrStates[1] := stOut; arrStates[2] := stTarget1; arrStates[3] := stTarget2; arrStates[4] := stTarget3; arrStates[5] := stTarget4; arrStates[6] := stTarget5; arrStates[7] := stTarget6; END_IF setState := enumSet; Exec(); enumGet := getState; enumSet := setState; END_FUNCTION_BLOCK Related: * `ENUM_TM2K2_States`_ PRG_1_PlcTask ^^^^^^^^^^^^^ :: PROGRAM PRG_1_PlcTask VAR bDebug: BOOL := FALSE; END_VAR PRG_2_PMPS_PRE(); // Temporarily disable motors by setting bHardwareEnable to FALSE prior to running motion FB //Main.M5.bHardwareEnable := bDebug; //Main.M6.bHardwareEnable := bDebug; //Main.M7.bHardwareEnable := bDebug; //Main.M8.bHardwareEnable := bDebug; //Main.M9.bHardwareEnable := bDebug; //Main.M10.bHardwareEnable := bDebug; //Main.M11.bHardwareEnable := bDebug; //Main.M12.bHardwareEnable := bDebug; //Main.M13.bHardwareEnable := bDebug; //Main.M14.bHardwareEnable := bDebug; //Main.M15.bHardwareEnable := bDebug; //Main.M16.bHardwareEnable := bDebug; // Note: AT2K2 has its own built-in debugging interface; see PRG_AT2K2_SOLID // and its ``bDebug`` variable. PRG_IM1K1_PPM(); PRG_IM2K1_PPM(); PRG_IM1K2_PPM(); PRG_AL1K2_L2SI(); PRG_IM2K2_PPM(); PRG_IM3K2_PPM(); PRG_IM4K2_PPM(); PRG_TM1K2_ATM(); PRG_LI2K2_K2A(); PRG_PF1K2_WFS(); PRG_IM5K2_PPM(); PRG_TM2K2_ATM(); PRG_AT1K2_SOLID(); PRG_AT2K2_SOLID(); PRG_LI3K2_K2B(); PRG_PF2K2_WFS(); PRG_IM6K2_PPM(); PRG_3_PMPS_POST(); PRG_4_LOG(); END_PROGRAM Related: * `Main`_ * `PRG_2_PMPS_PRE`_ * `PRG_3_PMPS_POST`_ * `PRG_4_LOG`_ * `PRG_AL1K2_L2SI`_ * `PRG_AT1K2_SOLID`_ * `PRG_AT2K2_SOLID`_ * `PRG_IM1K1_PPM`_ * `PRG_IM1K2_PPM`_ * `PRG_IM2K1_PPM`_ * `PRG_IM2K2_PPM`_ * `PRG_IM3K2_PPM`_ * `PRG_IM4K2_PPM`_ * `PRG_IM5K2_PPM`_ * `PRG_IM6K2_PPM`_ * `PRG_LI2K2_K2A`_ * `PRG_LI3K2_K2B`_ * `PRG_PF1K2_WFS`_ * `PRG_PF2K2_WFS`_ * `PRG_TM1K2_ATM`_ * `PRG_TM2K2_ATM`_ PRG_2_PMPS_PRE ^^^^^^^^^^^^^^ :: PROGRAM PRG_2_PMPS_PRE VAR END_VAR END_PROGRAM PRG_3_PMPS_POST ^^^^^^^^^^^^^^^ :: PROGRAM PRG_3_PMPS_POST VAR fbArbiterIO: FB_SubSysToArbiter_IO; bMR1K1_Veto: BOOL; bST1K2_Veto: BOOL; bST1K2_Veto_Override: BOOL := FALSE; fb_vetoArbiter: FB_VetoArbiter; ff2_ff1_link_motion: FB_FastFault := (i_xAutoReset := TRUE, i_DevName := 'FF2 to FF1 Link Motion', i_Desc := 'Please DONT BYPASS ME!! This is virtual FF2 fault, Please check faulting motion devices', i_TypeCode := 16#FFFF); END_VAR bMR1K1_Veto := PMPS_GVL.stCurrentBeamParameters.aVetoDevices[PMPS.K_Stopper.MR1K1_OUT] AND NOT PMPS_GVL.stCurrentBeamParameters.aVetoDevices[PMPS.K_Stopper.MR1K1_IN]; bST1K2_Veto := bST1K2_Veto_Override OR PMPS_GVL.stCurrentBeamParameters.aVetoDevices[PMPS.K_Stopper.ST1K2]; fbArbiterIO( i_bVeto:=bMR1K1_Veto, Arbiter:=GVL.fbArbiter1, fbFFHWO:=GVL.fbFastFaultOutput1); GVL.fbFastFaultOutput1.Execute(i_xVeto:=bMR1K1_Veto); GVL.fbFastFaultOutput2.Execute(i_xVeto:=bMR1K1_Veto OR bST1K2_Veto); //create a preemptive request from Arbiter 2 in Arbiter 1 fb_vetoArbiter(bVeto:= bST1K2_Veto, HigherAuthority := GVL.fbArbiter1, LowerAuthority := GVL.fbArbiter2, FFO := GVL.fbFastFaultOutput2); ff2_ff1_link_motion( io_fbFFHWO := GVL.fbFastFaultOutput1, i_xOK := GVL.fbFastFaultOutput2.q_xFastFaultOut OR bST1K2_Veto); MOTION_GVL.fbStandardPMPSDB( io_fbFFHWO:=GVL.fbFastFaultOutput1, bEnable:=TRUE, sPLCName:='plc-kfe-rix-motion', ); END_PROGRAM Related: * `GVL`_ PRG_4_LOG ^^^^^^^^^ :: PROGRAM PRG_4_LOG VAR fbLogHandler: FB_LogHandler; END_VAR fbLogHandler(); END_PROGRAM PRG_AL1K2_L2SI ^^^^^^^^^^^^^^ :: PROGRAM PRG_AL1K2_L2SI VAR {attribute 'pytmc' := ' pv: AL1K2:L2SI io: io '} {attribute 'TcLinkTo' := '.fbLaser.iLaserINT := TIIB[AL1K2-EL4004-E4]^AO Outputs Channel 1^Analog output; .fbLaser.iShutdownINT := TIIB[AL1K2-EL4004-E4]^AO Outputs Channel 2^Analog output'} fbAL1K2: FB_REF; END_VAR fbAL1K2.stOut.fPosition := -33.5; // Upper limit fbAL1K2.stOut.bUseRawCounts := FALSE; fbAL1K2.stOut.bValid := TRUE; fbAL1K2.stOut.stPMPS.sPmpsState := 'AL1K2:L2SI-OUT'; fbAL1K2.stIn.fPosition := -75; // Current position at time of edit fbAL1K2.stIn.bUseRawCounts := FALSE; fbAL1K2.stIn.bValid := TRUE; fbAL1K2.stIn.stPMPS.sPmpsState := 'AL1K2:L2SI-IN'; fbAL1K2( stYStage := Main.M5, fbArbiter := GVL.fbArbiter2, fbFFHWO := GVL.fbFastFaultOutput2, sPmpsDeviceName := 'AL1K2:L2SI', sTransitionKey := 'AL1K2:L2SI-TRANSITION', ); END_PROGRAM Related: * `GVL`_ * `Main`_ PRG_AT1K2_SOLID ^^^^^^^^^^^^^^^ :: PROGRAM PRG_AT1K2_SOLID VAR (* NOTE: use FALSE for simulation and production *) (* NOTE: use TRUE when relying on visualization + actual hardware *) bDebug : BOOL := FALSE; nEnableMode : ENUM_StageEnableMode; {attribute 'pytmc' := ' pv: AT1K2:L2SI:MMS:01 '} {attribute 'TcLinkTo' := ' .fbRTD_1.iRaw := TIIB[AT1K2-EL3202-01]^RTD Inputs Channel 1^Value; .fbRTD_1.bError := TIIB[AT1K2-EL3202-01]^RTD Inputs Channel 1^Status^Error; .fbRTD_1.bUnderrange := TIIB[AT1K2-EL3202-01]^RTD Inputs Channel 1^Status^Underrange; .fbRTD_1.bOverrange := TIIB[AT1K2-EL3202-01]^RTD Inputs Channel 1^Status^Overrange; .fbRTD_2.iRaw := TIIB[AT1K2-EL3202-01]^RTD Inputs Channel 2^Value; .fbRTD_2.bError := TIIB[AT1K2-EL3202-01]^RTD Inputs Channel 2^Status^Error; .fbRTD_2.bUnderrange := TIIB[AT1K2-EL3202-01]^RTD Inputs Channel 2^Status^Underrange; .fbRTD_2.bOverrange := TIIB[AT1K2-EL3202-01]^RTD Inputs Channel 2^Status^Overrange; '} fbStage1: FB_SXR_SATT_Stage; {attribute 'pytmc' := 'pv: AT1K2:L2SI:MMS:02'} {attribute 'TcLinkTo' := ' .fbRTD_1.iRaw := TIIB[AT1K2-EL3202-02]^RTD Inputs Channel 1^Value; .fbRTD_1.bError := TIIB[AT1K2-EL3202-02]^RTD Inputs Channel 1^Status^Error; .fbRTD_1.bUnderrange := TIIB[AT1K2-EL3202-02]^RTD Inputs Channel 1^Status^Underrange; .fbRTD_1.bOverrange := TIIB[AT1K2-EL3202-02]^RTD Inputs Channel 1^Status^Overrange; .fbRTD_2.iRaw := TIIB[AT1K2-EL3202-02]^RTD Inputs Channel 2^Value; .fbRTD_2.bError := TIIB[AT1K2-EL3202-02]^RTD Inputs Channel 2^Status^Error; .fbRTD_2.bUnderrange := TIIB[AT1K2-EL3202-02]^RTD Inputs Channel 2^Status^Underrange; .fbRTD_2.bOverrange := TIIB[AT1K2-EL3202-02]^RTD Inputs Channel 2^Status^Overrange; '} fbStage2: FB_SXR_SATT_Stage; {attribute 'pytmc' := 'pv: AT1K2:L2SI:MMS:03'} fbStage3: FB_AT1K2; END_VAR VAR CONSTANT DEFAULT_VELOCITY : LREAL := 1; END_VAR IF bDebug THEN // NEVER: checkouts with the TwinCAT NC GUI. nEnableMode := ENUM_StageEnableMode.NEVER; ELSE // ALWAYS: want active position correction at all times nEnableMode := ENUM_StageEnableMode.ALWAYS; END_IF (* Solid Attenuator notes AT1K2 is JJ-xray SN-11343. JJ Label EPICS Stage NC Location 10XX 1 MMS:01 fbStage1 M25 Upstream-most 10XX 2 MMS:02 fbStage2 M26 Downstream-most 10XX 3 MMS:03 fbStage3 M27 Mirror Insertion Stage *) (* State setup - stage 1 *) fbStage1.stOut.sName := 'Out'; fbStage1.stOut.fPosition := 66.00; fbStage1.stOut.fDelta := 0.2; fbStage1.stOut.fVelocity := DEFAULT_VELOCITY; fbStage1.stOut.bValid := TRUE; fbStage1.stOut.bMoveOk := TRUE; fbStage1.stFilter1.sName := 'Filter 1'; fbStage1.stFilter1.fPosition := 500.0; fbStage1.stFilter1.fDelta := 0.2; fbStage1.stFilter1.fVelocity := DEFAULT_VELOCITY; fbStage1.stFilter1.bValid := FALSE; fbStage1.stFilter1.bMoveOk := FALSE; fbStage1.arrFilters[1].fFilterThickness_um := 0; fbStage1.arrFilters[1].sFilterMaterial := ''; fbStage1.stFilter2.sName := 'Filter 2'; fbStage1.stFilter2.fPosition := 500.0; fbStage1.stFilter2.fDelta := 0.2; fbStage1.stFilter2.fVelocity := DEFAULT_VELOCITY; fbStage1.stFilter2.bValid := FALSE; fbStage1.stFilter2.bMoveOk := FALSE; fbStage1.arrFilters[2].fFilterThickness_um := 0; fbStage1.arrFilters[2].sFilterMaterial := ''; fbStage1.stFilter3.sName := '(3) 11.5 um Al'; fbStage1.stFilter3.fPosition := 75.0; fbStage1.stFilter3.fDelta := 0.2; fbStage1.stFilter3.fVelocity := DEFAULT_VELOCITY; fbStage1.stFilter3.bValid := TRUE; fbStage1.stFilter3.bMoveOk := TRUE; fbStage1.arrFilters[3].fFilterThickness_um := 11.5; fbStage1.arrFilters[3].sFilterMaterial := 'Al'; fbStage1.stFilter4.sName := '(4) 6.18 um Al'; fbStage1.stFilter4.fPosition := 90.5; fbStage1.stFilter4.fDelta := 0.2; fbStage1.stFilter4.fVelocity := DEFAULT_VELOCITY; fbStage1.stFilter4.bValid := TRUE; fbStage1.stFilter4.bMoveOk := TRUE; fbStage1.arrFilters[4].fFilterThickness_um := 6.18; fbStage1.arrFilters[4].sFilterMaterial := 'Al'; fbStage1.stFilter5.sName := '(5) 2.85 um Al'; fbStage1.stFilter5.fPosition := 105.5; fbStage1.stFilter5.fDelta := 0.2; fbStage1.stFilter5.fVelocity := DEFAULT_VELOCITY; fbStage1.stFilter5.bValid := TRUE; fbStage1.stFilter5.bMoveOk := TRUE; fbStage1.arrFilters[5].fFilterThickness_um := 2.85; fbStage1.arrFilters[5].sFilterMaterial := 'Al'; fbStage1.stFilter6.sName := '(6) 1.52 um Al'; fbStage1.stFilter6.fPosition := 122.0; fbStage1.stFilter6.fDelta := 0.2; fbStage1.stFilter6.fVelocity := DEFAULT_VELOCITY; fbStage1.stFilter6.bValid := TRUE; fbStage1.stFilter6.bMoveOk := TRUE; fbStage1.arrFilters[6].fFilterThickness_um := 1.52; fbStage1.arrFilters[6].sFilterMaterial := 'Al'; fbStage1.stFilter7.sName := '(7) 0.78 um Al'; fbStage1.stFilter7.fPosition := 136.5; fbStage1.stFilter7.fDelta := 0.2; fbStage1.stFilter7.fVelocity := DEFAULT_VELOCITY; fbStage1.stFilter7.bValid := TRUE; fbStage1.stFilter7.bMoveOk := TRUE; fbStage1.arrFilters[7].fFilterThickness_um := 0.78; fbStage1.arrFilters[7].sFilterMaterial := 'Al'; fbStage1.stFilter8.sName := '(8) 0.39 um Al'; fbStage1.stFilter8.fPosition := 152.2; fbStage1.stFilter8.fDelta := 0.2; fbStage1.stFilter8.fVelocity := DEFAULT_VELOCITY; fbStage1.stFilter8.bValid := TRUE; fbStage1.stFilter8.bMoveOk := TRUE; fbStage1.arrFilters[8].fFilterThickness_um := 0.39; fbStage1.arrFilters[8].sFilterMaterial := 'Al'; fbStage1(stAxis:=Main.M25, nEnableMode:=nEnableMode, fbFFHWO:=GVL.fbFastFaultOutput2); (* State setup - stage 2 *) fbStage2.stOut.sName := 'Out'; fbStage2.stOut.fPosition := 66.00; fbStage2.stOut.fDelta := 0.2; fbStage2.stOut.fVelocity := DEFAULT_VELOCITY; fbStage2.stOut.bValid := TRUE; fbStage2.stOut.bMoveOk := TRUE; fbStage2.stFilter1.sName := 'Filter 1'; fbStage2.stFilter1.fPosition := 500.0; fbStage2.stFilter1.fDelta := 0.2; fbStage2.stFilter1.fVelocity := DEFAULT_VELOCITY; fbStage2.stFilter1.bValid := FALSE; fbStage2.stFilter1.bMoveOk := FALSE; fbStage2.arrFilters[1].fFilterThickness_um := 0; fbStage2.arrFilters[1].sFilterMaterial := ''; fbStage2.stFilter2.sName := 'Filter 2'; fbStage2.stFilter2.fPosition := 500.0; fbStage2.stFilter2.fDelta := 0.2; fbStage2.stFilter2.fVelocity := DEFAULT_VELOCITY; fbStage2.stFilter2.bValid := FALSE; fbStage2.stFilter2.bMoveOk := FALSE; fbStage2.arrFilters[2].fFilterThickness_um := 0; fbStage2.arrFilters[2].sFilterMaterial := ''; fbStage2.stFilter3.sName := '(3) 11.5 um Al'; fbStage2.stFilter3.fPosition := 75.0; fbStage2.stFilter3.fDelta := 0.2; fbStage2.stFilter3.fVelocity := DEFAULT_VELOCITY; fbStage2.stFilter3.bValid := TRUE; fbStage2.stFilter3.bMoveOk := TRUE; fbStage2.arrFilters[3].fFilterThickness_um := 11.5; fbStage2.arrFilters[3].sFilterMaterial := 'Al'; fbStage2.stFilter4.sName := '(4) 6.18 um Al'; fbStage2.stFilter4.fPosition := 90.5; fbStage2.stFilter4.fDelta := 0.2; fbStage2.stFilter4.fVelocity := DEFAULT_VELOCITY; fbStage2.stFilter4.bValid := TRUE; fbStage2.stFilter4.bMoveOk := TRUE; fbStage2.arrFilters[4].fFilterThickness_um := 6.18; fbStage2.arrFilters[4].sFilterMaterial := 'Al'; fbStage2.stFilter5.sName := '(5) 1.52 um Al'; fbStage2.stFilter5.fPosition := 105.5; fbStage2.stFilter5.fDelta := 0.2; fbStage2.stFilter5.fVelocity := DEFAULT_VELOCITY; fbStage2.stFilter5.bValid := TRUE; fbStage2.stFilter5.bMoveOk := TRUE; fbStage2.arrFilters[5].fFilterThickness_um := 1.52; fbStage2.arrFilters[5].sFilterMaterial := 'Al'; fbStage2.stFilter6.sName := '(6) 0.78 um Al'; fbStage2.stFilter6.fPosition := 122.0; fbStage2.stFilter6.fDelta := 0.2; fbStage2.stFilter6.fVelocity := DEFAULT_VELOCITY; fbStage2.stFilter6.bValid := TRUE; fbStage2.stFilter6.bMoveOk := TRUE; fbStage2.arrFilters[6].fFilterThickness_um := 0.78; fbStage2.arrFilters[6].sFilterMaterial := 'Al'; fbStage2.stFilter7.sName := '(7) 0.39 um Al'; fbStage2.stFilter7.fPosition := 136.5; fbStage2.stFilter7.fDelta := 0.2; fbStage2.stFilter7.fVelocity := DEFAULT_VELOCITY; fbStage2.stFilter7.bValid := TRUE; fbStage2.stFilter7.bMoveOk := TRUE; fbStage2.arrFilters[7].fFilterThickness_um := 0.39; fbStage2.arrFilters[7].sFilterMaterial := 'Al'; fbStage2.stFilter8.sName := '(8) 0.2 um Al'; fbStage2.stFilter8.fPosition := 152.2; fbStage2.stFilter8.fDelta := 0.2; fbStage2.stFilter8.fVelocity := DEFAULT_VELOCITY; fbStage2.stFilter8.bValid := TRUE; fbStage2.stFilter8.bMoveOk := TRUE; fbStage2.arrFilters[8].fFilterThickness_um := 0.2; fbStage2.arrFilters[8].sFilterMaterial := 'Al'; fbStage2(stAxis:=Main.M26, nEnableMode:=nEnableMode, fbFFHWO:=GVL.fbFastFaultOutput2); (* State setup - stage 3 *) fbStage3.stOut.sName := 'Out'; fbStage3.stOut.fPosition := 65.00; fbStage3.stOut.fDelta := 0.2; fbStage3.stOut.fVelocity := DEFAULT_VELOCITY; fbStage3.stOut.bValid := TRUE; fbStage3.stOut.bMoveOk := TRUE; fbStage3.stIn.sName := 'In'; fbStage3.stIn.fPosition := 25.00; fbStage3.stIn.fDelta := 0.2; fbStage3.stIn.fVelocity := DEFAULT_VELOCITY; fbStage3.stIn.bValid := TRUE; fbStage3.stIn.bMoveOk := TRUE; fbStage3(stAxis:=Main.M27, fbFFHWO:=GVL.fbFastFaultOutput2); GVL.rCurTrans[PMPS.K_Attenuators.AT1K2].nTran := LREAL_TO_REAL( fbStage1.fTransmission * fbStage2.fTransmission * fbStage3.fTransmission ); END_PROGRAM Related: * `FB_AT1K2`_ * `FB_SXR_SATT_Stage`_ * `GVL`_ * `Main`_ PRG_AT2K2_SOLID ^^^^^^^^^^^^^^^ :: PROGRAM PRG_AT2K2_SOLID VAR (* NOTE: use FALSE for simulation and production *) (* NOTE: use TRUE when relying on visualization + actual hardware *) bDebug : BOOL := FALSE; nEnableMode : ENUM_StageEnableMode; {attribute 'pytmc' := ' pv: AT2K2:L2SI:MMS:01 '} {attribute 'TcLinkTo' := ' .fbRTD_1.iRaw := TIIB[AT2K2-EL3202-04]^RTD Inputs Channel 1^Value; .fbRTD_1.bError := TIIB[AT2K2-EL3202-04]^RTD Inputs Channel 1^Status^Error; .fbRTD_1.bUnderrange := TIIB[AT2K2-EL3202-04]^RTD Inputs Channel 1^Status^Underrange; .fbRTD_1.bOverrange := TIIB[AT2K2-EL3202-04]^RTD Inputs Channel 1^Status^Overrange; .fbRTD_2.iRaw := TIIB[AT2K2-EL3202-04]^RTD Inputs Channel 2^Value; .fbRTD_2.bError := TIIB[AT2K2-EL3202-04]^RTD Inputs Channel 2^Status^Error; .fbRTD_2.bUnderrange := TIIB[AT2K2-EL3202-04]^RTD Inputs Channel 2^Status^Underrange; .fbRTD_2.bOverrange := TIIB[AT2K2-EL3202-04]^RTD Inputs Channel 2^Status^Overrange; '} fbStage1: FB_SXR_SATT_Stage; {attribute 'pytmc' := 'pv: AT2K2:L2SI:MMS:02'} {attribute 'TcLinkTo' := ' .fbRTD_1.iRaw := TIIB[AT2K2-EL3202-03]^RTD Inputs Channel 1^Value; .fbRTD_1.bError := TIIB[AT2K2-EL3202-03]^RTD Inputs Channel 1^Status^Error; .fbRTD_1.bUnderrange := TIIB[AT2K2-EL3202-03]^RTD Inputs Channel 1^Status^Underrange; .fbRTD_1.bOverrange := TIIB[AT2K2-EL3202-03]^RTD Inputs Channel 1^Status^Overrange; .fbRTD_2.iRaw := TIIB[AT2K2-EL3202-03]^RTD Inputs Channel 2^Value; .fbRTD_2.bError := TIIB[AT2K2-EL3202-03]^RTD Inputs Channel 2^Status^Error; .fbRTD_2.bUnderrange := TIIB[AT2K2-EL3202-03]^RTD Inputs Channel 2^Status^Underrange; .fbRTD_2.bOverrange := TIIB[AT2K2-EL3202-03]^RTD Inputs Channel 2^Status^Overrange; '} fbStage2: FB_SXR_SATT_Stage; {attribute 'pytmc' := 'pv: AT2K2:L2SI:MMS:03'} {attribute 'TcLinkTo' := ' .fbRTD_1.iRaw := TIIB[AT2K2-EL3202-02]^RTD Inputs Channel 1^Value; .fbRTD_1.bError := TIIB[AT2K2-EL3202-02]^RTD Inputs Channel 1^Status^Error; .fbRTD_1.bUnderrange := TIIB[AT2K2-EL3202-02]^RTD Inputs Channel 1^Status^Underrange; .fbRTD_1.bOverrange := TIIB[AT2K2-EL3202-02]^RTD Inputs Channel 1^Status^Overrange; .fbRTD_2.iRaw := TIIB[AT2K2-EL3202-02]^RTD Inputs Channel 2^Value; .fbRTD_2.bError := TIIB[AT2K2-EL3202-02]^RTD Inputs Channel 2^Status^Error; .fbRTD_2.bUnderrange := TIIB[AT2K2-EL3202-02]^RTD Inputs Channel 2^Status^Underrange; .fbRTD_2.bOverrange := TIIB[AT2K2-EL3202-02]^RTD Inputs Channel 2^Status^Overrange; '} fbStage3: FB_SXR_SATT_Stage; {attribute 'pytmc' := 'pv: AT2K2:L2SI:MMS:04'} {attribute 'TcLinkTo' := ' .fbRTD_1.iRaw := TIIB[AT2K2-EL3202-01]^RTD Inputs Channel 1^Value; .fbRTD_1.bError := TIIB[AT2K2-EL3202-01]^RTD Inputs Channel 1^Status^Error; .fbRTD_1.bUnderrange := TIIB[AT2K2-EL3202-01]^RTD Inputs Channel 1^Status^Underrange; .fbRTD_1.bOverrange := TIIB[AT2K2-EL3202-01]^RTD Inputs Channel 1^Status^Overrange; .fbRTD_2.iRaw := TIIB[AT2K2-EL3202-01]^RTD Inputs Channel 2^Value; .fbRTD_2.bError := TIIB[AT2K2-EL3202-01]^RTD Inputs Channel 2^Status^Error; .fbRTD_2.bUnderrange := TIIB[AT2K2-EL3202-01]^RTD Inputs Channel 2^Status^Underrange; .fbRTD_2.bOverrange := TIIB[AT2K2-EL3202-01]^RTD Inputs Channel 2^Status^Overrange; '} fbStage4: FB_SXR_SATT_Stage; END_VAR VAR CONSTANT DEFAULT_VELOCITY : LREAL := 1; END_VAR IF bDebug THEN // NEVER: checkouts with the TwinCAT NC GUI. nEnableMode := ENUM_StageEnableMode.NEVER; ELSE // ALWAYS: want active position correction at all times nEnableMode := ENUM_StageEnableMode.ALWAYS; END_IF (* Solid Attenuator notes AT2K2 is JJ-xray SN-11343. JJ Label EPICS Stage NC Location 1087 1 MMS:01 fbStage1 M17 Upstream-most 1088 2 MMS:02 fbStage2 M18 1086 3 MMS:03 fbStage3 M19 1089 4 MMS:04 fbStage4 M20 Downstream-most *) (* State setup - stage 1 *) fbStage1.stOut.sName := 'Out'; fbStage1.stOut.fPosition := 27.00; fbStage1.stOut.fDelta := 0.2; fbStage1.stOut.fVelocity := DEFAULT_VELOCITY; fbStage1.stOut.bValid := TRUE; fbStage1.stOut.bMoveOk := TRUE; fbStage1.stFilter1.sName := 'Filter 1'; fbStage1.stFilter1.fPosition := 500.0; fbStage1.stFilter1.fDelta := 0.2; fbStage1.stFilter1.fVelocity := DEFAULT_VELOCITY; fbStage1.stFilter1.bValid := FALSE; fbStage1.stFilter1.bMoveOk := FALSE; fbStage1.arrFilters[1].fFilterThickness_um := 0; fbStage1.arrFilters[1].sFilterMaterial := ''; fbStage1.stFilter2.sName := 'Filter 2'; fbStage1.stFilter2.fPosition := 500.0; fbStage1.stFilter2.fDelta := 0.2; fbStage1.stFilter2.fVelocity := DEFAULT_VELOCITY; fbStage1.stFilter2.bValid := FALSE; fbStage1.stFilter2.bMoveOk := FALSE; fbStage1.arrFilters[2].fFilterThickness_um := 0; fbStage1.arrFilters[2].sFilterMaterial := ''; fbStage1.stFilter3.sName := 'Filter 3'; fbStage1.stFilter3.fPosition := 500.0; fbStage1.stFilter3.fDelta := 0.2; fbStage1.stFilter3.fVelocity := DEFAULT_VELOCITY; fbStage1.stFilter3.bValid := FALSE; fbStage1.stFilter3.bMoveOk := FALSE; fbStage1.arrFilters[3].fFilterThickness_um := 0; fbStage1.arrFilters[3].sFilterMaterial := ''; fbStage1.stFilter4.sName := 'Filter 4'; fbStage1.stFilter4.fPosition := 500.0; fbStage1.stFilter4.fDelta := 0.2; fbStage1.stFilter4.fVelocity := DEFAULT_VELOCITY; fbStage1.stFilter4.bValid := FALSE; fbStage1.stFilter4.bMoveOk := FALSE; fbStage1.arrFilters[4].fFilterThickness_um := 0; fbStage1.arrFilters[4].sFilterMaterial := ''; fbStage1.stFilter5.sName := '(5) 11.5 um Al'; fbStage1.stFilter5.fPosition := 103.0; fbStage1.stFilter5.fDelta := 0.2; fbStage1.stFilter5.fVelocity := DEFAULT_VELOCITY; fbStage1.stFilter5.bValid := TRUE; fbStage1.stFilter5.bMoveOk := TRUE; fbStage1.arrFilters[5].fFilterThickness_um := 11.5; fbStage1.arrFilters[5].sFilterMaterial := 'Al'; fbStage1.stFilter6.sName := '(6) 6.18 um Al'; fbStage1.stFilter6.fPosition := 119.0; fbStage1.stFilter6.fDelta := 0.2; fbStage1.stFilter6.fVelocity := DEFAULT_VELOCITY; fbStage1.stFilter6.bValid := TRUE; fbStage1.stFilter6.bMoveOk := TRUE; fbStage1.arrFilters[6].fFilterThickness_um := 6.18; fbStage1.arrFilters[6].sFilterMaterial := 'Al'; fbStage1.stFilter7.sName := '(7) 2.85 um Al'; fbStage1.stFilter7.fPosition := 135.0; fbStage1.stFilter7.fDelta := 0.2; fbStage1.stFilter7.fVelocity := DEFAULT_VELOCITY; fbStage1.stFilter7.bValid := TRUE; fbStage1.stFilter7.bMoveOk := TRUE; fbStage1.arrFilters[7].fFilterThickness_um := 2.85; fbStage1.arrFilters[7].sFilterMaterial := 'Al'; fbStage1.stFilter8.sName := '(8) 1.52 um Al'; fbStage1.stFilter8.fPosition := 150.0; fbStage1.stFilter8.fDelta := 0.2; fbStage1.stFilter8.fVelocity := DEFAULT_VELOCITY; fbStage1.stFilter8.bValid := TRUE; fbStage1.stFilter8.bMoveOk := TRUE; fbStage1.arrFilters[8].fFilterThickness_um := 1.52; fbStage1.arrFilters[8].sFilterMaterial := 'Al'; fbStage1(stAxis:=Main.M17, nEnableMode:=nEnableMode, fbFFHWO:=GVL.fbFastFaultOutput2); (* State setup - stage 2 *) fbStage2.stOut.sName := 'Out'; fbStage2.stOut.fPosition := 27.72; fbStage2.stOut.fDelta := 0.2; fbStage2.stOut.fVelocity := DEFAULT_VELOCITY; fbStage2.stOut.bValid := TRUE; fbStage2.stOut.bMoveOk := TRUE; fbStage2.stFilter1.sName := 'Filter 1'; fbStage2.stFilter1.fPosition := 500.0; fbStage2.stFilter1.fDelta := 0.2; fbStage2.stFilter1.fVelocity := DEFAULT_VELOCITY; fbStage2.stFilter1.bValid := FALSE; fbStage2.stFilter1.bMoveOk := FALSE; fbStage2.arrFilters[1].fFilterThickness_um := 0; fbStage2.arrFilters[1].sFilterMaterial := ''; fbStage2.stFilter2.sName := 'Filter 2'; fbStage2.stFilter2.fPosition := 500.0; fbStage2.stFilter2.fDelta := 0.2; fbStage2.stFilter2.fVelocity := DEFAULT_VELOCITY; fbStage2.stFilter2.bValid := FALSE; fbStage2.stFilter2.bMoveOk := FALSE; fbStage2.arrFilters[2].fFilterThickness_um := 0; fbStage2.arrFilters[2].sFilterMaterial := ''; fbStage2.stFilter3.sName := 'Filter 3'; fbStage2.stFilter3.fPosition := 500.0; fbStage2.stFilter3.fDelta := 0.2; fbStage2.stFilter3.fVelocity := DEFAULT_VELOCITY; fbStage2.stFilter3.bValid := FALSE; fbStage2.stFilter3.bMoveOk := FALSE; fbStage2.arrFilters[3].fFilterThickness_um := 0; fbStage2.arrFilters[3].sFilterMaterial := ''; fbStage2.stFilter4.sName := 'Filter 4'; fbStage2.stFilter4.fPosition := 500.0; fbStage2.stFilter4.fDelta := 0.2; fbStage2.stFilter4.fVelocity := DEFAULT_VELOCITY; fbStage2.stFilter4.bValid := FALSE; fbStage2.stFilter4.bMoveOk := FALSE; fbStage2.arrFilters[4].fFilterThickness_um := 0; fbStage2.arrFilters[4].sFilterMaterial := ''; fbStage2.stFilter5.sName := '(5) 6.18 um Al'; fbStage2.stFilter5.fPosition := 103.0; fbStage2.stFilter5.fDelta := 0.2; fbStage2.stFilter5.fVelocity := DEFAULT_VELOCITY; fbStage2.stFilter5.bValid := TRUE; fbStage2.stFilter5.bMoveOk := TRUE; fbStage2.arrFilters[5].fFilterThickness_um := 6.18; fbStage2.arrFilters[5].sFilterMaterial := 'Al'; fbStage2.stFilter6.sName := '(6) 2.85 um Al'; fbStage2.stFilter6.fPosition := 119.0; fbStage2.stFilter6.fDelta := 0.2; fbStage2.stFilter6.fVelocity := DEFAULT_VELOCITY; fbStage2.stFilter6.bValid := TRUE; fbStage2.stFilter6.bMoveOk := TRUE; fbStage2.arrFilters[6].fFilterThickness_um := 2.85; fbStage2.arrFilters[6].sFilterMaterial := 'Al'; fbStage2.stFilter7.sName := '(7) 1.52 um Al'; fbStage2.stFilter7.fPosition := 135.0; fbStage2.stFilter7.fDelta := 0.2; fbStage2.stFilter7.fVelocity := DEFAULT_VELOCITY; fbStage2.stFilter7.bValid := TRUE; fbStage2.stFilter7.bMoveOk := TRUE; fbStage2.arrFilters[7].fFilterThickness_um := 1.52; fbStage2.arrFilters[7].sFilterMaterial := 'Al'; fbStage2.stFilter8.sName := '(8) 0.78 um Al'; fbStage2.stFilter8.fPosition := 150.0; fbStage2.stFilter8.fDelta := 0.2; fbStage2.stFilter8.fVelocity := DEFAULT_VELOCITY; fbStage2.stFilter8.bValid := TRUE; fbStage2.stFilter8.bMoveOk := TRUE; fbStage2.arrFilters[8].fFilterThickness_um := 0.78; fbStage2.arrFilters[8].sFilterMaterial := 'Al'; fbStage2(stAxis:=Main.M18, nEnableMode:=nEnableMode, fbFFHWO:=GVL.fbFastFaultOutput2); (* State setup - stage 3 *) fbStage3.stOut.sName := 'Out'; fbStage3.stOut.fPosition := 27.00; fbStage3.stOut.fDelta := 0.2; fbStage3.stOut.fVelocity := DEFAULT_VELOCITY; fbStage3.stOut.bValid := TRUE; fbStage3.stOut.bMoveOk := TRUE; fbStage3.stFilter1.sName := 'Filter 1'; fbStage3.stFilter1.fPosition := 500.0; fbStage3.stFilter1.fDelta := 0.2; fbStage3.stFilter1.fVelocity := DEFAULT_VELOCITY; fbStage3.stFilter1.bValid := FALSE; fbStage3.stFilter1.bMoveOk := FALSE; fbStage3.arrFilters[1].fFilterThickness_um := 0; fbStage3.arrFilters[1].sFilterMaterial := ''; fbStage3.stFilter2.sName := 'Filter 2'; fbStage3.stFilter2.fPosition := 500.0; fbStage3.stFilter2.fDelta := 0.2; fbStage3.stFilter2.fVelocity := DEFAULT_VELOCITY; fbStage3.stFilter2.bValid := FALSE; fbStage3.stFilter2.bMoveOk := FALSE; fbStage3.arrFilters[2].fFilterThickness_um := 0; fbStage3.arrFilters[2].sFilterMaterial := ''; fbStage3.stFilter3.sName := 'Filter 3'; fbStage3.stFilter3.fPosition := 500.0; fbStage3.stFilter3.fDelta := 0.2; fbStage3.stFilter3.fVelocity := DEFAULT_VELOCITY; fbStage3.stFilter3.bValid := FALSE; fbStage3.stFilter3.bMoveOk := FALSE; fbStage3.arrFilters[3].fFilterThickness_um := 0; fbStage3.arrFilters[3].sFilterMaterial := ''; fbStage3.stFilter4.sName := 'Filter 4'; fbStage3.stFilter4.fPosition := 500.0; fbStage3.stFilter4.fDelta := 0.2; fbStage3.stFilter4.fVelocity := DEFAULT_VELOCITY; fbStage3.stFilter4.bValid := FALSE; fbStage3.stFilter4.bMoveOk := FALSE; fbStage3.arrFilters[4].fFilterThickness_um := 0; fbStage3.arrFilters[4].sFilterMaterial := ''; fbStage3.stFilter5.sName := '(5) 2.85 um Al'; fbStage3.stFilter5.fPosition := 103.0; fbStage3.stFilter5.fDelta := 0.2; fbStage3.stFilter5.fVelocity := DEFAULT_VELOCITY; fbStage3.stFilter5.bValid := TRUE; fbStage3.stFilter5.bMoveOk := TRUE; fbStage3.arrFilters[5].fFilterThickness_um := 2.85; fbStage3.arrFilters[5].sFilterMaterial := 'Al'; fbStage3.stFilter6.sName := '(6) 1.52 um Al'; fbStage3.stFilter6.fPosition := 119.0; fbStage3.stFilter6.fDelta := 0.2; fbStage3.stFilter6.fVelocity := DEFAULT_VELOCITY; fbStage3.stFilter6.bValid := TRUE; fbStage3.stFilter6.bMoveOk := TRUE; fbStage3.arrFilters[6].fFilterThickness_um := 1.52; fbStage3.arrFilters[6].sFilterMaterial := 'Al'; fbStage3.stFilter7.sName := '(7) 0.78 um Al'; fbStage3.stFilter7.fPosition := 135.0; fbStage3.stFilter7.fDelta := 0.2; fbStage3.stFilter7.fVelocity := DEFAULT_VELOCITY; fbStage3.stFilter7.bValid := TRUE; fbStage3.stFilter7.bMoveOk := TRUE; fbStage3.arrFilters[7].fFilterThickness_um := 0.78; fbStage3.arrFilters[7].sFilterMaterial := 'Al'; fbStage3.stFilter8.sName := '(8) 0.39 um Al'; fbStage3.stFilter8.fPosition := 150.0; fbStage3.stFilter8.fDelta := 0.2; fbStage3.stFilter8.fVelocity := DEFAULT_VELOCITY; fbStage3.stFilter8.bValid := TRUE; fbStage3.stFilter8.bMoveOk := TRUE; fbStage3.arrFilters[8].fFilterThickness_um := 0.39; fbStage3.arrFilters[8].sFilterMaterial := 'Al'; fbStage3(stAxis:=Main.M19, nEnableMode:=nEnableMode, fbFFHWO:=GVL.fbFastFaultOutput2); (* State setup - stage 4 *) fbStage4.stOut.sName := 'Out'; fbStage4.stOut.fPosition := 28.03; fbStage4.stOut.fDelta := 0.2; fbStage4.stOut.fVelocity := DEFAULT_VELOCITY; fbStage4.stOut.bValid := TRUE; fbStage4.stOut.bMoveOk := TRUE; fbStage4.stFilter1.sName := 'Filter 1'; fbStage4.stFilter1.fPosition := 500.0; fbStage4.stFilter1.fDelta := 0.2; fbStage4.stFilter1.fVelocity := DEFAULT_VELOCITY; fbStage4.stFilter1.bValid := FALSE; fbStage4.stFilter1.bMoveOk := FALSE; fbStage4.arrFilters[1].fFilterThickness_um := 0; fbStage4.arrFilters[1].sFilterMaterial := ''; fbStage4.stFilter2.sName := 'Filter 2'; fbStage4.stFilter2.fPosition := 500.0; fbStage4.stFilter2.fDelta := 0.2; fbStage4.stFilter2.fVelocity := DEFAULT_VELOCITY; fbStage4.stFilter2.bValid := FALSE; fbStage4.stFilter2.bMoveOk := FALSE; fbStage4.arrFilters[2].fFilterThickness_um := 0; fbStage4.arrFilters[2].sFilterMaterial := ''; fbStage4.stFilter3.sName := 'Filter 3'; fbStage4.stFilter3.fPosition := 500.0; fbStage4.stFilter3.fDelta := 0.2; fbStage4.stFilter3.fVelocity := DEFAULT_VELOCITY; fbStage4.stFilter3.bValid := FALSE; fbStage4.stFilter3.bMoveOk := FALSE; fbStage4.arrFilters[3].fFilterThickness_um := 0; fbStage4.arrFilters[3].sFilterMaterial := ''; fbStage4.stFilter4.sName := 'Filter 4'; fbStage4.stFilter4.fPosition := 500.0; fbStage4.stFilter4.fDelta := 0.2; fbStage4.stFilter4.fVelocity := DEFAULT_VELOCITY; fbStage4.stFilter4.bValid := FALSE; fbStage4.stFilter4.bMoveOk := FALSE; fbStage4.arrFilters[4].fFilterThickness_um := 0; fbStage4.arrFilters[4].sFilterMaterial := ''; fbStage4.stFilter5.sName := '(5) 1.52 um Al'; fbStage4.stFilter5.fPosition := 103.0; fbStage4.stFilter5.fDelta := 0.2; fbStage4.stFilter5.fVelocity := DEFAULT_VELOCITY; fbStage4.stFilter5.bValid := TRUE; fbStage4.stFilter5.bMoveOk := TRUE; fbStage4.arrFilters[5].fFilterThickness_um := 1.52; fbStage4.arrFilters[5].sFilterMaterial := 'Al'; fbStage4.stFilter6.sName := '(6) 0.78 um Al'; fbStage4.stFilter6.fPosition := 119.0; fbStage4.stFilter6.fDelta := 0.2; fbStage4.stFilter6.fVelocity := DEFAULT_VELOCITY; fbStage4.stFilter6.bValid := TRUE; fbStage4.stFilter6.bMoveOk := TRUE; fbStage4.arrFilters[6].fFilterThickness_um := 0.78; fbStage4.arrFilters[6].sFilterMaterial := 'Al'; fbStage4.stFilter7.sName := '(7) 0.39 um Al'; fbStage4.stFilter7.fPosition := 135.0; fbStage4.stFilter7.fDelta := 0.2; fbStage4.stFilter7.fVelocity := DEFAULT_VELOCITY; fbStage4.stFilter7.bValid := TRUE; fbStage4.stFilter7.bMoveOk := TRUE; fbStage4.arrFilters[7].fFilterThickness_um := 0.39; fbStage4.arrFilters[7].sFilterMaterial := 'Al'; fbStage4.stFilter8.sName := '(8) 0.20 um Al'; fbStage4.stFilter8.fPosition := 150.0; fbStage4.stFilter8.fDelta := 0.2; fbStage4.stFilter8.fVelocity := DEFAULT_VELOCITY; fbStage4.stFilter8.bValid := TRUE; fbStage4.stFilter8.bMoveOk := TRUE; fbStage4.arrFilters[8].fFilterThickness_um := 0.20; fbStage4.arrFilters[8].sFilterMaterial := 'Al'; fbStage4(stAxis:=Main.M20, nEnableMode:=nEnableMode, fbFFHWO:=GVL.fbFastFaultOutput2); GVL.rCurTrans[PMPS.K_Attenuators.AT2K2].nTran := LREAL_TO_REAL( fbStage1.fTransmission * fbStage2.fTransmission * fbStage3.fTransmission * fbStage4.fTransmission ); END_PROGRAM Related: * `FB_SXR_SATT_Stage`_ * `GVL`_ * `Main`_ PRG_IM1K1_PPM ^^^^^^^^^^^^^ :: PROGRAM PRG_IM1K1_PPM VAR {attribute 'pytmc' := ' pv: IM1K1:PPM io: io '} {attribute 'TcLinkTo' := '.fbGige.iIlluminatorINT := TIIB[IM1K1-EL4004]^AO Outputs Channel 1^Analog output; .fbGige.bGigePower := TIIB[IM1K1-EL2004]^Channel 2^Output; .fbPowerMeter.iVoltageINT := TIIB[IM1K1-EL3062]^AI Standard Channel 1^Value; .fbPowerMeter.fbThermoCouple.bError := TIIB[IM1K1-EL3314]^TC Inputs Channel 1^Status^Error; .fbPowerMeter.fbThermoCouple.bUnderrange := TIIB[IM1K1-EL3314]^TC Inputs Channel 1^Status^Underrange; .fbPowerMeter.fbThermoCouple.bOverrange := TIIB[IM1K1-EL3314]^TC Inputs Channel 1^Status^Overrange; .fbPowerMeter.fbThermoCouple.iRaw := TIIB[IM1K1-EL3314]^TC Inputs Channel 1^Value; .fbYagThermoCouple.bError := TIIB[IM1K1-EL3314]^TC Inputs Channel 2^Status^Error; .fbYagThermoCouple.bUnderrange := TIIB[IM1K1-EL3314]^TC Inputs Channel 2^Status^Underrange; .fbYagThermoCouple.bOverrange := TIIB[IM1K1-EL3314]^TC Inputs Channel 2^Status^Overrange; .fbYagThermoCouple.iRaw := TIIB[IM1K1-EL3314]^TC Inputs Channel 2^Value'} fbIM1K1: FB_PPM; END_VAR fbIM1K1.stOut.fPosition := -8.82; fbIM1K1.stOut.bUseRawCounts := FALSE; fbIM1K1.stOut.bValid := TRUE; fbIM1K1.stOut.stPMPS.sPmpsState := 'IM1K1:PPM-OUT'; fbIM1K1.stPower.fPosition := -47.92; fbIM1K1.stPower.bUseRawCounts := FALSE; fbIM1K1.stPower.bValid := TRUE; fbIM1K1.stPower.stPMPS.sPmpsState := 'IM1K1:PPM-POWERMETER'; fbIM1K1.stYag1.fPosition := -71.92; fbIM1K1.stYag1.bUseRawCounts := FALSE; fbIM1K1.stYag1.bValid := TRUE; fbIM1K1.stYag1.stPMPS.sPmpsState := 'IM1K1:PPM-YAG1'; fbIM1K1.stYag2.fPosition := -97.93; fbIM1K1.stYag2.bUseRawCounts := FALSE; fbIM1K1.stYag2.bValid := TRUE; fbIM1K1.stYag2.stPMPS.sPmpsState := 'IM1K1:PPM-YAG2'; fbIM1K1( fbArbiter := GVL.fbArbiter1, fbFFHWO := GVL.fbFastFaultOutput1, stYStage := Main.M1, sPmpsDeviceName := 'IM1K1:PPM', sTransitionKey := 'IM1K1:PPM-TRANSITION', ); END_PROGRAM Related: * `GVL`_ * `Main`_ PRG_IM1K2_PPM ^^^^^^^^^^^^^ :: PROGRAM PRG_IM1K2_PPM VAR {attribute 'pytmc' := ' pv: IM1K2:PPM io: io '} {attribute 'TcLinkTo' := '.fbGige.iIlluminatorINT := TIIB[IM1K2-EL4004-E7]^AO Outputs Channel 1^Analog output; .fbGige.bGigePower := TIIB[IM1K2-EL2004-E3]^Channel 2^Output; .fbPowerMeter.iVoltageINT := TIIB[IM1K2-EL3062-E6]^AI Standard Channel 1^Value; .fbPowerMeter.fbThermoCouple.bError := TIIB[IM1K2-EL3314-E4]^TC Inputs Channel 1^Status^Error; .fbPowerMeter.fbThermoCouple.bUnderrange := TIIB[IM1K2-EL3314-E4]^TC Inputs Channel 1^Status^Underrange; .fbPowerMeter.fbThermoCouple.bOverrange := TIIB[IM1K2-EL3314-E4]^TC Inputs Channel 1^Status^Overrange; .fbPowerMeter.fbThermoCouple.iRaw := TIIB[IM1K2-EL3314-E4]^TC Inputs Channel 1^Value; .fbYagThermoCouple.bError := TIIB[IM1K2-EL3314-E4]^TC Inputs Channel 2^Status^Error; .fbYagThermoCouple.bUnderrange := TIIB[IM1K2-EL3314-E4]^TC Inputs Channel 2^Status^Underrange; .fbYagThermoCouple.bOverrange := TIIB[IM1K2-EL3314-E4]^TC Inputs Channel 2^Status^Overrange; .fbYagThermoCouple.iRaw := TIIB[IM1K2-EL3314-E4]^TC Inputs Channel 2^Value'} fbIM1K2: FB_PPM; END_VAR fbIM1K2.stOut.fPosition := -9.82; fbIM1K2.stOut.bUseRawCounts := FALSE; fbIM1K2.stOut.bValid := TRUE; fbIM1K2.stOut.stPMPS.sPmpsState := 'IM1K2:PPM-OUT'; fbIM1K2.stPower.fPosition := -48.92; fbIM1K2.stPower.bUseRawCounts := FALSE; fbIM1K2.stPower.bValid := TRUE; fbIM1K2.stPower.stPMPS.sPmpsState := 'IM1K2:PPM-POWERMETER'; fbIM1K2.stYag1.fPosition := -72.92; fbIM1K2.stYag1.bUseRawCounts := FALSE; fbIM1K2.stYag1.bValid := TRUE; fbIM1K2.stYag1.stPMPS.sPmpsState := 'IM1K2:PPM-YAG1'; fbIM1K2.stYag2.fPosition := -98.93; fbIM1K2.stYag2.bUseRawCounts := FALSE; fbIM1K2.stYag2.bValid := TRUE; fbIM1K2.stYag2.stPMPS.sPmpsState := 'IM1K2:PPM-YAG2'; fbIM1K2( fbArbiter := GVL.fbArbiter1, fbFFHWO := GVL.fbFastFaultOutput1, stYStage := Main.M4, sPmpsDeviceName := 'IM1K2:PPM', sTransitionKey := 'IM1K2:PPM-TRANSITION', ); END_PROGRAM Related: * `GVL`_ * `Main`_ PRG_IM2K1_PPM ^^^^^^^^^^^^^ :: PROGRAM PRG_IM2K1_PPM VAR {attribute 'pytmc' := ' pv: IM2K1:PPM io: io '} {attribute 'TcLinkTo' := '.fbGige.iIlluminatorINT := TIIB[IM2K1-EL4004]^AO Outputs Channel 1^Analog output; .fbGige.bGigePower := TIIB[IM2K1-EL2004]^Channel 2^Output; .fbPowerMeter.iVoltageINT := TIIB[IM2K1-EL3062]^AI Standard Channel 1^Value; .fbPowerMeter.fbThermoCouple.bError := TIIB[IM2K1-EL3314]^TC Inputs Channel 1^Status^Error; .fbPowerMeter.fbThermoCouple.bUnderrange := TIIB[IM2K1-EL3314]^TC Inputs Channel 1^Status^Underrange; .fbPowerMeter.fbThermoCouple.bOverrange := TIIB[IM2K1-EL3314]^TC Inputs Channel 1^Status^Overrange; .fbPowerMeter.fbThermoCouple.iRaw := TIIB[IM2K1-EL3314]^TC Inputs Channel 1^Value; .fbYagThermoCouple.bError := TIIB[IM2K1-EL3314]^TC Inputs Channel 2^Status^Error; .fbYagThermoCouple.bUnderrange := TIIB[IM2K1-EL3314]^TC Inputs Channel 2^Status^Underrange; .fbYagThermoCouple.bOverrange := TIIB[IM2K1-EL3314]^TC Inputs Channel 2^Status^Overrange; .fbYagThermoCouple.iRaw := TIIB[IM2K1-EL3314]^TC Inputs Channel 2^Value'} fbIM2K1: FB_PPM; END_VAR fbIM2K1.stOut.fPosition := -9.09; fbIM2K1.stOut.bUseRawCounts := FALSE; fbIM2K1.stOut.bValid := TRUE; fbIM2K1.stOut.stPMPS.sPmpsState := 'IM2K1:PPM-OUT'; fbIM2K1.stPower.fPosition := -48.19; fbIM2K1.stPower.bUseRawCounts := FALSE; fbIM2K1.stPower.bValid := TRUE; fbIM2K1.stPower.stPMPS.sPmpsState := 'IM2K1:PPM-POWERMETER'; fbIM2K1.stYag1.fPosition := -72.19; fbIM2K1.stYag1.bUseRawCounts := FALSE; fbIM2K1.stYag1.bValid := TRUE; fbIM2K1.stYag1.stPMPS.sPmpsState := 'IM2K1:PPM-YAG1'; fbIM2K1.stYag2.fPosition := -98.2; fbIM2K1.stYag2.bUseRawCounts := FALSE; fbIM2K1.stYag2.bValid := TRUE; fbIM2K1.stYag2.stPMPS.sPmpsState := 'IM2K1:PPM-YAG2'; fbIM2K1( fbArbiter := GVL.fbArbiter1, fbFFHWO := GVL.fbFastFaultOutput1, stYStage := Main.M2, sPmpsDeviceName := 'IM2K1:PPM', sTransitionKey := 'IM2K1:PPM-TRANSITION', ); END_PROGRAM Related: * `GVL`_ * `Main`_ PRG_IM2K2_PPM ^^^^^^^^^^^^^ :: PROGRAM PRG_IM2K2_PPM VAR {attribute 'pytmc' := ' pv: IM2K2:PPM io: io '} {attribute 'TcLinkTo' := '.fbGige.iIlluminatorINT := TIIB[IM2K2-EL4004-E7]^AO Outputs Channel 1^Analog output; .fbGige.bGigePower := TIIB[IM2K2-EL2004-E3]^Channel 2^Output; .fbPowerMeter.iVoltageINT := TIIB[IM2K2-EL3062-E6]^AI Standard Channel 1^Value; .fbPowerMeter.fbThermoCouple.bError := TIIB[IM2K2-EL3314-E4]^TC Inputs Channel 1^Status^Error; .fbPowerMeter.fbThermoCouple.bUnderrange := TIIB[IM2K2-EL3314-E4]^TC Inputs Channel 1^Status^Underrange; .fbPowerMeter.fbThermoCouple.bOverrange := TIIB[IM2K2-EL3314-E4]^TC Inputs Channel 1^Status^Overrange; .fbPowerMeter.fbThermoCouple.iRaw := TIIB[IM2K2-EL3314-E4]^TC Inputs Channel 1^Value; .fbYagThermoCouple.bError := TIIB[IM2K2-EL3314-E4]^TC Inputs Channel 2^Status^Error; .fbYagThermoCouple.bUnderrange := TIIB[IM2K2-EL3314-E4]^TC Inputs Channel 2^Status^Underrange; .fbYagThermoCouple.bOverrange := TIIB[IM2K2-EL3314-E4]^TC Inputs Channel 2^Status^Overrange; .fbYagThermoCouple.iRaw := TIIB[IM2K2-EL3314-E4]^TC Inputs Channel 2^Value'} fbIM2K2: FB_PPM; END_VAR fbIM2K2.stOut.fPosition := -8.49; fbIM2K2.stOut.bUseRawCounts := FALSE; fbIM2K2.stOut.bValid := TRUE; fbIM2K2.stOut.stPMPS.sPmpsState := 'IM2K2:PPM-OUT'; fbIM2K2.stPower.fPosition := -47.59; fbIM2K2.stPower.bUseRawCounts := FALSE; fbIM2K2.stPower.bValid := TRUE; fbIM2K2.stPower.stPMPS.sPmpsState := 'IM2K2:PPM-POWERMETER'; fbIM2K2.stYag1.fPosition := -71.59; fbIM2K2.stYag1.bUseRawCounts := FALSE; fbIM2K2.stYag1.bValid := TRUE; fbIM2K2.stYag1.stPMPS.sPmpsState := 'IM2K2:PPM-YAG1'; fbIM2K2.stYag2.fPosition := -97.60; fbIM2K2.stYag2.bUseRawCounts := FALSE; fbIM2K2.stYag2.bValid := TRUE; fbIM2K2.stYag2.stPMPS.sPmpsState := 'IM2K2:PPM-YAG2'; fbIM2K2( fbArbiter := GVL.fbArbiter2, fbFFHWO := GVL.fbFastFaultOutput2, stYStage := Main.M6, sPmpsDeviceName := 'IM2K2:PPM', sTransitionKey := 'IM2K2:PPM-TRANSITION', ); END_PROGRAM Related: * `GVL`_ * `Main`_ PRG_IM3K2_PPM ^^^^^^^^^^^^^ :: PROGRAM PRG_IM3K2_PPM VAR {attribute 'pytmc' := ' pv: IM3K2:PPM io: io '} {attribute 'TcLinkTo' := '.fbGige.iIlluminatorINT := TIIB[IM3K2-EL4004-E7]^AO Outputs Channel 1^Analog output; .fbGige.bGigePower := TIIB[IM3K2-EL2004-E3]^Channel 2^Output; .fbPowerMeter.iVoltageINT := TIIB[IM3K2-EL3062-E6]^AI Standard Channel 1^Value; .fbPowerMeter.fbThermoCouple.bError := TIIB[IM3K2-EL3314-E4]^TC Inputs Channel 1^Status^Error; .fbPowerMeter.fbThermoCouple.bUnderrange := TIIB[IM3K2-EL3314-E4]^TC Inputs Channel 1^Status^Underrange; .fbPowerMeter.fbThermoCouple.bOverrange := TIIB[IM3K2-EL3314-E4]^TC Inputs Channel 1^Status^Overrange; .fbPowerMeter.fbThermoCouple.iRaw := TIIB[IM3K2-EL3314-E4]^TC Inputs Channel 1^Value; .fbYagThermoCouple.bError := TIIB[IM3K2-EL3314-E4]^TC Inputs Channel 2^Status^Error; .fbYagThermoCouple.bUnderrange := TIIB[IM3K2-EL3314-E4]^TC Inputs Channel 2^Status^Underrange; .fbYagThermoCouple.bOverrange := TIIB[IM3K2-EL3314-E4]^TC Inputs Channel 2^Status^Overrange; .fbYagThermoCouple.iRaw := TIIB[IM3K2-EL3314-E4]^TC Inputs Channel 2^Value'} fbIM3K2: FB_PPM; END_VAR fbIM3K2.stOut.fPosition := -9.61; fbIM3K2.stOut.bUseRawCounts := FALSE; fbIM3K2.stOut.bValid := TRUE; fbIM3K2.stOut.stPMPS.sPmpsState := 'IM3K2:PPM-OUT'; fbIM3K2.stPower.fPosition := -48.71; fbIM3K2.stPower.bUseRawCounts := FALSE; fbIM3K2.stPower.bValid := TRUE; fbIM3K2.stPower.stPMPS.sPmpsState := 'IM3K2:PPM-POWERMETER'; fbIM3K2.stYag1.fPosition := -72.71; fbIM3K2.stYag1.bUseRawCounts := FALSE; fbIM3K2.stYag1.bValid := TRUE; fbIM3K2.stYag1.stPMPS.sPmpsState := 'IM3K2:PPM-YAG1'; fbIM3K2.stYag2.fPosition := -98.72; fbIM3K2.stYag2.bUseRawCounts := FALSE; fbIM3K2.stYag2.bValid := TRUE; fbIM3K2.stYag2.stPMPS.sPmpsState := 'IM3K2:PPM-YAG2'; fbIM3K2( fbArbiter := GVL.fbArbiter2, fbFFHWO := GVL.fbFastFaultOutput2, stYStage := Main.M7, sPmpsDeviceName := 'IM3K2:PPM', sTransitionKey := 'IM3K2:PPM-TRANSITION', ); END_PROGRAM Related: * `GVL`_ * `Main`_ PRG_IM4K2_PPM ^^^^^^^^^^^^^ :: PROGRAM PRG_IM4K2_PPM VAR {attribute 'pytmc' := ' pv: IM4K2:PPM io: io '} {attribute 'TcLinkTo' := '.fbGige.iIlluminatorINT := TIIB[IM4K2-EL4004-E7]^AO Outputs Channel 1^Analog output; .fbGige.bGigePower := TIIB[IM4K2-EL2004-E3]^Channel 2^Output; .fbPowerMeter.iVoltageINT := TIIB[IM4K2-EL3062-E6]^AI Standard Channel 1^Value; .fbPowerMeter.fbThermoCouple.bError := TIIB[IM4K2-EL3314-E4]^TC Inputs Channel 1^Status^Error; .fbPowerMeter.fbThermoCouple.bUnderrange := TIIB[IM4K2-EL3314-E4]^TC Inputs Channel 1^Status^Underrange; .fbPowerMeter.fbThermoCouple.bOverrange := TIIB[IM4K2-EL3314-E4]^TC Inputs Channel 1^Status^Overrange; .fbPowerMeter.fbThermoCouple.iRaw := TIIB[IM4K2-EL3314-E4]^TC Inputs Channel 1^Value; .fbYagThermoCouple.bError := TIIB[IM4K2-EL3314-E4]^TC Inputs Channel 2^Status^Error; .fbYagThermoCouple.bUnderrange := TIIB[IM4K2-EL3314-E4]^TC Inputs Channel 2^Status^Underrange; .fbYagThermoCouple.bOverrange := TIIB[IM4K2-EL3314-E4]^TC Inputs Channel 2^Status^Overrange; .fbYagThermoCouple.iRaw := TIIB[IM4K2-EL3314-E4]^TC Inputs Channel 2^Value'} fbIM4K2: FB_PPM; END_VAR fbIM4K2.stOut.fPosition := -10.80; fbIM4K2.stOut.bUseRawCounts := FALSE; fbIM4K2.stOut.bValid := TRUE; fbIM4K2.stOut.stPMPS.sPmpsState := 'IM4K2:PPM-OUT'; fbIM4K2.stPower.fPosition := -49.90; fbIM4K2.stPower.bUseRawCounts := FALSE; fbIM4K2.stPower.bValid := TRUE; fbIM4K2.stPower.stPMPS.sPmpsState := 'IM4K2:PPM-POWERMETER'; fbIM4K2.stYag1.fPosition := -73.90; fbIM4K2.stYag1.bUseRawCounts := FALSE; fbIM4K2.stYag1.bValid := TRUE; fbIM4K2.stYag1.stPMPS.sPmpsState := 'IM4K2:PPM-YAG1'; fbIM4K2.stYag2.fPosition := -99.91; fbIM4K2.stYag2.bUseRawCounts := FALSE; fbIM4K2.stYag2.bValid := TRUE; fbIM4K2.stYag2.stPMPS.sPmpsState := 'IM4K2:PPM-YAG2'; fbIM4K2( fbArbiter := GVL.fbArbiter2, fbFFHWO := GVL.fbFastFaultOutput2, stYStage := Main.M8, sPmpsDeviceName := 'IM4K2:PPM', sTransitionKey := 'IM4K2:PPM-TRANSITION', ); END_PROGRAM Related: * `GVL`_ * `Main`_ PRG_IM5K2_PPM ^^^^^^^^^^^^^ :: PROGRAM PRG_IM5K2_PPM VAR {attribute 'pytmc' := ' pv: IM5K2:PPM io: io '} {attribute 'TcLinkTo' := '.fbGige.iIlluminatorINT := TIIB[IM5K2-EL4004-E7]^AO Outputs Channel 1^Analog output; .fbGige.bGigePower := TIIB[IM5K2-EL2004-E3]^Channel 2^Output; .fbPowerMeter.iVoltageINT := TIIB[IM5K2-EL3062-E6]^AI Standard Channel 1^Value; .fbPowerMeter.fbThermoCouple.bError := TIIB[IM5K2-EL3314-E4]^TC Inputs Channel 1^Status^Error; .fbPowerMeter.fbThermoCouple.bUnderrange := TIIB[IM5K2-EL3314-E4]^TC Inputs Channel 1^Status^Underrange; .fbPowerMeter.fbThermoCouple.bOverrange := TIIB[IM5K2-EL3314-E4]^TC Inputs Channel 1^Status^Overrange; .fbPowerMeter.fbThermoCouple.iRaw := TIIB[IM5K2-EL3314-E4]^TC Inputs Channel 1^Value; .fbYagThermoCouple.bError := TIIB[IM5K2-EL3314-E4]^TC Inputs Channel 2^Status^Error; .fbYagThermoCouple.bUnderrange := TIIB[IM5K2-EL3314-E4]^TC Inputs Channel 2^Status^Underrange; .fbYagThermoCouple.bOverrange := TIIB[IM5K2-EL3314-E4]^TC Inputs Channel 2^Status^Overrange; .fbYagThermoCouple.iRaw := TIIB[IM5K2-EL3314-E4]^TC Inputs Channel 2^Value'} fbIM5K2: FB_PPM; END_VAR fbIM5K2.stOut.fPosition := -8.92; fbIM5K2.stOut.bUseRawCounts := FALSE; fbIM5K2.stOut.bValid := TRUE; fbIM5K2.stOut.stPMPS.sPmpsState := 'IM5K2:PPM-OUT'; fbIM5K2.stPower.fPosition := -48.02; fbIM5K2.stPower.bUseRawCounts := FALSE; fbIM5K2.stPower.bValid := TRUE; fbIM5K2.stPower.stPMPS.sPmpsState := 'IM5K2:PPM-POWERMETER'; fbIM5K2.stYag1.fPosition := -72.02; fbIM5K2.stYag1.bUseRawCounts := FALSE; fbIM5K2.stYag1.bValid := TRUE; fbIM5K2.stYag1.stPMPS.sPmpsState := 'IM5K2:PPM-YAG1'; fbIM5K2.stYag2.fPosition := -98.03; fbIM5K2.stYag2.bUseRawCounts := FALSE; fbIM5K2.stYag2.bValid := TRUE; fbIM5K2.stYag2.stPMPS.sPmpsState := 'IM5K2:PPM-YAG2'; fbIM5K2( fbArbiter := GVL.fbArbiter2, fbFFHWO := GVL.fbFastFaultOutput2, stYStage := Main.M14, sPmpsDeviceName := 'IM5K2:PPM', sTransitionKey := 'IM5K2:PPM-TRANSITION', ); END_PROGRAM Related: * `GVL`_ * `Main`_ PRG_IM6K2_PPM ^^^^^^^^^^^^^ :: PROGRAM PRG_IM6K2_PPM VAR {attribute 'pytmc' := ' pv: IM6K2:PPM io: io '} {attribute 'TcLinkTo' := '.fbGige.iIlluminatorINT := TIIB[IM6K2-EL4004-E7]^AO Outputs Channel 1^Analog output; .fbGige.bGigePower := TIIB[IM6K2-EL2004-E3]^Channel 2^Output; .fbPowerMeter.iVoltageINT := TIIB[IM6K2-EL3062-E6]^AI Standard Channel 1^Value; .fbPowerMeter.fbThermoCouple.bError := TIIB[IM6K2-EL3314-E4]^TC Inputs Channel 1^Status^Error; .fbPowerMeter.fbThermoCouple.bUnderrange := TIIB[IM6K2-EL3314-E4]^TC Inputs Channel 1^Status^Underrange; .fbPowerMeter.fbThermoCouple.bOverrange := TIIB[IM6K2-EL3314-E4]^TC Inputs Channel 1^Status^Overrange; .fbPowerMeter.fbThermoCouple.iRaw := TIIB[IM6K2-EL3314-E4]^TC Inputs Channel 1^Value; .fbYagThermoCouple.bError := TIIB[IM6K2-EL3314-E4]^TC Inputs Channel 2^Status^Error; .fbYagThermoCouple.bUnderrange := TIIB[IM6K2-EL3314-E4]^TC Inputs Channel 2^Status^Underrange; .fbYagThermoCouple.bOverrange := TIIB[IM6K2-EL3314-E4]^TC Inputs Channel 2^Status^Overrange; .fbYagThermoCouple.iRaw 6K2-EL3314-E4]^TC Inputs Channel 2^Value'} fbIM6K2: FB_PPM; END_VAR fbIM6K2.stOut.fPosition := -8.61; fbIM6K2.stOut.bUseRawCounts := FALSE; fbIM6K2.stOut.bValid := TRUE; fbIM6K2.stOut.stPMPS.sPmpsState := 'IM6K2:PPM-OUT'; fbIM6K2.stPower.fPosition := -47.71; fbIM6K2.stPower.bUseRawCounts := FALSE; fbIM6K2.stPower.bValid := TRUE; fbIM6K2.stPower.stPMPS.sPmpsState := 'IM6K2:PPM-POWERMETER'; fbIM6K2.stYag1.fPosition := -71.71; fbIM6K2.stYag1.bUseRawCounts := FALSE; fbIM6K2.stYag1.bValid := TRUE; fbIM6K2.stYag1.stPMPS.sPmpsState := 'IM6K2:PPM-YAG1'; fbIM6K2.stYag2.fPosition := -97.72; fbIM6K2.stYag2.bUseRawCounts := FALSE; fbIM6K2.stYag2.bValid := TRUE; fbIM6K2.stYag2.stPMPS.sPmpsState := 'IM6K2:PPM-YAG2'; fbIM6K2( fbArbiter := GVL.fbArbiter2, fbFFHWO := GVL.fbFastFaultOutput2, stYStage := Main.M24, sPmpsDeviceName := 'IM6K2:PPM', sTransitionKey := 'IM6K2:PPM-TRANSITION', ); END_PROGRAM Related: * `GVL`_ * `Main`_ PRG_LI2K2_K2A ^^^^^^^^^^^^^ :: PROGRAM PRG_LI2K2_K2A VAR {attribute 'pytmc' := ' pv: LI2K2:K2A io: io '} fbLI2K2: FB_LIC; //stSiBP: ST_BeamParams := PMPS_GVL.cstFullBeam; //stFoilBP: ST_BeamParams := PMPS_GVL.cstFullBeam; END_VAR (* Avoid damage peak between 3.2 keV and 1.6 keV *) //stSiBp.neVRange := F_eVExcludeRange(1600, 3200); // Drop transmission to 20% //stSiBP.nTran := 0.2; // Drop transmission to 10% ////stFoilBP.nTran := 0.1; fbLI2K2.stOut.fPosition := 1.2; fbLI2K2.stOut.bUseRawCounts := FALSE; fbLI2K2.stOut.bValid := TRUE; fbLI2K2.stOut.stPMPS.sPmpsState := 'LI2K2:K2A-OUT'; fbLI2K2.stMirror1.fPosition := -35.3; fbLI2K2.stMirror1.bUseRawCounts := FALSE; fbLI2K2.stMirror1.bValid := TRUE; fbLI2K2.stMirror1.stPMPS.sPmpsState := 'LI2K2:K2A-MIRROR1'; fbLI2K2.stMirror2.fPosition := -69.3; fbLI2K2.stMirror2.bUseRawCounts := FALSE; fbLI2K2.stMirror2.bValid := TRUE; fbLI2K2.stMirror2.stPMPS.sPmpsState := 'LI2K2:K2A-MIRROR2'; fbLI2K2.stTarget1.fPosition := -101.3; fbLI2K2.stTarget1.bUseRawCounts := FALSE; fbLI2K2.stTarget1.bValid := TRUE; fbLI2K2.stTarget1.stPMPS.sPmpsState := 'LI2K2:K2A-TARGET1'; fbLI2K2( fbArbiter := GVL.fbArbiter2, fbFFHWO := GVL.fbFastFaultOutput2, stYStage := Main.M11, sPmpsDeviceName := 'LI2K2:K2A', sTransitionKey := 'LI2K2:K2A-TRANSITION', ); END_PROGRAM Related: * `GVL`_ * `Main`_ PRG_LI3K2_K2B ^^^^^^^^^^^^^ :: PROGRAM PRG_LI3K2_K2B VAR {attribute 'pytmc' := ' pv: LI3K2:K2B io: io '} fbLI3K2: FB_LIC; //stSiBP: ST_BeamParams := PMPS_GVL.cstFullBeam; //stFoilBP: ST_BeamParams := PMPS_GVL.cstFullBeam; END_VAR (* Avoid damage peak between 3.2 keV and 1.6 keV *) //stSiBp.neVRange := F_eVExcludeRange(1600, 3200); // Drop transmission to 20% //stSiBP.nTran := 0.2; // Drop transmission to 10% //stFoilBP.nTran := 0.1; fbLI3K2.stOut.fPosition := 0.118; fbLI3K2.stOut.bUseRawCounts := FALSE; fbLI3K2.stOut.bValid := TRUE; fbLI3K2.stOut.stPMPS.sPmpsState := 'LI3K2:K2B-OUT'; fbLI3K2.stMirror1.fPosition := -36.38; fbLI3K2.stMirror1.bUseRawCounts := FALSE; fbLI3K2.stMirror1.bValid := TRUE; fbLI3K2.stMirror1.stPMPS.sPmpsState := 'LI3K2:K2B-MIRROR1'; fbLI3K2.stMirror2.fPosition := -70.38; fbLI3K2.stMirror2.bUseRawCounts := FALSE; fbLI3K2.stMirror2.bValid := TRUE; fbLI3K2.stMirror2.stPMPS.sPmpsState := 'LI3K2:K2B-MIRROR2'; fbLI3K2.stTarget1.fPosition := -102.38; fbLI3K2.stTarget1.bUseRawCounts := FALSE; fbLI3K2.stTarget1.bValid := TRUE; fbLI3K2.stTarget1.stPMPS.sPmpsState := 'LI3K2:K2B-TARGET1'; fbLI3K2( fbArbiter := GVL.fbArbiter2, fbFFHWO := GVL.fbFastFaultOutput2, stYStage := Main.M21, sPmpsDeviceName := 'LI3K2:K2B', sTransitionKey := 'LI3K2:K2B-TRANSITION', ); END_PROGRAM Related: * `GVL`_ * `Main`_ PRG_PF1K2_WFS ^^^^^^^^^^^^^ :: PROGRAM PRG_PF1K2_WFS VAR {attribute 'pytmc' := ' pv: PF1K2:WFS io: io '} {attribute 'TcLinkTo' := '.fbThermoCouple1.bError := TIIB[PF1K2-EL3314-E5]^TC Inputs Channel 1^Status^Error; .fbThermoCouple1.bUnderrange := TIIB[PF1K2-EL3314-E5]^TC Inputs Channel 1^Status^Underrange; .fbThermoCouple1.bOverrange := TIIB[PF1K2-EL3314-E5]^TC Inputs Channel 1^Status^Overrange; .fbThermoCouple1.iRaw := TIIB[PF1K2-EL3314-E5]^TC Inputs Channel 1^Value; .fbThermoCouple2.bError := TIIB[PF1K2-EL3314-E5]^TC Inputs Channel 2^Status^Error; .fbThermoCouple2.bUnderrange := TIIB[PF1K2-EL3314-E5]^TC Inputs Channel 2^Status^Underrange; .fbThermoCouple2.bOverrange := TIIB[PF1K2-EL3314-E5]^TC Inputs Channel 2^Status^Overrange; .fbThermoCouple2.iRaw := TIIB[PF1K2-EL3314-E5]^TC Inputs Channel 2^Value'} fbPF1K2: FB_WFS; //stSiBP: ST_BeamParams := PMPS_GVL.cstFullBeam; END_VAR (* Avoid damage peak between 3.2 keV and 1.6 keV *) //stSiBp.neVRange := F_eVExcludeRange(1600, 3200); // Drop transmission to 20% //stSiBP.nTran := 0.2; fbPF1K2.stOut.fPosition := -13.00; fbPF1K2.stOut.bUseRawCounts := FALSE; fbPF1K2.stOut.bValid := TRUE; fbPF1K2.stOut.stPMPS.sPmpsState := 'PF1K2:WFS-OUT'; fbPF1K2.stTarget1.fPosition := -97.13; fbPF1K2.stTarget1.bUseRawCounts := FALSE; fbPF1K2.stTarget1.bValid := TRUE; fbPF1K2.stTarget1.stPMPS.sPmpsState := 'PF1K2:WFS-TARGET1'; fbPF1K2.stTarget2.fPosition := -82.755; fbPF1K2.stTarget2.bUseRawCounts := FALSE; fbPF1K2.stTarget2.bValid := TRUE; fbPF1K2.stTarget2.stPMPS.sPmpsState := 'PF1K2:WFS-TARGET2'; fbPF1K2.stTarget3.fPosition := -68.38; fbPF1K2.stTarget3.bUseRawCounts := FALSE; fbPF1K2.stTarget3.bValid := TRUE; fbPF1K2.stTarget3.stPMPS.sPmpsState := 'PF1K2:WFS-TARGET3'; fbPF1K2.stTarget4.fPosition := -54.004; fbPF1K2.stTarget4.bUseRawCounts := FALSE; fbPF1K2.stTarget4.bValid := TRUE; fbPF1K2.stTarget4.stPMPS.sPmpsState := 'PF1K2:WFS-TARGET4'; fbPF1K2.stTarget5.fPosition := -39.629; fbPF1K2.stTarget5.bUseRawCounts := FALSE; fbPF1K2.stTarget5.bValid := TRUE; fbPF1K2.stTarget5.stPMPS.sPmpsState := 'PF1K2:WFS-TARGET5'; fbPF1K2( fbArbiter := GVL.fbArbiter2, fbFFHWO := GVL.fbFastFaultOutput2, stYStage := Main.M12, stZStage := Main.M13, sPmpsDeviceName := 'PF1K2:WFS', sTransitionKey := 'PF1K2:WFS-TRANSITION', ); END_PROGRAM Related: * `GVL`_ * `Main`_ PRG_PF2K2_WFS ^^^^^^^^^^^^^ :: PROGRAM PRG_PF2K2_WFS VAR {attribute 'pytmc' := ' pv: PF2K2:WFS io: io '} {attribute 'TcLinkTo' := '.fbThermoCouple1.bError := TIIB[PF2K2-EL3314-E5]^TC Inputs Channel 1^Status^Error; .fbThermoCouple1.bUnderrange := TIIB[PF2K2-EL3314-E5]^TC Inputs Channel 1^Status^Underrange; .fbThermoCouple1.bOverrange := TIIB[PF2K2-EL3314-E5]^TC Inputs Channel 1^Status^Overrange; .fbThermoCouple1.iRaw := TIIB[PF2K2-EL3314-E5]^TC Inputs Channel 1^Value; .fbThermoCouple2.bError := TIIB[PF2K2-EL3314-E5]^TC Inputs Channel 2^Status^Error; .fbThermoCouple2.bUnderrange := TIIB[PF2K2-EL3314-E5]^TC Inputs Channel 2^Status^Underrange; .fbThermoCouple2.bOverrange := TIIB[PF2K2-EL3314-E5]^TC Inputs Channel 2^Status^Overrange; .fbThermoCouple2.iRaw := TIIB[PF2K2-EL3314-E5]^TC Inputs Channel 2^Value'} fbPF2K2: FB_WFS; //stSiBP: ST_BeamParams := PMPS_GVL.cstFullBeam; END_VAR (* Avoid damage peak between 3.2 keV and 1.6 keV *) //stSiBp.neVRange := F_eVExcludeRange(1600, 3200); // Drop transmission to 20% //stSiBP.nTran := 0.2; fbPF2K2.stOut.fPosition := -15.00; fbPF2K2.stOut.bUseRawCounts := FALSE; fbPF2K2.stOut.bValid := TRUE; fbPF2K2.stOut.stPMPS.sPmpsState := 'PF2K2:WFS-OUT'; fbPF2K2.stTarget1.fPosition := -97.789; fbPF2K2.stTarget1.bUseRawCounts := FALSE; fbPF2K2.stTarget1.bValid := TRUE; fbPF2K2.stTarget1.stPMPS.sPmpsState := 'PF2K2:WFS-TARGET1'; fbPF2K2.stTarget2.fPosition := -83.416; fbPF2K2.stTarget2.bUseRawCounts := FALSE; fbPF2K2.stTarget2.bValid := TRUE; fbPF2K2.stTarget2.stPMPS.sPmpsState := 'PF2K2:WFS-TARGET2'; fbPF2K2.stTarget3.fPosition := -69.043; fbPF2K2.stTarget3.bUseRawCounts := FALSE; fbPF2K2.stTarget3.bValid := TRUE; fbPF2K2.stTarget3.stPMPS.sPmpsState := 'PF2K2:WFS-TARGET3'; fbPF2K2.stTarget4.fPosition := -54.669; fbPF2K2.stTarget4.bUseRawCounts := FALSE; fbPF2K2.stTarget4.bValid := TRUE; fbPF2K2.stTarget4.stPMPS.sPmpsState := 'PF2K2:WFS-TARGET4'; fbPF2K2.stTarget5.fPosition := -40.296; fbPF2K2.stTarget5.bUseRawCounts := FALSE; fbPF2K2.stTarget5.bValid := TRUE; fbPF2K2.stTarget5.stPMPS.sPmpsState := 'PF2K2:WFS-TARGET5'; fbPF2K2( fbArbiter := GVL.fbArbiter2, fbFFHWO := GVL.fbFastFaultOutput2, stYStage := Main.M22, stZStage := Main.M23, sPmpsDeviceName := 'PF2K2:WFS', sTransitionKey := 'PF2K2:WFS-TRANSITION', ); END_PROGRAM Related: * `GVL`_ * `Main`_ PRG_ST3K2_TERM ^^^^^^^^^^^^^^ :: PROGRAM PRG_ST3K2_TERM VAR {attribute 'pytmc' := 'pv: ST3K2:TERM'} {attribute 'TcLinkTo' := '.i_xInsertedLS := TIIB[ST3K2-TERM (EP2338-0001)]^Channel 4^Input; .i_xRetractedLS:= TIIB[ST3K2-TERM (EP2338-0001)]^Channel 3^Input; .q_xRetract_DO := TIIB[ST3K2-TERM (EP2338-0001)]^Channel 9^Output '} ST3K2: FB_MotionPneumaticActuator; ibPMPS_OK : BOOL; END_VAR ST3K2( ibInsertOK:= TRUE, ibRetractOK:= TRUE, ibPMPS_OK:= ibPMPS_OK, ibSingleCntrl:= TRUE , ibCntrlHold:= TRUE, ibOverrideInterlock:= , i_xReset:= , stPneumaticActuator=> , xMPS_OK=> , io_fbFFHWO:= GVL.fbFastFaultOutput2 ); END_PROGRAM Related: * `GVL`_ PRG_TM1K2_ATM ^^^^^^^^^^^^^ :: PROGRAM PRG_TM1K2_ATM VAR {attribute 'pytmc' := ' pv: TM1K2:ATM io: io '} {attribute 'TcLinkTo' := '.fbThermoCouple1.bError := TIIB[TM1K2-EL3314-E5]^TC Inputs Channel 1^Status^Error; .fbThermoCouple1.bUnderrange := TIIB[TM1K2-EL3314-E5]^TC Inputs Channel 1^Status^Underrange; .fbThermoCouple1.bOverrange := TIIB[TM1K2-EL3314-E5]^TC Inputs Channel 1^Status^Overrange; .fbThermoCouple1.iRaw := TIIB[TM1K2-EL3314-E5]^TC Inputs Channel 1^Value'} fbTM1K2: FB_ATM; END_VAR fbTM1K2.stOut.fPosition := -16; fbTM1K2.stOut.bUseRawCounts := FALSE; fbTM1K2.stOut.bValid := TRUE; fbTM1K2.stOut.stPMPS.sPmpsState := 'TM1K2:ATM-OUT'; fbTM1K2.stTarget1.fPosition := -39.124; fbTM1K2.stTarget1.bUseRawCounts := FALSE; fbTM1K2.stTarget1.bValid := TRUE; fbTM1K2.stTarget1.stPMPS.sPmpsState := 'TM1K2:ATM-TARGET1'; fbTM1K2.stTarget2.fPosition := -53.5; fbTM1K2.stTarget2.bUseRawCounts := FALSE; fbTM1K2.stTarget2.bValid := TRUE; fbTM1K2.stTarget2.stPMPS.sPmpsState := 'TM1K2:ATM-TARGET2'; fbTM1K2.stTarget3.fPosition := -67.874; fbTM1K2.stTarget3.bUseRawCounts := FALSE; fbTM1K2.stTarget3.bValid := TRUE; fbTM1K2.stTarget3.stPMPS.sPmpsState := 'TM1K2:ATM-TARGET3'; fbTM1K2.stTarget4.fPosition := -82.25; fbTM1K2.stTarget4.bUseRawCounts := FALSE; fbTM1K2.stTarget4.bValid := TRUE; fbTM1K2.stTarget4.stPMPS.sPmpsState := 'TM1K2:ATM-TARGET4'; fbTM1K2.stTarget5.fPosition := -96.623; fbTM1K2.stTarget5.bUseRawCounts := FALSE; fbTM1K2.stTarget5.bValid := TRUE; fbTM1K2.stTarget5.stPMPS.sPmpsState := 'TM1K2:ATM-TARGET5'; fbTM1K2( fbArbiter := GVL.fbArbiter2, fbFFHWO := GVL.fbFastFaultOutput2, stYStage := Main.M9, stXStage := Main.M10, sPmpsDeviceName := 'TM1K2:ATM', sTransitionKey := 'TM1K2:ATM-TRANSITION', ); END_PROGRAM Related: * `GVL`_ * `Main`_ PRG_TM2K2_ATM ^^^^^^^^^^^^^ :: PROGRAM PRG_TM2K2_ATM VAR {attribute 'pytmc' := ' pv: TM2K2:ATM io: io '} {attribute 'TcLinkTo' := '.fbThermoCouple1.bError := TIIB[TM2K2-EL3314-E5]^TC Inputs Channel 1^Status^Error; .fbThermoCouple1.bUnderrange := TIIB[TM2K2-EL3314-E5]^TC Inputs Channel 1^Status^Underrange; .fbThermoCouple1.bOverrange := TIIB[TM2K2-EL3314-E5]^TC Inputs Channel 1^Status^Overrange; .fbThermoCouple1.iRaw := TIIB[TM2K2-EL3314-E5]^TC Inputs Channel 1^Value'} fbTM2K2: FB_TM2K2; END_VAR fbTM2K2.stOut.fPosition := 5.3; //"-15" Changing OUT setpoint as -15 doesn't seem to be OUT position; fbTM2K2.stOut.bUseRawCounts := FALSE; fbTM2K2.stOut.bValid := TRUE; fbTM2K2.stOut.stPMPS.sPmpsState := 'TM2K2:ATM-OUT'; fbTM2K2.stTarget1.fPosition := -15.5; //-39.124; fbTM2K2.stTarget1.bUseRawCounts := FALSE; fbTM2K2.stTarget1.bValid := TRUE; fbTM2K2.stTarget1.stPMPS.sPmpsState := 'TM2K2:ATM-TARGET1'; fbTM2K2.stTarget2.fPosition := -36.5; //-53.5; fbTM2K2.stTarget2.bUseRawCounts := FALSE; fbTM2K2.stTarget2.bValid := TRUE; fbTM2K2.stTarget2.stPMPS.sPmpsState := 'TM2K2:ATM-TARGET2'; fbTM2K2.stTarget3.fPosition := -52.0; //-67.874; fbTM2K2.stTarget3.bUseRawCounts := FALSE; fbTM2K2.stTarget3.bValid := TRUE; fbTM2K2.stTarget3.stPMPS.sPmpsState := 'TM2K2:ATM-TARGET3'; fbTM2K2.stTarget4.fPosition := -60.5; //-82.25; fbTM2K2.stTarget4.bUseRawCounts := FALSE; fbTM2K2.stTarget4.bValid := TRUE; fbTM2K2.stTarget4.stPMPS.sPmpsState := 'TM2K2:ATM-TARGET4'; fbTM2K2.stTarget5.fPosition := -77.0; //-96.623; fbTM2K2.stTarget5.bUseRawCounts := FALSE; fbTM2K2.stTarget5.bValid := TRUE; fbTM2K2.stTarget4.stPMPS.sPmpsState := 'TM2K2:ATM-TARGET4'; fbTM2K2.stTarget6.fPosition := -96.6; //-96.623; fbTM2K2.stTarget6.bUseRawCounts := FALSE; fbTM2K2.stTarget6.bValid := TRUE; fbTM2K2.stTarget5.stPMPS.sPmpsState := 'TM2K2:ATM-TARGET5'; fbTM2K2( fbArbiter := GVL.fbArbiter2, fbFFHWO := GVL.fbFastFaultOutput2, stYStage := Main.M15, stXStage := Main.M16, sPmpsDeviceName := 'TM2K2:ATM', sTransitionKey := 'TM2K2:ATM-TRANSITION', ); END_PROGRAM Related: * `FB_TM2K2`_ * `GVL`_ * `Main`_