DUTs ---- ENUM_Si_B4C_Coating_States ^^^^^^^^^^^^^^^^^^^^^^^^^^ :: {attribute 'qualified only'} TYPE ENUM_Si_B4C_Coating_States : ( Unknown := 0, Si := 1, B4C := 2 ); END_TYPE Related: * `ENUM_Si_B4C_Coating_States`_ GVLs ---- Global_Version ^^^^^^^^^^^^^^ :: {attribute 'TcGenerated'} {attribute 'no-analysis'} {attribute 'linkalways'} // This function has been automatically generated from the project information. VAR_GLOBAL CONSTANT {attribute 'const_non_replaced'} stLibVersion_lcls_plc_tmo_optics : ST_LibVersion := (iMajor := 3, iMinor := 6, iBuild := 0, iRevision := 0, nFlags := 1, sVersion := '3.6.0'); END_VAR GVL_COM_Buffers ^^^^^^^^^^^^^^^ :: VAR_GLOBAL // M1K4 Serial_RXBuffer_M1K4 : ComBuffer; Serial_TXBuffer_M1K4 : ComBuffer; END_VAR GVL_M1K4 ^^^^^^^^ :: {attribute 'qualified_only'} VAR_GLOBAL // Pitch Mechanism: {attribute 'TcLinkTo' := '.diEncCnt:=TIIB[EL5042_M1K4_PitchBender]^FB Inputs Channel 1^Position'} M1K4_Pitch : HOMS_PitchMechanism := (ReqPosLimHi := 275, ReqPosLimLo := -25, diEncPosLimHi := 10149192, diEncPosLimLo := 10047105); END_VAR GVL_M1K4_Constants ^^^^^^^^^^^^^^^^^^ :: {attribute 'qualified_only'} VAR_GLOBAL CONSTANT // Encoder reference values in counts = nm nYUP_ENC_REF : ULINT := 15000270; nYDWN_ENC_REF : ULINT := 15454300; nXUP_ENC_REF : ULINT := 24000300; nXDWN_ENC_REF : ULINT := 23999400; END_VAR GVL_M2K4_Constants ^^^^^^^^^^^^^^^^^^ :: {attribute 'qualified_only'} VAR_GLOBAL CONSTANT // Encoder reference values in counts = nm nM2K4X_ENC_REF : ULINT := 5973570; nM2K4Y_ENC_REF : ULINT := 6099450; nM2K4rY_ENC_REF : ULINT := 39050722; END_VAR GVL_M2K4_RTD ^^^^^^^^^^^^ :: {attribute 'qualified_only'} VAR_GLOBAL // M2K4 BENDER RTDs // M2K4 US RTDs {attribute 'TcLinkTo' := 'TIIB[EL3202-0010_M2K4US1_M2K4US2]^RTD Inputs Channel 1^Value'} nM2K4US_RTD_1 AT %I* : INT; {attribute 'TcLinkTo' := 'TIIB[EL3202-0010_M2K4US3_M2K4DS1]^RTD Inputs Channel 1^Value'} nM2K4US_RTD_3 AT %I* : INT; // M2K4 DS RTDs {attribute 'TcLinkTo' := 'TIIB[EL3202-0010_M2K4US3_M2K4DS1]^RTD Inputs Channel 2^Value'} nM2K4DS_RTD_1 AT %I* : INT; {attribute 'TcLinkTo' := 'TIIB[EL3202-0010_M2K4DS2_M2K4DS3]^RTD Inputs Channel 2^Value'} nM2K4DS_RTD_3 AT %I* : INT; END_VAR GVL_M3K4_Constants ^^^^^^^^^^^^^^^^^^ :: {attribute 'qualified_only'} VAR_GLOBAL CONSTANT // Encoder reference values in counts = nm nM3K4X_ENC_REF : ULINT := 6404509; nM3K4Y_ENC_REF : ULINT := 6047240; nM3K4rX_ENC_REF : ULINT := 48388188; END_VAR GVL_M3K4_RTD ^^^^^^^^^^^^ :: {attribute 'qualified_only'} VAR_GLOBAL // M3K4 BENDER RTDs // M3K4 US RTDs {attribute 'TcLinkTo' := 'TIIB[EL3202-0010_M3K4US1_M3K4US2]^RTD Inputs Channel 1^Value'} nM3K4US_RTD_1 AT %I* : INT; {attribute 'TcLinkTo' := 'TIIB[EL3202-0010_M3K4US3_M3K4DS1]^RTD Inputs Channel 1^Value'} nM3K4US_RTD_3 AT %I* : INT; // M2K4 DS RTDs {attribute 'TcLinkTo' := 'TIIB[EL3202-0010_M3K4US3_M3K4DS1]^RTD Inputs Channel 2^Value'} nM3K4DS_RTD_1 AT %I* : INT; {attribute 'TcLinkTo' := 'TIIB[EL3202-0010_M3K4DS2_M3K4DS3]^RTD Inputs Channel 2^Value'} nM3K4DS_RTD_3 AT %I* : INT; END_VAR GVL_M4K4_RTD ^^^^^^^^^^^^ :: {attribute 'qualified_only'} VAR_GLOBAL // M4K4 RTDs {attribute 'TcLinkTo' := '.iRaw := TIIB[EL3204_M4K4]^RTD Inputs Channel 1^Value; .bUnderrange := TIIB[EL3204_M4K4]^RTD Inputs Channel 1^Status^Underrange; .bOverrange := TIIB[EL3204_M4K4]^RTD Inputs Channel 1^Status^Overrange; .bError := TIIB[EL3204_M4K4]^RTD Inputs Channel 1^Status^Error'} {attribute 'pytmc' := ' pv: MR4K4:KBO:RTD:CHIN:L field: EGU C io: i '} nM4K4_Chin_Left_RTD : FB_TempSensor; {attribute 'TcLinkTo' := '.iRaw := TIIB[EL3204_M4K4]^RTD Inputs Channel 2^Value; .bUnderrange := TIIB[EL3204_M4K4]^RTD Inputs Channel 2^Status^Underrange; .bOverrange := TIIB[EL3204_M4K4]^RTD Inputs Channel 2^Status^Overrange; .bError := TIIB[EL3204_M4K4]^RTD Inputs Channel 2^Status^Error'} {attribute 'pytmc' := ' pv: MR4K4:KBO:RTD:CHIN:R field: EGU C io: i '} nM4K4_Chin_Right_RTD : FB_TempSensor; {attribute 'TcLinkTo' := '.iRaw := TIIB[EL3204_M4K4]^RTD Inputs Channel 3^Value; .bUnderrange := TIIB[EL3204_M4K4]^RTD Inputs Channel 3^Status^Underrange; .bOverrange := TIIB[EL3204_M4K4]^RTD Inputs Channel 3^Status^Overrange; .bError := TIIB[EL3204_M4K4]^RTD Inputs Channel 3^Status^Error'} {attribute 'pytmc' := ' pv: MR4K4:KBO:RTD:TAIL field: EGU C io: i '} nM4K4_Chin_Tail_RTD : FB_TempSensor; END_VAR GVL_M5K4_RTD ^^^^^^^^^^^^ :: {attribute 'qualified_only'} VAR_GLOBAL // M5K4 RTDs {attribute 'TcLinkTo' := '.iRaw := TIIB[EL3204_M5K4]^RTD Inputs Channel 1^Value; .bUnderrange := TIIB[EL3204_M5K4]^RTD Inputs Channel 1^Status^Underrange; .bOverrange := TIIB[EL3204_M5K4]^RTD Inputs Channel 1^Status^Overrange; .bError := TIIB[EL3204_M5K4]^RTD Inputs Channel 1^Status^Error'} {attribute 'pytmc' := ' pv: MR5K4:KBO:RTD:CHIN:L field: EGU C io: i '} nM5K4_Chin_Left_RTD : FB_TempSensor; {attribute 'TcLinkTo' := '.iRaw := TIIB[EL3204_M5K4]^RTD Inputs Channel 2^Value; .bUnderrange := TIIB[EL3204_M5K4]^RTD Inputs Channel 2^Status^Underrange; .bOverrange := TIIB[EL3204_M5K4]^RTD Inputs Channel 2^Status^Overrange; .bError := TIIB[EL3204_M5K4]^RTD Inputs Channel 2^Status^Error'} {attribute 'pytmc' := ' pv: MR5K4:KBO:RTD:CHIN:R field: EGU C io: i '} nM5K4_Chin_Right_RTD : FB_TempSensor; {attribute 'TcLinkTo' := '.iRaw := TIIB[EL3204_M5K4]^RTD Inputs Channel 3^Value; .bUnderrange := TIIB[EL3204_M5K4]^RTD Inputs Channel 3^Status^Underrange; .bOverrange := TIIB[EL3204_M5K4]^RTD Inputs Channel 3^Status^Overrange; .bError := TIIB[EL3204_M5K4]^RTD Inputs Channel 3^Status^Error'} {attribute 'pytmc' := ' pv: MR5K4:KBO:RTD:TAIL field: EGU C io: i '} nM5K4_Chin_Tail_RTD : FB_TempSensor; END_VAR GVL_PMPS ^^^^^^^^ :: {attribute 'qualified_only'} VAR_GLOBAL // FFO for devices upstream of ST1K4 (M1K4) {attribute 'pytmc' := ' pv: PLC:TMO:OPTICS:FFO:01 '} {attribute 'TcLinkTo' := '.q_xFastFaultOut:=TIIB[PMPS_FFO]^Channel 1^Output'} g_FastFaultOutput1 : FB_HardwareFFOutput := (bAutoReset:=TRUE, i_sNetID:='172.21.92.73.1.1'); // FFO for devices downstream of ST1K4 (TMO hutch optics) {attribute 'pytmc' := ' pv: PLC:TMO:OPTICS:FFO:02 '} {attribute 'TcLinkTo' := '.q_xFastFaultOut:=TIIB[PMPS_FFO]^Channel 2^Output'} g_FastFaultOutput2 : FB_HardwareFFOutput := (bAutoReset:=TRUE, i_sNetID:='172.21.92.73.1.1'); // Arbiter for devices upstream of ST1K4 (M1K4) {attribute 'pytmc' := ' pv: PLC:TMO:OPTICS:ARB:01 '} g_fbArbiter1 : FB_Arbiter(1); // Arbiter for devices downstream of ST1K4 (TMO hutch optics) {attribute 'pytmc' := ' pv: PLC:TMO:OPTICS:ARB:02 '} g_fbArbiter2 : FB_Arbiter(2); END_VAR GVL_SerialIO ^^^^^^^^^^^^ :: VAR_GLOBAL //Better have your inputs and outputs! // M1K4 Serial_stComIn_M1K4 AT %I* : EL6inData22B (*KL6inData22B*); Serial_stComOut_M1K4 AT %Q* : EL6outData22B (*KL6outData22B*); END_VAR POUs ---- FB_KBO_Coating_States ^^^^^^^^^^^^^^^^^^^^^ :: FUNCTION_BLOCK FB_KBO_Coating_States EXTENDS FB_PositionStateBase_WithPMPS VAR_INPUT {attribute 'pytmc' := ' pv: SET io: io '} enumSet : ENUM_Si_B4C_Coating_States; stCoating1 : DUT_PositionState; stCoating2 : DUT_PositionState; bVerticalCoating : BOOL := TRUE; sCoating1Name : STRING; sCoating2Name : STRING; END_VAR VAR_OUTPUT {attribute 'pytmc' := ' pv: GET; io: i; '} enumGet : ENUM_Si_B4C_Coating_States; END_VAR VAR fbStateDefaults: FB_PositionState_Defaults; bCoatingInit : BOOL; fCoatingAccel : LREAL := fYAccel; fCoatingDecel : LREAL := fYDecel; END_VAR VAR CONSTANT // These are the default values // Set values on states prior to passing in for non-default values // Units in Millimeters fDelta: LREAL := 0.1; fVelocity: LREAL := 0.150; fYAccel: LREAL := 10; fYDecel: LREAL := 10; fXAccel: LREAL := 100; fXDecel: LREAL := 100; END_VAR if NOT bCoatingInit THEN bCoatingInit := TRUE; if NOT bVerticalCoating THEN fCoatingAccel := fXAccel; fCoatingDecel := fXDecel; END_IF //Coating 1 stCoating1.sName := sCoating1Name; stCoating1.bValid := TRUE; stCoating1.bMoveOk := TRUE; stCoating1.bUseRawCounts := TRUE; fbStateDefaults( stPositionState:=stCoating1, fVeloDefault:=fVelocity, fDeltaDefault:=fDelta, fAccelDefault:=fCoatingAccel, fDecelDefault:=fCoatingDecel ); //Coating 2 stCoating2.sName := sCoating2Name; stCoating2.bValid := TRUE; stCoating2.bMoveOk := TRUE; stCoating2.bUseRawCounts := TRUE; fbStateDefaults( stPositionState:=stCoating2, fVeloDefault:=fVelocity, fDeltaDefault:=fDelta, fAccelDefault:=fCoatingAccel, fDecelDefault:=fCoatingDecel ); arrStates[1] := stCoating1; arrStates[2] := stCoating2; END_IF setState := enumSet; Exec(); enumGet := getState; enumSet := setState; END_FUNCTION_BLOCK Related: * `ENUM_Si_B4C_Coating_States`_ FB_Offset_Coating_States ^^^^^^^^^^^^^^^^^^^^^^^^ :: FUNCTION_BLOCK FB_Offset_Coating_States EXTENDS FB_PositionStateBase_WithPMPS VAR_INPUT {attribute 'pytmc' := ' pv: SET io: io '} enumSet : ENUM_Si_B4C_Coating_States; stCoating1 : DUT_PositionState; stCoating2 : DUT_PositionState; sCoating1Name : STRING; sCoating2Name : STRING; END_VAR VAR_OUTPUT {attribute 'pytmc' := ' pv: GET; io: i; '} enumGet : ENUM_Si_B4C_Coating_States; END_VAR VAR fbStateDefaults: FB_PositionState_Defaults; bCoatingInit : BOOL; END_VAR VAR CONSTANT // These are the default values // Set values on states prior to passing in for non-default values // Units in Mircons fDelta: LREAL := 100; fVelocity: LREAL := 150; fAccel: LREAL := 200; fDecel: LREAL := 200; END_VAR if NOT bCoatingInit THEN bCoatingInit := TRUE; //Coating 1 stCoating1.sName := sCoating1Name; stCoating1.bValid := TRUE; stCoating1.bMoveOk := TRUE; stCoating1.bUseRawCounts := TRUE; fbStateDefaults( stPositionState:=stCoating1, fVeloDefault:=fVelocity, fDeltaDefault:=fDelta, fAccelDefault:=fAccel, fDecelDefault:=fDecel ); //Coating 2 stCoating2.sName := sCoating2Name; stCoating2.bValid := TRUE; stCoating2.bMoveOk := TRUE; stCoating2.bUseRawCounts := TRUE; fbStateDefaults( stPositionState:=stCoating2, fVeloDefault:=fVelocity, fDeltaDefault:=fDelta, fAccelDefault:=fAccel, fDecelDefault:=fDecel ); arrStates[1] := stCoating1; arrStates[2] := stCoating2; END_IF setState := enumSet; Exec(); enumGet := getState; enumSet := setState; END_FUNCTION_BLOCK Related: * `ENUM_Si_B4C_Coating_States`_ Main ^^^^ :: PROGRAM Main VAR // M1K4 // Motors {attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[EL7041-1000_M1K4_Yup]^STM Status^Status^Digital input 1; .bLimitBackwardEnable:=TIIB[EL7041-1000_M1K4_Yup]^STM Status^Status^Digital input 2'} {attribute 'pytmc' := ' pv: MR1K4:SOMS:MMS:YUP '} //PMPS State Stage; bPowerSelf:=False M1 : ST_MotionStage := (sName:='MR1K4-Coatings', fVelocity:=200.0, nEnableMode:=ENUM_StageEnableMode.ALWAYS, bPowerSelf:=FALSE); // M1K4 Yup fbMotionStage_m1 : FB_MotionStage; {attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[EL7041-1000_M1K4_Ydwn]^STM Status^Status^Digital input 1; .bLimitBackwardEnable:=TIIB[EL7041-1000_M1K4_Ydwn]^STM Status^Status^Digital input 2'} {attribute 'pytmc' := ' pv: MR1K4:SOMS:MMS:YDWN '} M2 : ST_MotionStage := (fVelocity:=200.0, nEnableMode:=ENUM_StageEnableMode.ALWAYS, bPowerSelf:=TRUE); // M1K4 Ydwn fbMotionStage_m2 : FB_MotionStage; {attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[EL7041-1000_M1K4_Xup]^STM Status^Status^Digital input 1; .bLimitBackwardEnable:=TIIB[EL7041-1000_M1K4_Xup]^STM Status^Status^Digital input 2'} {attribute 'pytmc' := ' pv: MR1K4:SOMS:MMS:XUP '} M3 : ST_MotionStage := (fVelocity:=1000.0, nEnableMode:=ENUM_StageEnableMode.ALWAYS, bPowerSelf:=TRUE); // M1K4 Xup fbMotionStage_m3 : FB_MotionStage; {attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[EL7041-1000_M1K4_Xdwn]^STM Status^Status^Digital input 1; .bLimitBackwardEnable:=TIIB[EL7041-1000_M1K4_Xdwn]^STM Status^Status^Digital input 2'} {attribute 'pytmc' := ' pv: MR1K4:SOMS:MMS:XDWN '} M4 : ST_MotionStage := (fVelocity:=1000.0, nEnableMode:=ENUM_StageEnableMode.ALWAYS, bPowerSelf:=TRUE); // M1K4 Xdwn fbMotionStage_m4 : FB_MotionStage; {attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[EL7041-1000_M1K4_PitchCoarse]^STM Status^Status^Digital input 1; .bLimitBackwardEnable:=TIIB[EL7041-1000_M1K4_PitchCoarse]^STM Status^Status^Digital input 2'} {attribute 'pytmc' := ' pv: MR1K4:SOMS:MMS:PITCH '} M5 : ST_MotionStage := (fVelocity := 150.0, bPowerSelf:=TRUE, nEnableMode:=ENUM_StageEnableMode.ALWAYS); // M1K4 Pitch Stepper fbMotionStage_m5 : FB_MotionStage; (* {attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[EL7041-1000_M1K4_Bender]^STM Status^Status^Digital input 1; .bLimitBackwardEnable:=TIIB[EL7041-1000_M1K4_Bender]^STM Status^Status^Digital input 2'} {attribute 'pytmc' := ' pv: MR1K4:SOMS:MMS:BENDER '} M6 : ST_MotionStage := (fVelocity := 150.0, bPowerSelf:=TRUE); // M1K4 Bender fbMotionStage_m6 : FB_MotionStage; *) {attribute 'TcLinkTo' := '.fbRunHOMS.bSTOEnable1:=TIIB[EL1004_M1K4_STO]^Channel 1^Input; .fbRunHOMS.bSTOEnable2:=TIIB[EL1004_M1K4_STO]^Channel 2^Input; .fbRunHOMS.stYupEnc.Count:=TIIB[EL5042_M1K4_Yupdwn]^FB Inputs Channel 1^Position; .fbRunHOMS.stYdwnEnc.Count:=TIIB[EL5042_M1K4_Yupdwn]^FB Inputs Channel 2^Position; .fbRunHOMS.stXupEnc.Count:=TIIB[EL5042_M1K4_Xupdwn]^FB Inputs Channel 1^Position; .fbRunHOMS.stXdwnEnc.Count:=TIIB[EL5042_M1K4_Xupdwn]^FB Inputs Channel 2^Position'} {attribute 'pytmc' := ' pv: MR1K4:SOMS '} M1K4 : DUT_HOMS; // Encoder Arrays/RMS Watch: {attribute 'pytmc' := ' pv: MR1K4:SOMS:ENC:Y '} fbYRMSErrorM1K4 : FB_RMSWatch; fMaxYRMSErrorM1K4 : LREAL; fMinYRMSErrorM1K4 : LREAL; {attribute 'pytmc' := ' pv: MR1K4:SOMS:ENC:X '} fbXRMSErrorM1K4 : FB_RMSWatch; fMaxXRMSErrorM1K4 : LREAL; fMinXRMSErrorM1K4 : LREAL; {attribute 'pytmc' := ' pv: MR1K4:SOMS:ENC:PITCH '} fbPitchRMSErrorM1K4 : FB_RMSWatch; fMaxPitchRMSErrorM1K4 : LREAL; fMinPitchRMSErrorM1K4 : LREAL; {attribute 'pytmc' := ' pv: MR1K4:SOMS:ENC:BENDER '} fbBenderRMSErrorM1K4 : FB_RMSWatch; fMaxBenderRMSErrorM1K4 : LREAL; fMinBenderRMSErrorM1K4 : LREAL; // Piezo Pitch Control //fbM1K4PitchControl : FB_PitchControl; //bM1K4PitchDone : BOOL; //bM1K4PitchBusy : BOOL; // Bender Control fbBenderM1K4 : FB_Bender; // Raw Encoder Counts {attribute 'pytmc' := ' pv: MR1K4:SOMS:ENC:YUP:CNT field: EGU cnt io: i '} nEncCntYupM1K4 : UDINT; {attribute 'pytmc' := ' pv: MR1K4:SOMS:ENC:YDWN:CNT field: EGU cnt io: i '} nEncCntYdwnM1K4 : UDINT; {attribute 'pytmc' := ' pv: MR1K4:SOMS:ENC:XUP:CNT field: EGU cnt io: i '} nEncCntXupM1K4 : UDINT; {attribute 'pytmc' := ' pv: MR1K4:SOMS:ENC:XDWN:CNT field: EGU cnt io: i '} nEncCntXdwnM1K4 : UDINT; {attribute 'pytmc' := ' pv: MR1K4:SOMS:ENC:PITCH:CNT field: EGU cnt io: i '} nEncCntPitchM1K4 : UDINT; // Encoder Reference Values {attribute 'pytmc' := ' pv: MR1K4:SOMS:ENC:YUP:REF field: EGU cnt io: i '} nEncRefYupM1K4 : UDINT; {attribute 'pytmc' := ' pv: MR1K4:SOMS:ENC:YDWN:REF field: EGU cnt io: i '} nEncRefYdwnM1K4 : UDINT; {attribute 'pytmc' := ' pv: MR1K4:SOMS:ENC:XUP:REF field: EGU cnt io: i '} nEncRefXupM1K4 : UDINT; {attribute 'pytmc' := ' pv: MR1K4:SOMS:ENC:XDWN:REF field: EGU cnt io: i '} nEncRefXdwnM1K4 : UDINT; {attribute 'pytmc' := ' pv: MR1K4:SOMS:ENC:PITCH:REF field: EGU cnt io: i '} nEncRefPitchM1K4 : UDINT; mcReadParameterPitchM1K4 : MC_ReadParameter; fEncRefPitchM1K4_urad : LREAL; // Current Pitch encoder offset in urad // Common fEncLeverArm_mm : LREAL := 513.0; // LAMP KB Motors //MR2K4 X {attribute 'TcLinkTo' := '.bLimitForwardEnable :=TIIB[EL7041-0052_M2K4X]^STM Status^Status^Digital input 1; .bLimitBackwardEnable:=TIIB[EL7041-0052_M2K4X]^STM Status^Status^Digital input 2; .nRawEncoderULINT := TIIB[EL5042_M2K4X_M2K4Y]^FB Inputs Channel 1^Position'} {attribute 'pytmc' := ' pv: MR2K4:KBO:MMS:X '} M7 : ST_MotionStage := (nEnableMode:=ENUM_StageEnableMode.ALWAYS, bPowerSelf:=TRUE); fbMotionStage_m7 : FB_MotionStage; //MR2K4 Y {attribute 'TcLinkTo' := '.bLimitForwardEnable :=TIIB[EL7041-0052_M2K4Y]^STM Status^Status^Digital input 1; .bLimitBackwardEnable:=TIIB[EL7041-0052_M2K4Y]^STM Status^Status^Digital input 2; .nRawEncoderULINT := TIIB[EL5042_M2K4X_M2K4Y]^FB Inputs Channel 2^Position'} {attribute 'pytmc' := ' pv: MR2K4:KBO:MMS:Y '} //PMPS State Stage; bPowerSelf:=False M8 : ST_MotionStage := (sName:='MR2K4-Coatings', nEnableMode:=ENUM_StageEnableMode.ALWAYS, bPowerSelf:=FALSE); fbMotionStage_m8 : FB_MotionStage; //MR2K4 rY {attribute 'TcLinkTo' := '.bLimitForwardEnable :=TIIB[EL7041-0052_M2K4rY]^STM Status^Status^Digital input 1; .bLimitBackwardEnable:=TIIB[EL7041-0052_M2K4rY]^STM Status^Status^Digital input 2; .nRawEncoderULINT := TIIB[EL5042_M2K4rY_M3K4X]^FB Inputs Channel 1^Position'} {attribute 'pytmc' := ' pv: MR2K4:KBO:MMS:PITCH '} M9 : ST_MotionStage := (nEnableMode:=ENUM_StageEnableMode.ALWAYS, bPowerSelf:=TRUE); fbMotionStage_m9 : FB_MotionStage; //MR2K4 US BEND {attribute 'TcLinkTo' := '.bLimitForwardEnable :=TIIB[EL7041_M2K4_BEND_US]^STM Status^Status^Digital input 1; .bLimitBackwardEnable:=TIIB[EL7041_M2K4_BEND_US]^STM Status^Status^Digital input 2; .nRawEncoderULINT := TIIB[EL5042_M2K4_BEND_USDS]^FB Inputs Channel 1^Position'} {attribute 'pytmc' := ' pv: MR2K4:KBO:MMS:BEND:US '} M10 : ST_MotionStage := (nEnableMode:=ENUM_StageEnableMode.DURING_MOTION, bPowerSelf:=TRUE); fbMotionStage_m10 : FB_MotionStage; //MR2K4 DS BEND {attribute 'TcLinkTo' := '.bLimitForwardEnable :=TIIB[EL7041_M2K4_BEND_DS]^STM Status^Status^Digital input 1; .bLimitBackwardEnable:=TIIB[EL7041_M2K4_BEND_DS]^STM Status^Status^Digital input 2; .nRawEncoderULINT := TIIB[EL5042_M2K4_BEND_USDS]^FB Inputs Channel 2^Position'} {attribute 'pytmc' := ' pv: MR2K4:KBO:MMS:BEND:DS '} M11 : ST_MotionStage := (nEnableMode:=ENUM_StageEnableMode.DURING_MOTION, bPowerSelf:=TRUE); fbMotionStage_m11 : FB_MotionStage; //MR3K4 X {attribute 'TcLinkTo' := '.bLimitForwardEnable :=TIIB[EL7041-0052_M3K4X]^STM Status^Status^Digital input 1; .bLimitBackwardEnable:=TIIB[EL7041-0052_M3K4X]^STM Status^Status^Digital input 2; .nRawEncoderULINT := TIIB[EL5042_M2K4rY_M3K4X]^FB Inputs Channel 2^Position'} {attribute 'pytmc' := ' pv: MR3K4:KBO:MMS:X '} //PMPS State Stage; bPowerSelf:=False M12 : ST_MotionStage := (sName:='MR3K4-Coatings', nEnableMode:=ENUM_StageEnableMode.ALWAYS, bPowerSelf:=FALSE); fbMotionStage_m12 : FB_MotionStage; //MR3K4 Y {attribute 'TcLinkTo' := '.bLimitForwardEnable :=TIIB[EL7041-0052_M3K4Y]^STM Status^Status^Digital input 1; .bLimitBackwardEnable:=TIIB[EL7041-0052_M3K4Y]^STM Status^Status^Digital input 2; .nRawEncoderULINT := TIIB[EL5042_M3K4Y_M3K4rX]^FB Inputs Channel 1^Position'} {attribute 'pytmc' := ' pv: MR3K4:KBO:MMS:Y '} M13 : ST_MotionStage := (nEnableMode:=ENUM_StageEnableMode.ALWAYS, bPowerSelf:=TRUE); fbMotionStage_m13 : FB_MotionStage; //MR3K4 rX {attribute 'TcLinkTo' := '.bLimitForwardEnable :=TIIB[EL7041-0052_M3K4rX]^STM Status^Status^Digital input 1; .bLimitBackwardEnable:=TIIB[EL7041-0052_M3K4rX]^STM Status^Status^Digital input 2; .nRawEncoderULINT := TIIB[EL5042_M3K4Y_M3K4rX]^FB Inputs Channel 2^Position'} {attribute 'pytmc' := ' pv: MR3K4:KBO:MMS:PITCH '} M14 : ST_MotionStage := (nEnableMode:=ENUM_StageEnableMode.ALWAYS, bPowerSelf:=TRUE); fbMotionStage_m14 : FB_MotionStage; //MR3K4 US BEND {attribute 'TcLinkTo' := '.bLimitForwardEnable :=TIIB[EL7041_M3K4_BEND_US]^STM Status^Status^Digital input 1; .bLimitBackwardEnable:=TIIB[EL7041_M3K4_BEND_US]^STM Status^Status^Digital input 2; .nRawEncoderULINT := TIIB[EL5042_M3K4_BEND_USDS]^FB Inputs Channel 1^Position'} {attribute 'pytmc' := ' pv: MR3K4:KBO:MMS:BEND:US '} M15 : ST_MotionStage := (nEnableMode:=ENUM_StageEnableMode.DURING_MOTION, bPowerSelf:=TRUE); fbMotionStage_m15 : FB_MotionStage; ////////////////////////////////// //MR3K4 DS BEND {attribute 'TcLinkTo' := '.bLimitForwardEnable :=TIIB[EL7041_M3K4_BEND_DS]^STM Status^Status^Digital input 1; .bLimitBackwardEnable:=TIIB[EL7041_M3K4_BEND_DS]^STM Status^Status^Digital input 2; .nRawEncoderULINT := TIIB[EL5042_M2K4_BEND_USDS]^FB Inputs Channel 2^Position'} {attribute 'pytmc' := ' pv: MR3K4:KBO:MMS:BEND:DS '} M16 : ST_MotionStage := (nEnableMode:=ENUM_StageEnableMode.DURING_MOTION, bPowerSelf:=TRUE); fbMotionStage_m16 : FB_MotionStage; //M4K4 X {attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[EL7041-0052_M4K4X]^STM Status^Status^Digital input 1; .bLimitBackwardEnable:=TIIB[EL7041-0052_M4K4X]^STM Status^Status^Digital input 2; .nRawEncoderULINT:=TIIB[EL5042_M4K4X_M4K4Y]^FB Inputs Channel 1^Position'} {attribute 'pytmc' := ' pv: MR4K4:KBO:MMS:X '} M17 : ST_MotionStage := (nEnableMode:=ENUM_StageEnableMode.ALWAYS, bPowerSelf:=TRUE); fbMotionStageM17 : FB_MotionStage; //M4K4 Y {attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[EL7041-0052_M4K4Y]^STM Status^Status^Digital input 1; .bLimitBackwardEnable:=TIIB[EL7041-0052_M4K4Y]^STM Status^Status^Digital input 2; .nRawEncoderULINT:=TIIB[EL5042_M4K4X_M4K4Y]^FB Inputs Channel 2^Position'} {attribute 'pytmc' := ' pv: MR4K4:KBO:MMS:Y '} M18 : ST_MotionStage := (nEnableMode:=ENUM_StageEnableMode.ALWAYS, bPowerSelf:=TRUE); fbMotionStageM18 : FB_MotionStage; //M4K4 Z {attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[EL7041-0052_M4K4Z]^STM Status^Status^Digital input 2; .bLimitBackwardEnable:=TIIB[EL7041-0052_M4K4Z]^STM Status^Status^Digital input 1; .nRawEncoderULINT:=TIIB[EL5042_M4K4Z_M4K4rX]^FB Inputs Channel 1^Position'} {attribute 'pytmc' := ' pv: MR4K4:KBO:MMS:Z '} M19 : ST_MotionStage := (nEnableMode:=ENUM_StageEnableMode.ALWAYS, bPowerSelf:=TRUE); fbMotionStageM19 : FB_MotionStage; //M4K4 rX {attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[EL7041-0052_M4K4rX]^STM Status^Status^Digital input 1; .bLimitBackwardEnable:=TIIB[EL7041-0052_M4K4rX]^STM Status^Status^Digital input 2; .nRawEncoderULINT:=TIIB[EL5042_M4K4Z_M4K4rX]^FB Inputs Channel 2^Position'} {attribute 'pytmc' := ' pv: MR4K4:KBO:MMS:PITCH '} M20 : ST_MotionStage := (nEnableMode:=ENUM_StageEnableMode.ALWAYS, bPowerSelf:=TRUE); fbMotionStageM20 : FB_MotionStage; //M5K4 X {attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[EL7041-0052_M5K4X]^STM Status^Status^Digital input 1; .bLimitBackwardEnable:=TIIB[EL7041-0052_M5K4X]^STM Status^Status^Digital input 2; .nRawEncoderULINT:=TIIB[EL5042_M5K4X_M5K4Y]^FB Inputs Channel 1^Position'} {attribute 'pytmc' := ' pv: MR5K4:KBO:MMS:X '} M21 : ST_MotionStage := (nEnableMode:=ENUM_StageEnableMode.ALWAYS, bPowerSelf:=TRUE); fbMotionStageM21 : FB_MotionStage; //M5K4 Y {attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[EL7041-0052_M5K4Y]^STM Status^Status^Digital input 1; .bLimitBackwardEnable:=TIIB[EL7041-0052_M5K4Y]^STM Status^Status^Digital input 2; .nRawEncoderULINT:=TIIB[EL5042_M5K4X_M5K4Y]^FB Inputs Channel 2^Position'} {attribute 'pytmc' := ' pv: MR5K4:KBO:MMS:Y '} M22 : ST_MotionStage := (nEnableMode:=ENUM_StageEnableMode.ALWAYS, bPowerSelf:=TRUE); fbMotionStageM22 : FB_MotionStage; //M5K4 Z {attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[EL7041-0052_M5K4Z]^STM Status^Status^Digital input 2; .bLimitBackwardEnable:=TIIB[EL7041-0052_M5K4Z]^STM Status^Status^Digital input 1; .nRawEncoderULINT:=TIIB[EL5042_M5K4Z_M5K4rY]^FB Inputs Channel 1^Position'} {attribute 'pytmc' := ' pv: MR5K4:KBO:MMS:Z '} M23 : ST_MotionStage := (nEnableMode:=ENUM_StageEnableMode.ALWAYS, bPowerSelf:=TRUE); fbMotionStageM23 : FB_MotionStage; //M5K4 rY {attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[EL7041-0052_M5K4rY]^STM Status^Status^Digital input 1; .bLimitBackwardEnable:=TIIB[EL7041-0052_M5K4rY]^STM Status^Status^Digital input 2; .nRawEncoderULINT:=TIIB[EL5042_M5K4Z_M5K4rY]^FB Inputs Channel 2^Position'} {attribute 'pytmc' := ' pv: MR5K4:KBO:MMS:PITCH '} M24 : ST_MotionStage := (nEnableMode:=ENUM_StageEnableMode.ALWAYS, bPowerSelf:=TRUE); fbMotionStageM24 : FB_MotionStage; //MR4K4 MR5K4 STO button {attribute 'TcLinkTo' := 'TIIB[Term 109 (EL1004)]^Channel 1^Input'} bDreamEnable1 AT %I* : BOOL; {attribute 'TcLinkTo' := 'TIIB[Term 109 (EL1004)]^Channel 2^Input'} bDreamEnable2 AT %I* : BOOL; // Encoder Arrays/RMS Watch: //MR2K4 X ENC RMS {attribute 'pytmc' := ' pv: MR2K4:KBO:ENC:X '} fbXRMSErrorM2K4 : FB_RMSWatch; fMaxXRMSErrorM2K4 : LREAL; fMinXRMSErrorM2K4 : LREAL; //MR2K4 Y ENC RMS {attribute 'pytmc' := ' pv: MR2K4:KBO:ENC:Y '} fbYRMSErrorM2K4 : FB_RMSWatch; fMaxYRMSErrorM2K4 : LREAL; fMinYRMSErrorM2K4 : LREAL; //MR2K4 rY ENC RMS {attribute 'pytmc' := ' pv: MR2K4:KBO:ENC:PITCH '} fbrYRMSErrorM2K4 : FB_RMSWatch; fMaxrYRMSErrorM2K4 : LREAL; fMinrYRMSErrorM2K4 : LREAL; //MR2K4 US BENDER ENC RMS {attribute 'pytmc' := ' pv: MR2K4:KBO:ENC:BEND:US '} fbBendUSRMSErrorM2K4 : FB_RMSWatch; fMaxBendUSRMSErrorM2K4 : LREAL; fMinBendUSRMSErrorM2K4 : LREAL; //MR2K4 DS BENDER ENC RMS {attribute 'pytmc' := ' pv: MR2K4:KBO:ENC:BEND:DS '} fbBendDSRMSErrorM2K4 : FB_RMSWatch; fMaxBendDSRMSErrorM2K4 : LREAL; fMinBendDSRMSErrorM2K4 : LREAL; //MR3K4 X ENC RMS {attribute 'pytmc' := ' pv: MR3K4:KBO:ENC:X '} fbXRMSErrorM3K4 : FB_RMSWatch; fMaxXRMSErrorM3K4 : LREAL; fMinXRMSErrorM3K4 : LREAL; //MR3K4 Y ENC RMS {attribute 'pytmc' := ' pv: MR3K4:KBO:ENC:Y '} fbYRMSErrorM3K4 : FB_RMSWatch; fMaxYRMSErrorM3K4 : LREAL; fMinYRMSErrorM3K4 : LREAL; //MR3K4 rX ENC RMS {attribute 'pytmc' := ' pv: MR3K4:KBO:ENC:PITCH '} fbrXRMSErrorM3K4 : FB_RMSWatch; fMaxrXRMSErrorM3K4 : LREAL; fMinrXRMSErrorM3K4 : LREAL; //MR3K4 US BENDER ENC RMS {attribute 'pytmc' := ' pv: MR3K4:KBO:ENC:BEND:US '} fbBendUSRMSErrorM3K4 : FB_RMSWatch; fMaxBendUSRMSErrorM3K4 : LREAL; fMinBendUSRMSErrorM3K4 : LREAL; //MR3K4 DS BENDER ENC RMS {attribute 'pytmc' := ' pv: MR3K4:KBO:ENC:BEND:DS '} fbBendDSRMSErrorM3K4 : FB_RMSWatch; fMaxBendDSRMSErrorM3K4 : LREAL; fMinBendDSRMSErrorM3K4 : LREAL; //MR4K4 X ENC RMS {attribute 'pytmc' := ' pv: MR4K4:KBO:ENC:X '} fbXRMSErrorM4K4 : FB_RMSWatch; fMaxXRMSErrorM4K4 : LREAL; fMinXRMSErrorM4K4 : LREAL; //MR4K4 Y ENC RMS {attribute 'pytmc' := ' pv: MR4K4:KBO:ENC:Y '} fbYRMSErrorM4K4 : FB_RMSWatch; fMaxYRMSErrorM4K4 : LREAL; fMinYRMSErrorM4K4 : LREAL; //MR4K4 Z ENC RMS {attribute 'pytmc' := ' pv: MR4K4:KBO:ENC:Z '} fbZRMSErrorM4K4 : FB_RMSWatch; fMaxZRMSErrorM4K4 : LREAL; fMinZRMSErrorM4K4 : LREAL; //MR4K4 rX ENC RMS {attribute 'pytmc' := ' pv: MR4K4:KBO:ENC:PITCH '} fbPRMSErrorM4K4 : FB_RMSWatch; fMaxPRMSErrorM4K4 : LREAL; fMinPRMSErrorM4K4 : LREAL; //MR5K4 X ENC RMS {attribute 'pytmc' := ' pv: MR5K4:KBO:ENC:X '} fbXRMSErrorM5K4 : FB_RMSWatch; fMaxXRMSErrorM5K4 : LREAL; fMinXRMSErrorM5K4 : LREAL; //MR5K4 Y ENC RMS {attribute 'pytmc' := ' pv: MR5K4:KBO:ENC:Y '} fbYRMSErrorM5K4 : FB_RMSWatch; fMaxYRMSErrorM5K4 : LREAL; fMinYRMSErrorM5K4 : LREAL; //MR5K4 Z ENC RMS {attribute 'pytmc' := ' pv: MR5K4:KBO:ENC:Z '} fbZRMSErrorM5K4 : FB_RMSWatch; fMaxZRMSErrorM5K4 : LREAL; fMinZRMSErrorM5K4 : LREAL; //MR5K4 rX ENC RMS {attribute 'pytmc' := ' pv: MR5K4:KBO:ENC:PITCH '} fbPRMSErrorM5K4 : FB_RMSWatch; fMaxPRMSErrorM5K4 : LREAL; fMinPRMSErrorM5K4 : LREAL; // Encoder Reference Values //MR2K4 X ENC REF {attribute 'pytmc' := ' pv: MR2K4:KBO:ENC:X:REF field: EGU cnt io: i '} nEncRefXM2K4 : UDINT; //MR2K4 Y ENC REF {attribute 'pytmc' := ' pv: MR2K4:KBO:ENC:Y:REF field: EGU cnt io: i '} nEncRefYM2K4 : UDINT; //MR2K4 rY ENC REF {attribute 'pytmc' := ' pv: MR2K4:KBO:ENC:PITCH:REF field: EGU cnt io: i '} nEncRefrYM2K4 : UDINT; //MR3K4 X ENC REF {attribute 'pytmc' := ' pv: MR3K4:KBO:ENC:X:REF field: EGU cnt io: i '} nEncRefXM3K4 : UDINT; //MR3K4 Y ENC REF {attribute 'pytmc' := ' pv: MR3K4:KBO:ENC:Y:REF field: EGU cnt io: i '} nEncRefYM3K4 : UDINT; //MR3K4 rX ENC REF {attribute 'pytmc' := ' pv: MR3K4:KBO:ENC:PITCH:REF field: EGU cnt io: i '} nEncRefrXM3K4 : UDINT; // Encoder raw counts //MR2K4 X ENC CNT {attribute 'pytmc' := ' pv: MR2K4:KBO:ENC:X:CNT field: EGU cnt io: i '} nEncCntXM2K4 : UDINT; //MR2K4 Y ENC CNT {attribute 'pytmc' := ' pv: MR2K4:KBO:ENC:Y:CNT field: EGU cnt io: i '} nEncCntYM2K4 : UDINT; //MR2K4 rY ENC CNT {attribute 'pytmc' := ' pv: MR2K4:KBO:ENC:PITCH:CNT field: EGU cnt io: i '} nEncCntrYM2K4 : UDINT; //MR3K4 X ENC CNT {attribute 'pytmc' := ' pv: MR3K4:KBO:ENC:X:CNT field: EGU cnt io: i '} nEncCntXM3K4 : UDINT; //MR3K4 Y ENC CNT {attribute 'pytmc' := ' pv: MR3K4:KBO:ENC:Y:CNT field: EGU cnt io: i '} nEncCntYM3K4 : UDINT; //MR3K4 rX ENC CNT {attribute 'pytmc' := ' pv: MR3K4:KBO:ENC:PITCH:CNT field: EGU cnt io: i '} nEncCntrXM3K4 : UDINT; //Emergency Stop for LAMP KBs (M2K4 and M3K4) LAMPbSTOEnable1 AT %I* : BOOL; LAMPbSTOEnable2 AT %I* : BOOL; // LAMP KB BENDER RTDs // M2K4 US RTDs {attribute 'pytmc' := ' pv: MR2K4:KBO:RTD:BEND:US:1 field: ASLO 0.1 field: EGU C io: i '} fM2K4US_RTD_1 : REAL; {attribute 'pytmc' := ' pv: MR2K4:KBO:RTD:BEND:US:3 field: ASLO 0.1 field: EGU C io: i '} fM2K4US_RTD_3 : REAL; // M2K4 DS RTDs {attribute 'pytmc' := ' pv: MR2K4:KBO:RTD:BEND:DS:1 field: ASLO 0.1 field: EGU C io: i '} fM2K4DS_RTD_1 : REAL; {attribute 'pytmc' := ' pv: MR2K4:KBO:RTD:BEND:DS:3 field: ASLO 0.1 field: EGU C io: i '} fM2K4DS_RTD_3 : REAL; // M3K4 US RTDs {attribute 'pytmc' := ' pv: MR3K4:KBO:RTD:BEND:US:1 field: ASLO 0.1 field: EGU C io: i '} fM3K4US_RTD_1 : REAL; {attribute 'pytmc' := ' pv: MR3K4:KBO:RTD:BEND:US:3 field: ASLO 0.1 field: EGU C io: i '} fM3K4US_RTD_3 : REAL; // M3K4 DS RTDs {attribute 'pytmc' := ' pv: MR3K4:KBO:RTD:BEND:DS:1 field: ASLO 0.1 field: EGU C io: i '} fM3K4DS_RTD_1 : REAL; {attribute 'pytmc' := ' pv: MR3K4:KBO:RTD:BEND:DS:3 field: ASLO 0.1 field: EGU cnt io: i '} fM3K4DS_RTD_3 AT %I* : REAL; // RTD error bit bM2K4US_RTD_1_Err AT %I*: BOOL; bM2K4US_RTD_2_Err AT %I*: BOOL; bM2K4US_RTD_3_Err AT %I*: BOOL; bM2K4DS_RTD_1_Err AT %I*: BOOL; bM2K4DS_RTD_2_Err AT %I*: BOOL; bM2K4DS_RTD_3_Err AT %I*: BOOL; bM3K4US_RTD_1_Err AT %I*: BOOL; bM3K4US_RTD_2_Err AT %I*: BOOL; bM3K4US_RTD_3_Err AT %I*: BOOL; bM3K4DS_RTD_1_Err AT %I*: BOOL; bM3K4DS_RTD_2_Err AT %I*: BOOL; bM3K4DS_RTD_3_Err AT %I*: BOOL; // Logging fbLogHandler : FB_LogHandler; END_VAR // M1K4 M1K4.fbRunHOMS(stYup:=M1, stYdwn:=M2, stXup:=M3, stXdwn:=M4, stPitch:=M5, nYupEncRef:=GVL_M1K4_Constants.nYUP_ENC_REF, nYdwnEncRef:=GVL_M1K4_Constants.nYDWN_ENC_REF, nXupEncRef:=GVL_M1K4_Constants.nXUP_ENC_REF, nXdwnEncRef:=GVL_M1K4_Constants.nXDWN_ENC_REF, bExecuteCoupleY:=M1K4.bExecuteCoupleY, bExecuteCoupleX:=M1K4.bExecuteCoupleX, bExecuteDecoupleY:=M1K4.bExecuteDecoupleY, bExecuteDecoupleX:=M1K4.bExecuteDecoupleX, bGantryAlreadyCoupledY=>M1K4.bGantryAlreadyCoupledY, bGantryAlreadyCoupledX=>M1K4.bGantryAlreadyCoupledX, nCurrGantryY=>M1K4.nCurrGantryY, nCurrGantryX=>M1K4.nCurrGantryX); (* fbBenderM1K4(stBender:=M6, bSTOEnable1:=M1K4.fbRunHOMS.bSTOEnable1, bSTOEnable2:=M1K4.fbRunHOMS.bSTOEnable2); *) // No slave motion through Epics M2.bExecute := FALSE; // M1K4-Ydwn M4.bExecute := FALSE; // M1K4-Xdwn // Convert nCurrGantry to um (smaller number) to read out in epics M1K4.fCurrGantryY_um := LINT_TO_REAL(M1K4.nCurrGantryY) / 1000.0; M1K4.fCurrGantryX_um := LINT_TO_REAL(M1K4.nCurrGantryX) / 1000.0; // FB_MotionStage's for non-piezo axes fbMotionStage_m1(stMotionStage:=M1); fbMotionStage_m2(stMotionStage:=M2); fbMotionStage_m3(stMotionStage:=M3); fbMotionStage_m4(stMotionStage:=M4); fbMotionStage_m5(stMotionStage:=M5); // fbMotionStage_m6(stMotionStage:=M6); // Calculate Pitch RMS Error: fbYRMSErrorM1K4(stMotionStage:=M1, fMaxRMSError=>fMaxYRMSErrorM1K4, fMinRMSError=>fMinYRMSErrorM1K4); fbXRMSErrorM1K4(stMotionStage:=M3, fMaxRMSError=>fMaxXRMSErrorM1K4, fMinRMSError=>fMinXRMSErrorM1K4); fbPitchRMSErrorM1K4(stMotionStage:=M5, fMaxRMSError=>fMaxPitchRMSErrorM1K4, fMinRMSError=>fMinPitchRMSErrorM1K4); (* fbBenderRMSErrorM1K4(stMotionStage:=M6, fMaxRMSError=>fMaxBenderRMSErrorM1K4, fMinRMSError=>fMinBenderRMSErrorM1K4); *) // Pitch Control //fbM1K4PitchControl(Pitch:=GVL_M1K4.M1K4_Pitch, //Stepper:=M5, //lrCurrentSetpoint:=M5.fPosition, //q_bDone=>bM1K4PitchDone, //q_bBusy=>bM1K4PitchBusy); // When STO hit, need to reset SP //IF NOT M5.bHardwareEnable THEN //M5.fPosition := M5.stAxisStatus.fActPosition; //END_IF // Raw Encoder Counts For Epics nEncCntYupM1K4 := ULINT_TO_UDINT(M1K4.fbRunHOMS.stYupEnc.Count); nEncCntYdwnM1K4 := ULINT_TO_UDINT(M1K4.fbRunHOMS.stYdwnEnc.Count); nEncCntXupM1K4 := ULINT_TO_UDINT(M1K4.fbRunHOMS.stXupEnc.Count); nEncCntXdwnM1K4 := ULINT_TO_UDINT(M1K4.fbRunHOMS.stXdwnEnc.Count); nEncCntPitchM1K4 := LINT_TO_UDINT(GVL_M1K4.M1K4_Pitch.diEncCnt); // Encoder Reference Values For Epics nEncRefYupM1K4 := ULINT_TO_UDINT(GVL_M1K4_Constants.nYUP_ENC_REF); nEncRefYdwnM1K4 := ULINT_TO_UDINT(GVL_M1K4_Constants.nYDWN_ENC_REF); nEncRefXupM1K4 := ULINT_TO_UDINT(GVL_M1K4_Constants.nXUP_ENC_REF); nEncRefXdwnM1K4 := ULINT_TO_UDINT(GVL_M1K4_Constants.nXDWN_ENC_REF); mcReadParameterPitchM1K4(Axis:=M5.Axis, Enable:=TRUE, ParameterNumber:=MC_AxisParameter.AxisEncoderOffset, ReadMode:=READMODE_CYCLIC, Value=>fEncRefPitchM1K4_urad); nEncRefPitchM1K4 := LREAL_TO_UDINT(ABS(fEncRefPitchM1K4_urad) * fEncLeverArm_mm); ////////////////////////////////////////////////////////// //M2K4 and M3K4 //FB_Motion stages for LAMP KBs //MR2K4 fbMotionStage_m7(stMotionStage:=M7); fbMotionStage_m8(stMotionStage:=M8); fbMotionStage_m9(stMotionStage:=M9); //MR2K4 BEND fbMotionStage_m10(stMotionStage:=M10); fbMotionStage_m11(stMotionStage:=M11); //MR3K4 fbMotionStage_m12(stMotionStage:=M12); fbMotionStage_m13(stMotionStage:=M13); fbMotionStage_m14(stMotionStage:=M14); //MR3K4 BEND fbMotionStage_m15(stMotionStage:=M15); fbMotionStage_m16(stMotionStage:=M16); //MR4K4 and MR5K4 M17.bHardwareEnable := bDREAMEnable1 and bDREAMenable2; M18.bHardwareEnable := bDREAMEnable1 and bDREAMenable2; M19.bHardwareEnable := bDREAMEnable1 and bDREAMenable2; M20.bHardwareEnable := bDREAMEnable1 and bDREAMenable2; M21.bHardwareEnable := bDREAMEnable1 and bDREAMenable2; M22.bHardwareEnable := bDREAMEnable1 and bDREAMenable2; M23.bHardwareEnable := bDREAMEnable1 and bDREAMenable2; M24.bHardwareEnable := bDREAMEnable1 and bDREAMenable2; //MR4K4 fbMotionStageM17(stMotionStage:=M17); fbMotionStageM18(stMotionStage:=M18); fbMotionStageM19(stMotionStage:=M19); fbMotionStageM20(stMotionStage:=M20); //MR5K4 fbMotionStageM21(stMotionStage:=M21); fbMotionStageM22(stMotionStage:=M22); fbMotionStageM23(stMotionStage:=M23); fbMotionStageM24(stMotionStage:=M24); // Calculate Pitch RMS Error for LAMP KBs: //MR2K4 X ENC RMS fbXRMSErrorM2K4(stMotionStage:=M7, fMaxRMSError=>fMaxXRMSErrorM2K4, fMinRMSError=>fMinXRMSErrorM2K4); //MR2K4 Y ENC RMS fbYRMSErrorM2K4(stMotionStage:=M8, fMaxRMSError=>fMaxYRMSErrorM2K4, fMinRMSError=>fMinYRMSErrorM2K4); //MR2K4 rY ENC RMS fbrYRMSErrorM2K4(stMotionStage:=M9, fMaxRMSError=>fMaxrYRMSErrorM2K4, fMinRMSError=>fMinrYRMSErrorM2K4); //MR2K4 US BENDER ENC RMS fbBendUSRMSErrorM2K4(stMotionStage:=M10, fMaxRMSError=>fMaxBendUSRMSErrorM2K4, fMinRMSError=>fMinBendUSRMSErrorM2K4); //MR2K4 DS BENDER ENC RMS fbBendDSRMSErrorM2K4(stMotionStage:=M11, fMaxRMSError=>fMaxBendDSRMSErrorM2K4, fMinRMSError=>fMinBendDSRMSErrorM2K4); //MR3K4 X ENC RMS fbXRMSErrorM3K4(stMotionStage:=M12, fMaxRMSError=>fMaxXRMSErrorM3K4, fMinRMSError=>fMinXRMSErrorM3K4); //MR3K4 Y ENC RMS fbYRMSErrorM3K4(stMotionStage:=M13, fMaxRMSError=>fMaxYRMSErrorM3K4, fMinRMSError=>fMinYRMSErrorM3K4); //MR3K4 rX ENC RMS fbrXRMSErrorM3K4(stMotionStage:=M14, fMaxRMSError=>fMaxrXRMSErrorM3K4, fMinRMSError=>fMinrXRMSErrorM3K4); //MR3K4 US BENDER ENC RMS fbBendUSRMSErrorM3K4(stMotionStage:=M15, fMaxRMSError=>fMaxBendUSRMSErrorM3K4, fMinRMSError=>fMinBendUSRMSErrorM3K4); //MR3K4 DS BENDER ENC RMS fbBendDSRMSErrorM3K4(stMotionStage:=M16, fMaxRMSError=>fMaxBendDSRMSErrorM3K4, fMinRMSError=>fMinBendDSRMSErrorM3K4); // Calculate Pitch RMS Error for DREAM KBs: //MR4K4 X ENC RMS fbXRMSErrorM4K4(stMotionStage:=M17, fMaxRMSError=>fMaxXRMSErrorM4K4, fMinRMSError=>fMinXRMSErrorM4K4); //MR4K4 Y ENC RMS fbYRMSErrorM4K4(stMotionStage:=M18, fMaxRMSError=>fMaxYRMSErrorM4K4, fMinRMSError=>fMinYRMSErrorM4K4); //MR4K4 Z ENC RMS fbZRMSErrorM4K4(stMotionStage:=M19, fMaxRMSError=>fMaxZRMSErrorM4K4, fMinRMSError=>fMinZRMSErrorM4K4); //MR4K4 rX ENC RMS fbPRMSErrorM4K4(stMotionStage:=M20, fMaxRMSError=>fMaxPRMSErrorM4K4, fMinRMSError=>fMinPRMSErrorM4K4); //MR5K4 X ENC RMS fbXRMSErrorM5K4(stMotionStage:=M21, fMaxRMSError=>fMaxXRMSErrorM5K4, fMinRMSError=>fMinXRMSErrorM5K4); //MR5K4 Y ENC RMS fbYRMSErrorM5K4(stMotionStage:=M22, fMaxRMSError=>fMaxYRMSErrorM5K4, fMinRMSError=>fMinYRMSErrorM5K4); //MR5K4 Z ENC RMS fbZRMSErrorM5K4(stMotionStage:=M23, fMaxRMSError=>fMaxZRMSErrorM5K4, fMinRMSError=>fMinZRMSErrorM5K4); //MR5K4 rY ENC RMS fbPRMSErrorM5K4(stMotionStage:=M24, fMaxRMSError=>fMaxPRMSErrorM5K4, fMinRMSError=>fMinPRMSErrorM5K4); //STO for LAMP KBs //MR2K4 M7.bHardwareEnable := LAMPbSTOEnable1 AND LAMPbSTOEnable2; M8.bHardwareEnable := LAMPbSTOEnable1 AND LAMPbSTOEnable2; M9.bHardwareEnable := LAMPbSTOEnable1 AND LAMPbSTOEnable2; //MR2K4 BEND M10.bHardwareEnable := LAMPbSTOEnable1 AND LAMPbSTOEnable2; M11.bHardwareEnable := LAMPbSTOEnable1 AND LAMPbSTOEnable2; //MR3K4 M12.bHardwareEnable := LAMPbSTOEnable1 AND LAMPbSTOEnable2; M13.bHardwareEnable := LAMPbSTOEnable1 AND LAMPbSTOEnable2; M14.bHardwareEnable := LAMPbSTOEnable1 AND LAMPbSTOEnable2; //MR3K4 BEND M15.bHardwareEnable := LAMPbSTOEnable1 AND LAMPbSTOEnable2; M16.bHardwareEnable := LAMPbSTOEnable1 AND LAMPbSTOEnable2; // LAMP KB Encoder Reference Values For Epics nEncRefXM2K4 := ULINT_TO_UDINT(GVL_M2K4_Constants.nM2K4X_ENC_REF); nEncRefYM2K4 := ULINT_TO_UDINT(GVL_M2K4_Constants.nM2K4Y_ENC_REF); nEncRefrYM2K4 := ULINT_TO_UDINT(GVL_M2K4_Constants.nM2K4rY_ENC_REF); nEncRefXM3K4 := ULINT_TO_UDINT(GVL_M3K4_Constants.nM3K4X_ENC_REF); nEncRefYM3K4 := ULINT_TO_UDINT(GVL_M3K4_Constants.nM3K4Y_ENC_REF); nEncRefrXM3K4 := ULINT_TO_UDINT(GVL_M3K4_Constants.nM3K4rX_ENC_REF); // LAMP KB Encoder Count Values For Epics nEncCntXM2K4 := ULINT_TO_UDINT(M7.nRawEncoderULINT); nEncCntYM2K4 := ULINT_TO_UDINT(M8.nRawEncoderULINT); nEncCntrYM2K4 := ULINT_TO_UDINT(M9.nRawEncoderULINT); nEncCntXM3K4 := ULINT_TO_UDINT(M12.nRawEncoderULINT); nEncCntYM3K4 := ULINT_TO_UDINT(M13.nRawEncoderULINT); nEncCntrXM3K4 := ULINT_TO_UDINT(M14.nRawEncoderULINT); ; // LAMP KB Bender RTDs fM2K4US_RTD_1 := INT_TO_REAL(GVL_M2K4_RTD.nM2K4US_RTD_1); fM2K4US_RTD_3 := INT_TO_REAL(GVL_M2K4_RTD.nM2K4US_RTD_3); fM2K4DS_RTD_1 := INT_TO_REAL(GVL_M2K4_RTD.nM2K4DS_RTD_1); fM2K4DS_RTD_3 := INT_TO_REAL(GVL_M2K4_RTD.nM2K4DS_RTD_3); fM3K4US_RTD_1 := INT_TO_REAL(GVL_M3K4_RTD.nM3K4US_RTD_1); fM3K4US_RTD_3 := INT_TO_REAL(GVL_M3K4_RTD.nM3K4US_RTD_3); fM3K4DS_RTD_1 := INT_TO_REAL(GVL_M3K4_RTD.nM3K4DS_RTD_1); fM3K4DS_RTD_3 := INT_TO_REAL(GVL_M3K4_RTD.nM3K4DS_RTD_3); // RTD not connected if T=0 bM2K4US_RTD_1_Err := fM2K4US_RTD_1 = 0; bM2K4US_RTD_3_Err := fM2K4US_RTD_3 = 0; bM2K4DS_RTD_1_Err := fM2K4DS_RTD_1 = 0; bM2K4DS_RTD_3_Err := fM2K4DS_RTD_3 = 0; bM3K4US_RTD_1_Err := fM3K4US_RTD_1 = 0; bM3K4US_RTD_3_Err := fM3K4US_RTD_3 = 0; bM3K4DS_RTD_1_Err := fM3K4DS_RTD_1 = 0; bM3K4DS_RTD_3_Err := fM3K4DS_RTD_3 = 0; // LAMP KB Bender RTD interlocks M10.bHardwareEnable R= fM2K4US_RTD_1 > 1000 OR bM2K4US_RTD_1_Err; M11.bHardwareEnable R= fM2K4DS_RTD_1 > 1000 OR bM2K4DS_RTD_1_Err; M15.bHardwareEnable R= fM3K4US_RTD_1 > 1000 OR bM3K4US_RTD_1_Err; M16.bHardwareEnable R= fM3K4DS_RTD_1 > 1000 OR bM3K4DS_RTD_1_Err; // Environment PRG_Environment(); // States PRG_States(); // PMPS PRG_PMPS(); //////////////////////////////// // Logging fbLogHandler(); END_PROGRAM Related: * `GVL_M1K4`_ * `GVL_M1K4_Constants`_ * `GVL_M2K4_Constants`_ * `GVL_M2K4_RTD`_ * `GVL_M3K4_Constants`_ * `GVL_M3K4_RTD`_ * `PRG_Environment`_ * `PRG_PMPS`_ * `PRG_States`_ P_Serial_Com ^^^^^^^^^^^^ :: PROGRAM P_Serial_Com VAR fbSerialLineControl_EL6001_M1K4: SerialLineControl; END_VAR //These are the global IOs...don't forget to copy your data into them (* EL6001 Serial port 0 com function *) fbSerialLineControl_EL6001_M1K4(Mode:= SERIALLINEMODE_EL6_22B (*SERIALLINEMODE_KL6_22B_STANDARD*), pComIn:= ADR(Serial_stComIn_M1K4), pComOut:=ADR(Serial_stComOut_M1K4), SizeComIn:= SIZEOF(Serial_stComIn_M1K4), TxBuffer:= Serial_TXBuffer_M1K4, RxBuffer:= Serial_RXBuffer_M1K4, Error=> , ErrorID=> ); END_PROGRAM P_StripeProtections ^^^^^^^^^^^^^^^^^^^ :: PROGRAM P_StripeProtections VAR (* MR1K4 (RBV = MR1K4:SOMS:ENC:YUP:CNT_RBV) B4C coating: RBV <= 15998960: 1111_1111_1111_1000 (allow everything between 350eV and 2.3keV) Transition: 15998960 < RBV < 19998960: 0000_0000_0000_0000 Silicon surface: RBV >= 19998960: 0000_0000_0001_1110 (allow everything between 250eV and 450eV) From M. Seaberg *) fbStripProtMR1K4 : FB_MirrorTwoCoatingProtection := ( sDevName := 'MR1K4:SOMS', nUpperCoatingBoundary := 19998960, sUpperCoatingType := 'SILICON', nLowerCoatingBoundary := 15998960, sLowerCoatingType := 'B4C'); (* MR2K4 (RBV = MR2K4:KBO:ENC:Y:CNT_RBV) B4C coating: RBV <= 6976835: 1111_1111_1111_1000 (allow everything between 350eV and 2.3keV) Transition: 6976835 < RBV < 7776781: 0000_0000_0000_0000 Silicon surface: RBV >= 7776781: 0000_0000_0001_1110 (allow everything below 250eV and 450eV) *) // MR2K4 Mirror Chin Guard RTDs {attribute 'TcLinkTo' := '.ffUpperCoatingLTemp.iRaw := TIIB[EL3202-0010_M2K4US1_M2K4US2]^RTD Inputs Channel 2^Value; .ffUpperCoatingLTemp.bUnderrange := TIIB[EL3202-0010_M2K4US1_M2K4US2]^RTD Inputs Channel 2^Status^Underrange; .ffUpperCoatingLTemp.bOverrange := TIIB[EL3202-0010_M2K4US1_M2K4US2]^RTD Inputs Channel 2^Status^Overrange; .ffUpperCoatingLTemp.bError := TIIB[EL3202-0010_M2K4US1_M2K4US2]^RTD Inputs Channel 2^Status^Error; .ffUpperCoatingRTemp.iRaw := TIIB[EL3202-0010_M2K4DS2_M2K4DS3]^RTD Inputs Channel 1^Value; .ffUpperCoatingRTemp.bUnderrange := TIIB[EL3202-0010_M2K4DS2_M2K4DS3]^RTD Inputs Channel 1^Status^Underrange; .ffUpperCoatingRTemp.bOverrange := TIIB[EL3202-0010_M2K4DS2_M2K4DS3]^RTD Inputs Channel 1^Status^Overrange; .ffUpperCoatingRTemp.bError := TIIB[EL3202-0010_M2K4DS2_M2K4DS3]^RTD Inputs Channel 1^Status^Error; .ffLowerCoatingLTemp.iRaw := TIIB[EL3202-0010_M2K4US1_M2K4US2]^RTD Inputs Channel 2^Value; .ffLowerCoatingLTemp.bUnderrange := TIIB[EL3202-0010_M2K4US1_M2K4US2]^RTD Inputs Channel 2^Status^Underrange; .ffLowerCoatingLTemp.bOverrange := TIIB[EL3202-0010_M2K4US1_M2K4US2]^RTD Inputs Channel 2^Status^Overrange; .ffLowerCoatingLTemp.bError := TIIB[EL3202-0010_M2K4US1_M2K4US2]^RTD Inputs Channel 2^Status^Error; .ffLowerCoatingRTemp.iRaw := TIIB[EL3202-0010_M2K4DS2_M2K4DS3]^RTD Inputs Channel 1^Value; .ffLowerCoatingRTemp.bUnderrange := TIIB[EL3202-0010_M2K4DS2_M2K4DS3]^RTD Inputs Channel 1^Status^Underrange; .ffLowerCoatingRTemp.bOverrange := TIIB[EL3202-0010_M2K4DS2_M2K4DS3]^RTD Inputs Channel 1^Status^Overrange; .ffLowerCoatingRTemp.bError := TIIB[EL3202-0010_M2K4DS2_M2K4DS3]^RTD Inputs Channel 1^Status^Error '} {attribute 'pytmc' := ' pv: MR2K4:KBO '} fbStripProtMR2K4 : FB_MirrorTwoCoatingProtection := ( sDevName := 'MR2K4:KBO', nUpperCoatingBoundary := 7776781, sUpperCoatingType := 'SILICON', nLowerCoatingBoundary := 6976835, sLowerCoatingType := 'B4C'); (* MR3K4 (RBV = MR3K4:KBO:ENC:X:CNT_RBV) B4C coating: RBV >= 5620000: 1111_1111_1111_1000 (allow everything between 350eV and 2.3keV) Transition: 4820000 < ENC < 5620000: 0000_0000_0000_0000 Silicon surface: RBV <= 4820000: 0000_0000_0001_1110 (allow everything between 250eV and 450 eV) *) // MR3K4 Mirror Chin Guard RTDs {attribute 'TcLinkTo' := '.ffUpperCoatingLTemp.iRaw := TIIB[EL3202-0010_M3K4US1_M3K4US2]^RTD Inputs Channel 2^Value; .ffUpperCoatingLTemp.bUnderrange := TIIB[EL3202-0010_M3K4US1_M3K4US2]^RTD Inputs Channel 2^Status^Underrange; .ffUpperCoatingLTemp.bOverrange := TIIB[EL3202-0010_M3K4US1_M3K4US2]^RTD Inputs Channel 2^Status^Overrange; .ffUpperCoatingLTemp.bError := TIIB[EL3202-0010_M3K4US1_M3K4US2]^RTD Inputs Channel 2^Status^Error; .ffUpperCoatingRTemp.iRaw := TIIB[EL3202-0010_M3K4DS2_M3K4DS3]^RTD Inputs Channel 1^Value; .ffUpperCoatingRTemp.bUnderrange := TIIB[EL3202-0010_M3K4DS2_M3K4DS3]^RTD Inputs Channel 1^Status^Underrange; .ffUpperCoatingRTemp.bOverrange := TIIB[EL3202-0010_M3K4DS2_M3K4DS3]^RTD Inputs Channel 1^Status^Overrange; .ffUpperCoatingRTemp.bError := TIIB[EL3202-0010_M3K4DS2_M3K4DS3]^RTD Inputs Channel 1^Status^Error; .ffLowerCoatingLTemp.iRaw := TIIB[EL3202-0010_M3K4US1_M3K4US2]^RTD Inputs Channel 2^Value; .ffLowerCoatingLTemp.bUnderrange := TIIB[EL3202-0010_M3K4US1_M3K4US2]^RTD Inputs Channel 2^Status^Underrange; .ffLowerCoatingLTemp.bOverrange := TIIB[EL3202-0010_M3K4US1_M3K4US2]^RTD Inputs Channel 2^Status^Overrange; .ffLowerCoatingLTemp.bError := TIIB[EL3202-0010_M3K4US1_M3K4US2]^RTD Inputs Channel 2^Status^Error; .ffLowerCoatingRTemp.iRaw := TIIB[EL3202-0010_M3K4DS2_M3K4DS3]^RTD Inputs Channel 1^Value; .ffLowerCoatingRTemp.bUnderrange := TIIB[EL3202-0010_M3K4DS2_M3K4DS3]^RTD Inputs Channel 1^Status^Underrange; .ffLowerCoatingRTemp.bOverrange := TIIB[EL3202-0010_M3K4DS2_M3K4DS3]^RTD Inputs Channel 1^Status^Overrange; .ffLowerCoatingRTemp.bError := TIIB[EL3202-0010_M3K4DS2_M3K4DS3]^RTD Inputs Channel 1^Status^Error '} {attribute 'pytmc' := ' pv: MR3K4:KBO '} fbStripProtMR3K4 : FB_MirrorTwoCoatingProtection := ( sDevName := 'MR3K4:KBO', nUpperCoatingBoundary := 5620000, sUpperCoatingType := 'B4C', nLowerCoatingBoundary := 4820000, sLowerCoatingType := 'SILICON'); END_VAR fbStripProtMR1K4(FFO:=GVL_PMPS.g_FastFaultOutput1, nCurrentEncoderCount := MAIN.nEncCntYupM1K4, neVRange:=PMPS_GVL.stCurrentBeamParameters.neVRange, bReadPmpsDb:= MOTION_GVL.fbStandardPMPSDB.bReadPmpsDb, bUsePmpsDb := TRUE, ); fbStripProtMR2K4(FFO:=GVL_PMPS.g_FastFaultOutput2, nCurrentEncoderCount := MAIN.nEncCntYM2K4, neVRange:=PMPS_GVL.stCurrentBeamParameters.neVRange, bReadPmpsDb := MOTION_GVL.fbStandardPMPSDB.bReadPmpsDb, bUsePmpsDb := TRUE, bMirrorTempFaults := TRUE, ); fbStripProtMR3K4(FFO:=GVL_PMPS.g_FastFaultOutput2, nCurrentEncoderCount := MAIN.nEncCntXM3K4, neVRange:=PMPS_GVL.stCurrentBeamParameters.neVRange, bReadPmpsDb := MOTION_GVL.fbStandardPMPSDB.bReadPmpsDb, bUsePmpsDb := TRUE, bMirrorTempFaults := TRUE, ); END_PROGRAM Related: * `GVL_PMPS`_ PiezoSerial ^^^^^^^^^^^ :: PROGRAM PiezoSerial VAR //PI Serial fbE621SerialDriver_M1K4 : FB_PI_E621_SerialDriver; rtInitParams_M1K4 : R_TRIG; tonTimeoutRst_M1K4 : TON := (PT:=T#2S); //For timeout reset END_VAR //Piezo E-621 /////////////////////// fbE621SerialDriver_M1K4.i_xExecute := TRUE; fbE621SerialDriver_M1K4.i_xExecute R= fbE621SerialDriver_M1K4.q_xDone; fbE621SerialDriver_M1K4(iq_stPiezoAxis:= GVL_M1K4.M1K4_Pitch.Piezo, iq_stSerialRXBuffer:= Serial_RXBuffer_M1K4, iq_stSerialTXBuffer:= Serial_TXBuffer_M1K4); END_PROGRAM Related: * `GVL_M1K4`_ PRG_1_PlcTask ^^^^^^^^^^^^^ :: PROGRAM PRG_1_PlcTask VAR END_VAR PRG_MR1K4_SOMS(); PRG_MR2K4_KBO(); PRG_MR3K4_KBO(); PRG_MR4K4_KBO(); PRG_MR5K4_KBO(); END_PROGRAM Related: * `PRG_MR1K4_SOMS`_ * `PRG_MR2K4_KBO`_ * `PRG_MR3K4_KBO`_ * `PRG_MR4K4_KBO`_ * `PRG_MR5K4_KBO`_ PRG_Environment ^^^^^^^^^^^^^^^ :: PROGRAM PRG_Environment VAR END_VAR // DREAM KB Internal RTDs GVL_M4K4_RTD.nM4K4_Chin_Left_RTD(); GVL_M4K4_RTD.nM4K4_Chin_Right_RTD(); GVL_M4K4_RTD.nM4K4_Chin_Tail_RTD(); GVL_M5K4_RTD.nM5K4_Chin_Left_RTD(); GVL_M5K4_RTD.nM5K4_Chin_Right_RTD(); GVL_M5K4_RTD.nM5K4_Chin_Tail_RTD(); END_PROGRAM Related: * `GVL_M4K4_RTD`_ * `GVL_M5K4_RTD`_ PRG_MR1K4_SOMS ^^^^^^^^^^^^^^ :: PROGRAM PRG_MR1K4_SOMS VAR // M1K4 Flow Press Sensors {attribute 'TcLinkTo' := '.fbFlow_1.iRaw := TIIB[EL3054_M1K4_FWM_PRSM]^AI Standard Channel 1^Value; .fbFlow_2.iRaw := TIIB[EL3054_M1K4_FWM_PRSM]^AI Standard Channel 2^Value; .fbPress_1.iRaw := TIIB[EL3054_M1K4_FWM_PRSM]^AI Standard Channel 3^Value '} {attribute 'pytmc' := ' pv: MR1K4:SOMS '} fbCoolingPanel : FB_Axilon_Cooling_2f1p; {attribute 'TcLinkTo' := 'TIIB[EP2008-0001_M1K4_VCV]^Channel 1^Output'} {attribute 'pytmc' := ' pv: MR1K4:SOMS:VCV io: io field: ZNAM OFF field: ONAM ON '} bActivateVarCool AT %Q* : BOOL; END_VAR fbCoolingPanel(); END_PROGRAM PRG_MR2K4_KBO ^^^^^^^^^^^^^ :: PROGRAM PRG_MR2K4_KBO VAR // M2K4 Flow Press Sensors {attribute 'TcLinkTo' := '.fbFlow_1.iRaw := TIIB[EL3054_FWM_PRSM]^AI Standard Channel 1^Value; .fbPress_1.iRaw := TIIB[EL3054_FWM_PRSM]^AI Standard Channel 3^Value '} {attribute 'pytmc' := ' pv: MR2K4:KBO '} fbCoolingPanel : FB_Axilon_Cooling_1f1p; // M2K4 Mirror RTDs {attribute 'TcLinkTo' := '.iRaw := TIIB[EL3202-0010_M2K4US1_M2K4US2]^RTD Inputs Channel 2^Value; .bUnderrange := TIIB[EL3202-0010_M2K4US1_M2K4US2]^RTD Inputs Channel 2^Status^Underrange; .bOverrange := TIIB[EL3202-0010_M2K4US1_M2K4US2]^RTD Inputs Channel 2^Status^Overrange; .bError := TIIB[EL3202-0010_M2K4US1_M2K4US2]^RTD Inputs Channel 2^Status^Error'} {attribute 'pytmc' := ' pv: MR2K4:KBO:RTD:CHIN:L field: EGU C io: i '} fbM2K4_Chin_Left_RTD : FB_TempSensor; {attribute 'TcLinkTo' := '.iRaw := TIIB[EL3202-0010_M2K4DS2_M2K4DS3]^RTD Inputs Channel 1^Value; .bUnderrange := TIIB[EL3202-0010_M2K4DS2_M2K4DS3]^RTD Inputs Channel 1^Status^Underrange; .bOverrange := TIIB[EL3202-0010_M2K4DS2_M2K4DS3]^RTD Inputs Channel 1^Status^Overrange; .bError := TIIB[EL3202-0010_M2K4DS2_M2K4DS3]^RTD Inputs Channel 1^Status^Error'} {attribute 'pytmc' := ' pv: MR2K4:KBO:RTD:CHIN:R field: EGU C io: i '} fbM2K4_Chin_Right_RTD : FB_TempSensor; END_VAR fbCoolingPanel(); fbM2K4_Chin_Left_RTD(); fbM2K4_Chin_Right_RTD(); END_PROGRAM PRG_MR3K4_KBO ^^^^^^^^^^^^^ :: PROGRAM PRG_MR3K4_KBO VAR // M3K4 Flow Press Sensors {attribute 'TcLinkTo' := '.fbFlow_1.iRaw := TIIB[EL3054_FWM_PRSM]^AI Standard Channel 2^Value; .fbPress_1.iRaw := TIIB[EL3054_FWM_PRSM]^AI Standard Channel 3^Value '} {attribute 'pytmc' := ' pv: MR3K4:KBO '} fbCoolingPanel : FB_Axilon_Cooling_1f1p; // M3K4 Mirror RTDs {attribute 'TcLinkTo' := '.iRaw := TIIB[EL3202-0010_M3K4US1_M3K4US2]^RTD Inputs Channel 2^Value; .bUnderrange := TIIB[EL3202-0010_M3K4US1_M3K4US2]^RTD Inputs Channel 2^Status^Underrange; .bOverrange := TIIB[EL3202-0010_M3K4US1_M3K4US2]^RTD Inputs Channel 2^Status^Overrange; .bError := TIIB[EL3202-0010_M3K4US1_M3K4US2]^RTD Inputs Channel 2^Status^Error'} {attribute 'pytmc' := ' pv: MR3K4:KBO:RTD:CHIN:L field: EGU C io: i '} fbM3K4_Chin_Left_RTD : FB_TempSensor; {attribute 'TcLinkTo' := '.iRaw := TIIB[EL3202-0010_M3K4DS2_M3K4DS3]^RTD Inputs Channel 1^Value; .bUnderrange := TIIB[EL3202-0010_M3K4DS2_M3K4DS3]^RTD Inputs Channel 1^Status^Underrange; .bOverrange := TIIB[EL3202-0010_M3K4DS2_M3K4DS3]^RTD Inputs Channel 1^Status^Overrange; .bError := TIIB[EL3202-0010_M3K4DS2_M3K4DS3]^RTD Inputs Channel 1^Status^Error'} {attribute 'pytmc' := ' pv: MR3K4:KBO:RTD:CHIN:R field: EGU C io: i '} fbM3K4_Chin_Right_RTD : FB_TempSensor; END_VAR fbCoolingPanel(); fbM3K4_Chin_Left_RTD(); fbM3K4_Chin_Right_RTD(); END_PROGRAM PRG_MR4K4_KBO ^^^^^^^^^^^^^ :: PROGRAM PRG_MR4K4_KBO VAR // MR4K4 Flow Press Sensors {attribute 'TcLinkTo' := '.fbFlow_1.iRaw := TIIB[EL3054_FWM_PRSM_MR45K4]^AI Standard Channel 1^Value; .fbPress_1.iRaw := TIIB[EL3054_FWM_PRSM_MR45K4]^AI Standard Channel 2^Value '} {attribute 'pytmc' := ' pv: MR4K4:KBO '} fbCoolingPanel : FB_Axilon_Cooling_1f1p; END_VAR fbCoolingPanel(); END_PROGRAM PRG_MR5K4_KBO ^^^^^^^^^^^^^ :: PROGRAM PRG_MR5K4_KBO VAR // MR5K4 Flow Press Sensors {attribute 'TcLinkTo' := '.fbFlow_1.iRaw := TIIB[EL3054_FWM_PRSM_MR45K4]^AI Standard Channel 3^Value; .fbPress_1.iRaw := TIIB[EL3054_FWM_PRSM_MR45K4]^AI Standard Channel 2^Value '} {attribute 'pytmc' := ' pv: MR5K4:KBO '} fbCoolingPanel : FB_Axilon_Cooling_1f1p; END_VAR fbCoolingPanel(); END_PROGRAM PRG_PMPS ^^^^^^^^ :: PROGRAM PRG_PMPS VAR fb_vetoArbiter : FB_VetoArbiter; fbArbiterIO : FB_SubSysToArbiter_IO; ffFFO2ToFFO1 : FB_FastFault := ( i_xAutoReset := TRUE, i_DevName := 'PMPS FFO2', i_Desc := 'Subordinate fast fault group, will clear on its own otherwise something is misconfigured in the diagnostic', i_TypeCode := 16#D); //fbOutputStates : FB_StateParams; bMR1K1_IN : BOOL; bST3K4_IN : BOOL; bMR1K3_IN : BOOL; bST1K4_IN : BOOL; END_VAR MOTION_GVL.fbStandardPMPSDB( io_fbFFHWO:= GVL_PMPS.g_FastFaultOutput1, bEnable:=TRUE, sPLCName:='plc-tmo-optics' ); P_StripeProtections(); bMR1K1_IN := PMPS.PMPS_GVL.stCurrentBeamParameters.aVetoDevices[PMPS.K_Stopper.MR1K1_IN] AND NOT PMPS.PMPS_GVL.stCurrentBeamParameters.aVetoDevices[PMPS.K_Stopper.MR1K1_OUT]; bST3K4_IN := PMPS.PMPS_GVL.stCurrentBeamParameters.aVetoDevices[PMPS.K_Stopper.ST3K4]; bST1K4_IN := PMPS.PMPS_GVL.stCurrentBeamParameters.aVetoDevices[PMPS.K_Stopper.ST1K4]; bMR1K3_IN := PMPS.PMPS_GVL.stCurrentBeamParameters.aVetodevices[PMPS.K_Stopper.MR1K3_IN] AND NOT PMPS.PMPS_GVL.stCurrentBeamParameters.aVetoDevices[PMPS.K_Stopper.MR1K3_OUT]; fbArbiterIO(i_bVeto:= bMR1K1_IN OR bMR1K3_IN, Arbiter := GVL_PMPS.g_fbArbiter1, fbFFHWO := GVL_PMPS.g_FastFaultOutput1); ffFFO2ToFFO1(i_xOK := GVL_PMPS.g_FastFaultOutput2.q_xFastFaultOut, io_fbFFHWO := GVL_PMPS.g_FastFaultOutput1); GVL_PMPS.g_FastFaultOutput2.Execute(i_xVeto:= bMR1K1_IN OR bMR1K3_IN OR bST3K4_IN OR bST1K4_IN); GVL_PMPS.g_FastFaultOutput1.Execute(i_xVeto:= bMR1K1_IN OR bMR1K3_IN); fb_vetoArbiter(bVeto := GVL_PMPS.g_FastFaultOutput2.i_xVeto, HigherAuthority := GVL_PMPS.g_fbArbiter1, LowerAuthority:= GVL_PMPS.g_fbArbiter2, FFO:= GVL_PMPS.g_FastFaultOutput1); END_PROGRAM Related: * `GVL_PMPS`_ * `P_StripeProtections`_ PRG_States ^^^^^^^^^^ :: PROGRAM PRG_States VAR {attribute 'pytmc' := ' pv: MR1K4:SOMS:COATING:STATE; io: io; '} fbMR1K4_Coating_States: FB_Offset_Coating_States := (bBPOkAutoReset:= TRUE); {attribute 'pytmc' := ' pv: MR2K4:KBO:COATING:STATE; io: io; '} fbMR2K4_Coating_States: FB_KBO_Coating_States := (bBPOkAutoReset:= TRUE); {attribute 'pytmc' := ' pv: MR3K4:KBO:COATING:STATE; io: io; '} fbMR3K4_Coating_States: FB_KBO_Coating_States := (bBPOkAutoReset:= TRUE); END_VAR //MR1K4 Coating States with PMPS fbMR1K4_Coating_States.stCoating1.stPMPS.sPmpsState := 'MR1K4:SOMS-SILICON'; fbMR1K4_Coating_States.stCoating1.nEncoderCount := 22000532; fbMR1K4_Coating_States.stCoating2.stPMPS.sPmpsState := 'MR1K4:SOMS-B4C'; fbMR1K4_Coating_States.stCoating2.nEncoderCount := 5000141; fbMR2K4_Coating_States.stCoating1.stPMPS.sPmpsState := 'MR2K4:KBO-SILICON'; fbMR2K4_Coating_States.stCoating1.nEncoderCount := 8701960; fbMR2K4_Coating_States.stCoating2.stPMPS.sPmpsState := 'MR2K4:KBO-B4C'; fbMR2K4_Coating_States.stCoating2.nEncoderCount := 6636177; fbMR3K4_Coating_States.stCoating1.stPMPS.sPmpsState := 'MR3K4:KBO-SILICON'; fbMR3K4_Coating_States.stCoating1.nEncoderCount := 4719890; fbMR3K4_Coating_States.stCoating2.stPMPS.sPmpsState := 'MR3K4:KBO-B4C'; fbMR3K4_Coating_States.stCoating2.nEncoderCount := 8220029; fbMR1K4_Coating_States( bEnable := TRUE, stMotionStage:=Main.M1, sCoating1Name:='Si', sCoating2Name:='B4C', fbArbiter:=GVL_PMPS.g_fbArbiter1, fbFFHWO:=GVL_PMPS.g_FastFaultOutput1, sPmpsDeviceName:='MR1K4:SOMS', sTransitionKey:= 'MR1K4:SOMS-TRANSITION'); // MR2K4 Coating States with PMPS fbMR2K4_Coating_States( bEnable := TRUE, stMotionStage:=Main.M8, sCoating1Name:='Si', sCoating2Name:='B4C', fbArbiter:=GVL_PMPS.g_fbArbiter2, fbFFHWO:=GVL_PMPS.g_FastFaultOutput2, sPmpsDeviceName:='MR2K4:KBO', sTransitionKey:= 'MR2K4:KBO-TRANSITION' ); // MR3K4 Coating States with PMPS fbMR3K4_Coating_States( bEnable := TRUE, stMotionStage:=Main.M12, bVerticalCoating:=FALSE, sCoating1Name:='Si', sCoating2Name:='B4C', fbArbiter:=GVL_PMPS.g_fbArbiter2, fbFFHWO:=GVL_PMPS.g_FastFaultOutput2, sPmpsDeviceName:='MR3K4:KBO', sTransitionKey:= 'MR3K4:KBO-TRANSITION' ); END_PROGRAM Related: * `FB_KBO_Coating_States`_ * `FB_Offset_Coating_States`_ * `GVL_PMPS`_ * `Main`_