using SHJX.Service.Control.Common.Assets; namespace SHJX.Service.Control.Execute { public class LiquidPipeSwitchOxalate { #region Fields private string _liquidName; private static readonly object obj_locker = new(); private static readonly ILogger logger = LogFactory.BuildLogger(typeof(LiquidPipeSwitchOxalate)); #endregion private LiquidPipeSwitchOxalate() { } public static LiquidPipeSwitchOxalate StartNew { get { lock (obj_locker) { return new(); } } } /// /// 是否原点 /// public bool IsArriveEndPointOxalate { get { lock (obj_locker) { char[] readRes = _liquidName.MotorRead(); if (readRes is null or { Length: 0 }) { return false; } bool arriveEndPoint = readRes[2].Equals('0'); return arriveEndPoint; } } } /// /// 设置液体名称 /// /// /// public LiquidPipeSwitchOxalate SetLiquidName(string liquidName) { _liquidName = liquidName; return this; } /// /// 检查是否在原点 /// /// public LiquidPipeSwitchOxalate CheckWhetherArriveEndPointOxalate(LiquidSwitchPattern pattern = LiquidSwitchPattern.Out) { bool arriveEndPoint = IsArriveEndPointOxalate; if (!arriveEndPoint) { LiquidMotorGoBackOxalate(pattern);//如果不在原点,则切换为出液模式 } return this; } public bool LiquidMotorGoBackOxalate(LiquidSwitchPattern pattern) { try { if (pattern == LiquidSwitchPattern.In) { $"{_liquidName}Switch1".RegisterOpen(); Thread.Sleep(200); } else { $"{_liquidName}Switch2".RegisterOpen(); Thread.Sleep(200); } var res = _liquidName.MotorGoBack(); int register = ConfigInstance.GetPortRegister(_liquidName); int retryCount = 0; for (; ; ) { Thread.Sleep(5 * 100);//如果返回成功,则休眠两秒再次读取 char[] judgeRes = _liquidName.MotorRead(); if (judgeRes is null or { Length: 0}) { return false; } bool reread = false; reread = judgeRes[register -1].Equals('0'); if (reread) { break; } retryCount++; logger.LogInformation($"下发返回原点成功后,再次读取原点信号为false,重发返回原点指令第{retryCount}次"); if (pattern == LiquidSwitchPattern.In) { $"{_liquidName}Switch1".RegisterOpen(); Thread.Sleep(200); } else { $"{_liquidName}Switch2".RegisterOpen(); Thread.Sleep(200); } res = _liquidName.MotorGoBack(); } if (pattern == LiquidSwitchPattern.In) { $"{_liquidName}Switch1".RegisterClose(); Thread.Sleep(200); } else { $"{_liquidName}Switch2".RegisterClose(); Thread.Sleep(200); } return res; } catch (Exception ex) { logger.LogInformation($"Error:液体电机返回原点异常。Exception:{ex}"); return false; } } /// /// 执行液体操作 /// /// /// public bool ExecuteOxalate(object value) { bool res = ExecuteOxalate(LiquidSwitchPattern.In, value); return res && ExecuteOxalate(LiquidSwitchPattern.Out, value); } public bool ExecuteOxalate(LiquidSwitchPattern pattern, object value) { int writeData = pattern switch { LiquidSwitchPattern.In => -Math.Abs(Convert.ToInt32(value)), LiquidSwitchPattern.Out => Math.Abs(Convert.ToInt32(value)), _ => throw new ArgumentNullException(nameof(pattern)), }; bool res = false; if (pattern == LiquidSwitchPattern.In) { $"{_liquidName}Switch1".RegisterOpen(); Thread.Sleep(200); res = _liquidName.LiquidMotorMove(writeData); logger.LogInformation(_liquidName +"*****"+ writeData.ToString() + "*****移动/吸液命令*****草酸钠"); } else { $"{_liquidName}Switch2".RegisterOpen(); Thread.Sleep(200); res = _liquidName.MotorGoBack(); logger.LogInformation(_liquidName + "*****" + writeData.ToString() + "*****回原点/出液命令*****草酸钠"); } if (pattern == LiquidSwitchPattern.In) { $"{_liquidName}Switch1".RegisterClose(); } else { $"{_liquidName}Switch2".RegisterClose(); } return res; } } }