using Aitex.Core.RT.Device;
using Aitex.Core.RT.Log;
using Aitex.Core.RT.RecipeCenter;
using Aitex.Core.RT.Routine;
using Aitex.Core.RT.SCCore;
using Aitex.Core.Util;
using CyberX8_Core;
using CyberX8_RT.Devices.LinMot;
using CyberX8_RT.Devices.Prewet;
using MECF.Framework.Common.Alarm;
using MECF.Framework.Common.CommonData;
using MECF.Framework.Common.CommonData.Prewet;
using MECF.Framework.Common.Persistent.Dryer;
using MECF.Framework.Common.Persistent.Prewet;
using MECF.Framework.Common.Persistent.Temperature;
using MECF.Framework.Common.RecipeCenter;
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 PrewetProcessRoutine : RoutineBase, IRoutine
{
private enum ProcessStep
{
Process_Start,
Process_StartScanning,
Process_WaitPumpOnEnd,
Process_WaitFirstScanComplete,
Process_WaitScanComplete,
Process_Complete,
End
}
#region 内部变量
///
/// prewet设备
///
private PrewetDevice _prewetDevice;
///
/// linmot axis
///
private LinMotAxis _linMotAxis;
///
/// Prewet recipe
///
private PwtRecipe _recipe;
#endregion
///
/// 构造函数
///
///
public PrewetProcessRoutine(string module, LinMotAxis linMotAxis) : base(module)
{
this._linMotAxis = linMotAxis;
}
///
/// 中止
///
public void Abort()
{
_linMotAxis.StopOperation("", null);
_prewetDevice.PumpDisableOperation("pump disable", null);
Runner.Stop("Manual Abort");
}
///
/// 监控
///
///
public RState Monitor()
{
Runner.Run(ProcessStep.Process_Start, NullFun, _delay_1ms)
.Run(ProcessStep.Process_StartScanning, ProcessStartScan, _delay_1ms)
.WaitWithStopCondition(ProcessStep.Process_WaitPumpOnEnd, WaitProcessEndStatus, CheckProcessFailedStatus, _delay_60s)
.Run(ProcessStep.Process_WaitFirstScanComplete, StartScan, _delay_1ms)
.WaitWithStopCondition(ProcessStep.Process_WaitScanComplete, WaitScanComplete, CheckScanStopEnd)
.Run(ProcessStep.Process_Complete, ProcessComplete, CheckPumpValveClose,_delay_3s)
.End(ProcessStep.End, NullFun, _delay_1ms);
return Runner.Status;
}
///
/// Process Start Scan
///
///
private bool ProcessStartScan()
{
bool result = _linMotAxis.ResetOperation("", false);
if (!result)
{
LOG.WriteLog(eEvent.ERR_PREWET, Module, "reset linmot error");
return false;
}
_prewetDevice.PrewetPumpData.PumpSpeedAuto = true;
//更新Pump status状态
string statusContent = _prewetDevice.PrewetPumpData.PumpStatus ? "On" : "Off";
_prewetDevice.PrewetPumpData.PumpModel = "Auto";
_prewetDevice.PrewetPumpData.PumpStatusContent = $"{_prewetDevice.PrewetPumpData.PumpModel}: {statusContent}";
result = _prewetDevice.PumpSpeed();
if (!result)
{
LOG.WriteLog(eEvent.ERR_PREWET, Module, "pump speed error");
return false;
}
bool pumpEnableResult = _prewetDevice.PumpEnableOperation("", null);
if (!pumpEnableResult)
{
LOG.WriteLog(eEvent.ERR_PREWET, Module, "pump enable error");
return false;
}
return true;
}
///
/// 等待结束状态
///
///
private bool WaitProcessEndStatus()
{
if (_prewetDevice.Status == RState.End && _linMotAxis.Status == RState.End)
{
return true;
}
return false;
}
///
/// 检验错误状态
///
///
private bool CheckProcessFailedStatus()
{
if (_prewetDevice.Status == RState.Failed)
{
LOG.WriteLog(eEvent.ERR_PREWET, Module, "prewet device status is error");
return true;
}
if (_linMotAxis.Status == RState.Failed)
{
LOG.WriteLog(eEvent.ERR_PREWET, Module, "linmot status is error");
return true;
}
return false;
}
///
/// 自动调速
///
private bool StartAdjustSpeed()
{
_prewetDevice.IsStartAutoSpeed = true;
return true;
}
///
/// 开始Scan
///
///
///
private bool StartScan()
{
if (!_linMotAxis.IsHomed)
{
LOG.WriteLog(eEvent.ERR_PREWET, Module, "limot is not ready");
return false;
}
if (!_prewetDevice.PrewetPumpData.PumpStatus)
{
LOG.WriteLog(eEvent.ERR_PREWET, Module, "pump status if off");
return false;
}
bool result = _linMotAxis.StartPosition("", new object[] { _recipe.NumberOfScans });
if (!result)
{
_prewetDevice.PumpDisableOperation("pump disable", null);
LOG.WriteLog(eEvent.ERR_PREWET, Module, "linmot start scan error");
return false;
}
return result;
}
///
/// 等待Scan结束
///
///
///
private bool WaitScanComplete()
{
//linmot完成一次scan
if (_linMotAxis.Status == RState.End)
{
return true;
}
return false;
}
///
/// 检验Prewet停止状态
///
///
private bool CheckScanStopEnd()
{
if (_linMotAxis.Status == RState.Failed||_linMotAxis.Status==RState.Timeout)
{
_prewetDevice.PumpDisable();
return true;
}
if (_prewetDevice.PrewetPumpData.PumpPressureData.IsError)
{
_linMotAxis.StopOperation("",null);
_prewetDevice.PumpDisableOperation("pump disable", null);
LOG.WriteLog(eEvent.ERR_PREWET, Module, $"pump pressure status {_prewetDevice.PrewetPumpData.PumpPressureData.Value} is in error");
return true;
}
if (_prewetDevice.PrewetPumpData.PumpFlowData.IsWarning)
{
string str = $"pump flow status {_prewetDevice.PrewetPumpData.PumpFlowData.Value} is in warning";
if (AlarmListManager.Instance.AddWarn(Module, "PumpFlow", str))
{
LOG.WriteLog(eEvent.WARN_PREWET, Module, str);
}
}
if (_prewetDevice.PrewetPumpData.PumpFlowData.IsError)
{
LOG.WriteLog(eEvent.ERR_PREWET, Module, $"pump flow status {_prewetDevice.PrewetPumpData.PumpFlowData.Value} is in error");
_linMotAxis.StopOperation("", null);
_prewetDevice.PumpDisableOperation("pump disable", null);
return true;
}
if (_prewetDevice.PrewetPumpData.PumpPressureData.IsWarning)
{
string str = $"pump pressure status is { _prewetDevice.PrewetPumpData.PumpPressureData.Value } in warning";
if (AlarmListManager.Instance.AddWarn(Module, "Pump Pressure", str))
{
LOG.WriteLog(eEvent.WARN_PREWET, Module, str);
}
}
return false;
}
///
/// Process scan完成
///
///
///
private bool ProcessComplete()
{
//bool result = _prewetDevice.PumpValveClose();
//if (!result)
//{
// LOG.WriteLog(eEvent.ERR_PREWET, Module, "pump valve close");
// return false;
//}
//result = _prewetDevice.PumpDisable();
//if (!result)
//{
// LOG.WriteLog(eEvent.ERR_PREWET, Module, "pump enable close");
// return false;
//}
bool result = _prewetDevice.PumpDisableOperation("pump disable",null);
return result;
}
private bool CheckPumpValveClose()
{
bool result = !_prewetDevice.PrewetPumpData.PumpValve;
return result;
}
///
/// 启动
///
///
///
public RState Start(params object[] objs)
{
//清除lotTrack数据
_prewetDevice = DEVICE.GetDevice(Module);
_recipe = objs[0] as PwtRecipe;
if (_recipe == null)
{
LOG.WriteLog(eEvent.ERR_PREWET, Module, "recipe is null");
return RState.Failed;
}
return Runner.Start(Module, "Start Process Recipe");
}
}
}