DryerDevice.cs 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656
  1. using Aitex.Core.RT.DataCenter;
  2. using Aitex.Core.RT.Device;
  3. using Aitex.Core.RT.Event;
  4. using Aitex.Core.RT.Log;
  5. using Aitex.Core.RT.OperationCenter;
  6. using Aitex.Core.RT.Routine;
  7. using Aitex.Core.RT.SCCore;
  8. using Aitex.Core.Util;
  9. using MECF.Framework.Common.Beckhoff.ModuleIO;
  10. using MECF.Framework.Common.CommonData;
  11. using MECF.Framework.Common.CommonData.Dryer;
  12. using MECF.Framework.Common.Equipment;
  13. using MECF.Framework.Common.Persistent.Dryer;
  14. using MECF.Framework.Common.TwinCat;
  15. using MECF.Framework.Common.Utilities;
  16. using CyberX8_Core;
  17. using CyberX8_RT.Devices.Facilities;
  18. using System.Collections.Generic;
  19. using System.Reflection;
  20. using CyberX8_RT.Modules.Dryer;
  21. using CyberX8_RT.Modules;
  22. using MECF.Framework.Common.IOCore;
  23. namespace CyberX8_RT.Devices.Dryer
  24. {
  25. public class DryerDevice : BaseDevice, IDevice
  26. {
  27. #region 常量
  28. private const string POWER_CONTROL = "PowerControl";
  29. private const string EXHAUST_PRESSURE = "ExhaustPressure";
  30. private const string BLOWER_HIGH = "BlowerHigh";
  31. private const string EXHAUST_LIMIT_DATA = "ExhaustLimitData";
  32. private const string EXHAUST_PRESSURE_VALUE = "ExhaustPressure";
  33. private const string COMMON_DATA = "CommonData";
  34. private const string PERSISTENT_VALUE = "PersistentValue";
  35. #endregion
  36. /// <summary>
  37. /// Dryer操作枚举
  38. /// </summary>
  39. private enum DryerCommonOperation
  40. {
  41. None,
  42. ControlPowerOn,
  43. ControlPowerOff,
  44. BlowerHigh,
  45. BlowerLow
  46. }
  47. #region 内部变量
  48. /// <summary>
  49. /// 公用数据
  50. /// </summary>
  51. private DryerCommonData _dryerCommonData;
  52. /// <summary>
  53. /// 状态
  54. /// </summary>
  55. private RState _status;
  56. /// <summary>
  57. /// 当前操作
  58. /// </summary>
  59. private DryerCommonOperation _currentOperation;
  60. /// <summary>
  61. /// Blower High Routine
  62. /// </summary>
  63. private DryerBlowerHighRoutine _blowerHighRoutine;
  64. /// <summary>
  65. /// ByPass
  66. /// </summary>
  67. private bool _byPass = false;
  68. /// <summary>
  69. /// Facilities
  70. /// </summary>
  71. private SystemFacilities _facilities;
  72. /// <summary>
  73. /// 变量是否初始化字典
  74. /// </summary>
  75. private Dictionary<string, bool> _variableInitializeDic = new Dictionary<string, bool>();
  76. /// <summary>
  77. /// 定时器Job
  78. /// </summary>
  79. PeriodicJob _periodicJob = null;
  80. /// <summary>
  81. /// Dryer 持久性数值对象
  82. /// </summary>
  83. private DryerPersistentValue _dryerPersistentValue;
  84. #endregion
  85. #region 属性
  86. /// <summary>
  87. /// 公用数据对象
  88. /// </summary>
  89. public DryerCommonData CommonData { get { return _dryerCommonData; } }
  90. /// <summary>
  91. /// 所有io变量是否初始化
  92. /// </summary>
  93. public bool IOInitialized { get { return IOVariableDictionaryUtil.AllIoVariableInitialized(eEvent.ERR_DRYER,Module,_variableInitializeDic); } }
  94. /// <summary>
  95. /// 状态
  96. /// </summary>
  97. public RState Status { get { return _status; } }
  98. /// <summary>
  99. /// ByPass
  100. /// </summary>
  101. public bool Bypass { get { return _byPass; } }
  102. /// <summary>
  103. /// FacilityCommonLimitData
  104. /// </summary>
  105. public CommonLimitData FacilityCommonLimitData { get { return _facilities.GetCommonLimitDataByName(EXHAUST_PRESSURE_VALUE); } }
  106. #endregion
  107. /// <summary>
  108. /// 构造函数
  109. /// </summary>
  110. /// <param name="moduleName"></param>
  111. /// <param name="name"></param>
  112. public DryerDevice(string moduleName) : base(moduleName, moduleName,moduleName,moduleName)
  113. {
  114. _periodicJob = new PeriodicJob(100, OnTimer, $"{Module}.OnTimer", true);
  115. _dryerCommonData = new DryerCommonData();
  116. }
  117. /// <summary>
  118. /// 初始化
  119. /// </summary>
  120. /// <returns></returns>
  121. public bool Initialize()
  122. {
  123. InitializeRoutine();
  124. SubscribeData();
  125. SubscribeValueAction();
  126. InitializeOperation();
  127. return true;
  128. }
  129. /// <summary>
  130. /// 初始化Routine
  131. /// </summary>
  132. private void InitializeRoutine()
  133. {
  134. _blowerHighRoutine = new DryerBlowerHighRoutine(Module, this);
  135. }
  136. /// <summary>
  137. /// 订阅数据
  138. /// </summary>
  139. private void SubscribeData()
  140. {
  141. _dryerPersistentValue = DryerPersistentManager.Instance.GetDryerPersistentValue(Module);
  142. if (_dryerPersistentValue == null)
  143. {
  144. LOG.WriteLog(eEvent.ERR_DRYER, Module, "Persistent Value Object is not exist");
  145. }
  146. DATA.Subscribe($"{Module}.{EXHAUST_LIMIT_DATA}", ()=>GetExhaustLimitData(), SubscriptionAttribute.FLAG.IgnoreSaveDB);
  147. DATA.Subscribe($"{Module}.{COMMON_DATA}", () => CommonData, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  148. DATA.Subscribe($"{Module}.{PERSISTENT_VALUE}", () => _dryerPersistentValue,SubscriptionAttribute.FLAG.IgnoreSaveDB);
  149. DATA.Subscribe($"{Module}.ExhaustPressure",()=>CommonData.ExhaustPressure, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  150. DATA.Subscribe($"{Module}.PowerControl", () => CommonData.PowerControl, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  151. DATA.Subscribe($"{Module}.BlowerHigh", () => CommonData.BlowerHigh, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  152. }
  153. /// <summary>
  154. /// 获取Exhaust Limit 数据
  155. /// </summary>
  156. /// <returns></returns>
  157. private CommonLimitData GetExhaustLimitData()
  158. {
  159. if (_facilities == null)
  160. {
  161. _facilities = DEVICE.GetDevice<SystemFacilities>("System.Facilities");
  162. }
  163. if (_facilities == null)
  164. {
  165. return null;
  166. }
  167. return _facilities.GetCommonLimitDataByName(EXHAUST_PRESSURE_VALUE);
  168. }
  169. /// <summary>
  170. /// 订阅变量数值发生变化
  171. /// </summary>
  172. private void SubscribeValueAction()
  173. {
  174. _variableInitializeDic[POWER_CONTROL] = false;
  175. IOModuleManager.Instance.SubscribeModuleVariable(Module, POWER_CONTROL, UpdateVariableValue);
  176. _variableInitializeDic[BLOWER_HIGH] = false;
  177. IOModuleManager.Instance.SubscribeModuleVariable(Module, BLOWER_HIGH, UpdateVariableValue);
  178. _variableInitializeDic[EXHAUST_PRESSURE] = false;
  179. IOModuleManager.Instance.SubscribeModuleVariable(Module, EXHAUST_PRESSURE, UpdateVariableValue);
  180. }
  181. /// 更新变量数值
  182. /// </summary>
  183. /// <param name="variable"></param>
  184. /// <param name="value"></param>
  185. private void UpdateVariableValue(string variable, object value)
  186. {
  187. if (!CommonData.IsDataInitialized)
  188. {
  189. CommonData.IsDataInitialized = true;
  190. }
  191. PropertyInfo property = CommonData.GetType().GetProperty(variable);
  192. if (property != null)
  193. {
  194. property.SetValue(CommonData, value);
  195. }
  196. if (_variableInitializeDic.ContainsKey(variable) && !_variableInitializeDic[variable])
  197. {
  198. _variableInitializeDic[variable] = true;
  199. }
  200. if(variable==BLOWER_HIGH)
  201. {
  202. if (CommonData.BlowerHigh)
  203. {
  204. DryerAutoOff.Instance.Stop();
  205. }
  206. else if(CommonData.PowerControl)
  207. {
  208. DryerAutoOff.Instance.Start();
  209. }
  210. }
  211. else if(variable==POWER_CONTROL)
  212. {
  213. if (CommonData.PowerControl)
  214. {
  215. DryerAutoOff.Instance.Start();
  216. }
  217. else
  218. {
  219. DryerAutoOff.Instance.Stop();
  220. }
  221. }
  222. }
  223. /// <summary>
  224. /// 初始化操作
  225. /// </summary>
  226. private void InitializeOperation()
  227. {
  228. OP.Subscribe($"{Module}.PowerControlOn", PowerControlOnAction);
  229. OP.Subscribe($"{Module}.PowerControlOff", PowerControlOffAction);
  230. OP.Subscribe($"{Module}.BlowerHigh",BlowerHighAction);
  231. OP.Subscribe($"{Module}.BlowerLow", BlowerLowOnAction);
  232. OP.Subscribe($"{Module}.ByPass", (cmd, args) => { _byPass = (bool)args[0]; return true; });
  233. OP.Subscribe($"{Module}.DisabledAction", DisabledOperation);
  234. OP.Subscribe($"{Module}.ManualAction", ManualOperation);
  235. OP.Subscribe($"{Module}.AutoAction", AutoOperation);
  236. OP.Subscribe($"{Module}.EngineeringModeAction", EngineeringModeOperation);
  237. OP.Subscribe($"{Module}.ProductionModeAction", ProductionModeOperation);
  238. }
  239. /// <summary>
  240. /// 定时器
  241. /// </summary>
  242. /// <returns></returns>
  243. private bool OnTimer()
  244. {
  245. if (_status == RState.Running)
  246. {
  247. if (_currentOperation != DryerCommonOperation.None)
  248. {
  249. IRoutine routine = GetCurrentRoutine(_currentOperation);
  250. if (routine != null)
  251. {
  252. CheckRoutineState(routine, _currentOperation);
  253. }
  254. else
  255. {
  256. EndOperation(RState.End);
  257. }
  258. }
  259. }
  260. return true;
  261. }
  262. #region Action
  263. #region Power Control
  264. /// <summary>
  265. /// Power Control On操作
  266. /// </summary>
  267. private bool PowerControlOnAction(string cmd, object[] args)
  268. {
  269. return PowerControlOn();
  270. }
  271. /// <summary>
  272. /// Power Control Off操作
  273. /// </summary>
  274. private bool PowerControlOffAction(string cmd, object[] args)
  275. {
  276. return PowerControlOff();
  277. }
  278. /// <summary>
  279. /// Power Control On
  280. /// </summary>
  281. /// <returns></returns>
  282. public bool PowerControlOn()
  283. {
  284. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{POWER_CONTROL}");
  285. bool result= IOModuleManager.Instance.WriteIoValue(ioName, true);
  286. if (result)
  287. {
  288. LOG.WriteLog(eEvent.INFO_DRYER, Module, "Power Control On Success");
  289. }
  290. return result;
  291. }
  292. /// <summary>
  293. /// Power Control Off
  294. /// </summary>
  295. /// <returns></returns>
  296. public bool PowerControlOff()
  297. {
  298. //检验任一HVD处于High On状态
  299. if(CheckDryersIsInBlowerHigh())
  300. {
  301. return false;
  302. }
  303. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{POWER_CONTROL}");
  304. bool result = IOModuleManager.Instance.WriteIoValue(ioName, false);
  305. if(result)
  306. {
  307. LOG.WriteLog(eEvent.INFO_DRYER, Module, "Power Control Off Success");
  308. }
  309. return result;
  310. }
  311. /// <summary>
  312. /// 检验是否Dryers是否有处于BlowerHigh状态
  313. /// </summary>
  314. /// <returns></returns>
  315. public bool CheckDryersIsInBlowerHigh(bool error=true)
  316. {
  317. bool dryer1High = CheckDryerModuleIsInBlowerHigh(ModuleName.Dryer1);
  318. eEvent eEvent = eEvent.ERR_DRYER;
  319. if(!error)
  320. {
  321. eEvent = eEvent.INFO_DRYER;
  322. }
  323. if(dryer1High)
  324. {
  325. LOG.WriteLog(eEvent, Module, "Dryer1 is high on");
  326. return true;
  327. }
  328. bool dryer2High = CheckDryerModuleIsInBlowerHigh(ModuleName.Dryer2);
  329. if (dryer2High)
  330. {
  331. LOG.WriteLog(eEvent, Module, "Dryer2 is high on");
  332. return true;
  333. }
  334. bool dryer3High = CheckDryerModuleIsInBlowerHigh(ModuleName.Dryer3);
  335. if (dryer3High)
  336. {
  337. LOG.WriteLog(eEvent, Module, "Dryer3 is high on");
  338. return true;
  339. }
  340. return false;
  341. }
  342. /// <summary>
  343. /// 检验Dryer模块是否处于Blower High
  344. /// </summary>
  345. /// <param name="moduleName"></param>
  346. /// <returns></returns>
  347. private bool CheckDryerModuleIsInBlowerHigh(ModuleName moduleName)
  348. {
  349. if (ModuleHelper.IsInstalled(moduleName))
  350. {
  351. DryerDevice dryerDevice1 = DEVICE.GetDevice<DryerDevice>(moduleName.ToString());
  352. if (dryerDevice1 != null)
  353. {
  354. if (dryerDevice1.CommonData.BlowerHigh)
  355. {
  356. return true;
  357. }
  358. }
  359. }
  360. return false;
  361. }
  362. #endregion
  363. #region Blower High
  364. /// <summary>
  365. /// Blow High动作
  366. /// </summary>
  367. /// <param name="cmd"></param>
  368. /// <param name="args"></param>
  369. /// <returns></returns>
  370. public bool BlowerHighAction(string cmd, object[] args)
  371. {
  372. if(JudgeRunningState(DryerCommonOperation.BlowerHigh))
  373. {
  374. return false;
  375. }
  376. if(CheckDryerModulePowerOff(ModuleHelper.Converter(Module)))
  377. {
  378. LOG.WriteLog(eEvent.ERR_DRYER, Module, $"{Module} is Power off");
  379. return false;
  380. }
  381. _currentOperation = DryerCommonOperation.BlowerHigh;
  382. _status = _blowerHighRoutine.Start(_byPass);
  383. return _status == RState.Running;
  384. }
  385. /// <summary>
  386. /// Blower High On
  387. /// </summary>
  388. /// <returns></returns>
  389. public bool BlowerHighOn()
  390. {
  391. if(CheckDryerModulePowerOff(ModuleHelper.Converter(Module)))
  392. {
  393. LOG.WriteLog(eEvent.ERR_DRYER, Module, $"{Module} is Power off");
  394. return false;
  395. }
  396. CommonLimitData commonLimitData = GetExhaustLimitData();
  397. if (commonLimitData.IsWarning || commonLimitData.IsError)
  398. {
  399. LOG.WriteLog(eEvent.ERR_DRYER, Module, "Exhuast Pressure is Abnormal");
  400. return false;
  401. }
  402. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{BLOWER_HIGH}");
  403. bool result = IOModuleManager.Instance.WriteIoValue(ioName, true);
  404. if (result)
  405. {
  406. LOG.WriteLog(eEvent.INFO_DRYER, Module, "Blower High On Success");
  407. }
  408. return result;
  409. }
  410. /// <summary>
  411. /// 检验Dryer模块是否处于PowerOff
  412. /// </summary>
  413. /// <param name="moduleName"></param>
  414. /// <returns></returns>
  415. private bool CheckDryerModulePowerOff(ModuleName moduleName)
  416. {
  417. if (ModuleHelper.IsInstalled(moduleName))
  418. {
  419. DryerDevice dryerDevice1 = DEVICE.GetDevice<DryerDevice>(moduleName.ToString());
  420. if (dryerDevice1 != null)
  421. {
  422. if (dryerDevice1.IOInitialized&&!dryerDevice1.CommonData.PowerControl)
  423. {
  424. return true;
  425. }
  426. }
  427. }
  428. return false;
  429. }
  430. /// <summary>
  431. /// 检验是否Dryers是否有处于BlowerHigh状态
  432. /// </summary>
  433. /// <returns></returns>
  434. private bool CheckDryersPowerOff()
  435. {
  436. bool dryer1High = CheckDryerModulePowerOff(ModuleName.Dryer1);
  437. if (dryer1High)
  438. {
  439. LOG.WriteLog(eEvent.ERR_DRYER, Module, "Dryer1 is power off");
  440. return true;
  441. }
  442. bool dryer2High = CheckDryerModulePowerOff(ModuleName.Dryer2);
  443. if (dryer2High)
  444. {
  445. LOG.WriteLog(eEvent.ERR_DRYER, Module, "Dryer2 is power off");
  446. return true;
  447. }
  448. bool dryer3High = CheckDryerModulePowerOff(ModuleName.Dryer3);
  449. if (dryer3High)
  450. {
  451. LOG.WriteLog(eEvent.ERR_DRYER, Module, "Dryer3 is power off");
  452. return true;
  453. }
  454. return false;
  455. }
  456. #endregion
  457. #region Blower Low
  458. /// <summary>
  459. /// Blower Low On Action
  460. /// </summary>
  461. /// <param name="cmd"></param>
  462. /// <param name="args"></param>
  463. /// <returns></returns>
  464. private bool BlowerLowOnAction(string cmd, object[] args)
  465. {
  466. return BlowerLowOn();
  467. }
  468. /// <summary>
  469. /// Blower Low On
  470. /// </summary>
  471. /// <returns></returns>
  472. public bool BlowerLowOn()
  473. {
  474. //High off
  475. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{BLOWER_HIGH}");
  476. bool result= IOModuleManager.Instance.WriteIoValue(ioName, false);
  477. if(result)
  478. {
  479. string controlPowerOnName= BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{POWER_CONTROL}");
  480. result= IOModuleManager.Instance.WriteIoValue(controlPowerOnName, true);
  481. }
  482. return result;
  483. }
  484. #endregion
  485. /// <summary>
  486. /// 判定运行状态
  487. /// </summary>
  488. /// <returns></returns>
  489. private bool JudgeRunningState(DryerCommonOperation operation)
  490. {
  491. if (_status == RState.Running)
  492. {
  493. LOG.WriteLog(eEvent.ERR_DRYER, Module, $"{Module} current execute {_currentOperation},cannot {operation}");
  494. return true;
  495. }
  496. return false;
  497. }
  498. #endregion
  499. /// <summary>
  500. /// 获取当前操作对应的Routine
  501. /// </summary>
  502. /// <param name="currentOperation"></param>
  503. /// <returns></returns>
  504. private IRoutine GetCurrentRoutine(DryerCommonOperation currentOperation)
  505. {
  506. switch (currentOperation)
  507. {
  508. case DryerCommonOperation.BlowerHigh:
  509. return _blowerHighRoutine;
  510. default:
  511. return null;
  512. }
  513. }
  514. /// <summary>
  515. /// 检验Routine状态
  516. /// </summary>
  517. /// <param name="routine"></param>
  518. /// <param name="currentOperation"></param>
  519. private void CheckRoutineState(IRoutine routine, DryerCommonOperation currentOperation)
  520. {
  521. RState state = routine.Monitor();
  522. if (state == RState.End)
  523. {
  524. EndOperation(RState.End);
  525. }
  526. else if (state == RState.Failed || state == RState.Timeout)
  527. {
  528. LOG.WriteLog(eEvent.ERR_DRYER, $"{Module}", $"{currentOperation} error");
  529. EndOperation(RState.Failed);
  530. }
  531. }
  532. /// <summary>
  533. /// 结束操作
  534. /// </summary>
  535. private void EndOperation(RState state)
  536. {
  537. _status = state;
  538. _currentOperation = DryerCommonOperation.None;
  539. }
  540. /// <summary>
  541. /// DisabledAction
  542. /// </summary>
  543. /// <param name="cmd"></param>
  544. /// <param name="param"></param>
  545. /// <returns></returns>
  546. private bool DisabledOperation(string cmd, object[] args)
  547. {
  548. string currentOperation = "Disabled";
  549. DryerEntity dryerEntity = Singleton<RouteManager>.Instance.GetModule<DryerEntity>(Module);
  550. if(dryerEntity == null || _dryerPersistentValue == null) return false;
  551. if (_dryerPersistentValue.OperatingMode != "Disabled") dryerEntity.EnterInit();
  552. _dryerPersistentValue.OperatingMode = currentOperation;
  553. DryerPersistentManager.Instance.UpdatePersistentValue(Module);
  554. return true;
  555. }
  556. /// <summary>
  557. /// ManualAction
  558. /// </summary>
  559. /// <param name="cmd"></param>
  560. /// <param name="param"></param>
  561. /// <returns></returns>
  562. private bool ManualOperation(string cmd, object[] args)
  563. {
  564. string currentOperation = "Manual";
  565. DryerEntity dryerEntity = Singleton<RouteManager>.Instance.GetModule<DryerEntity>(Module);
  566. if (dryerEntity == null || _dryerPersistentValue == null) return false;
  567. if(_dryerPersistentValue.OperatingMode == "Auto" && dryerEntity.IsBusy)
  568. {
  569. LOG.WriteLog(eEvent.ERR_DRYER, Module, $"{Module} is Busy, can't change to manual mode");
  570. return false;
  571. }
  572. if (_dryerPersistentValue.OperatingMode != "Manual") dryerEntity.EnterInit();
  573. _dryerPersistentValue.OperatingMode = currentOperation;
  574. DryerPersistentManager.Instance.UpdatePersistentValue(Module);
  575. return true;
  576. }
  577. /// <summary>
  578. /// AutoAction
  579. /// </summary>
  580. /// <param name="cmd"></param>
  581. /// <param name="param"></param>
  582. /// <returns></returns>
  583. private bool AutoOperation(string cmd, object[] args)
  584. {
  585. string currentOperation = "Auto";
  586. DryerEntity dryerEntity = Singleton<RouteManager>.Instance.GetModule<DryerEntity>(Module);
  587. if (dryerEntity == null || _dryerPersistentValue == null) return false;
  588. if (_dryerPersistentValue.OperatingMode != "Auto") dryerEntity.EnterInit();
  589. _dryerPersistentValue.OperatingMode= currentOperation;
  590. DryerPersistentManager.Instance.UpdatePersistentValue(Module);
  591. return true;
  592. }
  593. /// <summary>
  594. /// EngineeringModeAction
  595. /// </summary>
  596. /// <param name="cmd"></param>
  597. /// <param name="param"></param>
  598. /// <returns></returns>
  599. private bool EngineeringModeOperation(string cmd, object[] args)
  600. {
  601. string currentRecipeOperation = "Engineering";
  602. _dryerPersistentValue.RecipeOperatingMode = currentRecipeOperation;
  603. DryerPersistentManager.Instance.UpdatePersistentValue(Module);
  604. return true;
  605. }
  606. /// <summary>
  607. /// ProductionAction
  608. /// </summary>
  609. /// <param name="cmd"></param>
  610. /// <param name="param"></param>
  611. /// <returns></returns>
  612. private bool ProductionModeOperation(string cmd, object[] args)
  613. {
  614. string currentRecipeOperation = "Production";
  615. _dryerPersistentValue.RecipeOperatingMode= currentRecipeOperation;
  616. DryerPersistentManager.Instance.UpdatePersistentValue(Module);
  617. return true;
  618. }
  619. #region 设备接口
  620. /// <summary>
  621. /// 监控
  622. /// </summary>
  623. public void Monitor()
  624. {
  625. }
  626. public void Reset()
  627. {
  628. }
  629. /// <summary>
  630. /// 中止
  631. /// </summary>
  632. public void Terminate()
  633. {
  634. _periodicJob.Stop(false);
  635. }
  636. #endregion
  637. }
  638. }