| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423 |
- using SHJX.Service.Control.Common.Assets;
- using SHJX.Service.Control.Disposables;
- using SHJX.Service.Control.Extends;
- namespace SHJX.Service.Control.Schedules
- {
- [EnableScheduling]
- public class ExtendScheduler : IScheduler
- {
- private static readonly ILogger logger = LogFactory.BuildLogger(typeof(ExtendScheduler));
- private static IDataManager _dataManager;
- private static ReadConfigUtil _config;
- public ExtendScheduler(IDataManager dataManager, ReadConfigUtil config)
- {
- _dataManager = dataManager;
- _config = config;
- }
- /// <summary>
- /// 自动回原点
- /// </summary>
- [Scheduled("AutomaticGoBack", 1000)]
- public void AutomaticGoBack()
- {
- bool haveStart = _dataManager.Query<DissolveDate>().Where(it => it.Start.Equals(true)).Any();
- if (!haveStart)
- {
- return;
- }
- bool haveCache = _dataManager.Query<RouteCache>().Any();
- if (haveCache)
- {
- return;
- }
- #region 判断是否在消解位区域内
- List<MotorMoveStatus> motorMoves = _dataManager.Query<MotorMoveStatus>().ToList();
- Axis currentAxis = new()
- {
- LocationX = motorMoves.FirstOrDefault(it => it.MotorName.Equals(EquipmentNames.AxisX)).CurrentPosition,
- LocationY = motorMoves.FirstOrDefault(it => it.MotorName.Equals(EquipmentNames.AxisY)).CurrentPosition,
- LocationZ = 0,
- LocationZF = 0
- };
- List<EquipmentArea> dissolveAreas = _dataManager.Query<EquipmentArea>().Where(it => it.AreaName.Equals(AreaName.DISSOLVE_POSITION)).ToList();
- bool inDissolveArea = false;
- Parallel.ForEach(dissolveAreas, area =>
- {
- Axis axis = new()
- {
- LocationX = area.LocationX,
- LocationY = area.LocationY,
- LocationZ = 0,
- LocationZF = 0
- };
- if (axis.Equals(currentAxis))
- {
- inDissolveArea = true;
- }
- });
-
- DissolveDate dissolveDates = _dataManager.Query<DissolveDate>().Where(it => it.Start.Equals(true)).OrderBy(it => it.LastTryTime, OrderPattern.Asc).First();
- if (dissolveDates != null)
- {
- ExecuteTime dissolveExecuteTime = _dataManager.Query<ExecuteTime>().Where(it => it.TypeName.Equals(ExecuteTimeName.DISSOLVE_TIME)).First();
- int taskSecondDate = dissolveDates.LastTryTime.GetSecondDifferenceValue();
- TaskRuntime.Calculate(dissolveDates.PositionName, out double xNeedTime, out double yNeedTime, out double zNeedTime, out double zfNeedTime);
- double needTime = Math.Abs(xNeedTime) + Math.Abs(yNeedTime) + Math.Abs(zNeedTime) + Math.Abs(zfNeedTime);
- int sec = (int)DateTime.Now.Subtract(dissolveDates.LastTryTime).TotalSeconds;
- if (!inDissolveArea || dissolveExecuteTime.Value * 60 - taskSecondDate <= 2 * needTime)
- {
- return;
- }
- }
- #endregion
- StateMachine status = _dataManager.Query<StateMachine>().Where(item => item.Name.Equals(StateMachineName.MOTOR_LOCK)).First();
- if (status is null || status.Status >= 1)
- {
- return;
- }
- try
- {
- _dataManager.Update<StateMachine>().Invoke(it => it.Status.Set(1))(it => it.Name.Equals(StateMachineName.MOTOR_LOCK));
- string[] items = new string[] { EquipmentNames.AxisX, EquipmentNames.AxisY };
- ParallelLoopResult result = Parallel.ForEach(items, item =>
- {
- ExecuteCommand.MotorGoBackExecute(item);
- });
- }
- finally
- {
- _dataManager.Update<StateMachine>().Invoke(it => it.Status.Set(0))(it => it.Name.Equals(StateMachineName.MOTOR_LOCK));
- }
- }
- ///// <summary>
- ///// 草酸钠自动吸液
- ///// </summary>
- //[Scheduled("InLiquidSodium1Oxalate", 1000)]
- //public void InLiquidSodium1Oxalate()
- //{
- // if (_config.AutomaticInLiquid)
- // {
- // EquipmentTask titrationTask = _dataManager.Query<EquipmentTask>().Where(it => it.RouteStep.Equals(PipeName.TITRATION) && it.Status.In(TaskState.Titration, TaskState.Execute)).First();
- // if (titrationTask is null)
- // {
- // return;
- // }
- // //bool arriveEndPoint = LiquidPipeSwitch.StartNew.SetLiquidName(EquipmentNames.Sodium1Oxalate).IsArriveEndPoint;
- // //if (!arriveEndPoint)
- // //{
- // // return;
- // //}
- // StateMachine state = _dataManager.Query<StateMachine>().Where(it => it.Name.Equals(StateMachineName.SODIUM1OXALATE_LOCK)).First();
- // if (state.Status > 0)
- // {
- // return;
- // }
- // LiquidRecord record = _dataManager.Query<LiquidRecord>().Where(it => it.Point.Equals(titrationTask.Source)).First();
- // if (record is null)
- // {
- // LiquidRecord liquidRecord = new()
- // {
- // Point = titrationTask.Source
- // };
- // _dataManager.Add(liquidRecord);
- // }
- // record = _dataManager.Query<LiquidRecord>().Where(it => it.Point.Equals(titrationTask.Source)).First();
- // if (titrationTask.RouteStep.Equals(PipeName.TITRATION) && record.TitrationSodiumOxalateStatus is null)
- // {
- // try
- // {
- // _dataManager.Update<StateMachine>().Invoke(it => it.Status.Set(1))(it => it.Name.Equals(StateMachineName.SODIUM1OXALATE_LOCK));
- // logger.LogInformation("自动吸液锁定草酸钠");
- // LiquidVolume liquidVolume = _dataManager.Query<LiquidVolume>().Where(it => it.LiquidName.Equals(EquipmentNames.Sodium1Oxalate)).First();
- // LiquidAmount liquidAmount = _dataManager.Query<LiquidAmount>().Where(it => it.LiquidName.Equals(EquipmentNames.Sodium1Oxalate)).First();
- // int distance = Convert.ToInt32(Math.Round((liquidVolume.SampleVolume > liquidAmount.Capacity ? liquidAmount.Capacity : liquidVolume.SampleVolume) / liquidAmount.Amount * liquidAmount.ConvertRatio));
- // LiquidPipeSwitch.StartNew.SetLiquidName(EquipmentNames.Sodium1Oxalate).CheckWhetherArriveEndPointOxalate().ExecuteOxalate(LiquidSwitchPattern.In, distance);
- // //LiquidPipeSwitch.StartNew.SetLiquidName(EquipmentNames.Sodium1Oxalate).SetPattern(LiquidSwitchPattern.Out);
- // _dataManager.Update<LiquidRecord>().Invoke(it => it.TitrationSodiumOxalateStatus.Set(1))(it => it.Point.Equals(titrationTask.Source));
- // }
- // finally
- // {
- // _dataManager.Update<StateMachine>().Invoke(it => it.Status.Set(0))(it => it.Name.Equals(StateMachineName.SODIUM1OXALATE_LOCK));
- // logger.LogInformation("自动吸液解锁草酸钠");
- // }
- // }
- // }
- //}
- ///// <summary>
- ///// 草酸钠自动吸液
- ///// </summary>
- //[Scheduled("InLiquidSodium1Oxalate", 1000)]
- //public void InLiquidSodium2Oxalate()
- //{
- // if (_config.AutomaticInLiquid)
- // {
- // EquipmentTask titrationTask = _dataManager.Query<EquipmentTask>().Where(it => it.RouteStep.Equals(PipeName.TITRATION2) && it.Status.In(TaskState.Titration2, TaskState.Execute)).First();
- // if (titrationTask is null)
- // {
- // return;
- // }
- // //bool arriveEndPoint = LiquidPipeSwitch.StartNew.SetLiquidName(EquipmentNames.Sodium2Oxalate).IsArriveEndPoint;
- // //if (!arriveEndPoint)
- // //{
- // // return;
- // //}
- // StateMachine state = _dataManager.Query<StateMachine>().Where(it => it.Name.Equals(StateMachineName.SODIUM2OXALATE_LOCK)).First();
- // if (state.Status > 0)
- // {
- // return;
- // }
- // LiquidRecord record = _dataManager.Query<LiquidRecord>().Where(it => it.Point.Equals(titrationTask.Source)).First();
- // if (record is null)
- // {
- // LiquidRecord liquidRecord = new()
- // {
- // Point = titrationTask.Source
- // };
- // _dataManager.Add(liquidRecord);
- // }
- // record = _dataManager.Query<LiquidRecord>().Where(it => it.Point.Equals(titrationTask.Source)).First();
- // if (titrationTask.RouteStep.Equals(PipeName.TITRATION2) && record.TitrationSodiumOxalateStatus is null)
- // {
- // try
- // {
- // _dataManager.Update<StateMachine>().Invoke(it => it.Status.Set(1))(it => it.Name.Equals(StateMachineName.SODIUM2OXALATE_LOCK));
- // logger.LogInformation("自动吸液锁定草酸钠");
- // LiquidVolume liquidVolume = _dataManager.Query<LiquidVolume>().Where(it => it.LiquidName.Equals(EquipmentNames.Sodium2Oxalate)).First();
- // LiquidAmount liquidAmount = _dataManager.Query<LiquidAmount>().Where(it => it.LiquidName.Equals(EquipmentNames.Sodium2Oxalate)).First();
- // int distance = Convert.ToInt32(Math.Round((liquidVolume.SampleVolume > liquidAmount.Capacity ? liquidAmount.Capacity : liquidVolume.SampleVolume) / liquidAmount.Amount * liquidAmount.ConvertRatio));
- // LiquidPipeSwitch.StartNew.SetLiquidName(EquipmentNames.Sodium2Oxalate).CheckWhetherArriveEndPointOxalate().ExecuteOxalate(LiquidSwitchPattern.In, distance);
- // //LiquidPipeSwitch.StartNew.SetLiquidName(EquipmentNames.Sodium1Oxalate).SetPattern(LiquidSwitchPattern.Out);
- // _dataManager.Update<LiquidRecord>().Invoke(it => it.TitrationSodiumOxalateStatus.Set(1))(it => it.Point.Equals(titrationTask.Source));
- // }
- // finally
- // {
- // _dataManager.Update<StateMachine>().Invoke(it => it.Status.Set(0))(it => it.Name.Equals(StateMachineName.SODIUM2OXALATE_LOCK));
- // logger.LogInformation("自动吸液解锁草酸钠2");
- // }
- // }
- // }
- //}
- ///// <summary>
- ///// 草酸钠自动吸液 (但滴定版本)
- ///// </summary>
- //[Scheduled("InLiquidSodiumOxalate", 1000)]
- //public void InLiquidSodiumOxalate()
- //{
- // if (_config.AutomaticInLiquid)
- // {
- // bool existTitrationTask = _dataManager.Query<EquipmentTask>().Where(it => it.RouteStep.Equals(PipeName.TITRATION) && it.Status.In(TaskState.Titration, TaskState.Execute)).Any();
- // if (existTitrationTask)
- // {
- // return;
- // }
- // bool arriveEndPoint = LiquidPipeSwitch.StartNew.SetLiquidName(EquipmentNames.Sodium1Oxalate).IsArriveEndPoint;
- // if (!arriveEndPoint)
- // {
- // return;
- // }
- // StateMachine state = _dataManager.Query<StateMachine>().Where(it => it.Name.Equals(StateMachineName.SODIUM1OXALATE_LOCK)).First();
- // if (state.Status > 0)
- // {
- // return;
- // }
- // try
- // {
- // _dataManager.Update<StateMachine>().Invoke(it => it.Status.Set(1))(it => it.Name.Equals(StateMachineName.SODIUM1OXALATE_LOCK));
- // logger.LogInformation("自动吸液锁定草酸钠");
- // LiquidVolume liquidVolume = _dataManager.Query<LiquidVolume>().Where(it => it.LiquidName.Equals(EquipmentNames.Sodium1Oxalate)).First();
- // LiquidAmount liquidAmount = _dataManager.Query<LiquidAmount>().Where(it => it.LiquidName.Equals(EquipmentNames.Sodium1Oxalate)).First();
- // int distance = Convert.ToInt32(Math.Round((liquidVolume.SampleVolume > liquidAmount.Capacity ? liquidAmount.Capacity : liquidVolume.SampleVolume) / liquidAmount.Amount * liquidAmount.ConvertRatio));
- // LiquidPipeSwitch.StartNew.SetLiquidName(EquipmentNames.Sodium1Oxalate).ExecuteOxalate(LiquidSwitchPattern.In, distance);
- // //LiquidPipeSwitch.StartNew.SetLiquidName(EquipmentNames.Sodium1Oxalate).SetPattern(LiquidSwitchPattern.Out);
- // }
- // finally
- // {
- // _dataManager.Update<StateMachine>().Invoke(it => it.Status.Set(0))(it => it.Name.Equals(StateMachineName.SODIUM1OXALATE_LOCK));
- // logger.LogInformation("自动吸液解锁草酸钠");
- // }
- // }
- //}
- /// <summary>
- /// 滴定1高猛酸自动吸液
- /// </summary>
- [Scheduled("InLiquidPotassiumPermanganate", 1000)]
- public void InLiquidPotassiumPermanganate()
- {
- if (ConfigInstance.IsAutomaticInLiquid)
- {
- EquipmentTask titrationTask = _dataManager.Query<EquipmentTask>().Where(it => it.RouteStep.Equals(PipeName.TITRATION) && it.Status.Equals(TaskState.Titration) || it.RouteStep.Equals(PipeName.TITRATION)&& it.Status.Equals(TaskState.Execute) ).First();
- if (titrationTask is null)
- {
- return;
- }
- LiquidRecord record = _dataManager.Query<LiquidRecord>().Where(it => it.Point.Equals(titrationTask.Source)).First();
- if (record is null)
- {
- LiquidRecord liquidRecord = new()
- {
- Point = titrationTask.Source
- };
- _dataManager.Add(liquidRecord);
- }
- record = _dataManager.Query<LiquidRecord>().Where(it => it.Point.Equals(titrationTask.Source)).First();
- if (titrationTask.RouteStep.Equals(PipeName.TITRATION) && record.TitrationPotassiumPermanganateStatus is null)
- {
- try
- {
- StateMachine state = _dataManager.Query<StateMachine>().Where(it => it.Name.Equals(StateMachineName.POTASSIUM1PERMANGANATE_LOCK)).First();
- if (state.Status > 0)
- {
- return;
- }
- _dataManager.Update<StateMachine>().Invoke(it => it.Status.Set(1))(it => it.Name.Equals(StateMachineName.POTASSIUM1PERMANGANATE_LOCK));
- if (titrationTask.RouteStep == PipeName.TITRATION)
- {
- _dataManager.Update<LiquidRecord>().Invoke(it => it.TitrationPotassiumPermanganateStatus.Set(1))(it => it.Point.Equals(titrationTask.Source));
- }
- logger.LogInformation(titrationTask.Source + "滴定1自动吸液锁定高锰酸盐");
- LiquidAmount liquidAmount = _dataManager.Query<LiquidAmount>().Where(it => it.LiquidName.Equals(EquipmentNames.Titration1PotassiumPermanganate)).First();
- int distance = Convert.ToInt32(Math.Round(liquidAmount.Capacity / liquidAmount.Amount * liquidAmount.ConvertRatio));
- LiquidPipeSwitch.StartNew.SetLiquidName(EquipmentNames.Titration1PotassiumPermanganate).CheckWhetherArriveEndPoint().Execute(LiquidSwitchPattern.In, distance);
- LiquidPipeSwitch.StartNew.SetLiquidName(EquipmentNames.Titration1PotassiumPermanganate).SetPattern(LiquidSwitchPattern.Out);
- _dataManager.Update<StateMachine>().Invoke(it => it.Status.Set(0))(it => it.Name.Equals(StateMachineName.POTASSIUM1PERMANGANATE_LOCK));
- logger.LogInformation(titrationTask.Source + "滴定1自动吸液解锁高锰酸盐");
- }
- finally
- {
- }
- }
- }
- }
- ///// <summary>
- ///// 滴定2高猛酸自动吸液
- ///// </summary>
- //[Scheduled("InLiquidPotassiumPermanganate2", 1000)]
- //public void InLiquidPotassiumPermanganate2()
- //{
- // if (ConfigInstance.IsAutomaticInLiquid)
- // {
- // EquipmentTask titrationTask = _dataManager.Query<EquipmentTask>().Where(it => it.RouteStep.Equals(PipeName.TITRATION2) && it.Status.In(TaskState.Titration2, TaskState.Execute)&& it.RouteID != 0).First();
- // if (titrationTask is null)
- // {
- // return;
- // }
- // LiquidRecord record = _dataManager.Query<LiquidRecord>().Where(it => it.Point.Equals(titrationTask.Source)).First();
- // if (record is null)
- // {
- // LiquidRecord liquidRecord = new()
- // {
- // Point = titrationTask.Source
- // };
- // _dataManager.Add(liquidRecord);
- // }
- // record = _dataManager.Query<LiquidRecord>().Where(it => it.Point.Equals(titrationTask.Source)).First();
- // if (titrationTask.RouteStep.Equals(PipeName.TITRATION2) && record.TitrationPotassiumPermanganateStatus is null)
- // {
- // try
- // {
- // StateMachine state = _dataManager.Query<StateMachine>().Where(it => it.Name.Equals(StateMachineName.POTASSIUM2PERMANGANATE_LOCK)).First();
- // if (state.Status > 0)
- // {
- // return;
- // }
- // _dataManager.Update<StateMachine>().Invoke(it => it.Status.Set(1))(it => it.Name.Equals(StateMachineName.POTASSIUM2PERMANGANATE_LOCK));
- // if (titrationTask.RouteStep == PipeName.TITRATION2)
- // {
- // _dataManager.Update<LiquidRecord>().Invoke(it => it.TitrationPotassiumPermanganateStatus.Set(1))(it => it.Point.Equals(titrationTask.Source));
- // }
- // logger.LogInformation(titrationTask.Source + "滴定2自动吸液锁定高锰酸盐");
- // LiquidAmount liquidAmount = _dataManager.Query<LiquidAmount>().Where(it => it.LiquidName.Equals(EquipmentNames.Titration2PotassiumPermanganate)).First();
- // int distance = Convert.ToInt32(Math.Round(liquidAmount.Capacity / liquidAmount.Amount * liquidAmount.ConvertRatio));
- // LiquidPipeSwitch.StartNew.SetLiquidName(EquipmentNames.Titration2PotassiumPermanganate).CheckWhetherArriveEndPoint().Execute(LiquidSwitchPattern.In, distance);
- // LiquidPipeSwitch.StartNew.SetLiquidName(EquipmentNames.Titration2PotassiumPermanganate).SetPattern(LiquidSwitchPattern.Out);
- // _dataManager.Update<StateMachine>().Invoke(it => it.Status.Set(0))(it => it.Name.Equals(StateMachineName.POTASSIUM2PERMANGANATE_LOCK));
- // logger.LogInformation(titrationTask.Source + "滴定2自动吸液解锁高锰酸盐");
- // }
- // finally
- // {
- // }
- // }
- // }
- //}
- /// <summary>
- /// 加液高猛酸自动吸液
- /// </summary>
- [Scheduled("InLiquidPotassiumPermanganate0", 1000)]
- public void InLiquidPotassiumPermanganate0()
- {
- if (ConfigInstance.IsAutomaticInLiquid)
- {
- EquipmentTask titrationTask = _dataManager.Query<EquipmentTask>().Where(it => it.RouteStep.Equals(PipeName.ADD_LIQUID) && it.Status.In( TaskState.AddLiquid, TaskState.Execute)).First();
- if (titrationTask is null)
- {
- return;
- }
-
- LiquidRecord record = _dataManager.Query<LiquidRecord>().Where(it => it.Point.Equals(titrationTask.Source)).First();
- if (record is null)
- {
- LiquidRecord liquidRecord = new()
- {
- Point = titrationTask.Source
- };
- _dataManager.Add(liquidRecord);
- }
- record = _dataManager.Query<LiquidRecord>().Where(it => it.Point.Equals(titrationTask.Source)).First();
- if (titrationTask.RouteStep.Equals(PipeName.ADD_LIQUID) && record.AddliquidPotassiumPermanganateStatus is null)
- {
- try
- {
- StateMachine state = _dataManager.Query<StateMachine>().Where(it => it.Name.Equals(StateMachineName.POTASSIUM2PERMANGANATE_LOCK)).First();
- if (state.Status > 0)
- {
- return;
- }
- _dataManager.Update<StateMachine>().Invoke(it => it.Status.Set(1))(it => it.Name.Equals(StateMachineName.POTASSIUM2PERMANGANATE_LOCK));
-
- if (titrationTask.RouteStep == PipeName.ADD_LIQUID)
- {
- _dataManager.Update<LiquidRecord>().Invoke(it => it.AddliquidPotassiumPermanganateStatus.Set(1))(it => it.Point.Equals(titrationTask.Source));
- }
- logger.LogInformation(titrationTask.Source + "加液自动吸液锁定高锰酸盐");
- LiquidAmount liquidAmount = _dataManager.Query<LiquidAmount>().Where(it => it.LiquidName.Equals(EquipmentNames.Titration2PotassiumPermanganate)).First();
- LiquidVolume liquidVolume = DataManagerInstance.GetLiquidVolume(EquipmentNames.Titration2PotassiumPermanganate);
- if (liquidVolume is null)
- {
- throw new ArgumentException($"{EquipmentNames.Titration2PotassiumPermanganate}查询Volume为空");
- }
- int distance = 0;
- double count = Math.Floor(liquidVolume.SampleVolume / liquidAmount.Capacity);
- if (count < 1)
- {
- distance = Convert.ToInt32(Math.Round(liquidVolume.SampleVolume / liquidAmount.Amount * liquidAmount.ConvertRatio));
- }
- else
- distance = Convert.ToInt32(Math.Round(liquidAmount.Capacity / liquidAmount.Amount * liquidAmount.ConvertRatio));
- LiquidPipeSwitch.StartNew.SetLiquidName(EquipmentNames.Titration2PotassiumPermanganate).CheckWhetherArriveEndPoint().Execute(LiquidSwitchPattern.In, distance);
- LiquidPipeSwitch.StartNew.SetLiquidName(EquipmentNames.Titration2PotassiumPermanganate).SetPattern(LiquidSwitchPattern.Out);
- _dataManager.Update<StateMachine>().Invoke(it => it.Status.Set(0))(it => it.Name.Equals(StateMachineName.POTASSIUM2PERMANGANATE_LOCK));
- logger.LogInformation(titrationTask.Source + "加液自动吸液解锁高锰酸盐");
- }
- finally
- {
- }
- }
- }
- }
- }
- }
|