SrdCommonDevice.cs 34 KB

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