IoFIMS.cs 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615
  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 Aitex.Core.RT.SCCore;
  6. using Aitex.Core.Util;
  7. using FurnaceRT.Equipments.FIMSs;
  8. using FurnaceRT.Equipments.PMs;
  9. using FurnaceRT.Equipments.Systems;
  10. using FurnaceRT.Equipments.WaferRobots;
  11. using MECF.Framework.Common.Equipment;
  12. using MECF.Framework.Common.Jobs;
  13. using MECF.Framework.Common.SubstrateTrackings;
  14. using System;
  15. using System.Collections.Generic;
  16. using System.Linq;
  17. using System.Text;
  18. using System.Threading.Tasks;
  19. using System.Xml;
  20. using static FurnaceRT.Equipments.PMs.PMModule;
  21. namespace FurnaceRT.Devices
  22. {
  23. public class IoFIMS : BaseDevice, IDevice
  24. {
  25. private DIAccessor _diLoadComplete;
  26. private DIAccessor _diUnloadComplete;
  27. private DIAccessor _diHomeComplete;
  28. private DIAccessor _diRunning;
  29. private DIAccessor _diAutoManual;
  30. private DIAccessor _diUndock;
  31. private DIAccessor _diDock;
  32. private DIAccessor _diExist;
  33. private DIAccessor _diSeal;
  34. private DIAccessor _diRelease;
  35. private DIAccessor _diDoorOpen;
  36. private DIAccessor _diDoorClose;
  37. private DIAccessor _diLatchOn;
  38. private DIAccessor _diLatchOff;
  39. private DIAccessor _diCollisionAvoidanceDown;
  40. private DIAccessor _diCollisionAvoidanceUp;
  41. private DIAccessor _diN2PurgeValveClosed;
  42. private DIAccessor _diN2PurgeValveOpened;
  43. private DIAccessor _diFOUPVacuumSuckingOK;
  44. private DIAccessor _diFOUPVacuumSuckingNotOK;
  45. private DIAccessor _diWaferOnRobot;
  46. private DIAccessor _diWaferRobotEX1AxisHomePosition;
  47. private DIAccessor _diWaferRobotEX2AxisHomePosition;
  48. private DOAccessor _doLoad;
  49. private DOAccessor _doUnload;
  50. private DOAccessor _doHome;
  51. private DOAccessor _doAlarmReset;
  52. private DOAccessor _doAutoManual;
  53. private DOAccessor _doUndock;
  54. private DOAccessor _doDock;
  55. private DOAccessor _doSeal;
  56. private DOAccessor _doRelease;
  57. private DOAccessor _doDoorOpen;
  58. private DOAccessor _doDoorClose;
  59. private DOAccessor _doLatch1On;
  60. private DOAccessor _doLatch2On;
  61. private DOAccessor _doLatch1Off;
  62. private DOAccessor _doLatch2Off;
  63. private DOAccessor _doCollisionAvoidanceDown;
  64. private DOAccessor _doCollisionAvoidanceUp;
  65. private DOAccessor _doN2PurgeValveOpen;
  66. private DOAccessor _doN2PurgeValveClose;
  67. private DOAccessor _doVaccumValveOpen;
  68. private DOAccessor _doVaccumValveClose;
  69. private int resetTime = 500;
  70. public DeviceStatus DockUndockStatus
  71. {
  72. get
  73. {
  74. if (_diDock != null && _diUndock != null && _diDock.Value && !_diUndock.Value)
  75. return DeviceStatus.Dock;
  76. if (_diDock != null && _diUndock != null && !_diDock.Value && _diUndock.Value)
  77. return DeviceStatus.Undock;
  78. return DeviceStatus.Unknown;
  79. }
  80. }
  81. public DeviceStatus SealReleaseStatus
  82. {
  83. get
  84. {
  85. if (_diSeal != null && _diRelease != null && _diSeal.Value && !_diRelease.Value)
  86. return DeviceStatus.Seal;
  87. if (_diSeal != null && _diRelease != null && !_diSeal.Value && _diRelease.Value)
  88. return DeviceStatus.Release;
  89. return DeviceStatus.Unknown;
  90. }
  91. }
  92. public DeviceStatus DoorOpenCloseStatus
  93. {
  94. get
  95. {
  96. if (_diDoorOpen != null && _diDoorClose != null && _diDoorOpen.Value && !_diDoorClose.Value)
  97. return DeviceStatus.Open;
  98. if (_diDoorOpen != null && _diDoorClose != null && !_diDoorOpen.Value && _diDoorClose.Value)
  99. return DeviceStatus.Close;
  100. return DeviceStatus.Unknown;
  101. }
  102. }
  103. public DeviceStatus LatchOnOffStatus
  104. {
  105. get
  106. {
  107. if (_diLatchOn != null && _diLatchOff != null && _diLatchOn.Value && !_diLatchOff.Value)
  108. return DeviceStatus.On;
  109. if (_diLatchOn != null && _diLatchOff != null && !_diLatchOn.Value && _diLatchOff.Value)
  110. return DeviceStatus.Off;
  111. return DeviceStatus.Unknown;
  112. }
  113. }
  114. public DeviceStatus CollisionAvoidanceUpDownStatus
  115. {
  116. get
  117. {
  118. if (_diCollisionAvoidanceUp != null && _diCollisionAvoidanceDown != null &&
  119. _diCollisionAvoidanceUp.Value && !_diCollisionAvoidanceDown.Value)
  120. return DeviceStatus.Up;
  121. if (_diCollisionAvoidanceUp != null && _diCollisionAvoidanceDown != null &&
  122. !_diCollisionAvoidanceUp.Value && _diCollisionAvoidanceDown.Value)
  123. return DeviceStatus.Down;
  124. return DeviceStatus.Unknown;
  125. }
  126. }
  127. public DeviceStatus N2PurgeValveOpenCloseStatus
  128. {
  129. get
  130. {
  131. if (_diN2PurgeValveOpened != null && _diN2PurgeValveClosed != null &&
  132. _diN2PurgeValveOpened.Value && !_diN2PurgeValveClosed.Value)
  133. return DeviceStatus.Open;
  134. if (_diN2PurgeValveOpened != null && _diN2PurgeValveClosed != null &&
  135. !_diN2PurgeValveOpened.Value && _diN2PurgeValveClosed.Value)
  136. return DeviceStatus.Close;
  137. return DeviceStatus.Unknown;
  138. }
  139. }
  140. public DeviceStatus VaccumValveOpenCloseStatus
  141. {
  142. get
  143. {
  144. if (_diFOUPVacuumSuckingOK != null && !_diFOUPVacuumSuckingOK.Value
  145. &&
  146. _diFOUPVacuumSuckingNotOK != null && _diFOUPVacuumSuckingNotOK.Value)
  147. return DeviceStatus.On;
  148. if (_diFOUPVacuumSuckingOK != null && _diFOUPVacuumSuckingOK.Value
  149. &&
  150. _diFOUPVacuumSuckingNotOK != null && !_diFOUPVacuumSuckingNotOK.Value)
  151. return DeviceStatus.Off;
  152. if (_doVaccumValveOpen != null && _doVaccumValveClose != null &&
  153. _doVaccumValveOpen.Value && !_doVaccumValveClose.Value)
  154. return DeviceStatus.On;
  155. if (_doVaccumValveOpen != null && _doVaccumValveClose != null &&
  156. !_doVaccumValveOpen.Value && _doVaccumValveClose.Value)
  157. return DeviceStatus.Off;
  158. return DeviceStatus.Unknown;
  159. }
  160. }
  161. public bool IsPLCLoadCompleted => _diLoadComplete == null ? false : _diLoadComplete.Value;
  162. public bool IsPLCUnloadCompleted => _diUnloadComplete == null ? false : _diUnloadComplete.Value;
  163. public bool IsPLCInitCompleted => _diHomeComplete == null ? false : _diHomeComplete.Value;
  164. public bool IsRunning => _diRunning == null ? false : _diRunning.Value;
  165. public bool IsFoupExist => _diExist == null ? false : _diExist.Value;
  166. public bool IsWaferOnRobot => _diWaferOnRobot == null ? false : !_diWaferOnRobot.Value;
  167. public bool IsWaferRobotEX1AxisHomePosition => _diWaferRobotEX1AxisHomePosition == null ? false : _diWaferRobotEX1AxisHomePosition.Value;
  168. public bool IsWaferRobotEX2AxisHomePosition => _diWaferRobotEX2AxisHomePosition == null ? false : _diWaferRobotEX2AxisHomePosition.Value;
  169. public bool IsLoadCompleted { get; set; }
  170. public bool IsUnloadCompleted { get; set; }
  171. public bool IsInitCompleted { get; set; }
  172. public bool IsBusy { get; set; }
  173. public bool IsPause { get; set; }
  174. public IoFIMS(string module, XmlElement node, string ioModule = "")
  175. {
  176. base.Module = string.IsNullOrEmpty(node.GetAttribute("module")) ? module : node.GetAttribute("module");
  177. base.Name = node.GetAttribute("id");
  178. base.Display = node.GetAttribute("display");
  179. base.DeviceID = node.GetAttribute("schematicId");
  180. _diLoadComplete = ParseDiNode("diLoadComplete", node, ioModule);
  181. _diUnloadComplete = ParseDiNode("diUnloadComplete", node, ioModule);
  182. _diHomeComplete = ParseDiNode("diHomeComplete", node, ioModule);
  183. _diRunning = ParseDiNode("diRunning", node, ioModule);
  184. _diAutoManual = ParseDiNode("diAutoManual", node, ioModule);
  185. _diDock = ParseDiNode("diDock", node, ioModule);
  186. _diUndock = ParseDiNode("diUndock", node, ioModule);
  187. _diExist = ParseDiNode("diExist", node, ioModule);
  188. _diSeal = ParseDiNode("diSeal", node, ioModule);
  189. _diRelease = ParseDiNode("diRelease", node, ioModule);
  190. _diDoorOpen = ParseDiNode("diDoorOpen", node, ioModule);
  191. _diDoorClose = ParseDiNode("diDoorClose", node, ioModule);
  192. _diLatchOn = ParseDiNode("diLatchOn", node, ioModule);
  193. _diLatchOff = ParseDiNode("diLatchOff", node, ioModule);
  194. _diCollisionAvoidanceDown = ParseDiNode("diCollisionAvoidanceDown", node, ioModule);
  195. _diCollisionAvoidanceUp = ParseDiNode("diCollisionAvoidanceUp", node, ioModule);
  196. _diN2PurgeValveClosed = ParseDiNode("diN2PurgeValveClosed", node, ioModule);
  197. _diN2PurgeValveOpened = ParseDiNode("diN2PurgeValveOpened", node, ioModule);
  198. _diFOUPVacuumSuckingOK = ParseDiNode("diFOUPVacuumSuckingOK", node, ioModule);
  199. _diFOUPVacuumSuckingNotOK = ParseDiNode("diFOUPVacuumSuckingNotOK", node, ioModule);
  200. _diWaferOnRobot = ParseDiNode("diWaferOnRobot", node, ioModule);
  201. _diWaferRobotEX1AxisHomePosition = ParseDiNode("diWaferRobotEX1AxisHomePosition", node, ioModule);
  202. _diWaferRobotEX2AxisHomePosition = ParseDiNode("diWaferRobotEX2AxisHomePosition", node, ioModule);
  203. _doLoad = ParseDoNode("doLoad", node, ioModule);
  204. _doUnload = ParseDoNode("doUnload", node, ioModule);
  205. _doHome = ParseDoNode("doHome", node, ioModule);
  206. _doAlarmReset = ParseDoNode("doAlarmReset", node, ioModule);
  207. _doAutoManual = ParseDoNode("doAutoManual", node, ioModule);
  208. _doDock = ParseDoNode("doDock", node, ioModule);
  209. _doUndock = ParseDoNode("doUndock", node, ioModule);
  210. _doSeal = ParseDoNode("doSeal", node, ioModule);
  211. _doRelease = ParseDoNode("doRelease", node, ioModule);
  212. _doDoorOpen = ParseDoNode("doDoorOpen", node, ioModule);
  213. _doDoorClose = ParseDoNode("doDoorClose", node, ioModule);
  214. _doLatch1On = ParseDoNode("doLatch1On", node, ioModule);
  215. _doLatch2On = ParseDoNode("doLatch2On", node, ioModule);
  216. _doLatch1Off = ParseDoNode("doLatch1Off", node, ioModule);
  217. _doLatch2Off = ParseDoNode("doLatch2Off", node, ioModule);
  218. _doCollisionAvoidanceDown = ParseDoNode("doCollisionAvoidanceDown", node, ioModule);
  219. _doCollisionAvoidanceUp = ParseDoNode("doCollisionAvoidanceUp", node, ioModule);
  220. _doN2PurgeValveOpen = ParseDoNode("doN2PurgeValveOpen", node, ioModule);
  221. _doN2PurgeValveClose = ParseDoNode("doN2PurgeValveClose", node, ioModule);
  222. _doVaccumValveOpen = ParseDoNode("doVaccumValveOpen", node, ioModule);
  223. _doVaccumValveClose = ParseDoNode("doVaccumValveClose", node, ioModule);
  224. }
  225. public bool Initialize()
  226. {
  227. DATA.Subscribe($"{Module}.{Name}.DockUndockStatus", () => DockUndockStatus.ToString());
  228. DATA.Subscribe($"{Module}.{Name}.SealReleaseStatus", () => SealReleaseStatus.ToString());
  229. DATA.Subscribe($"{Module}.{Name}.DoorOpenCloseStatus", () => DoorOpenCloseStatus.ToString());
  230. DATA.Subscribe($"{Module}.{Name}.LatchOnOffStatus", () => LatchOnOffStatus.ToString());
  231. DATA.Subscribe($"{Module}.{Name}.CollisionAvoidanceUpDownStatus", () => CollisionAvoidanceUpDownStatus.ToString());
  232. DATA.Subscribe($"{Module}.{Name}.N2PurgeValveOpenCloseStatus", () => N2PurgeValveOpenCloseStatus.ToString());
  233. DATA.Subscribe($"{Module}.{Name}.VaccumValveOpenCloseStatus", () => VaccumValveOpenCloseStatus.ToString());
  234. DATA.Subscribe($"{Module}.{Name}.UIFoupSensor", () => GetUIFoupSensor(), SubscriptionAttribute.FLAG.IgnoreSaveDB);
  235. OP.Subscribe($"{Module}.{Name}.SetDockUndock", (string cmd, object[] param) =>
  236. {
  237. bool.TryParse(param[0].ToString(), out bool isDock);
  238. SetDockUndock(isDock);
  239. return true;
  240. });
  241. OP.Subscribe($"{Module}.{Name}.SetSealRelease", (string cmd, object[] param) =>
  242. {
  243. bool.TryParse(param[0].ToString(), out bool isSeal);
  244. SetSealRelease(isSeal);
  245. return true;
  246. });
  247. OP.Subscribe($"{Module}.{Name}.SetDoorOpenClose", (string cmd, object[] param) =>
  248. {
  249. bool.TryParse(param[0].ToString(), out bool isOpen);
  250. SetDoorOpenClose(isOpen);
  251. return true;
  252. });
  253. OP.Subscribe($"{Module}.{Name}.SetLatchOnOff", (string cmd, object[] param) =>
  254. {
  255. bool.TryParse(param[0].ToString(), out bool isOn);
  256. SetLatchOnOff(isOn);
  257. return true;
  258. });
  259. OP.Subscribe($"{Module}.{Name}.SetCollisionAvoidanceUpDown", (string cmd, object[] param) =>
  260. {
  261. bool.TryParse(param[0].ToString(), out bool isUp);
  262. SetCollisionAvoidanceUpDown(isUp);
  263. return true;
  264. });
  265. OP.Subscribe($"{Module}.{Name}.SetN2PurgeValveOpenClose", (string cmd, object[] param) =>
  266. {
  267. bool.TryParse(param[0].ToString(), out bool isOpen);
  268. SetN2PurgeValveOpenClose(isOpen);
  269. return true;
  270. });
  271. OP.Subscribe($"{Module}.{Name}.SetVaccumValveOpen", (string cmd, object[] param) =>
  272. {
  273. bool.TryParse(param[0].ToString(), out bool isOpen);
  274. SetVaccumValveOpen(isOpen);
  275. return true;
  276. });
  277. OP.Subscribe($"{Module}.{Name}.SetAlarmReset", (string cmd, object[] param) =>
  278. {
  279. SetAlarmReset();
  280. return true;
  281. });
  282. return true;
  283. }
  284. public void Monitor()
  285. {
  286. var fimsFoupInfo = CarrierManager.Instance.GetCarrier(Name);
  287. if (ModuleHelper.IsFIMS(ModuleHelper.Converter(Name)))
  288. {
  289. var setValue = GetUIFoupSensor();
  290. Singleton<EquipmentManager>.Instance.SetUIWaferCount(fimsFoupInfo, ModuleHelper.Converter(Name), out var wafers);
  291. if (!Singleton<EquipmentManager>.Instance.Modules.ContainsKey(ModuleHelper.Converter(Name)))
  292. {
  293. return;
  294. }
  295. var fims = Singleton<EquipmentManager>.Instance.Modules[ModuleHelper.Converter(Name)] as FIMSModule;
  296. var pm = Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule;
  297. if (pm.StringProcessFlowState == ProcessFlowState.End.ToString() && fimsFoupInfo != null && !fimsFoupInfo.IsEmpty && wafers.All(a => a.IsEmpty) && fims != null)
  298. {
  299. var activePjStatus = Singleton<EquipmentManager>.Instance.GetActivePjStatus();
  300. if (!string.IsNullOrEmpty(activePjStatus) && activePjStatus == EnumProcessingState.Discharging.ToString())
  301. {
  302. //等待waferrobot pick
  303. fimsFoupInfo.UICarrierStatusEnum = CarrierStatus.PRCEND;
  304. }
  305. }
  306. if (setValue)
  307. {
  308. var waferRobot = Singleton<EquipmentManager>.Instance.Modules[ModuleName.WaferRobot] as WaferRobotModule;
  309. if (waferRobot != null && waferRobot.IsInitialized)
  310. {
  311. if (waferRobot.FsmState == (int)WaferRobotModule.STATE.Mapping)
  312. {
  313. fimsFoupInfo.UICarrierStatusEnum = CarrierStatus.MAPPING;
  314. }
  315. }
  316. }
  317. if (fimsFoupInfo != null && fimsFoupInfo.CarrierType != CarrierType.None)
  318. {
  319. fimsFoupInfo.UICarrierType = fimsFoupInfo.CarrierType.ToString();
  320. var pmModule = Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule;
  321. fimsFoupInfo.UICarrierColor = pmModule.GetCarrierUIColor(fimsFoupInfo.UICarrierType, fimsFoupInfo.UICarrierStatusEnum);
  322. }
  323. SetVisibility(fimsFoupInfo, setValue);
  324. }
  325. }
  326. public void SetVisibility(CarrierInfo carrierInfo, bool setValue)
  327. {
  328. if (carrierInfo == null)
  329. {
  330. return;
  331. }
  332. carrierInfo.UIExitFoup = setValue;
  333. carrierInfo.UICarrierColorVisibility = setValue;
  334. carrierInfo.UICarrierStatusVisibility = setValue;
  335. carrierInfo.UICarrierTypeVisibility = setValue;
  336. carrierInfo.UICarrierWaferCountVisibility = setValue;
  337. }
  338. public bool GetUIFoupSensor()
  339. {
  340. var fimsFoupInfo = CarrierManager.Instance.GetCarrier(Name);
  341. if (SC.GetValue<bool>("System.IsSimulatorMode"))
  342. {
  343. if (fimsFoupInfo != null && !fimsFoupInfo.IsEmpty)
  344. {
  345. return true;
  346. }
  347. }
  348. else
  349. {
  350. if (_diExist != null && _diExist.Value && fimsFoupInfo != null && !fimsFoupInfo.IsEmpty)
  351. {
  352. return true;
  353. }
  354. return false;
  355. }
  356. return false;
  357. }
  358. public void Reset()
  359. {
  360. }
  361. public void Terminate()
  362. {
  363. }
  364. private bool SetDockUndock(bool isDock)
  365. {
  366. if (isDock)
  367. {
  368. _doUndock.SetPulseValue(false, resetTime);
  369. _doDock.SetPulseValue(true, resetTime);
  370. //_doUndock.Value = false;
  371. //_doDock.Value = true;
  372. }
  373. else
  374. {
  375. _doUndock.SetPulseValue(true, resetTime);
  376. _doDock.SetPulseValue(false, resetTime);
  377. //_doDock.Value = false;
  378. //_doUndock.Value = true;
  379. }
  380. return true;
  381. }
  382. private bool SetSealRelease(bool isSeal)
  383. {
  384. if (isSeal)
  385. {
  386. _doRelease.SetPulseValue(false, resetTime);
  387. _doSeal.SetPulseValue(true, resetTime);
  388. //_doRelease.Value = false;
  389. //_doSeal.Value = true;
  390. }
  391. else
  392. {
  393. _doSeal.SetPulseValue(false, resetTime);
  394. _doRelease.SetPulseValue(true, resetTime);
  395. //_doSeal.Value = false;
  396. //_doRelease.Value = true;
  397. }
  398. return true;
  399. }
  400. private bool SetDoorOpenClose(bool isOpen)
  401. {
  402. if (isOpen)
  403. {
  404. _doDoorClose.SetPulseValue(false, resetTime);
  405. _doDoorOpen.SetPulseValue(true, resetTime);
  406. //_doDoorClose.Value = false;
  407. //_doDoorOpen.Value = true;
  408. }
  409. else
  410. {
  411. _doDoorOpen.SetPulseValue(false, resetTime);
  412. _doDoorClose.SetPulseValue(true, resetTime);
  413. //_doDoorOpen.Value = false;
  414. //_doDoorClose.Value = true;
  415. }
  416. return true;
  417. }
  418. private bool SetLatchOnOff(bool isOn)
  419. {
  420. if (isOn)
  421. {
  422. _doLatch1Off.SetPulseValue(false, resetTime);
  423. _doLatch2Off.SetPulseValue(false, resetTime);
  424. _doLatch1On.SetPulseValue(true, resetTime);
  425. _doLatch2On.SetPulseValue(true, resetTime);
  426. //_doLatch1Off.Value = false;
  427. //_doLatch2Off.Value = false;
  428. //_doLatch1On.Value = true;
  429. //_doLatch2On.Value = true;
  430. }
  431. else
  432. {
  433. _doLatch1On.SetPulseValue(false, resetTime);
  434. _doLatch2On.SetPulseValue(false, resetTime);
  435. _doLatch1Off.SetPulseValue(true, resetTime);
  436. _doLatch2Off.SetPulseValue(true, resetTime);
  437. //_doLatch1On.Value = false;
  438. //_doLatch2On.Value = false;
  439. //_doLatch1Off.Value = true;
  440. //_doLatch2Off.Value = true;
  441. }
  442. return true;
  443. }
  444. private bool SetCollisionAvoidanceUpDown(bool isUp)
  445. {
  446. if (isUp)
  447. {
  448. _doCollisionAvoidanceDown.SetPulseValue(false, resetTime);
  449. _doCollisionAvoidanceUp.SetPulseValue(true, resetTime);
  450. //_doCollisionAvoidanceDown.Value = false;
  451. //_doCollisionAvoidanceUp.Value = true;
  452. }
  453. else
  454. {
  455. _doCollisionAvoidanceUp.SetPulseValue(false, resetTime);
  456. _doCollisionAvoidanceDown.SetPulseValue(true, resetTime);
  457. //_doCollisionAvoidanceUp.Value = false;
  458. //_doCollisionAvoidanceDown.Value = true;
  459. }
  460. return true;
  461. }
  462. private bool SetN2PurgeValveOpenClose(bool isOpen)
  463. {
  464. if (isOpen)
  465. {
  466. _doN2PurgeValveClose.SetPulseValue(false, resetTime);
  467. _doN2PurgeValveOpen.SetPulseValue(true, resetTime);
  468. //_doN2PurgeValveClose.Value = false;
  469. //_doN2PurgeValveOpen.Value = true;
  470. }
  471. else
  472. {
  473. _doN2PurgeValveOpen.SetPulseValue(false, resetTime);
  474. _doN2PurgeValveClose.SetPulseValue(true, resetTime);
  475. //_doN2PurgeValveOpen.Value = false;
  476. //_doN2PurgeValveClose.Value = true;
  477. }
  478. return true;
  479. }
  480. private bool SetVaccumValveOpen(bool isOpen)
  481. {
  482. if (isOpen)
  483. {
  484. _doVaccumValveClose.SetPulseValue(false, resetTime);
  485. _doVaccumValveOpen.SetPulseValue(true, resetTime);
  486. //_doVaccumValveClose.Value = false;
  487. //_doVaccumValveOpen.Value = true;
  488. }
  489. else
  490. {
  491. _doVaccumValveOpen.SetPulseValue(false, resetTime);
  492. _doVaccumValveClose.SetPulseValue(true, resetTime);
  493. //_doVaccumValveOpen.Value = false;
  494. //_doVaccumValveClose.Value = true;
  495. }
  496. return true;
  497. }
  498. public void SetAlarmReset()
  499. {
  500. _doAlarmReset.SetPulseValue(true, 1000);
  501. _doLoad.SetValue(false, out _);
  502. _doHome.SetValue(false, out _);
  503. _doUnload.SetValue(false, out _);
  504. }
  505. public bool Unload(out string reason)
  506. {
  507. reason = "";
  508. _doLoad.SetValue(false, out reason);
  509. _doHome.SetValue(false, out reason);
  510. _doUnload.SetValue(true, out reason);
  511. return true;
  512. }
  513. public bool Load(out string reason)
  514. {
  515. reason = "";
  516. _doUnload.SetValue(false, out reason);
  517. _doHome.SetValue(false, out reason);
  518. _doLoad.SetValue(true, out reason);
  519. return true;
  520. }
  521. public bool Init(out string reason)
  522. {
  523. reason = "";
  524. _doLoad.SetValue(false, out reason);
  525. _doUnload.SetValue(false, out reason);
  526. _doHome.SetValue(true, out reason);
  527. return true;
  528. }
  529. public bool Stop()
  530. {
  531. var reason = "";
  532. _doLoad.SetValue(false, out reason);
  533. _doUnload.SetValue(false, out reason);
  534. _doHome.SetValue(false, out reason);
  535. return true;
  536. }
  537. public void SetPauseResume(bool isPause)
  538. {
  539. IsPause = isPause;
  540. }
  541. }
  542. }