SrdCommonDevice.cs 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709
  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.SRD;
  11. using MECF.Framework.Common.Persistent.Prewet;
  12. using MECF.Framework.Common.Persistent.SRD;
  13. using MECF.Framework.Common.TwinCat;
  14. using CyberX8_Core;
  15. using System.Reflection;
  16. using CyberX8_RT.Modules.Rinse;
  17. using CyberX8_RT.Modules;
  18. using CyberX8_RT.Modules.SRD;
  19. using CyberX8_RT.Devices.AXIS;
  20. using MECF.Framework.Common.Persistent.Rinse;
  21. using System.Security.Principal;
  22. using MECF.Framework.Common.IOCore;
  23. namespace CyberX8_RT.Devices.SRD
  24. {
  25. public class SrdCommonDevice : BaseDevice, IDevice
  26. {
  27. /// <summary>
  28. /// Srd操作枚举
  29. /// </summary>
  30. private enum SrdCommonOperation
  31. {
  32. None,
  33. DoorClose,
  34. DoorOpen,
  35. ChuckVacuumOn,
  36. ChuckVacuumOff,
  37. }
  38. #region 常量
  39. private const string FLUID_CONTAINMENT = "FluidContainment";
  40. private const string VACUUM_VALUE = "VacuumValue";
  41. private const string WAFER_PRESENCE = "WaferPresence";
  42. private const string WAFER_PRESENCE_STATUS = "WaferPresenceStatus";
  43. private const string WATER_PRESSURE = "WaterPressure";
  44. private const string DOOR_CLOSE="DoorClose";
  45. private const string DOOR_CLOSED = "DoorClosed";
  46. private const string DOOR_OPENED = "DoorOpened";
  47. private const string WATER_ABOVE="WaterAbove";
  48. private const string WATER_BELOW = "WaterBelow";
  49. private const string CHUCK_VACUUM="ChuckVacuum";
  50. private const string EXHAUST_ON="ExhaustOn";
  51. private const string COMMON_DATA = "CommonData";
  52. private const string PERSISTENT_VALUE= "PersistentValue";
  53. #endregion
  54. #region 内部变量
  55. /// <summary>
  56. /// Common数据
  57. /// </summary>
  58. private SrdCommonData _commonData = new SrdCommonData();
  59. /// <summary>
  60. /// 状态
  61. /// </summary>
  62. private RState _status;
  63. /// <summary>
  64. /// 当前操作
  65. /// </summary>
  66. private SrdCommonOperation _currentOperation;
  67. /// <summary>
  68. /// Wafer Presence
  69. /// </summary>
  70. private string _waferPresence;
  71. /// <summary>
  72. /// Persistent Value对象
  73. /// </summary>
  74. private SRDPersistentValue _srdPersistentValue;
  75. /// <summary>
  76. /// IsWaferPresence
  77. /// </summary>
  78. private bool _isWaferPresence = true;
  79. /// <summary>
  80. /// Total Device
  81. /// </summary>
  82. private TotalSRDDevice _totalSRDDevice;
  83. #region Routine
  84. /// <summary>
  85. /// Close Routine
  86. /// </summary>
  87. private SrdCommonDoorCloseRoutine _doorCloseRoutine;
  88. /// <summary>
  89. /// Vacuum Routine
  90. /// </summary>
  91. private SrdCommonChuckVacuumRoutine _chuckVacuumRoutine;
  92. #endregion
  93. #endregion
  94. #region 属性
  95. /// <summary>
  96. /// Common数据
  97. /// </summary>
  98. public SrdCommonData CommonData
  99. {
  100. get { return _commonData; }
  101. }
  102. /// <summary>
  103. /// 状态
  104. /// </summary>
  105. public RState Status { get { return _status; } }
  106. /// <summary>
  107. /// Wafer Presence
  108. /// </summary>
  109. public string WaferPresence
  110. {
  111. get { return _waferPresence; }
  112. }
  113. /// <summary>
  114. /// IsWaferPresence
  115. /// </summary>
  116. public bool IsWaferPresence
  117. {
  118. get { return _isWaferPresence; }
  119. }
  120. #endregion
  121. /// <summary>
  122. /// 构造函数
  123. /// </summary>
  124. /// <param name="moduleName"></param>
  125. /// <param name="name"></param>
  126. public SrdCommonDevice(string moduleName) : base(moduleName, "Common", "Common", "Common")
  127. {
  128. }
  129. /// <summary>
  130. /// 初始化
  131. /// </summary>
  132. /// <returns></returns>
  133. public bool Initialize()
  134. {
  135. InitializeRoutine();
  136. SubscribeData();
  137. SubscribeValueAction();
  138. InitializeOperation();
  139. return true;
  140. }
  141. /// <summary>
  142. /// 初始化Routine
  143. /// </summary>
  144. private void InitializeRoutine()
  145. {
  146. _doorCloseRoutine = new SrdCommonDoorCloseRoutine(Module);
  147. _chuckVacuumRoutine = new SrdCommonChuckVacuumRoutine(Module);
  148. }
  149. /// <summary>
  150. /// 订阅数据
  151. /// </summary>
  152. private void SubscribeData()
  153. {
  154. _srdPersistentValue = SRDPersistentManager.Instance.GetModulePersistentValue(Module);
  155. if(_srdPersistentValue==null)
  156. {
  157. LOG.WriteLog(eEvent.ERR_SRD, Module, "Persistent Value Object is not exist");
  158. }
  159. DATA.Subscribe($"{Module}.{PERSISTENT_VALUE}", () => _srdPersistentValue, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  160. DATA.Subscribe($"{Module}.{COMMON_DATA}", () => _commonData, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  161. DATA.Subscribe($"{Module}.{WAFER_PRESENCE_STATUS}", () => _waferPresence, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  162. DATA.Subscribe($"{Module}.IsWaferPresence", () => IsWaferPresence, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  163. }
  164. /// <summary>
  165. /// 订阅变量数值发生变化
  166. /// </summary>
  167. private void SubscribeValueAction()
  168. {
  169. IOModuleManager.Instance.SubscribeModuleVariable(Module, VACUUM_VALUE, UpdateVariableValue);
  170. IOModuleManager.Instance.SubscribeModuleVariable(Module, WAFER_PRESENCE, UpdateVariableValue);
  171. IOModuleManager.Instance.SubscribeModuleVariable(Module, DOOR_CLOSE, UpdateVariableValue);
  172. IOModuleManager.Instance.SubscribeModuleVariable(Module, DOOR_CLOSED, UpdateVariableValue);
  173. IOModuleManager.Instance.SubscribeModuleVariable(Module, DOOR_OPENED, UpdateVariableValue);
  174. IOModuleManager.Instance.SubscribeModuleVariable(Module, WATER_ABOVE, UpdateVariableValue);
  175. IOModuleManager.Instance.SubscribeModuleVariable(Module, WATER_BELOW, UpdateVariableValue);
  176. IOModuleManager.Instance.SubscribeModuleVariable(Module, CHUCK_VACUUM, UpdateVariableValue);
  177. IOModuleManager.Instance.SubscribeModuleVariable(Module, EXHAUST_ON, UpdateVariableValue);
  178. }
  179. /// <summary>
  180. /// 初始化操作
  181. /// </summary>
  182. private void InitializeOperation()
  183. {
  184. OP.Subscribe($"{Module}.{Name}.DoorClose", DoorCloseAction);
  185. OP.Subscribe($"{Module}.{Name}.DoorOpen", DoorOpenAction);
  186. OP.Subscribe($"{Module}.{Name}.WaterAboveOn", WaterAboveOnAction);
  187. OP.Subscribe($"{Module}.{Name}.WaterAboveOff", WaterAboveOffAction);
  188. OP.Subscribe($"{Module}.{Name}.WaterBelowOn", WaterBelowOnAction);
  189. OP.Subscribe($"{Module}.{Name}.WaterBelowOff", WaterBelowOffAction);
  190. OP.Subscribe($"{Module}.{Name}.ChuckVacuumOn", ChuckVacuumOnAction);
  191. OP.Subscribe($"{Module}.{Name}.ChuckVacuumOff", ChuckVacuumOffAction);
  192. OP.Subscribe($"{Module}.{Name}.ExhaustOn", ExhaustOnAction);
  193. OP.Subscribe($"{Module}.{Name}.ExhaustOff", ExhaustOffAction);
  194. OP.Subscribe($"{Module}.KeyDown", KeyDownAction);
  195. OP.Subscribe($"{Module}.DisabledAction", DisabledOperation);
  196. OP.Subscribe($"{Module}.ManualAction", ManualOperation);
  197. OP.Subscribe($"{Module}.AutoAction", AutoOperation);
  198. OP.Subscribe($"{Module}.EngineeringModeAction", EngineeringModeOperation);
  199. OP.Subscribe($"{Module}.ProductionModeAction", ProductionModeOperation);
  200. OP.Subscribe($"{Module}.UpdateIsWaferPresenceAction", UpdateIsWaferPresenceAction);
  201. }
  202. /// 更新变量数值
  203. /// </summary>
  204. /// <param name="variable"></param>
  205. /// <param name="value"></param>
  206. private void UpdateVariableValue(string variable, object value)
  207. {
  208. if(!CommonData.IsDataInitialized)
  209. {
  210. CommonData.IsDataInitialized = true;
  211. }
  212. PropertyInfo property = CommonData.GetType().GetProperty(variable);
  213. if (property != null)
  214. {
  215. property.SetValue(CommonData, value);
  216. }
  217. UpdateWaferPresence(variable, value);
  218. }
  219. /// <summary>
  220. /// 更新Wafer Presence
  221. /// </summary>
  222. private void UpdateWaferPresence(string variable,object value)
  223. {
  224. if (variable == WAFER_PRESENCE&&value is double)
  225. {
  226. UpdateWaferPresence((double)value);
  227. }
  228. }
  229. /// <summary>
  230. /// 更新Wafer Presence
  231. /// </summary>
  232. /// <param name="waferPresence"></param>
  233. private void UpdateWaferPresence(double waferPresence)
  234. {
  235. if (_srdPersistentValue != null)
  236. {
  237. if (waferPresence > _srdPersistentValue.EmptyThreshold)
  238. {
  239. _waferPresence = "Empty";
  240. }
  241. else if (waferPresence >= _srdPersistentValue.WellPlacedHighThreshold && waferPresence <= _srdPersistentValue.EmptyThreshold)
  242. {
  243. _waferPresence = "PoorlyPlaced";
  244. }
  245. else if (waferPresence < _srdPersistentValue.WellPlacedLowThreshold)
  246. {
  247. _waferPresence = "PoorlyPlaced";
  248. }
  249. else
  250. {
  251. _waferPresence = "WellPlaced";
  252. }
  253. }
  254. }
  255. #region Operation
  256. #region OperationStatus
  257. /// <summary>
  258. /// DisabledAction
  259. /// </summary>
  260. /// <param name="cmd"></param>
  261. /// <param name="param"></param>
  262. /// <returns></returns>
  263. private bool DisabledOperation(string cmd, object[] args)
  264. {
  265. string currentOperation = "Disabled";
  266. SRDEntity srdEntity = Singleton<RouteManager>.Instance.GetModule<SRDEntity>(Module);
  267. if (srdEntity == null || _srdPersistentValue == null) return false;
  268. if (_srdPersistentValue.OperatingMode != "Disabled") srdEntity.EnterInit();
  269. SRDPersistentManager.Instance.UpdateOperationModeValue(Module,currentOperation);
  270. return true;
  271. }
  272. /// <summary>
  273. /// ManualAction
  274. /// </summary>
  275. /// <param name="cmd"></param>
  276. /// <param name="param"></param>
  277. /// <returns></returns>
  278. private bool ManualOperation(string cmd, object[] args)
  279. {
  280. string currentOperation = "Manual";
  281. SRDEntity srdEntity = Singleton<RouteManager>.Instance.GetModule<SRDEntity>(Module);
  282. if (srdEntity == null || _srdPersistentValue == null) return false;
  283. if (_srdPersistentValue.OperatingMode == "Auto" && srdEntity.IsBusy)
  284. {
  285. LOG.WriteLog(eEvent.ERR_SRD, Module, $"{Module} is Busy, can't change to manual mode");
  286. return false;
  287. }
  288. if (_srdPersistentValue.OperatingMode != "Manual") srdEntity.EnterInit();
  289. SRDPersistentManager.Instance.UpdateOperationModeValue(Module,currentOperation);
  290. return true;
  291. }
  292. /// <summary>
  293. /// AutoAction
  294. /// </summary>
  295. /// <param name="cmd"></param>
  296. /// <param name="param"></param>
  297. /// <returns></returns>
  298. private bool AutoOperation(string cmd, object[] args)
  299. {
  300. string currentOperation = "Auto";
  301. SRDEntity srdEntity = Singleton<RouteManager>.Instance.GetModule<SRDEntity>(Module);
  302. if (srdEntity == null || _srdPersistentValue == null) return false;
  303. if (_srdPersistentValue.OperatingMode != "Auto") srdEntity.EnterInit();
  304. SRDPersistentManager.Instance.UpdateOperationModeValue(Module,currentOperation);
  305. return true;
  306. }
  307. /// <summary>
  308. /// EngineeringModeAction
  309. /// </summary>
  310. /// <param name="cmd"></param>
  311. /// <param name="param"></param>
  312. /// <returns></returns>
  313. private bool EngineeringModeOperation(string cmd, object[] args)
  314. {
  315. string currentRecipeOperation = "Engineering";
  316. SRDPersistentManager.Instance.UpdateRecipeOperationModeValue(Module, currentRecipeOperation);
  317. return true;
  318. }
  319. /// <summary>
  320. /// ProductionAction
  321. /// </summary>
  322. /// <param name="cmd"></param>
  323. /// <param name="param"></param>
  324. /// <returns></returns>
  325. private bool ProductionModeOperation(string cmd, object[] args)
  326. {
  327. string currentRecipeOperation = "Production";
  328. SRDPersistentManager.Instance.UpdateRecipeOperationModeValue(Module, currentRecipeOperation);
  329. return true;
  330. }
  331. #endregion
  332. #region keydown
  333. private bool KeyDownAction(string cmd, object[] args)
  334. {
  335. string variableName = args[0].ToString();
  336. PropertyInfo property = _srdPersistentValue.GetType().GetProperty(variableName);
  337. if(property!=null)
  338. {
  339. property.SetValue(_srdPersistentValue, args[1]);
  340. }
  341. SRDPersistentManager.Instance.UpdateModulePersistentValue(Module);
  342. UpdateWaferPresence(CommonData.WaferPresence);
  343. return true;
  344. }
  345. #endregion
  346. #region Door
  347. /// <summary>
  348. /// Door Close操作
  349. /// </summary>
  350. public bool DoorCloseAction(string cmd, object[] args)
  351. {
  352. if (!JudgeRunningState(SrdCommonOperation.DoorClose))
  353. {
  354. _currentOperation = SrdCommonOperation.DoorClose;
  355. _status = _doorCloseRoutine.Start(true);
  356. return _status==RState.Running;
  357. }
  358. else
  359. {
  360. return false;
  361. }
  362. }
  363. /// <summary>
  364. /// Door Open操作
  365. /// </summary>
  366. public bool DoorOpenAction(string cmd, object[] args)
  367. {
  368. if (!JudgeRunningState(SrdCommonOperation.DoorOpen))
  369. {
  370. _currentOperation = SrdCommonOperation.DoorOpen;
  371. _status = _doorCloseRoutine.Start(false);
  372. return _status==RState.Running;
  373. }
  374. else
  375. {
  376. return false;
  377. }
  378. }
  379. #endregion
  380. #region Exhaust On
  381. /// <summary>
  382. /// Exhaust On
  383. /// </summary>
  384. /// <param name="cmd"></param>
  385. /// <param name="args"></param>
  386. /// <returns></returns>
  387. public bool ExhaustOnAction(string cmd, object[] args)
  388. {
  389. return ExhaustOn();
  390. }
  391. /// <summary>
  392. /// Exhaust Off
  393. /// </summary>
  394. /// <param name="cmd"></param>
  395. /// <param name="args"></param>
  396. /// <returns></returns>
  397. public bool ExhaustOffAction(string cmd, object[] args)
  398. {
  399. return ExhaustOff();
  400. }
  401. /// <summary>
  402. /// Exhaust On(不确认信号)
  403. /// </summary>
  404. /// <returns></returns>
  405. public bool ExhaustOn()
  406. {
  407. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{EXHAUST_ON}");
  408. return IOModuleManager.Instance.WriteIoValue(ioName, true);
  409. }
  410. /// <summary>
  411. /// Exhaust On(不确认信号)
  412. /// </summary>
  413. /// <returns></returns>
  414. public bool ExhaustOff()
  415. {
  416. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{EXHAUST_ON}");
  417. return IOModuleManager.Instance.WriteIoValue(ioName, false);
  418. }
  419. #endregion
  420. #region Chuck Vacuum
  421. /// <summary>
  422. /// Chuck Vacuum操作
  423. /// </summary>
  424. public bool ChuckVacuumOnAction(string cmd, object[] args)
  425. {
  426. if (!JudgeRunningState(SrdCommonOperation.ChuckVacuumOn))
  427. {
  428. _currentOperation = SrdCommonOperation.ChuckVacuumOn;
  429. _status = _chuckVacuumRoutine.Start(false);
  430. return _status==RState.Running;
  431. }
  432. else
  433. {
  434. return false;
  435. }
  436. }
  437. /// <summary>
  438. /// chuck Vacuum Off操作
  439. /// </summary>
  440. public bool ChuckVacuumOffAction(string cmd, object[] args)
  441. {
  442. if (!JudgeRunningState(SrdCommonOperation.ChuckVacuumOff))
  443. {
  444. _currentOperation = SrdCommonOperation.ChuckVacuumOff;
  445. _status= _chuckVacuumRoutine.Start(true);
  446. return _status==RState.Running;
  447. }
  448. else
  449. {
  450. return false;
  451. }
  452. }
  453. #endregion
  454. #region Water Above
  455. /// <summary>
  456. /// Water Above On操作
  457. /// </summary>
  458. public bool WaterAboveOnAction(string cmd, object[] args)
  459. {
  460. return WaterAboveOn();
  461. }
  462. /// <summary>
  463. /// water above Off操作
  464. /// </summary>
  465. public bool WaterAboveOffAction(string cmd, object[] args)
  466. {
  467. return WaterAboveOff();
  468. }
  469. /// <summary>
  470. /// Water Above On(不确认信号)
  471. /// </summary>
  472. /// <returns></returns>
  473. public bool WaterAboveOn()
  474. {
  475. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{WATER_ABOVE}");
  476. return IOModuleManager.Instance.WriteIoValue(ioName, true);
  477. }
  478. /// <summary>
  479. /// Water Above Off(不确认信号)
  480. /// </summary>
  481. /// <returns></returns>
  482. public bool WaterAboveOff()
  483. {
  484. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{WATER_ABOVE}");
  485. return IOModuleManager.Instance.WriteIoValue(ioName, false);
  486. }
  487. #endregion
  488. #region Water Below
  489. /// <summary>
  490. /// Water Below On操作
  491. /// </summary>
  492. public bool WaterBelowOnAction(string cmd, object[] args)
  493. {
  494. return WaterBelowOn();
  495. }
  496. /// <summary>
  497. /// water Below Off操作
  498. /// </summary>
  499. public bool WaterBelowOffAction(string cmd, object[] args)
  500. {
  501. return WaterBelowOff();
  502. }
  503. /// <summary>
  504. /// Water Below On(不确认信号)
  505. /// </summary>
  506. /// <returns></returns>
  507. public bool WaterBelowOn()
  508. {
  509. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{WATER_BELOW}");
  510. return IOModuleManager.Instance.WriteIoValue(ioName, true);
  511. }
  512. /// <summary>
  513. /// Water Below Off(不确认信号)
  514. /// </summary>
  515. /// <returns></returns>
  516. public bool WaterBelowOff()
  517. {
  518. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{WATER_BELOW}");
  519. return IOModuleManager.Instance.WriteIoValue(ioName, false);
  520. }
  521. #endregion
  522. /// <summary>
  523. /// Update IsWaferPresence 标志位
  524. /// </summary>
  525. /// <param name="cmd"></param>
  526. /// <param name="args"></param>
  527. /// <returns></returns>
  528. public bool UpdateIsWaferPresenceAction(string cmd, object[] args)
  529. {
  530. _isWaferPresence = (bool)args[0];
  531. return true;
  532. }
  533. /// <summary>
  534. /// 判定运行状态
  535. /// </summary>
  536. /// <returns></returns>
  537. private bool JudgeRunningState(SrdCommonOperation operation)
  538. {
  539. if (_status == RState.Running)
  540. {
  541. EV.PostAlarmLog($"{Module}", eEvent.ERR_SRD, $"{Module} current execute {_currentOperation},cannot {operation}");
  542. return true;
  543. }
  544. return false;
  545. }
  546. /// <summary>
  547. /// ErrorOperation
  548. /// </summary>
  549. public void EnterErrorOperation()
  550. {
  551. //关闭风扇
  552. if (CommonData.ExhaustOn)
  553. {
  554. bool result = ExhaustOffAction("", null);
  555. if (!result)
  556. {
  557. LOG.WriteLog(eEvent.ERR_SRD, Module, "EnterError: Exhaust Off is failed");
  558. }
  559. }
  560. //关闭WaterAbove
  561. if (CommonData.WaterAbove)
  562. {
  563. bool result = WaterAboveOff();
  564. if (!result)
  565. {
  566. LOG.WriteLog(eEvent.INFO_SRD, Module, "EnterError: Water Above Off is failed");
  567. }
  568. }
  569. //关闭WaterBelow
  570. if (CommonData.WaterBelow)
  571. {
  572. bool result = WaterBelowOff();
  573. if (!result)
  574. {
  575. LOG.WriteLog(eEvent.INFO_SRD, Module, "EnterError: Water Below Off is failed");
  576. }
  577. }
  578. //停电机
  579. JetAxisBase _armAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Arm");
  580. if (_armAxis != null && _armAxis.IsRun) _armAxis.StopPositionOperation();
  581. JetAxisBase _rotationAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Rotation");
  582. if (_rotationAxis != null && _rotationAxis.IsRun) _rotationAxis.StopPositionOperation();
  583. }
  584. #endregion
  585. /// <summary>
  586. /// 定时器
  587. /// </summary>
  588. /// <returns></returns>
  589. public bool OnTimer()
  590. {
  591. if (_status == RState.Running)
  592. {
  593. if (_currentOperation != SrdCommonOperation.None)
  594. {
  595. IRoutine routine = GetCurrentRoutine(_currentOperation);
  596. if (routine != null)
  597. {
  598. CheckRoutineState(routine, _currentOperation);
  599. }
  600. else
  601. {
  602. EndOperation();
  603. }
  604. }
  605. }
  606. //将公有的数据赋值于对象的数值
  607. if (_totalSRDDevice == null)
  608. {
  609. _totalSRDDevice = DEVICE.GetDevice<TotalSRDDevice>("SRD");
  610. }
  611. if (_totalSRDDevice != null)
  612. {
  613. CommonData.FluidContainment = _totalSRDDevice.FluidContainment;
  614. CommonData.WaterPressure = _totalSRDDevice.WaterPressure;
  615. }
  616. return true;
  617. }
  618. /// <summary>
  619. /// 获取当前操作对应的Routine
  620. /// </summary>
  621. /// <param name="currentOperation"></param>
  622. /// <returns></returns>
  623. private IRoutine GetCurrentRoutine(SrdCommonOperation currentOperation)
  624. {
  625. switch (currentOperation)
  626. {
  627. case SrdCommonOperation.DoorClose:
  628. case SrdCommonOperation.DoorOpen:
  629. return _doorCloseRoutine;
  630. case SrdCommonOperation.ChuckVacuumOn:
  631. case SrdCommonOperation.ChuckVacuumOff:
  632. return _chuckVacuumRoutine;
  633. default:
  634. return null;
  635. }
  636. }
  637. /// <summary>
  638. /// 检验Routine状态
  639. /// </summary>
  640. /// <param name="routine"></param>
  641. /// <param name="currentOperation"></param>
  642. private void CheckRoutineState(IRoutine routine, SrdCommonOperation currentOperation)
  643. {
  644. RState state = routine.Monitor();
  645. if (state == RState.End)
  646. {
  647. EndOperation();
  648. }
  649. else if (state == RState.Failed || state == RState.Timeout)
  650. {
  651. LOG.WriteLog(eEvent.ERR_SRD, $"{Module}", $"{currentOperation} error");
  652. EndOperation();
  653. }
  654. }
  655. /// <summary>
  656. /// 结束操作
  657. /// </summary>
  658. private void EndOperation()
  659. {
  660. _status = RState.End;
  661. _currentOperation = SrdCommonOperation.None;
  662. }
  663. #region 设备接口
  664. /// <summary>
  665. /// 监控
  666. /// </summary>
  667. public void Monitor()
  668. {
  669. }
  670. public void Reset()
  671. {
  672. }
  673. public void Terminate()
  674. {
  675. }
  676. #endregion
  677. }
  678. }