using Aitex.Core.RT.DataCenter; using Aitex.Core.RT.Device; using Aitex.Core.RT.Log; using Aitex.Core.RT.OperationCenter; using Aitex.Core.Util; using MECF.Framework.Common.Beckhoff.ModuleIO; using MECF.Framework.Common.CommonData.Prewet; using MECF.Framework.Common.Device.Safety; using MECF.Framework.Common.Equipment; using MECF.Framework.Common.TwinCat; using MECF.Framework.Common.Utilities; using CyberX8_Core; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using CyberX8_RT.Devices.AXIS; using Aitex.Core.RT.SCCore; using MECF.Framework.Common.WaferHolder; using MECF.Framework.Common.IOCore; namespace CyberX8_RT.Devices.Safety { public class SafetyDevice : BaseDevice, IDevice { #region 常量 private const string TWINCAT_STATE = "TwincatState"; private const string MAIN_COMM_ERR = "MainCommErr"; private const string LOADER_PUF_COMM_ERR="LoaderPufCommErr"; private const string SRD_COMM_ERR = "SrdCommErr"; private const string TRANSPORTER_COMM_ERR="TransportCommErr"; private const string MAIN_FUNCTION_BLOCK_ERR= "MainFunctionBlockErr"; private const string LOADER_PUF_FUNCTION_BLOCK_ERR="LoaderPufFunctionBlockErr"; private const string SRD_FUNCTION_BLOCK_ERR = "SrdFunctionBlockErr"; private const string TRANSPORTER_FUNCTION_BLOCK_ERR="TransporterFunctionBlockErr"; private const string IS_INITIALIZED = "IsInitialized"; private const double OP_HOT_CONNECT_STATE = 8; #region Hot Connect private const string HOT_CONNECT_STATE = "HotConnectState"; private const string LOADER_HOT_CONNECT_STATE= "LoaderHotConnectState"; private const string PUF_HOT_CONNECT_STATE="PufHotConnectState"; private const string SRD_HOT_CONNECT_STATE="SrdHotConnectState"; private const string TRANSPORTER_HOT_CONNECT_STATE="TransporterHotConnectState"; private const string LDR_HOT_CONNECT_STATE="LdrHotConnectState"; private const string PRC_HOT_CONNECT_STATE="PrcHotConnectState"; private const string RESERVOIR1_HOT_CONNECT_STATE="Reservoir1HotConnectState"; private const string RESERVOIR2_HOT_CONNECT_STATE="Reservoir2HotConnectState"; private const string FFU_HOT_CONNECT_STATE="FFUHotConnectState"; #endregion #region Restart private const string RUNSTOP = "RunStop"; private const string ERRACK = "ErrAck"; private const string SLS_RESTART = "SlsRestart"; private const string TX_STO_MON_Restart = "TxStoMonRestart"; private const string TX_STO1_ESTOP_Restart = "TxSto1EstopRestart"; private const string TX_STO2_ESTOP_RESTART = "TxSto2EstopRestart"; private const string LDR_PUF_STO_MON_RESTART = "LdrPufStoMonRestart"; private const string LDR_PUF_STO1_ESTOP_RESTART = "LdrPufSto1EstopRestart"; private const string LDR_PUF_STO2_ESTOP_RESTART = "LdrPufSto2EstopRestart"; private const string SRD_STO_ESTOP_RESTART = "SrdStoEstopRestart"; private const string PUMP_STO_ESTOP_RESTART = "PumpStoEstopRestart"; private const string FLUID_ESTOP_RESTART = "FluidEstopRestart"; #endregion #region Door Lock private const string LOADER_DOOR_LOCK= "LoaderDoorLock"; private const string LOADER_DOOR_LOCKED="LoaderDoorLocked"; private const string LOADER_PANEL_REMOVED="LoaderPanelRemoved"; private const string LOWER_LOADER_PANEL_REMOVED = "LowerLoaderPanelRemoved"; private const string BUFFER_DOOR_LOCK="BufferDoorLock"; private const string BUFFER_DOOR_LOCKED="BufferDoorLocked"; private const string BUFFER_PANEL_REMOVED = "BufferPanelRemoved"; private const string PROCESS_DOOR_LOCK="ProcessDoorLock"; private const string PROCESS_DOOR1_LOCKED="ProcessDoor1Locked"; private const string PROCESS_DOOR2_LOCKED="ProcessDoor2Locked"; private const string PROCESS_DOOR3_LOCKED="ProcessDoor3Locked"; private const string PROCESS_DOOR4_LOCKED="ProcessDoor4Locked"; private const string PROCESS_UPPER_PANELS_ON = "ProcessUpperPanelsOn"; #endregion private const string SRD_TOP_PANEL_REMOVED="SrdTopPanelRemoved"; private const string SRD_LOWER_PANEL_REMOVED="SrdLowerPanelRemoved"; private const string PLUMBING_DOOR_CLOSED = "PlumbingDoorClosed"; private const string PROCESS_HALT_BUTTON1="ProcessHaltButton1"; private const string PROCESS_HALT_BUTTON2="ProcessHaltButton2"; private const string LOADER_HALT_BUTTON= "LoaderHaltButton"; private const string MODE_SELECTOR_SWITCH="ModeSelectorSwitch"; private const string MODE_SIREN="ModeSiren"; #region SLS private const string LOADER_ROTATION_SLS="LoaderRotationSls"; private const string LOADER_SWINGA_SLS="LoaderSwingASls"; private const string LOADER_SWINGB_SLS="LoaderSwingBSls"; private const string LOADER_TILTA_SLS="LoaderTiltASls"; private const string LOADER_TILTB_SLS="LoaderTiltBSls"; private const string PUF1_VERTICAL_SLS="Puf1VerticalSls"; private const string PUF2_VERTICAL_SLS="Puf2VerticalSls"; private const string LOADER_GANTRY_SLS="LoaderGantrySls"; private const string LOADER_ELEVATOR_SLS="LoaderElevatorSls"; private const string PROCESS_GANTRY_SLS="ProcessGantrySls"; private const string PROCESS_ELEVATOR_SLS="ProcessElevatorSls"; #endregion #region Disable private const string PUF_VERTICAL_DISABLE= "PufVerticalDisable"; private const string PUF1_FLIP_ROTATION_DISABLE="Puf1FlipRotationDisable"; private const string PUF2_FLIP_ROTATION_DISABLE="Puf2FlipRotationDisable"; private const string LOADER_DISABLE="LoaderDisable"; private const string TRANSPORTER_DISABLE="TransporterDisable"; private const string SRD_ARM_DISABLE="SrdArmDisable"; private const string SRD_ROTATION_DISABLE="SrdRotationDisable"; #endregion #region safety private const string TRANSPORTER_SAFE_SLS="TransporterSafeSls"; private const string LOADER_SAFE_SLS="LoaderSafeSls"; private const string PUF_VERTICAL_SAFE_SLS="PufVerticalSafeSls"; private const string LOADER_SAFE_STO="LoaderSafeSto"; private const string PUF_VERTICAL_SAFE_STO="PufVerticalSafeSto"; private const string PUF1_FLIP_ROTATION_SAFE_STO="Puf1FlipRotationSafeSto"; private const string PUF2_FLIP_ROTATION_SAFE_STO="Puf2FlipRotationSafeSto"; private const string TRANSPORTER_SAFE_STO="TransporterSafeSto"; private const string SRD_ROTATION_SAFE_STO = "SrdRotationSafeSto"; private const string SRD_ARM_SAFE_STO="SrdArmSafeSto"; #endregion #region Plumbling private const string PUMP_EDM="PumpEdm"; private const string RESERVIOR_HIGH_LEVEL="ReservoirHighLevel"; private const string FLUID_ENABLE_EDM="FluidEnableEdm"; #endregion private const string SRD_ARM_RESET="SRDArmReset"; private const string SAFETY_DATA="SafetyData"; #endregion #region 内部变量 /// /// Reset Routine /// private SafetyResetRoutine _resetRoutine; /// /// All Switch On Routine /// private SafetyNewAllOnRoutine _allOnRoutine; /// /// AllOnRoutine状态 /// private RState _allOnStatus; /// /// 操作当前状态 /// private RState _status; /// /// 变量是否初始化字典 /// private Dictionary _variableInitializeDic = new Dictionary(); /// /// 定时器Job /// PeriodicJob _periodicJob = null; #endregion #region 属性 /// /// 数据对象 /// public SafetyData SafetyData { get; set; } /// /// 状态 /// public RState Status { get; set; } /// /// 所有io变量是否初始化 /// public bool IOInitialized { get { return IOVariableDictionaryUtil.AllIoVariableInitialized(eEvent.ERR_SAFETY,Module,_variableInitializeDic); } } #endregion /// /// 构造函数 /// /// public SafetyDevice() : base("Safety", "Safety", "Safety", "Safety") { SafetyData = new SafetyData(); } /// /// 定时器 /// /// private bool OnTimer() { if (_status==RState.Running) { _status = _resetRoutine.Monitor(); if(_status==RState.End) { LOG.WriteLog(eEvent.INFO_SAFETY, Module, "Reset Complete"); } else if(_status==RState.Failed) { LOG.WriteLog(eEvent.ERR_SAFETY, Module, "Reset Error"); } } //AllOnRoutine监控 if (_allOnStatus == RState.Running) { _allOnStatus = _allOnRoutine.Monitor(); if (_allOnStatus == RState.End) { LOG.WriteLog(eEvent.INFO_SAFETY, Module, "All On Complete"); } else if (_allOnStatus == RState.Failed) { LOG.WriteLog(eEvent.ERR_SAFETY, Module, "All On Error"); } } SLSAxisModeSiren(); //WaferShuttleUsageMonitor WaferHolderManager.Instance.WaferShuttleUsageMonitor(); return true; } /// /// SLS模块下Axis Mode Siren /// private void SLSAxisModeSiren() { int count = 0; //count += AxisModeSirenOn(SafetyData.Puf1VerticalSls, $"{ModuleName.PUF1}.Vertical"); //count += AxisModeSirenOn(SafetyData.Puf2VerticalSls, $"{ModuleName.PUF2}.Vertical"); //count += AxisModeSirenOn(SafetyData.LoaderTiltASls, $"{ModuleName.Loader1}.TiltA"); //count += AxisModeSirenOn(SafetyData.LoaderTiltBSls, $"{ModuleName.Loader1}.TiltB"); //count += AxisModeSirenOn(SafetyData.LoaderSwingASls, $"{ModuleName.Loader1}.SwingA"); //count += AxisModeSirenOn(SafetyData.LoaderSwingBSls, $"{ModuleName.Loader1}.SwingB"); //count += AxisModeSirenOn(SafetyData.LoaderRotationSls, $"{ModuleName.Loader1}.Rotation"); //count += AxisModeSirenOn(SafetyData.LoaderGantrySls, $"{ModuleName.Transporter2}.Gantry"); //count += AxisModeSirenOn(SafetyData.LoaderElevatorSls, $"{ModuleName.Transporter2}.Elevator"); //count += AxisModeSirenOn(SafetyData.ProcessGantrySls, $"{ModuleName.Transporter1}.Gantry"); //count += AxisModeSirenOn(SafetyData.ProcessElevatorSls, $"{ModuleName.Transporter1}.Elevator"); count += AxisModeSirenOn(!SafetyData.ModeSelectorSwitch, $"{ModuleName.PUF1}.Vertical"); count += AxisModeSirenOn(!SafetyData.ModeSelectorSwitch, $"{ModuleName.PUF2}.Vertical"); count += AxisModeSirenOn(!SafetyData.ModeSelectorSwitch, $"{ModuleName.Loader1}.TiltA"); count += AxisModeSirenOn(!SafetyData.ModeSelectorSwitch, $"{ModuleName.Loader1}.TiltB"); count += AxisModeSirenOn(!SafetyData.ModeSelectorSwitch, $"{ModuleName.Loader1}.ShuttleA"); count += AxisModeSirenOn(!SafetyData.ModeSelectorSwitch, $"{ModuleName.Loader1}.ShuttleB"); count += AxisModeSirenOn(!SafetyData.ModeSelectorSwitch, $"{ModuleName.Loader1}.Rotation"); count += AxisModeSirenOn(!SafetyData.ModeSelectorSwitch, $"{ModuleName.Transporter2}.Gantry"); count += AxisModeSirenOn(!SafetyData.ModeSelectorSwitch, $"{ModuleName.Transporter2}.Elevator"); count += AxisModeSirenOn(!SafetyData.ModeSelectorSwitch, $"{ModuleName.Transporter1}.Gantry"); count += AxisModeSirenOn(!SafetyData.ModeSelectorSwitch, $"{ModuleName.Transporter1}.Elevator"); if (count==0&&SafetyData.ModeSiren) { ModeSirenOff(); } } /// /// Axis运动Mode Siren On /// /// private int AxisModeSirenOn(bool sls,string axisName) { JetAxisBase axis = DEVICE.GetDevice(axisName); if (axis != null && axis.IsSwitchOn) { if (axis.IsRun&&sls) { ModeSirenOn(); return 1; } } return 0; } /// /// 初始化 /// /// public bool Initialize() { InitializeRoutine(); InitializeData(); SubscribeValueAction(); InitializeOperation(); _periodicJob = new PeriodicJob(200, OnTimer, $"{Module}.OnTimer", true); return true; } /// /// 初始化Routine /// private void InitializeRoutine() { _resetRoutine = new SafetyResetRoutine(Module); _allOnRoutine = new SafetyNewAllOnRoutine(Module); } /// /// 初始化DATA /// private void InitializeData() { DATA.Subscribe($"{Module}.{SAFETY_DATA}",() => SafetyData, SubscriptionAttribute.FLAG.IgnoreSaveDB); DATA.Subscribe($"{Module}.{IS_INITIALIZED}", () => IOInitialized, SubscriptionAttribute.FLAG.IgnoreSaveDB); DATA.Subscribe($"{Module}.TwincatState", () => SafetyData.TwincatState, SubscriptionAttribute.FLAG.IgnoreSaveDB); } /// /// 初始化Operation /// private void InitializeOperation() { OP.Subscribe($"{Module}.LockProcessDoors", (cmd,args) => LockProcessDoor()); OP.Subscribe($"{Module}.UnlockProcessDoors", (cmd, args) => UnlockProcessDoor()); OP.Subscribe($"{Module}.LockLoaderDoors", (cmd, args) => LockLoaderDoor()); OP.Subscribe($"{Module}.UnlockLoaderDoors", (cmd, args) => UnlockLoaderDoor()); OP.Subscribe($"{Module}.LockBufferDoors", (cmd, args) => LockBufferDoor()); OP.Subscribe($"{Module}.UnlockBufferDoors", (cmd, args) => UnlockBufferDoor()); OP.Subscribe($"{Module}.ResetOperation",(cmd, args) => ResetOperation()); OP.Subscribe($"{Module}.AllOnOperation", (cmd, args) => AllOnOperation()); } /// /// 订阅变量数值发生变化 /// private void SubscribeValueAction() { BeckhoffIoSubscribeUpdateVariable( MAIN_COMM_ERR); BeckhoffIoSubscribeUpdateVariable( LOADER_PUF_COMM_ERR); BeckhoffIoSubscribeUpdateVariable( SRD_COMM_ERR); BeckhoffIoSubscribeUpdateVariable( TRANSPORTER_COMM_ERR); BeckhoffIoSubscribeUpdateVariable( MAIN_FUNCTION_BLOCK_ERR); BeckhoffIoSubscribeUpdateVariable( LOADER_PUF_FUNCTION_BLOCK_ERR); BeckhoffIoSubscribeUpdateVariable( SRD_FUNCTION_BLOCK_ERR); BeckhoffIoSubscribeUpdateVariable( TRANSPORTER_FUNCTION_BLOCK_ERR); BeckhoffIoSubscribeUpdateVariable( TWINCAT_STATE); BeckhoffIoSubscribeUpdateVariable( LOADER_HOT_CONNECT_STATE); BeckhoffIoSubscribeUpdateVariable( FFU_HOT_CONNECT_STATE); BeckhoffIoSubscribeUpdateVariable( PRC_HOT_CONNECT_STATE); BeckhoffIoSubscribeUpdateVariable( LDR_HOT_CONNECT_STATE); BeckhoffIoSubscribeUpdateVariable( TRANSPORTER_HOT_CONNECT_STATE); BeckhoffIoSubscribeUpdateVariable( SRD_HOT_CONNECT_STATE); BeckhoffIoSubscribeUpdateVariable( PUF_HOT_CONNECT_STATE); BeckhoffIoSubscribeUpdateVariable( RESERVOIR2_HOT_CONNECT_STATE); BeckhoffIoSubscribeUpdateVariable( RESERVOIR1_HOT_CONNECT_STATE); BeckhoffIoSubscribeUpdateVariable( RUNSTOP); BeckhoffIoSubscribeUpdateVariable( ERRACK); BeckhoffIoSubscribeUpdateVariable( SLS_RESTART); BeckhoffIoSubscribeUpdateVariable( TX_STO1_ESTOP_Restart); BeckhoffIoSubscribeUpdateVariable( TX_STO_MON_Restart); BeckhoffIoSubscribeUpdateVariable( TX_STO2_ESTOP_RESTART); BeckhoffIoSubscribeUpdateVariable( LDR_PUF_STO_MON_RESTART); BeckhoffIoSubscribeUpdateVariable( LDR_PUF_STO1_ESTOP_RESTART); BeckhoffIoSubscribeUpdateVariable( LDR_PUF_STO2_ESTOP_RESTART); BeckhoffIoSubscribeUpdateVariable( SRD_STO_ESTOP_RESTART); BeckhoffIoSubscribeUpdateVariable( PUMP_STO_ESTOP_RESTART); BeckhoffIoSubscribeUpdateVariable( FLUID_ESTOP_RESTART); BeckhoffIoSubscribeUpdateVariable( LOADER_DOOR_LOCK); BeckhoffIoSubscribeUpdateVariable( LOADER_DOOR_LOCKED); BeckhoffIoSubscribeUpdateVariable( LOADER_PANEL_REMOVED); BeckhoffIoSubscribeUpdateVariable( LOWER_LOADER_PANEL_REMOVED); BeckhoffIoSubscribeUpdateVariable( BUFFER_DOOR_LOCK); BeckhoffIoSubscribeUpdateVariable( BUFFER_DOOR_LOCKED); BeckhoffIoSubscribeUpdateVariable( BUFFER_PANEL_REMOVED); BeckhoffIoSubscribeUpdateVariable( PROCESS_DOOR_LOCK); BeckhoffIoSubscribeUpdateVariable( PROCESS_DOOR1_LOCKED); BeckhoffIoSubscribeUpdateVariable( PROCESS_DOOR2_LOCKED); BeckhoffIoSubscribeUpdateVariable( PROCESS_DOOR3_LOCKED); BeckhoffIoSubscribeUpdateVariable( PROCESS_DOOR4_LOCKED); BeckhoffIoSubscribeUpdateVariable( PROCESS_UPPER_PANELS_ON); BeckhoffIoSubscribeUpdateVariable( SRD_TOP_PANEL_REMOVED); BeckhoffIoSubscribeUpdateVariable( SRD_LOWER_PANEL_REMOVED); BeckhoffIoSubscribeUpdateVariable( PLUMBING_DOOR_CLOSED); BeckhoffIoSubscribeUpdateVariable( PROCESS_HALT_BUTTON1); BeckhoffIoSubscribeUpdateVariable( PROCESS_HALT_BUTTON2); BeckhoffIoSubscribeUpdateVariable( LOADER_HALT_BUTTON); BeckhoffIoSubscribeUpdateVariable( MODE_SELECTOR_SWITCH); BeckhoffIoSubscribeUpdateVariable( MODE_SIREN); BeckhoffIoSubscribeUpdateVariable( LOADER_ROTATION_SLS); BeckhoffIoSubscribeUpdateVariable( LOADER_SWINGA_SLS); BeckhoffIoSubscribeUpdateVariable( LOADER_SWINGB_SLS); BeckhoffIoSubscribeUpdateVariable( LOADER_TILTA_SLS); BeckhoffIoSubscribeUpdateVariable( LOADER_TILTB_SLS); BeckhoffIoSubscribeUpdateVariable( PUF1_VERTICAL_SLS); BeckhoffIoSubscribeUpdateVariable( PUF2_VERTICAL_SLS); BeckhoffIoSubscribeUpdateVariable( LOADER_GANTRY_SLS); BeckhoffIoSubscribeUpdateVariable( LOADER_ELEVATOR_SLS); BeckhoffIoSubscribeUpdateVariable( PROCESS_GANTRY_SLS); BeckhoffIoSubscribeUpdateVariable( PROCESS_ELEVATOR_SLS); BeckhoffIoSubscribeUpdateVariable( PUF_VERTICAL_DISABLE); BeckhoffIoSubscribeUpdateVariable( PUF1_FLIP_ROTATION_DISABLE); BeckhoffIoSubscribeUpdateVariable( PUF2_FLIP_ROTATION_DISABLE); BeckhoffIoSubscribeUpdateVariable( LOADER_DISABLE); BeckhoffIoSubscribeUpdateVariable( TRANSPORTER_DISABLE); BeckhoffIoSubscribeUpdateVariable( SRD_ARM_DISABLE); BeckhoffIoSubscribeUpdateVariable( SRD_ROTATION_DISABLE); BeckhoffIoSubscribeUpdateVariable( TRANSPORTER_SAFE_SLS); BeckhoffIoSubscribeUpdateVariable( LOADER_SAFE_SLS); BeckhoffIoSubscribeUpdateVariable( PUF_VERTICAL_SAFE_SLS); BeckhoffIoSubscribeUpdateVariable( LOADER_SAFE_STO); BeckhoffIoSubscribeUpdateVariable( PUF_VERTICAL_SAFE_STO); BeckhoffIoSubscribeUpdateVariable( PUF1_FLIP_ROTATION_SAFE_STO); BeckhoffIoSubscribeUpdateVariable( PUF2_FLIP_ROTATION_SAFE_STO); BeckhoffIoSubscribeUpdateVariable( TRANSPORTER_SAFE_STO); BeckhoffIoSubscribeUpdateVariable( SRD_ARM_SAFE_STO); BeckhoffIoSubscribeUpdateVariable( SRD_ROTATION_SAFE_STO); BeckhoffIoSubscribeUpdateVariable( PUMP_EDM); BeckhoffIoSubscribeUpdateVariable( RESERVIOR_HIGH_LEVEL); BeckhoffIoSubscribeUpdateVariable(FLUID_ENABLE_EDM); BeckhoffIoSubscribeUpdateVariable(SRD_ARM_RESET); } /// /// 订阅IO变量 /// /// private void BeckhoffIoSubscribeUpdateVariable(string variable) { _variableInitializeDic[variable] = false; IOModuleManager.Instance.SubscribeModuleVariable(Module,variable, UpdateVariableValue); } /// /// 更新变量数值 /// /// /// private void UpdateVariableValue(string variable, object value) { if (!SafetyData.IsDataInitialized) { SafetyData.IsDataInitialized = true; } PropertyInfo property = SafetyData.GetType().GetProperty(variable); if (property != null) { property.SetValue(SafetyData, value); } if (_variableInitializeDic.ContainsKey(variable) && !_variableInitializeDic[variable]) { _variableInitializeDic[variable] = true; } if(variable.EndsWith("Sls")) { SlsChangedSpeed(variable,(bool)value); } CheckIsDataAbonrmal(variable, value); } #region 监控指示灯是否异常 方法 /// /// 监控指示灯是否异常,是则打印log /// /// /// private void CheckIsDataAbonrmal(string variable,object value) { if (variable == "ReservoirHighLevel" && (bool)value == true) { LOG.WriteLog(eEvent.ERR_SAFETY, Module, "ReservoirHigh Level Error"); } else if (variable == "MainCommErr" && (bool)value == true) { LOG.WriteLog(eEvent.ERR_SAFETY, Module, "MainCommErr Error"); } else if (variable == "LoaderPufCommErr" && (bool)value == true) { LOG.WriteLog(eEvent.ERR_SAFETY, Module, "LoaderPufCommErr Error"); } else if (variable == "SrdCommErr" && (bool)value == true) { LOG.WriteLog(eEvent.ERR_SAFETY, Module, "SrdCommErr Error"); } else if (variable == "TransportCommErr" && (bool)value == true) { LOG.WriteLog(eEvent.ERR_SAFETY, Module, "TransportCommErr Error"); } else if (variable == "MainFunctionBlockErr" && (bool)value == true) { LOG.WriteLog(eEvent.ERR_SAFETY, Module, "MainFunctionBlockErr Error"); } else if (variable == "LoaderPufFunctionBlockErr" && (bool)value == true) { LOG.WriteLog(eEvent.ERR_SAFETY, Module, "LoaderPufFunctionBlockErr Error"); } else if (variable == "SrdFunctionBlockErr" && (bool)value == true) { LOG.WriteLog(eEvent.ERR_SAFETY, Module, "SrdFunctionBlockErr Error"); } else if (variable == "TransporterFunctionBlockErr" && (bool)value == true) { LOG.WriteLog(eEvent.ERR_SAFETY, Module, "TransporterFunctionBlockErr Error"); } else if (variable == "ProcessHaltButton1" && (bool)value == true) { LOG.WriteLog(eEvent.ERR_SAFETY, Module, "ProcessHaltButton1 Activate"); } else if (variable == "ProcessHaltButton2" && (bool)value == true) { LOG.WriteLog(eEvent.ERR_SAFETY, Module, "ProcessHaltButton2 Activate"); } else if (variable == "LoaderHaltButton" && (bool)value == true) { LOG.WriteLog(eEvent.ERR_SAFETY, Module, "LoaderHaltButton Activate"); } else if (variable == "LoaderPanelRemoved" && (bool)value == true) { LOG.WriteLog(eEvent.ERR_SAFETY, Module, "LoaderPanelRemoved Activate"); } else if (variable == "BufferPanelRemoved" && (bool)value == true) { LOG.WriteLog(eEvent.ERR_SAFETY, Module, "BufferPanelRemoved Activate"); } else if (variable == "SrdTopPanelRemoved" && (bool)value == true) { LOG.WriteLog(eEvent.ERR_SAFETY, Module, "SrdTopPanelRemoved Activate"); } else if (variable == "SrdLowerPanelRemoved" && (bool)value == true) { LOG.WriteLog(eEvent.ERR_SAFETY, Module, "SrdLowerPanelRemoved Activate"); } else if (variable == "PlumbingDoorClosed" && (bool)value == false) //信号是反的 { LOG.WriteLog(eEvent.ERR_SAFETY, Module, "PlumbingDoorClosed Activate"); } else if (variable == "ProcessUpperPanelsOn" && (bool)value == false) //信号是反的 { LOG.WriteLog(eEvent.ERR_SAFETY, Module, "ProcessUpperPanelsOn Activate"); } else if (variable == "PumpEdm" && (bool)value == false) //信号是反的 { LOG.WriteLog(eEvent.ERR_SAFETY, Module, "PumpEdm Activate"); } } #endregion #region SLS /// /// SLS更改速度 /// /// /// private void SlsChangedSpeed(string variable,bool sls) { int slsSpeed = SC.GetValue("Twincat.SlsSpeed"); if(sls) { ModuleChangeSpeed(variable, slsSpeed); } else { ModuleChangeSpeed(variable, 100); } } /// /// 模块更改速度 /// /// /// private void ModuleChangeSpeed(string variable,int percent) { switch(variable) { case PUF1_VERTICAL_SLS: UpdateAxisSpeed(DEVICE.GetDevice($"{ModuleName.PUF1}.Vertical"), percent); break; case PUF2_VERTICAL_SLS: UpdateAxisSpeed(DEVICE.GetDevice($"{ModuleName.PUF2}.Vertical"), percent); break; case LOADER_TILTA_SLS: UpdateAxisSpeed(DEVICE.GetDevice($"{ModuleName.Loader1}.TiltA"), percent); break; case LOADER_TILTB_SLS: UpdateAxisSpeed(DEVICE.GetDevice($"{ModuleName.Loader1}.TiltB"), percent); break; case LOADER_SWINGA_SLS: UpdateAxisSpeed(DEVICE.GetDevice($"{ModuleName.Loader1}.ShuttleA"), percent); break; case LOADER_SWINGB_SLS: UpdateAxisSpeed(DEVICE.GetDevice($"{ModuleName.Loader1}.ShuttleB"), percent); break; case LOADER_ROTATION_SLS: UpdateAxisSpeed(DEVICE.GetDevice($"{ModuleName.Loader1}.Rotation"), percent); break; case LOADER_GANTRY_SLS: UpdateAxisSpeed(DEVICE.GetDevice($"{ModuleName.Transporter2}.Gantry"), percent); break; case LOADER_ELEVATOR_SLS: UpdateAxisSpeed(DEVICE.GetDevice($"{ModuleName.Transporter2}.Elevator"), percent); break; case PROCESS_GANTRY_SLS: UpdateAxisSpeed(DEVICE.GetDevice($"{ModuleName.Transporter1}.Gantry"), percent); break; case PROCESS_ELEVATOR_SLS: UpdateAxisSpeed(DEVICE.GetDevice($"{ModuleName.Transporter1}.Elevator"), percent); break; } } /// /// 更改Axis速度百分比 /// /// /// private void UpdateAxisSpeed(JetAxisBase jetAxisBase,int percent) { jetAxisBase.ChangePercentSpeedAceleration(percent); } #endregion #region Reset /// /// Reset Operation /// /// private bool ResetOperation() { _status = _resetRoutine.Start(); return _status == RState.Running; } #endregion #region All On /// /// All On Operation /// /// private bool AllOnOperation() { _allOnStatus = _allOnRoutine.Start(); return _allOnStatus == RState.Running; } #endregion #region Lock Door /// /// Lock Process Door /// /// public bool LockProcessDoor() { string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{PROCESS_DOOR_LOCK}"); return IOModuleManager.Instance.WriteIoValue(ioName, true); } /// /// Unlock Process Door /// /// public bool UnlockProcessDoor() { string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{PROCESS_DOOR_LOCK}"); return IOModuleManager.Instance.WriteIoValue(ioName, false); } /// /// Lock Buffer Door /// /// public bool LockBufferDoor() { string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{BUFFER_DOOR_LOCK}"); return IOModuleManager.Instance.WriteIoValue(ioName, true); } /// /// Unlock Buffer Door /// /// public bool UnlockBufferDoor() { string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{BUFFER_DOOR_LOCK}"); return IOModuleManager.Instance.WriteIoValue(ioName, false); } /// /// Lock Loader Door /// /// public bool LockLoaderDoor() { string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{LOADER_DOOR_LOCK}"); return IOModuleManager.Instance.WriteIoValue(ioName, true); } /// /// Unlock Loader Door /// /// public bool UnlockLoaderDoor() { string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{LOADER_DOOR_LOCK}"); return IOModuleManager.Instance.WriteIoValue(ioName, false); } #endregion #region Mode Siren /// /// Mode Siren On /// /// public bool ModeSirenOn() { if (!SafetyData.ModeSiren) { string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{MODE_SIREN}"); return IOModuleManager.Instance.WriteIoValue(ioName, true); } return true; } /// /// Mode Siren Off /// /// public bool ModeSirenOff() { if (SafetyData.ModeSiren) { string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{MODE_SIREN}"); return IOModuleManager.Instance.WriteIoValue(ioName, false); } return true; } #endregion public void Monitor() { } public void Reset() { } public void Terminate() { _periodicJob.Stop(false); } } }