IoFIMS.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469
  1. using Aitex.Core.RT.DataCenter;
  2. using Aitex.Core.RT.Device;
  3. using Aitex.Core.RT.IOCore;
  4. using Aitex.Core.RT.OperationCenter;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using System.Xml;
  11. namespace FurnaceRT.Devices
  12. {
  13. public class IoFIMS : BaseDevice, IDevice
  14. {
  15. private DIAccessor _diLoadComplete;
  16. private DIAccessor _diUnloadComplete;
  17. private DIAccessor _diHomeComplete;
  18. private DIAccessor _diRunning;
  19. private DIAccessor _diAutoManual;
  20. private DIAccessor _diUndock;
  21. private DIAccessor _diDock;
  22. private DIAccessor _diExist;
  23. private DIAccessor _diSeal;
  24. private DIAccessor _diRelease;
  25. private DIAccessor _diDoorOpen;
  26. private DIAccessor _diDoorClose;
  27. private DIAccessor _diLatchOn;
  28. private DIAccessor _diLatchOff;
  29. private DIAccessor _diCollisionAvoidanceDown;
  30. private DIAccessor _diCollisionAvoidanceUp;
  31. private DIAccessor _diN2PurgeValveClosed;
  32. private DIAccessor _diN2PurgeValveOpened;
  33. private DIAccessor _diFOUPVacuumSuckingOK;
  34. private DIAccessor _diFOUPVacuumSuckingAlarm;
  35. private DIAccessor _diWaferOnRobot;
  36. private DIAccessor _diWaferRobotEX1AxisHomePosition;
  37. private DIAccessor _diWaferRobotEX2AxisHomePosition;
  38. private DOAccessor _doLoad;
  39. private DOAccessor _doUnload;
  40. private DOAccessor _doHome;
  41. private DOAccessor _doAlarmReset;
  42. private DOAccessor _doAutoManual;
  43. private DOAccessor _doUndock;
  44. private DOAccessor _doDock;
  45. private DOAccessor _doSeal;
  46. private DOAccessor _doRelease;
  47. private DOAccessor _doDoorOpen;
  48. private DOAccessor _doDoorClose;
  49. private DOAccessor _doLatch1On;
  50. private DOAccessor _doLatch2On;
  51. private DOAccessor _doLatch1Off;
  52. private DOAccessor _doLatch2Off;
  53. private DOAccessor _doCollisionAvoidanceDown;
  54. private DOAccessor _doCollisionAvoidanceUp;
  55. private DOAccessor _doN2PurgeValveOpen;
  56. private DOAccessor _doN2PurgeValveClose;
  57. private DOAccessor _doVaccumValveOpen;
  58. private DOAccessor _doVaccumValveClose;
  59. public DeviceStatus DockUndockStatus
  60. {
  61. get
  62. {
  63. if (_diDock != null && _diUndock != null && _diDock.Value && !_diUndock.Value)
  64. return DeviceStatus.Dock;
  65. if (_diDock != null && _diUndock != null && !_diDock.Value && _diUndock.Value)
  66. return DeviceStatus.Undock;
  67. return DeviceStatus.Unknown;
  68. }
  69. }
  70. public DeviceStatus SealReleaseStatus
  71. {
  72. get
  73. {
  74. if (_diSeal != null && _diRelease != null && _diSeal.Value && !_diRelease.Value)
  75. return DeviceStatus.Seal;
  76. if (_diSeal != null && _diRelease != null && !_diSeal.Value && _diRelease.Value)
  77. return DeviceStatus.Release;
  78. return DeviceStatus.Unknown;
  79. }
  80. }
  81. public DeviceStatus DoorOpenCloseStatus
  82. {
  83. get
  84. {
  85. if (_diDoorOpen != null && _diDoorClose != null && _diDoorOpen.Value && !_diDoorClose.Value)
  86. return DeviceStatus.Open;
  87. if (_diDoorOpen != null && _diDoorClose != null && !_diDoorOpen.Value && _diDoorClose.Value)
  88. return DeviceStatus.Close;
  89. return DeviceStatus.Unknown;
  90. }
  91. }
  92. public DeviceStatus LatchOnOffStatus
  93. {
  94. get
  95. {
  96. if (_diLatchOn != null && _diLatchOff != null && _diLatchOn.Value && !_diLatchOff.Value)
  97. return DeviceStatus.On;
  98. if (_diLatchOn != null && _diLatchOff != null && !_diLatchOn.Value && _diLatchOff.Value)
  99. return DeviceStatus.Off;
  100. return DeviceStatus.Unknown;
  101. }
  102. }
  103. public DeviceStatus CollisionAvoidanceUpDownStatus
  104. {
  105. get
  106. {
  107. if (_diCollisionAvoidanceUp != null && _diCollisionAvoidanceDown != null &&
  108. _diCollisionAvoidanceUp.Value && !_diCollisionAvoidanceDown.Value)
  109. return DeviceStatus.Up;
  110. if (_diCollisionAvoidanceUp != null && _diCollisionAvoidanceDown != null &&
  111. !_diCollisionAvoidanceUp.Value && _diCollisionAvoidanceDown.Value)
  112. return DeviceStatus.Down;
  113. return DeviceStatus.Unknown;
  114. }
  115. }
  116. public DeviceStatus N2PurgeValveOpenCloseStatus
  117. {
  118. get
  119. {
  120. if (_diN2PurgeValveOpened != null && _diN2PurgeValveClosed != null &&
  121. _diN2PurgeValveOpened.Value && !_diN2PurgeValveClosed.Value)
  122. return DeviceStatus.Open;
  123. if (_diN2PurgeValveOpened != null && _diN2PurgeValveClosed != null &&
  124. !_diN2PurgeValveOpened.Value && _diN2PurgeValveClosed.Value)
  125. return DeviceStatus.Close;
  126. return DeviceStatus.Unknown;
  127. }
  128. }
  129. public DeviceStatus VaccumValveOpenCloseStatus
  130. {
  131. get
  132. {
  133. if (_doVaccumValveOpen != null && _doVaccumValveClose != null &&
  134. _doVaccumValveOpen.Value && !_doVaccumValveClose.Value)
  135. return DeviceStatus.Open;
  136. if (_doVaccumValveOpen != null && _doVaccumValveClose != null &&
  137. !_doVaccumValveOpen.Value && _doVaccumValveClose.Value)
  138. return DeviceStatus.Close;
  139. return DeviceStatus.Unknown;
  140. }
  141. }
  142. public bool IsPLCLoadCompleted => _diLoadComplete == null ? false : _diLoadComplete.Value;
  143. public bool IsPLCUnloadCompleted => _diUnloadComplete == null ? false : _diUnloadComplete.Value;
  144. public bool IsPLCInitCompleted => _diHomeComplete == null ? false : _diHomeComplete.Value;
  145. public bool IsRunning => _diRunning == null ? false : _diRunning.Value;
  146. public bool IsFoupExist => _diExist == null ? false : _diExist.Value;
  147. public bool IsWaferOnRobot => _diWaferOnRobot == null ? false : _diWaferOnRobot.Value;
  148. public bool IsWaferRobotEX1AxisHomePosition => _diWaferRobotEX1AxisHomePosition == null ? false : _diWaferRobotEX1AxisHomePosition.Value;
  149. public bool IsWaferRobotEX2AxisHomePosition => _diWaferRobotEX2AxisHomePosition == null ? false : _diWaferRobotEX2AxisHomePosition.Value;
  150. public bool IsLoadCompleted { get; set; }
  151. public bool IsUnloadCompleted { get; set; }
  152. public bool IsInitCompleted { get; set; }
  153. public bool IsBusy { get; set; }
  154. public bool IsPause { get; set; }
  155. public IoFIMS(string module, XmlElement node, string ioModule = "")
  156. {
  157. base.Module = string.IsNullOrEmpty(node.GetAttribute("module")) ? module : node.GetAttribute("module");
  158. base.Name = node.GetAttribute("id");
  159. base.Display = node.GetAttribute("display");
  160. base.DeviceID = node.GetAttribute("schematicId");
  161. _diLoadComplete = ParseDiNode("diLoadComplete", node, ioModule);
  162. _diUnloadComplete = ParseDiNode("diUnloadComplete", node, ioModule);
  163. _diHomeComplete = ParseDiNode("diHomeComplete", node, ioModule);
  164. _diRunning = ParseDiNode("diRunning", node, ioModule);
  165. _diAutoManual = ParseDiNode("diAutoManual", node, ioModule);
  166. _diDock = ParseDiNode("diDock", node, ioModule);
  167. _diUndock = ParseDiNode("diUndock", node, ioModule);
  168. _diExist = ParseDiNode("diExist", node, ioModule);
  169. _diSeal = ParseDiNode("diSeal", node, ioModule);
  170. _diRelease = ParseDiNode("diRelease", node, ioModule);
  171. _diDoorOpen = ParseDiNode("diDoorOpen", node, ioModule);
  172. _diDoorClose = ParseDiNode("diDoorClose", node, ioModule);
  173. _diLatchOn = ParseDiNode("diLatchOn", node, ioModule);
  174. _diLatchOff = ParseDiNode("diLatchOff", node, ioModule);
  175. _diCollisionAvoidanceDown = ParseDiNode("diCollisionAvoidanceDown", node, ioModule);
  176. _diCollisionAvoidanceUp= ParseDiNode("diCollisionAvoidanceUp", node, ioModule);
  177. _diN2PurgeValveClosed = ParseDiNode("diN2PurgeValveClosed", node, ioModule);
  178. _diN2PurgeValveOpened = ParseDiNode("diN2PurgeValveOpened", node, ioModule);
  179. _diFOUPVacuumSuckingOK = ParseDiNode("diFOUPVacuumSuckingOK", node, ioModule);
  180. _diFOUPVacuumSuckingAlarm = ParseDiNode("diFOUPVacuumSuckingAlarm", node, ioModule);
  181. _diWaferOnRobot = ParseDiNode("diWaferOnRobot", node, ioModule);
  182. _diWaferRobotEX1AxisHomePosition = ParseDiNode("diWaferRobotEX1AxisHomePosition", node, ioModule);
  183. _diWaferRobotEX2AxisHomePosition = ParseDiNode("diWaferRobotEX2AxisHomePosition", node, ioModule);
  184. _doLoad = ParseDoNode("doLoad", node, ioModule);
  185. _doUnload = ParseDoNode("doUnload", node, ioModule);
  186. _doHome = ParseDoNode("doHome", node, ioModule);
  187. _doAlarmReset = ParseDoNode("doAlarmReset", node, ioModule);
  188. _doAutoManual = ParseDoNode("doAutoManual", node, ioModule);
  189. _doDock = ParseDoNode("doDock", node, ioModule);
  190. _doUndock = ParseDoNode("doUndock", node, ioModule);
  191. _doSeal = ParseDoNode("doSeal", node, ioModule);
  192. _doRelease = ParseDoNode("doRelease", node, ioModule);
  193. _doDoorOpen = ParseDoNode("doDoorOpen", node, ioModule);
  194. _doDoorClose = ParseDoNode("doDoorClose", node, ioModule);
  195. _doLatch1On = ParseDoNode("doLatch1On", node, ioModule);
  196. _doLatch2On = ParseDoNode("doLatch2On", node, ioModule);
  197. _doLatch1Off = ParseDoNode("doLatch1Off", node, ioModule);
  198. _doLatch2Off = ParseDoNode("doLatch2Off", node, ioModule);
  199. _doCollisionAvoidanceDown = ParseDoNode("doCollisionAvoidanceDown", node, ioModule);
  200. _doCollisionAvoidanceUp = ParseDoNode("doCollisionAvoidanceUp", node, ioModule);
  201. _doN2PurgeValveOpen = ParseDoNode("doN2PurgeValveOpen", node, ioModule);
  202. _doN2PurgeValveClose = ParseDoNode("doN2PurgeValveClose", node, ioModule);
  203. _doVaccumValveOpen = ParseDoNode("doVaccumValveOpen", node, ioModule);
  204. _doVaccumValveClose = ParseDoNode("doVaccumValveClose", node, ioModule);
  205. }
  206. public bool Initialize()
  207. {
  208. DATA.Subscribe($"{Module}.{Name}.DockUndockStatus", () => DockUndockStatus.ToString());
  209. DATA.Subscribe($"{Module}.{Name}.SealReleaseStatus", () => SealReleaseStatus.ToString());
  210. DATA.Subscribe($"{Module}.{Name}.DoorOpenCloseStatus", () => DoorOpenCloseStatus.ToString());
  211. DATA.Subscribe($"{Module}.{Name}.LatchOnOffStatus", () => LatchOnOffStatus.ToString());
  212. DATA.Subscribe($"{Module}.{Name}.CollisionAvoidanceUpDownStatus", () => CollisionAvoidanceUpDownStatus.ToString());
  213. DATA.Subscribe($"{Module}.{Name}.N2PurgeValveOpenCloseStatus", () => N2PurgeValveOpenCloseStatus.ToString());
  214. DATA.Subscribe($"{Module}.{Name}.VaccumValveOpenCloseStatus", () => VaccumValveOpenCloseStatus.ToString());
  215. OP.Subscribe($"{Module}.{Name}.SetDockUndock", (string cmd, object[] param) =>
  216. {
  217. bool.TryParse(param[0].ToString(), out bool isDock);
  218. SetDockUndock(isDock);
  219. return true;
  220. });
  221. OP.Subscribe($"{Module}.{Name}.SetSealRelease", (string cmd, object[] param) =>
  222. {
  223. bool.TryParse(param[0].ToString(), out bool isSeal);
  224. SetSealRelease(isSeal);
  225. return true;
  226. });
  227. OP.Subscribe($"{Module}.{Name}.SetDoorOpenClose", (string cmd, object[] param) =>
  228. {
  229. bool.TryParse(param[0].ToString(), out bool isOpen);
  230. SetDoorOpenClose(isOpen);
  231. return true;
  232. });
  233. OP.Subscribe($"{Module}.{Name}.SetLatchOnOff", (string cmd, object[] param) =>
  234. {
  235. bool.TryParse(param[0].ToString(), out bool isOn);
  236. SetLatchOnOff(isOn);
  237. return true;
  238. });
  239. OP.Subscribe($"{Module}.{Name}.SetCollisionAvoidanceUpDown", (string cmd, object[] param) =>
  240. {
  241. bool.TryParse(param[0].ToString(), out bool isUp);
  242. SetCollisionAvoidanceUpDown(isUp);
  243. return true;
  244. });
  245. OP.Subscribe($"{Module}.{Name}.SetN2PurgeValveOpenClose", (string cmd, object[] param) =>
  246. {
  247. bool.TryParse(param[0].ToString(), out bool isOpen);
  248. SetN2PurgeValveOpenClose(isOpen);
  249. return true;
  250. });
  251. OP.Subscribe($"{Module}.{Name}.SetVaccumValveOpen", (string cmd, object[] param) =>
  252. {
  253. bool.TryParse(param[0].ToString(), out bool isOpen);
  254. SetVaccumValveOpen(isOpen);
  255. return true;
  256. });
  257. OP.Subscribe($"{Module}.{Name}.SetAlarmReset", (string cmd, object[] param) =>
  258. {
  259. SetAlarmReset();
  260. return true;
  261. });
  262. return true;
  263. }
  264. public void Monitor()
  265. {
  266. }
  267. public void Reset()
  268. {
  269. }
  270. public void Terminate()
  271. {
  272. }
  273. private bool SetDockUndock(bool isDock)
  274. {
  275. if (isDock)
  276. {
  277. _doUndock.Value = false;
  278. _doDock.Value = true;
  279. }
  280. else
  281. {
  282. _doDock.Value = false;
  283. _doUndock.Value = true;
  284. }
  285. return true;
  286. }
  287. private bool SetSealRelease(bool isSeal)
  288. {
  289. if (isSeal)
  290. {
  291. _doRelease.Value = false;
  292. _doSeal.Value = true;
  293. }
  294. else
  295. {
  296. _doSeal.Value = false;
  297. _doRelease.Value = true;
  298. }
  299. return true;
  300. }
  301. private bool SetDoorOpenClose(bool isOpen)
  302. {
  303. if (isOpen)
  304. {
  305. _doDoorClose.Value = false;
  306. _doDoorOpen.Value = true;
  307. }
  308. else
  309. {
  310. _doDoorOpen.Value = false;
  311. _doDoorClose.Value = true;
  312. }
  313. return true;
  314. }
  315. private bool SetLatchOnOff(bool isOn)
  316. {
  317. if (isOn)
  318. {
  319. _doLatch1Off.Value = false;
  320. _doLatch2Off.Value = false;
  321. _doLatch1On.Value = true;
  322. _doLatch2On.Value = true;
  323. }
  324. else
  325. {
  326. _doLatch1On.Value = false;
  327. _doLatch2On.Value = false;
  328. _doLatch1Off.Value = true;
  329. _doLatch2Off.Value = true;
  330. }
  331. return true;
  332. }
  333. private bool SetCollisionAvoidanceUpDown(bool isUp)
  334. {
  335. if (isUp)
  336. {
  337. _doCollisionAvoidanceDown.Value = false;
  338. _doCollisionAvoidanceUp.Value = true;
  339. }
  340. else
  341. {
  342. _doCollisionAvoidanceUp.Value = false;
  343. _doCollisionAvoidanceDown.Value = true;
  344. }
  345. return true;
  346. }
  347. private bool SetN2PurgeValveOpenClose(bool isOpen)
  348. {
  349. if (isOpen)
  350. {
  351. _doN2PurgeValveClose.Value = false;
  352. _doN2PurgeValveOpen.Value = true;
  353. }
  354. else
  355. {
  356. _doN2PurgeValveOpen.Value = false;
  357. _doN2PurgeValveClose.Value = true;
  358. }
  359. return true;
  360. }
  361. private bool SetVaccumValveOpen(bool isOpen)
  362. {
  363. if (isOpen)
  364. {
  365. _doVaccumValveClose.Value = false;
  366. _doVaccumValveOpen.Value = true;
  367. }
  368. else
  369. {
  370. _doVaccumValveOpen.Value = false;
  371. _doVaccumValveClose.Value = true;
  372. }
  373. return true;
  374. }
  375. public void SetAlarmReset()
  376. {
  377. _doAlarmReset.SetPulseValue(true, 1000);
  378. }
  379. public bool Unload(out string reason)
  380. {
  381. reason = "";
  382. _doLoad.SetValue(false, out reason);
  383. _doHome.SetValue(false, out reason);
  384. _doUnload.SetValue(true, out reason);
  385. return true;
  386. }
  387. public bool Load(out string reason)
  388. {
  389. reason = "";
  390. _doUnload.SetValue(false, out reason);
  391. _doHome.SetValue(false, out reason);
  392. _doLoad.SetValue(true, out reason);
  393. return true;
  394. }
  395. public bool Init(out string reason)
  396. {
  397. reason = "";
  398. _doLoad.SetValue(false, out reason);
  399. _doUnload.SetValue(false, out reason);
  400. _doHome.SetValue(true, out reason);
  401. return true;
  402. }
  403. public bool Stop()
  404. {
  405. var reason = "";
  406. _doLoad.SetValue(false, out reason);
  407. _doUnload.SetValue(false, out reason);
  408. _doHome.SetValue(false, out reason);
  409. return true;
  410. }
  411. public void SetPauseResume(bool isPause)
  412. {
  413. IsPause = isPause;
  414. }
  415. }
  416. }