SrdCommonDevice.cs 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912
  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. using Aitex.Core.Common;
  24. namespace CyberX8_RT.Devices.SRD
  25. {
  26. public class SrdCommonDevice : BaseDevice, IDevice
  27. {
  28. /// <summary>
  29. /// Srd操作枚举
  30. /// </summary>
  31. private enum SrdCommonOperation
  32. {
  33. None,
  34. DoorClose,
  35. DoorOpen,
  36. ChuckVacuumOn,
  37. ChuckVacuumOff,
  38. LiftUpOn,
  39. LiftUpOff,
  40. FlippersIn,
  41. FlippersOut,
  42. }
  43. #region 常量
  44. private const string FLUID_CONTAINMENT = "FluidContainment";
  45. private const string VACUUM_VALUE = "VacuumValue";
  46. private const string WAFER_PRESENCE = "WaferPresence";
  47. private const string WAFER_PRESENCE_STATUS = "WaferPresenceStatus";
  48. private const string WATER_PRESSURE = "WaterPressure";
  49. private const string DOOR_CLOSE="DoorClose";
  50. private const string DOOR_CLOSED = "DoorClosed";
  51. private const string DOOR_OPENED = "DoorOpened";
  52. private const string WATER_ABOVE="WaterAbove";
  53. private const string WATER_BELOW = "WaterBelow";
  54. private const string CHUCK_VACUUM="ChuckVacuum";
  55. private const string EXHAUST_ON="ExhaustOn";
  56. private const string COMMON_DATA = "CommonData";
  57. private const string PERSISTENT_VALUE= "PersistentValue";
  58. private const string CHUCK_ATM_ON = "ChuckATMOn";
  59. private const string CHUCK_VACUUM_OK = "ChuckVacuumOK";
  60. private const string WAFER_PRESENT = "WaferPresent";
  61. private const string LIFT_UP = "LiftUp";
  62. private const string LIFT_UP_STATUS = "LiftUpStatus";
  63. private const string FLIPPER1_OUT_150_STATUS = "Flipper1Out150Status";
  64. private const string FLIPPER2_OUT_150_STATUS = "Flipper2Out150Status";
  65. private const string FLIPPER3_OUT_150_STATUS = "Flipper3Out150Status";
  66. private const string FLIPPER1_OUT_200_STATUS = "Flipper1Out200Status";
  67. private const string FLIPPER2_OUT_200_STATUS = "Flipper2Out200Status";
  68. private const string FLIPPER3_OUT_200_STATUS = "Flipper3Out200Status";
  69. private const string FLIPPERS_IN_150 = "FlippersIn150";
  70. private const string FLIPPERS_IN_200 = "FlippersIn200";
  71. private const string WATER_FLOW = "WaterFlow";
  72. private const string WATER_ON = "WaterOn";
  73. private const string N2_ON= "N2On";
  74. #endregion
  75. #region 内部变量
  76. /// <summary>
  77. /// Common数据
  78. /// </summary>
  79. private SrdCommonData _commonData = new SrdCommonData();
  80. /// <summary>
  81. /// 状态
  82. /// </summary>
  83. private RState _status;
  84. /// <summary>
  85. /// 当前操作
  86. /// </summary>
  87. private SrdCommonOperation _currentOperation;
  88. /// <summary>
  89. /// Wafer Presence
  90. /// </summary>
  91. private string _waferPresence;
  92. /// <summary>
  93. /// Persistent Value对象
  94. /// </summary>
  95. private SRDPersistentValue _srdPersistentValue;
  96. /// <summary>
  97. /// IsWaferPresence
  98. /// </summary>
  99. private bool _isWaferPresence = true;
  100. /// <summary>
  101. /// Total Device
  102. /// </summary>
  103. private TotalSRDDevice _totalSRDDevice;
  104. #region Routine
  105. /// <summary>
  106. /// Close Routine
  107. /// </summary>
  108. private SrdCommonDoorCloseRoutine _doorCloseRoutine;
  109. /// <summary>
  110. /// Vacuum Routine
  111. /// </summary>
  112. private SrdCommonChuckVacuumRoutine _chuckVacuumRoutine;
  113. /// <summary>
  114. /// Lift Up routine
  115. /// </summary>
  116. private SrdCommonLiftUpRoutine _liftUpRoutine;
  117. /// <summary>
  118. /// Flippers Routine
  119. /// </summary>
  120. private SrdCommonFlipperRoutine _flipperRoutine;
  121. #endregion
  122. #endregion
  123. #region 属性
  124. /// <summary>
  125. /// Common数据
  126. /// </summary>
  127. public SrdCommonData CommonData
  128. {
  129. get { return _commonData; }
  130. }
  131. /// <summary>
  132. /// 状态
  133. /// </summary>
  134. public RState Status { get { return _status; } }
  135. /// <summary>
  136. /// Wafer Presence
  137. /// </summary>
  138. public string WaferPresence
  139. {
  140. get { return _waferPresence; }
  141. }
  142. /// <summary>
  143. /// IsWaferPresence
  144. /// </summary>
  145. public bool IsWaferPresence
  146. {
  147. get { return _isWaferPresence; }
  148. }
  149. #endregion
  150. /// <summary>
  151. /// 构造函数
  152. /// </summary>
  153. /// <param name="moduleName"></param>
  154. /// <param name="name"></param>
  155. public SrdCommonDevice(string moduleName) : base(moduleName, "Common", "Common", "Common")
  156. {
  157. }
  158. /// <summary>
  159. /// 初始化
  160. /// </summary>
  161. /// <returns></returns>
  162. public bool Initialize()
  163. {
  164. InitializeRoutine();
  165. SubscribeData();
  166. SubscribeValueAction();
  167. InitializeOperation();
  168. return true;
  169. }
  170. /// <summary>
  171. /// 初始化Routine
  172. /// </summary>
  173. private void InitializeRoutine()
  174. {
  175. _doorCloseRoutine = new SrdCommonDoorCloseRoutine(Module);
  176. _chuckVacuumRoutine = new SrdCommonChuckVacuumRoutine(Module);
  177. _liftUpRoutine = new SrdCommonLiftUpRoutine(Module);
  178. _flipperRoutine = new SrdCommonFlipperRoutine(Module);
  179. }
  180. /// <summary>
  181. /// 订阅数据
  182. /// </summary>
  183. private void SubscribeData()
  184. {
  185. _srdPersistentValue = SRDPersistentManager.Instance.GetModulePersistentValue(Module);
  186. if(_srdPersistentValue==null)
  187. {
  188. LOG.WriteLog(eEvent.ERR_SRD, Module, "Persistent Value Object is not exist");
  189. }
  190. DATA.Subscribe($"{Module}.{PERSISTENT_VALUE}", () => _srdPersistentValue, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  191. DATA.Subscribe($"{Module}.{COMMON_DATA}", () => _commonData, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  192. DATA.Subscribe($"{Module}.{WAFER_PRESENCE_STATUS}", () => _waferPresence, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  193. DATA.Subscribe($"{Module}.IsWaferPresence", () => IsWaferPresence, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  194. }
  195. /// <summary>
  196. /// 订阅变量数值发生变化
  197. /// </summary>
  198. private void SubscribeValueAction()
  199. {
  200. IOModuleManager.Instance.SubscribeModuleVariable(Module, VACUUM_VALUE, UpdateVariableValue);
  201. IOModuleManager.Instance.SubscribeModuleVariable(Module, WAFER_PRESENCE, UpdateVariableValue);
  202. IOModuleManager.Instance.SubscribeModuleVariable(Module, DOOR_CLOSE, UpdateVariableValue);
  203. IOModuleManager.Instance.SubscribeModuleVariable(Module, DOOR_CLOSED, UpdateVariableValue);
  204. IOModuleManager.Instance.SubscribeModuleVariable(Module, DOOR_OPENED, UpdateVariableValue);
  205. IOModuleManager.Instance.SubscribeModuleVariable(Module, WATER_ABOVE, UpdateVariableValue);
  206. IOModuleManager.Instance.SubscribeModuleVariable(Module, WATER_BELOW, UpdateVariableValue);
  207. IOModuleManager.Instance.SubscribeModuleVariable(Module, CHUCK_VACUUM, UpdateVariableValue);
  208. IOModuleManager.Instance.SubscribeModuleVariable(Module, EXHAUST_ON, UpdateVariableValue);
  209. IOModuleManager.Instance.SubscribeModuleVariable(Module, CHUCK_ATM_ON, UpdateVariableValue);
  210. IOModuleManager.Instance.SubscribeModuleVariable(Module, CHUCK_VACUUM_OK, UpdateVariableValue);
  211. IOModuleManager.Instance.SubscribeModuleVariable(Module, WAFER_PRESENT, UpdateVariableValue);
  212. IOModuleManager.Instance.SubscribeModuleVariable(Module, LIFT_UP, UpdateVariableValue);
  213. IOModuleManager.Instance.SubscribeModuleVariable(Module, LIFT_UP_STATUS, UpdateVariableValue);
  214. IOModuleManager.Instance.SubscribeModuleVariable(Module, FLIPPER1_OUT_150_STATUS, UpdateVariableValue);
  215. IOModuleManager.Instance.SubscribeModuleVariable(Module, FLIPPER2_OUT_150_STATUS, UpdateVariableValue);
  216. IOModuleManager.Instance.SubscribeModuleVariable(Module, FLIPPER3_OUT_150_STATUS, UpdateVariableValue);
  217. IOModuleManager.Instance.SubscribeModuleVariable(Module, FLIPPER1_OUT_200_STATUS, UpdateVariableValue);
  218. IOModuleManager.Instance.SubscribeModuleVariable(Module, FLIPPER2_OUT_200_STATUS, UpdateVariableValue);
  219. IOModuleManager.Instance.SubscribeModuleVariable(Module, FLIPPER3_OUT_200_STATUS, UpdateVariableValue);
  220. IOModuleManager.Instance.SubscribeModuleVariable(Module, FLIPPERS_IN_150, UpdateVariableValue);
  221. IOModuleManager.Instance.SubscribeModuleVariable(Module, FLIPPERS_IN_200, UpdateVariableValue);
  222. IOModuleManager.Instance.SubscribeModuleVariable(Module, WATER_FLOW, UpdateVariableValue);
  223. IOModuleManager.Instance.SubscribeModuleVariable(Module, N2_ON, UpdateVariableValue);
  224. IOModuleManager.Instance.SubscribeModuleVariable(Module, WATER_ON, UpdateVariableValue);
  225. }
  226. /// <summary>
  227. /// 初始化操作
  228. /// </summary>
  229. private void InitializeOperation()
  230. {
  231. OP.Subscribe($"{Module}.{Name}.DoorClose", DoorCloseAction);
  232. OP.Subscribe($"{Module}.{Name}.DoorOpen", DoorOpenAction);
  233. OP.Subscribe($"{Module}.{Name}.WaterOn", WaterOnAction);
  234. OP.Subscribe($"{Module}.{Name}.WaterOff", WaterOffAction);
  235. OP.Subscribe($"{Module}.{Name}.ChuckVacuumOn", ChuckVacuumOnAction);
  236. OP.Subscribe($"{Module}.{Name}.ChuckVacuumOff", ChuckVacuumOffAction);
  237. OP.Subscribe($"{Module}.{Name}.N2On", N2OnAction);
  238. OP.Subscribe($"{Module}.{Name}.N2Off", N2OffAction);
  239. OP.Subscribe($"{Module}.{Name}.LiftUpOn", LiftUpOnAction);
  240. OP.Subscribe($"{Module}.{Name}.LiftUpOff", LiftUpOffAction);
  241. OP.Subscribe($"{Module}.{Name}.ChuckATMOn", ChuckATMOnAction);
  242. OP.Subscribe($"{Module}.{Name}.ChuckATMOff", ChuckATMOffAction);
  243. OP.Subscribe($"{Module}.{Name}.FlipperIn", FlipperInAction);
  244. OP.Subscribe($"{Module}.{Name}.FlipperOut", FlipperOutAction);
  245. OP.Subscribe($"{Module}.KeyDown", KeyDownAction);
  246. OP.Subscribe($"{Module}.DisabledAction", DisabledOperation);
  247. OP.Subscribe($"{Module}.ManualAction", ManualOperation);
  248. OP.Subscribe($"{Module}.AutoAction", AutoOperation);
  249. OP.Subscribe($"{Module}.EngineeringModeAction", EngineeringModeOperation);
  250. OP.Subscribe($"{Module}.ProductionModeAction", ProductionModeOperation);
  251. OP.Subscribe($"{Module}.UpdateIsWaferPresenceAction", UpdateIsWaferPresenceAction);
  252. }
  253. /// 更新变量数值
  254. /// </summary>
  255. /// <param name="variable"></param>
  256. /// <param name="value"></param>
  257. private void UpdateVariableValue(string variable, object value)
  258. {
  259. if(!CommonData.IsDataInitialized)
  260. {
  261. CommonData.IsDataInitialized = true;
  262. }
  263. PropertyInfo property = CommonData.GetType().GetProperty(variable);
  264. if (property != null)
  265. {
  266. property.SetValue(CommonData, value);
  267. }
  268. UpdateWaferPresence(variable, value);
  269. }
  270. /// <summary>
  271. /// 更新Wafer Presence
  272. /// </summary>
  273. private void UpdateWaferPresence(string variable,object value)
  274. {
  275. if (variable == WAFER_PRESENCE&&value is double)
  276. {
  277. UpdateWaferPresence((double)value);
  278. }
  279. }
  280. /// <summary>
  281. /// 更新Wafer Presence
  282. /// </summary>
  283. /// <param name="waferPresence"></param>
  284. private void UpdateWaferPresence(double waferPresence)
  285. {
  286. if (_srdPersistentValue != null)
  287. {
  288. if (waferPresence > _srdPersistentValue.EmptyThreshold)
  289. {
  290. _waferPresence = "Empty";
  291. }
  292. else if (waferPresence >= _srdPersistentValue.WellPlacedHighThreshold && waferPresence <= _srdPersistentValue.EmptyThreshold)
  293. {
  294. _waferPresence = "PoorlyPlaced";
  295. }
  296. else if (waferPresence < _srdPersistentValue.WellPlacedLowThreshold)
  297. {
  298. _waferPresence = "PoorlyPlaced";
  299. }
  300. else
  301. {
  302. _waferPresence = "WellPlaced";
  303. }
  304. }
  305. }
  306. #region Operation
  307. #region OperationStatus
  308. /// <summary>
  309. /// DisabledAction
  310. /// </summary>
  311. /// <param name="cmd"></param>
  312. /// <param name="param"></param>
  313. /// <returns></returns>
  314. private bool DisabledOperation(string cmd, object[] args)
  315. {
  316. string currentOperation = "Disabled";
  317. SRDEntity srdEntity = Singleton<RouteManager>.Instance.GetModule<SRDEntity>(Module);
  318. if (srdEntity == null || _srdPersistentValue == null) return false;
  319. if (_srdPersistentValue.OperatingMode != "Disabled") srdEntity.EnterInit();
  320. SRDPersistentManager.Instance.UpdateOperationModeValue(Module,currentOperation);
  321. return true;
  322. }
  323. /// <summary>
  324. /// ManualAction
  325. /// </summary>
  326. /// <param name="cmd"></param>
  327. /// <param name="param"></param>
  328. /// <returns></returns>
  329. private bool ManualOperation(string cmd, object[] args)
  330. {
  331. string currentOperation = "Manual";
  332. SRDEntity srdEntity = Singleton<RouteManager>.Instance.GetModule<SRDEntity>(Module);
  333. if (srdEntity == null || _srdPersistentValue == null) return false;
  334. if (_srdPersistentValue.OperatingMode == "Auto" && srdEntity.IsBusy)
  335. {
  336. LOG.WriteLog(eEvent.ERR_SRD, Module, $"{Module} is Busy, can't change to manual mode");
  337. return false;
  338. }
  339. if (_srdPersistentValue.OperatingMode != "Manual") srdEntity.EnterInit();
  340. SRDPersistentManager.Instance.UpdateOperationModeValue(Module,currentOperation);
  341. return true;
  342. }
  343. /// <summary>
  344. /// AutoAction
  345. /// </summary>
  346. /// <param name="cmd"></param>
  347. /// <param name="param"></param>
  348. /// <returns></returns>
  349. private bool AutoOperation(string cmd, object[] args)
  350. {
  351. string currentOperation = "Auto";
  352. SRDEntity srdEntity = Singleton<RouteManager>.Instance.GetModule<SRDEntity>(Module);
  353. if (srdEntity == null || _srdPersistentValue == null) return false;
  354. if (_srdPersistentValue.OperatingMode != "Auto") srdEntity.EnterInit();
  355. SRDPersistentManager.Instance.UpdateOperationModeValue(Module,currentOperation);
  356. return true;
  357. }
  358. /// <summary>
  359. /// EngineeringModeAction
  360. /// </summary>
  361. /// <param name="cmd"></param>
  362. /// <param name="param"></param>
  363. /// <returns></returns>
  364. private bool EngineeringModeOperation(string cmd, object[] args)
  365. {
  366. string currentRecipeOperation = "Engineering";
  367. SRDPersistentManager.Instance.UpdateRecipeOperationModeValue(Module, currentRecipeOperation);
  368. return true;
  369. }
  370. /// <summary>
  371. /// ProductionAction
  372. /// </summary>
  373. /// <param name="cmd"></param>
  374. /// <param name="param"></param>
  375. /// <returns></returns>
  376. private bool ProductionModeOperation(string cmd, object[] args)
  377. {
  378. string currentRecipeOperation = "Production";
  379. SRDPersistentManager.Instance.UpdateRecipeOperationModeValue(Module, currentRecipeOperation);
  380. return true;
  381. }
  382. #endregion
  383. #region keydown
  384. private bool KeyDownAction(string cmd, object[] args)
  385. {
  386. string variableName = args[0].ToString();
  387. PropertyInfo property = _srdPersistentValue.GetType().GetProperty(variableName);
  388. if(property!=null)
  389. {
  390. property.SetValue(_srdPersistentValue, args[1]);
  391. }
  392. SRDPersistentManager.Instance.UpdateModulePersistentValue(Module);
  393. UpdateWaferPresence(CommonData.WaferPresence);
  394. return true;
  395. }
  396. #endregion
  397. #region Door
  398. /// <summary>
  399. /// Door Close操作
  400. /// </summary>
  401. public bool DoorCloseAction(string cmd, object[] args)
  402. {
  403. if (!JudgeRunningState(SrdCommonOperation.DoorClose))
  404. {
  405. _currentOperation = SrdCommonOperation.DoorClose;
  406. _status = _doorCloseRoutine.Start(true);
  407. return _status==RState.Running;
  408. }
  409. else
  410. {
  411. return false;
  412. }
  413. }
  414. /// <summary>
  415. /// Door Open操作
  416. /// </summary>
  417. public bool DoorOpenAction(string cmd, object[] args)
  418. {
  419. if (!JudgeRunningState(SrdCommonOperation.DoorOpen))
  420. {
  421. _currentOperation = SrdCommonOperation.DoorOpen;
  422. _status = _doorCloseRoutine.Start(false);
  423. return _status==RState.Running;
  424. }
  425. else
  426. {
  427. return false;
  428. }
  429. }
  430. #endregion
  431. #region N2 On
  432. /// <summary>
  433. /// N2 On
  434. /// </summary>
  435. /// <param name="cmd"></param>
  436. /// <param name="args"></param>
  437. /// <returns></returns>
  438. public bool N2OnAction(string cmd, object[] args)
  439. {
  440. return N2On();
  441. }
  442. /// <summary>
  443. /// N2 Off
  444. /// </summary>
  445. /// <param name="cmd"></param>
  446. /// <param name="args"></param>
  447. /// <returns></returns>
  448. public bool N2OffAction(string cmd, object[] args)
  449. {
  450. return N2Off();
  451. }
  452. /// <summary>
  453. /// Exhaust On(不确认信号)
  454. /// </summary>
  455. /// <returns></returns>
  456. public bool N2On()
  457. {
  458. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{N2_ON}");
  459. return IOModuleManager.Instance.WriteIoValue(ioName, true);
  460. }
  461. /// <summary>
  462. /// Exhaust On(不确认信号)
  463. /// </summary>
  464. /// <returns></returns>
  465. public bool N2Off()
  466. {
  467. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{N2_ON}");
  468. return IOModuleManager.Instance.WriteIoValue(ioName, false);
  469. }
  470. #endregion
  471. #region Flipper
  472. /// <summary>
  473. /// FlipperIn
  474. /// </summary>
  475. /// <param name="cmd"></param>
  476. /// <param name="args"></param>
  477. /// <returns></returns>
  478. public bool FlipperInAction(string cmd, object[] args)
  479. {
  480. int waferSize = (int)args[0];
  481. if (!JudgeRunningState(SrdCommonOperation.FlippersIn))
  482. {
  483. _currentOperation = SrdCommonOperation.FlippersIn;
  484. _status = _flipperRoutine.Start(true, waferSize);
  485. return _status == RState.Running;
  486. }
  487. else
  488. {
  489. return false;
  490. }
  491. }
  492. /// <summary>
  493. /// FlipperOut
  494. /// </summary>
  495. /// <param name="cmd"></param>
  496. /// <param name="args"></param>
  497. /// <returns></returns>
  498. public bool FlipperOutAction(string cmd, object[] args)
  499. {
  500. int waferSize = (int)args[0];
  501. if (!JudgeRunningState(SrdCommonOperation.FlippersOut))
  502. {
  503. _currentOperation = SrdCommonOperation.FlippersOut;
  504. _status = _flipperRoutine.Start(false, waferSize);
  505. return _status == RState.Running;
  506. }
  507. else
  508. {
  509. return false;
  510. }
  511. }
  512. #endregion
  513. #region Water
  514. /// <summary>
  515. /// Water On操作
  516. /// </summary>
  517. public bool WaterOnAction(string cmd, object[] args)
  518. {
  519. return WaterOn();
  520. }
  521. /// <summary>
  522. /// water Off操作
  523. /// </summary>
  524. public bool WaterOffAction(string cmd, object[] args)
  525. {
  526. return WaterOff();
  527. }
  528. /// <summary>
  529. /// Water On(不确认信号)
  530. /// </summary>
  531. /// <returns></returns>
  532. public bool WaterOn()
  533. {
  534. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{WATER_ON}");
  535. return IOModuleManager.Instance.WriteIoValue(ioName, true);
  536. }
  537. /// <summary>
  538. /// Water Off(不确认信号)
  539. /// </summary>
  540. /// <returns></returns>
  541. public bool WaterOff()
  542. {
  543. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{WATER_ON}");
  544. return IOModuleManager.Instance.WriteIoValue(ioName, false);
  545. }
  546. #endregion
  547. #region Chuck Vacuum
  548. /// <summary>
  549. /// Chuck Vacuum操作
  550. /// </summary>
  551. public bool ChuckVacuumOnAction(string cmd, object[] args)
  552. {
  553. if (!JudgeRunningState(SrdCommonOperation.ChuckVacuumOn))
  554. {
  555. _currentOperation = SrdCommonOperation.ChuckVacuumOn;
  556. _status = _chuckVacuumRoutine.Start(false);
  557. return _status==RState.Running;
  558. }
  559. else
  560. {
  561. return false;
  562. }
  563. }
  564. /// <summary>
  565. /// chuck Vacuum Off操作
  566. /// </summary>
  567. public bool ChuckVacuumOffAction(string cmd, object[] args)
  568. {
  569. if (!JudgeRunningState(SrdCommonOperation.ChuckVacuumOff))
  570. {
  571. _currentOperation = SrdCommonOperation.ChuckVacuumOff;
  572. _status= _chuckVacuumRoutine.Start(true);
  573. return _status==RState.Running;
  574. }
  575. else
  576. {
  577. return false;
  578. }
  579. }
  580. #endregion
  581. #region LiftUp
  582. /// <summary>
  583. /// Lift Up On
  584. /// </summary>
  585. /// <param name="cmd"></param>
  586. /// <param name="args"></param>
  587. /// <returns></returns>
  588. public bool LiftUpOnAction(string cmd, object[] args)
  589. {
  590. if (!JudgeRunningState(SrdCommonOperation.LiftUpOn))
  591. {
  592. _currentOperation = SrdCommonOperation.LiftUpOn;
  593. _status = _liftUpRoutine.Start(true);
  594. return _status == RState.Running;
  595. }
  596. else
  597. {
  598. return false;
  599. }
  600. }
  601. /// <summary>
  602. /// Lift Up Off
  603. /// </summary>
  604. /// <param name="cmd"></param>
  605. /// <param name="args"></param>
  606. /// <returns></returns>
  607. public bool LiftUpOffAction(string cmd, object[] args)
  608. {
  609. if (!JudgeRunningState(SrdCommonOperation.LiftUpOff))
  610. {
  611. _currentOperation = SrdCommonOperation.LiftUpOff;
  612. _status = _liftUpRoutine.Start(false);
  613. return _status == RState.Running;
  614. }
  615. else
  616. {
  617. return false;
  618. }
  619. }
  620. #endregion
  621. #region ChuckATM
  622. /// <summary>
  623. /// Chuck ATM On
  624. /// </summary>
  625. /// <param name="cmd"></param>
  626. /// <param name="args"></param>
  627. /// <returns></returns>
  628. public bool ChuckATMOnAction(string cmd, object[] args)
  629. {
  630. return ChuckATM(true);
  631. }
  632. /// <summary>
  633. /// Chuck ATM Off
  634. /// </summary>
  635. /// <param name="cmd"></param>
  636. /// <param name="args"></param>
  637. /// <returns></returns>
  638. public bool ChuckATMOffAction(string cmd, object[] args)
  639. {
  640. return ChuckATM(false);
  641. }
  642. private bool ChuckATM(bool value)
  643. {
  644. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{CHUCK_ATM_ON}");
  645. return IOModuleManager.Instance.WriteIoValue(ioName, value);
  646. }
  647. #endregion
  648. #region Water Above
  649. /// <summary>
  650. /// Water Above On操作
  651. /// </summary>
  652. public bool WaterAboveOnAction(string cmd, object[] args)
  653. {
  654. return WaterAboveOn();
  655. }
  656. /// <summary>
  657. /// water above Off操作
  658. /// </summary>
  659. public bool WaterAboveOffAction(string cmd, object[] args)
  660. {
  661. return WaterAboveOff();
  662. }
  663. /// <summary>
  664. /// Water Above On(不确认信号)
  665. /// </summary>
  666. /// <returns></returns>
  667. public bool WaterAboveOn()
  668. {
  669. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{WATER_ABOVE}");
  670. return IOModuleManager.Instance.WriteIoValue(ioName, true);
  671. }
  672. /// <summary>
  673. /// Water Above Off(不确认信号)
  674. /// </summary>
  675. /// <returns></returns>
  676. public bool WaterAboveOff()
  677. {
  678. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{WATER_ABOVE}");
  679. return IOModuleManager.Instance.WriteIoValue(ioName, false);
  680. }
  681. #endregion
  682. #region Water Below
  683. /// <summary>
  684. /// Water Below On操作
  685. /// </summary>
  686. public bool WaterBelowOnAction(string cmd, object[] args)
  687. {
  688. return WaterBelowOn();
  689. }
  690. /// <summary>
  691. /// water Below Off操作
  692. /// </summary>
  693. public bool WaterBelowOffAction(string cmd, object[] args)
  694. {
  695. return WaterBelowOff();
  696. }
  697. /// <summary>
  698. /// Water Below On(不确认信号)
  699. /// </summary>
  700. /// <returns></returns>
  701. public bool WaterBelowOn()
  702. {
  703. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{WATER_BELOW}");
  704. return IOModuleManager.Instance.WriteIoValue(ioName, true);
  705. }
  706. /// <summary>
  707. /// Water Below Off(不确认信号)
  708. /// </summary>
  709. /// <returns></returns>
  710. public bool WaterBelowOff()
  711. {
  712. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{WATER_BELOW}");
  713. return IOModuleManager.Instance.WriteIoValue(ioName, false);
  714. }
  715. #endregion
  716. /// <summary>
  717. /// Update IsWaferPresence 标志位
  718. /// </summary>
  719. /// <param name="cmd"></param>
  720. /// <param name="args"></param>
  721. /// <returns></returns>
  722. public bool UpdateIsWaferPresenceAction(string cmd, object[] args)
  723. {
  724. _isWaferPresence = (bool)args[0];
  725. return true;
  726. }
  727. /// <summary>
  728. /// 判定运行状态
  729. /// </summary>
  730. /// <returns></returns>
  731. private bool JudgeRunningState(SrdCommonOperation operation)
  732. {
  733. if (_status == RState.Running)
  734. {
  735. EV.PostAlarmLog($"{Module}", eEvent.ERR_SRD, $"{Module} current execute {_currentOperation},cannot {operation}");
  736. return true;
  737. }
  738. return false;
  739. }
  740. /// <summary>
  741. /// ErrorOperation
  742. /// </summary>
  743. public void EnterErrorOperation()
  744. {
  745. //关闭风扇
  746. if (CommonData.ExhaustOn)
  747. {
  748. bool result = N2OffAction("", null);
  749. if (!result)
  750. {
  751. LOG.WriteLog(eEvent.ERR_SRD, Module, "EnterError: Exhaust Off is failed");
  752. }
  753. }
  754. //关闭WaterAbove
  755. if (CommonData.WaterAbove)
  756. {
  757. bool result = WaterAboveOff();
  758. if (!result)
  759. {
  760. LOG.WriteLog(eEvent.INFO_SRD, Module, "EnterError: Water Above Off is failed");
  761. }
  762. }
  763. //关闭WaterBelow
  764. if (CommonData.WaterBelow)
  765. {
  766. bool result = WaterBelowOff();
  767. if (!result)
  768. {
  769. LOG.WriteLog(eEvent.INFO_SRD, Module, "EnterError: Water Below Off is failed");
  770. }
  771. }
  772. //停电机
  773. JetAxisBase _armAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Arm");
  774. if (_armAxis != null && _armAxis.IsRun) _armAxis.StopPositionOperation();
  775. JetAxisBase _rotationAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Rotation");
  776. if (_rotationAxis != null && _rotationAxis.IsRun) _rotationAxis.StopPositionOperation();
  777. }
  778. #endregion
  779. /// <summary>
  780. /// 定时器
  781. /// </summary>
  782. /// <returns></returns>
  783. public bool OnTimer()
  784. {
  785. if (_status == RState.Running)
  786. {
  787. if (_currentOperation != SrdCommonOperation.None)
  788. {
  789. IRoutine routine = GetCurrentRoutine(_currentOperation);
  790. if (routine != null)
  791. {
  792. CheckRoutineState(routine, _currentOperation);
  793. }
  794. else
  795. {
  796. EndOperation();
  797. }
  798. }
  799. }
  800. //将公有的数据赋值于对象的数值
  801. if (_totalSRDDevice == null)
  802. {
  803. _totalSRDDevice = DEVICE.GetDevice<TotalSRDDevice>("SRD");
  804. }
  805. if (_totalSRDDevice != null)
  806. {
  807. CommonData.FluidContainment = _totalSRDDevice.FluidContainment;
  808. CommonData.WaterPressure = _totalSRDDevice.WaterPressure;
  809. }
  810. return true;
  811. }
  812. /// <summary>
  813. /// 获取当前操作对应的Routine
  814. /// </summary>
  815. /// <param name="currentOperation"></param>
  816. /// <returns></returns>
  817. private IRoutine GetCurrentRoutine(SrdCommonOperation currentOperation)
  818. {
  819. switch (currentOperation)
  820. {
  821. case SrdCommonOperation.DoorClose:
  822. case SrdCommonOperation.DoorOpen:
  823. return _doorCloseRoutine;
  824. case SrdCommonOperation.ChuckVacuumOn:
  825. case SrdCommonOperation.ChuckVacuumOff:
  826. return _chuckVacuumRoutine;
  827. case SrdCommonOperation.LiftUpOn:
  828. case SrdCommonOperation.LiftUpOff:
  829. return _liftUpRoutine;
  830. case SrdCommonOperation.FlippersIn:
  831. case SrdCommonOperation.FlippersOut:
  832. return _flipperRoutine;
  833. default:
  834. return null;
  835. }
  836. }
  837. /// <summary>
  838. /// 检验Routine状态
  839. /// </summary>
  840. /// <param name="routine"></param>
  841. /// <param name="currentOperation"></param>
  842. private void CheckRoutineState(IRoutine routine, SrdCommonOperation currentOperation)
  843. {
  844. RState state = routine.Monitor();
  845. if (state == RState.End)
  846. {
  847. EndOperation();
  848. }
  849. else if (state == RState.Failed || state == RState.Timeout)
  850. {
  851. LOG.WriteLog(eEvent.ERR_SRD, $"{Module}", $"{currentOperation} error");
  852. EndOperation();
  853. }
  854. }
  855. /// <summary>
  856. /// 结束操作
  857. /// </summary>
  858. private void EndOperation()
  859. {
  860. _status = RState.End;
  861. _currentOperation = SrdCommonOperation.None;
  862. }
  863. #region 设备接口
  864. /// <summary>
  865. /// 监控
  866. /// </summary>
  867. public void Monitor()
  868. {
  869. }
  870. public void Reset()
  871. {
  872. }
  873. public void Terminate()
  874. {
  875. }
  876. #endregion
  877. }
  878. }