DUTs ---- E_MR1L0_CoatingStates ^^^^^^^^^^^^^^^^^^^^^ :: {attribute 'qualified_only'} {attribute 'strict'} TYPE E_MR1L0_CoatingStates : ( Unknown := 0, L0B4C := 1, L0Ni := 2, L1B4C := 3, L1Ni := 4 ) UINT; END_TYPE Related: * `E_MR1L0_CoatingStates`_ E_MR2L0_CoatingStates ^^^^^^^^^^^^^^^^^^^^^ :: {attribute 'qualified_only'} {attribute 'strict'} TYPE E_MR2L0_CoatingStates : ( Unknown := 0, B4C := 1, Ni := 2 ) UINT; END_TYPE GVLs ---- Global_Version ^^^^^^^^^^^^^^ :: {attribute 'TcGenerated'} {attribute 'no-analysis'} {attribute 'linkalways'} // This function has been automatically generated from the project information. VAR_GLOBAL CONSTANT {attribute 'const_non_replaced'} stLibVersion_lcls_plc_lfe_optics : ST_LibVersion := (iMajor := 3, iMinor := 0, iBuild := 0, iRevision := 0, nFlags := 1, sVersion := '3.0.0'); END_VAR GVL_COM_Buffers ^^^^^^^^^^^^^^^ :: VAR_GLOBAL // M1L0 Serial_RXBuffer_M1L0 : ComBuffer; Serial_TXBuffer_M1L0 : ComBuffer; // M2L0 Serial_RXBuffer_M2L0 : ComBuffer; Serial_TXBuffer_M2L0 : ComBuffer; END_VAR GVL_M1L0 ^^^^^^^^ :: {attribute 'qualified_only'} VAR_GLOBAL // Pitch Mechanism: {attribute 'TcLinkTo' := '.diEncCnt:=TIIB[EL5042_M1L0_PitchBender]^FB Inputs Channel 1^Position'} M1L0_Pitch : HOMS_PitchMechanism := (ReqPosLimHi := 120.0, ReqPosLimLo := -182.0, diEncPosLimHi := 8662020, diEncPosLimLo := 8507095); END_VAR GVL_M1L0_Constants ^^^^^^^^^^^^^^^^^^ :: {attribute 'qualified_only'} VAR_GLOBAL CONSTANT // Encoder reference values in counts = nm // Enc Ref Vals from alignment 2020-5-27 nYUP_ENC_REF : ULINT := 16171800; nYDWN_ENC_REF : ULINT := 14866900; nXUP_ENC_REF : ULINT := 24901730; nXDWN_ENC_REF : ULINT := 22921460; END_VAR GVL_M2L0 ^^^^^^^^ :: {attribute 'qualified_only'} VAR_GLOBAL // Pitch Mechanism {attribute 'TcLinkTo' := '.diEncCnt:=TIIB[EL5042_M2L0_PitchBender]^FB Inputs Channel 1^Position'} M2L0_Pitch : HOMS_PitchMechanism := (ReqPosLimHi := 154.9, ReqPosLimLo := -45.1, diEncPosLimHi := 9550777, diEncPosLimLo := 9448178); END_VAR GVL_M2L0_Constants ^^^^^^^^^^^^^^^^^^ :: {attribute 'qualified_only'} VAR_GLOBAL CONSTANT // Encoder reference values in counts = nm // Encoder reference values after alignment 5-29-20 nYUP_ENC_REF : ULINT := 12018200; nYDWN_ENC_REF : ULINT := 15143700; nXUP_ENC_REF : ULINT := 25363400; nXDWN_ENC_REF : ULINT := 24398100; END_VAR GVL_PMPS ^^^^^^^^ :: {attribute 'qualified_only'} VAR_GLOBAL // Implementation of the FFO {attribute 'pytmc' := ' pv: PLC:LFE:OPTICS:FFO:01 '} {attribute 'TcLinkTo' := '.q_xFastFaultOut:=TIIB[PMPS_FFO]^Channel 1^Output'} g_FastFaultOutput1 : FB_HardwareFFOutput := (bAutoReset:=TRUE, i_sNetID:='172.21.88.66.1.1'); {attribute 'pytmc' := ' pv: PLC:LFE:OPTICS:FFO:02 '} {attribute 'TcLinkTo' := '.q_xFastFaultOut:=TIIB[PMPS_FFO]^Channel 2^Output'} g_FastFaultOutput2 : FB_HardwareFFOutput := (bAutoReset:=TRUE, i_sNetID:='172.21.88.66.1.1'); {attribute 'pytmc' := ' pv: PLC:LFE:OPTICS:ARB:01 '} g_fbArbiter1 : FB_Arbiter(1); {attribute 'pytmc' := ' pv: PLC:LFE:OPTICS:ARB:02 '} g_fbArbiter2 : FB_Arbiter(2); END_VAR GVL_SerialIO ^^^^^^^^^^^^ :: VAR_GLOBAL //Better have your inputs and outputs! // M1L0 Serial_stComIn_M1L0 AT %I* : EL6inData22B; // M1L0 In Serial Comm Array Serial_stComOut_M1L0 AT %Q* : EL6outData22B; // M1L0 Out Serual Comm Array // M2L0 Serial_stComIn_M2L0 AT %I* : EL6inData22B; // M2L0 In Serial Comm Array Serial_stComOut_M2L0 AT %Q* : EL6outData22B; // M2L0 Out Serial Comm Array END_VAR GVL_States ^^^^^^^^^^ :: {attribute 'qualified_only'} VAR_GLOBAL stDefaultY : ST_PositionState := ( fDelta:=100, fVelocity:=100, fAccel:=200, fDecel:=200, bMoveOk:=TRUE, bValid:=TRUE, bUseRawCounts:=TRUE ); END_VAR POUs ---- Main ^^^^ :: PROGRAM Main VAR // M1L0 // Motors {attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[EL7041-1000_M1L0_Yup]^STM Status^Status^Digital input 1; .bLimitBackwardEnable:=TIIB[EL7041-1000_M1L0_Yup]^STM Status^Status^Digital input 2; .nRawEncoderULINT:=TIIB[EL5042_M1L0_Yupdwn]^FB Inputs Channel 1^Position'} {attribute 'pytmc' := ' pv: MR1L0:HOMS:MMS:YUP '} M1 : ST_MotionStage := (fVelocity:=200.0, nEnableMode:=ENUM_StageEnableMode.ALWAYS, bPowerSelf:=TRUE, sName:='MR1L0_YUP'); // M1L0 Yup fbMotionStage_m1 : FB_MotionStage; {attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[EL7041-1000_M1L0_Ydwn]^STM Status^Status^Digital input 1; .bLimitBackwardEnable:=TIIB[EL7041-1000_M1L0_Ydwn]^STM Status^Status^Digital input 2'} {attribute 'pytmc' := ' pv: MR1L0:HOMS:MMS:YDWN '} M2 : ST_MotionStage := (fVelocity:=200.0, nEnableMode:=ENUM_StageEnableMode.ALWAYS, bPowerSelf:=TRUE, sName:='MR1L0_YDWN'); // M1L0 Ydwn fbMotionStage_m2 : FB_MotionStage; {attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[EL7041-1000_M1L0_Xup]^STM Status^Status^Digital input 1; .bLimitBackwardEnable:=TIIB[EL7041-1000_M1L0_Xup]^STM Status^Status^Digital input 2; .nRawEncoderULINT:=TIIB[EL5042_M1L0_Xupdwn]^FB Inputs Channel 1^Position'} {attribute 'pytmc' := ' pv: MR1L0:HOMS:MMS:XUP '} M3 : ST_MotionStage := (fVelocity:=1000.0, nEnableMode:=ENUM_StageEnableMode.ALWAYS, bPowerSelf:=TRUE, sName:='MR1L0_XUP'); // M1L0 Xup fbMotionStage_m3 : FB_MotionStage; {attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[EL7041-1000_M1L0_Xdwn]^STM Status^Status^Digital input 1; .bLimitBackwardEnable:=TIIB[EL7041-1000_M1L0_Xdwn]^STM Status^Status^Digital input 2'} {attribute 'pytmc' := ' pv: MR1L0:HOMS:MMS:XDWN '} M4 : ST_MotionStage := (fVelocity:=1000.0, nEnableMode:=ENUM_StageEnableMode.ALWAYS, bPowerSelf:=TRUE, sName:='MR1L0_XDWN'); // M1L0 Xdwn fbMotionStage_m4 : FB_MotionStage; {attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[EL7041-1000_M1L0_PitchCoarse]^STM Status^Status^Digital input 1; .bLimitBackwardEnable:=TIIB[EL7041-1000_M1L0_PitchCoarse]^STM Status^Status^Digital input 2; .nRawEncoderULINT:=TIIB[EL5042_M1L0_PitchBender]^FB Inputs Channel 1^Position'} {attribute 'pytmc' := ' pv: MR1L0:HOMS:MMS:PITCH '} M5 : ST_MotionStage := (fVelocity:=150.0,nEnableMode:=ENUM_StageEnableMode.ALWAYS, bPowerSelf:=TRUE, sName:='MR1L0_PITCH'); // M1L0 Pitch Stepper fbMotionStage_m5 : FB_MotionStage; {attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[EL7041-1000_M1L0_Bender]^STM Status^Status^Digital input 1; .bLimitBackwardEnable:=TIIB[EL7041-1000_M1L0_Bender]^STM Status^Status^Digital input 2; .nRawEncoderULINT:=TIIB[EL5042_M1L0_PitchBender]^FB Inputs Channel 2^Position'} {attribute 'pytmc' := ' pv: MR1L0:HOMS:MMS:BENDER '} M6 : ST_MotionStage := (fVelocity:=150.0, nEnableMode:=ENUM_StageEnableMode.ALWAYS, bPowerSelf:=TRUE, sName:='MR1L0_BENDER'); // M1L0 Bender fbMotionStage_m6 : FB_MotionStage; {attribute 'TcLinkTo' := '.fbRunHOMS.bSTOEnable1:=TIIB[EL1004_M1L0_STO]^Channel 1^Input; .fbRunHOMS.bSTOEnable2:=TIIB[EL1004_M1L0_STO]^Channel 2^Input; .fbRunHOMS.stYupEnc.Count:=TIIB[EL5042_M1L0_Yupdwn]^FB Inputs Channel 1^Position; .fbRunHOMS.stYdwnEnc.Count:=TIIB[EL5042_M1L0_Yupdwn]^FB Inputs Channel 2^Position; .fbRunHOMS.stXupEnc.Count:=TIIB[EL5042_M1L0_Xupdwn]^FB Inputs Channel 1^Position; .fbRunHOMS.stXdwnEnc.Count:=TIIB[EL5042_M1L0_Xupdwn]^FB Inputs Channel 2^Position'} {attribute 'pytmc' := ' pv: MR1L0:HOMS '} M1L0 : DUT_HOMS; {attribute 'pytmc' := ' pv: MR1L0:HOMS:STATS '} fbMR1L0GantryStats : FB_HomsStats; // Encoder Arrays/RMS Watch: {attribute 'pytmc' := ' pv: MR1L0:HOMS:ENC:Y '} fbYRMSErrorM1L0 : FB_RMSWatch; fMaxYRMSErrorM1L0 : LREAL; fMinYRMSErrorM1L0 : LREAL; {attribute 'pytmc' := ' pv: MR1L0:HOMS:ENC:X '} fbXRMSErrorM1L0 : FB_RMSWatch; fMaxXRMSErrorM1L0 : LREAL; fMinXRMSErrorM1L0 : LREAL; {attribute 'pytmc' := ' pv: MR1L0:HOMS:ENC:PITCH '} fbPitchRMSErrorM1L0 : FB_RMSWatch; fMaxPitchRMSErrorM1L0 : LREAL; fMinPitchRMSErrorM1L0 : LREAL; {attribute 'pytmc' := ' pv: MR1L0:HOMS:ENC:BENDER '} fbBenderRMSErrorM1L0 : FB_RMSWatch; fMaxBenderRMSErrorM1L0 : LREAL; fMinBenderRMSErrorM1L0 : LREAL; // Pitch Control //fbM1L0PitchControl : FB_PitchControl; //bM1L0PitchDone : BOOL; //bM1L0PitchBusy : BOOL; // Bender Control fbBenderM1L0 : FB_Bender; // Raw Encoder Counts {attribute 'pytmc' := ' pv: MR1L0:HOMS:ENC:YUP:CNT field: EGU cnt io: i '} nEncCntYupM1L0 : UDINT; {attribute 'pytmc' := ' pv: MR1L0:HOMS:ENC:YDWN:CNT field: EGU cnt io: i '} nEncCntYdwnM1L0 : UDINT; {attribute 'pytmc' := ' pv: MR1L0:HOMS:ENC:XUP:CNT field: EGU cnt io: i '} nEncCntXupM1L0 : UDINT; {attribute 'pytmc' := ' pv: MR1L0:HOMS:ENC:XDWN:CNT field: EGU cnt io: i '} nEncCntXdwnM1L0 : UDINT; {attribute 'pytmc' := ' pv: MR1L0:HOMS:ENC:PITCH:CNT field: EGU cnt io: i '} nEncCntPitchM1L0 : UDINT; // Encoder Reference Values {attribute 'pytmc' := ' pv: MR1L0:HOMS:ENC:YUP:REF field: EGU cnt io: i '} nEncRefYupM1L0 : UDINT; {attribute 'pytmc' := ' pv: MR1L0:HOMS:ENC:YDWN:REF field: EGU cnt io: i '} nEncRefYdwnM1L0 : UDINT; {attribute 'pytmc' := ' pv: MR1L0:HOMS:ENC:XUP:REF field: EGU cnt io: i '} nEncRefXupM1L0 : UDINT; {attribute 'pytmc' := ' pv: MR1L0:HOMS:ENC:XDWN:REF field: EGU cnt io: i '} nEncRefXdwnM1L0 : UDINT; {attribute 'pytmc' := ' pv: MR1L0:HOMS:ENC:PITCH:REF field: EGU cnt io: i '} nEncRefPitchM1L0 : UDINT; mcReadParameterPitchM1L0 : MC_ReadParameter; fEncRefPitchM1L0_urad : LREAL; // Current Pitch encoder offset in urad // M2L0 // Motors {attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[EL7041-1000_M2L0_Yup]^STM Status^Status^Digital input 1; .bLimitBackwardEnable:=TIIB[EL7041-1000_M2L0_Yup]^STM Status^Status^Digital input 2; .nRawEncoderULINT:=TIIB[EL5042_M2L0_Yupdwn]^FB Inputs Channel 1^Position'} {attribute 'pytmc' := ' pv: MR2L0:HOMS:MMS:YUP '} M7 : ST_MotionStage := (fVelocity:=200.0, nEnableMode:=ENUM_StageEnableMode.ALWAYS, bPowerSelf:=TRUE, sName:='MR2L0_YUP'); // M2L0 Yup fbMotionStage_m7 : FB_MotionStage; {attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[EL7041-1000_M2L0_Ydwn]^STM Status^Status^Digital input 1; .bLimitBackwardEnable:=TIIB[EL7041-1000_M2L0_Ydwn]^STM Status^Status^Digital input 2'} {attribute 'pytmc' := ' pv: MR2L0:HOMS:MMS:YDWN '} M8 : ST_MotionStage := (fVelocity:=200.0, nEnableMode:=ENUM_StageEnableMode.ALWAYS, bPowerSelf:=TRUE, sName:='MR2L0_YDWN'); // M2L0 Ydwn fbMotionStage_m8 : FB_MotionStage; {attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[EL7041-1000_M2L0_Xup]^STM Status^Status^Digital input 1; .bLimitBackwardEnable:=TIIB[EL7041-1000_M2L0_Xup]^STM Status^Status^Digital input 2; .nRawEncoderULINT:=TIIB[EL5042_M1L0_Xupdwn]^FB Inputs Channel 1^Position'} {attribute 'pytmc' := ' pv: MR2L0:HOMS:MMS:XUP '} M9 : ST_MotionStage := (fVelocity:=1000.0, nEnableMode:=ENUM_StageEnableMode.ALWAYS, bPowerSelf:=TRUE, sName:='MR2L0_XUP'); // M2L0 Xup fbMotionStage_m9 : FB_MotionStage; {attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[EL7041-1000_M2L0_Xdwn]^STM Status^Status^Digital input 1; .bLimitBackwardEnable:=TIIB[EL7041-1000_M2L0_Xdwn]^STM Status^Status^Digital input 2'} {attribute 'pytmc' := ' pv: MR2L0:HOMS:MMS:XDWN '} M10 : ST_MotionStage := (fVelocity:=1000.0, nEnableMode:=ENUM_StageEnableMode.ALWAYS, bPowerSelf:=TRUE, sName:='MR2L0_XDWN'); // M2L0 Xdwn fbMotionStage_m10 : FB_MotionStage; {attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[EL7041-1000_M2L0_PitchCoarse]^STM Status^Status^Digital input 1; .bLimitBackwardEnable:=TIIB[EL7041-1000_M2L0_PitchCoarse]^STM Status^Status^Digital input 2; .nRawEncoderULINT:=TIIB[EL5042_M2L0_PitchBender]^FB Inputs Channel 1^Position'} {attribute 'pytmc' := ' pv: MR2L0:HOMS:MMS:PITCH '} M11 : ST_MotionStage := (fVelocity:=150.0, nEnableMode:=ENUM_StageEnableMode.ALWAYS, bPowerSelf:=TRUE, sName:='MR2L0_PITCH'); // M2L0 Pitch Stepper fbMotionStage_m11 : FB_MotionStage; {attribute 'TcLinkTo' := '.bLimitForwardEnable:=TIIB[EL7041-1000_M2L0_Bender]^STM Status^Status^Digital input 1; .bLimitBackwardEnable:=TIIB[EL7041-1000_M2L0_Bender]^STM Status^Status^Digital input 2; .nRawEncoderULINT:=TIIB[EL5042_M2L0_PitchBender]^FB Inputs Channel 2^Position'} {attribute 'pytmc' := ' pv: MR2L0:HOMS:MMS:BENDER '} M12 : ST_MotionStage := (fVelocity:=150.0, nEnableMode:=ENUM_StageEnableMode.ALWAYS, bPowerSelf:=TRUE, sName:='MR2L0_BENDER'); // M2L0 Bender fbMotionStage_m12 : FB_MotionStage; {attribute 'TcLinkTo' := '.fbRunHOMS.bSTOEnable1:=TIIB[EL1004_M2L0_STO]^Channel 1^Input; .fbRunHOMS.bSTOEnable2:=TIIB[EL1004_M2L0_STO]^Channel 2^Input; .fbRunHOMS.stYupEnc.Count:=TIIB[EL5042_M2L0_Yupdwn]^FB Inputs Channel 1^Position; .fbRunHOMS.stYdwnEnc.Count:=TIIB[EL5042_M2L0_Yupdwn]^FB Inputs Channel 2^Position; .fbRunHOMS.stXupEnc.Count:=TIIB[EL5042_M2L0_Xupdwn]^FB Inputs Channel 1^Position; .fbRunHOMS.stXdwnEnc.Count:=TIIB[EL5042_M2L0_Xupdwn]^FB Inputs Channel 2^Position'} {attribute 'pytmc' := ' pv: MR2L0:HOMS '} M2L0 : DUT_HOMS; {attribute 'pytmc' := ' pv: MR2L0:HOMS:STATS '} fbMR2L0GantryStats : FB_HomsStats; // Encoder Arrays/RMS Watch: {attribute 'pytmc' := ' pv: MR2L0:HOMS:ENC:Y '} fbYRMSErrorM2L0 : FB_RMSWatch; fMaxYRMSErrorM2L0 : LREAL; fMinYRMSErrorM2L0 : LREAL; {attribute 'pytmc' := ' pv: MR2L0:HOMS:ENC:X '} fbXRMSErrorM2L0 : FB_RMSWatch; fMaxXRMSErrorM2L0 : LREAL; fMinXRMSErrorM2L0 : LREAL; {attribute 'pytmc' := ' pv: MR2L0:HOMS:ENC:PITCH '} fbPitchRMSErrorM2L0 : FB_RMSWatch; fMaxPitchRMSErrorM2L0 : LREAL; fMinPitchRMSErrorM2L0 : LREAL; {attribute 'pytmc' := ' pv: MR2L0:HOMS:ENC:BENDER '} fbBenderRMSErrorM2L0 : FB_RMSWatch; fMaxBenderRMSErrorM2L0 : LREAL; fMinBenderRMSErrorM2L0 : LREAL; // Pitch Control //fbM2L0PitchControl : FB_PitchControl; //bM2L0PitchDone : BOOL; //bM2L0PitchBusy : BOOL; // Bender Control fbBenderM2L0 : FB_Bender; // Raw Encoder Counts {attribute 'pytmc' := ' pv: MR2L0:HOMS:ENC:YUP:CNT field: EGU cnt io: i '} nEncCntYupM2L0 : UDINT; {attribute 'pytmc' := ' pv: MR2L0:HOMS:ENC:YDWN:CNT field: EGU cnt io: i '} nEncCntYdwnM2L0 : UDINT; {attribute 'pytmc' := ' pv: MR2L0:HOMS:ENC:XUP:CNT field: EGU cnt io: i '} nEncCntXupM2L0 : UDINT; {attribute 'pytmc' := ' pv: MR2L0:HOMS:ENC:XDWN:CNT field: EGU cnt io: i '} nEncCntXdwnM2L0 : UDINT; {attribute 'pytmc' := ' pv: MR2L0:HOMS:ENC:PITCH:CNT field: EGU cnt io: i '} nEncCntPitchM2L0 : UDINT; // Encoder Reference Values {attribute 'pytmc' := ' pv: MR2L0:HOMS:ENC:YUP:REF field: EGU cnt io: i '} nEncRefYupM2L0 : UDINT; {attribute 'pytmc' := ' pv: MR2L0:HOMS:ENC:YDWN:REF field: EGU cnt io: i '} nEncRefYdwnM2L0 : UDINT; {attribute 'pytmc' := ' pv: MR2L0:HOMS:ENC:XUP:REF field: EGU cnt io: i '} nEncRefXupM2L0 : UDINT; {attribute 'pytmc' := ' pv: MR2L0:HOMS:ENC:XDWN:REF field: EGU cnt io: i '} nEncRefXdwnM2L0 : UDINT; {attribute 'pytmc' := ' pv: MR2L0:HOMS:ENC:PITCH:REF field: EGU cnt io: i '} nEncRefPitchM2L0 : UDINT; mcReadParameterPitchM2L0 : MC_ReadParameter; fEncRefPitchM2L0_urad : LREAL; // Current Pitch encoder offset in urad // Common fEncLeverArm_mm : LREAL := 513.0; // Logging fbLogHandler : FB_LogHandler; END_VAR // M1L0 M1L0.fbRunHOMS(stYup:=M1, stYdwn:=M2, stXup:=M3, stXdwn:=M4, stPitch:=M5, nYupEncRef:=GVL_M1L0_Constants.nYUP_ENC_REF, nYdwnEncRef:=GVL_M1L0_Constants.nYDWN_ENC_REF, nXupEncRef:=GVL_M1L0_Constants.nXUP_ENC_REF, nXdwnEncRef:=GVL_M1L0_Constants.nXDWN_ENC_REF, bExecuteCoupleY:=M1L0.bExecuteCoupleY, bExecuteCoupleX:=M1L0.bExecuteCoupleX, bExecuteDecoupleY:=M1L0.bExecuteDecoupleY, bExecuteDecoupleX:=M1L0.bExecuteDecoupleX, bGantryAlreadyCoupledY=>M1L0.bGantryAlreadyCoupledY, bGantryAlreadyCoupledX=>M1L0.bGantryAlreadyCoupledX, nCurrGantryY=>M1L0.nCurrGantryY, nCurrGantryX=>M1L0.nCurrGantryX); fbBenderM1L0(stBender:=M6, bSTOEnable1:=M1L0.fbRunHOMS.bSTOEnable1, bSTOEnable2:=M1L0.fbRunHOMS.bSTOEnable2); // No slave motion through Epics M2.bExecute := FALSE; // M1L0-Ydwn M4.bExecute := FALSE; // M1L0-Xdwn // Convert nCurrGantry to um (smaller number) to read out in epics M1L0.fCurrGantryY_um := LINT_TO_REAL(M1L0.nCurrGantryY) / 1000.0; M1L0.fCurrGantryX_um := LINT_TO_REAL(M1L0.nCurrGantryX) / 1000.0; // FB_MotionStage's for non-piezo axes fbMotionStage_m1(stMotionStage:=M1); fbMotionStage_m2(stMotionStage:=M2); fbMotionStage_m3(stMotionStage:=M3); fbMotionStage_m4(stMotionStage:=M4); fbMotionStage_m5(stMotionStage:=M5); fbMotionStage_m6(stMotionStage:=M6); // Calulate Gantry Stats: fbMR1L0GantryStats(homs:=M1L0, fbUpStreamY:=M1, fbUpStreamX:=M3); fbMR2L0GantryStats(homs:=M2L0, fbUpStreamY:=M7, fbUpStreamX:=M9); // Calculate Pitch RMS Error: fbYRMSErrorM1L0(stMotionStage:=M1, fMaxRMSError=>fMaxYRMSErrorM1L0, fMinRMSError=>fMinYRMSErrorM1L0); fbXRMSErrorM1L0(stMotionStage:=M3, fMaxRMSError=>fMaxXRMSErrorM1L0, fMinRMSError=>fMinXRMSErrorM1L0); fbPitchRMSErrorM1L0(stMotionStage:=M5, fMaxRMSError=>fMaxPitchRMSErrorM1L0, fMinRMSError=>fMinPitchRMSErrorM1L0); fbBenderRMSErrorM1L0(stMotionStage:=M6, fMaxRMSError=>fMaxBenderRMSErrorM1L0, fMinRMSError=>fMinBenderRMSErrorM1L0); // Pitch Control //fbM1L0PitchControl(Pitch:=GVL_M1L0.M1L0_Pitch, //Stepper:=M5, //lrCurrentSetpoint:=M5.fPosition, //q_bDone=>bM1L0PitchDone, //q_bBusy=>bM1L0PitchBusy); // When STO hit, need to reset SP //IF NOT M5.bHardwareEnable THEN //M5.fPosition := M5.stAxisStatus.fActPosition; //END_IF // Raw Encoder Counts For Epics nEncCntYupM1L0 := ULINT_TO_UDINT(M1L0.fbRunHOMS.stYupEnc.Count); nEncCntYdwnM1L0 := ULINT_TO_UDINT(M1L0.fbRunHOMS.stYdwnEnc.Count); nEncCntXupM1L0 := ULINT_TO_UDINT(M1L0.fbRunHOMS.stXupEnc.Count); nEncCntXdwnM1L0 := ULINT_TO_UDINT(M1L0.fbRunHOMS.stXdwnEnc.Count); nEncCntPitchM1L0 := LINT_TO_UDINT(GVL_M1L0.M1L0_Pitch.diEncCnt); // Encoder Reference Values For Epics nEncRefYupM1L0 := ULINT_TO_UDINT(GVL_M1L0_Constants.nYUP_ENC_REF); nEncRefYdwnM1L0 := ULINT_TO_UDINT(GVL_M1L0_Constants.nYDWN_ENC_REF); nEncRefXupM1L0 := ULINT_TO_UDINT(GVL_M1L0_Constants.nXUP_ENC_REF); nEncRefXdwnM1L0 := ULINT_TO_UDINT(GVL_M1L0_Constants.nXDWN_ENC_REF); mcReadParameterPitchM1L0(Axis:=M5.Axis, Enable:=TRUE, ParameterNumber:=MC_AxisParameter.AxisEncoderOffset, ReadMode:=READMODE_CYCLIC, Value=>fEncRefPitchM1L0_urad); nEncRefPitchM1L0 := LREAL_TO_UDINT(ABS(fEncRefPitchM1L0_urad) * fEncLeverArm_mm); //Coatings States With PMPS M1.bPowerSelf :=FALSE; M5.bPowerSelf := FALSE; // M2L0 M2L0.fbRunHOMS(stYup:=M7, stYdwn:=M8, stXup:=M9, stXdwn:=M10, stPitch:=M11, nYupEncRef:=GVL_M2L0_Constants.nYUP_ENC_REF, nYdwnEncRef:=GVL_M2L0_Constants.nYDWN_ENC_REF, nXupEncRef:=GVL_M2L0_Constants.nXUP_ENC_REF, nXdwnEncRef:=GVL_M2L0_Constants.nXDWN_ENC_REF, bExecuteCoupleY:=M2L0.bExecuteCoupleY, bExecuteCoupleX:=M2L0.bExecuteCoupleX, bExecuteDecoupleY:=M2L0.bExecuteDecoupleY, bExecuteDecoupleX:=M2L0.bExecuteDecoupleX, bGantryAlreadyCoupledY=>M2L0.bGantryAlreadyCoupledY, bGantryAlreadyCoupledX=>M2L0.bGantryAlreadyCoupledX, nCurrGantryY=>M2L0.nCurrGantryY, nCurrGantryX=>M2L0.nCurrGantryX); fbBenderM2L0(stBender:=M12, bSTOEnable1:=M2L0.fbRunHOMS.bSTOEnable1, bSTOEnable2:=M2L0.fbRunHOMS.bSTOEnable2); // No slave motion through Epics M8.bExecute := FALSE; // M2L0-Ydwn M10.bExecute := FALSE; // M2L0-Xdwn // Convert nCurrGantry to um (smaller number) to read out in epics M2L0.fCurrGantryY_um := LINT_TO_REAL(M2L0.nCurrGantryY) / 1000; M2L0.fCurrGantryX_um := LINT_TO_REAL(M2L0.nCurrGantryX) / 1000; // FB_MotionStage's for non-piezo axes fbMotionStage_m7(stMotionStage:=M7); fbMotionStage_m8(stMotionStage:=M8); fbMotionStage_m9(stMotionStage:=M9); fbMotionStage_m10(stMotionStage:=M10); fbMotionStage_m11(stMotionStage:=M11); fbMotionStage_m12(stMotionStage:=M12); // Calculate RMS Error: fbYRMSErrorM2L0(stMotionStage:=M7, fMaxRMSError=>fMaxYRMSErrorM2L0, fMinRMSError=>fMinYRMSErrorM2L0); fbXRMSErrorM2L0(stMotionStage:=M9, fMaxRMSError=>fMaxXRMSErrorM2L0, fMinRMSError=>fMinXRMSErrorM2L0); fbPitchRMSErrorM2L0(stMotionStage:=M11, fMaxRMSError=>fMaxPitchRMSErrorM2L0, fMinRMSError=>fMinPitchRMSErrorM2L0); fbBenderRMSErrorM2L0(stMotionStage:=M12, fMaxRMSError=>fMaxBenderRMSErrorM2L0, fMinRMSError=>fMinBenderRMSErrorM2L0); // Pitch Control //fbM2L0PitchControl(Pitch:=GVL_M2L0.M2L0_Pitch, //Stepper:=M11, //lrCurrentSetpoint:=M11.fPosition, //q_bDone=>bM2L0PitchDone, //q_bBusy=>bM2L0PitchBusy); // When STO hit, need to reset SP //IF NOT M11.bHardwareEnable THEN //M11.fPosition := M11.stAxisStatus.fActPosition; //END_IF // Raw Encoder Counts For Epics nEncCntYupM2L0 := ULINT_TO_UDINT(M2L0.fbRunHOMS.stYupEnc.Count); nEncCntYdwnM2L0 := ULINT_TO_UDINT(M2L0.fbRunHOMS.stYdwnEnc.Count); nEncCntXupM2L0 := ULINT_TO_UDINT(M2L0.fbRunHOMS.stXupEnc.Count); nEncCntXdwnM2L0 := ULINT_TO_UDINT(M2L0.fbRunHOMS.stXdwnEnc.Count); nEncCntPitchM2L0 := LINT_TO_UDINT(GVL_M2L0.M2L0_Pitch.diEncCnt); // Encoder Reference Values For Epics nEncRefYupM2L0 := ULINT_TO_UDINT(GVL_M2L0_Constants.nYUP_ENC_REF); nEncRefYdwnM2L0 := ULINT_TO_UDINT(GVL_M2L0_Constants.nYDWN_ENC_REF); nEncRefXupM2L0 := ULINT_TO_UDINT(GVL_M2L0_Constants.nXUP_ENC_REF); nEncRefXdwnM2L0 := ULINT_TO_UDINT(GVL_M2L0_Constants.nXDWN_ENC_REF); mcReadParameterPitchM2L0(Axis:=M11.Axis, Enable:=TRUE, ParameterNumber:=MC_AxisParameter.AxisEncoderOffset, ReadMode:=READMODE_CYCLIC, Value=>fEncRefPitchM2L0_urad); nEncRefPitchM2L0 := LREAL_TO_UDINT(ABS(fEncRefPitchM2L0_urad) * fEncLeverArm_mm); //Coatings States With PMPS M7.bPowerSelf :=FALSE; P_CoatingProtections(); // Logging fbLogHandler(); END_PROGRAM Related: * `GVL_M1L0`_ * `GVL_M1L0_Constants`_ * `GVL_M2L0`_ * `GVL_M2L0_Constants`_ * `P_CoatingProtections`_ P_CoatingProtections ^^^^^^^^^^^^^^^^^^^^ :: PROGRAM P_CoatingProtections VAR fbStripProtMR1L0 : FB_MirrorTwoCoatingProtection := ( sDevName := 'MR1L0:HOMS', nUpperCoatingBoundary := 13300000, sUpperCoatingType := 'L0-B4C', nLowerCoatingBoundary := 11800000, sLowerCoatingType := 'L0-NICKEL'); fbStripProtMR2L0 : FB_MirrorTwoCoatingProtection := ( sDevName := 'MR2L0:HOMS', nUpperCoatingBoundary := 14300000, sUpperCoatingType := 'NICKEL', nLowerCoatingBoundary := 12800000, sLowerCoatingType := 'B4C'); END_VAR fbStripProtMR1L0( FFO := GVL_PMPS.g_FastFaultOutput1, nCurrentEncoderCount := MAIN.nEncCntYupM1L0, neVRange := PMPS.PMPS_GVL.stCurrentBeamParameters.neVRange, bReadPmpsDb:= MOTION_GVL.fbStandardPMPSDB.bReadPmpsDb, bUsePmpsDb := TRUE, ); fbStripProtMR2L0( FFO := GVL_PMPS.g_FastFaultOutput1, nCurrentEncoderCount := MAIN.nEncCntYupM2L0, neVRange := PMPS.PMPS_GVL.stCurrentBeamParameters.neVRange, bReadPmpsDb:= MOTION_GVL.fbStandardPMPSDB.bReadPmpsDb, bUsePmpsDb := TRUE, ); END_PROGRAM Related: * `GVL_PMPS`_ P_Serial_Com ^^^^^^^^^^^^ :: PROGRAM P_Serial_Com VAR fbSerialLineControl_EL6001_M1L0: SerialLineControl; // M1L0 Serial Comm Function Block fbSerialLineControl_EL6001_M2L0: SerialLineControl; // M2L0 Serial Comm Function Block END_VAR // These are the global IOs...don't forget to copy your data into them (* EL6001 Serial port 0 com function *) fbSerialLineControl_EL6001_M1L0(Mode:= SERIALLINEMODE_EL6_22B, pComIn:= ADR(Serial_stComIn_M1L0), pComOut:=ADR(Serial_stComOut_M1L0), SizeComIn:= SIZEOF(Serial_stComIn_M1L0), TxBuffer:= Serial_TXBuffer_M1L0, RxBuffer:= Serial_RXBuffer_M1L0, Error=>, ErrorID=>); fbSerialLineControl_EL6001_M2L0(Mode:= SERIALLINEMODE_EL6_22B, pComIn:= ADR(Serial_stComIn_M2L0), pComOut:=ADR(Serial_stComOut_M2L0), SizeComIn:= SIZEOF(Serial_stComIn_M2L0), TxBuffer:= Serial_TXBuffer_M2L0, RxBuffer:= Serial_RXBuffer_M2L0, Error=>, ErrorID=>); END_PROGRAM PiezoSerial ^^^^^^^^^^^ :: PROGRAM PiezoSerial VAR //PI Serial fbE621SerialDriver_M1L0 : FB_PI_E621_SerialDriver; rtInitParams_M1L0 : R_TRIG; tonTimeoutRst_M1L0 : TON := (PT:=T#2S); //For timeout reset fbE621SerialDriver_M2L0 : FB_PI_E621_SerialDriver; rtInitParams_M2L0 : R_TRIG; tonTimeoutRst_M2L0 : TON := (PT:=T#2S); //For timeout reset END_VAR //Piezo E-621 /////////////////////// fbE621SerialDriver_M1L0.i_xExecute := TRUE; fbE621SerialDriver_M1L0.i_xExecute R= fbE621SerialDriver_M1L0.q_xDone; fbE621SerialDriver_M1L0(iq_stPiezoAxis:= GVL_M1L0.M1L0_Pitch.Piezo, iq_stSerialRXBuffer:= Serial_RXBuffer_M1L0, iq_stSerialTXBuffer:= Serial_TXBuffer_M1L0); fbE621SerialDriver_M2L0.i_xExecute := TRUE; fbE621SerialDriver_M2L0.i_xExecute R= fbE621SerialDriver_M2L0.q_xDone; fbE621SerialDriver_M2L0(iq_stPiezoAxis:= GVL_M2L0.M2L0_Pitch.Piezo, iq_stSerialRXBuffer:= Serial_RXBuffer_M2L0, iq_stSerialTXBuffer:= Serial_TXBuffer_M2L0); END_PROGRAM Related: * `GVL_M1L0`_ * `GVL_M2L0`_ PRG_1_PlcTask ^^^^^^^^^^^^^ :: PROGRAM PRG_1_PlcTask VAR END_VAR PRG_MR1L0_HOMS(); PRG_MR2L0_HOMS(); PRG_PMPS(); END_PROGRAM Related: * `PRG_MR1L0_HOMS`_ * `PRG_MR2L0_HOMS`_ * `PRG_PMPS`_ PRG_MR1L0_HOMS ^^^^^^^^^^^^^^ :: PROGRAM PRG_MR1L0_HOMS VAR {attribute 'pytmc' := 'pv: MR1L0:HOMS:COATING'} fbCoatingStates: FB_PositionStatePMPS2D; {attribute 'pytmc' := ' pv: MR1L0:HOMS:COATING:STATE:SET io: io '} eStateSet: E_MR1L0_CoatingStates; {attribute 'pytmc' := ' pv: MR1L0:HOMS:COATING:STATE:GET io: i '} eStateGet: E_MR1L0_CoatingStates; fbYSetup: FB_StateSetupHelper; fbPitchSetup: FB_StateSetupHelper; stDefaultPitch : ST_PositionState := ( fDelta:=194.94, fVelocity:=100, fAccel:=390, fDecel:=390, bMoveOk:=TRUE, bValid:=TRUE, bUseRawCounts:=TRUE ); astCoatingStatesY: ARRAY[1..GeneralConstants.MAX_STATES] OF ST_PositionState; astCoatingStatesPitch: ARRAY[1..GeneralConstants.MAX_STATES] OF ST_PositionState; // MR1L0 Flow Press Sensors {attribute 'TcLinkTo' := '.fbFlow_1.iRaw := TIIB[EL3054_M1L0_FWM_PRSM]^AI Standard Channel 1^Value; .fbFlow_2.iRaw := TIIB[EL3054_M1L0_FWM_PRSM]^AI Standard Channel 2^Value; .fbPress_1.iRaw := TIIB[EL3054_M1L0_FWM_PRSM]^AI Standard Channel 3^Value '} {attribute 'pytmc' := ' pv: MR1L0:HOMS '} fbCoolingPanel : FB_Axilon_Cooling_2f1p; {attribute 'TcLinkTo' := 'TIIB[EP2008-0001_M1M2_VCV]^Channel 1^Output'} {attribute 'pytmc' := ' pv: MR1L0:HOMS:VCV io: io field: ZNAM OFF field: ONAM ON '} bActivateVarCoolMR1L0 AT %Q* : BOOL; END_VAR fbYSetup(stPositionState:=GVL_States.stDefaultY, bSetDefault:=TRUE); fbPitchSetup(stPositionState:=stDefaultPitch, bSetDefault:=TRUE); // MR1L0 B4C fbYSetup(stPositionState:=astCoatingStatesY[E_MR1L0_CoatingStates.L0B4C], sName:='L0B4C', sPmpsState:='MR1L0:HOMS-L0-B4C', nEncoderCount:=21171800 ); fbPitchSetup(stPositionState:=astCoatingStatesPitch[E_MR1L0_CoatingStates.L0B4C], sName:='L0B4C', sPmpsState:='MR1L0:HOMS-L0-B4C', nEncoderCount:=8602330 ); // MR1L0 Ni fbYSetup(stPositionState:=astCoatingStatesY[E_MR1L0_CoatingStates.L0Ni], sName:='L0Ni', sPmpsState:='MR1L0:HOMS-L0-NICKEL', nEncoderCount:=9171800 ); fbPitchSetup(stPositionState:=astCoatingStatesPitch[E_MR1L0_CoatingStates.L0Ni], sName:='L0Ni', sPmpsState:='MR1L0:HOMS-L0-NICKEL', nEncoderCount:=8602330 ); // MR1L0_L1 B4C fbYSetup(stPositionState:=astCoatingStatesY[E_MR1L0_CoatingStates.L1B4C], bValid:=FALSE, sName:='L1B4C', sPmpsState:='MR1L0:HOMS-L1-B4C', nEncoderCount:=21171800 ); fbPitchSetup(stPositionState:=astCoatingStatesPitch[E_MR1L0_CoatingStates.L1B4C], bValid:=FALSE, sName:='L1B4C', sPmpsState:='MR1L0:HOMS-L1-B4C', nEncoderCount:=11116030, fDelta:=974.66 ); // MR1L0_L1 Ni fbYSetup(stPositionState:=astCoatingStatesY[E_MR1L0_CoatingStates.L1Ni], bValid:=FALSE, sName:='L1Ni', sPmpsState:='MR1L0:HOMS-L1-NICKEL', nEncoderCount:=9171800 ); fbPitchSetup(stPositionState:=astCoatingStatesPitch[E_MR1L0_CoatingStates.L1Ni], bValid:=FALSE, sName:='L1Ni', sPmpsState:='MR1L0:HOMS-L1-NICKEL', nEncoderCount:=11116030, fDelta:=974.66 ); fbCoatingStates( stMotionStage1:=Main.M1, stMotionStage2:=Main.M5, astPositionState1:=astCoatingStatesY, astPositionState2:=astCoatingStatesPitch, eEnumSet:=eStateSet, eEnumGet:=eStateGet, fbFFHWO:=GVL_PMPS.g_FastFaultOutput1, fbArbiter:=GVL_PMPS.g_fbArbiter1, bEnableMotion:=TRUE, bEnableBeamParams:=TRUE, sDeviceName:='MR1L0:HOMS', sTransitionKey:='MR1L0:HOMS-TRANSITION', ); fbCoolingPanel(); END_PROGRAM Related: * `E_MR1L0_CoatingStates`_ * `GVL_PMPS`_ * `GVL_States`_ * `Main`_ PRG_MR2L0_HOMS ^^^^^^^^^^^^^^ :: PROGRAM PRG_MR2L0_HOMS VAR {attribute 'pytmc' := 'pv: MR2L0:HOMS:COATING'} fbCoatingStates: FB_PositionStatePMPS1D; {attribute 'pytmc' := ' pv: MR2L0:HOMS:COATING:STATE:SET io: io '} eStateSet: E_MR2L0_CoatingStates; {attribute 'pytmc' := ' pv: MR2L0:HOMS:COATING:STATE:GET io: i '} eStateGet: E_MR2L0_CoatingStates; fbYSetup: FB_StateSetupHelper; astCoatingStatesY: ARRAY[1..GeneralConstants.MAX_STATES] OF ST_PositionState; // MR2L0 Flow Press Sensors {attribute 'TcLinkTo' := '.fbFlow_1.iRaw := TIIB[EL3054_M2L0_FWM_PRSM]^AI Standard Channel 1^Value; .fbFlow_2.iRaw := TIIB[EL3054_M2L0_FWM_PRSM]^AI Standard Channel 2^Value; .fbPress_1.iRaw := TIIB[EL3054_M2L0_FWM_PRSM]^AI Standard Channel 3^Value '} {attribute 'pytmc' := ' pv: MR2L0:HOMS '} fbCoolingPanel : FB_Axilon_Cooling_2f1p; {attribute 'TcLinkTo' := 'TIIB[EP2008-0001_M1M2_VCV]^Channel 2^Output'} {attribute 'pytmc' := ' pv: MR2L0:HOMS:VCV io: io field: ZNAM OFF field: ONAM ON '} bActivateVarCoolMR2L0 AT %Q* : BOOL; END_VAR fbYSetup(stPositionState:=GVL_States.stDefaultY, bSetDefault:=TRUE); // MR2L0 B4C fbYSetup(stPositionState:=astCoatingStatesY[E_MR2L0_CoatingStates.B4C], sName:='B4C', sPmpsState:='MR2L0:HOMS-B4C', nEncoderCount:=7018200 ); // MR2L0 Ni fbYSetup(stPositionState:=astCoatingStatesY[E_MR2L0_CoatingStates.Ni], sName:='Ni', sPmpsState:='MR2L0:HOMS-NICKEL', nEncoderCount:= 16018200 ); fbCoatingStates( stMotionStage:=Main.M7, astPositionState:=astCoatingStatesY, eEnumSet:=eStateSet, eEnumGet:=eStateGet, fbFFHWO:=GVL_PMPS.g_FastFaultOutput1, fbArbiter:=GVL_PMPS.g_fbArbiter1, bEnableMotion:=TRUE, bEnableBeamParams:=TRUE, sDeviceName:='MR2L0:HOMS', sTransitionKey:='MR2L0:HOMS-TRANSITION', ); fbCoolingPanel(); END_PROGRAM Related: * `E_MR2L0_CoatingStates`_ * `GVL_PMPS`_ * `GVL_States`_ * `Main`_ PRG_PMPS ^^^^^^^^ :: PROGRAM PRG_PMPS VAR // PMPS arbiter interface fbArbiterIO : FB_SubSysToArbiter_IO; {attribute 'TcLinkTo' := 'TIIB[PMPS_PRE]^IO Outputs^MR1L0_Pitch_ENC'} nMR1L0_Pitch_ENC_PMPS AT %Q* : ULINT; END_VAR // PMPS MOTION_GVL.fbStandardPMPSDB( io_fbFFHWO:=GVL_PMPS.g_FastFaultOutput1, bEnable:=TRUE, sPLCName:='plc-lfe-optics' ); GVL_PMPS.g_fbArbiter1.AddRequest(16#5, PMPS_GVL.cstFullBeam, 'LFE Optics'); fbArbiterIO(Arbiter := GVL_PMPS.g_fbArbiter1, fbFFHWO := GVL_PMPS.g_FastFaultOutput1); GVL_PMPS.g_FastFaultOutput1.Execute(i_xVeto:=); GVL_PMPS.g_FastFaultOutput2.Execute(i_xVeto:=); nMR1L0_Pitch_ENC_PMPS := Main.M5.nRawEncoderULINT; END_PROGRAM Related: * `GVL_PMPS`_ * `Main`_