LoaderSideDoorLockRoutine.cs 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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.CommonData.PUF;
  6. using MECF.Framework.Common.Equipment;
  7. using MECF.Framework.Common.Routine;
  8. using MECF.Framework.Common.TwinCat;
  9. using CyberX8_Core;
  10. using CyberX8_RT.Devices.Loader;
  11. using System;
  12. using System.Collections.Generic;
  13. using System.Linq;
  14. using System.Text;
  15. using System.Threading.Tasks;
  16. using MECF.Framework.Common.IOCore;
  17. namespace CyberX8_RT.Devices.AXIS.CANOpen
  18. {
  19. public class LoaderSideDoorLockRoutine : RoutineBase, IRoutine
  20. {
  21. private enum DoorLockStep
  22. {
  23. WriteDoorLock,
  24. End
  25. }
  26. #region 常量
  27. private const string DOOR_UNLOCK = "DoorUnlock";
  28. #endregion
  29. #region 内部变量
  30. private int _timeout = 5000;
  31. private LoaderSideDevice _loaderSide;
  32. private bool _doorLock = false;
  33. #endregion
  34. /// <summary>
  35. /// 构造函数
  36. /// </summary>
  37. /// <param name="module"></param>
  38. public LoaderSideDoorLockRoutine(string module) : base(module)
  39. {
  40. }
  41. /// <summary>
  42. /// 中止
  43. /// </summary>
  44. public void Abort()
  45. {
  46. Runner.Stop("Manual Abort");
  47. }
  48. /// <summary>
  49. /// 监控
  50. /// </summary>
  51. /// <returns></returns>
  52. public RState Monitor()
  53. {
  54. Runner.Run(DoorLockStep.WriteDoorLock, WriteDoorLock, CheckDoorLock,_timeout)
  55. .End(DoorLockStep.End,NullFun,100);
  56. return Runner.Status;
  57. }
  58. /// <summary>
  59. /// 写入Door Lock数值
  60. /// </summary>
  61. /// <returns></returns>
  62. private bool WriteDoorLock()
  63. {
  64. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{DOOR_UNLOCK}");
  65. return IOModuleManager.Instance.WriteIoValue(ioName, !_doorLock);
  66. }
  67. /// <summary>
  68. /// 检验Door Lock状态
  69. /// </summary>
  70. /// <returns></returns>
  71. private bool CheckDoorLock()
  72. {
  73. return _loaderSide.SideData.DoorUnlock == !_doorLock && _loaderSide.SideData.DoorUpperLocked == _doorLock && _loaderSide.SideData.DoorLowerLocked == _doorLock &&
  74. _loaderSide.SideData.DoorLowerUnlocked == !_doorLock && _loaderSide.SideData.DoorUpperUnlocked == !_doorLock;
  75. }
  76. /// <summary>
  77. /// 启动
  78. /// </summary>
  79. /// <param name="objs"></param>
  80. /// <returns></returns>
  81. public RState Start(params object[] objs)
  82. {
  83. if (SC.ContainsItem($"{ModuleName.Loader1}.DoorLockTimeout"))
  84. {
  85. _timeout = SC.GetValue<int>($"{ModuleName.Loader1}.DoorLockTimeout");
  86. }
  87. _loaderSide = DEVICE.GetDevice<LoaderSideDevice>(Module);
  88. _doorLock = (bool)objs[0];
  89. return Runner.Start(Module, "DoorLock");
  90. }
  91. }
  92. }