PrewetDevice.cs 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663
  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.Persistent.Prewet;
  12. using MECF.Framework.Common.TwinCat;
  13. using CyberX8_Core;
  14. using System;
  15. using System.Collections.Generic;
  16. using System.Reflection;
  17. using CyberX8_RT.Modules;
  18. using CyberX8_RT.Modules.Prewet;
  19. using CyberX8_RT.Modules.Metal;
  20. using MECF.Framework.Common.Persistent.Temperature;
  21. using MECF.Framework.Common.IOCore;
  22. namespace CyberX8_RT.Devices.Prewet
  23. {
  24. public class PrewetDevice : BaseDevice, IDevice
  25. {
  26. private enum PrewetOperation
  27. {
  28. None,
  29. PumpEnable,
  30. PumpDisable
  31. }
  32. #region 常量
  33. private const string PUMP_VALVE = "PumpValve";
  34. private const string PUMP_ENABLE = "PumpEnable";
  35. private const string PUMP_SPEED = "PumpSpeed";
  36. private const string PUMP_STAUS = "PumpStatus";
  37. private const string PUMP_CURRENT = "PumpCurrent";
  38. private const string PUMP_FLOW = "PumpFlow";
  39. private const string PUMP_PRESSURE = "PumpPressure";
  40. private const string PUMP_DATA = "PumpData";
  41. private const string PERSISTENT_VALUE = "PersistentValue";
  42. #endregion
  43. #region 内部变量
  44. /// <summary>
  45. /// 数据
  46. /// </summary>
  47. private PrewetPumpData _prewetPumpData=new PrewetPumpData();
  48. /// <summary>
  49. /// pdi控制中的p
  50. /// </summary>
  51. private double _pumpKp;
  52. /// <summary>
  53. /// pdi控制中的i
  54. /// </summary>
  55. private double _pumpKi;
  56. /// <summary>
  57. /// pdi控制中的d
  58. /// </summary>
  59. private double _pumpKd;
  60. /// <summary>
  61. /// 操作当前状态
  62. /// </summary>
  63. private RState _status;
  64. /// <summary>
  65. /// 当前操作
  66. /// </summary>
  67. private PrewetOperation _currentOperation;
  68. /// <summary>
  69. /// Prewet 持久性数值对象
  70. /// </summary>
  71. private PrewetPersistentValue _prewetPersistentValue;
  72. /// <summary>
  73. /// Pump Enable routine
  74. /// </summary>
  75. private PrewetPumpEnableRoutine _prewetPumpEnableRoutine;
  76. /// <summary>
  77. /// Pump Disable routine
  78. /// </summary>
  79. private PrewetPumpDisableRoutine _prewetPumpDisableRoutine;
  80. /// <summary>
  81. /// 上一次Pump速度
  82. /// </summary>
  83. private short _lastPumpSpeed;
  84. /// <summary>
  85. /// 变量是否初始化字典
  86. /// </summary>
  87. private Dictionary<string, bool> _variableInitializeDic = new Dictionary<string, bool>();
  88. /// <summary>
  89. /// 定时器Job
  90. /// </summary>
  91. PeriodicJob _periodicJob = null;
  92. /// <summary>
  93. /// Run recipe total time
  94. /// </summary>
  95. public int _runRecipeTotalTime;
  96. #endregion
  97. #region 属性
  98. /// <summary>
  99. /// Pump 数据
  100. /// </summary>
  101. public PrewetPumpData PrewetPumpData { get { return _prewetPumpData; } }
  102. /// <summary>
  103. /// 操作当前状态
  104. /// </summary>
  105. public RState Status { get { return _status; } }
  106. /// <summary>
  107. /// 所有io变量是否初始化
  108. /// </summary>
  109. public bool IOInitialized { get { return AllIoVariableInitialized(); } }
  110. /// <summary>
  111. /// Last Pump Speed
  112. /// </summary>
  113. public short LastPumpSpeed { get { return _lastPumpSpeed; } }
  114. /// 是否启动调速
  115. /// </summary>
  116. public bool IsStartAutoSpeed { get; set; }
  117. #endregion
  118. /// <summary>
  119. /// 构造函数
  120. /// </summary>
  121. /// <param name="moduleName"></param>
  122. /// <param name="name"></param>
  123. public PrewetDevice(string moduleName) : base(moduleName, moduleName,moduleName,moduleName)
  124. {
  125. _prewetPumpData = new PrewetPumpData();
  126. _prewetPumpData.PumpPressureData = new MECF.Framework.Common.CommonData.CommonLimitData();
  127. _prewetPumpData.PumpFlowData = new MECF.Framework.Common.CommonData.CommonLimitData();
  128. _periodicJob = new PeriodicJob(100, OnTimer, $"{Module}.OnTimer", true);
  129. }
  130. /// <summary>
  131. /// 初始化
  132. /// </summary>
  133. /// <returns></returns>
  134. public bool Initialize()
  135. {
  136. InitializeParameter();
  137. InitializeRoutine();
  138. SubscribeData();
  139. SubscribeValueAction();
  140. InitializeOperation();
  141. return true;
  142. }
  143. /// <summary>
  144. /// 初始化参数
  145. /// </summary>
  146. private void InitializeParameter()
  147. {
  148. _prewetPersistentValue = PrewetPersistentManager.Instance.GetPrewetPersistentValue(Module);
  149. if (_prewetPersistentValue != null)
  150. {
  151. _lastPumpSpeed = _prewetPersistentValue.Speed;
  152. }
  153. else
  154. {
  155. LOG.WriteLog(eEvent.ERR_PREWET, Module, "Persistent Value Object is not exist");
  156. }
  157. }
  158. /// <summary>
  159. /// 初始化Routine
  160. /// </summary>
  161. private void InitializeRoutine()
  162. {
  163. _prewetPumpEnableRoutine = new PrewetPumpEnableRoutine(Module, this, _prewetPersistentValue);
  164. _prewetPumpDisableRoutine = new PrewetPumpDisableRoutine(Module, this, _prewetPersistentValue);
  165. }
  166. /// <summary>
  167. /// 订阅数据
  168. /// </summary>
  169. private void SubscribeData()
  170. {
  171. DATA.Subscribe($"{Module}.{PERSISTENT_VALUE}", () => _prewetPersistentValue, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  172. DATA.Subscribe($"{Module}.{PUMP_DATA}", () => PrewetPumpData, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  173. DATA.Subscribe($"{Module}.OfTotalTime", () => _runRecipeTotalTime ,SubscriptionAttribute.FLAG.IgnoreSaveDB);
  174. DATA.Subscribe($"{Module}.PumpStatus", () => PrewetPumpData.PumpStatus, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  175. DATA.Subscribe($"{Module}.PumpCurrent",()=>PrewetPumpData.PumpCurrent,SubscriptionAttribute.FLAG.IgnoreSaveDB);
  176. DATA.Subscribe($"{Module}.PumpSpeed", () => _lastPumpSpeed, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  177. DATA.Subscribe($"{Module}.PumpEnable", () => PrewetPumpData.PumpEnable, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  178. DATA.Subscribe($"{Module}.PumpValve", () => PrewetPumpData.PumpValve, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  179. DATA.Subscribe($"{Module}.PumpFlow", () => PrewetPumpData.PumpFlowData.Value, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  180. DATA.Subscribe($"{Module}.PumpFlow.MinWarning", () => PrewetPumpData.PumpFlowData.MinWarning, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  181. DATA.Subscribe($"{Module}.PumpFlow.MaxWarning", () => PrewetPumpData.PumpFlowData.MaxWarning, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  182. DATA.Subscribe($"{Module}.PumpFlow.MinError", () => PrewetPumpData.PumpFlowData.MinError, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  183. DATA.Subscribe($"{Module}.PumpFlow.MaxError", () => PrewetPumpData.PumpFlowData.MaxError, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  184. DATA.Subscribe($"{Module}.PumpPressure", () => PrewetPumpData.PumpPressureData.Value, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  185. DATA.Subscribe($"{Module}.PumpPressure.MinWarning", () => PrewetPumpData.PumpPressureData.MinWarning, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  186. DATA.Subscribe($"{Module}.PumpPressure.MaxWarning", () => PrewetPumpData.PumpPressureData.MaxWarning, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  187. DATA.Subscribe($"{Module}.PumpPressure.MinError", () => PrewetPumpData.PumpPressureData.MinError, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  188. DATA.Subscribe($"{Module}.PumpPressure.MaxError", () => PrewetPumpData.PumpPressureData.MaxError, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  189. DATA.Subscribe($"{Module}.TargetPressure", () => PrewetPumpData.PressureTarget, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  190. }
  191. /// <summary>
  192. /// 订阅变量数值发生变化
  193. /// </summary>
  194. private void SubscribeValueAction()
  195. {
  196. BeckhoffIoSubscribeUpdateVariable( PUMP_VALVE);
  197. BeckhoffIoSubscribeUpdateVariable( PUMP_ENABLE);
  198. BeckhoffIoSubscribeUpdateVariable( PUMP_STAUS);
  199. BeckhoffIoSubscribeUpdateVariable( PUMP_CURRENT);
  200. BeckhoffIoSubscribeUpdateVariable( PUMP_PRESSURE);
  201. BeckhoffIoSubscribeUpdateVariable( PUMP_FLOW);
  202. }
  203. /// <summary>
  204. /// 订阅IO变量
  205. /// </summary>
  206. /// <param name="variable"></param>
  207. private void BeckhoffIoSubscribeUpdateVariable(string variable)
  208. {
  209. _variableInitializeDic[variable] = false;
  210. IOModuleManager.Instance.SubscribeModuleVariable(Module, variable, UpdateVariableValue);
  211. }
  212. /// <summary>
  213. /// 更新变量数值
  214. /// </summary>
  215. /// <param name="variable"></param>
  216. /// <param name="value"></param>
  217. private void UpdateVariableValue(string variable, object value)
  218. {
  219. if (!PrewetPumpData.IsDataInitialized)
  220. {
  221. PrewetPumpData.IsDataInitialized = true;
  222. PrewetPumpData.PumpModel = "Manual";
  223. }
  224. PropertyInfo property = PrewetPumpData.GetType().GetProperty(variable);
  225. if (property != null)
  226. {
  227. property.SetValue(PrewetPumpData, value);
  228. }
  229. if (_variableInitializeDic.ContainsKey(variable) && !_variableInitializeDic[variable])
  230. {
  231. _variableInitializeDic[variable] = true;
  232. }
  233. switch (variable)
  234. {
  235. case PUMP_STAUS:
  236. string statusContent = PrewetPumpData.PumpStatus ? "On" : "Off";
  237. PrewetPumpData.PumpStatusContent = $"{PrewetPumpData.PumpModel}: {statusContent}";
  238. break;
  239. case PUMP_FLOW:
  240. if (double.TryParse(value.ToString(), out var flow))
  241. {
  242. PrewetPumpData.PumpFlowData.Value = flow;
  243. }
  244. break;
  245. case PUMP_PRESSURE:
  246. if(double.TryParse(value.ToString(),out var pressure))
  247. {
  248. PrewetPumpData.PumpPressureData.Value = pressure;
  249. }
  250. break;
  251. }
  252. }
  253. /// <summary>
  254. /// 是否所有IO变量初始化完成
  255. /// </summary>
  256. /// <returns></returns>
  257. private bool AllIoVariableInitialized()
  258. {
  259. foreach (string item in _variableInitializeDic.Keys)
  260. {
  261. if (!_variableInitializeDic[item])
  262. {
  263. LOG.WriteLog(eEvent.ERR_PREWET, Module, $"{item} is not initialized");
  264. return false;
  265. }
  266. }
  267. return true;
  268. }
  269. /// <summary>
  270. /// 初始化操作
  271. /// </summary>
  272. private void InitializeOperation()
  273. {
  274. OP.Subscribe($"{Module}.PumpValveOn", PumpValveOnOperation);
  275. OP.Subscribe($"{Module}.PumpValveOff", PumpValveOffOperation);
  276. OP.Subscribe($"{Module}.PumpEnable", PumpEnableOperation);
  277. OP.Subscribe($"{Module}.PumpDisable", PumpDisableOperation);
  278. OP.Subscribe($"{Module}.PumpSpeedManual", PumpSpeedManualOperation);
  279. OP.Subscribe($"{Module}.PumpSpeedAuto", PumpSpeedAutoOperation);
  280. OP.Subscribe($"{Module}.PumpSpeedKeyDown", PumpSpeedKeyDownOperation);
  281. OP.Subscribe($"{Module}.DisabledAction", DisabledOperation);
  282. OP.Subscribe($"{Module}.ManualAction", ManualOperation);
  283. OP.Subscribe($"{Module}.AutoAction", AutoOperation);
  284. OP.Subscribe($"{Module}.EngineeringModeAction", EngineeringModeOperation);
  285. OP.Subscribe($"{Module}.ProductionModeAction", ProductionModeOperation);
  286. }
  287. /// <summary>
  288. /// 定时器
  289. /// </summary>
  290. /// <returns></returns>
  291. private bool OnTimer()
  292. {
  293. PrewetPumpData.PumpFlowData.MinError = SC.GetValue<double>($"Prewet.PumpFlow.Error_Min");
  294. PrewetPumpData.PumpFlowData.MinWarning = SC.GetValue<double>($"Prewet.PumpFlow.Warning_Min");
  295. PrewetPumpData.PumpFlowData.MaxError = SC.GetValue<double>($"Prewet.PumpFlow.Error_Max");
  296. PrewetPumpData.PumpFlowData.MaxWarning = SC.GetValue<double>($"Prewet.PumpFlow.Warning_Max");
  297. PrewetPumpData.PumpPressureData.MinError = SC.GetValue<double>($"Prewet.PumpPressure.Error_Min");
  298. PrewetPumpData.PumpPressureData.MinWarning = SC.GetValue<double>($"Prewet.PumpPressure.Warning_Min");
  299. PrewetPumpData.PumpPressureData.MaxError = SC.GetValue<double>($"Prewet.PumpPressure.Error_Max");
  300. PrewetPumpData.PumpPressureData.MaxWarning = SC.GetValue<double>($"Prewet.PumpPressure.Warning_Max");
  301. PrewetPumpData.PressureTarget = SC.GetValue<double>($"Prewet.PressureTarget");
  302. if (_status == RState.Running)
  303. {
  304. IRoutine routine = GetCurrentRoutine();
  305. if (routine != null)
  306. {
  307. RState rsState = routine.Monitor();
  308. if (rsState == RState.Failed || rsState == RState.Timeout)
  309. {
  310. _status = RState.Failed;
  311. _currentOperation = PrewetOperation.None;
  312. LOG.WriteLog(eEvent.ERR_LINMOT, Module.ToString(), $"{_currentOperation} error");
  313. IsStartAutoSpeed = false;
  314. }
  315. else if (rsState == RState.End)
  316. {
  317. if (_currentOperation == PrewetOperation.PumpEnable)
  318. {
  319. IsStartAutoSpeed = true;
  320. }
  321. else
  322. {
  323. IsStartAutoSpeed = false;
  324. }
  325. _status = RState.End;
  326. _currentOperation = PrewetOperation.None;
  327. }
  328. }
  329. }
  330. if (IsStartAutoSpeed)
  331. {
  332. AdjustPumpSpeed();
  333. }
  334. return true;
  335. }
  336. /// <summary>
  337. /// 调速
  338. /// </summary>
  339. public void AdjustPumpSpeed()
  340. {
  341. //Speed Auto模式同时pump enbled,根据kdi调整泵速
  342. if (PrewetPumpData.PumpSpeedAuto && PrewetPumpData.PumpEnable)
  343. {
  344. _pumpKp = SC.GetValue<double>($"Prewet.PumpKp");
  345. _pumpKd = SC.GetValue<double>($"Prewet.PumpKd");
  346. _pumpKi = SC.GetValue<double>($"Prewet.PumpKi");
  347. double limit = SC.GetValue<double>("Prewet.PrewetTargetLimit");
  348. short speed = PdiAlgorithm.Instance.CalculateSpeed(_pumpKp, _pumpKi, _pumpKd, PrewetPumpData.PressureTarget,
  349. PrewetPumpData.PumpPressureData.Value, _lastPumpSpeed,limit);
  350. if (Math.Abs(speed - _lastPumpSpeed) >= 1)
  351. {
  352. _lastPumpSpeed = speed;
  353. PumpSpeed(speed);
  354. }
  355. }
  356. else
  357. {
  358. IsStartAutoSpeed = false;
  359. }
  360. }
  361. /// <summary>
  362. /// 当前Routine;
  363. /// </summary>
  364. /// <returns></returns>
  365. private IRoutine GetCurrentRoutine()
  366. {
  367. switch (_currentOperation)
  368. {
  369. case PrewetOperation.PumpEnable:
  370. return _prewetPumpEnableRoutine;
  371. case PrewetOperation.PumpDisable:
  372. return _prewetPumpDisableRoutine;
  373. default:
  374. return null;
  375. }
  376. }
  377. #region Operation
  378. /// <summary>
  379. /// DisabledAction
  380. /// </summary>
  381. /// <param name="cmd"></param>
  382. /// <param name="param"></param>
  383. /// <returns></returns>
  384. private bool DisabledOperation(string cmd, object[] args)
  385. {
  386. string currentOperation = "Disabled";
  387. PrewetEntity prewetEntity = Singleton<RouteManager>.Instance.GetModule<PrewetEntity>(Module);
  388. if (prewetEntity == null || _prewetPersistentValue == null) return false;
  389. if (_prewetPersistentValue.OperatingMode != "Disabled") prewetEntity.EnterInit();
  390. _prewetPersistentValue.OperatingMode = currentOperation;
  391. PrewetPersistentManager.Instance.UpdatePersistentValue(Module);
  392. return true;
  393. }
  394. /// <summary>
  395. /// ManualAction
  396. /// </summary>
  397. /// <param name="cmd"></param>
  398. /// <param name="param"></param>
  399. /// <returns></returns>
  400. private bool ManualOperation(string cmd, object[] args)
  401. {
  402. string currentOperation = "Manual";
  403. PrewetEntity prewetEntity = Singleton<RouteManager>.Instance.GetModule<PrewetEntity>(Module);
  404. if (prewetEntity == null || _prewetPersistentValue == null) return false;
  405. if (_prewetPersistentValue.OperatingMode == "Auto" && prewetEntity.IsBusy)
  406. {
  407. LOG.WriteLog(eEvent.ERR_PREWET, Module, $"{Module} is Busy, can't change to manual mode");
  408. return false;
  409. }
  410. if (_prewetPersistentValue.OperatingMode != "Manual") prewetEntity.EnterInit();
  411. _prewetPersistentValue.OperatingMode = currentOperation;
  412. PrewetPersistentManager.Instance.UpdatePersistentValue(Module);
  413. return true;
  414. }
  415. /// <summary>
  416. /// AutoAction
  417. /// </summary>
  418. /// <param name="cmd"></param>
  419. /// <param name="param"></param>
  420. /// <returns></returns>
  421. private bool AutoOperation(string cmd, object[] args)
  422. {
  423. string currentOperation = "Auto";
  424. PrewetEntity prewetEntity = Singleton<RouteManager>.Instance.GetModule<PrewetEntity>(Module);
  425. if (prewetEntity == null || _prewetPersistentValue == null) return false;
  426. if (_prewetPersistentValue.OperatingMode != "Auto") prewetEntity.EnterInit();
  427. _prewetPersistentValue.OperatingMode = currentOperation;
  428. PrewetPersistentManager.Instance.UpdatePersistentValue(Module);
  429. return true;
  430. }
  431. /// <summary>
  432. /// EngineeringModeAction
  433. /// </summary>
  434. /// <param name="cmd"></param>
  435. /// <param name="param"></param>
  436. /// <returns></returns>
  437. private bool EngineeringModeOperation(string cmd, object[] args)
  438. {
  439. string currentRecipeOperation = "Engineering";
  440. _prewetPersistentValue.RecipeOperatingMode=currentRecipeOperation;
  441. PrewetPersistentManager.Instance.UpdatePersistentValue(Module);
  442. return true;
  443. }
  444. /// <summary>
  445. /// ProductionAction
  446. /// </summary>
  447. /// <param name="cmd"></param>
  448. /// <param name="param"></param>
  449. /// <returns></returns>
  450. private bool ProductionModeOperation(string cmd, object[] args)
  451. {
  452. string currentRecipeOperation = "Production";
  453. _prewetPersistentValue.RecipeOperatingMode = currentRecipeOperation;
  454. PrewetPersistentManager.Instance.UpdatePersistentValue(Module);
  455. return true;
  456. }
  457. /// <summary>
  458. /// Pump Valve On
  459. /// </summary>
  460. /// <param name="cmd"></param>
  461. /// <param name="param"></param>
  462. /// <returns></returns>
  463. public bool PumpValveOnOperation(string cmd, object[] param)
  464. {
  465. return PumpValveOpen();
  466. }
  467. /// <summary>
  468. /// Pump Valve Off
  469. /// </summary>
  470. /// <param name="cmd"></param>
  471. /// <param name="param"></param>
  472. /// <returns></returns>
  473. public bool PumpValveOffOperation(string cmd, object[] param)
  474. {
  475. return PumpValveClose();
  476. }
  477. /// <summary>
  478. /// Pump Valve Open
  479. /// </summary>
  480. /// <returns></returns>
  481. public bool PumpValveOpen()
  482. {
  483. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{PUMP_VALVE}");
  484. return IOModuleManager.Instance.WriteIoValue(ioName, true);
  485. }
  486. /// <summary>
  487. /// Pump Valve Close
  488. /// </summary>
  489. /// <returns></returns>
  490. public bool PumpValveClose()
  491. {
  492. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{PUMP_VALVE}");
  493. bool result= IOModuleManager.Instance.WriteIoValue(ioName, false);
  494. if(result && PrewetPumpData.PumpEnable)
  495. {
  496. PumpDisable();
  497. }
  498. return result;
  499. }
  500. /// <summary>
  501. /// Pump Enable操作
  502. /// </summary>
  503. /// <param name="cmd"></param>
  504. /// <param name="param"></param>
  505. /// <returns></returns>
  506. public bool PumpEnableOperation(string cmd, object[] param)
  507. {
  508. if (_status == RState.Running)
  509. {
  510. LOG.WriteLog(eEvent.ERR_PREWET, Module.ToString(), $"{Module} current execute {_currentOperation},cannot Pump enable");
  511. return false;
  512. }
  513. _status = _prewetPumpEnableRoutine.Start();
  514. _currentOperation = PrewetOperation.PumpEnable;
  515. return _status==RState.Running;
  516. }
  517. /// <summary>
  518. /// pump disable 操作
  519. /// </summary>
  520. /// <param name="cmd"></param>
  521. /// <param name="param"></param>
  522. /// <returns></returns>
  523. public bool PumpDisableOperation(string cmd, object[] param)
  524. {
  525. if (_status == RState.Running)
  526. {
  527. LOG.WriteLog(eEvent.ERR_PREWET, Module.ToString(), $"{Module} current execute {_currentOperation},cannot Pump disable");
  528. return false;
  529. }
  530. _status = _prewetPumpDisableRoutine.Start();
  531. _currentOperation = PrewetOperation.PumpDisable;
  532. return _status == RState.Running;
  533. //return PumpDisable();
  534. }
  535. /// <summary>
  536. /// Pump enable
  537. /// </summary>
  538. /// <returns></returns>
  539. public bool PumpEnable()
  540. {
  541. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{PUMP_ENABLE}");
  542. return IOModuleManager.Instance.WriteIoValue(ioName, true);
  543. }
  544. /// <summary>
  545. /// Pump disable
  546. /// </summary>
  547. /// <returns></returns>
  548. public bool PumpDisable()
  549. {
  550. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{PUMP_ENABLE}");
  551. return IOModuleManager.Instance.WriteIoValue(ioName, false);
  552. }
  553. /// <summary>
  554. /// 写入Pump速度
  555. /// </summary>
  556. /// <param name="speed"></param>
  557. /// <returns></returns>
  558. public bool PumpSpeed(short speed=0)
  559. {
  560. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{PUMP_SPEED}");
  561. return IOModuleManager.Instance.WriteIoValue(ioName, speed==0?_lastPumpSpeed:speed);
  562. }
  563. /// <summary>
  564. /// Pump Speed手动模式
  565. /// </summary>
  566. /// <param name="cmd"></param>
  567. /// <param name="param"></param>
  568. /// <returns></returns>
  569. public bool PumpSpeedManualOperation(string cmd, object[] param)
  570. {
  571. PrewetPumpData.PumpSpeedAuto = false;
  572. PrewetPumpData.PumpModel = "Manual";
  573. string statusContent = PrewetPumpData.PumpStatus ? "On" : "Off";
  574. PrewetPumpData.PumpStatusContent = $"{PrewetPumpData.PumpModel}: {statusContent}";
  575. return true;
  576. }
  577. /// <summary>
  578. /// Pump Speed自动模式
  579. /// </summary>
  580. /// <param name="cmd"></param>
  581. /// <param name="param"></param>
  582. /// <returns></returns>
  583. public bool PumpSpeedAutoOperation(string cmd, object[] param)
  584. {
  585. PrewetPumpData.PumpSpeedAuto = true;
  586. PrewetPumpData.PumpModel = "Auto";
  587. string statusContent = PrewetPumpData.PumpStatus ? "On" : "Off";
  588. PrewetPumpData.PumpStatusContent = $"{PrewetPumpData.PumpModel}: {statusContent}";
  589. return true;
  590. }
  591. /// <summary>
  592. /// Pump Speed回车操作
  593. /// </summary>
  594. /// <param name="cmd"></param>
  595. /// <param name="param"></param>
  596. /// <returns></returns>
  597. public bool PumpSpeedKeyDownOperation(string cmd, object[] param)
  598. {
  599. if (PrewetPumpData.PumpSpeedAuto)
  600. {
  601. LOG.WriteLog(eEvent.ERR_PREWET, Module, "Pump speed is auto,cannot change speed");
  602. return false;
  603. }
  604. short speed=(short)param[0];
  605. bool result = PumpSpeed(speed);
  606. if(result)
  607. {
  608. _prewetPersistentValue.Speed = speed;
  609. _lastPumpSpeed = speed;
  610. PrewetPersistentManager.Instance.UpdatePersistentValue(Module);
  611. }
  612. return true;
  613. }
  614. /// <summary>
  615. /// 中止当前Routine
  616. /// </summary>
  617. public void AbortCurrentRoutine()
  618. {
  619. if (_status == RState.Running)
  620. {
  621. IRoutine routine = GetCurrentRoutine();
  622. if (routine != null)
  623. {
  624. routine.Abort();
  625. _currentOperation = PrewetOperation.None;
  626. }
  627. }
  628. }
  629. #endregion
  630. #region 设备接口
  631. /// <summary>
  632. /// 监控
  633. /// </summary>
  634. public void Monitor()
  635. {
  636. }
  637. public void Reset()
  638. {
  639. }
  640. public void Terminate()
  641. {
  642. _prewetPersistentValue.Speed = _lastPumpSpeed;
  643. PrewetPersistentManager.Instance.UpdatePersistentValue(Module);
  644. _periodicJob.Stop(false);
  645. }
  646. #endregion
  647. }
  648. }