AddLiquidPotassiumPermanganateNormalLiquidHandler.cs 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. using SHJX.Service.Control.Common.Assets;
  2. namespace SHJX.Service.Control.LiquidHandler.Handler.NormalLiquidHandler
  3. {
  4. public class AddLiquidPotassiumPermanganateNormalLiquidHandler : INormalLiquid
  5. {
  6. public bool Execute(Action<object> action = null, params object[] args)
  7. {
  8. bool locker;
  9. do
  10. {
  11. StateMachine state = DataManagerInstance.QueryStateMachine(StateMachineName.POTASSIUM2PERMANGANATE_LOCK);
  12. locker = state.Status > 0;
  13. } while (locker);
  14. DataManagerInstance.IncreaseLock(StateMachineName.POTASSIUM2PERMANGANATE_LOCK);
  15. LiquidVolume liquidVolume = DataManagerInstance.GetLiquidVolume(EquipmentNames.Titration2PotassiumPermanganate);
  16. if (liquidVolume is null)
  17. {
  18. throw new ArgumentException($"{EquipmentNames.Titration2PotassiumPermanganate}查询Volume为空");
  19. }
  20. if (!liquidVolume.Enable)
  21. {
  22. return true;
  23. }
  24. LiquidAmount liquidAmount = DataManagerInstance.GetLiquidAmount(EquipmentNames.Titration2PotassiumPermanganate);
  25. if (liquidAmount is null)
  26. {
  27. throw new ArgumentException($"{EquipmentNames.Titration2PotassiumPermanganate}查询Amount为空");
  28. }
  29. int distance;
  30. bool writeResponse = true;
  31. double count = Math.Floor(liquidVolume.SampleVolume / liquidAmount.Capacity);
  32. #region
  33. //自动吸液代码
  34. distance = Convert.ToInt32(Math.Round(liquidAmount.Capacity / liquidAmount.Amount * liquidAmount.ConvertRatio));
  35. bool arriveEndPoint = LiquidPipeSwitch.StartNew.SetLiquidName(EquipmentNames.Titration2PotassiumPermanganate).IsArriveEndPoint;
  36. if (ConfigInstance.IsAutomaticInLiquid && !arriveEndPoint)
  37. {
  38. writeResponse = writeResponse && LiquidPipeSwitch.StartNew.SetLiquidName(EquipmentNames.Titration2PotassiumPermanganate).Execute(LiquidSwitchPattern.Out, distance);
  39. }
  40. else
  41. {
  42. writeResponse = writeResponse && LiquidPipeSwitch.StartNew.SetLiquidName(EquipmentNames.Titration2PotassiumPermanganate).CheckWhetherArriveEndPoint().Execute(distance);
  43. }
  44. //自动吸液代码
  45. #endregion
  46. for (int i = 1; i < count; i++)//上面出液一次所以i是从1开始
  47. {
  48. distance = Convert.ToInt32(Math.Round(liquidAmount.Capacity / liquidAmount.Amount * liquidAmount.ConvertRatio));
  49. writeResponse = writeResponse && LiquidPipeSwitch.StartNew.SetLiquidName(EquipmentNames.Titration2PotassiumPermanganate).CheckWhetherArriveEndPoint().Execute(distance);
  50. }
  51. double residue = liquidVolume.SampleVolume % liquidAmount.Capacity;
  52. if (residue > 0)
  53. {
  54. distance = Convert.ToInt32(Math.Round(residue / liquidAmount.Amount * liquidAmount.ConvertRatio));
  55. writeResponse = writeResponse && LiquidPipeSwitch.StartNew.SetLiquidName(EquipmentNames.Titration2PotassiumPermanganate).CheckWhetherArriveEndPoint().Execute(distance);
  56. }
  57. //Todo:这里做液体扣减
  58. DataManagerInstance.DecreaseLiquidTotal("PotassiumPermanganate", liquidVolume.SampleVolume);
  59. DataManagerInstance.DecreaseLiquidReserve("PotassiumPermanganate");
  60. DataManagerInstance.DecreaseLock(StateMachineName.POTASSIUM2PERMANGANATE_LOCK);
  61. return writeResponse;
  62. }
  63. }
  64. }