using Aitex.Core.RT.Device;
using Aitex.Core.RT.Log;
using Aitex.Core.RT.Routine;
using CyberX8_Core;
using CyberX8_RT.Devices.LinMot;
using CyberX8_RT.Devices.Prewet;
using MECF.Framework.Common.Alarm;
using MECF.Framework.Common.Routine;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using static CyberX8_RT.Modules.Prewet.PrewetKeepWetStateMachine;
namespace CyberX8_RT.Modules.Prewet
{
public class PrewetKeepWetRoutine : RoutineBase, IRoutine
{
private enum KeepwetStep
{
Idle_KeepwetPrepare,
Idle_KeepwetPrepareWait,
Idle_KeepWetStart,
Idle_KeepWetScan,
Idle_KeepWetPause,
End
}
#region 内部变量
///
/// prewet设备
///
private PrewetDevice _prewetDevice;
///
/// linmot axis
///
private LinMotAxis _linMotAxis;
#endregion
///
/// 构造函数
///
///
public PrewetKeepWetRoutine(string module,LinMotAxis linMotAxis) : base(module)
{
_linMotAxis= linMotAxis;
}
///
/// 中止
///
public void Abort()
{
_linMotAxis.StopOperation("", null);
if (_prewetDevice != null)
{
_prewetDevice.PumpDisableOperation("prewetPump Disable",null);
}
Runner.Stop("Manual Abort");
}
///
/// 监控
///
///
public RState Monitor()
{
Runner.Run(KeepwetStep.Idle_KeepwetPrepare, ResetLinmot, _delay_1ms)
.WaitWithStopCondition(KeepwetStep.Idle_KeepwetPrepareWait, CheckResetLinmotEndStatus, CheckResetLinmotStopStatus)
.Run(KeepwetStep.Idle_KeepWetStart, ExecuteWetScan, _delay_1ms)
.WaitWithStopCondition(KeepwetStep.Idle_KeepWetScan,CheckLinmotScanEndStatus,CheckLinmotScanStopStatus)
.Run(KeepwetStep.Idle_KeepWetPause, KeepWetComplete, _delay_1ms)
.End(KeepwetStep.End, NullFun, _delay_1ms);
return Runner.Status;
}
///
/// Reset Linmot
///
///
///
private bool ResetLinmot()
{
bool result = _linMotAxis.ResetOperation("", false);
if (!result)
{
return false;
}
return true;
}
///
/// 检验Reset Linmot状态
///
///
///
private bool CheckResetLinmotEndStatus()
{
return _linMotAxis.Status == RState.End;
}
///
/// 检验Reset Linmot停止状态
///
///
private bool CheckResetLinmotStopStatus()
{
return _linMotAxis.Status == RState.Failed || _linMotAxis.Status == RState.Timeout;
}
///
/// execute Keep Wet Scan
///
///
///
private bool ExecuteWetScan()
{
bool pumpValveResult = _prewetDevice.PumpValveOpen();
if (!pumpValveResult)
{
LOG.WriteLog(eEvent.ERR_PREWET, Module, "pump valve open error");
return false;
}
//bool pumpEnableResult = _prewetDevice.PumpEnableOperation("", null);
bool pumpEnableResult = _prewetDevice.PumpEnable();
if (!pumpEnableResult)
{
LOG.WriteLog(eEvent.ERR_PREWET, Module, "pump enable error");
return false;
}
bool result = _linMotAxis.StartPosition("", new object[] { 1 });
if (!result)
{
return false;
}
return true;
}
///
/// 检验Linomot扫描结束状态
///
///
private bool CheckLinmotScanEndStatus()
{
return _linMotAxis.Status == RState.End;
}
///
/// 检验Linmot Scan停止状态
///
///
private bool CheckLinmotScanStopStatus()
{
bool result=_linMotAxis.Status==RState.Failed||_linMotAxis.Status==RState.Timeout;
if(!result)
{
string strFlow = $"pump flow status is {_prewetDevice.PrewetPumpData.PumpFlowData.Value} in warning";
if (AlarmListManager.Instance.AddWarn(Module, "Pump Flow", strFlow))
{
LOG.WriteLog(eEvent.WARN_PREWET, Module, strFlow);
}
if (_prewetDevice.PrewetPumpData.PumpFlowData.IsError)
{
LOG.WriteLog(eEvent.ERR_PREWET, Module, "pump flow status is in error");
return true;
}
string strPressure = $"pump pressure status is {_prewetDevice.PrewetPumpData.PumpPressureData.Value} in warning";
if (AlarmListManager.Instance.AddWarn(Module, "Pump Pressure", strPressure))
{
LOG.WriteLog(eEvent.WARN_PREWET, Module, strPressure);
}
if (_prewetDevice.PrewetPumpData.PumpPressureData.IsError)
{
LOG.WriteLog(eEvent.ERR_PREWET, Module, "pump pressure status is in error");
return true;
}
return false;
}
else
{
return true;
}
}
///
/// Wait execute WetScan
///
///
///
private bool WaitExecuteWetScan(object param)
{
//linmot完成一次scan
if (_linMotAxis.Status == RState.End)
{
return true;
}
return false;
}
///
/// Keep wet scan完成
///
///
///
private bool KeepWetComplete()
{
bool result = _prewetDevice.PumpDisableOperation("pump disable",null);
if (!result)
{
LOG.WriteLog(eEvent.ERR_PREWET, Module, "pump disable error");
return false;
}
result = _linMotAxis.SwitchOff();
if (!result)
{
LOG.WriteLog(eEvent.ERR_PREWET, Module, "linmot disable error");
return false;
}
return true;
}
///
/// 启动
///
///
///
public RState Start(params object[] objs)
{
_prewetDevice = DEVICE.GetDevice(Module);
return Runner.Start(Module, "Start Keepwet");
}
}
}