VpwMainDevice.cs 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860
  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. private bool DegasAdjustOn()
  405. {
  406. return WriteVariableValue(DEGAS_ADJUST, true);
  407. }
  408. /// <summary>
  409. /// Degas Adjust Off
  410. /// </summary>
  411. /// <returns></returns>
  412. private bool DegasAdjustOff()
  413. {
  414. return WriteVariableValue(DEGAS_ADJUST, false);
  415. }
  416. /// <summary>
  417. /// DIW Degas Valve On
  418. /// </summary>
  419. /// <returns></returns>
  420. private bool DiwDegasValveOn()
  421. {
  422. return WriteVariableValue(DIW_DEGAS, true);
  423. }
  424. /// <summary>
  425. /// DIW Degas Valve Off
  426. /// </summary>
  427. /// <returns></returns>
  428. private bool DiwDegasValveOff()
  429. {
  430. return WriteVariableValue(DIW_DEGAS, false);
  431. }
  432. #endregion
  433. #region Booster Pump
  434. /// <summary>
  435. /// Pump Enable操作
  436. /// </summary>
  437. /// <param name="cmd"></param>
  438. /// <param name="param"></param>
  439. /// <returns></returns>
  440. public bool BoosterPumpEnableOperation(string cmd, object[] param)
  441. {
  442. if (_status == RState.Running)
  443. {
  444. LOG.WriteLog(eEvent.ERR_PREWET, Module.ToString(), $"{Module} current execute {_currentOperation},cannot Pump enable");
  445. return false;
  446. }
  447. _status = _boosterPumpEnableRoutine.Start();
  448. _currentOperation = VPWOperation.PumpEnable;
  449. return _status == RState.Running;
  450. }
  451. /// <summary>
  452. /// pump disable 操作
  453. /// </summary>
  454. /// <param name="cmd"></param>
  455. /// <param name="param"></param>
  456. /// <returns></returns>
  457. public bool BoosterPumpDisableOperation(string cmd, object[] param)
  458. {
  459. if (_status == RState.Running)
  460. {
  461. LOG.WriteLog(eEvent.ERR_PREWET, Module.ToString(), $"{Module} current execute {_currentOperation},cannot Pump disable");
  462. return false;
  463. }
  464. _status = _boosterPumpDisableRoutine.Start();
  465. _currentOperation = VPWOperation.PumpDisable;
  466. return _status == RState.Running;
  467. //return PumpDisable();
  468. }
  469. /// <summary>
  470. /// Booster Pump enable
  471. /// </summary>
  472. /// <returns></returns>
  473. public bool BoosterPumpEnable()
  474. {
  475. return WriteVariableValue(BOOSTER_PUMP_ENABLE, true);
  476. }
  477. /// <summary>
  478. /// Booster Pump Disable
  479. /// </summary>
  480. /// <returns></returns>
  481. public bool BoosterPumpDisable()
  482. {
  483. return WriteVariableValue(BOOSTER_PUMP_ENABLE, false);
  484. }
  485. /// <summary>
  486. /// 写入Booster泵速
  487. /// </summary>
  488. /// <param name="speed"></param>
  489. /// <returns></returns>
  490. public bool BoosterPumpSpeed(short speed=0)
  491. {
  492. return WriteVariableValue(BOOSTER_PUMP_SPEED, speed == 0 ? _lastBoosterPumpSpeed : speed);
  493. }
  494. /// Booster Pump Speed回车操作
  495. /// </summary>
  496. /// <param name="cmd"></param>
  497. /// <param name="param"></param>
  498. /// <returns></returns>
  499. private bool BoosterPumpSpeedKeyDownOperation(string cmd, object[] param)
  500. {
  501. if (_commonData.BoosterPumpSpeedAuto)
  502. {
  503. LOG.WriteLog(eEvent.ERR_PREWET, Module, "Pump speed is auto,cannot change speed");
  504. return false;
  505. }
  506. short speed = (short)param[0];
  507. bool result = BoosterPumpSpeed(speed);
  508. if (result)
  509. {
  510. _vpwMainPersistentValue.Speed = speed;
  511. _lastBoosterPumpSpeed = speed;
  512. VpwMainPersistentManager.Instance.UpdatePersistentValue(Module);
  513. }
  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 BoosterPumpSpeedManualOperation()
  523. {
  524. _commonData.BoosterPumpSpeedAuto = false;
  525. _commonData.BoosterPumpModel = "Manual";
  526. string statusContent = _commonData.BoosterPumpStatus ? "On" : "Off";
  527. _commonData.BoosterPumpStatusContent = $"{_commonData.BoosterPumpModel}: {statusContent}";
  528. return true;
  529. }
  530. /// <summary>
  531. /// Pump Speed自动模式
  532. /// </summary>
  533. /// <param name="cmd"></param>
  534. /// <param name="param"></param>
  535. /// <returns></returns>
  536. private bool BoosterPumpSpeedAutoOperation()
  537. {
  538. _commonData.BoosterPumpSpeedAuto = true;
  539. _commonData.BoosterPumpModel = "Auto";
  540. string statusContent = _commonData.BoosterPumpStatus ? "On" : "Off";
  541. _commonData.BoosterPumpStatusContent = $"{_commonData.BoosterPumpModel}: {statusContent}";
  542. return true;
  543. }
  544. #endregion
  545. #region Chamber
  546. /// <summary>
  547. /// 上升
  548. /// </summary>
  549. /// <returns></returns>
  550. public bool ChamberUp()
  551. {
  552. return WriteVariableValue(CHAMBER_CLOSE, false);
  553. }
  554. /// <summary>
  555. /// 下降
  556. /// </summary>
  557. /// <returns></returns>
  558. public bool ChamberDown()
  559. {
  560. return WriteVariableValue(CHAMBER_CLOSE, true);
  561. }
  562. #endregion
  563. #region Mode switch
  564. /// <summary>
  565. /// DisabledAction
  566. /// </summary>
  567. /// <param name="cmd"></param>
  568. /// <param name="param"></param>
  569. /// <returns></returns>
  570. private bool DisabledOperation(string cmd, object[] args)
  571. {
  572. string currentOperation = "Disabled";
  573. VpwMainEntity vpwMainEntity = Singleton<RouteManager>.Instance.GetModule<VpwMainEntity>(Module);
  574. if (vpwMainEntity != null && _vpwMainPersistentValue != null && _vpwMainPersistentValue.OperatingMode != currentOperation)
  575. {
  576. string preOperation = _vpwMainPersistentValue.OperatingMode;
  577. if (vpwMainEntity.IsBusy)
  578. {
  579. LOG.WriteLog(eEvent.ERR_VPWMAIN, Module, $"{Module} is Busy, can't switch to Disabled mode");
  580. return false;
  581. }
  582. vpwMainEntity.EnterInit();
  583. _vpwMainPersistentValue.OperatingMode = currentOperation;
  584. LOG.WriteLog(eEvent.INFO_VPWMAIN, Module, $"Operating mode is switched from {preOperation} to {currentOperation}");
  585. }
  586. VpwMainPersistentManager.Instance.UpdatePersistentValue(Module);
  587. return true;
  588. }
  589. /// <summary>
  590. /// ManualAction
  591. /// </summary>
  592. /// <param name="cmd"></param>
  593. /// <param name="param"></param>
  594. /// <returns></returns>
  595. private bool ManualOperation(string cmd, object[] args)
  596. {
  597. string currentOperation = "Manual";
  598. VpwMainEntity vpwMainEntity = Singleton<RouteManager>.Instance.GetModule<VpwMainEntity>(Module);
  599. if (vpwMainEntity != null && _vpwMainPersistentValue != null && _vpwMainPersistentValue.OperatingMode != currentOperation)
  600. {
  601. string preOperation = _vpwMainPersistentValue.OperatingMode;
  602. if (vpwMainEntity.IsBusy)
  603. {
  604. LOG.WriteLog(eEvent.ERR_VPWMAIN, Module, $"{Module} is Busy, can't switch to Manual mode");
  605. return false;
  606. }
  607. vpwMainEntity.EnterInit();
  608. _vpwMainPersistentValue.OperatingMode = currentOperation;
  609. LOG.WriteLog(eEvent.INFO_VPWMAIN, Module, $"Operating mode is switched from {preOperation} to {currentOperation}");
  610. }
  611. VpwMainPersistentManager.Instance.UpdatePersistentValue(Module);
  612. return true;
  613. }
  614. /// <summary>
  615. /// AutoAction
  616. /// </summary>
  617. /// <param name="cmd"></param>
  618. /// <param name="param"></param>
  619. /// <returns></returns>
  620. private bool AutoOperation(string cmd, object[] args)
  621. {
  622. string currentOperation = "Auto";
  623. VpwMainEntity vpwMainEntity = Singleton<RouteManager>.Instance.GetModule<VpwMainEntity>(Module);
  624. if (vpwMainEntity != null && _vpwMainPersistentValue != null && _vpwMainPersistentValue.OperatingMode != currentOperation)
  625. {
  626. string preOperation = _vpwMainPersistentValue.OperatingMode;
  627. if (vpwMainEntity.IsBusy)
  628. {
  629. LOG.WriteLog(eEvent.ERR_VPWMAIN, Module, $"{Module} is Busy, can't switch to Auto mode");
  630. return false;
  631. }
  632. vpwMainEntity.EnterInit();
  633. _vpwMainPersistentValue.OperatingMode = currentOperation;
  634. LOG.WriteLog(eEvent.INFO_VPWMAIN, Module, $"Operating mode is switched from {preOperation} to {currentOperation}");
  635. }
  636. VpwMainPersistentManager.Instance.UpdatePersistentValue(Module);
  637. return true;
  638. }
  639. /// <summary>
  640. /// EngineeringModeAction
  641. /// </summary>
  642. /// <param name="cmd"></param>
  643. /// <param name="param"></param>
  644. /// <returns></returns>
  645. private bool EngineeringModeOperation(string cmd, object[] args)
  646. {
  647. string currentRecipeOperation = "Engineering";
  648. if (_vpwMainPersistentValue != null)
  649. {
  650. _vpwMainPersistentValue.RecipeOperatingMode = currentRecipeOperation;
  651. }
  652. VpwMainPersistentManager.Instance.UpdatePersistentValue(Module);
  653. return true;
  654. }
  655. /// <summary>
  656. /// ProductionAction
  657. /// </summary>
  658. /// <param name="cmd"></param>
  659. /// <param name="param"></param>
  660. /// <returns></returns>
  661. private bool ProductionModeOperation(string cmd, object[] args)
  662. {
  663. string currentRecipeOperation = "Production";
  664. if (_vpwMainPersistentValue != null)
  665. {
  666. _vpwMainPersistentValue.RecipeOperatingMode = currentRecipeOperation;
  667. }
  668. VpwMainPersistentManager.Instance.UpdatePersistentValue(Module);
  669. return true;
  670. }
  671. #endregion
  672. #region DIW
  673. /// <summary>
  674. /// DIW Enable
  675. /// </summary>
  676. /// <returns></returns>
  677. public bool DiwEnable()
  678. {
  679. return WriteVariableValue(DIW_ENABLE, true);
  680. }
  681. /// <summary>
  682. /// DIW Disable
  683. /// </summary>
  684. /// <returns></returns>
  685. public bool DiwDisable()
  686. {
  687. return WriteVariableValue(DIW_ENABLE, false);
  688. }
  689. /// <summary>
  690. /// DIW Process On
  691. /// </summary>
  692. /// <returns></returns>
  693. public bool DiwProcessOn()
  694. {
  695. return WriteVariableValue(DIW_PROCESS, true);
  696. }
  697. /// <summary>
  698. /// DIW Process On
  699. /// </summary>
  700. /// <returns></returns>
  701. public bool DiwProcessOff()
  702. {
  703. return WriteVariableValue(DIW_PROCESS, false);
  704. }
  705. #endregion
  706. /// <summary>
  707. /// 写变量
  708. /// </summary>
  709. /// <param name="variable"></param>
  710. /// <param name="value"></param>
  711. /// <returns></returns>
  712. private bool WriteVariableValue(string variable, object value)
  713. {
  714. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{variable}");
  715. return IOModuleManager.Instance.WriteIoValue(ioName, value);
  716. }
  717. #endregion
  718. /// <summary>
  719. /// 定时器
  720. /// </summary>
  721. /// <returns></returns>
  722. public bool OnTimer()
  723. {
  724. _commonData.BoosterPumpPressureData.MinError = SC.GetValue<double>($"VPWMain.PumpPressure.Error_Min");
  725. _commonData.BoosterPumpPressureData.MinWarning = SC.GetValue<double>($"VPWMain.PumpPressure.Warning_Min");
  726. _commonData.BoosterPumpPressureData.MaxError = SC.GetValue<double>($"VPWMain.PumpPressure.Error_Max");
  727. _commonData.BoosterPumpPressureData.MaxWarning = SC.GetValue<double>($"VPWMain.PumpPressure.Warning_Max");
  728. _commonData.PressureTarget = SC.GetValue<double>($"VPWMain.PressureTarget");
  729. if (_status == RState.Running)
  730. {
  731. IRoutine routine = GetCurrentRoutine();
  732. if (routine != null)
  733. {
  734. RState rsState = routine.Monitor();
  735. if (rsState == RState.Failed || rsState == RState.Timeout)
  736. {
  737. _status = RState.Failed;
  738. _currentOperation = VPWOperation.None;
  739. LOG.WriteLog(eEvent.ERR_VPWMAIN, Module.ToString(), $"{_currentOperation} error");
  740. _isStartAutoSpeed = false;
  741. }
  742. else if (rsState == RState.End)
  743. {
  744. if (_currentOperation == VPWOperation.PumpEnable)
  745. {
  746. _isStartAutoSpeed = true;
  747. }
  748. else if (_currentOperation == VPWOperation.PumpDisable)
  749. {
  750. _isStartAutoSpeed = false;
  751. }
  752. _status = RState.End;
  753. _currentOperation = VPWOperation.None;
  754. }
  755. }
  756. }
  757. if (_isStartAutoSpeed)
  758. {
  759. AdjustPumpSpeed();
  760. }
  761. return true;
  762. }
  763. /// <summary>
  764. /// 调速
  765. /// </summary>
  766. public void AdjustPumpSpeed()
  767. {
  768. //Speed Auto模式同时pump enbled,根据kdi调整泵速
  769. if (_commonData.BoosterPumpSpeedAuto && _commonData.BoosterPumpEnable)
  770. {
  771. _pumpKp = SC.GetValue<double>($"VPWMain.PumpKp");
  772. _pumpKd = SC.GetValue<double>($"VPWMain.PumpKd");
  773. _pumpKi = SC.GetValue<double>($"VPWMain.PumpKi");
  774. double limit = SC.GetValue<double>("VPWMain.PrewetTargetLimit");
  775. double downLimit = SC.GetValue<double>("VPWMain.PrewetDownTargetLimit");
  776. double minSpeedDelta = SC.GetValue<double>("VPWMain.MinSpeedDelta");
  777. short speed = PdiAlgorithm.Instance.CalculateSpeed(_pumpKp, _pumpKi, _pumpKd, _commonData.PressureTarget,
  778. _commonData.BoosterPumpPressureData.Value, _lastBoosterPumpSpeed, limit, downLimit, minSpeedDelta);
  779. //short speed = PdiAlgorithm.Instance.CalculateSpeed(PrewetPumpData.PressureTarget, PrewetPumpData.PumpPressureData.Value,
  780. // _lastPumpSpeed, limit, downLimit);
  781. if (Math.Abs(speed - _lastBoosterPumpSpeed) >= 1)
  782. {
  783. _lastBoosterPumpSpeed = speed;
  784. BoosterPumpSpeed(speed);
  785. }
  786. }
  787. }
  788. /// <summary>
  789. /// 当前Routine;
  790. /// </summary>
  791. /// <returns></returns>
  792. private IRoutine GetCurrentRoutine()
  793. {
  794. switch (_currentOperation)
  795. {
  796. case VPWOperation.PumpEnable:
  797. return _boosterPumpEnableRoutine;
  798. case VPWOperation.PumpDisable:
  799. return _boosterPumpDisableRoutine;
  800. case VPWOperation.HomeAllRotation:
  801. return _simpleHomeRoutine;
  802. default:
  803. return null;
  804. }
  805. }
  806. /// <summary>
  807. /// 监控
  808. /// </summary>
  809. public void Monitor()
  810. {
  811. }
  812. public void Reset()
  813. {
  814. }
  815. public void Terminate()
  816. {
  817. }
  818. }
  819. }