IoPump.cs 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874
  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.RT.Tolerance;
  10. using Aitex.Core.Util;
  11. namespace Aitex.Core.RT.Device.Unit
  12. {
  13. public class IoPump : BaseDevice, IDevice
  14. {
  15. [Subscription(AITPumpProperty.EnableDryPump)]
  16. public bool IsDryPumpEnabled
  17. {
  18. get
  19. {
  20. return _scEnableDryPump == null || _scEnableDryPump.Value;
  21. }
  22. }
  23. [Subscription(AITPumpProperty.EnableWaterFlow)]
  24. public bool EnableWaterFlow
  25. {
  26. get
  27. {
  28. return _scEnableWaterFlow != null && _scEnableWaterFlow.Value;
  29. }
  30. }
  31. [Subscription(AITPumpProperty.WaterFlowWarning)]
  32. public bool WaterFlowWarning
  33. {
  34. get
  35. {
  36. return _checkWaterFlowWarning.Result;
  37. }
  38. }
  39. [Subscription(AITPumpProperty.WaterFlowAlarm)]
  40. public bool WaterFlowAlarm
  41. {
  42. get
  43. {
  44. if (IsEnableWaterFlowAlarm)
  45. return _diWaterFlowAlarm.Value;
  46. else
  47. return false;
  48. }
  49. }
  50. [Subscription(AITPumpProperty.WaterFlowAlarmSetPoint)]
  51. public bool WaterFlowAlarmSetPoint
  52. {
  53. get
  54. {
  55. return _doWaterFlowAlarm != null && _doWaterFlowAlarm.Value;
  56. }
  57. set
  58. {
  59. if (_doWaterFlowAlarm != null)
  60. {
  61. string reason;
  62. if (!_doWaterFlowAlarm.SetValue(value, out reason))
  63. {
  64. LOG.Write(reason);
  65. }
  66. }
  67. }
  68. }
  69. [Subscription(AITPumpProperty.WaterFlowWarningTime)]
  70. public float WaterFlowWarningTime
  71. {
  72. get
  73. {
  74. return _scWaterFlowOutOfToleranceWarningTime == null ? 0 : (float)_scWaterFlowOutOfToleranceWarningTime.Value;
  75. }
  76. }
  77. [Subscription(AITPumpProperty.WaterFlowAlarmTime)]
  78. public float WaterFlowAlarmTime
  79. {
  80. get
  81. {
  82. return _scWaterFlowOutOfToleranceAlarmTime == null ? 0 : (float)_scWaterFlowOutOfToleranceAlarmTime.Value;
  83. }
  84. }
  85. [Subscription(AITPumpProperty.WaterFlowValue)]
  86. public double WaterFlowValue
  87. {
  88. get
  89. {
  90. return _aiWaterFlow == null ? 0 : _aiWaterFlow.Value;
  91. }
  92. }
  93. [Subscription(AITPumpProperty.WaterFlowMinValue)]
  94. public double WaterFlowMinValue
  95. {
  96. get
  97. {
  98. return _scWaterFlowMinValue == null ? 0 : (float)_scWaterFlowMinValue.Value;
  99. }
  100. }
  101. [Subscription(AITPumpProperty.WaterFlowMaxValue)]
  102. public double WaterFlowMaxValue
  103. {
  104. get
  105. {
  106. return _scWaterFlowMaxValue == null ? 0 : (float)_scWaterFlowMaxValue.Value;
  107. }
  108. }
  109. [Subscription(AITPumpProperty.EnableN2Pressure)]
  110. public bool EnableN2Pressure
  111. {
  112. get
  113. {
  114. if (_scEnableN2Pressure == null || _scN2PressureMinValue == null || _scN2PressureMaxValue == null ||
  115. _scN2PressureOutOfToleranceWarningTime == null || _scN2PressureOutOfToleranceAlarmTime == null)
  116. return false;
  117. return _scEnableN2Pressure != null && _scEnableN2Pressure.Value;
  118. }
  119. }
  120. [Subscription(AITPumpProperty.N2PressureWarning)]
  121. public bool N2PressureWarning
  122. {
  123. get
  124. {
  125. return _checkN2PressureWarning.Result;
  126. }
  127. }
  128. [Subscription(AITPumpProperty.N2PressureValue)]
  129. public float N2PressureValue
  130. {
  131. get
  132. {
  133. return _aiN2Pressure == null ? 0 : _aiN2Pressure.Value;
  134. }
  135. }
  136. [Subscription(AITPumpProperty.N2PressureWarningTime)]
  137. public float N2PressureWarningTime
  138. {
  139. get
  140. {
  141. return _scN2PressureOutOfToleranceWarningTime == null ? 0 : (float)_scN2PressureOutOfToleranceWarningTime.Value;
  142. }
  143. }
  144. [Subscription(AITPumpProperty.N2PressureAlarmTime)]
  145. public float N2PressureAlarmTime
  146. {
  147. get
  148. {
  149. return _scN2PressureOutOfToleranceAlarmTime == null ? 0 : (float)_scN2PressureOutOfToleranceAlarmTime.Value;
  150. }
  151. }
  152. [Subscription(AITPumpProperty.N2PressureMinValue)]
  153. public float N2PressureMinValue
  154. {
  155. get
  156. {
  157. return _scN2PressureMinValue == null ? 0 : (float)_scN2PressureMinValue.Value;
  158. }
  159. }
  160. [Subscription(AITPumpProperty.N2PressureMaxValue)]
  161. public float N2PressureMaxValue
  162. {
  163. get
  164. {
  165. return _scN2PressureMaxValue == null ? 0 : (float)_scN2PressureMaxValue.Value;
  166. }
  167. }
  168. [Subscription(AITPumpProperty.N2PressureAlarm)]
  169. public bool N2PressureAlarm
  170. {
  171. get
  172. {
  173. return _diN2Alarm.Value;
  174. }
  175. }
  176. [Subscription(AITPumpProperty.N2PressureAlarmSetPoint)]
  177. public bool N2PressureAlarmSetPoint
  178. {
  179. get
  180. {
  181. return _doN2PressureAlarm != null && _doN2PressureAlarm.Value;
  182. }
  183. set
  184. {
  185. if (_doN2PressureAlarm != null)
  186. {
  187. string reason;
  188. if (!_doN2PressureAlarm.SetValue(value, out reason))
  189. {
  190. LOG.Write(reason);
  191. }
  192. }
  193. }
  194. }
  195. public int LocalRemoteMode
  196. {
  197. get
  198. {
  199. return _doLocalRemote.Value ? 1 : 0;
  200. }
  201. }
  202. public bool HasError
  203. {
  204. get
  205. {
  206. return IsPumpTempAlarm || IsPumpOverloadAlarm;
  207. }
  208. }
  209. public bool HasWarning
  210. {
  211. get
  212. {
  213. return IsPumpN2FlowWarning || IsPumpTempWarning || IsWaterFlowWarning;
  214. }
  215. }
  216. [Subscription(AITPumpProperty.IsRunning)]
  217. public bool IsRunning
  218. {
  219. get
  220. {
  221. if (_diRunning != null)
  222. return _diRunning.Value;
  223. if (_diPowerOn != null)
  224. return _diPowerOn.Value;
  225. return true; //默认常开
  226. }
  227. }
  228. public bool IsWarning
  229. {
  230. get
  231. {
  232. return _diWarning != null && _diWarning.Value;
  233. }
  234. }
  235. public bool IsPumpTempWarning
  236. {
  237. get
  238. {
  239. return _diPumpTempWaring != null && _diPumpTempWaring.Value;
  240. }
  241. }
  242. public bool IsPumpN2FlowWarning
  243. {
  244. get
  245. {
  246. return _diPumpN2FlowWarning != null && _diPumpN2FlowWarning.Value;
  247. }
  248. }
  249. public bool IsError
  250. {
  251. get
  252. {
  253. return _diError != null && _diError.Value;
  254. }
  255. }
  256. public bool IsWaterFlowWarning
  257. {
  258. get
  259. {
  260. return _diWaterFlowWarning != null && _diWaterFlowWarning.Value;
  261. }
  262. }
  263. public bool IsPumpTempAlarm
  264. {
  265. get
  266. {
  267. return _diPumpTempAlarm != null && _diPumpTempAlarm.Value;
  268. }
  269. }
  270. public bool IsPumpOverloadAlarm
  271. {
  272. get
  273. {
  274. return _diOverloadAlarm != null && _diOverloadAlarm.Value;
  275. }
  276. }
  277. public double H2OSensorMassWarningThreshold
  278. {
  279. get
  280. {
  281. return _aiH2OSensorMassWarningThreshold == null ? 0 : _aiH2OSensorMassWarningThreshold.Value;
  282. }
  283. set
  284. {
  285. if (_scH2OSensorMassWarningThreshold == null)
  286. return;
  287. double result = value;
  288. result = Math.Max(_scH2OSensorMassWarningThreshold.RangeLowLimit, result);
  289. result = Math.Min(_scH2OSensorMassWarningThreshold.RangeUpLimit, result);
  290. _scH2OSensorMassWarningThreshold.Value = result;
  291. //_aoH2OSensorMassWarningThreshold.Value = (float)value;
  292. }
  293. }
  294. public double H2OSensorMassWarningTime
  295. {
  296. get
  297. {
  298. return _aiH2OSensorMassWarningTime == null ? 0 : _aiH2OSensorMassWarningTime.Value;
  299. }
  300. set
  301. {
  302. if (_scH2OSensorMassWarningTime == null)
  303. return;
  304. double result = value;
  305. result = Math.Max(_scH2OSensorMassWarningTime.RangeLowLimit, result);
  306. result = Math.Min(_scH2OSensorMassWarningTime.RangeUpLimit, result);
  307. _scH2OSensorMassWarningTime.Value = result;
  308. //_aoH2OSensorMassWarningTime.Value = (float) value;
  309. }
  310. }
  311. public double N2PurgeFlow
  312. {
  313. get
  314. {
  315. return _aiN2PurgeFlow == null ? 0 : _aiN2PurgeFlow.Value;
  316. }
  317. }
  318. public double N2PurgeFlowWarningThreshold
  319. {
  320. get
  321. {
  322. return _aiN2PurgeFlowWarningThreshold == null ? 0 : _aiN2PurgeFlowWarningThreshold.Value;
  323. }
  324. set
  325. {
  326. if (_scN2PurgeFlowWarning == null)
  327. return;
  328. double result = value;
  329. result = Math.Max(_scN2PurgeFlowWarning.RangeLowLimit, result);
  330. result = Math.Min(_scN2PurgeFlowWarning.RangeUpLimit, result);
  331. _scN2PurgeFlowWarning.Value = result;
  332. //_aoN2PurgeFlowWarning.Value = (float) value;
  333. }
  334. }
  335. public double N2PurgeFlowWarningTime
  336. {
  337. get
  338. {
  339. return _aiN2PurgeFlowWarningTime == null ? 0 : _aiN2PurgeFlowWarningTime.Value;
  340. }
  341. set
  342. {
  343. if (_scN2PurgeFlowWarningTime == null)
  344. return;
  345. double result = value;
  346. result = Math.Max(_scN2PurgeFlowWarningTime.RangeLowLimit, result);
  347. result = Math.Min(_scN2PurgeFlowWarningTime.RangeUpLimit, result);
  348. _scN2PurgeFlowWarningTime.Value = result;
  349. //_aoN2PurgeFlowWarningTime.Value = (float) value;
  350. }
  351. }
  352. public double ExhaustPressure
  353. {
  354. get
  355. {
  356. return _aiExhaustPressure == null ? 0 : _aiExhaustPressure.Value;
  357. }
  358. }
  359. public double ExhaustPressurePreWarningThreshold
  360. {
  361. get
  362. {
  363. return _aiExhaustPressurePreWarningThreshold == null ? 0 : _aiExhaustPressurePreWarningThreshold.Value;
  364. }
  365. set
  366. {
  367. if (_scExhaustPressurePreWarningThreshold == null)
  368. return;
  369. double result = value;
  370. result = Math.Max(_scExhaustPressurePreWarningThreshold.RangeLowLimit, result);
  371. result = Math.Min(_scExhaustPressurePreWarningThreshold.RangeUpLimit, result);
  372. _scExhaustPressurePreWarningThreshold.Value = result;
  373. //_aoExhaustPressurePreWarningThreshold.Value = (float) value;
  374. }
  375. }
  376. public double ExhaustPressurePreWarningTime
  377. {
  378. get
  379. {
  380. return _aiExhaustPressurePreWarningTime == null ? 0 : _aiExhaustPressurePreWarningTime.Value;
  381. }
  382. set
  383. {
  384. if (_scExhaustPressurePreWarningTime == null)
  385. return;
  386. double result = value;
  387. result = Math.Max(_scExhaustPressurePreWarningTime.RangeLowLimit, result);
  388. result = Math.Min(_scExhaustPressurePreWarningTime.RangeUpLimit, result);
  389. _scExhaustPressurePreWarningTime.Value = result;
  390. //_aoExhaustPressurePreWarningTime.Value = (float) value;
  391. }
  392. }
  393. public bool IsStartButtonPushed
  394. {
  395. get
  396. {
  397. return _diStart != null && _diStart.Value;
  398. }
  399. }
  400. public bool IsStopButtonPushed
  401. {
  402. get
  403. {
  404. return _diStop != null && _diStop.Value;
  405. }
  406. }
  407. private bool IsEnableWaterFlowAlarm = true;
  408. private DIAccessor _diRunning = null;
  409. private DIAccessor _diPumpTempWaring = null;
  410. private DIAccessor _diPumpN2FlowWarning = null;
  411. private DIAccessor _diPumpTempAlarm = null;
  412. private DIAccessor _diWaterFlowWarning = null;
  413. private DIAccessor _diOverloadAlarm;
  414. private DIAccessor _diPowerOn;
  415. private DIAccessor _diStart;
  416. private DIAccessor _diStop;
  417. private DIAccessor _diError;
  418. private DIAccessor _diWarning;
  419. private DIAccessor _diWaterFlowAlarm;
  420. private DIAccessor _diN2Warning;
  421. private DIAccessor _diN2Alarm;
  422. private DIAccessor _diExhaustPressureWarning;
  423. private DIAccessor _diExhaustPressureAlarm;
  424. private DIAccessor _diLogicWaterFlowAlarm;
  425. private DIAccessor _diLogicN2PressureAlarm;
  426. private DIAccessor _diLever1PumpCBAlarm;
  427. private DIAccessor _diROOTSPumpCBAlarm;
  428. private DOAccessor _doStart;
  429. private DOAccessor _doLocalRemote;
  430. private DOAccessor _doWarningReset;
  431. private DOAccessor _doWaterFlowAlarm;
  432. private DOAccessor _doN2PressureAlarm;
  433. private AOAccessor _aoH2OSensorMassWarningThreshold;
  434. private AOAccessor _aoH2OSensorMassWarningTime;
  435. private AOAccessor _aoN2PurgeFlowWarning;
  436. private AOAccessor _aoN2PurgeFlowWarningTime;
  437. private AOAccessor _aoExhaustPressurePreWarningThreshold;
  438. private AOAccessor _aoExhaustPressurePreWarningTime;
  439. private AOAccessor _aoWaterFlowAlarmMinValue;
  440. private AOAccessor _aoWaterFlowAlarmMaxValue;
  441. private AOAccessor _aoN2PressureAlarmMinValue;
  442. private AOAccessor _aoN2PressureAlarmMaxValue;
  443. private AIAccessor _aiWaterFlow;
  444. private AIAccessor _aiN2Pressure;
  445. private AIAccessor _aiH2OSensorMassWarningThreshold;
  446. private AIAccessor _aiH2OSensorMassWarningTime;
  447. private AIAccessor _aiN2PurgeFlow;
  448. private AIAccessor _aiN2PurgeFlowWarningThreshold;
  449. private AIAccessor _aiN2PurgeFlowWarningTime;
  450. private AIAccessor _aiExhaustPressure;
  451. private AIAccessor _aiExhaustPressurePreWarningThreshold;
  452. private AIAccessor _aiExhaustPressurePreWarningTime;
  453. private SCItem<double> _scH2OSensorMassWarningThreshold;
  454. private SCItem<double> _scH2OSensorMassWarningTime;
  455. private SCItem<double> _scN2PurgeFlowWarning;
  456. private SCItem<double> _scN2PurgeFlowWarningTime;
  457. private SCItem<double> _scExhaustPressurePreWarningThreshold;
  458. private SCItem<double> _scExhaustPressurePreWarningTime;
  459. private SCItem<bool> _scEnableWaterFlow;
  460. private SCItem<double> _scWaterFlowMinValue;
  461. private SCItem<double> _scWaterFlowMaxValue;
  462. private SCItem<double> _scWaterFlowOutOfToleranceWarningTime;
  463. private SCItem<double> _scWaterFlowOutOfToleranceAlarmTime;
  464. private SCItem<bool> _scEnableN2Pressure;
  465. private SCItem<double> _scN2PressureMinValue;
  466. private SCItem<double> _scN2PressureMaxValue;
  467. private SCItem<double> _scN2PressureOutOfToleranceWarningTime;
  468. private SCItem<double> _scN2PressureOutOfToleranceAlarmTime;
  469. private SCItem<bool> _scEnableDryPump;
  470. private R_TRIG _trigWarning = new R_TRIG();
  471. private R_TRIG _trigError = new R_TRIG();
  472. private R_TRIG _trigWaterFlowSensorWarning = new R_TRIG();
  473. private R_TRIG _trigWaterFlowSensorAlarm = new R_TRIG();
  474. private R_TRIG _trigN2Warning = new R_TRIG();
  475. private R_TRIG _trigN2Alarm = new R_TRIG();
  476. private R_TRIG _trigExhaustPressureWarning = new R_TRIG();
  477. private R_TRIG _trigExhaustPressureAlarm = new R_TRIG();
  478. private R_TRIG _trigLever1PumpCBAlarm=new R_TRIG();
  479. private R_TRIG _trigdiROOTSPumpCBAlarm = new R_TRIG();
  480. ToleranceChecker _checkN2PressureWarning = new ToleranceChecker();
  481. ToleranceChecker _checkN2PressureAlarm = new ToleranceChecker();
  482. ToleranceChecker _checkWaterFlowWarning = new ToleranceChecker();
  483. ToleranceChecker _checkWaterFlowAlarm = new ToleranceChecker();
  484. public IoPump(string module, XmlElement node)
  485. {
  486. base.Module = module;
  487. base.Name = node.GetAttribute("id");
  488. base.Display = node.GetAttribute("display");
  489. base.DeviceID = node.GetAttribute("schematicId");
  490. _diError = ParseDiNode("diAlarm", node);
  491. _diRunning = ParseDiNode("diRunning", node);
  492. _diWarning = ParseDiNode("diWarning", node);
  493. _diOverloadAlarm = ParseDiNode("diOverloadAlarm", node);
  494. _diPowerOn = ParseDiNode("diPowerOn", node);
  495. _diStart = ParseDiNode("diStart", node);
  496. _diStop = ParseDiNode("diStop", node);
  497. _diPumpTempWaring = ParseDiNode("diPumpTempWaring", node);
  498. _diPumpTempAlarm = ParseDiNode("diPumpTempAlarm", node);
  499. _diWaterFlowWarning = ParseDiNode("diWaterFlowWarning", node);
  500. _diWaterFlowAlarm = ParseDiNode("diWaterFlowAlarm", node);
  501. _diN2Warning = ParseDiNode("diN2Warning", node);
  502. _diN2Alarm = ParseDiNode("diN2Alarm", node);
  503. _diExhaustPressureWarning = ParseDiNode("diExhaustPressureWarning", node);
  504. _diExhaustPressureAlarm = ParseDiNode("diExhaustPressureAlarm", node);
  505. _diLogicWaterFlowAlarm = ParseDiNode("diLogicWaterFlowAlarm", node);
  506. _diLogicN2PressureAlarm = ParseDiNode("diLogicN2PressureAlarm", node);
  507. _diLever1PumpCBAlarm= ParseDiNode("diLever1PumpCBAlarm", node);
  508. _diROOTSPumpCBAlarm= ParseDiNode("diROOTSPumpCBAlarm", node);
  509. _doStart = ParseDoNode("doStartStop", node);
  510. _doLocalRemote = ParseDoNode("doLocalRemote", node);
  511. _doWarningReset = ParseDoNode("doReset", node);
  512. _doN2PressureAlarm = ParseDoNode("doN2PressureAlarm", node);
  513. _doWaterFlowAlarm = ParseDoNode("doWaterFlowAlarm", node);
  514. _aoH2OSensorMassWarningThreshold = ParseAoNode("aoH2OSensorMassWarningThreshold", node);
  515. _aoH2OSensorMassWarningTime = ParseAoNode("aoH2OSensorMassWarningTime", node);
  516. _aoN2PurgeFlowWarning = ParseAoNode("aoN2PurgeFlowWarning", node);
  517. _aoN2PurgeFlowWarningTime = ParseAoNode("aoN2PurgeFlowWarningTime", node);
  518. _aoExhaustPressurePreWarningThreshold = ParseAoNode("aoExhaustPressurePreWarningThreshold", node);
  519. _aoExhaustPressurePreWarningTime = ParseAoNode("aoExhaustPressurePreWarningTime", node);
  520. _aoWaterFlowAlarmMinValue = ParseAoNode("aoWaterFlowAlarmMinValue", node);
  521. _aoWaterFlowAlarmMaxValue = ParseAoNode("aoWaterFlowAlarmMaxValue", node);
  522. _aoN2PressureAlarmMinValue = ParseAoNode("aoN2PressureAlarmMinValue", node);
  523. _aoN2PressureAlarmMaxValue = ParseAoNode("aoN2PressureAlarmMaxValue", node);
  524. _aiWaterFlow = ParseAiNode("aiWaterFlow", node);
  525. _aiN2Pressure = ParseAiNode("aiN2Pressure", node);
  526. _aiH2OSensorMassWarningThreshold = ParseAiNode("aiH2OSensorMassWarningThreshold", node);
  527. _aiH2OSensorMassWarningTime = ParseAiNode("aiH2OSensorMassWarningTime", node);
  528. _aiN2PurgeFlow = ParseAiNode("aiN2PurgeFlow", node);
  529. _aiN2PurgeFlowWarningThreshold = ParseAiNode("aiN2PurgeFlowWarningThreshold", node);
  530. _aiN2PurgeFlowWarningTime = ParseAiNode("aiN2PurgeFlowWarningTime", node);
  531. _aiExhaustPressure = ParseAiNode("aiExhaustPressure", node);
  532. _aiExhaustPressurePreWarningThreshold = ParseAiNode("aiExhaustPressurePreWarningThreshold", node);
  533. _aiExhaustPressurePreWarningTime = ParseAiNode("aiExhaustPressurePreWarningTime", node);
  534. _scH2OSensorMassWarningThreshold = ParseScNodeDouble("scH2OSensorMassWarningThreshold", node);
  535. _scH2OSensorMassWarningTime = ParseScNodeDouble("scH2OSensorMassWarningTime", node);
  536. _scN2PurgeFlowWarning = ParseScNodeDouble("scN2PurgeFlowWarning", node);
  537. _scN2PurgeFlowWarningTime = ParseScNodeDouble("scN2PurgeFlowWarningTime", node);
  538. _scExhaustPressurePreWarningThreshold = ParseScNodeDouble("scExhaustPressurePreWarningThreshold", node);
  539. _scExhaustPressurePreWarningTime = ParseScNodeDouble("scExhaustPressurePreWarningTime", node);
  540. _scEnableDryPump = ParseScNodeBool("scEnableDryPump", node);
  541. _scEnableWaterFlow = ParseScNodeBool("scEnableWaterFlow", node);
  542. _scWaterFlowMinValue = ParseScNodeDouble("scWaterFlowMinValue", node);
  543. _scWaterFlowMaxValue = ParseScNodeDouble("scWaterFlowMaxValue", node);
  544. _scWaterFlowOutOfToleranceWarningTime = ParseScNodeDouble("scWaterFlowOutOfToleranceWarningTime", node);
  545. _scWaterFlowOutOfToleranceAlarmTime = ParseScNodeDouble("scWaterFlowOutOfToleranceAlarmTime", node);
  546. _scEnableN2Pressure = ParseScNodeBool("scEnableN2Pressure", node);
  547. _scN2PressureMinValue = ParseScNodeDouble("scN2PressureMinValue", node);
  548. _scN2PressureMaxValue = ParseScNodeDouble("scN2PressureMaxValue", node);
  549. _scN2PressureOutOfToleranceWarningTime = ParseScNodeDouble("scN2PressureOutOfToleranceWarningTime", node);
  550. _scN2PressureOutOfToleranceAlarmTime = ParseScNodeDouble("scN2PressureOutOfToleranceAlarmTime", node);
  551. }
  552. void SetConfigValue()
  553. {
  554. if (_aoWaterFlowAlarmMinValue != null && _scWaterFlowMinValue != null)
  555. _aoWaterFlowAlarmMinValue.Value = (float)_scWaterFlowMinValue.Value;
  556. if (_aoWaterFlowAlarmMaxValue != null && _scWaterFlowMaxValue != null)
  557. _aoWaterFlowAlarmMaxValue.Value = (float)_scWaterFlowMaxValue.Value;
  558. if (_aoN2PressureAlarmMinValue != null && _scN2PressureMinValue != null)
  559. _aoN2PressureAlarmMinValue.Value = (float)_scN2PressureMinValue.Value;
  560. if (_aoN2PressureAlarmMaxValue != null && _scN2PressureMaxValue != null)
  561. _aoN2PressureAlarmMaxValue.Value = (float)_scN2PressureMaxValue.Value;
  562. }
  563. public bool Initialize()
  564. {
  565. IsEnableWaterFlowAlarm = true;
  566. SetConfigValue();
  567. DATA.Subscribe(string.Format("Device.{0}.{1}", Module, Name), () => {
  568. AITPumpData data = new AITPumpData() {
  569. DeviceName = Name,
  570. DeviceSchematicId = DeviceID,
  571. DisplayName = Display,
  572. IsError = HasError,
  573. IsWarning = HasWarning,
  574. IsOn = IsRunning,
  575. WaterFlow = WaterFlowValue,
  576. IsDryPumpEnable = IsDryPumpEnabled,
  577. IsN2PressureEnable = EnableN2Pressure,
  578. IsWaterFlowEnable = EnableWaterFlow,
  579. WaterFlowWarning = WaterFlowWarning,
  580. WaterFlowAlarm = WaterFlowAlarm,
  581. N2PressureAlarm = N2PressureAlarm,
  582. N2PressureWarning = N2PressureWarning,
  583. };
  584. return data;
  585. }, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  586. DEVICE.Register(String.Format("{0}.{1}", Name, AITPumpOperation.WaterFlowAlarm), (out string reason, int time, object[] param) =>
  587. {
  588. reason = "";
  589. bool isOn = Convert.ToBoolean(param[0]);
  590. IsEnableWaterFlowAlarm = isOn;
  591. return true;
  592. });
  593. DEVICE.Register(String.Format("{0}.{1}", Name, AITPumpOperation.SetOnOff), (out string reason, int time, object[] param) => {
  594. bool isOn = Convert.ToBoolean((string)param[0]);
  595. if (IsError)
  596. {
  597. reason = string.Format("Pump is in error state, reset before turn {0}", isOn ? "ON" : "OFF");
  598. return false;
  599. }
  600. reason = string.Empty;
  601. if (_doStart != null)
  602. {
  603. _doStart.Value = isOn;
  604. }
  605. else
  606. {
  607. reason = string.Format("Pump designed for using in manual control mode, can not turn {0}", isOn ? "ON" : "OFF");
  608. return false;
  609. }
  610. return true;
  611. });
  612. return true;
  613. }
  614. public void Terminate()
  615. {
  616. }
  617. void MonitorN2Pressure()
  618. {
  619. if (!IsDryPumpEnabled)
  620. return;
  621. if (!EnableN2Pressure)
  622. return;
  623. //_checkN2PressureWarning.Monitor(N2PressureValue, N2PressureMinValue, N2PressureMaxValue, N2PressureWarningTime);
  624. //if (_checkN2PressureWarning.Trig)
  625. //{
  626. // EV.PostMessage(Module, EventEnum.DefaultWarning, string.Format("{0} N2 pressure out of tolerance [{1}, {2}] for {3} seconds", Display, N2PressureMinValue, N2PressureMaxValue, N2PressureWarningTime));
  627. //}
  628. //_checkN2PressureAlarm.Monitor(N2PressureValue, N2PressureMinValue, N2PressureMaxValue, N2PressureAlarmTime);
  629. //if (_checkN2PressureAlarm.Trig)
  630. //{
  631. // EV.PostMessage(Module, EventEnum.DefaultAlarm, string.Format("{0} N2 pressure out of tolerance [{1}, {2}] for {3} seconds", Display, N2PressureMinValue, N2PressureMaxValue, N2PressureAlarmTime));
  632. //}
  633. if (_diLogicN2PressureAlarm != null)
  634. _diLogicN2PressureAlarm.RawData = N2PressureAlarm;
  635. N2PressureAlarmSetPoint = N2PressureAlarm;
  636. }
  637. void MonitorWaterFlow()
  638. {
  639. if (!IsDryPumpEnabled)
  640. return;
  641. if (!EnableWaterFlow)
  642. return;
  643. _checkWaterFlowWarning.Monitor(WaterFlowValue, WaterFlowMinValue, WaterFlowMaxValue, WaterFlowWarningTime);
  644. if (_checkWaterFlowWarning.Trig)
  645. {
  646. EV.PostMessage(Module, EventEnum.DefaultWarning, string.Format("{0} Cooling Water Flow Out Of Tolerance [{1}, {2}] for {3} seconds", Display, WaterFlowMinValue, WaterFlowMaxValue, WaterFlowWarningTime));
  647. }
  648. _checkWaterFlowAlarm.Monitor(WaterFlowValue, WaterFlowMinValue, WaterFlowMaxValue, WaterFlowAlarmTime);
  649. if (_checkWaterFlowAlarm.Trig)
  650. {
  651. EV.PostMessage(Module, EventEnum.DefaultAlarm, string.Format("{0} Cooling Water Flow Out Of Tolerance [{1}, {2}] for {3} seconds", Display, WaterFlowMinValue, WaterFlowMaxValue, WaterFlowAlarmTime));
  652. }
  653. if (_diLogicWaterFlowAlarm != null)
  654. _diLogicWaterFlowAlarm.RawData = WaterFlowAlarm;
  655. WaterFlowAlarmSetPoint = WaterFlowAlarm;
  656. }
  657. public void Monitor()
  658. {
  659. try
  660. {
  661. SetConfigValue();
  662. //MonitorN2Pressure();
  663. //MonitorWaterFlow();
  664. if (_scH2OSensorMassWarningThreshold != null && _aoH2OSensorMassWarningThreshold != null)
  665. _aoH2OSensorMassWarningThreshold.Value = (float)_scH2OSensorMassWarningThreshold.Value;
  666. if (_scH2OSensorMassWarningTime != null && _aoH2OSensorMassWarningTime != null)
  667. _aoH2OSensorMassWarningTime.Value = (float)_scH2OSensorMassWarningTime.Value;
  668. if (_scN2PurgeFlowWarning != null && _aoN2PurgeFlowWarning != null)
  669. _aoN2PurgeFlowWarning.Value = (float)_scN2PurgeFlowWarning.Value;
  670. if (_scN2PurgeFlowWarningTime != null && _aoN2PurgeFlowWarningTime != null)
  671. _aoN2PurgeFlowWarningTime.Value = (float)_scN2PurgeFlowWarningTime.Value;
  672. if (_scExhaustPressurePreWarningThreshold != null && _aoExhaustPressurePreWarningThreshold != null)
  673. _aoExhaustPressurePreWarningThreshold.Value = (float)_scExhaustPressurePreWarningThreshold.Value;
  674. if (_scExhaustPressurePreWarningTime != null && _aoExhaustPressurePreWarningTime != null)
  675. _aoExhaustPressurePreWarningTime.Value = (float)_scExhaustPressurePreWarningTime.Value;
  676. _trigWarning.CLK = IsWarning;
  677. if (_trigWarning.Q)
  678. {
  679. EV.PostMessage(Module, EventEnum.DefaultWarning, "Dry Pump Warning");
  680. }
  681. _trigError.CLK = IsError;
  682. if (_trigError.Q)
  683. {
  684. EV.PostMessage(Module, EventEnum.DefaultAlarm, "Dry Pump Error");
  685. }
  686. _trigWaterFlowSensorWarning.CLK = _diWaterFlowWarning != null && _diWaterFlowWarning.Value;
  687. if (_trigWaterFlowSensorWarning.Q)
  688. {
  689. EV.PostMessage(Module, EventEnum.DefaultWarning, "Dry Pump water flow warning");
  690. }
  691. _trigWaterFlowSensorAlarm.CLK = _diWaterFlowAlarm != null && _diWaterFlowAlarm.Value && IsEnableWaterFlowAlarm;
  692. if (_trigWaterFlowSensorAlarm.Q)
  693. {
  694. EV.PostMessage(Module, EventEnum.DefaultAlarm, "Dry Pump water flow alarm");
  695. }
  696. _trigN2Warning.CLK = _diN2Warning != null && _diN2Warning.Value;
  697. if (_trigN2Warning.Q)
  698. {
  699. EV.PostMessage(Module, EventEnum.DefaultWarning, "Dry Pump N2 flow warning");
  700. }
  701. _trigN2Alarm.CLK = _diN2Alarm != null && _diN2Alarm.Value;
  702. if (_trigN2Alarm.Q)
  703. {
  704. EV.PostMessage(Module, EventEnum.DefaultAlarm, "Dry Pump N2 flow alarm");
  705. }
  706. _trigExhaustPressureWarning.CLK = _diExhaustPressureWarning != null && _diExhaustPressureWarning.Value;
  707. if (_trigExhaustPressureWarning.Q)
  708. {
  709. EV.PostMessage(Module, EventEnum.DefaultWarning, "Dry Pump exhaust pressure warning");
  710. }
  711. _trigExhaustPressureAlarm.CLK = _diExhaustPressureAlarm != null && _diExhaustPressureAlarm.Value;
  712. if (_trigExhaustPressureAlarm.Q)
  713. {
  714. EV.PostMessage(Module, EventEnum.DefaultAlarm, "Dry Pump exhaust pressure alarm");
  715. }
  716. //_trigLever1PumpCBAlarm.CLK = _diLever1PumpCBAlarm != null && _diLever1PumpCBAlarm.Value;
  717. //if (_trigLever1PumpCBAlarm.Q)
  718. //{
  719. // EV.PostMessage(Module, EventEnum.DefaultAlarm, "Lever1 Pump CB Alarm");
  720. //}
  721. _trigLever1PumpCBAlarm.CLK = _diLever1PumpCBAlarm != null && _diLever1PumpCBAlarm.Value;
  722. if (_trigLever1PumpCBAlarm.Q)
  723. {
  724. EV.PostMessage(Module, EventEnum.DefaultAlarm, "Lever1 Pump Circuit Broaker Trip Alarm");
  725. }
  726. _trigdiROOTSPumpCBAlarm.CLK=_diROOTSPumpCBAlarm != null && _diROOTSPumpCBAlarm.Value;
  727. if (_trigdiROOTSPumpCBAlarm.Q)
  728. {
  729. EV.PostMessage(Module, EventEnum.DefaultAlarm, "Roots Pump Circuit Broaker Trip Alarm");
  730. }
  731. }
  732. catch (Exception ex)
  733. {
  734. LOG.Write(ex);
  735. }
  736. }
  737. public void Reset()
  738. {
  739. if ((IsWarning || IsError) && _doWarningReset != null)
  740. _doWarningReset.Value = true;
  741. _trigWarning.RST = true;
  742. _trigError.RST = true;
  743. _trigWaterFlowSensorWarning.RST = true;
  744. _trigWaterFlowSensorAlarm.RST = true;
  745. _trigdiROOTSPumpCBAlarm.RST = true;
  746. _trigN2Warning.RST = true;
  747. _trigN2Alarm.RST = true;
  748. _trigExhaustPressureWarning.RST = true;
  749. _trigExhaustPressureAlarm.RST = true;
  750. _checkN2PressureAlarm.RST = true;
  751. _checkN2PressureWarning.RST = true;
  752. _checkWaterFlowAlarm.RST = true;
  753. _checkWaterFlowWarning.RST = true;
  754. _trigLever1PumpCBAlarm.RST = true;
  755. }
  756. }
  757. }