| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217 |
- using SHJX.Service.Control.Common.Assets;
- namespace SHJX.Service.Control.Execute
- {
- public class LiquidPipeSwitchTitration1
- {
- #region Fields
- private string _liquidName;
- private static readonly object obj_locker = new();
- private static readonly ILogger logger = LogFactory.BuildLogger(typeof(LiquidPipeSwitch));
- #endregion
- private LiquidPipeSwitchTitration1() { }
- public static LiquidPipeSwitchTitration1 StartNew
- {
- get
- {
- lock (obj_locker)
- {
- return new();
- }
- }
- }
- /// <summary>
- /// 是否原点
- /// </summary>
- public bool IsArriveEndPoint
- {
- 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;
- }
- }
- }
-
- /// <summary>
- /// 设置液体名称
- /// </summary>
- /// <param name="liquidName"></param>
- /// <returns></returns>
- public LiquidPipeSwitchTitration1 SetLiquidName(string liquidName)
- {
- _liquidName = liquidName;
- return this;
- }
- /// <summary>
- /// 检查是否在原点
- /// </summary>
- /// <returns></returns>
- public LiquidPipeSwitchTitration1 CheckWhetherArriveEndPoint(LiquidSwitchPattern pattern = LiquidSwitchPattern.In)
- {
- bool arriveEndPoint = IsArriveEndPoint;
- if (!arriveEndPoint )
- {
- LiquidMotorGoBack(pattern);//如果不在原点,则切换为出液模式
- }
- return this;
- }
-
-
- /// <summary>
- /// 液体电机返回原点
- /// </summary>
- /// <param name="pattern"></param>
- /// <returns></returns>
- public bool LiquidMotorGoBack(LiquidSwitchPattern pattern)
- {
- SetPattern(pattern); //如果不在原点,则切换为出液模式
- var res = _liquidName.MotorGoBack();
- try
- {
- int register = ConfigInstance.GetPortRegister(_liquidName);
- int retryCount = 0;
- for (; ; )
- {
- Thread.Sleep(2 * 1000);//如果返回成功,则休眠两秒再次读取
- char[] judgeRes = _liquidName.MotorRead();
- if (judgeRes is null or not { Length: 8 })
- {
- return false;
- }
- bool reread = judgeRes[register - 1].Equals('0');
- if (reread)
- {
- break;
- }
- retryCount++;
- logger.LogInformation($"下发返回原点成功后,再次读取原点信号为false,重发返回原点指令第{retryCount}次");
- res = _liquidName.MotorGoBack();
- }
- return res;
- }
- catch (Exception ex)
- {
- logger.LogInformation($"Error:液体电机返回原点异常。Exception:{ex}");
- return false;
- }
- }
- /// <summary>
- /// 执行液体操作
- /// </summary>
- /// <param name="value"></param>
- /// <returns></returns>
- public bool Execute(object value)
- {
- bool res = Execute(LiquidSwitchPattern.In, value);
- return res && Execute(LiquidSwitchPattern.Out, value);
- }
- public bool Execute(LiquidSwitchPattern pattern, object value)
- {
- SetPattern(pattern);
- int writeData = pattern switch
- {
- LiquidSwitchPattern.In => -Math.Abs(Convert.ToInt32(value)),
- LiquidSwitchPattern.Out => Math.Abs(Convert.ToInt32(value)),
- _ => throw new ArgumentNullException(nameof(pattern)),
- };
- logger.LogInformation(_liquidName + "*****高锰酸钾1移动*****" + pattern.ToString() + writeData.ToString());
- return _liquidName.LiquidMotorMove(writeData);
- }
-
- /// <summary>
- /// 设置液体模式
- /// </summary>
- /// <returns></returns>
- public void SetPattern(LiquidSwitchPattern pattern)
- {
- char[] states = _liquidName.MotorRead();
- if (states is null or { Length: 0 })
- {
- throw new ArgumentException($"{pattern}无法读取数据!");
- }
- OptPipe(() =>
- {
- char[] readRes = _liquidName.MotorRead();
- if (readRes is null or { Length: 0 })
- {
- Thread.Sleep(1000);
- return false;
- }
- bool res = pattern switch
- {
- LiquidSwitchPattern.In => readRes[6].Equals('0'),
- LiquidSwitchPattern.Out => readRes[7].Equals('0'),
- _ => false,
- };
- return res;
- }, pattern.Equals(LiquidSwitchPattern.In) ? -1 : 1);
- }
- /// <summary>
- /// 选择管道(出 or 吸)
- /// </summary>
- /// <param name="func"></param>
- private void OptPipe(Func<bool> func, int orientation)
- {
- bool res = func.Invoke();
- if (res)
- {
- return;
- }
- Thread.Sleep(1000);
- OpenRegister();
- Thread.Sleep(1000);
- _liquidName.LiquidMotorMove(50 * orientation);
- Policy.HandleResult<bool>(arg => arg.Equals(false)).RetryForever(_ =>
- {
- _liquidName.LiquidMotorMove(110 * orientation);
- }).Execute(func);
- Thread.Sleep(1000);
- CloseRegister();
- Thread.Sleep(2000);
- }
- /// <summary>
- /// 打开寄存器
- /// </summary>
- private void OpenRegister()
- {
- bool openRes;
- do
- {
- openRes = string.Concat(_liquidName, "Switch").RegisterOpen();
- Thread.Sleep(1000);
- } while (!openRes);
- }
- /// <summary>
- /// 关闭寄存器
- /// </summary>
- private void CloseRegister()
- {
- bool closeRes;
- do
- {
- closeRes = string.Concat(_liquidName, "Switch").RegisterClose();
- Thread.Sleep(1000);
- } while (!closeRes);
- }
- }
- }
|