LoaderSideVacuumAndLevelCheckRoutineRoutine.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. using Aitex.Core.RT.Device;
  2. using Aitex.Core.RT.Routine;
  3. using Aitex.Core.RT.SCCore;
  4. using MECF.Framework.Common.Beckhoff.ModuleIO;
  5. using MECF.Framework.Common.Equipment;
  6. using MECF.Framework.Common.Routine;
  7. using MECF.Framework.Common.TwinCat;
  8. using CyberX8_Core;
  9. using CyberX8_RT.Devices.Loader;
  10. using System;
  11. using System.Collections.Generic;
  12. using System.Linq;
  13. using System.Text;
  14. using System.Threading.Tasks;
  15. using MECF.Framework.Common.IOCore;
  16. namespace CyberX8_RT.Devices.AXIS.CANOpen
  17. {
  18. public class LoaderSideVacuumAndLevelCheckRoutineRoutine : RoutineBase, IRoutine
  19. {
  20. private enum VacuumStep
  21. {
  22. WriteVacuum,
  23. CheckVacuum,
  24. End
  25. }
  26. #region 常量
  27. private const string CRS_VACUUM = "CRSVacuum";
  28. #endregion
  29. #region 内部变量
  30. private int _timeout = 5000;
  31. private LoaderSideDevice _loaderSide;
  32. private bool _vacuum = false;
  33. private double _crsVacuumHighLimit = -550;
  34. private double _crsVacuumLowLimit = -480;
  35. #endregion
  36. /// <summary>
  37. /// 构造函数
  38. /// </summary>
  39. /// <param name="module"></param>
  40. public LoaderSideVacuumAndLevelCheckRoutineRoutine(string module) : base(module)
  41. {
  42. }
  43. /// <summary>
  44. /// 中止
  45. /// </summary>
  46. public void Abort()
  47. {
  48. Runner.Stop("Manual Abort");
  49. }
  50. /// <summary>
  51. /// 监控
  52. /// </summary>
  53. /// <returns></returns>
  54. public RState Monitor()
  55. {
  56. Runner.Run(VacuumStep.WriteVacuum, WriteVacuum, CheckVacuum,_timeout)
  57. .Run(VacuumStep.CheckVacuum,NullFun,CheckVacuumValue,_timeout)
  58. .End(VacuumStep.End,NullFun,100);
  59. return Runner.Status;
  60. }
  61. /// <summary>
  62. /// 写入Vacuum数值
  63. /// </summary>
  64. /// <returns></returns>
  65. private bool WriteVacuum()
  66. {
  67. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{CRS_VACUUM}");
  68. return IOModuleManager.Instance.WriteIoValue(ioName, _vacuum);
  69. }
  70. /// <summary>
  71. /// 检验Door Lock状态
  72. /// </summary>
  73. /// <returns></returns>
  74. private bool CheckVacuum()
  75. {
  76. return _loaderSide.SideData.CRSVacuum == _vacuum;
  77. }
  78. /// <summary>
  79. /// 检验Door Lock状态
  80. /// </summary>
  81. /// <returns></returns>
  82. private bool CheckVacuumValue()
  83. {
  84. if (_vacuum)
  85. {
  86. return _loaderSide.SideData.CRSVacuumValue < 0 && _loaderSide.SideData.CRSVacuumValue < _crsVacuumHighLimit;
  87. }
  88. else
  89. {
  90. return _loaderSide.SideData.CRSVacuumValue > _crsVacuumLowLimit;
  91. }
  92. }
  93. /// <summary>
  94. /// 启动
  95. /// </summary>
  96. /// <param name="objs"></param>
  97. /// <returns></returns>
  98. public RState Start(params object[] objs)
  99. {
  100. if (SC.ContainsItem($"{ModuleName.Loader1}.LSVacuumTimeout"))
  101. {
  102. _timeout = SC.GetValue<int>($"{ModuleName.Loader1}.LSVacuumTimeout");
  103. }
  104. if (SC.ContainsItem($"{ModuleName.Loader1}.LSVacuumHighLimit"))
  105. {
  106. _crsVacuumHighLimit = SC.GetValue<double>($"{ModuleName.Loader1}.LSVacuumHighLimit");
  107. }
  108. if (SC.ContainsItem($"{ModuleName.Loader1}.LSVacuumHighLimit"))
  109. {
  110. _crsVacuumHighLimit = SC.GetValue<double>($"{ModuleName.Loader1}.LSVacuumHighLimit");
  111. }
  112. _loaderSide = DEVICE.GetDevice<LoaderSideDevice>(Module);
  113. _vacuum = (bool)objs[0];
  114. return Runner.Start(Module, "Vacuum And Check Value");
  115. }
  116. }
  117. }