SrdCommonDevice.cs 33 KB

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