VpwMainDevice.cs 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835
  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.Routine;
  6. using Aitex.Core.RT.SCCore;
  7. using Aitex.Core.Util;
  8. using MECF.Framework.Common.Algorithm;
  9. using MECF.Framework.Common.Beckhoff.ModuleIO;
  10. using MECF.Framework.Common.CommonData.Prewet;
  11. using MECF.Framework.Common.CommonData.Vpw;
  12. using MECF.Framework.Common.IOCore;
  13. using MECF.Framework.Common.Persistent.Prewet;
  14. using MECF.Framework.Common.Persistent.VpwMain;
  15. using PunkHPX8_Core;
  16. using PunkHPX8_RT.Modules;
  17. using PunkHPX8_RT.Modules.VpwMain;
  18. using System;
  19. using System.Collections.Generic;
  20. using System.Linq;
  21. using System.Net.NetworkInformation;
  22. using System.Reflection;
  23. using System.Text;
  24. using System.Threading.Tasks;
  25. namespace PunkHPX8_RT.Devices.VpwMain
  26. {
  27. public class VpwMainDevice : BaseDevice, IDevice
  28. {
  29. #region 常量
  30. private const string COMMON_DATA = "CommonData";
  31. private const string PERSISTENT_VALUE = "PersistentValue";
  32. private const string CHAMBER_CLOSED = "ChamberClosed";
  33. private const string CHAMBER_OPENED = "ChamberOpened";
  34. private const string CHAMBER_CLOSE = "ChamberClose";
  35. private const string LEAK_DETECTED = "LeakDetected";
  36. private const string VACUUM_PUMP_PRESSURE = "VacuumPumpPressure";
  37. private const string VACUUM_PUMP_POWER = "VacuumPumpPower";
  38. private const string VACUUM_PUMP_ENABLE = "VacuumPumpEnable";
  39. private const string VACUUM_PUMP_SPEED_ENABLE = "VacuumPumpSpeedEnable";
  40. private const string VACUUM_PUMP_SPEED = "VacuumPumpSpeed";
  41. private const string BOOSTER_PUMP_SPEED = "BoosterPumpSpeed";
  42. private const string BOOSTER_PUMP_CURRENT = "BoosterPumpCurrent";
  43. private const string BOOSTER_PUMP_ENABLE = "BoosterPumpEnable";
  44. private const string BOOSTER_PUMP_STATUS = "BoosterPumpStatus";
  45. private const string DIW_ENABLE = "DiwEnable";
  46. private const string DIW_PROCESS = "DiwProcess";
  47. private const string DIW_DEGAS = "DiwDegas";
  48. private const string DIW_TOTAL_FLOW = "DiwTotalFlow";
  49. private const string DIW_PRESSURE = "DiwPressure";
  50. private const string DEGAS_ADJUST = "DegasAdjust";
  51. private const string DEGAS_PURGE = "DegasPurge";
  52. private const string DEGAS_PUMP_ENABLE = "DegasPumpEnable";
  53. private const string DEGAS_PUMP_PRESSURE = "DegasPumpPressure";
  54. #endregion
  55. private enum VPWOperation
  56. {
  57. None,
  58. PumpEnable,
  59. PumpDisable
  60. }
  61. #region 内部变量
  62. /// <summary>
  63. /// 变量是否初始化字典
  64. /// </summary>
  65. private Dictionary<string, bool> _variableInitializeDic = new Dictionary<string, bool>();
  66. /// <summary>
  67. /// 数据
  68. /// </summary>
  69. private VpwMainCommonData _commonData=new VpwMainCommonData();
  70. /// <summary>
  71. /// 持久性数值
  72. /// </summary>
  73. private VpwMainPersistentValue _vpwMainPersistentValue;
  74. /// <summary>
  75. /// Pump Enable routine
  76. /// </summary>
  77. private BoosterPumpEnableRoutine _boosterPumpEnableRoutine;
  78. /// <summary>
  79. /// Pump Disable routine
  80. /// </summary>
  81. private BoosterPumpDisableRoutine _boosterPumpDisableRoutine;
  82. /// <summary>
  83. /// 上一次Booster泵速
  84. /// </summary>
  85. private short _lastBoosterPumpSpeed = 0;
  86. /// <summary>
  87. /// 定时器任务
  88. /// </summary>
  89. private PeriodicJob _periodicJob;
  90. /// <summary>
  91. /// 是否数据完成初台化
  92. /// </summary>
  93. private bool _isDataInitialized;
  94. /// <summary>
  95. /// pdi控制中的p
  96. /// </summary>
  97. private double _pumpKp;
  98. /// <summary>
  99. /// pdi控制中的i
  100. /// </summary>
  101. private double _pumpKi;
  102. /// <summary>
  103. /// pdi控制中的d
  104. /// </summary>
  105. private double _pumpKd;
  106. /// <summary>
  107. /// 操作当前状态
  108. /// </summary>
  109. private RState _status;
  110. /// <summary>
  111. /// 当前操作
  112. /// </summary>
  113. private VPWOperation _currentOperation;
  114. /// <summary>
  115. /// 启动自动调泵速
  116. /// </summary>
  117. private bool _isStartAutoSpeed;
  118. #endregion
  119. #region 属性
  120. /// <summary>
  121. /// 数据
  122. /// </summary>
  123. public VpwMainCommonData CommonData { get { return _commonData; } }
  124. #endregion
  125. /// <summary>
  126. /// 构造函数
  127. /// </summary>
  128. /// <param name="moduleName"></param>
  129. public VpwMainDevice(string moduleName) : base(moduleName, moduleName, moduleName, moduleName)
  130. {
  131. }
  132. #region 初始化
  133. /// <summary>
  134. /// 初始化
  135. /// </summary>
  136. /// <returns></returns>
  137. public bool Initialize()
  138. {
  139. InitializeParameter();
  140. InitializeRoutine();
  141. SubscribeData();
  142. SubscribeValueAction();
  143. InitializeOperation();
  144. return true;
  145. }
  146. /// <summary>
  147. /// 初始化参数
  148. /// </summary>
  149. private void InitializeParameter()
  150. {
  151. _vpwMainPersistentValue = VpwMainPersistentManager.Instance.GetPersistentValue(Module);
  152. if (_vpwMainPersistentValue != null)
  153. {
  154. _lastBoosterPumpSpeed = _vpwMainPersistentValue.Speed;
  155. }
  156. else
  157. {
  158. LOG.WriteLog(eEvent.ERR_PREWET, Module, "Persistent Value Object is not exist");
  159. }
  160. _commonData.BoosterPumpPressureData = new MECF.Framework.Common.CommonData.CommonLimitData();
  161. }
  162. /// <summary>
  163. /// 初始化Routine
  164. /// </summary>
  165. private void InitializeRoutine()
  166. {
  167. _boosterPumpEnableRoutine = new BoosterPumpEnableRoutine(Module, this);
  168. _boosterPumpDisableRoutine = new BoosterPumpDisableRoutine(Module, this);
  169. }
  170. /// <summary>
  171. /// 订阅
  172. /// </summary>
  173. private void SubscribeData()
  174. {
  175. DATA.Subscribe($"{Module}.{PERSISTENT_VALUE}", () => _vpwMainPersistentValue, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  176. DATA.Subscribe($"{Module}.{COMMON_DATA}", () => CommonData, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  177. }
  178. /// <summary>
  179. /// 订阅数据
  180. /// </summary>
  181. private void SubscribeValueAction()
  182. {
  183. IoSubscribeUpdateVariable(CHAMBER_CLOSED);
  184. IoSubscribeUpdateVariable(CHAMBER_OPENED);
  185. IoSubscribeUpdateVariable(BOOSTER_PUMP_STATUS);
  186. IoSubscribeUpdateVariable(BOOSTER_PUMP_SPEED);
  187. IoSubscribeUpdateVariable(BOOSTER_PUMP_ENABLE);
  188. IoSubscribeUpdateVariable(BOOSTER_PUMP_CURRENT);
  189. IoSubscribeUpdateVariable(DEGAS_PURGE);
  190. IoSubscribeUpdateVariable(DEGAS_ADJUST);
  191. IoSubscribeUpdateVariable(DEGAS_PUMP_PRESSURE);
  192. IoSubscribeUpdateVariable(DEGAS_PUMP_ENABLE);
  193. IoSubscribeUpdateVariable(DIW_ENABLE);
  194. IoSubscribeUpdateVariable(DIW_PROCESS);
  195. IoSubscribeUpdateVariable(DIW_PRESSURE);
  196. IoSubscribeUpdateVariable(DIW_DEGAS);
  197. IoSubscribeUpdateVariable(DIW_TOTAL_FLOW);
  198. IoSubscribeUpdateVariable(VACUUM_PUMP_ENABLE);
  199. IoSubscribeUpdateVariable(VACUUM_PUMP_POWER);
  200. IoSubscribeUpdateVariable(VACUUM_PUMP_PRESSURE);
  201. IoSubscribeUpdateVariable(VACUUM_PUMP_SPEED);
  202. IoSubscribeUpdateVariable(VACUUM_PUMP_SPEED_ENABLE);
  203. IoSubscribeUpdateVariable(LEAK_DETECTED);
  204. }
  205. /// <summary>
  206. /// 初始化变量
  207. /// </summary>
  208. /// <param name="variable"></param>
  209. private void IoSubscribeUpdateVariable(string variable)
  210. {
  211. _variableInitializeDic[variable] = false;
  212. IOModuleManager.Instance.SubscribeModuleVariable(Module, variable, UpdateVariableValue);
  213. }
  214. /// <summary>
  215. /// 更新变量数值
  216. /// </summary>
  217. /// <param name="variable"></param>
  218. /// <param name="value"></param>
  219. private void UpdateVariableValue(string variable, object value)
  220. {
  221. if (!_commonData.IsDataInitialized)
  222. {
  223. _commonData.IsDataInitialized = true;
  224. _commonData.BoosterPumpModel = "Manual";
  225. }
  226. PropertyInfo property = _commonData.GetType().GetProperty(variable);
  227. if (property != null)
  228. {
  229. property.SetValue(_commonData, value);
  230. }
  231. if (_variableInitializeDic.ContainsKey(variable) && !_variableInitializeDic[variable])
  232. {
  233. _variableInitializeDic[variable] = true;
  234. }
  235. switch (variable)
  236. {
  237. case BOOSTER_PUMP_STATUS:
  238. string statusContent = _commonData.BoosterPumpStatus ? "On" : "Off";
  239. _commonData.BoosterPumpStatusContent = $"{_commonData.BoosterPumpModel}: {statusContent}";
  240. break;
  241. case DIW_PRESSURE:
  242. if (double.TryParse(value.ToString(), out var pressure))
  243. {
  244. _commonData.BoosterPumpPressureData.Value = pressure;
  245. }
  246. break;
  247. }
  248. }
  249. /// <summary>
  250. /// 初始化OP
  251. /// </summary>
  252. private void InitializeOperation()
  253. {
  254. OP.Subscribe($"{Module}.VacuumPumpPowerOn", (cmd,para)=> { return VacuumPumpPowerOn(); });
  255. OP.Subscribe($"{Module}.VacuumPumpPowerOff", (cmd, para) => { return VacuumPumpPowerOff(); });
  256. OP.Subscribe($"{Module}.VacuumPumpEnable", (cmd, para) => { return VacuumPumpEnable(); });
  257. OP.Subscribe($"{Module}.VacuumPumpDisable", (cmd, para) => { return VacuumPumpDisable(); });
  258. OP.Subscribe($"{Module}.VacuumPumpSpeedEnable", (cmd, para) => { return VacuumSpeedEnable(); });
  259. OP.Subscribe($"{Module}.VacuumPumpSpeedDisable", (cmd, para) => { return VacuumSpeedDisable(); });
  260. OP.Subscribe($"{Module}.VacuumPumpSpeed", (cmd, para) => { return WriteVacuumSpeedOperation(cmd, para); });
  261. OP.Subscribe($"{Module}.DegasPumpEnable", (cmd, para) => { return DegasPumpEnable(); });
  262. OP.Subscribe($"{Module}.DegasPumpDisable", (cmd, para) => { return DegasPumpDisable(); });
  263. OP.Subscribe($"{Module}.DegasAdjustOn", (cmd, para) => { return DegasAdjustOn(); });
  264. OP.Subscribe($"{Module}.DegasAdjustOff", (cmd, para) => { return DegasAdjustOff(); });
  265. OP.Subscribe($"{Module}.DiwDegasValveOn", (cmd, para) => { return DiwDegasValveOn(); });
  266. OP.Subscribe($"{Module}.DiwDegasValveOff", (cmd, para) => { return DiwDegasValveOff(); });
  267. OP.Subscribe($"{Module}.DiwEnable", (cmd, para) => { return DiwEnable(); });
  268. OP.Subscribe($"{Module}.DiwDisable", (cmd, para) => { return DiwDisable(); });
  269. OP.Subscribe($"{Module}.DiwProcessOn", (cmd, para) => { return DiwProcessOn(); });
  270. OP.Subscribe($"{Module}.DiwProcessOff", (cmd, para) => { return DiwProcessOff(); });
  271. OP.Subscribe($"{Module}.BoosterPumpEnable", BoosterPumpEnableOperation);
  272. OP.Subscribe($"{Module}.BoosterPumpDisable", BoosterPumpDisableOperation);
  273. OP.Subscribe($"{Module}.BoosterPumpSpeed", BoosterPumpSpeedKeyDownOperation);
  274. OP.Subscribe($"{Module}.ChamberUp", (cmd, para) => { return ChamberUp(); });
  275. OP.Subscribe($"{Module}.ChamberDown", (cmd, para) => { return ChamberDown(); });
  276. OP.Subscribe($"{Module}.BoosterPumpSpeedAuto", (cmd, para) => { return BoosterPumpSpeedAutoOperation(); });
  277. OP.Subscribe($"{Module}.BoosterPumpSpeedManual", (cmd, para) => { return BoosterPumpSpeedManualOperation(); });
  278. OP.Subscribe($"{Module}.DisabledAction", DisabledOperation);
  279. OP.Subscribe($"{Module}.ManualAction", ManualOperation);
  280. OP.Subscribe($"{Module}.AutoAction", AutoOperation);
  281. OP.Subscribe($"{Module}.EngineeringModeAction", EngineeringModeOperation);
  282. OP.Subscribe($"{Module}.ProductionModeAction", ProductionModeOperation);
  283. }
  284. #endregion
  285. #region Action
  286. #region Vacum Pump
  287. /// <summary>
  288. /// Pump Power On
  289. /// </summary>
  290. /// <returns></returns>
  291. public bool VacuumPumpPowerOn()
  292. {
  293. return WriteVariableValue(VACUUM_PUMP_POWER, true);
  294. }
  295. /// <summary>
  296. /// Pump Power Off
  297. /// </summary>
  298. /// <returns></returns>
  299. public bool VacuumPumpPowerOff()
  300. {
  301. return WriteVariableValue(VACUUM_PUMP_POWER, false);
  302. }
  303. /// <summary>
  304. /// Pump Enable
  305. /// </summary>
  306. /// <returns></returns>
  307. public bool VacuumPumpEnable()
  308. {
  309. return WriteVariableValue(VACUUM_PUMP_ENABLE, true);
  310. }
  311. /// <summary>
  312. /// Pump Disable
  313. /// </summary>
  314. /// <returns></returns>
  315. public bool VacuumPumpDisable()
  316. {
  317. return WriteVariableValue(VACUUM_PUMP_ENABLE, false);
  318. }
  319. /// <summary>
  320. /// Speed Enable
  321. /// </summary>
  322. /// <returns></returns>
  323. public bool VacuumSpeedEnable()
  324. {
  325. return WriteVariableValue(VACUUM_PUMP_SPEED_ENABLE, true);
  326. }
  327. /// <summary>
  328. /// Speed disable
  329. /// </summary>
  330. /// <returns></returns>
  331. public bool VacuumSpeedDisable()
  332. {
  333. return WriteVariableValue(VACUUM_PUMP_SPEED_ENABLE, false);
  334. }
  335. /// <summary>
  336. /// 写入Vacuum速度
  337. /// </summary>
  338. /// <param name="speed"></param>
  339. /// <returns></returns>
  340. private bool WriteVacuumSpeedOperation(string cmd, object[] param)
  341. {
  342. if (short.TryParse(param[0].ToString(), out var speed))
  343. {
  344. return WriteVariableValue(VACUUM_PUMP_SPEED, speed);
  345. }
  346. else
  347. {
  348. LOG.WriteLog(eEvent.ERR_VPWMAIN, Module, $"Write VacuumSpeed {param[0]} is not short");
  349. return false;
  350. }
  351. }
  352. /// <summary>
  353. /// 写入速度
  354. /// </summary>
  355. /// <param name="speed"></param>
  356. /// <returns></returns>
  357. public bool WriteVacuumSpeed(short speed)
  358. {
  359. return WriteVariableValue(VACUUM_PUMP_SPEED, speed);
  360. }
  361. #endregion
  362. #region Degas Pump
  363. /// <summary>
  364. /// Degas Pump Enable
  365. /// </summary>
  366. /// <returns></returns>
  367. public bool DegasPumpEnable()
  368. {
  369. return WriteVariableValue(DEGAS_PUMP_ENABLE, true);
  370. }
  371. /// <summary>
  372. /// Degas Pump disable
  373. /// </summary>
  374. /// <returns></returns>
  375. public bool DegasPumpDisable()
  376. {
  377. return WriteVariableValue(DEGAS_PUMP_ENABLE, false);
  378. }
  379. /// <summary>
  380. /// Degas Adjust On
  381. /// </summary>
  382. /// <returns></returns>
  383. private bool DegasAdjustOn()
  384. {
  385. return WriteVariableValue(DEGAS_ADJUST, true);
  386. }
  387. /// <summary>
  388. /// Degas Adjust Off
  389. /// </summary>
  390. /// <returns></returns>
  391. private bool DegasAdjustOff()
  392. {
  393. return WriteVariableValue(DEGAS_ADJUST, false);
  394. }
  395. /// <summary>
  396. /// DIW Degas Valve On
  397. /// </summary>
  398. /// <returns></returns>
  399. private bool DiwDegasValveOn()
  400. {
  401. return WriteVariableValue(DIW_DEGAS, true);
  402. }
  403. /// <summary>
  404. /// DIW Degas Valve Off
  405. /// </summary>
  406. /// <returns></returns>
  407. private bool DiwDegasValveOff()
  408. {
  409. return WriteVariableValue(DIW_DEGAS, false);
  410. }
  411. #endregion
  412. #region Booster Pump
  413. /// <summary>
  414. /// Pump Enable操作
  415. /// </summary>
  416. /// <param name="cmd"></param>
  417. /// <param name="param"></param>
  418. /// <returns></returns>
  419. public bool BoosterPumpEnableOperation(string cmd, object[] param)
  420. {
  421. if (_status == RState.Running)
  422. {
  423. LOG.WriteLog(eEvent.ERR_PREWET, Module.ToString(), $"{Module} current execute {_currentOperation},cannot Pump enable");
  424. return false;
  425. }
  426. _status = _boosterPumpEnableRoutine.Start();
  427. _currentOperation = VPWOperation.PumpEnable;
  428. return _status == RState.Running;
  429. }
  430. /// <summary>
  431. /// pump disable 操作
  432. /// </summary>
  433. /// <param name="cmd"></param>
  434. /// <param name="param"></param>
  435. /// <returns></returns>
  436. public bool BoosterPumpDisableOperation(string cmd, object[] param)
  437. {
  438. if (_status == RState.Running)
  439. {
  440. LOG.WriteLog(eEvent.ERR_PREWET, Module.ToString(), $"{Module} current execute {_currentOperation},cannot Pump disable");
  441. return false;
  442. }
  443. _status = _boosterPumpDisableRoutine.Start();
  444. _currentOperation = VPWOperation.PumpDisable;
  445. return _status == RState.Running;
  446. //return PumpDisable();
  447. }
  448. /// <summary>
  449. /// Booster Pump enable
  450. /// </summary>
  451. /// <returns></returns>
  452. public bool BoosterPumpEnable()
  453. {
  454. return WriteVariableValue(BOOSTER_PUMP_ENABLE, true);
  455. }
  456. /// <summary>
  457. /// Booster Pump Disable
  458. /// </summary>
  459. /// <returns></returns>
  460. public bool BoosterPumpDisable()
  461. {
  462. return WriteVariableValue(BOOSTER_PUMP_ENABLE, false);
  463. }
  464. /// <summary>
  465. /// 写入Booster泵速
  466. /// </summary>
  467. /// <param name="speed"></param>
  468. /// <returns></returns>
  469. public bool BoosterPumpSpeed(short speed=0)
  470. {
  471. return WriteVariableValue(BOOSTER_PUMP_SPEED, speed == 0 ? _lastBoosterPumpSpeed : speed);
  472. }
  473. /// Booster Pump Speed回车操作
  474. /// </summary>
  475. /// <param name="cmd"></param>
  476. /// <param name="param"></param>
  477. /// <returns></returns>
  478. private bool BoosterPumpSpeedKeyDownOperation(string cmd, object[] param)
  479. {
  480. if (_commonData.BoosterPumpSpeedAuto)
  481. {
  482. LOG.WriteLog(eEvent.ERR_PREWET, Module, "Pump speed is auto,cannot change speed");
  483. return false;
  484. }
  485. short speed = (short)param[0];
  486. bool result = BoosterPumpSpeed(speed);
  487. if (result)
  488. {
  489. _vpwMainPersistentValue.Speed = speed;
  490. _lastBoosterPumpSpeed = speed;
  491. VpwMainPersistentManager.Instance.UpdatePersistentValue(Module);
  492. }
  493. return true;
  494. }
  495. /// <summary>
  496. /// Pump Speed手动模式
  497. /// </summary>
  498. /// <param name="cmd"></param>
  499. /// <param name="param"></param>
  500. /// <returns></returns>
  501. private bool BoosterPumpSpeedManualOperation()
  502. {
  503. _commonData.BoosterPumpSpeedAuto = false;
  504. _commonData.BoosterPumpModel = "Manual";
  505. string statusContent = _commonData.BoosterPumpStatus ? "On" : "Off";
  506. _commonData.BoosterPumpStatusContent = $"{_commonData.BoosterPumpModel}: {statusContent}";
  507. return true;
  508. }
  509. /// <summary>
  510. /// Pump Speed自动模式
  511. /// </summary>
  512. /// <param name="cmd"></param>
  513. /// <param name="param"></param>
  514. /// <returns></returns>
  515. private bool BoosterPumpSpeedAutoOperation()
  516. {
  517. _commonData.BoosterPumpSpeedAuto = true;
  518. _commonData.BoosterPumpModel = "Auto";
  519. string statusContent = _commonData.BoosterPumpStatus ? "On" : "Off";
  520. _commonData.BoosterPumpStatusContent = $"{_commonData.BoosterPumpModel}: {statusContent}";
  521. return true;
  522. }
  523. #endregion
  524. #region Chamber
  525. /// <summary>
  526. /// 上升
  527. /// </summary>
  528. /// <returns></returns>
  529. public bool ChamberUp()
  530. {
  531. return WriteVariableValue(CHAMBER_CLOSE, false);
  532. }
  533. /// <summary>
  534. /// 下降
  535. /// </summary>
  536. /// <returns></returns>
  537. public bool ChamberDown()
  538. {
  539. return WriteVariableValue(CHAMBER_CLOSE, true);
  540. }
  541. #endregion
  542. #region Mode switch
  543. /// <summary>
  544. /// DisabledAction
  545. /// </summary>
  546. /// <param name="cmd"></param>
  547. /// <param name="param"></param>
  548. /// <returns></returns>
  549. private bool DisabledOperation(string cmd, object[] args)
  550. {
  551. string currentOperation = "Disabled";
  552. VpwMainEntity vpwMainEntity = Singleton<RouteManager>.Instance.GetModule<VpwMainEntity>(Module);
  553. if (vpwMainEntity != null && _vpwMainPersistentValue != null && _vpwMainPersistentValue.OperatingMode != currentOperation)
  554. {
  555. string preOperation = _vpwMainPersistentValue.OperatingMode;
  556. if (vpwMainEntity.IsBusy)
  557. {
  558. LOG.WriteLog(eEvent.ERR_VPWMAIN, Module, $"{Module} is Busy, can't switch to Disabled mode");
  559. return false;
  560. }
  561. vpwMainEntity.EnterInit();
  562. _vpwMainPersistentValue.OperatingMode = currentOperation;
  563. LOG.WriteLog(eEvent.INFO_VPWMAIN, Module, $"Operating mode is switched from {preOperation} to {currentOperation}");
  564. }
  565. VpwMainPersistentManager.Instance.UpdatePersistentValue(Module);
  566. return true;
  567. }
  568. /// <summary>
  569. /// ManualAction
  570. /// </summary>
  571. /// <param name="cmd"></param>
  572. /// <param name="param"></param>
  573. /// <returns></returns>
  574. private bool ManualOperation(string cmd, object[] args)
  575. {
  576. string currentOperation = "Manual";
  577. VpwMainEntity vpwMainEntity = Singleton<RouteManager>.Instance.GetModule<VpwMainEntity>(Module);
  578. if (vpwMainEntity != null && _vpwMainPersistentValue != null && _vpwMainPersistentValue.OperatingMode != currentOperation)
  579. {
  580. string preOperation = _vpwMainPersistentValue.OperatingMode;
  581. if (vpwMainEntity.IsBusy)
  582. {
  583. LOG.WriteLog(eEvent.ERR_VPWMAIN, Module, $"{Module} is Busy, can't switch to Manual mode");
  584. return false;
  585. }
  586. vpwMainEntity.EnterInit();
  587. _vpwMainPersistentValue.OperatingMode = currentOperation;
  588. LOG.WriteLog(eEvent.INFO_VPWMAIN, Module, $"Operating mode is switched from {preOperation} to {currentOperation}");
  589. }
  590. VpwMainPersistentManager.Instance.UpdatePersistentValue(Module);
  591. return true;
  592. }
  593. /// <summary>
  594. /// AutoAction
  595. /// </summary>
  596. /// <param name="cmd"></param>
  597. /// <param name="param"></param>
  598. /// <returns></returns>
  599. private bool AutoOperation(string cmd, object[] args)
  600. {
  601. string currentOperation = "Auto";
  602. VpwMainEntity vpwMainEntity = Singleton<RouteManager>.Instance.GetModule<VpwMainEntity>(Module);
  603. if (vpwMainEntity != null && _vpwMainPersistentValue != null && _vpwMainPersistentValue.OperatingMode != currentOperation)
  604. {
  605. string preOperation = _vpwMainPersistentValue.OperatingMode;
  606. if (vpwMainEntity.IsBusy)
  607. {
  608. LOG.WriteLog(eEvent.ERR_VPWMAIN, Module, $"{Module} is Busy, can't switch to Auto mode");
  609. return false;
  610. }
  611. vpwMainEntity.EnterInit();
  612. _vpwMainPersistentValue.OperatingMode = currentOperation;
  613. LOG.WriteLog(eEvent.INFO_VPWMAIN, Module, $"Operating mode is switched from {preOperation} to {currentOperation}");
  614. }
  615. VpwMainPersistentManager.Instance.UpdatePersistentValue(Module);
  616. return true;
  617. }
  618. /// <summary>
  619. /// EngineeringModeAction
  620. /// </summary>
  621. /// <param name="cmd"></param>
  622. /// <param name="param"></param>
  623. /// <returns></returns>
  624. private bool EngineeringModeOperation(string cmd, object[] args)
  625. {
  626. string currentRecipeOperation = "Engineering";
  627. if (_vpwMainPersistentValue != null)
  628. {
  629. _vpwMainPersistentValue.RecipeOperatingMode = currentRecipeOperation;
  630. }
  631. VpwMainPersistentManager.Instance.UpdatePersistentValue(Module);
  632. return true;
  633. }
  634. /// <summary>
  635. /// ProductionAction
  636. /// </summary>
  637. /// <param name="cmd"></param>
  638. /// <param name="param"></param>
  639. /// <returns></returns>
  640. private bool ProductionModeOperation(string cmd, object[] args)
  641. {
  642. string currentRecipeOperation = "Production";
  643. if (_vpwMainPersistentValue != null)
  644. {
  645. _vpwMainPersistentValue.RecipeOperatingMode = currentRecipeOperation;
  646. }
  647. VpwMainPersistentManager.Instance.UpdatePersistentValue(Module);
  648. return true;
  649. }
  650. #endregion
  651. #region DIW
  652. /// <summary>
  653. /// DIW Enable
  654. /// </summary>
  655. /// <returns></returns>
  656. public bool DiwEnable()
  657. {
  658. return WriteVariableValue(DIW_ENABLE, true);
  659. }
  660. /// <summary>
  661. /// DIW Disable
  662. /// </summary>
  663. /// <returns></returns>
  664. public bool DiwDisable()
  665. {
  666. return WriteVariableValue(DIW_ENABLE, false);
  667. }
  668. /// <summary>
  669. /// DIW Process On
  670. /// </summary>
  671. /// <returns></returns>
  672. public bool DiwProcessOn()
  673. {
  674. return WriteVariableValue(DIW_PROCESS, true);
  675. }
  676. /// <summary>
  677. /// DIW Process On
  678. /// </summary>
  679. /// <returns></returns>
  680. public bool DiwProcessOff()
  681. {
  682. return WriteVariableValue(DIW_PROCESS, false);
  683. }
  684. #endregion
  685. /// <summary>
  686. /// 写变量
  687. /// </summary>
  688. /// <param name="variable"></param>
  689. /// <param name="value"></param>
  690. /// <returns></returns>
  691. private bool WriteVariableValue(string variable, object value)
  692. {
  693. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{variable}");
  694. return IOModuleManager.Instance.WriteIoValue(ioName, value);
  695. }
  696. #endregion
  697. /// <summary>
  698. /// 定时器
  699. /// </summary>
  700. /// <returns></returns>
  701. public bool OnTimer()
  702. {
  703. _commonData.BoosterPumpPressureData.MinError = SC.GetValue<double>($"VPWMain.PumpPressure.Error_Min");
  704. _commonData.BoosterPumpPressureData.MinWarning = SC.GetValue<double>($"VPWMain.PumpPressure.Warning_Min");
  705. _commonData.BoosterPumpPressureData.MaxError = SC.GetValue<double>($"VPWMain.PumpPressure.Error_Max");
  706. _commonData.BoosterPumpPressureData.MaxWarning = SC.GetValue<double>($"VPWMain.PumpPressure.Warning_Max");
  707. _commonData.PressureTarget = SC.GetValue<double>($"VPWMain.PressureTarget");
  708. if (_status == RState.Running)
  709. {
  710. IRoutine routine = GetCurrentRoutine();
  711. if (routine != null)
  712. {
  713. RState rsState = routine.Monitor();
  714. if (rsState == RState.Failed || rsState == RState.Timeout)
  715. {
  716. _status = RState.Failed;
  717. _currentOperation = VPWOperation.None;
  718. LOG.WriteLog(eEvent.ERR_VPWMAIN, Module.ToString(), $"{_currentOperation} error");
  719. _isStartAutoSpeed = false;
  720. }
  721. else if (rsState == RState.End)
  722. {
  723. if (_currentOperation == VPWOperation.PumpEnable)
  724. {
  725. _isStartAutoSpeed = true;
  726. }
  727. else if (_currentOperation == VPWOperation.PumpDisable)
  728. {
  729. _isStartAutoSpeed = false;
  730. }
  731. _status = RState.End;
  732. _currentOperation = VPWOperation.None;
  733. }
  734. }
  735. }
  736. if (_isStartAutoSpeed)
  737. {
  738. AdjustPumpSpeed();
  739. }
  740. return true;
  741. }
  742. /// <summary>
  743. /// 调速
  744. /// </summary>
  745. public void AdjustPumpSpeed()
  746. {
  747. //Speed Auto模式同时pump enbled,根据kdi调整泵速
  748. if (_commonData.BoosterPumpSpeedAuto && _commonData.BoosterPumpEnable)
  749. {
  750. _pumpKp = SC.GetValue<double>($"VPWMain.PumpKp");
  751. _pumpKd = SC.GetValue<double>($"VPWMain.PumpKd");
  752. _pumpKi = SC.GetValue<double>($"VPWMain.PumpKi");
  753. double limit = SC.GetValue<double>("VPWMain.PrewetTargetLimit");
  754. double downLimit = SC.GetValue<double>("VPWMain.PrewetDownTargetLimit");
  755. double minSpeedDelta = SC.GetValue<double>("VPWMain.MinSpeedDelta");
  756. short speed = PdiAlgorithm.Instance.CalculateSpeed(_pumpKp, _pumpKi, _pumpKd, _commonData.PressureTarget,
  757. _commonData.BoosterPumpPressureData.Value, _lastBoosterPumpSpeed, limit, downLimit, minSpeedDelta);
  758. //short speed = PdiAlgorithm.Instance.CalculateSpeed(PrewetPumpData.PressureTarget, PrewetPumpData.PumpPressureData.Value,
  759. // _lastPumpSpeed, limit, downLimit);
  760. if (Math.Abs(speed - _lastBoosterPumpSpeed) >= 1)
  761. {
  762. _lastBoosterPumpSpeed = speed;
  763. BoosterPumpSpeed(speed);
  764. }
  765. }
  766. }
  767. /// <summary>
  768. /// 当前Routine;
  769. /// </summary>
  770. /// <returns></returns>
  771. private IRoutine GetCurrentRoutine()
  772. {
  773. switch (_currentOperation)
  774. {
  775. case VPWOperation.PumpEnable:
  776. return _boosterPumpEnableRoutine;
  777. case VPWOperation.PumpDisable:
  778. return _boosterPumpDisableRoutine;
  779. default:
  780. return null;
  781. }
  782. }
  783. /// <summary>
  784. /// 监控
  785. /// </summary>
  786. public void Monitor()
  787. {
  788. }
  789. public void Reset()
  790. {
  791. }
  792. public void Terminate()
  793. {
  794. }
  795. }
  796. }