IoPressureMeter.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. using System.Xml;
  2. using Aitex.Core.Common.DeviceData;
  3. using Aitex.Core.RT.DataCenter;
  4. using Aitex.Core.RT.Event;
  5. using Aitex.Core.RT.IOCore;
  6. using Aitex.Core.RT.SCCore;
  7. using Aitex.Core.Util;
  8. namespace Aitex.Core.RT.Device.Unit
  9. {
  10. public class IoPressureMeter : BaseDevice, IDevice
  11. {
  12. [Subscription(AITPressureMeterPropertyName.Feedback)]
  13. public double Value
  14. {
  15. get
  16. {
  17. if (_aiPressure != null)
  18. return _aiPressure.Value;
  19. return 0;
  20. }
  21. }
  22. public bool IsError
  23. {
  24. get
  25. {
  26. if (_diGaugeError != null)
  27. return _diGaugeError.Value;
  28. return false;
  29. }
  30. }
  31. public double Precision
  32. {
  33. get
  34. {
  35. return _scPrecision == null ? float.MaxValue : _scPrecision.Value;
  36. }
  37. }
  38. private string _unit = "mTorr";
  39. public string Unit
  40. {
  41. get
  42. {
  43. return _unit;
  44. }
  45. set
  46. {
  47. _unit = value;
  48. }
  49. }
  50. private AIAccessor _aiPressure = null;
  51. private DIAccessor _diGaugeError;
  52. private SCItem<double> _scPrecision;
  53. private R_TRIG _trigGaugeError = new R_TRIG();
  54. private F_TRIG _trigPressureException = new F_TRIG();
  55. private DeviceTimer _timerPressureException = new DeviceTimer();
  56. const float PRESSURE_EXCEPTION_THRESHOLD = 0.4f;
  57. public IoPressureMeter(string module, XmlElement node)
  58. {
  59. base.Module = module;
  60. base.Name = node.GetAttribute("id");
  61. base.Display = node.GetAttribute("display");
  62. base.DeviceID = node.GetAttribute("schematicId");
  63. Unit = node.GetAttribute("unit");
  64. _aiPressure = ParseAiNode("aiPressure", node);
  65. _diGaugeError = ParseDiNode("diGaugeFail", node);
  66. _scPrecision = ParseScNodeDouble("scPrecision", node);
  67. }
  68. public bool Initialize()
  69. {
  70. DATA.Subscribe(string.Format("Device.{0}.{1}", Module, Name), () =>
  71. {
  72. AITPressureMeterData data = new AITPressureMeterData()
  73. {
  74. DeviceName = Name,
  75. DeviceSchematicId = DeviceID,
  76. DisplayName = Display,
  77. FeedBack = Value,
  78. Precision = Precision,
  79. Unit = Unit,
  80. IsError = IsError,
  81. };
  82. return data;
  83. }, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  84. return true;
  85. }
  86. public void Terminate()
  87. {
  88. }
  89. public void Monitor()
  90. {
  91. // Gauge error triggered
  92. _trigGaugeError.CLK = IsError;
  93. if (_trigGaugeError.Q)
  94. {
  95. EV.PostMessage(Module, EventEnum.DefaultAlarm, string.Format("Vacuum gauge error."));
  96. }
  97. // pressure exception, 可能真空压力计断线
  98. _trigPressureException.CLK = this.Value > PRESSURE_EXCEPTION_THRESHOLD;
  99. if (_trigPressureException.Q)
  100. {
  101. _timerPressureException.Start(2000);
  102. }
  103. if (_timerPressureException.IsTimeout() && this.Value < PRESSURE_EXCEPTION_THRESHOLD)
  104. {
  105. EV.PostMessage(Module, EventEnum.DefaultAlarm, $"压力数值[{this.Value}]异常");
  106. _timerPressureException.Stop();
  107. }
  108. }
  109. public void Reset()
  110. {
  111. _trigGaugeError.RST = true;
  112. _trigPressureException.RST = true;
  113. }
  114. }
  115. }