using Aitex.Core.RT.Device; using Aitex.Core.RT.Log; using Aitex.Core.RT.Routine; using CyberX8_Core; using CyberX8_RT.Devices.Reservoir; using MECF.Framework.Common.Beckhoff.ModuleIO; using MECF.Framework.Common.Equipment; using MECF.Framework.Common.IOCore; using MECF.Framework.Common.Persistent.Reservoirs; using MECF.Framework.Common.Routine; using MECF.Framework.Common.TwinCat; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Windows; namespace CyberX8_RT.Devices.Dose { public class CrossDoseResetRoutine : RoutineBase, IRoutine { private enum ResetStep { Reset_True, Reset_Wait, Reset_False, End } private enum POSStatus { Busy, InTarget, Warning, Error } #region 内部变量 /// /// 模块名称 /// private string _moduleName; /// /// 超时时间 /// private int _timeOut = 2000; /// /// CompactMembranReservoirDevice /// private CompactMembranReservoirDevice _cmReservoirDevice; /// /// ReservoirsPersistentValue /// private ReservoirsPersistentValue _persistentValue; #endregion #region 属性 public RState CurrentState { get { return Runner.Status; } } #endregion /// /// 构造函数 /// /// public CrossDoseResetRoutine(string module) : base(module) { _moduleName = module; } /// /// Monitor /// /// public RState Monitor() { Runner.Run(ResetStep.Reset_True, SetTrue, _delay_1ms) .Wait(ResetStep.Reset_Wait, WaitCompleteEndStatus, _timeOut) .Run(ResetStep.Reset_False, SetFalse, _delay_1ms) .End(ResetStep.End, ClearData, _delay_1ms); return Runner.Status; } #region Operation /// /// Reset置1 /// /// private bool SetTrue() { //Reset = 1 string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{_moduleName}.TransferPumpReset"); bool result = IOModuleManager.Instance.WriteIoValue(ioName, true); if (!result) { return false; } return true; } /// /// Wait Reset Done End /// /// private bool WaitCompleteEndStatus() { ushort status = (ushort)_cmReservoirDevice.ReservoirData.TransferPumpPOSStatus; if (!CheckPOSStatus(status, POSStatus.Error)) { return true; } return false; } /// /// Reset置0 /// /// private bool SetFalse() { //Reset = 0 string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{_moduleName}.TransferPumpReset"); bool result = IOModuleManager.Instance.WriteIoValue(ioName, false); if (!result) { return false; } _cmReservoirDevice.InitializeCrossDose(true); return true; } /// /// 清除数据 /// /// private bool ClearData() { _persistentValue.AutoCrossDoseStartTime = DateTime.MinValue; _persistentValue.AutoCrossDoseStartAmpHour = 0; _cmReservoirDevice.ReservoirData.RemainingCrossDoseVolume = 0; ReservoirsPersistentManager.Instance.UpdatePersistentValue(_moduleName); return true; } #endregion /// /// Start /// /// /// public RState Start(params object[] objs) { _cmReservoirDevice = DEVICE.GetDevice($"{_moduleName}"); if (_cmReservoirDevice == null) { LOG.WriteLog(eEvent.ERR_RESERVOIR, _moduleName, "Compact Membran Reservoir Device is not exist"); return RState.Failed; } _persistentValue = ReservoirsPersistentManager.Instance.GetReservoirsPersistentValue(_moduleName); if (_persistentValue == null) { LOG.WriteLog(eEvent.ERR_RESERVOIR, _moduleName, "Reservoir Persistent Value Object is not exist"); return RState.Failed; } return Runner.Start(Module, "Reset Cross Dose"); } /// /// Abort /// public void Abort() { Runner.Stop($"Stop Reset"); } /// /// POS状态判断 /// /// /// /// private bool CheckPOSStatus(ushort status, POSStatus statusName) { bool result = false; switch (statusName) { case POSStatus.Busy: byte bit0 = (byte)(status & 0b0001); result = (bit0 == 1) ? true : false; break; case POSStatus.InTarget: byte bit1 = (byte)((status & 0b0010) >> 1); result = (bit1 == 1) ? true : false; break; case POSStatus.Warning: byte bit2 = (byte)((status & 0b0100) >> 2); result = (bit2 == 1) ? true : false; break; case POSStatus.Error: byte bit3 = (byte)((status & 0b1000) >> 3); result = (bit3 == 1) ? true : false; break; default: break; } return result; } } }