VpwMainDevice.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490
  1. using Aitex.Core.RT.DataCenter;
  2. using Aitex.Core.RT.Device;
  3. using Aitex.Core.RT.Log;
  4. using Aitex.Core.RT.OperationCenter;
  5. using Aitex.Core.RT.SCCore;
  6. using Aitex.Core.Util;
  7. using MECF.Framework.Common.Beckhoff.ModuleIO;
  8. using MECF.Framework.Common.CommonData.Prewet;
  9. using MECF.Framework.Common.CommonData.Vpw;
  10. using MECF.Framework.Common.IOCore;
  11. using MECF.Framework.Common.Persistent.Prewet;
  12. using MECF.Framework.Common.Persistent.VpwMain;
  13. using System;
  14. using System.Collections.Generic;
  15. using System.Linq;
  16. using System.Reflection;
  17. using System.Text;
  18. using System.Threading.Tasks;
  19. namespace PunkHPX8_RT.Devices.VpwMain
  20. {
  21. public class VpwMainDevice : BaseDevice, IDevice
  22. {
  23. #region 常量
  24. private const string COMMON_DATA = "CommonData1";
  25. private const string PERSISTENT_VALUE = "CommonData";
  26. private const string CHAMBER_CLOSED = "ChamberClosed";
  27. private const string CHAMBER_OPENED = "ChamberOpened";
  28. private const string CHAMBER_CLOSE = "ChamberClose";
  29. private const string LEAK_DETECTED = "LeakDetected";
  30. private const string VACUUM_PUMP_PRESSURE = "VacuumPumpPressure";
  31. private const string VACUUM_PUMP_POWER = "VacuumPumpPower";
  32. private const string VACUUM_PUMP_ENABLE = "VacuumPumpEnable";
  33. private const string VACUUM_PUMP_SPEED_ENABLE = "VacuumPumpSpeedEnable";
  34. private const string VACUUM_PUMP_SPEED = "VacuumPumpSpeed";
  35. private const string BOOSTER_PUMP_SPEED = "BoosterPumpSpeed";
  36. private const string BOOSTER_PUMP_CURRENT = "BoosterPumpCurrent";
  37. private const string BOOSTER_PUMP_ENABLE = "BoosterPumpEnable";
  38. private const string BOOSTER_PUMP_STATUS = "BoosterPumpStatus";
  39. private const string DIW_ENABLE = "DiwEnable";
  40. private const string DIW_PROCESS = "DiwProcess";
  41. private const string DIW_DEGAS = "DiwDegas";
  42. private const string DIW_TOTAL_FLOW = "DiwTotalFlow";
  43. private const string DIW_PRESSURE = "DiwPressure";
  44. private const string DEGAS_ADJUST = "DegasAdjust";
  45. private const string DEGAS_PURGE = "DegasPurge";
  46. private const string DEGAS_PUMP_ENABLE = "DegasPumpEnable";
  47. private const string DEGAS_PUMP_PRESSURE = "DegasPumpPressure";
  48. #endregion
  49. #region 内部变量
  50. /// <summary>
  51. /// 变量是否初始化字典
  52. /// </summary>
  53. private Dictionary<string, bool> _variableInitializeDic = new Dictionary<string, bool>();
  54. /// <summary>
  55. /// 数据
  56. /// </summary>
  57. private VpwMainCommonData _commonData=new VpwMainCommonData();
  58. /// <summary>
  59. /// 持久性数值
  60. /// </summary>
  61. private VpwMainPersistentValue _persistentValue;
  62. /// <summary>
  63. /// 上一次Booster泵速
  64. /// </summary>
  65. private short _lastBoosterPumpSpeed = 0;
  66. /// <summary>
  67. /// 定时器任务
  68. /// </summary>
  69. private PeriodicJob _periodicJob;
  70. #endregion
  71. #region 属性
  72. /// <summary>
  73. /// 数据
  74. /// </summary>
  75. public VpwMainCommonData CommonData { get { return _commonData; } }
  76. #endregion
  77. /// <summary>
  78. /// 构造函数
  79. /// </summary>
  80. /// <param name="moduleName"></param>
  81. public VpwMainDevice(string moduleName) : base(moduleName, moduleName, moduleName, moduleName)
  82. {
  83. }
  84. #region 初始化
  85. /// <summary>
  86. /// 初始化
  87. /// </summary>
  88. /// <returns></returns>
  89. public bool Initialize()
  90. {
  91. InitializeParameter();
  92. InitializeRoutine();
  93. SubscribeData();
  94. SubscribeValueAction();
  95. InitializeOperation();
  96. return true;
  97. }
  98. /// <summary>
  99. /// 初始化参数
  100. /// </summary>
  101. private void InitializeParameter()
  102. {
  103. _persistentValue = VpwMainPersistentManager.Instance.GetPersistentValue(Module);
  104. if (_persistentValue != null)
  105. {
  106. _lastBoosterPumpSpeed = _persistentValue.Speed;
  107. }
  108. else
  109. {
  110. LOG.WriteLog(eEvent.ERR_PREWET, Module, "Persistent Value Object is not exist");
  111. }
  112. _commonData.BoosterPumpPressureData = new MECF.Framework.Common.CommonData.CommonLimitData();
  113. }
  114. /// <summary>
  115. /// 初始化Routine
  116. /// </summary>
  117. private void InitializeRoutine()
  118. {
  119. }
  120. /// <summary>
  121. /// 订阅
  122. /// </summary>
  123. private void SubscribeData()
  124. {
  125. DATA.Subscribe($"{Module}.{PERSISTENT_VALUE}", () => null, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  126. DATA.Subscribe($"{Module}.{COMMON_DATA}", () => CommonData, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  127. }
  128. /// <summary>
  129. /// 订阅数据
  130. /// </summary>
  131. private void SubscribeValueAction()
  132. {
  133. IoSubscribeUpdateVariable(CHAMBER_CLOSED);
  134. IoSubscribeUpdateVariable(CHAMBER_OPENED);
  135. IoSubscribeUpdateVariable(BOOSTER_PUMP_STATUS);
  136. IoSubscribeUpdateVariable(BOOSTER_PUMP_SPEED);
  137. IoSubscribeUpdateVariable(BOOSTER_PUMP_ENABLE);
  138. IoSubscribeUpdateVariable(BOOSTER_PUMP_CURRENT);
  139. IoSubscribeUpdateVariable(DEGAS_PURGE);
  140. IoSubscribeUpdateVariable(DEGAS_ADJUST);
  141. IoSubscribeUpdateVariable(DEGAS_PUMP_ENABLE);
  142. IoSubscribeUpdateVariable(DIW_ENABLE);
  143. IoSubscribeUpdateVariable(DIW_PROCESS);
  144. IoSubscribeUpdateVariable(DIW_PRESSURE);
  145. IoSubscribeUpdateVariable(DIW_DEGAS);
  146. IoSubscribeUpdateVariable(DIW_TOTAL_FLOW);
  147. IoSubscribeUpdateVariable(VACUUM_PUMP_ENABLE);
  148. IoSubscribeUpdateVariable(VACUUM_PUMP_POWER);
  149. IoSubscribeUpdateVariable(VACUUM_PUMP_PRESSURE);
  150. IoSubscribeUpdateVariable(VACUUM_PUMP_SPEED);
  151. IoSubscribeUpdateVariable(VACUUM_PUMP_SPEED_ENABLE);
  152. IoSubscribeUpdateVariable(LEAK_DETECTED);
  153. }
  154. /// <summary>
  155. /// 初始化变量
  156. /// </summary>
  157. /// <param name="variable"></param>
  158. private void IoSubscribeUpdateVariable(string variable)
  159. {
  160. _variableInitializeDic[variable] = false;
  161. IOModuleManager.Instance.SubscribeModuleVariable(Module, variable, UpdateVariableValue);
  162. }
  163. /// <summary>
  164. /// 更新变量数值
  165. /// </summary>
  166. /// <param name="variable"></param>
  167. /// <param name="value"></param>
  168. private void UpdateVariableValue(string variable, object value)
  169. {
  170. PropertyInfo property = _commonData.GetType().GetProperty(variable);
  171. if (property != null)
  172. {
  173. property.SetValue(_commonData, value);
  174. }
  175. if (_variableInitializeDic.ContainsKey(variable) && !_variableInitializeDic[variable])
  176. {
  177. _variableInitializeDic[variable] = true;
  178. }
  179. switch (variable)
  180. {
  181. case BOOSTER_PUMP_STATUS:
  182. string statusContent = _commonData.BoosterPumpStatus ? "On" : "Off";
  183. _commonData.BoosterPumpStatusContent = $"{_commonData.BoosterPumpModel}: {statusContent}";
  184. break;
  185. case DIW_PRESSURE:
  186. if (double.TryParse(value.ToString(), out var pressure))
  187. {
  188. _commonData.BoosterPumpPressureData.Value = pressure;
  189. }
  190. break;
  191. }
  192. }
  193. /// <summary>
  194. /// 初始化OP
  195. /// </summary>
  196. private void InitializeOperation()
  197. {
  198. OP.Subscribe($"{Module}.VacuumPumpPowerOn", (cmd,para)=> { return VacuumPumpPowerOn(); });
  199. OP.Subscribe($"{Module}.VacuumPumpPowerOff", (cmd, para) => { return VacuumPumpPowerOff(); });
  200. OP.Subscribe($"{Module}.VacuumPumpEnable", (cmd, para) => { return VacuumPumpEnable(); });
  201. OP.Subscribe($"{Module}.VacuumPumpDisable", (cmd, para) => { return VacuumPumpDisable(); });
  202. OP.Subscribe($"{Module}.VacuumPumpSpeedEnable", (cmd, para) => { return VacuumSpeedEnable(); });
  203. OP.Subscribe($"{Module}.VacuumPumpSpeedDisable", (cmd, para) => { return VacuumSpeedDisable(); });
  204. OP.Subscribe($"{Module}.VacuumPumpSpeed", (cmd, para) => { return BoosterPumpSpeedKeyDownOperation(cmd, para); });
  205. OP.Subscribe($"{Module}.DegasPumpEnable", (cmd, para) => { return DegasPumpEnable(); });
  206. OP.Subscribe($"{Module}.DegasPumpDisable", (cmd, para) => { return DegasPumpDisable(); });
  207. OP.Subscribe($"{Module}.DegasAdjustOn", (cmd, para) => { return DegasAdjustOn(); });
  208. OP.Subscribe($"{Module}.DegasAdjustOff", (cmd, para) => { return DegasAdjustOff(); });
  209. OP.Subscribe($"{Module}.DiwDegasValveOn", (cmd, para) => { return DiwDegasValveOn(); });
  210. OP.Subscribe($"{Module}.DiwDegasValveOff", (cmd, para) => { return DiwDegasValveOff(); });
  211. OP.Subscribe($"{Module}.BoosterPumpEnable", (cmd, para) => { return BoosterPumpEnable(); });
  212. OP.Subscribe($"{Module}.BoosterPumpDisable", (cmd, para) => { return BoosterPumpDisable(); });
  213. OP.Subscribe($"{Module}.BoosterPumpSpeed", (cmd, para) => {
  214. short speed = short.Parse(para[0].ToString());
  215. return BoosterPumpSpeed(speed);
  216. });
  217. OP.Subscribe($"{Module}.ChamberUp", (cmd, para) => { return ChamberUp(); });
  218. OP.Subscribe($"{Module}.ChamberDown", (cmd, para) => { return ChamberDown(); });
  219. OP.Subscribe($"{Module}.BoosterPumpSpeedAuto", (cmd, para) => { return BoosterPumpSpeedAutoOperation(); });
  220. OP.Subscribe($"{Module}.BoosterPumpSpeedManual", (cmd, para) => { return BoosterPumpSpeedManualOperation(); });
  221. }
  222. #endregion
  223. #region Action
  224. #region Vacum Pump
  225. /// <summary>
  226. /// Pump Power On
  227. /// </summary>
  228. /// <returns></returns>
  229. public bool VacuumPumpPowerOn()
  230. {
  231. return WriteVariableValue(VACUUM_PUMP_POWER, true);
  232. }
  233. /// <summary>
  234. /// Pump Power Off
  235. /// </summary>
  236. /// <returns></returns>
  237. public bool VacuumPumpPowerOff()
  238. {
  239. return WriteVariableValue(VACUUM_PUMP_POWER, false);
  240. }
  241. /// <summary>
  242. /// Pump Enable
  243. /// </summary>
  244. /// <returns></returns>
  245. public bool VacuumPumpEnable()
  246. {
  247. return WriteVariableValue(VACUUM_PUMP_ENABLE, true);
  248. }
  249. /// <summary>
  250. /// Pump Disable
  251. /// </summary>
  252. /// <returns></returns>
  253. public bool VacuumPumpDisable()
  254. {
  255. return WriteVariableValue(VACUUM_PUMP_ENABLE, false);
  256. }
  257. /// <summary>
  258. /// Speed Enable
  259. /// </summary>
  260. /// <returns></returns>
  261. public bool VacuumSpeedEnable()
  262. {
  263. return WriteVariableValue(VACUUM_PUMP_SPEED_ENABLE, true);
  264. }
  265. /// <summary>
  266. /// Speed disable
  267. /// </summary>
  268. /// <returns></returns>
  269. public bool VacuumSpeedDisable()
  270. {
  271. return WriteVariableValue(VACUUM_PUMP_SPEED_ENABLE, false);
  272. }
  273. /// <summary>
  274. /// 写入速度
  275. /// </summary>
  276. /// <param name="speed"></param>
  277. /// <returns></returns>
  278. public bool WriteVacuumSpeed(short speed)
  279. {
  280. return WriteVariableValue(VACUUM_PUMP_SPEED, speed);
  281. }
  282. #endregion
  283. #region Degas Pump
  284. /// <summary>
  285. /// Degas Pump Enable
  286. /// </summary>
  287. /// <returns></returns>
  288. public bool DegasPumpEnable()
  289. {
  290. return WriteVariableValue(DEGAS_PUMP_ENABLE, true);
  291. }
  292. /// <summary>
  293. /// Degas Pump disable
  294. /// </summary>
  295. /// <returns></returns>
  296. public bool DegasPumpDisable()
  297. {
  298. return WriteVariableValue(DEGAS_PUMP_ENABLE, false);
  299. }
  300. /// <summary>
  301. /// Degas Adjust On
  302. /// </summary>
  303. /// <returns></returns>
  304. private bool DegasAdjustOn()
  305. {
  306. return WriteVariableValue(DEGAS_ADJUST, true);
  307. }
  308. /// <summary>
  309. /// Degas Adjust Off
  310. /// </summary>
  311. /// <returns></returns>
  312. private bool DegasAdjustOff()
  313. {
  314. return WriteVariableValue(DEGAS_ADJUST, false);
  315. }
  316. /// <summary>
  317. /// DIW Degas Valve On
  318. /// </summary>
  319. /// <returns></returns>
  320. private bool DiwDegasValveOn()
  321. {
  322. return WriteVariableValue(DIW_DEGAS, true);
  323. }
  324. /// <summary>
  325. /// DIW Degas Valve Off
  326. /// </summary>
  327. /// <returns></returns>
  328. private bool DiwDegasValveOff()
  329. {
  330. return WriteVariableValue(DIW_DEGAS, false);
  331. }
  332. #endregion
  333. #region Booster Pump
  334. /// <summary>
  335. /// Booster Pump enable
  336. /// </summary>
  337. /// <returns></returns>
  338. public bool BoosterPumpEnable()
  339. {
  340. return WriteVariableValue(BOOSTER_PUMP_ENABLE, true);
  341. }
  342. /// <summary>
  343. /// Booster Pump Disable
  344. /// </summary>
  345. /// <returns></returns>
  346. public bool BoosterPumpDisable()
  347. {
  348. return WriteVariableValue(BOOSTER_PUMP_ENABLE, false);
  349. }
  350. /// <summary>
  351. /// 写入Booster泵速
  352. /// </summary>
  353. /// <param name="speed"></param>
  354. /// <returns></returns>
  355. public bool BoosterPumpSpeed(short speed)
  356. {
  357. return WriteVariableValue(BOOSTER_PUMP_SPEED, speed);
  358. }
  359. /// Booster Pump Speed回车操作
  360. /// </summary>
  361. /// <param name="cmd"></param>
  362. /// <param name="param"></param>
  363. /// <returns></returns>
  364. private bool BoosterPumpSpeedKeyDownOperation(string cmd, object[] param)
  365. {
  366. if (_commonData.BoosterPumpSpeedAuto)
  367. {
  368. LOG.WriteLog(eEvent.ERR_PREWET, Module, "Pump speed is auto,cannot change speed");
  369. return false;
  370. }
  371. short speed = (short)param[0];
  372. bool result = BoosterPumpSpeed(speed);
  373. if (result)
  374. {
  375. _persistentValue.Speed = speed;
  376. _lastBoosterPumpSpeed = speed;
  377. PrewetPersistentManager.Instance.UpdatePersistentValue(Module);
  378. }
  379. return true;
  380. }
  381. #endregion
  382. #region Chamber
  383. /// <summary>
  384. /// 上升
  385. /// </summary>
  386. /// <returns></returns>
  387. public bool ChamberUp()
  388. {
  389. return WriteVariableValue(CHAMBER_CLOSE, false);
  390. }
  391. /// <summary>
  392. /// 下降
  393. /// </summary>
  394. /// <returns></returns>
  395. public bool ChamberDown()
  396. {
  397. return WriteVariableValue(CHAMBER_CLOSE, true);
  398. }
  399. /// <summary>
  400. /// Pump Speed手动模式
  401. /// </summary>
  402. /// <param name="cmd"></param>
  403. /// <param name="param"></param>
  404. /// <returns></returns>
  405. private bool BoosterPumpSpeedManualOperation()
  406. {
  407. _commonData.BoosterPumpSpeedAuto = true;
  408. _commonData.BoosterPumpModel = "Manual";
  409. string statusContent = _commonData.BoosterPumpStatus ? "On" : "Off";
  410. _commonData.BoosterPumpStatusContent = $"{_commonData.BoosterPumpModel}: {statusContent}";
  411. return true;
  412. }
  413. /// <summary>
  414. /// Pump Speed自动模式
  415. /// </summary>
  416. /// <param name="cmd"></param>
  417. /// <param name="param"></param>
  418. /// <returns></returns>
  419. private bool BoosterPumpSpeedAutoOperation()
  420. {
  421. _commonData.BoosterPumpSpeedAuto = true;
  422. _commonData.BoosterPumpModel = "Auto";
  423. string statusContent = _commonData.BoosterPumpStatus ? "On" : "Off";
  424. _commonData.BoosterPumpStatusContent = $"{_commonData.BoosterPumpModel}: {statusContent}";
  425. return true;
  426. }
  427. #endregion
  428. /// <summary>
  429. /// 写变量
  430. /// </summary>
  431. /// <param name="variable"></param>
  432. /// <param name="value"></param>
  433. /// <returns></returns>
  434. private bool WriteVariableValue(string variable, object value)
  435. {
  436. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{variable}");
  437. return IOModuleManager.Instance.WriteIoValue(ioName, value);
  438. }
  439. #endregion
  440. /// <summary>
  441. /// 定时器
  442. /// </summary>
  443. /// <returns></returns>
  444. public bool OnTimer()
  445. {
  446. _commonData.BoosterPumpPressureData.MinError = SC.GetValue<double>($"VPWMain.PumpPressure.Error_Min");
  447. _commonData.BoosterPumpPressureData.MinWarning = SC.GetValue<double>($"VPWMain.PumpPressure.Warning_Min");
  448. _commonData.BoosterPumpPressureData.MaxError = SC.GetValue<double>($"VPWMain.PumpPressure.Error_Max");
  449. _commonData.BoosterPumpPressureData.MaxWarning = SC.GetValue<double>($"VPWMain.PumpPressure.Warning_Max");
  450. _commonData.PressureTarget = SC.GetValue<double>($"VPWMain.PressureTarget");
  451. return true;
  452. }
  453. /// <summary>
  454. /// 监控
  455. /// </summary>
  456. public void Monitor()
  457. {
  458. }
  459. public void Reset()
  460. {
  461. }
  462. public void Terminate()
  463. {
  464. }
  465. }
  466. }