PowerSupplierStepRoutine.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. using Aitex.Core.RT.Device;
  2. using Aitex.Core.RT.Routine;
  3. using MECF.Framework.Common.CommonData.PowerSupplier;
  4. using MECF.Framework.Common.Routine;
  5. using CyberX8_Core;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. namespace CyberX8_RT.Devices.PowerSupplier
  12. {
  13. public class PowerSupplierStepRoutine : RoutineBase, IRoutine
  14. {
  15. private enum PowerSupplierStep
  16. {
  17. CloseOutPut,
  18. SwitchStepModel,
  19. WriteStepParameter,
  20. WriteStepDelay,
  21. StartStepParameter,
  22. StartStepDelay,
  23. EnableOutput,
  24. Delay,
  25. WaitStep,
  26. LastCloseOutPut,
  27. SwitchNormal,
  28. End
  29. }
  30. #region 内部变量
  31. /// <summary>
  32. /// 步阶数据对象集合
  33. /// </summary>
  34. List<PowerSupplierStepPeriodData> _stepPeriodDatas;
  35. /// <summary>
  36. /// 电源设备对象
  37. /// </summary>
  38. CellPowerSupplier _powerSupplier;
  39. /// <summary>
  40. /// 等待时长
  41. /// </summary>
  42. private int _waitTime = 500;
  43. /// <summary>
  44. /// 输出时间
  45. /// </summary>
  46. private DateTime _outputTime = DateTime.MinValue;
  47. #endregion
  48. /// <summary>
  49. /// 构造函数
  50. /// </summary>
  51. /// <param name="module"></param>
  52. public PowerSupplierStepRoutine(string module) : base(module)
  53. {
  54. }
  55. public void Abort()
  56. {
  57. Runner.Stop("Manual Abort");
  58. }
  59. /// <summary>
  60. /// 监控
  61. /// </summary>
  62. /// <returns></returns>
  63. public RState Monitor()
  64. {
  65. Runner.Run(PowerSupplierStep.CloseOutPut, () => { return _powerSupplier.DisableOutput(); }, () => { return !_powerSupplier.PowerSupplierData.Enabled; }, _delay_2s)
  66. .Run(PowerSupplierStep.SwitchStepModel, () => { return _powerSupplier.SwitchPowerRunModel((int)PowerRunModelEnum.Step); }, () => { return _powerSupplier.PowerSupplierData.PowerRunModel == (int)PowerRunModelEnum.Step; }, _delay_2s)
  67. .Run(PowerSupplierStep.WriteStepParameter, () => { return _powerSupplier.SetStepPeriod("", new object[] { "", _stepPeriodDatas }); }, NullFun, _delay_1ms)
  68. .Run(PowerSupplierStep.StartStepParameter, () => { return _powerSupplier.StartStepPeriod((ushort)_stepPeriodDatas.Count, 1); }, NullFun, _delay_1ms)
  69. .Run(PowerSupplierStep.EnableOutput, EnableOutPut, () => { return _powerSupplier.PowerSupplierData.Enabled; }, _delay_3s)
  70. .Delay(PowerSupplierStep.Delay, 1000)
  71. .Wait(PowerSupplierStep.WaitStep, CheckWaitTimeCurrentFinish, _waitTime)
  72. .Run(PowerSupplierStep.LastCloseOutPut, () => { return _powerSupplier.DisableOutput(); }, () => { return !_powerSupplier.PowerSupplierData.Enabled; }, _delay_2s)
  73. .Run(PowerSupplierStep.SwitchNormal, () => { return _powerSupplier.SwitchPowerRunModel((int)PowerRunModelEnum.Normal); }, () => { return _powerSupplier.PowerSupplierData.PowerRunModel == (int)PowerRunModelEnum.Normal; }, _delay_2s)
  74. .End(PowerSupplierStep.End, NullFun, _delay_1ms);
  75. return Runner.Status;
  76. }
  77. /// <summary>
  78. /// 启动输出
  79. /// </summary>
  80. /// <returns></returns>
  81. private bool EnableOutPut()
  82. {
  83. return _powerSupplier.EnableOutput();
  84. }
  85. /// <summary>
  86. /// 校验时间电流是否为0
  87. /// </summary>
  88. /// <returns></returns>
  89. private bool CheckWaitTimeCurrentFinish()
  90. {
  91. if (_outputTime == DateTime.MinValue)
  92. {
  93. _outputTime = DateTime.Now;
  94. return false;
  95. }
  96. //waittime比总时间多出1000,上面delay1000,判定修后一步的最后1s是否为0电流
  97. if (DateTime.Now.Subtract(_outputTime).TotalMilliseconds >= _waitTime-3000)
  98. {
  99. return _powerSupplier.PowerSupplierData.Current == 0;
  100. }
  101. return false;
  102. }
  103. public RState Start(params object[] objs)
  104. {
  105. _powerSupplier = DEVICE.GetDevice<CellPowerSupplier>(Module);
  106. _stepPeriodDatas = (List<PowerSupplierStepPeriodData>)objs[1];
  107. _waitTime = 0;
  108. foreach(PowerSupplierStepPeriodData item in _stepPeriodDatas)
  109. {
  110. _waitTime += (item.Hour * 3600 + item.Minute * 60 + item.Second) * 1000 + item.Microsecond;
  111. }
  112. _waitTime += 1 * 1000;//多增加1秒
  113. _outputTime = DateTime.MinValue;
  114. return Runner.Start(Module, "PowerSupplier Step");
  115. }
  116. }
  117. }