DUTs ---- GVLs ---- Global_Version ^^^^^^^^^^^^^^ :: {attribute 'TcGenerated'} // This function has been automatically generated from the project information. VAR_GLOBAL CONSTANT {attribute 'const_non_replaced'} {attribute 'linkalways'} stLibVersion_LFE_ARBITER : ST_LibVersion := (iMajor := 3, iMinor := 3, iBuild := 0, iRevision := 0, sVersion := '3.3.0'); END_VAR GVL ^^^ :: VAR_GLOBAL {attribute 'pytmc' := ' pv: @(PREFIX)Arbiter:01 '} g_fbArbiter1 : FB_Arbiter(25); ReqBP : ST_BeamParams; //Currently the placeholder for the fully arbitrated BP set //Example implementation of the FFO {attribute 'pytmc' := ' pv: @(PREFIX)FFO:01 '} {attribute 'TcLinkTo' := '.q_xFastFaultOut:=TIIB[FFO]^Channel 1^Output'} g_FastFaultOutput1 : FB_HardwareFFOutput := (bAutoReset := TRUE); {attribute 'pytmc' := ' pv: @(PREFIX)FFO:02 '} {attribute 'TcLinkTo' := '.q_xFastFaultOut:=TIIB[FFO]^Channel 2^Output'} g_FastFaultOutput2 : FB_HardwareFFOutput := (bAutoReset := TRUE); g_rTestingVelocity : LREAL := PMPS_GVL.VISIBLE_TEST_VELOCITY; AttemptReset : BOOL; // For testing END_VAR VAR_GLOBAL CONSTANT MAX_FAST_FAULTS : UINT := 100; END_VAR GVL_CheckBounds ^^^^^^^^^^^^^^^ :: {attribute 'qualified_only'} VAR_GLOBAL nTooLow : UDINT; nTooHigh : UDINT; nDivByZero : UDINT; END_VAR POUs ---- CheckBounds ^^^^^^^^^^^ :: // Implicitly generated code : DO NOT EDIT FUNCTION CheckBounds : DINT VAR_INPUT index, lower, upper: DINT; END_VAR // User defined local variables VAR sMessageLow : STRING := 'CheckBounds: Index too low (%d)'; sMessageHigh : STRING := 'CheckBounds: Index too high (%d)'; END_VAR // Index too low IF index < lower THEN CheckBounds := lower; // Increase global counter GVL_CheckBounds.nTooLow := GVL_CheckBounds.nTooLow + 1; // Log message ADSLOGDINT(msgCtrlMask := ADSLOG_MSGTYPE_WARN, msgFmtStr := sMessageLow, dintArg := index); // Index too high ELSIF index > upper THEN CheckBounds := upper; // Increase global counter GVL_CheckBounds.nTooHigh := GVL_CheckBounds.nTooHigh + 1; // Log message ADSLOGDINT(msgCtrlMask := ADSLOG_MSGTYPE_WARN, msgFmtStr := sMessageHigh, dintArg := index); // Index OK ELSE CheckBounds := index; END_IF {flow} END_FUNCTION Related: * `GVL_CheckBounds`_ CheckRangeSigned ^^^^^^^^^^^^^^^^ :: // Implicitly generated code : DO NOT EDIT FUNCTION CheckRangeSigned : DINT VAR_INPUT value, lower, upper: DINT; END_VAR // Implicitly generated code : Only an Implementation suggestion IF (value < lower) THEN CheckRangeSigned := lower; ELSIF(value > upper) THEN CheckRangeSigned := upper; ELSE CheckRangeSigned := value; END_IF {flow} END_FUNCTION CheckRangeUnsigned ^^^^^^^^^^^^^^^^^^ :: // Implicitly generated code : DO NOT EDIT FUNCTION CheckRangeUnsigned : UDINT VAR_INPUT value, lower, upper: UDINT; END_VAR // Implicitly generated code : Only an Implementation suggestion {noflow} IF (value < lower) THEN CheckRangeUnsigned := lower; ELSIF(value > upper) THEN CheckRangeUnsigned := upper; ELSE CheckRangeUnsigned := value; END_IF {flow} END_FUNCTION CurrentBPUpdate ^^^^^^^^^^^^^^^ :: PROGRAM CurrentBPUpdate VAR {attribute 'pytmc' := ' pv: @(PREFIX)PE '} fbLPhotonEnergy : FB_LPhotonEnergy; {attribute 'pytmc' := ' pv: @(PREFIX)L:Rate link: IOC:BSY0:MP01:BYKIK_RATE field: EGU RateEnum '} fbBYKIK_Rate : FB_LREALFromEPICS := ( iMaximumValidSeverity := 2); {attribute 'pytmc' := ' pv: @(PREFIX) '} fbEPICSLRate : FB_RateFromEPICS; {attribute 'pytmc' := ' pv: @(PREFIX)L:BC link: SIOC:SYS0:MP03:SC_HXR_BC field: EGU BCEnum '} fbMPS_BeamClass : FB_LREALFromEPICS := ( iMaximumValidSeverity := 2); {attribute 'pytmc' := ' pv: @(PREFIX) '} fbEPICSLBeamClass : FB_BeamClassFromEPICS; {attribute 'pytmc' := ' pv: @(PREFIX)L:Mode link: SIOC:FEEH:MP01:FACMODE_RBV '} fbHXR_MachineMode : FB_LREALFromEPICS := ( iMaximumValidSeverity := 2); {attribute 'pytmc' := ' pv: @(PREFIX) '} fbEPICSLMachineMode : FB_MachineModeFromEPICS; //All Sold attenuators requests are summerrized into this one output {attribute 'TcLinkTo' := 'TIIB[plc-lfe-motion]^IO Outputs^rPhotonEnergy'} q_rPhotonEnergy AT %Q* : REAL; // Stoppers {attribute 'TcLinkTo' := ' .i_StopperInLS:=TIIB[PPS_Stoppers]^Channel 1^ST1L0_PPS_IN; .i_StopperOutLS:=TIIB[PPS_Stoppers]^Channel 2^ST1L0_PPS_OUT; .q_StopperOUT_Relay:=TIIB[MPS_Relay]^Channel 1^ST1L0_RELAY_OUT; .q_StopperIN_Relay:=TIIB[MPS_Relay]^Channel 2^ST1L0_RELAY_IN; '} st1l0Watcher : FB_LStopper( PMPS.L_Stopper.ST1L0, 'ST1L0'); {attribute 'TcLinkTo' := ' .i_StopperInLS:=TIIB[PPS_Stoppers]^Channel 3^ST1L1_PPS_IN; .i_StopperOutLS:=TIIB[PPS_Stoppers]^Channel 4^ST1L1_PPS_OUT; .q_StopperIN_Relay:=TIIB[PMPS_Premp]^Channel 6^Output; '} st1l1Watcher : FB_LStopper( PMPS.L_Stopper.ST1L1, 'ST1L1'); idx : UINT := 1; bcBitmask : WORD:=0; // MR1L0 Veto //////////////////////// {attribute 'TcLinkTo' := 'TIIB[plc-lfe-optics]^IO Inputs^MR1L0_Pitch_ENC'} i_MR1L0_ENC AT %I* : UDINT; // MR1L0 encoder from the rix optics system cMR1L0_TXI_UpperLimit : UDINT := 11116030+500000; cMR1L0_TXI_LowerLimit : UDINT := 11116000-500000; cMR1L0_L0_UpperLimit : UDINT := 8602330+100000; {attribute 'TcLinkTo' := 'TIIB[PMPS_Premp]^Channel 7^MR1L0 TXI'} q_MR1L0_TXI AT %Q* : BOOL; // Signal to accel. MPS that MR1L0 is TXI fbMR1L0VetoDevice : FB_LVetoDevice( eVetoDeviceIN := L_Stopper.MR1L0_TXI, eVetoDeviceOUT := L_Stopper.MR1L0_L0, sVetoDeviceName := 'MR1L0'); // MR1L1 Veto //////////////////////// {attribute 'TcLinkTo' := 'TIIB[plc-txi-lfe-optics]^IO Inputs^MR1L1_Y_ENC'} i_MR1L1_ENC AT %I* : UDINT; // MR1L1 encoder from the rix optics system cMR1L1_IN_UpperLimit : UDINT := 108500000; cMR1L1_IN_LowerLimit : UDINT := 108600000; cMR1L1_OUT_UpperLimit : UDINT := 9100000;// estimated {attribute 'TcLinkTo' := 'TIIB[PMPS_Premp]^Channel 8^MR1L1 IN'} q_MR1L1_VETO AT %Q* : BOOL; // Signal to accel. MPS that MR1L1 is in fbMR1L1VetoDevice : FB_LVetoDevice( eVetoDeviceIN := L_Stopper.MR1L1_IN, eVetoDeviceOUT := L_Stopper.MR1L1_OUT, sVetoDeviceName := 'MR1L1'); END_VAR // Acquiring photon energy fbLPhotonEnergy(BP:=PMPS_GVL.stCurrentBeamParameters); q_rPhotonEnergy := LREAL_TO_REAL(fbLPhotonEnergy.fbHgvpu.fCurrentPhotonEnergy); //Update current photon energy PMPS_GVL.stCurrentBeamParameters.neV := LREAL_TO_REAL(fbLPhotonEnergy.fbHgvpu.fCurrentPhotonEnergy); // Acquiring L-line rate fbEPICSLRate(BP:=PMPS_GVL.stCurrentBeamParameters, fbBYKIK_Rate:=fbBYKIK_Rate, FFO:=GVL.g_FastFaultOutput1); // Acquiring L-line BeamClass fbEPICSLBeamClass(BP:=PMPS_GVL.stCurrentBeamParameters, fbMPS_BeamClass:=fbMPS_BeamClass, FFO:=GVL.g_FastFaultOutput1); // Acquiring L-line Machine Mode fbEPICSLMachineMode(BP:=PMPS_GVL.stCurrentBeamParameters, fbMPS_MachineMode:=fbHXR_MachineMode, FFO:=GVL.g_FastFaultOutput1); // Watching and relaying stopper statuses st1l0Watcher(stCurrentBP := PMPS_GVL.stCurrentBeamParameters); st1l1Watcher(stCurrentBP := PMPS_GVL.stCurrentBeamParameters); // MR1L0 Veto //////////////////////// fbMR1L0VetoDevice( i_bIn := cMR1L0_TXI_LowerLimit < i_MR1L0_ENC AND i_MR1L0_ENC < cMR1L0_TXI_UpperLimit, i_bOut := i_MR1L0_ENC < cMR1L0_L0_UpperLimit, q_bIN => q_MR1L0_TXI, stCurrentBP:= PMPS_GVL.stCurrentBeamParameters); // MR1L1 Veto //////////////////////// fbMR1L1VetoDevice( i_bIn := cMR1L1_IN_LowerLimit < i_MR1L1_ENC AND i_MR1L1_ENC < cMR1L1_IN_UpperLimit, i_bOut := i_MR1L1_ENC < cMR1L1_OUT_UpperLimit, q_bIN => q_MR1L1_VETO, stCurrentBP:= PMPS_GVL.stCurrentBeamParameters); END_PROGRAM Related: * `GVL`_ CXDisplay ^^^^^^^^^ :: PROGRAM CXDisplay VAR DisplayStats : FB_CXSetTextDisplayUSB := (nPort:=28928); fbFormat : FB_FormatString; bError : BOOL; nErrID : UDINT; sOut : T_MaxString; END_VAR (* DisplayStats.bExecute S= NOT DisplayStats.bBusy AND NOT DisplayStats.bError; DisplayStats.bExecute R= DisplayStats.bBusy OR DisplayStats.bError; DisplayStats.sLine1 := 'PMPS-ARBITER-K'; fbFormat(sFormat := 'Fast Faults: %d', arg1:=F_ULINT(PMPS_GVL.AccumulatedFF), sOut=>DisplayStats.sLine2, bError => bError, nErrID => nErrID ); DisplayStats(eMode:=E_CX2100_DisplayModesWr.eCX2100_WriteLines); *) END_PROGRAM Fast_Faults_Evaluate ^^^^^^^^^^^^^^^^^^^^ :: PROGRAM Fast_Faults_Evaluate VAR END_VAR //g_FastFaultOutput1.EvaluateOutput(bAutoReset:=TRUE); //g_FastFaultOutput2.EvaluateOutput(bAutoReset:=TRUE); // FF //g_FastFaultOutput1.Execute(); //g_FastFaultOutput2.Execute(); END_PROGRAM MachineSimulation ^^^^^^^^^^^^^^^^^ :: PROGRAM MachineSimulation VAR fbMachine : FB_MachineSimulator; //Simulates attenuator as well fbeVSimulator : FB_eVSimulator := (NoiseLevel := 1); rTestPhotonEnergy : REAL; END_VAR // reV Simulator fbeVSimulator(); // Machine simulator fbMachine( i_stAssertedParams := PMPS_GVL.stRequestedBeamParameters, iq_stMachineParams := PMPS_GVL.stCurrentBeamParameters, i_xFault := NOT GVL.g_FastFaultOutput1.q_xFastFaultOut, xEnableAtt := TRUE, xEnableRate := FALSE, xEnablePE := TRUE ); //PMPS_GVL.stCurrentBeamParameters.neVRange := F_eVRangeCalculator(rTestPhotonEnergy, PMPS_GVL.stCurrentBeamParameters.neVRange); //PMPS_GVL.stCurrentBeamParameters.neVRange := 0; END_PROGRAM Related: * `GVL`_ MAIN ^^^^ :: PROGRAM MAIN VAR Initialize : BOOL := TRUE; fbLogHandler : FB_LogHandler; fbEcatDiag : FB_EcatDiagWrapper; idx: UINT; //System Time {attribute 'pytmc' := ' pv: @(PREFIX)SystemDT io: i '} SystemTime:DINT; fbTime : FB_LocalSystemTime := ( bEnable := TRUE, dwCycle := 1 ); //Get current system time, used for override fbTime_to_UTC: FB_TzSpecificLocalTimeToSystemTime; fbGetTimeZone: FB_GetTimeZoneInformation; END_VAR //Arbiter PLC IF Initialize THEN Initialize := FALSE; // Setting apertures to zero for now FOR idx := 1 TO PMPS_GVL.MAX_APERTURES DO PMPS_GVL.stCurrentBeamParameters.astApertures[idx].Height := 0; PMPS_GVL.stCurrentBeamParameters.astApertures[idx].Width := 0; END_FOR END_IF // Ethercat Diagnostics fbEcatDiag(); CurrentBPUpdate(); /////////////////////////////////////////////////// // This code should be disabled or removed in deployment // Might have a switch to change to simulation mode MachineSimulation(); //Testing(); /////////////////////////////////////////////////// // PMPS Functionality PMPS_Arbiter(); A_SystemTime(); P_SATT(); fbLogHandler(); P_OpticsProtection(); //FF g_FastFaultOutput1.Execute(); g_FastFaultOutput2.Execute(); END_PROGRAM ACTION A_SystemTime: //Get local System Time fbTime(sNetID:=''); //Get Time Zone fbGetTimeZone(sNetID:='',bExecute:=TRUE,tTimeout:=T#10S); //change local time to UTC to be compatible with unix time epoch widget fbTime_to_UTC(in:= fbTime.systemTime , tzInfo:=fbGetTimeZone.tzInfo); SystemTime:= TO_DINT(TO_DT(SystemTime_TO_DT(fbTime_to_UTC.out))); END_ACTION ACTION Initialize: END_ACTION Related: * `CurrentBPUpdate`_ * `MachineSimulation`_ * `PMPS_Arbiter`_ * `P_OpticsProtection`_ * `P_SATT`_ * `Testing`_ P_OpticsProtection ^^^^^^^^^^^^^^^^^^ :: PROGRAM P_OpticsProtection VAR fbFF : FB_FastFault :=( i_DevName := 'LFE OPTICS', i_Desc := 'Fault occurs when MR1L0 is in L0 State and MR1L1 in IN.', i_TypeCode := 16#404 ); END_VAR fbFF(i_xOK := NOT(PMPS.PMPS_GVL.stCurrentBeamParameters.aVetoDevices[PMPS.L_Stopper.MR1L0_L0] AND PMPS.PMPS_GVL.stCurrentBeamParameters.aVetoDevices[PMPS.L_Stopper.MR1L1_IN]), io_fbFFHWO :=GVL.g_FastFaultOutput1 , i_xAutoReset := ); END_PROGRAM Related: * `GVL`_ P_SATT ^^^^^^ :: PROGRAM P_SATT VAR //All Solid attenuators requests are summarized into this one output {attribute 'TcLinkTo' := 'TIIB[plc-lfe-motion]^IO Outputs^SattArrayReq'} q_SattArrayReq AT %Q* : ARRAY [1..PMPS_GVL.AUX_ATTENUATORS] OF ST_PMPS_Attenuator_IO; // Transmission request to ALL PLCs //Per PLC current satt trans {attribute 'TcLinkTo' := 'TIIB[plc-lfe-motion]^IO Inputs^SattArrayStatus'} i_SattArrStatus_LFE AT %I* : ARRAY [1..PMPS_GVL.AUX_ATTENUATORS] OF ST_PMPS_Attenuator_IO; // Transmission status from LFE MOT PLC // plc-lfe-motion interface diagnostics {attribute 'TcLinkTo' := 'TIIB[plc-lfe-motion]^WcState^WcStateOut'} i_bWcStateOut_lfe_mot AT %I* : BOOL; {attribute 'TcLinkTo' := 'TIIB[plc-lfe-motion]^WcState^WcStateIn'} i_bWcStateIn_lfe_mot AT %I* : BOOL; {attribute 'TcLinkTo' := 'TIIB[plc-lfe-motion]^InfoData^State'} i_nState_lfe_mot AT %I* : UINT; //FFO Connection per PLC ffLfeConnection : FB_FastFault := ( i_DevName := 'PMPS Arbiter', i_Desc := 'EtherCAT interface watcher, for lfe-mot connection to systems for attenuation requests. Very rare. Make a note, and if it can be reset, go ahead.', i_TypeCode := 16#5); END_VAR // Send request from this arbiter to all satts MEMCPY( ADR(q_SattArrayReq) , ADR(PMPS_GVL.stRequestedBeamParameters.astAttenuators) , PMPS_GVL.AUX_ATTENUATORS * SIZEOF(ST_PMPS_Attenuator_IO) ); //TMO motion PLC SATT current trans update IF i_bWcStateIn_lfe_mot = 0 AND i_bWcStateOut_lfe_mot = 0 AND i_nState_lfe_mot = 8 THEN // Recieve current transmission of the satt //PMPS_GVL.stCurrentBeamParameters.astAttenuators[PMPS.L_Attenuators.AT2L0].nTran := i_SattArrStatus_LFE[PMPS.L_Attenuators.AT2L0].nTran; //PMPS_GVL.stCurrentBeamParameters.astAttenuators[PMPS.L_Attenuators.AT2L0].xAttOK := i_SattArrStatus_LFE[PMPS.L_Attenuators.AT2L0].xAttOK; ffLfeConnection.i_xOK := TRUE; ELSE // Fast fault fflfeConnection.i_xOK := FALSE; END_IF ffLfeConnection(io_fbFFHWO := g_FastFaultOutput1); END_PROGRAM PMPS_Arbiter ^^^^^^^^^^^^ :: PROGRAM PMPS_Arbiter VAR fbBPRequestor : FB_BPRequestor; // Updates global PMPS RequestedBeamParams {attribute 'pytmc' := ' pv: @(PREFIX)PhotonEnergyWatcher '} fbPhotonEnergyWatcher : FB_PhotonEnergyWatcher; {attribute 'pytmc' := ' pv: @(PREFIX)BeamClassWatcher '} fbBeamClassWatcher : FB_BeamClassWatcher; {attribute 'pytmc' := ' pv: @(PREFIX)BeamClassOutputs '} fbMPSInterface : FB_BeamClassOutputs_BCD; {attribute 'pytmc' := ' pv: @(PREFIX)CuRateOutputs '} fbCuInterface : FB_CTLS_Outputs; {attribute 'pytmc' := ' pv: @(PREFIX)BeamParamCntl '} fbBPControl : FB_BPControlDevice(nID:=10); (* Subsystem requests use this FB and a pragma link to pass their requests to the arbiter. The fb is called on each cycle and updates the arbiter with the current BP set requested from the subsystem PLC.*) // make this so it does input and output to the IF (*{attribute 'pytmc' := ' pv: @(PREFIX):PLC1 '}*) {attribute 'TcLinkTo' := '.i_RequestedBP:=TIIB[plc-lfe-motion]^IO Inputs^RequestedBP; .o_CurrentBP:=TIIB[plc-lfe-motion]^IO Outputs^CurrentBP; .i_Connected:=TIIB[plc-lfe-motion]^SYNC Inputs^External device not connected; .i_WcState:=TIIB[plc-lfe-motion]^WcState^WcStateIn; .i_TxPDOState:=TIIB[plc-lfe-motion]^SYNC Inputs^TxPDO state; '} plc_lfe_motion_PMPS_IO : FB_ArbiterToSubSys_IO := (RequestingSystemID := 16#FF0F); {attribute 'TcLinkTo' := '.i_RequestedBP:=TIIB[plc-lfe-optics]^IO Inputs^RequestedBP; .o_CurrentBP:=TIIB[plc-lfe-optics]^IO Outputs^CurrentBP; .i_Connected:=TIIB[plc-lfe-optics]^SYNC Inputs^External device not connected; .i_WcState:=TIIB[plc-lfe-optics]^WcState^WcStateIn; .i_TxPDOState:=TIIB[plc-lfe-optics]^SYNC Inputs^TxPDO state; '} plc_lfe_optics_PMPS_IO : FB_ArbiterToSubSys_IO := (RequestingSystemID := 16#FF10); {attribute 'TcLinkTo' := '.i_RequestedBP:=TIIB[plc-xrt-homs]^IO Inputs^RequestedBP; .o_CurrentBP:=TIIB[plc-xrt-homs]^IO Outputs^CurrentBP; .i_Connected:=TIIB[plc-xrt-homs]^SYNC Inputs^External device not connected; .i_WcState:=TIIB[plc-xrt-homs]^WcState^WcStateIn; .i_TxPDOState:=TIIB[plc-xrt-homs]^SYNC Inputs^TxPDO state; '} plc_xrt_homs_PMPS_IO : FB_ArbiterToSubSys_IO := (RequestingSystemID := 16#FF13); {attribute 'TcLinkTo' := '.i_RequestedBP:=TIIB[plc-lfe-vacuum]^IO Inputs^RequestedBP; .o_CurrentBP:=TIIB[plc-lfe-vacuum]^IO Outputs^CurrentBP; .i_Connected:=TIIB[plc-lfe-vacuum]^SYNC Inputs^External device not connected; .i_WcState:=TIIB[plc-lfe-vacuum]^WcState^WcStateIn; .i_TxPDOState:=TIIB[plc-lfe-vacuum]^SYNC Inputs^TxPDO state; '} plc_lfe_vac_PMPS_IO : FB_ArbiterToSubSys_IO := (RequestingSystemID := 16#FF11); {attribute 'TcLinkTo' := '.i_RequestedBP:=TIIB[plc-lfe-gem]^IO Inputs^RequestedBP; .o_CurrentBP:=TIIB[plc-lfe-gem]^IO Outputs^CurrentBP; .i_Connected:=TIIB[plc-lfe-gem]^SYNC Inputs^External device not connected; .i_WcState:=TIIB[plc-lfe-gem]^WcState^WcStateIn; .i_TxPDOState:=TIIB[plc-lfe-gem]^SYNC Inputs^TxPDO state; '} plc_lfe_gatt_PMPS_IO : FB_ArbiterToSubSys_IO := (RequestingSystemID := 16#FF12); {attribute 'TcLinkTo' := '.i_RequestedBP:=TIIB[plc-txi-lfe-vacuum]^IO Inputs^RequestedBP; .o_CurrentBP:=TIIB[plc-txi-lfe-vacuum]^IO Outputs^CurrentBP; .i_Connected:=TIIB[plc-txi-lfe-vacuum]^SYNC Inputs^External device not connected; .i_WcState:=TIIB[plc-txi-lfe-vacuum]^WcState^WcStateIn; .i_TxPDOState:=TIIB[plc-txi-lfe-vacuum]^SYNC Inputs^TxPDO state; '} plc_txi_lfe_vacuum_PMPS_IO : FB_ArbiterToSubSys_IO := (RequestingSystemID := 16#FF14); {attribute 'TcLinkTo' := '.i_RequestedBP:=TIIB[plc-txi-lfe-motion]^IO Inputs^RequestedBP; .o_CurrentBP:=TIIB[plc-txi-lfe-motion]^IO Outputs^CurrentBP; .i_Connected:=TIIB[plc-txi-lfe-motion]^SYNC Inputs^External device not connected; .i_WcState:=TIIB[plc-txi-lfe-motion]^WcState^WcStateIn; .i_TxPDOState:=TIIB[plc-txi-lfe-motion]^SYNC Inputs^TxPDO state; '} plc_txi_lfe_motion_PMPS_IO : FB_ArbiterToSubSys_IO := (RequestingSystemID := 16#FF15); {attribute 'TcLinkTo' := '.i_RequestedBP:=TIIB[plc-txi-lfe-optics]^IO Inputs^RequestedBP; .o_CurrentBP:=TIIB[plc-txi-lfe-optics]^IO Outputs^CurrentBP; .i_Connected:=TIIB[plc-txi-lfe-optics]^SYNC Inputs^External device not connected; .i_WcState:=TIIB[plc-txi-lfe-optics]^WcState^WcStateIn; .i_TxPDOState:=TIIB[plc-txi-lfe-motion]^SYNC Inputs^TxPDO state; '} plc_txi_lfe_optics_PMPS_IO : FB_ArbiterToSubSys_IO := (RequestingSystemID := 16#FF16); fbSetPE : PE_Ranges; END_VAR //////////////////////////////////////////////////////////// // Dummy device for controling pmps beam parameters fbBPControl(Arbiter:=g_fbArbiter1); // Updating arbiter with subsystem requests. // FEE LFE plc_lfe_motion_PMPS_IO(Arbiter:=GVL.g_fbArbiter1, fbFFHWO:=GVL.g_FastFaultOutput1, Reset:=GVL.AttemptReset, sName:= 'LFE MOTION'); plc_lfe_optics_PMPS_IO(Arbiter:=GVL.g_fbArbiter1, fbFFHWO:=GVL.g_FastFaultOutput1, Reset:=GVL.AttemptReset , sName:= 'LFE OPTICS'); plc_lfe_vac_PMPS_IO(Arbiter:=GVL.g_fbArbiter1, fbFFHWO:=GVL.g_FastFaultOutput1, Reset:=GVL.AttemptReset, sName:= 'LFE VACUUM'); plc_lfe_gatt_PMPS_IO(Arbiter:=GVL.g_fbArbiter1, fbFFHWO:=GVL.g_FastFaultOutput1, Reset:=GVL.AttemptReset, sName:= 'LFE GEMS'); // TXI LFE plc_txi_lfe_vacuum_PMPS_IO(Arbiter:=GVL.g_fbArbiter1, fbFFHWO:=GVL.g_FastFaultOutput1, Reset:=GVL.AttemptReset, sName:= 'TXI LFE VACUUM'); plc_txi_lfe_motion_PMPS_IO(Arbiter:=GVL.g_fbArbiter1, fbFFHWO:=GVL.g_FastFaultOutput1, Reset:=GVL.AttemptReset, sName:= 'TXI LFE MOTION'); plc_txi_lfe_optics_PMPS_IO(Arbiter:=GVL.g_fbArbiter1, fbFFHWO:=GVL.g_FastFaultOutput1, Reset:=GVL.AttemptReset, sName:= 'TXI LFE OPTICS'); //XRT plc_xrt_homs_PMPS_IO(Arbiter:=GVL.g_fbArbiter1, fbFFHWO:=GVL.g_FastFaultOutput1, Reset:=GVL.AttemptReset, sName:= 'XRT OPTICS'); //Overriding the preemptive requests from the optics systems until they are valid //GVL.g_fbArbiter1.RemoveRequest(nReqId:=plc_lfe_optics_PMPS_IO.RequestingSystemID); // Beam parameter requestor fbBPRequestor(Arbiter:=GVL.g_fbArbiter1, q_ReqBP => PMPS_GVL.stRequestedBeamParameters); // Request beam class fbMPSInterface(BP := PMPS_GVL.stRequestedBeamParameters); // Request Cu beam rate fbCuInterface(BP := PMPS_GVL.stRequestedBeamParameters); // Keep an eye on the beam class fbBeamClassWatcher(i_stCurrentBeamParams := PMPS_GVL.stCurrentBeamParameters, i_stRequestedBeamParams := PMPS_GVL.stRequestedBeamParameters, io_fbFFHWO:= GVL.g_FastFaultOutput1, i_xAutoReset := GVL.AttemptReset); // Keep an eye on the photon energy fbPhotonEnergyWatcher(i_stCurrentBeamParams := PMPS_GVL.stCurrentBeamParameters, i_stRequestedBeamParams := PMPS_GVL.stRequestedBeamParameters, io_fbFFHWO:= GVL.g_FastFaultOutput1, i_xReset := GVL.AttemptReset); END_PROGRAM Related: * `GVL`_ Testing ^^^^^^^ :: PROGRAM Testing VAR AttemptReset : TON := (PT:=T#1s); gAttemptReset : TON := (PT:=T#500ms); testFF : FB_FastFault; cycle : INT; END_VAR // Trip a fast fault periodically testFF(io_fbFFHWO:= g_FastFaultOutput1); //testFF.i_xOK := (cycle mod 1000) = 0; //cycle := cycle + 1; //Periodically try to reset the photon energy fault. AttemptReset(IN:=PMPS_Arbiter.fbPhotonEnergyWatcher.xPhotonEnergyWithinBounds, Q=>GVL.AttemptReset); gAttemptReset(IN:=GVL.g_FastFaultOutput1.xOK, Q=>GVL.g_FastFaultOutput1.i_xReset); END_PROGRAM Related: * `GVL`_ * `PMPS_Arbiter`_