using Aitex.Core.RT.Device; using Aitex.Core.RT.Fsm; using Aitex.Core.RT.Log; using Aitex.Core.Utilities; using CyberX8_Core; using CyberX8_RT.Devices.LinMot; using CyberX8_RT.Devices.Prewet; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Markup; namespace CyberX8_RT.Modules.Prewet { public class PrewetKeepWetStateMachine : Entity, IEntity { #region 内部变量 /// /// 模块名称 /// private string _module; /// /// prewet设备 /// private PrewetDevice _prewetDevice; /// /// linmot axis /// private LinMotAxis _linMotAxis; #endregion #region 属性 /// /// 状态 /// public string State { get { return ((PrewetKeepWetState)fsm.State).ToString(); } } #endregion /// /// 构造函数 /// /// public PrewetKeepWetStateMachine(string module,LinMotAxis linMotAxis) { _module = module; _prewetDevice = DEVICE.GetDevice(module); _linMotAxis = linMotAxis; fsm = new StateMachine($"{_module}_KeepWetStateMachine", (int)PrewetKeepWetState.Idle, 20); fsm.EnableRepeatedMsg(true); AnyStateTransition(PrewetKeepWetMsg.ReturnIdle, NullFunc, PrewetKeepWetState.Idle); AnyStateTransition(PrewetKeepWetMsg.Error, EnterError, PrewetKeepWetState.Error); Transition(PrewetKeepWetState.Error, PrewetKeepWetMsg.KeepWetStart, NullFunc, PrewetKeepWetState.Idle_KeepwetPrepare); Transition(PrewetKeepWetState.Idle, PrewetKeepWetMsg.KeepWetStart, NullFunc, PrewetKeepWetState.Idle_KeepwetPrepare); Transition(PrewetKeepWetState.Idle_KeepwetPrepare, FSM_MSG.TIMER, ResetLinmot, CheckResetLinmot, PrewetKeepWetState.Idle_KeepWetStart); Transition(PrewetKeepWetState.Idle_KeepWetStart, FSM_MSG.TIMER, ExecuteWetScan, WaitExecuteWetScan, PrewetKeepWetState.Idle_KeepWetScan); Transition(PrewetKeepWetState.Idle_KeepWetScan, FSM_MSG.TIMER, KeepWetComplete, PrewetKeepWetState.Idle_KeepWetPause); Transition(PrewetKeepWetState.Idle_KeepWetPause, FSM_MSG.TIMER, NullFunc, PrewetKeepWetState.Idle); EnumLoop.ForEach((item) => { fsm.MapState((int)item, item.ToString()); }); EnumLoop.ForEach((item) => { fsm.MapMessage((int)item, item.ToString()); }); } /// /// 初始化 /// protected override bool Init() { fsm.Init((int)PrewetKeepWetState.Idle, 20); return true; } /// /// 进入Error状态 /// /// /// private bool EnterError(object param) { if(_linMotAxis.Status==RState.Running) { _linMotAxis.AbortCurrentRoutine(); } if(_prewetDevice.Status==RState.Running) { _prewetDevice.AbortCurrentRoutine(); } return true; } #region process /// /// Reset Linmot /// /// /// private bool ResetLinmot(object param) { bool result = _linMotAxis.ResetOperation("", false); if (!result) { PostMsg(PrewetKeepWetMsg.Error); return false; } return true; } /// /// 检验Reset Linmot状态 /// /// /// private bool CheckResetLinmot(object param) { if (_linMotAxis.Status == RState.End) { return true; } else if(_linMotAxis.Status==RState.Failed) { PostMsg(PrewetKeepWetMsg.Error); return false; } return false; } /// /// execute Keep Wet Scan /// /// /// private bool ExecuteWetScan(object param) { bool pumpValveResult = _prewetDevice.PumpValveOpen(); if (!pumpValveResult) { LOG.WriteLog(eEvent.ERR_PREWET, _module, "pump valve open error"); PostMsg(PrewetKeepWetMsg.Error); return false; } //bool pumpEnableResult = _prewetDevice.PumpEnableOperation("", null); bool pumpEnableResult = _prewetDevice.PumpEnable(); if (!pumpEnableResult) { LOG.WriteLog(eEvent.ERR_PREWET, _module, "pump enable error"); PostMsg(PrewetKeepWetMsg.Error); return false; } bool result = _linMotAxis.StartPosition("", new object[] { 1 }); if (!result) { PostMsg(PrewetKeepWetMsg.Error); return false; } return true; } /// /// Wait execute WetScan /// /// /// private bool WaitExecuteWetScan(object param) { if (_prewetDevice.PrewetPumpData.PumpFlowData.IsWarning) { LOG.WriteLog(eEvent.WARN_PREWET, _module, "pump flow status is in warning"); } if (_prewetDevice.PrewetPumpData.PumpFlowData.IsError) { LOG.WriteLog(eEvent.ERR_PREWET, _module, "pump flow status is in error"); PostMsg(PrewetKeepWetMsg.Error); return false; } if (_prewetDevice.PrewetPumpData.PumpPressureData.IsWarning) { LOG.WriteLog(eEvent.WARN_PREWET, _module, "pump pressure status is in warning"); } if (_prewetDevice.PrewetPumpData.PumpPressureData.IsError) { LOG.WriteLog(eEvent.ERR_PREWET, _module, "pump pressure status is in error"); PostMsg(PrewetKeepWetMsg.Error); return false; } //linmot完成一次scan if ( _linMotAxis.Status == RState.End) { return true; } return false; } /// /// Keep wet scan完成 /// /// /// private bool KeepWetComplete(object param) { bool result = _prewetDevice.PumpDisableOperation("pump disable",null); if (!result) { LOG.WriteLog(eEvent.ERR_PREWET, _module, "pump disable error"); PostMsg(PrewetKeepWetMsg.Error); return false; } result = _linMotAxis.SwitchOff(); if (!result) { LOG.WriteLog(eEvent.ERR_PREWET, _module, "linmot disable error"); PostMsg(PrewetKeepWetMsg.Error); return false; } return true; } #endregion public bool Check(int msg, out string reason, params object[] args) { reason = ""; return true; } public enum PrewetKeepWetState { Error, Idle, Idle_KeepwetPrepare, Idle_KeepWetStart, Idle_KeepWetScan, Idle_KeepWetPause } public enum PrewetKeepWetMsg { Error, KeepWetStart, ReturnIdle } } }