VpwMainDevice.cs 38 KB

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