VpwMainDevice.cs 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882
  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}.DegasPurgeOn", (cmd, para) => { return N2PurgeValveOn(); });
  273. OP.Subscribe($"{Module}.DegasPurgeOff", (cmd, para) => { return N2PurgeValveOff(); });
  274. OP.Subscribe($"{Module}.DiwDegasValveOn", (cmd, para) => { return DiwDegasValveOn(); });
  275. OP.Subscribe($"{Module}.DiwDegasValveOff", (cmd, para) => { return DiwDegasValveOff(); });
  276. OP.Subscribe($"{Module}.DiwEnable", (cmd, para) => { return DiwEnable(); });
  277. OP.Subscribe($"{Module}.DiwDisable", (cmd, para) => { return DiwDisable(); });
  278. OP.Subscribe($"{Module}.DiwProcessOn", (cmd, para) => { return DiwProcessOn(); });
  279. OP.Subscribe($"{Module}.DiwProcessOff", (cmd, para) => { return DiwProcessOff(); });
  280. OP.Subscribe($"{Module}.BoosterPumpEnable", BoosterPumpEnableOperation);
  281. OP.Subscribe($"{Module}.BoosterPumpDisable", BoosterPumpDisableOperation);
  282. OP.Subscribe($"{Module}.BoosterPumpSpeed", BoosterPumpSpeedKeyDownOperation);
  283. OP.Subscribe($"{Module}.ChamberUp", (cmd, para) => { return ChamberUp(); });
  284. OP.Subscribe($"{Module}.ChamberDown", (cmd, para) => { return ChamberDown(); });
  285. OP.Subscribe($"{Module}.BoosterPumpSpeedAuto", (cmd, para) => { return BoosterPumpSpeedAutoOperation(); });
  286. OP.Subscribe($"{Module}.BoosterPumpSpeedManual", (cmd, para) => { return BoosterPumpSpeedManualOperation(); });
  287. OP.Subscribe($"{Module}.DisabledAction", DisabledOperation);
  288. OP.Subscribe($"{Module}.ManualAction", ManualOperation);
  289. OP.Subscribe($"{Module}.AutoAction", AutoOperation);
  290. OP.Subscribe($"{Module}.EngineeringModeAction", EngineeringModeOperation);
  291. OP.Subscribe($"{Module}.ProductionModeAction", ProductionModeOperation);
  292. OP.Subscribe($"{Module}.HomeAllRotation", HomeAllRotation);
  293. }
  294. #endregion
  295. #region Action
  296. #region HomeAllRotation
  297. public bool HomeAllRotation(string cmd, object[] param)
  298. {
  299. if (_status == RState.Running)
  300. {
  301. LOG.WriteLog(eEvent.ERR_PREWET, Module.ToString(), $"{Module} current execute {_currentOperation},cannot home all rotation");
  302. return false;
  303. }
  304. _status = _simpleHomeRoutine.Start();
  305. _currentOperation = VPWOperation.HomeAllRotation;
  306. return _status == RState.Running;
  307. }
  308. #endregion
  309. #region Vacum Pump
  310. /// <summary>
  311. /// Pump Power On
  312. /// </summary>
  313. /// <returns></returns>
  314. public bool VacuumPumpPowerOn()
  315. {
  316. return WriteVariableValue(VACUUM_PUMP_POWER, true);
  317. }
  318. /// <summary>
  319. /// Pump Power Off
  320. /// </summary>
  321. /// <returns></returns>
  322. public bool VacuumPumpPowerOff()
  323. {
  324. return WriteVariableValue(VACUUM_PUMP_POWER, false);
  325. }
  326. /// <summary>
  327. /// Pump Enable
  328. /// </summary>
  329. /// <returns></returns>
  330. public bool VacuumPumpEnable()
  331. {
  332. return WriteVariableValue(VACUUM_PUMP_ENABLE, true);
  333. }
  334. /// <summary>
  335. /// Pump Disable
  336. /// </summary>
  337. /// <returns></returns>
  338. public bool VacuumPumpDisable()
  339. {
  340. return WriteVariableValue(VACUUM_PUMP_ENABLE, false);
  341. }
  342. /// <summary>
  343. /// Speed Enable
  344. /// </summary>
  345. /// <returns></returns>
  346. public bool VacuumSpeedEnable()
  347. {
  348. return WriteVariableValue(VACUUM_PUMP_SPEED_ENABLE, true);
  349. }
  350. /// <summary>
  351. /// Speed disable
  352. /// </summary>
  353. /// <returns></returns>
  354. public bool VacuumSpeedDisable()
  355. {
  356. return WriteVariableValue(VACUUM_PUMP_SPEED_ENABLE, false);
  357. }
  358. /// <summary>
  359. /// 写入Vacuum速度
  360. /// </summary>
  361. /// <param name="speed"></param>
  362. /// <returns></returns>
  363. private bool WriteVacuumSpeedOperation(string cmd, object[] param)
  364. {
  365. if (short.TryParse(param[0].ToString(), out var speed))
  366. {
  367. return WriteVariableValue(VACUUM_PUMP_SPEED, speed);
  368. }
  369. else
  370. {
  371. LOG.WriteLog(eEvent.ERR_VPWMAIN, Module, $"Write VacuumSpeed {param[0]} is not short");
  372. return false;
  373. }
  374. }
  375. /// <summary>
  376. /// 写入速度
  377. /// </summary>
  378. /// <param name="speed"></param>
  379. /// <returns></returns>
  380. public bool WriteVacuumSpeed(short speed)
  381. {
  382. return WriteVariableValue(VACUUM_PUMP_SPEED, speed);
  383. }
  384. #endregion
  385. #region Degas Pump
  386. /// <summary>
  387. /// Degas Pump Enable
  388. /// </summary>
  389. /// <returns></returns>
  390. public bool DegasPumpEnable()
  391. {
  392. return WriteVariableValue(DEGAS_PUMP_ENABLE, true);
  393. }
  394. /// <summary>
  395. /// Degas Pump disable
  396. /// </summary>
  397. /// <returns></returns>
  398. public bool DegasPumpDisable()
  399. {
  400. return WriteVariableValue(DEGAS_PUMP_ENABLE, false);
  401. }
  402. /// <summary>
  403. /// Degas Adjust On
  404. /// </summary>
  405. /// <returns></returns>
  406. public bool DegasAdjustOn()
  407. {
  408. return WriteVariableValue(DEGAS_ADJUST, true);
  409. }
  410. /// <summary>
  411. /// Degas Adjust Off
  412. /// </summary>
  413. /// <returns></returns>
  414. public bool DegasAdjustOff()
  415. {
  416. return WriteVariableValue(DEGAS_ADJUST, false);
  417. }
  418. #endregion
  419. #region Booster Pump
  420. /// <summary>
  421. /// Pump Enable操作
  422. /// </summary>
  423. /// <param name="cmd"></param>
  424. /// <param name="param"></param>
  425. /// <returns></returns>
  426. public bool BoosterPumpEnableOperation(string cmd, object[] param)
  427. {
  428. if (_status == RState.Running)
  429. {
  430. LOG.WriteLog(eEvent.ERR_PREWET, Module.ToString(), $"{Module} current execute {_currentOperation},cannot Pump enable");
  431. return false;
  432. }
  433. _status = _boosterPumpEnableRoutine.Start();
  434. _currentOperation = VPWOperation.PumpEnable;
  435. return _status == RState.Running;
  436. }
  437. /// <summary>
  438. /// pump disable 操作
  439. /// </summary>
  440. /// <param name="cmd"></param>
  441. /// <param name="param"></param>
  442. /// <returns></returns>
  443. public bool BoosterPumpDisableOperation(string cmd, object[] param)
  444. {
  445. if (_status == RState.Running)
  446. {
  447. LOG.WriteLog(eEvent.ERR_PREWET, Module.ToString(), $"{Module} current execute {_currentOperation},cannot Pump disable");
  448. return false;
  449. }
  450. _status = _boosterPumpDisableRoutine.Start();
  451. _currentOperation = VPWOperation.PumpDisable;
  452. return _status == RState.Running;
  453. //return PumpDisable();
  454. }
  455. /// <summary>
  456. /// Booster Pump enable
  457. /// </summary>
  458. /// <returns></returns>
  459. public bool BoosterPumpEnable()
  460. {
  461. return WriteVariableValue(BOOSTER_PUMP_ENABLE, true);
  462. }
  463. /// <summary>
  464. /// Booster Pump Disable
  465. /// </summary>
  466. /// <returns></returns>
  467. public bool BoosterPumpDisable()
  468. {
  469. return WriteVariableValue(BOOSTER_PUMP_ENABLE, false);
  470. }
  471. /// <summary>
  472. /// 写入Booster泵速
  473. /// </summary>
  474. /// <param name="speed"></param>
  475. /// <returns></returns>
  476. public bool BoosterPumpSpeed(short speed=0)
  477. {
  478. return WriteVariableValue(BOOSTER_PUMP_SPEED, speed == 0 ? _lastBoosterPumpSpeed : speed);
  479. }
  480. /// Booster Pump Speed回车操作
  481. /// </summary>
  482. /// <param name="cmd"></param>
  483. /// <param name="param"></param>
  484. /// <returns></returns>
  485. private bool BoosterPumpSpeedKeyDownOperation(string cmd, object[] param)
  486. {
  487. if (_commonData.BoosterPumpSpeedAuto)
  488. {
  489. LOG.WriteLog(eEvent.ERR_PREWET, Module, "Pump speed is auto,cannot change speed");
  490. return false;
  491. }
  492. short speed = (short)param[0];
  493. bool result = BoosterPumpSpeed(speed);
  494. if (result)
  495. {
  496. _vpwMainPersistentValue.Speed = speed;
  497. _lastBoosterPumpSpeed = speed;
  498. VpwMainPersistentManager.Instance.UpdatePersistentValue(Module);
  499. }
  500. return true;
  501. }
  502. /// <summary>
  503. /// Pump Speed手动模式
  504. /// </summary>
  505. /// <param name="cmd"></param>
  506. /// <param name="param"></param>
  507. /// <returns></returns>
  508. private bool BoosterPumpSpeedManualOperation()
  509. {
  510. _commonData.BoosterPumpSpeedAuto = false;
  511. _commonData.BoosterPumpModel = "Manual";
  512. string statusContent = _commonData.BoosterPumpStatus ? "On" : "Off";
  513. _commonData.BoosterPumpStatusContent = $"{_commonData.BoosterPumpModel}: {statusContent}";
  514. return true;
  515. }
  516. /// <summary>
  517. /// Pump Speed自动模式
  518. /// </summary>
  519. /// <param name="cmd"></param>
  520. /// <param name="param"></param>
  521. /// <returns></returns>
  522. private bool BoosterPumpSpeedAutoOperation()
  523. {
  524. _commonData.BoosterPumpSpeedAuto = true;
  525. _commonData.BoosterPumpModel = "Auto";
  526. string statusContent = _commonData.BoosterPumpStatus ? "On" : "Off";
  527. _commonData.BoosterPumpStatusContent = $"{_commonData.BoosterPumpModel}: {statusContent}";
  528. return true;
  529. }
  530. #endregion
  531. #region Chamber
  532. /// <summary>
  533. /// 上升
  534. /// </summary>
  535. /// <returns></returns>
  536. public bool ChamberUp()
  537. {
  538. return WriteVariableValue(CHAMBER_CLOSE, false);
  539. }
  540. /// <summary>
  541. /// 下降
  542. /// </summary>
  543. /// <returns></returns>
  544. public bool ChamberDown()
  545. {
  546. return WriteVariableValue(CHAMBER_CLOSE, true);
  547. }
  548. #endregion
  549. #region Mode switch
  550. /// <summary>
  551. /// DisabledAction
  552. /// </summary>
  553. /// <param name="cmd"></param>
  554. /// <param name="param"></param>
  555. /// <returns></returns>
  556. private bool DisabledOperation(string cmd, object[] args)
  557. {
  558. string currentOperation = "Disabled";
  559. VpwMainEntity vpwMainEntity = Singleton<RouteManager>.Instance.GetModule<VpwMainEntity>(Module);
  560. if (vpwMainEntity != null && _vpwMainPersistentValue != null && _vpwMainPersistentValue.OperatingMode != currentOperation)
  561. {
  562. string preOperation = _vpwMainPersistentValue.OperatingMode;
  563. if (vpwMainEntity.IsBusy)
  564. {
  565. LOG.WriteLog(eEvent.ERR_VPWMAIN, Module, $"{Module} is Busy, can't switch to Disabled mode");
  566. return false;
  567. }
  568. vpwMainEntity.EnterInit();
  569. _vpwMainPersistentValue.OperatingMode = currentOperation;
  570. LOG.WriteLog(eEvent.INFO_VPWMAIN, Module, $"Operating mode is switched from {preOperation} to {currentOperation}");
  571. }
  572. VpwMainPersistentManager.Instance.UpdatePersistentValue(Module);
  573. return true;
  574. }
  575. /// <summary>
  576. /// ManualAction
  577. /// </summary>
  578. /// <param name="cmd"></param>
  579. /// <param name="param"></param>
  580. /// <returns></returns>
  581. private bool ManualOperation(string cmd, object[] args)
  582. {
  583. string currentOperation = "Manual";
  584. VpwMainEntity vpwMainEntity = Singleton<RouteManager>.Instance.GetModule<VpwMainEntity>(Module);
  585. if (vpwMainEntity != null && _vpwMainPersistentValue != null && _vpwMainPersistentValue.OperatingMode != currentOperation)
  586. {
  587. string preOperation = _vpwMainPersistentValue.OperatingMode;
  588. if (vpwMainEntity.IsBusy)
  589. {
  590. LOG.WriteLog(eEvent.ERR_VPWMAIN, Module, $"{Module} is Busy, can't switch to Manual mode");
  591. return false;
  592. }
  593. vpwMainEntity.EnterInit();
  594. _vpwMainPersistentValue.OperatingMode = currentOperation;
  595. LOG.WriteLog(eEvent.INFO_VPWMAIN, Module, $"Operating mode is switched from {preOperation} to {currentOperation}");
  596. }
  597. VpwMainPersistentManager.Instance.UpdatePersistentValue(Module);
  598. return true;
  599. }
  600. /// <summary>
  601. /// AutoAction
  602. /// </summary>
  603. /// <param name="cmd"></param>
  604. /// <param name="param"></param>
  605. /// <returns></returns>
  606. private bool AutoOperation(string cmd, object[] args)
  607. {
  608. string currentOperation = "Auto";
  609. VpwMainEntity vpwMainEntity = Singleton<RouteManager>.Instance.GetModule<VpwMainEntity>(Module);
  610. if (vpwMainEntity != null && _vpwMainPersistentValue != null && _vpwMainPersistentValue.OperatingMode != currentOperation)
  611. {
  612. string preOperation = _vpwMainPersistentValue.OperatingMode;
  613. if (vpwMainEntity.IsBusy)
  614. {
  615. LOG.WriteLog(eEvent.ERR_VPWMAIN, Module, $"{Module} is Busy, can't switch to Auto mode");
  616. return false;
  617. }
  618. vpwMainEntity.EnterInit();
  619. _vpwMainPersistentValue.OperatingMode = currentOperation;
  620. LOG.WriteLog(eEvent.INFO_VPWMAIN, Module, $"Operating mode is switched from {preOperation} to {currentOperation}");
  621. }
  622. VpwMainPersistentManager.Instance.UpdatePersistentValue(Module);
  623. return true;
  624. }
  625. /// <summary>
  626. /// EngineeringModeAction
  627. /// </summary>
  628. /// <param name="cmd"></param>
  629. /// <param name="param"></param>
  630. /// <returns></returns>
  631. private bool EngineeringModeOperation(string cmd, object[] args)
  632. {
  633. string currentRecipeOperation = "Engineering";
  634. if (_vpwMainPersistentValue != null)
  635. {
  636. _vpwMainPersistentValue.RecipeOperatingMode = currentRecipeOperation;
  637. }
  638. VpwMainPersistentManager.Instance.UpdatePersistentValue(Module);
  639. return true;
  640. }
  641. /// <summary>
  642. /// ProductionAction
  643. /// </summary>
  644. /// <param name="cmd"></param>
  645. /// <param name="param"></param>
  646. /// <returns></returns>
  647. private bool ProductionModeOperation(string cmd, object[] args)
  648. {
  649. string currentRecipeOperation = "Production";
  650. if (_vpwMainPersistentValue != null)
  651. {
  652. _vpwMainPersistentValue.RecipeOperatingMode = currentRecipeOperation;
  653. }
  654. VpwMainPersistentManager.Instance.UpdatePersistentValue(Module);
  655. return true;
  656. }
  657. #endregion
  658. #region DIW
  659. /// <summary>
  660. /// DIW Enable
  661. /// </summary>
  662. /// <returns></returns>
  663. public bool DiwEnable()
  664. {
  665. return WriteVariableValue(DIW_ENABLE, true);
  666. }
  667. /// <summary>
  668. /// DIW Disable
  669. /// </summary>
  670. /// <returns></returns>
  671. public bool DiwDisable()
  672. {
  673. return WriteVariableValue(DIW_ENABLE, false);
  674. }
  675. /// <summary>
  676. /// DIW Process On
  677. /// </summary>
  678. /// <returns></returns>
  679. public bool DiwProcessOn()
  680. {
  681. return WriteVariableValue(DIW_PROCESS, true);
  682. }
  683. /// <summary>
  684. /// DIW Process On
  685. /// </summary>
  686. /// <returns></returns>
  687. public bool DiwProcessOff()
  688. {
  689. return WriteVariableValue(DIW_PROCESS, false);
  690. }
  691. /// <summary>
  692. /// DIW Degas Valve On
  693. /// </summary>
  694. /// <returns></returns>
  695. public bool DiwDegasValveOn()
  696. {
  697. return WriteVariableValue(DIW_DEGAS, true);
  698. }
  699. /// <summary>
  700. /// DIW Degas Valve Off
  701. /// </summary>
  702. /// <returns></returns>
  703. public bool DiwDegasValveOff()
  704. {
  705. return WriteVariableValue(DIW_DEGAS, false);
  706. }
  707. #endregion
  708. #region N2Purge
  709. /// <summary>
  710. /// 打开N2 Purge
  711. /// </summary>
  712. /// <returns></returns>
  713. public bool N2PurgeValveOn()
  714. {
  715. return WriteVariableValue(DEGAS_PURGE, true);
  716. }
  717. /// <summary>
  718. /// 关闭N2 Purge
  719. /// </summary>
  720. /// <returns></returns>
  721. public bool N2PurgeValveOff()
  722. {
  723. return WriteVariableValue(DEGAS_PURGE, false);
  724. }
  725. #endregion
  726. /// <summary>
  727. /// 写变量
  728. /// </summary>
  729. /// <param name="variable"></param>
  730. /// <param name="value"></param>
  731. /// <returns></returns>
  732. private bool WriteVariableValue(string variable, object value)
  733. {
  734. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{variable}");
  735. return IOModuleManager.Instance.WriteIoValue(ioName, value);
  736. }
  737. #endregion
  738. /// <summary>
  739. /// 定时器
  740. /// </summary>
  741. /// <returns></returns>
  742. public bool OnTimer()
  743. {
  744. _commonData.BoosterPumpPressureData.MinError = SC.GetValue<double>($"VPWMain.PumpPressure.Error_Min");
  745. _commonData.BoosterPumpPressureData.MinWarning = SC.GetValue<double>($"VPWMain.PumpPressure.Warning_Min");
  746. _commonData.BoosterPumpPressureData.MaxError = SC.GetValue<double>($"VPWMain.PumpPressure.Error_Max");
  747. _commonData.BoosterPumpPressureData.MaxWarning = SC.GetValue<double>($"VPWMain.PumpPressure.Warning_Max");
  748. _commonData.PressureTarget = SC.GetValue<double>($"VPWMain.PressureTarget");
  749. if (_status == RState.Running)
  750. {
  751. IRoutine routine = GetCurrentRoutine();
  752. if (routine != null)
  753. {
  754. RState rsState = routine.Monitor();
  755. if (rsState == RState.Failed || rsState == RState.Timeout)
  756. {
  757. _status = RState.Failed;
  758. _currentOperation = VPWOperation.None;
  759. LOG.WriteLog(eEvent.ERR_VPWMAIN, Module.ToString(), $"{_currentOperation} error");
  760. _isStartAutoSpeed = false;
  761. }
  762. else if (rsState == RState.End)
  763. {
  764. if (_currentOperation == VPWOperation.PumpEnable)
  765. {
  766. _isStartAutoSpeed = true;
  767. }
  768. else if (_currentOperation == VPWOperation.PumpDisable)
  769. {
  770. _isStartAutoSpeed = false;
  771. }
  772. _status = RState.End;
  773. _currentOperation = VPWOperation.None;
  774. }
  775. }
  776. }
  777. if (_isStartAutoSpeed)
  778. {
  779. AdjustPumpSpeed();
  780. }
  781. return true;
  782. }
  783. /// <summary>
  784. /// 调速
  785. /// </summary>
  786. public void AdjustPumpSpeed()
  787. {
  788. //Speed Auto模式同时pump enbled,根据kdi调整泵速
  789. if (_commonData.BoosterPumpSpeedAuto && _commonData.BoosterPumpEnable)
  790. {
  791. _pumpKp = SC.GetValue<double>($"VPWMain.PumpKp");
  792. _pumpKd = SC.GetValue<double>($"VPWMain.PumpKd");
  793. _pumpKi = SC.GetValue<double>($"VPWMain.PumpKi");
  794. double limit = SC.GetValue<double>("VPWMain.PrewetTargetLimit");
  795. double downLimit = SC.GetValue<double>("VPWMain.PrewetDownTargetLimit");
  796. double minSpeedDelta = SC.GetValue<double>("VPWMain.MinSpeedDelta");
  797. short speed = PdiAlgorithm.Instance.CalculateSpeed(_pumpKp, _pumpKi, _pumpKd, _commonData.PressureTarget,
  798. _commonData.BoosterPumpPressureData.Value, _lastBoosterPumpSpeed, limit, downLimit, minSpeedDelta);
  799. //short speed = PdiAlgorithm.Instance.CalculateSpeed(PrewetPumpData.PressureTarget, PrewetPumpData.PumpPressureData.Value,
  800. // _lastPumpSpeed, limit, downLimit);
  801. if (Math.Abs(speed - _lastBoosterPumpSpeed) >= 1)
  802. {
  803. _lastBoosterPumpSpeed = speed;
  804. BoosterPumpSpeed(speed);
  805. }
  806. }
  807. }
  808. /// <summary>
  809. /// 当前Routine;
  810. /// </summary>
  811. /// <returns></returns>
  812. private IRoutine GetCurrentRoutine()
  813. {
  814. switch (_currentOperation)
  815. {
  816. case VPWOperation.PumpEnable:
  817. return _boosterPumpEnableRoutine;
  818. case VPWOperation.PumpDisable:
  819. return _boosterPumpDisableRoutine;
  820. case VPWOperation.HomeAllRotation:
  821. return _simpleHomeRoutine;
  822. default:
  823. return null;
  824. }
  825. }
  826. /// <summary>
  827. /// 监控
  828. /// </summary>
  829. public void Monitor()
  830. {
  831. }
  832. public void Reset()
  833. {
  834. }
  835. public void Terminate()
  836. {
  837. }
  838. }
  839. }