VpwMainDevice.cs 33 KB

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