IoDoor.cs 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. using System;
  2. using System.Xml;
  3. using Aitex.Core.Common.DeviceData;
  4. using Aitex.Core.RT.DataCenter;
  5. using Aitex.Core.RT.Event;
  6. using Aitex.Core.RT.IOCore;
  7. using Aitex.Core.RT.Log;
  8. using Aitex.Core.RT.SCCore;
  9. using Aitex.Core.Util;
  10. namespace Aitex.Core.RT.Device.Unit
  11. {
  12. public enum DoorStateEnum
  13. {
  14. Unknown,
  15. Up,
  16. Down,
  17. Error,
  18. }
  19. public class IoDoor : BaseDevice, IDevice
  20. {
  21. public DoorStateEnum State
  22. {
  23. get
  24. {
  25. if (_diOpen.Value && _diClose.Value)
  26. return DoorStateEnum.Error;
  27. if (_diOpen.Value && !_diClose.Value)
  28. return DoorStateEnum.Up;
  29. if (!_diOpen.Value && _diClose.Value)
  30. return DoorStateEnum.Down;
  31. return DoorStateEnum.Unknown;
  32. }
  33. }
  34. enum DeviceState
  35. {
  36. Idle,
  37. Opening,
  38. Closing,
  39. Error,
  40. }
  41. private DIAccessor _diOpen;
  42. private DIAccessor _diClose;
  43. private DIAccessor _diOpenEnable;
  44. private DIAccessor _diCloseEnable;
  45. private DOAccessor _doOpen;
  46. private DOAccessor _doClose;
  47. private DeviceState _state = DeviceState.Idle;
  48. private DeviceTimer _timer = new DeviceTimer();
  49. private SCConfigItem _scTimeout;
  50. public bool IsOpen { get { return !_diClose.Value && _diOpen.Value; } }
  51. public bool IsClose { get { return _diClose.Value && !_diOpen.Value; } }
  52. public IoDoor(string module, XmlElement node, string ioModule = "")
  53. {
  54. base.Module = string.IsNullOrEmpty(node.GetAttribute("module")) ? module : node.GetAttribute("module");
  55. base.Name = node.GetAttribute("id");
  56. base.Display = node.GetAttribute("display");
  57. base.DeviceID = node.GetAttribute("schematicId");
  58. _diOpen = ParseDiNode("diOpen", node, ioModule);
  59. _diClose = ParseDiNode("diClose", node, ioModule);
  60. _diOpenEnable = ParseDiNode("diOpenEnable", node, ioModule);
  61. _diCloseEnable = ParseDiNode("diCloseEnable", node, ioModule);
  62. _doOpen = ParseDoNode("doOpen", node, ioModule);
  63. _doClose = ParseDoNode("doClose", node, ioModule);
  64. _scTimeout = ParseScNode("scTimeout", node);
  65. }
  66. public bool Initialize()
  67. {
  68. _state = DeviceState.Idle;
  69. DATA.Subscribe($"{Module}.{Name}.OpenFeedback", ()=>_diOpen.Value);
  70. DATA.Subscribe($"{Module}.{Name}.OpenEnable", () => _diOpenEnable==null || _diOpenEnable.Value);
  71. DATA.Subscribe($"{Module}.{Name}.CloseFeedback", () => _diClose.Value);
  72. DATA.Subscribe($"{Module}.{Name}.CloseEnable", () => _diCloseEnable==null || _diCloseEnable.Value);
  73. DEVICE.Register($"{Module}.{Name}.Open", (out string reason, int time, object[] param) =>
  74. {
  75. reason = "";
  76. return Open(out reason);
  77. });
  78. DEVICE.Register($"{Module}.{Name}.Close", (out string reason, int time, object[] param) =>
  79. {
  80. reason = "";
  81. return Close(out reason);
  82. });
  83. return true;
  84. }
  85. public void Monitor()
  86. {
  87. switch (_state)
  88. {
  89. case DeviceState.Opening:
  90. if (IsOpen)
  91. {
  92. if (!_doOpen.SetValue(false, out string reason))
  93. {
  94. LOG.Error($"{Module} reset DO failed, {reason}");
  95. }
  96. _state = DeviceState.Idle;
  97. }
  98. else if (_timer.IsTimeout())
  99. {
  100. if (!_doOpen.SetValue(false, out string reason))
  101. {
  102. LOG.Error($"{Module} reset DO failed, {reason}");
  103. }
  104. EV.PostAlarmLog(Module, $"{Module} {Name} Can not open in {_scTimeout.IntValue} seconds");
  105. _state = DeviceState.Error;
  106. }
  107. break;
  108. case DeviceState.Closing:
  109. if (IsClose)
  110. {
  111. if (!_doClose.SetValue(false, out string reason))
  112. {
  113. LOG.Error($"{Module} reset DO failed, {reason}");
  114. }
  115. _state = DeviceState.Idle;
  116. }
  117. else if (_timer.IsTimeout())
  118. {
  119. if (!_doClose.SetValue(false, out string reason))
  120. {
  121. LOG.Error($"{Module} reset DO failed, {reason}");
  122. }
  123. EV.PostAlarmLog(Module, $"{Module} {Name} Can not close in {_scTimeout.IntValue} seconds");
  124. _state = DeviceState.Error;
  125. }
  126. break;
  127. default:
  128. break;
  129. }
  130. }
  131. public void Terminate()
  132. {
  133. _doOpen.SetValue(false, out _);
  134. _doClose.SetValue(false, out _);
  135. }
  136. public bool SetDoor(bool open, out string reason)
  137. {
  138. if (open)
  139. return Open(out reason);
  140. return Close(out reason);
  141. }
  142. public bool CheckInterlockEnable(bool open)
  143. {
  144. return open ? (_diOpenEnable == null || _diOpenEnable.Value) : (_diCloseEnable==null || _diCloseEnable.Value);
  145. }
  146. public bool Open(out string reason)
  147. {
  148. if (_diOpenEnable!=null && !_diOpenEnable.Value)
  149. {
  150. reason = "interlock blocked open";
  151. return false;
  152. }
  153. if (!_doClose.SetValue(false, out reason) || !_doOpen.SetValue(true, out reason))
  154. {
  155. _doClose.SetValue(false, out _);
  156. _doOpen.SetValue(false, out _);
  157. return false;
  158. }
  159. _timer.Start(_scTimeout.IntValue * 1000);
  160. _state = DeviceState.Opening;
  161. return true;
  162. }
  163. public bool Close(out string reason)
  164. {
  165. if (_diCloseEnable!=null && !_diCloseEnable.Value)
  166. {
  167. reason = "interlock blocked close";
  168. return false;
  169. }
  170. if (!_doClose.SetValue(true, out reason) || !_doOpen.SetValue(false, out reason))
  171. {
  172. _doClose.SetValue(false, out _);
  173. _doOpen.SetValue(false, out _);
  174. return false;
  175. }
  176. _timer.Start(_scTimeout.IntValue * 1000);
  177. _state = DeviceState.Closing;
  178. return true;
  179. }
  180. public void Reset()
  181. {
  182. }
  183. }
  184. }