FIMS.TcPOU 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4024.12">
  3. <POU Name="FIMS" Id="{c49a8530-954d-4021-bf6f-7b9ddd515fb8}" SpecialFunc="None">
  4. <Declaration><![CDATA[FUNCTION_BLOCK FIMS
  5. VAR_INPUT
  6. TP_EN:BOOL;
  7. END_VAR
  8. VAR_OUTPUT
  9. END_VAR
  10. VAR
  11. PODManMode : BOOL ;
  12. FIMS1O2Status_b : BOOL ;
  13. FIMS1 : FIMSSequence ;
  14. FIMS1VacuumStatus_b : BOOL ;
  15. FIMS2 : FIMSSequence ;
  16. FIMS2VacuumStatus_b : BOOL ;
  17. FIMS1LoadCmd_b : BOOL ;
  18. FIMS1UnloadCmd_b : BOOL ;
  19. FIMS2LoadCmd_b : BOOL ;
  20. FIMS2UnloadCmd_b : BOOL ;
  21. FIMS1AlarmReset_b : BOOL ;
  22. FIMS2AlarmReset_b : BOOL ;
  23. FIMS1StopCmd_b : BOOL ;
  24. FIMS2StopCmd_b : BOOL ;
  25. FIMS1FoupCheck_b : BOOL ;
  26. FIMS2FoupCheck_b : BOOL ;
  27. FIMS1N2PurgeBypass_b : BOOL ;
  28. FIMS2N2PurgeBypass_b : BOOL ;
  29. MANUALBYPASS1 : BOOL ;
  30. MANUALBYPASS2 : BOOL ;
  31. TPHOST : R_TRIG ;
  32. LA_O2_Check_Done : BOOL ;
  33. FIMS1_O2_Check_Start : BOOL ;
  34. FIMS2_O2_Check_Start : BOOL ;
  35. FIMS1_O2_Check_Done : BOOL ;
  36. FIMS2_O2_Check_Done : BOOL ;
  37. UI_LA_O2_Check_First_EN : BOOL ;
  38. UI_FIMS1_O2_Check_EN : BOOL ;
  39. UI_FIMS2_O2_Check_EN : BOOL ;
  40. UI_N2_PURGE_PROCESS : BOOL ;
  41. UI_LA_O2_Over_Time : INT ;
  42. UI_LA_O2_Check_Time : INT ;
  43. UI_FOUP_O2_Over_Time : INT ;
  44. UI_FOUP_O2_Check_Time : INT ;
  45. UI_Exchange_LA_TO_FOUP_Wait_Time : INT ;
  46. UI_Exchange_FOUP_TO_LA_Wait_Time : INT ;
  47. UI_Exchange_FOUP_TO_FOUP_Wait_Time : INT ;
  48. UI_LA_O2_Check_SV : REAL ;
  49. UI_FOUP_O2_Check_SV : REAL ;
  50. TO_UI_LA_O2_Check_OT : BOOL ;
  51. TO_UI_FIMS1_O2_Check_OT : BOOL ;
  52. TO_UI_FIMS2_O2_Check_OT : BOOL ;
  53. LA_O2_Over_Time : TIME ;
  54. LA_O2_Check_Time : TIME ;
  55. FOUP_O2_Over_Time : TIME ;
  56. FOUP_O2_Check_Time : TIME ;
  57. Exchange_LA_TO_FOUP_Wait_Time : TIME ;
  58. Exchange_FOUP_TO_LA_Wait_Time : TIME ;
  59. Exchange_FOUP_TO_FOUP_Wait_Time : TIME ;
  60. LA_O2_Arrival_Timer : TON ;
  61. LA_O2_Check_Timer : TON ;
  62. LA_O2_Exchange_Wait : TON ;
  63. FIMS1_O2_Arrival_Timer : TON ;
  64. FIMS1_O2_Check_Timer : TON ;
  65. FIMS1_O2_Exchange_Wait : TON ;
  66. FIMS2_O2_Arrival_Timer : TON ;
  67. FIMS2_O2_Check_Timer : TON ;
  68. FIMS2_O2_Exchange_Wait : TON ;
  69. O2_Detect_STEP : INT ;
  70. N2_PURGE_PROCESS_Trig : R_TRIG ;
  71. N2_PURGE_UI_SV: INT;
  72. P_First_RunMode:BOOL;
  73. END_VAR
  74. ]]></Declaration>
  75. <Implementation>
  76. <ST><![CDATA[//FIMS控制切换 上位机/操作手柄
  77. IF NOT TP_EN AND GVL.FIMSManualSt.AutoOrManual_b THEN
  78. FIMS1LoadCmd_b := GVL.FIMSManualSt.FIMS1AutoLoadCmd_b ;
  79. FIMS1UnloadCmd_b := GVL.FIMSManualSt.FIMS1AutoUnloadCmd_b ;
  80. FIMS2LoadCmd_b := GVL.FIMSManualSt.FIMS2AutoLoadCmd_b ;
  81. FIMS2UnloadCmd_b := GVL.FIMSManualSt.FIMS2AutoUnloadCmd_b ;
  82. FIMS1AlarmReset_b := ( GVL.FIMSDI[0].LoadAlarm_b OR GVL.FIMSDI[0].UnloadAlarm_b ) AND GVL.FIMSManualSt.FIMSAlarmReset_b ;
  83. FIMS2AlarmReset_b := ( GVL.FIMSDI[1].LoadAlarm_b OR GVL.FIMSDI[1].UnloadAlarm_b ) AND GVL.FIMSManualSt.FIMSAlarmReset_b ;
  84. FIMS1StopCmd_b := GVL.FIMSManualSt.FIMS1Stop_b ;
  85. FIMS2StopCmd_b := GVL.FIMSManualSt.FIMS2Stop_b ;
  86. FIMS1FoupCheck_b := NDI.FIMS1_FOUP_exist OR GVL.FIMSManualSt.FIMS1FoupBypass_b ;
  87. FIMS2FoupCheck_b := NDI.FIMS2_FOUP_exist OR GVL.FIMSManualSt.FIMS2FoupBypass_b ;
  88. FIMS1N2PurgeBypass_b := NOT GVL.FIMSManualSt.FIMS1N2PurgeBypass_b ;
  89. FIMS2N2PurgeBypass_b := NOT GVL.FIMSManualSt.FIMS2N2PurgeBypass_b ;
  90. ELSIF TP_EN THEN
  91. FIMS1LoadCmd_b := GVL.FIMSDO[0].LoadCommand_b ;
  92. FIMS1UnloadCmd_b := GVL.FIMSDO[0].UnloadCommand_b ;
  93. FIMS2LoadCmd_b := GVL.FIMSDO[1].LoadCommand_b ;
  94. FIMS2UnloadCmd_b := GVL.FIMSDO[1].UnloadCommand_b ;
  95. FIMS1AlarmReset_b := GVL.FIMSDO[0].AlarmReset_b ;
  96. FIMS2AlarmReset_b := GVL.FIMSDO[1].AlarmReset_b ;
  97. FIMS1StopCmd_b := GVL.FIMSDO[0].Stop_b ;
  98. FIMS2StopCmd_b := GVL.FIMSDO[1].Stop_b ;
  99. FIMS1FoupCheck_b := MANUALBYPASS1 OR NDI.FIMS1_FOUP_exist ;
  100. FIMS2FoupCheck_b := MANUALBYPASS2 OR NDI.FIMS2_FOUP_exist ;
  101. FIMS1N2PurgeBypass_b := GVL.FIMSDO[0].N2PurgeBypass_b ;
  102. FIMS2N2PurgeBypass_b := GVL.FIMSDO[1].N2PurgeBypass_b ;
  103. END_IF;
  104. IF NOT P_First_RunMode OR TP_EN OR ( NOT TP_EN AND ( ANY_TO_UINT(AO.TPUINumber)<> 10#191 ) ) THEN
  105. GVL.FIMSManualSt.FIMS1LatchOff1_b := FALSE ;
  106. GVL.FIMSManualSt.FIMS1LatchOn1_b := FALSE ;
  107. GVL.FIMSManualSt.FIMS1LatchOff2_b := FALSE ;
  108. GVL.FIMSManualSt.FIMS1LatchOn2_b := FALSE ;
  109. GVL.FIMSManualSt.FIMS2LatchOff1_b := FALSE ;
  110. GVL.FIMSManualSt.FIMS2LatchOn1_b := FALSE ;
  111. GVL.FIMSManualSt.FIMS2LatchOff2_b := FALSE ;
  112. GVL.FIMSManualSt.FIMS2LatchOn2_b := FALSE ;
  113. GVL.FIMSManualSt.FIMS1Seal_b := FALSE ;
  114. GVL.FIMSManualSt.FIMS1Release_b := FALSE ;
  115. GVL.FIMSManualSt.FIMS2Seal_b := FALSE ;
  116. GVL.FIMSManualSt.FIMS2Release_b := FALSE ;
  117. GVL.FIMSManualSt.FIMS1DoorClose_b := FALSE ;
  118. GVL.FIMSManualSt.FIMS1DoorOpen_b := FALSE ;
  119. GVL.FIMSManualSt.FIMS2DoorClose_b := FALSE ;
  120. GVL.FIMSManualSt.FIMS2DoorOpen_b := FALSE ;
  121. GVL.FIMSManualSt.FIMS1AvoidanceDown_b := FALSE ;
  122. GVL.FIMSManualSt.FIMS1AvoidanceUp_b := FALSE ;
  123. GVL.FIMSManualSt.FIMS2AvoidanceDown_b := FALSE ;
  124. GVL.FIMSManualSt.FIMS2AvoidanceUp_b := FALSE ;
  125. GVL.FIMSManualSt.FIMS1Undock_b := FALSE ;
  126. GVL.FIMSManualSt.FIMS1Dock_b := FALSE ;
  127. GVL.FIMSManualSt.FIMS2Undock_b := FALSE ;
  128. GVL.FIMSManualSt.FIMS2Dock_b := FALSE ;
  129. GVL.FIMSManualSt.FIMS1VacuumClose_b := FALSE ;
  130. GVL.FIMSManualSt.FIMS1VacuumOpen_b := FALSE ;
  131. GVL.FIMSManualSt.FIMS2VacuumClose_b := FALSE ;
  132. GVL.FIMSManualSt.FIMS2VacuumOpen_b := FALSE ;
  133. P_First_RunMode:=TRUE;
  134. END_IF;
  135. //TP change mode from teach to host , reset all valve output
  136. TPHOST(Clk:=TP_EN(*, Q=>*));
  137. IF TPHOST.Q THEN
  138. GVL.FIMSValveAct.FIMS1VacuumClose_b := FALSE ;
  139. GVL.FIMSValveAct.FIMS1VacuumOpen_b := FALSE ;
  140. GVL.FIMSValveAct.FIMS2VacuumClose_b := FALSE ;
  141. GVL.FIMSValveAct.FIMS2VacuumOpen_b := FALSE ;
  142. GVL.FIMSValveAct.FIMS1LatchOff1_b := FALSE ;
  143. GVL.FIMSValveAct.FIMS1LatchOn1_b := FALSE ;
  144. GVL.FIMSValveAct.FIMS1LatchOff2_b := FALSE ;
  145. GVL.FIMSValveAct.FIMS1LatchOn2_b := FALSE ;
  146. GVL.FIMSValveAct.FIMS2LatchOff1_b := FALSE ;
  147. GVL.FIMSValveAct.FIMS2LatchOn1_b := FALSE ;
  148. GVL.FIMSValveAct.FIMS2LatchOff2_b := FALSE ;
  149. GVL.FIMSValveAct.FIMS2LatchOn2_b := FALSE ;
  150. GVL.FIMSValveAct.FIMS1Seal_b := FALSE ;
  151. GVL.FIMSValveAct.FIMS1Release_b := FALSE ;
  152. GVL.FIMSValveAct.FIMS2Seal_b := FALSE ;
  153. GVL.FIMSValveAct.FIMS2Release_b := FALSE ;
  154. GVL.FIMSValveAct.FIMS1DoorClose_b := FALSE ;
  155. GVL.FIMSValveAct.FIMS1DoorOpen_b := FALSE ;
  156. GVL.FIMSValveAct.FIMS2DoorClose_b := FALSE ;
  157. GVL.FIMSValveAct.FIMS2DoorOpen_b := FALSE ;
  158. GVL.FIMSValveAct.FIMS1AvoidanceDown_b := FALSE ;
  159. GVL.FIMSValveAct.FIMS1AvoidanceUp_b := FALSE ;
  160. GVL.FIMSValveAct.FIMS2AvoidanceDown_b := FALSE ;
  161. GVL.FIMSValveAct.FIMS2AvoidanceUp_b := FALSE ;
  162. GVL.FIMSValveAct.FIMS1Undock_b := FALSE ;
  163. GVL.FIMSValveAct.FIMS1Dock_b := FALSE ;
  164. //GVL.VTDO[9].Area3.BitData[6] := FALSE ;
  165. GVL.FIMSValveAct.FIMS2Dock_b := FALSE ;
  166. END_IF;
  167. //N2 PURGE
  168. IF NDO.Sys_LA_O2_Check_First_EN
  169. THEN
  170. UI_LA_O2_Check_First_EN:=TRUE;
  171. ELSE
  172. UI_LA_O2_Check_First_EN:=FALSE;
  173. END_IF;
  174. IF NDO.Sys_FIMS1_O2_Check_EN
  175. THEN
  176. UI_FIMS1_O2_Check_EN:=TRUE;
  177. ELSE
  178. UI_FIMS1_O2_Check_EN:=FALSE;
  179. END_IF;
  180. IF NDO.Sys_FIMS2_O2_Check_EN
  181. THEN
  182. UI_FIMS2_O2_Check_EN:=TRUE;
  183. ELSE
  184. UI_FIMS2_O2_Check_EN:=FALSE;
  185. END_IF;
  186. IF NDO.Sys_N2_PURGE_PROCESS
  187. THEN
  188. UI_N2_PURGE_PROCESS:=TRUE;
  189. ELSE
  190. UI_N2_PURGE_PROCESS:=FALSE;
  191. END_IF;
  192. IF TO_UI_LA_O2_Check_OT
  193. THEN
  194. NDI.ILK_LA_O2_Check_OT:=TRUE;
  195. ELSE
  196. NDI.ILK_LA_O2_Check_OT:=FALSE;
  197. END_IF;
  198. IF TO_UI_FIMS1_O2_Check_OT
  199. THEN
  200. NDI.ILK_FIMS1_O2_Check_OT:=TRUE;
  201. ELSE
  202. NDI.ILK_FIMS1_O2_Check_OT:=FALSE;
  203. END_IF;
  204. IF TO_UI_FIMS2_O2_Check_OT
  205. THEN
  206. NDI.ILK_FIMS2_O2_Check_OT:=TRUE;
  207. ELSE
  208. NDI.ILK_FIMS2_O2_Check_OT:=FALSE;
  209. END_IF;
  210. //UI 设定
  211. LA_O2_Over_Time:=REAL_TO_TIME(AO.UI_LA_O2_Over_Time);
  212. LA_O2_Check_Time:=REAL_TO_TIME(AO.UI_LA_O2_Check_Time);
  213. FOUP_O2_Over_Time:=REAL_TO_TIME(AO.UI_FOUP_O2_Over_Time);
  214. FOUP_O2_Check_Time:=REAL_TO_TIME(AO.UI_FOUP_O2_Check_Time);
  215. Exchange_LA_TO_FOUP_Wait_Time:=REAL_TO_TIME(AO.UI_Exchange_LA_TO_FOUP_Wait_Time);
  216. Exchange_FOUP_TO_LA_Wait_Time:=REAL_TO_TIME(AO.UI_Exchange_FOUP_TO_LA_Wait_Time);
  217. Exchange_FOUP_TO_FOUP_Wait_Time:=REAL_TO_TIME(AO.UI_Exchange_FOUP_TO_FOUP_Wait_Time);
  218. UI_LA_O2_Check_SV:=AO.UI_LA_O2_Check_SV;
  219. UI_FOUP_O2_Check_SV:=AO.UI_FOUP_O2_Check_SV;
  220. //O2 DETECT
  221. IF NOT NDI.FIMS1_FOUP_exist THEN FIMS1_O2_Check_Done:=FALSE;END_IF; //FOUP1不在位, FIMS1 O2 check done复位
  222. IF NOT NDI.FIMS2_FOUP_exist THEN FIMS2_O2_Check_Done:=FALSE;END_IF; //FOUP2不在位, FIMS2 O2 check done复位
  223. IF NOT UI_N2_PURGE_PROCESS //N2 PURGE过程结束, 所有O2 check done 复位
  224. THEN
  225. LA_O2_Check_Done:=FALSE;
  226. FIMS1_O2_Check_Done:=FALSE;
  227. FIMS2_O2_Check_Done:=FALSE;
  228. END_IF;
  229. N2_PURGE_PROCESS_Trig(Clk:=UI_N2_PURGE_PROCESS);
  230. IF N2_PURGE_PROCESS_Trig.Q //N2 PURGE流程开始,初始化
  231. THEN
  232. O2_Detect_STEP:=0;
  233. TO_UI_LA_O2_Check_OT:=FALSE;
  234. TO_UI_FIMS1_O2_Check_OT:=FALSE;
  235. TO_UI_FIMS2_O2_Check_OT:=FALSE;
  236. END_IF;
  237. IF UI_N2_PURGE_PROCESS THEN
  238. CASE O2_Detect_STEP OF
  239. 0:
  240. IF UI_LA_O2_Check_First_EN AND NOT LA_O2_Check_Done
  241. THEN O2_Detect_STEP:=10;
  242. ELSE
  243. O2_Detect_STEP:=1;
  244. END_IF;
  245. 1:
  246. IF UI_FIMS1_O2_Check_EN AND NOT FIMS1_O2_Check_Done
  247. THEN
  248. O2_Detect_STEP:=20;
  249. ELSIF
  250. UI_FIMS2_O2_Check_EN AND NOT FIMS2_O2_Check_Done
  251. THEN
  252. O2_Detect_STEP:=30;
  253. ELSIF
  254. NOT LA_O2_Check_Done
  255. THEN
  256. O2_Detect_STEP:=10;
  257. ELSE
  258. O2_Detect_STEP:=0;
  259. END_IF;
  260. //LA
  261. 10://判断
  262. IF NDO.POD1_exhaust_switch_open=TRUE
  263. THEN
  264. NDO.POD1_exhaust_switch_open:=FALSE;
  265. LA_O2_Exchange_Wait.In:=TRUE;
  266. LA_O2_Exchange_Wait.PT:=Exchange_FOUP_TO_LA_Wait_Time;
  267. O2_Detect_STEP:=11;
  268. ELSE
  269. O2_Detect_STEP:=12;
  270. END_IF;
  271. 11://阀切换等待
  272. LA_O2_Exchange_Wait();
  273. IF LA_O2_Exchange_Wait.Q
  274. THEN
  275. LA_O2_Exchange_Wait.In:=FALSE;
  276. O2_Detect_STEP:=12;
  277. END_IF;
  278. 12:
  279. LA_O2_Arrival_Timer.In:=TRUE;
  280. LA_O2_Arrival_Timer.PT:=LA_O2_Over_Time;
  281. LA_O2_Check_Timer.In:=TRUE;
  282. LA_O2_Check_Timer.PT:=LA_O2_Check_Time;
  283. O2_Detect_STEP:=13;
  284. 13://O2 DETECT确认及超时时间
  285. LA_O2_Arrival_Timer();
  286. LA_O2_Check_Timer();
  287. IF LA_O2_Arrival_Timer.Q
  288. THEN
  289. TO_UI_LA_O2_Check_OT:=TRUE;
  290. END_IF;
  291. IF LA_O2_Check_Timer.Q AND GVL.O2.ActValPV_Real<=UI_LA_O2_Check_SV
  292. THEN
  293. LA_O2_Check_Done:=TRUE;
  294. LA_O2_Check_Timer.In:=FALSE;
  295. LA_O2_Arrival_Timer.In:=FALSE;
  296. O2_Detect_STEP:=0;
  297. END_IF;
  298. //FIMS1
  299. 20://判断
  300. IF NDO.POD1_exhaust_switch_open=TRUE AND NDO.POD2_exhaust_switch_open=FALSE //AV61开,AV62关
  301. THEN
  302. O2_Detect_STEP:=22;
  303. END_IF;
  304. IF NDO.POD1_exhaust_switch_open=FALSE AND NDO.POD2_exhaust_switch_open=FALSE //AV61关,AV62关
  305. THEN
  306. NDO.POD1_exhaust_switch_open:=TRUE;
  307. FIMS1_O2_Exchange_Wait.In:=TRUE;
  308. FIMS1_O2_Exchange_Wait.PT:=Exchange_LA_TO_FOUP_Wait_Time;
  309. O2_Detect_STEP:=21;
  310. END_IF;
  311. IF NDO.POD1_exhaust_switch_open=FALSE AND NDO.POD2_exhaust_switch_open=TRUE //AV61关,AV62开
  312. THEN
  313. NDO.POD1_exhaust_switch_open:=TRUE;
  314. NDO.POD2_exhaust_switch_open:=FALSE;
  315. FIMS1_O2_Exchange_Wait.In:=TRUE;
  316. IF Exchange_LA_TO_FOUP_Wait_Time>Exchange_FOUP_TO_FOUP_Wait_Time //时间选择较长者
  317. THEN
  318. FIMS1_O2_Exchange_Wait.PT:=Exchange_LA_TO_FOUP_Wait_Time;
  319. ELSE
  320. FIMS1_O2_Exchange_Wait.PT:=Exchange_FOUP_TO_FOUP_Wait_Time;
  321. END_IF;
  322. O2_Detect_STEP:=21;
  323. END_IF;
  324. IF NDO.POD1_exhaust_switch_open=TRUE AND NDO.POD2_exhaust_switch_open=TRUE //AV61开,AV62开
  325. THEN
  326. NDO.POD2_exhaust_switch_open:=FALSE;
  327. FIMS1_O2_Exchange_Wait.In:=TRUE;
  328. FIMS1_O2_Exchange_Wait.PT:=Exchange_FOUP_TO_FOUP_Wait_Time;
  329. O2_Detect_STEP:=21;
  330. END_IF;
  331. 21://阀切换等待
  332. FIMS1_O2_Exchange_Wait();
  333. IF FIMS1_O2_Exchange_Wait.Q
  334. THEN
  335. FIMS1_O2_Exchange_Wait.In:=FALSE;
  336. O2_Detect_STEP:=22;
  337. END_IF;
  338. 22://O2 CHECK START
  339. IF FIMS1_O2_Check_Start
  340. THEN
  341. FIMS1_O2_Arrival_Timer.In:=TRUE;
  342. FIMS1_O2_Arrival_Timer.PT:=FOUP_O2_Over_Time;
  343. FIMS1_O2_Check_Timer.In:=TRUE;
  344. FIMS1_O2_Check_Timer.PT:=FOUP_O2_Check_Time;
  345. O2_Detect_STEP:=23;
  346. END_IF;
  347. 23://O2 DETECT确认及超时时间
  348. FIMS1_O2_Arrival_Timer();
  349. FIMS1_O2_Check_Timer();
  350. IF FIMS1_O2_Arrival_Timer.Q
  351. THEN
  352. TO_UI_FIMS1_O2_Check_OT:=TRUE;
  353. END_IF;
  354. IF FIMS1_O2_Check_Timer.Q AND GVL.O2.ActValPV_Real<=UI_FOUP_O2_Check_SV
  355. THEN
  356. FIMS1_O2_Check_Done:=TRUE;
  357. FIMS1_O2_Check_Timer.In:=FALSE;
  358. FIMS1_O2_Arrival_Timer.In:=FALSE;
  359. O2_Detect_STEP:=0;
  360. END_IF;
  361. //FIMS2
  362. 30://判断
  363. IF NDO.POD1_exhaust_switch_open=TRUE AND NDO.POD2_exhaust_switch_open=TRUE //AV61开,AV62开
  364. THEN
  365. O2_Detect_STEP:=32;
  366. END_IF;
  367. IF NDO.POD1_exhaust_switch_open=FALSE AND NDO.POD2_exhaust_switch_open=TRUE //AV61关,AV62开
  368. THEN
  369. NDO.POD1_exhaust_switch_open:=TRUE;
  370. FIMS2_O2_Exchange_Wait.In:=TRUE;
  371. FIMS2_O2_Exchange_Wait.PT:=Exchange_LA_TO_FOUP_Wait_Time;
  372. O2_Detect_STEP:=31;
  373. END_IF;
  374. IF NDO.POD1_exhaust_switch_open=FALSE AND NDO.POD2_exhaust_switch_open=FALSE //AV61关,AV62关
  375. THEN
  376. NDO.POD1_exhaust_switch_open:=TRUE;
  377. NDO.POD2_exhaust_switch_open:=TRUE;
  378. FIMS2_O2_Exchange_Wait.In:=TRUE;
  379. IF Exchange_LA_TO_FOUP_Wait_Time>Exchange_FOUP_TO_FOUP_Wait_Time //时间选择较长者
  380. THEN
  381. FIMS2_O2_Exchange_Wait.PT:=Exchange_LA_TO_FOUP_Wait_Time;
  382. ELSE
  383. FIMS2_O2_Exchange_Wait.PT:=Exchange_FOUP_TO_FOUP_Wait_Time;
  384. END_IF;
  385. O2_Detect_STEP:=31;
  386. END_IF;
  387. IF NDO.POD1_exhaust_switch_open=TRUE AND NDO.POD2_exhaust_switch_open=FALSE //AV61开,AV62关
  388. THEN
  389. NDO.POD2_exhaust_switch_open:=TRUE;
  390. FIMS2_O2_Exchange_Wait.In:=TRUE;
  391. FIMS2_O2_Exchange_Wait.PT:=Exchange_FOUP_TO_FOUP_Wait_Time;
  392. O2_Detect_STEP:=31;
  393. END_IF;
  394. 31://阀切换等待
  395. FIMS2_O2_Exchange_Wait();
  396. IF FIMS2_O2_Exchange_Wait.Q
  397. THEN
  398. FIMS2_O2_Exchange_Wait.In:=FALSE;
  399. O2_Detect_STEP:=32;
  400. END_IF;
  401. 32://O2 CHECK START
  402. IF FIMS2_O2_Check_Start
  403. THEN
  404. FIMS2_O2_Arrival_Timer.In:=TRUE;
  405. FIMS2_O2_Arrival_Timer.PT:=FOUP_O2_Over_Time;
  406. FIMS2_O2_Check_Timer.In:=TRUE;
  407. FIMS2_O2_Check_Timer.PT:=FOUP_O2_Check_Time;
  408. O2_Detect_STEP:=33;
  409. END_IF;
  410. 33://O2 DETECT确认及超时时间
  411. FIMS2_O2_Arrival_Timer();
  412. FIMS2_O2_Check_Timer();
  413. IF FIMS2_O2_Arrival_Timer.Q
  414. THEN
  415. TO_UI_FIMS2_O2_Check_OT:=TRUE;
  416. END_IF;
  417. IF FIMS2_O2_Check_Timer.Q AND GVL.O2.ActValPV_Real<=UI_FOUP_O2_Check_SV
  418. THEN
  419. FIMS2_O2_Check_Done:=TRUE;
  420. FIMS2_O2_Check_Timer.In:=FALSE;
  421. FIMS2_O2_Arrival_Timer.In:=FALSE;
  422. O2_Detect_STEP:=0;
  423. END_IF;
  424. END_CASE;
  425. END_IF;
  426. //FIMS1
  427. FIMS1(
  428. Enable:= (TP_EN AND (FIMS1LoadCmd_b OR FIMS1UnloadCmd_b)) OR (NOT TP_EN AND GVL.FIMSManualSt.AutoOrManual_b),
  429. StopCmd_In_b:= FIMS1StopCmd_b,
  430. LoadCmd_In_b:= FIMS1LoadCmd_b,
  431. UnloadCmd_In_b:= FIMS1UnloadCmd_b,
  432. Open_Close_Cmd_In_b:= 0,
  433. Open_Close_Count:= 0,
  434. PodSeqAlmRst_In_b:= FIMS1AlarmReset_b,
  435. N2PurgeBypassEN_In_b:= FIMS1N2PurgeBypass_b,
  436. FoupInPodPos_In_b:= FIMS1FoupCheck_b,
  437. FoupInRetractPos_In_b:= NDI.FIMS1_FOUP_undock,
  438. FoupInExtendPos_In_b:= NDI.FIMS1_FOUP_dock,
  439. FoupInSealPos_In_b:= NDI.FIMS1_seal,
  440. FoupInRlsPos_In_b:= NDI.FIMS1_release,
  441. FoupLatchOnPos_In_b:= NDI.FIMS1_FOUP_latch_on,
  442. FoupLatchOffPos_In_b:= NDI.FIMS1_FOUP_latch_off,
  443. PodVacStatus_In_b:= NDI.FIMS1_FOUP_negative_Pressure,
  444. PodVacATM_In_b:= NDI.FIMS1_FOUP_ordinary_Pressure,
  445. O2Check_EN:= UI_FIMS1_O2_Check_EN,
  446. O2Check_Done_In_b:= FIMS1_O2_Check_Done,
  447. PodDrXaxisAvoidInUpPos_In_b:= NDI.FIMS1_collision_avoidance_up,
  448. PodDrXaxisAvoidInDnPos_In_b:= NDI.FIMS1_collision_avoidance_down,
  449. PodDrYClsPos_In_b:= NDI.FIMS1_door_close,
  450. PodDrYOpPos_In_b:= NDI.FIMS1_door_open,
  451. N2PurgeValOpPos_In_b:= NDI.FIMS1_exhaust_open_position,
  452. N2PurgeValClPos_In_b:= NDI.FIMS1_exhaust_close_position,
  453. EnableOutput=> ,
  454. LoadOTAlm_Out_b=> GVL.FIMSDI[0].LoadAlarm_b,
  455. UnloadOTAlm_Out_b=> GVL.FIMSDI[0].UnloadAlarm_b,
  456. PodLoadDone_Out_b=> GVL.FIMSDI[0].LoadComplete_b,
  457. PodUnloadDone_Out_b=> GVL.FIMSDI[0].UnloadComplete_b,
  458. PodRunning_Out_b=> GVL.FIMSDI[0].Running_b,
  459. PodRetractVal_Out_b=> GVL.FIMSValveAct.FIMS1Undock_b,
  460. PodExtendVal_Out_b=> GVL.FIMSValveAct.FIMS1Dock_b,
  461. PodVacOpVal_Out_b=> GVL.FIMSValveAct.FIMS1VacuumOpen_b,
  462. PodVacClsVal_Out_b=> GVL.FIMSValveAct.FIMS1VacuumClose_b,
  463. PodFoupLatchOffVal_Out_b=> GVL.FIMSValveAct.FIMS1LatchOff1_b,
  464. PodFoupLatchonVal_Out_b=> GVL.FIMSValveAct.FIMS1LatchOn1_b,
  465. PodSealVal_Out_b=> GVL.FIMSValveAct.FIMS1Seal_b,
  466. PodRealseVal_Out_b=> GVL.FIMSValveAct.FIMS1Release_b,
  467. N2PurgePodOpVal_Out_b=> ,
  468. N2PurgePodClsVal_Out_b=> ,
  469. O2CheckVal_Out_b=> FIMS1_O2_Check_Start,
  470. PodDrXaxisAvoidOpVal_Out_b=> GVL.FIMSValveAct.FIMS1AvoidanceUp_b,
  471. PodDrXaxisAvoidClsVal_Out_b=> GVL.FIMSValveAct.FIMS1AvoidanceDown_b,
  472. PodDrYOpVal_Out_b=> GVL.FIMSValveAct.FIMS1DoorOpen_b,
  473. PodDrYClsVal_Out_b=> GVL.FIMSValveAct.FIMS1DoorClose_b);
  474. IF TP_EN THEN
  475. GVL.FIMSValveAct.FIMS1LatchOff2_b := GVL.FIMSValveAct.FIMS1LatchOff1_b ;
  476. GVL.FIMSValveAct.FIMS1LatchOn2_b := GVL.FIMSValveAct.FIMS1LatchOn1_b ;
  477. END_IF;
  478. //FIMS2
  479. FIMS2(
  480. Enable:= (TP_EN AND (FIMS2LoadCmd_b OR FIMS2UnloadCmd_b)) OR (NOT TP_EN AND GVL.FIMSManualSt.AutoOrManual_b),
  481. StopCmd_In_b:= FIMS2StopCmd_b,
  482. LoadCmd_In_b:= FIMS2LoadCmd_b,
  483. UnloadCmd_In_b:= FIMS2UnloadCmd_b,
  484. Open_Close_Cmd_In_b:= 0,
  485. Open_Close_Count:= 0,
  486. PodSeqAlmRst_In_b:= FIMS2AlarmReset_b,
  487. N2PurgeBypassEN_In_b:= FIMS2N2PurgeBypass_b,
  488. FoupInPodPos_In_b:= FIMS2FoupCheck_b,
  489. FoupInRetractPos_In_b:= NDI.FIMS2_FOUP_undock,
  490. FoupInExtendPos_In_b:= NDI.FIMS2_FOUP_dock,
  491. FoupInSealPos_In_b:= NDI.FIMS2_seal,
  492. FoupInRlsPos_In_b:= NDI.FIMS2_release,
  493. FoupLatchOnPos_In_b:= NDI.FIMS2_FOUP_latch_on,
  494. FoupLatchOffPos_In_b:= NDI.FIMS2_FOUP_latch_off,
  495. PodVacStatus_In_b:= NDI.FIMS2_FOUP_negative_Pressure,
  496. PodVacATM_In_b:= NDI.FIMS2_FOUP_ordinary_Pressure,
  497. O2Check_EN:= UI_FIMS2_O2_Check_EN,
  498. O2Check_Done_In_b:= FIMS2_O2_Check_Done,
  499. PodDrXaxisAvoidInUpPos_In_b:= NDI.FIMS2_collision_avoidance_up,
  500. PodDrXaxisAvoidInDnPos_In_b:= NDI.FIMS2_collision_avoidance_down,
  501. PodDrYClsPos_In_b:= NDI.FIMS2_door_close,
  502. PodDrYOpPos_In_b:= NDI.FIMS2_door_open,
  503. N2PurgeValOpPos_In_b:= NDI.FIMS2_exhaust_open_position,
  504. N2PurgeValClPos_In_b:= NDI.FIMS2_exhaust_close_position,
  505. EnableOutput=> ,
  506. LoadOTAlm_Out_b=> GVL.FIMSDI[0].LoadAlarm_b,
  507. UnloadOTAlm_Out_b=> GVL.FIMSDI[0].UnloadAlarm_b,
  508. PodLoadDone_Out_b=> GVL.FIMSDI[0].LoadComplete_b,
  509. PodUnloadDone_Out_b=> GVL.FIMSDI[0].UnloadComplete_b,
  510. PodRunning_Out_b=> GVL.FIMSDI[0].Running_b,
  511. PodRetractVal_Out_b=> GVL.FIMSValveAct.FIMS2Undock_b,
  512. PodExtendVal_Out_b=> GVL.FIMSValveAct.FIMS2Dock_b,
  513. PodVacOpVal_Out_b=> GVL.FIMSValveAct.FIMS2VacuumOpen_b,
  514. PodVacClsVal_Out_b=> GVL.FIMSValveAct.FIMS2VacuumClose_b,
  515. PodFoupLatchOffVal_Out_b=> GVL.FIMSValveAct.FIMS2LatchOff1_b,
  516. PodFoupLatchonVal_Out_b=> GVL.FIMSValveAct.FIMS2LatchOn1_b,
  517. PodSealVal_Out_b=> GVL.FIMSValveAct.FIMS2Seal_b,
  518. PodRealseVal_Out_b=> GVL.FIMSValveAct.FIMS2Release_b,
  519. N2PurgePodOpVal_Out_b=> ,
  520. N2PurgePodClsVal_Out_b=> ,
  521. O2CheckVal_Out_b=> FIMS2_O2_Check_Start,
  522. PodDrXaxisAvoidOpVal_Out_b=> GVL.FIMSValveAct.FIMS2AvoidanceUp_b,
  523. PodDrXaxisAvoidClsVal_Out_b=> GVL.FIMSValveAct.FIMS2AvoidanceDown_b,
  524. PodDrYOpVal_Out_b=> GVL.FIMSValveAct.FIMS2DoorOpen_b,
  525. PodDrYClsVal_Out_b=> GVL.FIMSValveAct.FIMS2DoorClose_b);
  526. IF TP_EN THEN
  527. GVL.FIMSValveAct.FIMS2LatchOff2_b := GVL.FIMSValveAct.FIMS2LatchOff1_b ;
  528. GVL.FIMSValveAct.FIMS2LatchOn2_b := GVL.FIMSValveAct.FIMS2LatchOn1_b ;
  529. END_IF;
  530. //????
  531. IF NOT TP_EN AND NOT GVL.FIMSManualSt.AutoOrManual_b THEN
  532. GVL.FIMSValveAct.FIMS1LatchOff1_b := GVL.FIMSManualSt.FIMS1LatchOff1_b ;
  533. GVL.FIMSValveAct.FIMS1LatchOn1_b := GVL.FIMSManualSt.FIMS1LatchOn1_b ;
  534. GVL.FIMSValveAct.FIMS1LatchOff2_b := GVL.FIMSManualSt.FIMS1LatchOff2_b ;
  535. GVL.FIMSValveAct.FIMS1LatchOn2_b := GVL.FIMSManualSt.FIMS1LatchOn2_b ;
  536. GVL.FIMSValveAct.FIMS2LatchOff1_b := GVL.FIMSManualSt.FIMS2LatchOff1_b ;
  537. GVL.FIMSValveAct.FIMS2LatchOn1_b := GVL.FIMSManualSt.FIMS2LatchOn1_b ;
  538. GVL.FIMSValveAct.FIMS2LatchOff2_b := GVL.FIMSManualSt.FIMS2LatchOff2_b ;
  539. GVL.FIMSValveAct.FIMS2LatchOn2_b := GVL.FIMSManualSt.FIMS2LatchOn2_b ;
  540. GVL.FIMSValveAct.FIMS1Seal_b := GVL.FIMSManualSt.FIMS1Seal_b ;
  541. GVL.FIMSValveAct.FIMS1Release_b := GVL.FIMSManualSt.FIMS1Release_b ;
  542. GVL.FIMSValveAct.FIMS2Seal_b := GVL.FIMSManualSt.FIMS2Seal_b ;
  543. GVL.FIMSValveAct.FIMS2Release_b := GVL.FIMSManualSt.FIMS2Release_b ;
  544. GVL.FIMSValveAct.FIMS1DoorClose_b := GVL.FIMSManualSt.FIMS1DoorClose_b ;
  545. GVL.FIMSValveAct.FIMS1DoorOpen_b := GVL.FIMSManualSt.FIMS1DoorOpen_b ;
  546. GVL.FIMSValveAct.FIMS2DoorClose_b := GVL.FIMSManualSt.FIMS2DoorClose_b ;
  547. GVL.FIMSValveAct.FIMS2DoorOpen_b := GVL.FIMSManualSt.FIMS2DoorOpen_b ;
  548. GVL.FIMSValveAct.FIMS1AvoidanceDown_b := GVL.FIMSManualSt.FIMS1AvoidanceDown_b ;
  549. GVL.FIMSValveAct.FIMS1AvoidanceUp_b := GVL.FIMSManualSt.FIMS1AvoidanceUp_b ;
  550. GVL.FIMSValveAct.FIMS2AvoidanceDown_b := GVL.FIMSManualSt.FIMS2AvoidanceDown_b ;
  551. GVL.FIMSValveAct.FIMS2AvoidanceUp_b := GVL.FIMSManualSt.FIMS2AvoidanceUp_b ;
  552. GVL.FIMSValveAct.FIMS1Undock_b := GVL.FIMSManualSt.FIMS1Undock_b ;
  553. GVL.FIMSValveAct.FIMS1Dock_b := GVL.FIMSManualSt.FIMS1Dock_b ;
  554. GVL.FIMSValveAct.FIMS2Undock_b := GVL.FIMSManualSt.FIMS2Undock_b ;
  555. GVL.FIMSValveAct.FIMS2Dock_b := GVL.FIMSManualSt.FIMS2Dock_b ;
  556. GVL.FIMSValveAct.FIMS1VacuumClose_b := GVL.FIMSManualSt.FIMS1VacuumClose_b ;
  557. GVL.FIMSValveAct.FIMS1VacuumOpen_b := GVL.FIMSManualSt.FIMS1VacuumOpen_b ;
  558. GVL.FIMSValveAct.FIMS2VacuumClose_b := GVL.FIMSManualSt.FIMS2VacuumClose_b ;
  559. GVL.FIMSValveAct.FIMS2VacuumOpen_b := GVL.FIMSManualSt.FIMS2VacuumOpen_b ;
  560. END_IF;
  561. ]]></ST>
  562. </Implementation>
  563. <LineIds Name="FIMS">
  564. <LineId Id="802" Count="59" />
  565. <LineId Id="1535" Count="1" />
  566. <LineId Id="862" Count="1" />
  567. <LineId Id="1607" Count="0" />
  568. <LineId Id="864" Count="33" />
  569. <LineId Id="901" Count="82" />
  570. <LineId Id="1608" Count="0" />
  571. <LineId Id="984" Count="351" />
  572. <LineId Id="1460" Count="1" />
  573. <LineId Id="275" Count="0" />
  574. </LineIds>
  575. </POU>
  576. </TcPlcObject>