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_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
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:
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
PRG_1_PlcTask
PROGRAM PRG_1_PlcTask
VAR
END_VAR
PRG_MR1L0_HOMS();
PRG_MR2L0_HOMS();
PRG_PMPS();
END_PROGRAM
- Related:
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:
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:
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