PrewetDevice.cs 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691
  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 && _prewetPersistentValue.OperatingMode != currentOperation)
  389. {
  390. string preOperation = _prewetPersistentValue.OperatingMode;
  391. if (prewetEntity.IsBusy)
  392. {
  393. LOG.WriteLog(eEvent.ERR_PREWET, Module, $"{Module} is Busy, can't switch to Disabled mode");
  394. return false;
  395. }
  396. prewetEntity.EnterInit();
  397. _prewetPersistentValue.OperatingMode = currentOperation;
  398. LOG.WriteLog(eEvent.INFO_PREWET, Module, $"Operating mode is switched from {preOperation} to {currentOperation}");
  399. }
  400. PrewetPersistentManager.Instance.UpdatePersistentValue(Module);
  401. return true;
  402. }
  403. /// <summary>
  404. /// ManualAction
  405. /// </summary>
  406. /// <param name="cmd"></param>
  407. /// <param name="param"></param>
  408. /// <returns></returns>
  409. private bool ManualOperation(string cmd, object[] args)
  410. {
  411. string currentOperation = "Manual";
  412. PrewetEntity prewetEntity = Singleton<RouteManager>.Instance.GetModule<PrewetEntity>(Module);
  413. if (prewetEntity != null && _prewetPersistentValue != null && _prewetPersistentValue.OperatingMode != currentOperation)
  414. {
  415. string preOperation = _prewetPersistentValue.OperatingMode;
  416. if (prewetEntity.IsBusy)
  417. {
  418. LOG.WriteLog(eEvent.ERR_PREWET, Module, $"{Module} is Busy, can't switch to Manual mode");
  419. return false;
  420. }
  421. prewetEntity.EnterInit();
  422. _prewetPersistentValue.OperatingMode = currentOperation;
  423. LOG.WriteLog(eEvent.INFO_PREWET, Module, $"Operating mode is switched from {preOperation} to {currentOperation}");
  424. }
  425. PrewetPersistentManager.Instance.UpdatePersistentValue(Module);
  426. return true;
  427. }
  428. /// <summary>
  429. /// AutoAction
  430. /// </summary>
  431. /// <param name="cmd"></param>
  432. /// <param name="param"></param>
  433. /// <returns></returns>
  434. private bool AutoOperation(string cmd, object[] args)
  435. {
  436. string currentOperation = "Auto";
  437. PrewetEntity prewetEntity = Singleton<RouteManager>.Instance.GetModule<PrewetEntity>(Module);
  438. if (prewetEntity != null && _prewetPersistentValue != null && _prewetPersistentValue.OperatingMode != currentOperation)
  439. {
  440. string preOperation = _prewetPersistentValue.OperatingMode;
  441. if (prewetEntity.IsBusy)
  442. {
  443. LOG.WriteLog(eEvent.ERR_PREWET, Module, $"{Module} is Busy, can't switch to Auto mode");
  444. return false;
  445. }
  446. prewetEntity.EnterInit();
  447. _prewetPersistentValue.OperatingMode = currentOperation;
  448. LOG.WriteLog(eEvent.INFO_PREWET, Module, $"Operating mode is switched from {preOperation} to {currentOperation}");
  449. }
  450. PrewetPersistentManager.Instance.UpdatePersistentValue(Module);
  451. return true;
  452. }
  453. /// <summary>
  454. /// EngineeringModeAction
  455. /// </summary>
  456. /// <param name="cmd"></param>
  457. /// <param name="param"></param>
  458. /// <returns></returns>
  459. private bool EngineeringModeOperation(string cmd, object[] args)
  460. {
  461. string currentRecipeOperation = "Engineering";
  462. _prewetPersistentValue.RecipeOperatingMode=currentRecipeOperation;
  463. PrewetPersistentManager.Instance.UpdatePersistentValue(Module);
  464. return true;
  465. }
  466. /// <summary>
  467. /// ProductionAction
  468. /// </summary>
  469. /// <param name="cmd"></param>
  470. /// <param name="param"></param>
  471. /// <returns></returns>
  472. private bool ProductionModeOperation(string cmd, object[] args)
  473. {
  474. string currentRecipeOperation = "Production";
  475. _prewetPersistentValue.RecipeOperatingMode = currentRecipeOperation;
  476. PrewetPersistentManager.Instance.UpdatePersistentValue(Module);
  477. return true;
  478. }
  479. /// <summary>
  480. /// Pump Valve On
  481. /// </summary>
  482. /// <param name="cmd"></param>
  483. /// <param name="param"></param>
  484. /// <returns></returns>
  485. public bool PumpValveOnOperation(string cmd, object[] param)
  486. {
  487. return PumpValveOpen();
  488. }
  489. /// <summary>
  490. /// Pump Valve Off
  491. /// </summary>
  492. /// <param name="cmd"></param>
  493. /// <param name="param"></param>
  494. /// <returns></returns>
  495. public bool PumpValveOffOperation(string cmd, object[] param)
  496. {
  497. return PumpValveClose();
  498. }
  499. /// <summary>
  500. /// Pump Valve Open
  501. /// </summary>
  502. /// <returns></returns>
  503. public bool PumpValveOpen()
  504. {
  505. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{PUMP_VALVE}");
  506. return IOModuleManager.Instance.WriteIoValue(ioName, true);
  507. }
  508. /// <summary>
  509. /// Pump Valve Close
  510. /// </summary>
  511. /// <returns></returns>
  512. public bool PumpValveClose()
  513. {
  514. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{PUMP_VALVE}");
  515. bool result= IOModuleManager.Instance.WriteIoValue(ioName, false);
  516. if(result && PrewetPumpData.PumpEnable)
  517. {
  518. PumpDisable();
  519. }
  520. return result;
  521. }
  522. /// <summary>
  523. /// Pump Enable操作
  524. /// </summary>
  525. /// <param name="cmd"></param>
  526. /// <param name="param"></param>
  527. /// <returns></returns>
  528. public bool PumpEnableOperation(string cmd, object[] param)
  529. {
  530. if (_status == RState.Running)
  531. {
  532. LOG.WriteLog(eEvent.ERR_PREWET, Module.ToString(), $"{Module} current execute {_currentOperation},cannot Pump enable");
  533. return false;
  534. }
  535. _status = _prewetPumpEnableRoutine.Start();
  536. _currentOperation = PrewetOperation.PumpEnable;
  537. return _status==RState.Running;
  538. }
  539. /// <summary>
  540. /// pump disable 操作
  541. /// </summary>
  542. /// <param name="cmd"></param>
  543. /// <param name="param"></param>
  544. /// <returns></returns>
  545. public bool PumpDisableOperation(string cmd, object[] param)
  546. {
  547. if (_status == RState.Running)
  548. {
  549. LOG.WriteLog(eEvent.ERR_PREWET, Module.ToString(), $"{Module} current execute {_currentOperation},cannot Pump disable");
  550. return false;
  551. }
  552. _status = _prewetPumpDisableRoutine.Start();
  553. _currentOperation = PrewetOperation.PumpDisable;
  554. return _status == RState.Running;
  555. //return PumpDisable();
  556. }
  557. /// <summary>
  558. /// Pump enable
  559. /// </summary>
  560. /// <returns></returns>
  561. public bool PumpEnable()
  562. {
  563. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{PUMP_ENABLE}");
  564. return IOModuleManager.Instance.WriteIoValue(ioName, true);
  565. }
  566. /// <summary>
  567. /// Pump disable
  568. /// </summary>
  569. /// <returns></returns>
  570. public bool PumpDisable()
  571. {
  572. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{PUMP_ENABLE}");
  573. return IOModuleManager.Instance.WriteIoValue(ioName, false);
  574. }
  575. /// <summary>
  576. /// 写入Pump速度
  577. /// </summary>
  578. /// <param name="speed"></param>
  579. /// <returns></returns>
  580. public bool PumpSpeed(short speed=0)
  581. {
  582. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{PUMP_SPEED}");
  583. return IOModuleManager.Instance.WriteIoValue(ioName, speed==0?_lastPumpSpeed:speed);
  584. }
  585. /// <summary>
  586. /// Pump Speed手动模式
  587. /// </summary>
  588. /// <param name="cmd"></param>
  589. /// <param name="param"></param>
  590. /// <returns></returns>
  591. public bool PumpSpeedManualOperation(string cmd, object[] param)
  592. {
  593. PrewetPumpData.PumpSpeedAuto = false;
  594. PrewetPumpData.PumpModel = "Manual";
  595. string statusContent = PrewetPumpData.PumpStatus ? "On" : "Off";
  596. PrewetPumpData.PumpStatusContent = $"{PrewetPumpData.PumpModel}: {statusContent}";
  597. return true;
  598. }
  599. /// <summary>
  600. /// Pump Speed自动模式
  601. /// </summary>
  602. /// <param name="cmd"></param>
  603. /// <param name="param"></param>
  604. /// <returns></returns>
  605. public bool PumpSpeedAutoOperation(string cmd, object[] param)
  606. {
  607. PrewetPumpData.PumpSpeedAuto = true;
  608. PrewetPumpData.PumpModel = "Auto";
  609. string statusContent = PrewetPumpData.PumpStatus ? "On" : "Off";
  610. PrewetPumpData.PumpStatusContent = $"{PrewetPumpData.PumpModel}: {statusContent}";
  611. return true;
  612. }
  613. /// <summary>
  614. /// Pump Speed回车操作
  615. /// </summary>
  616. /// <param name="cmd"></param>
  617. /// <param name="param"></param>
  618. /// <returns></returns>
  619. public bool PumpSpeedKeyDownOperation(string cmd, object[] param)
  620. {
  621. if (PrewetPumpData.PumpSpeedAuto)
  622. {
  623. LOG.WriteLog(eEvent.ERR_PREWET, Module, "Pump speed is auto,cannot change speed");
  624. return false;
  625. }
  626. short speed=(short)param[0];
  627. bool result = PumpSpeed(speed);
  628. if(result)
  629. {
  630. _prewetPersistentValue.Speed = speed;
  631. _lastPumpSpeed = speed;
  632. PrewetPersistentManager.Instance.UpdatePersistentValue(Module);
  633. }
  634. return true;
  635. }
  636. /// <summary>
  637. /// 中止当前Routine
  638. /// </summary>
  639. public void AbortCurrentRoutine()
  640. {
  641. if (_status == RState.Running)
  642. {
  643. IRoutine routine = GetCurrentRoutine();
  644. if (routine != null)
  645. {
  646. routine.Abort();
  647. _currentOperation = PrewetOperation.None;
  648. }
  649. }
  650. }
  651. #endregion
  652. #region 设备接口
  653. /// <summary>
  654. /// 监控
  655. /// </summary>
  656. public void Monitor()
  657. {
  658. }
  659. public void Reset()
  660. {
  661. }
  662. public void Terminate()
  663. {
  664. _prewetPersistentValue.Speed = _lastPumpSpeed;
  665. PrewetPersistentManager.Instance.UpdatePersistentValue(Module);
  666. _periodicJob.Stop(false);
  667. }
  668. #endregion
  669. }
  670. }