JetFlipper.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. using Aitex.Core.RT.IOCore;
  2. using Aitex.Core.RT.Log;
  3. using Aitex.Core.Util;
  4. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Flipper.FlipperBase;
  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 EFEM.RT.Devices.Flipper
  12. {
  13. public class JetFlipper : FlipperBase
  14. {
  15. private DIAccessor _diIsOrigin;//是否在原点
  16. private DIAccessor _diIsHorizontal;//是否在反面
  17. private DIAccessor _diIsTurnOK;//是否在旋转中
  18. private DIAccessor _diIsClampOK;//是否在Clamp中
  19. private DIAccessor _diTurnOverMotorAlarm;//无法旋转警告
  20. private DIAccessor _diEnableToRobot;//是否Robot可伸向
  21. private DIAccessor _diIsClampOpen;//是否开
  22. private DIAccessor _diIsClampClose;//是否关
  23. private DIAccessor _diClampMotorAlarm;//无法夹紧警告
  24. private DOAccessor _doTurnOverRunMode;//旋转模式 false是job模式(试点) true是program模式(工作模式)
  25. private DOAccessor _doTurnHome_START_STOP;//开始HOME 或 开始/停止动作 取决于Run Mode
  26. private DOAccessor _doTurnOverPositionA;//转到预设角度A
  27. private DOAccessor _doTurnOverPositionB;//转到预设角度B
  28. private DOAccessor _doTurnOverPositionC;//转到预设角度C
  29. private DOAccessor _doClampRunMode;//Clamp模式
  30. private DOAccessor _doClampHome_START_STOP;//Clamp到HOME 或 开始/停止动作
  31. private DOAccessor _doClampPositionA;//夹到预设位置A
  32. private DOAccessor _doClampPositionB;//夹到预设位置B
  33. private DOAccessor _doClampPositionC;//夹到预设位置C
  34. private DOAccessor _doClearClampAlarm;//清除clamp警告
  35. private DOAccessor _doClearTurnOverAlarm;//清除TurnOver警告
  36. private DOAccessor _doTurnOveJOGP;//TurnOver jog+
  37. private DOAccessor _doTurnOveJOGN;//TurnOver jog-
  38. private DOAccessor _doTurnOveJOG0;//TurnOver jog-JOG0
  39. private bool _NotFlipped => _diIsOrigin.Value && _diIsHorizontal.Value;
  40. private string _module;
  41. private FlipperState _state;
  42. private DeviceTimer _timer;
  43. private bool _targetClampON;
  44. private string jogNP;
  45. public override bool IsBusy => !_diIsTurnOK.Value || !_diIsClampOK.Value;//旋转且夹紧完成
  46. public override bool IsError => !_diClampMotorAlarm.Value || !_diTurnOverMotorAlarm.Value;
  47. public override bool IsReadyForRobot => _diEnableToRobot.Value;//是否Robot可以向Flipper取放
  48. public override bool IsClampOpen => _diIsClampOpen.Value;//是否打开
  49. public override bool IsClampClose => _diIsClampClose.Value;//是否打开
  50. public bool IsFlipperOrigin=> _diIsOrigin.Value && _diIsHorizontal.Value;//是否在原点
  51. public bool IsFlipperHorizontal => _diIsHorizontal.Value && !_diIsOrigin.Value;//是否在反面
  52. public override FlipperState State => _state;
  53. public R_TRIG _trigError = new R_TRIG();
  54. //flipper的业务主要分为3件事
  55. //clamp
  56. //TurnOver
  57. //Home/Initialize
  58. public JetFlipper(string module, XmlElement node, string ioModule = "")
  59. {
  60. base.Module = (string.IsNullOrEmpty(node.GetAttribute("module")) ? module : node.GetAttribute("module"));
  61. base.Name = node.GetAttribute("id");
  62. base.Display = node.GetAttribute("display");
  63. base.DeviceID = node.GetAttribute("schematicId");
  64. //Name = module.ToString();
  65. _module = module;
  66. _state = FlipperState.Init;
  67. _diIsOrigin = ParseDiNode("diFlipperTurnOverOriginSensor", node, ioModule);
  68. _diIsHorizontal = ParseDiNode("diFlipperTurnOverHorizontalSensor", node, ioModule);
  69. _diIsTurnOK = ParseDiNode("diFlipperTurnOverMotorPosCompleted", node, ioModule);
  70. _diTurnOverMotorAlarm = ParseDiNode("diFlipperTurnOverMotorAlarm", node, ioModule);
  71. _diEnableToRobot = ParseDiNode("diFlipperEnableToRobot", node, ioModule);
  72. _diIsClampClose = ParseDiNode("diFlipperClampClosedSensor", node, ioModule);
  73. _diIsClampOpen = ParseDiNode("diFlipperClampOpenedSensor", node, ioModule);
  74. _diIsClampOK = ParseDiNode("diFlipperClampMotorPosCompleted", node, ioModule);
  75. _diClampMotorAlarm = ParseDiNode("diFlipperClampMotorAlarm", node, ioModule);
  76. _doTurnOverRunMode = ParseDoNode("doFlipperTurnOverMotorModeSW", node, ioModule);
  77. _doClampRunMode = ParseDoNode("doFlipperClampMotorModeSW", node, ioModule);
  78. _doTurnHome_START_STOP = ParseDoNode("doFlipperTurnOverStartStop", node, ioModule);
  79. _doClampHome_START_STOP = ParseDoNode("doFlipperClampSTART-STOP", node, ioModule);
  80. _doTurnOverPositionA = ParseDoNode("doFlipperTurnOverSEL0", node, ioModule);
  81. _doTurnOverPositionB = ParseDoNode("doFlipperTurnOverSEL1", node, ioModule);
  82. _doTurnOverPositionC = ParseDoNode("doFlipperTurnOverSEL2", node, ioModule);
  83. _doClampPositionA = ParseDoNode("doFlipperClampSEL0", node, ioModule);
  84. _doClampPositionB = ParseDoNode("doFlipperClampSEL1", node, ioModule);
  85. _doClampPositionC = ParseDoNode("doFlipperClampSEL2", node, ioModule);
  86. _doClearClampAlarm = ParseDoNode("doFlipperClampPGMRES", node, ioModule);
  87. _doClearTurnOverAlarm = ParseDoNode("doFlipperTurnOverPgmres", node, ioModule);
  88. _doTurnOveJOGP= ParseDoNode("doFlipperTurnOverSEL0", node, ioModule);
  89. _doTurnOveJOGN = ParseDoNode("doFlipperTurnOverSEL1", node, ioModule);
  90. _doTurnOveJOG0= ParseDoNode("doFlipperTurnOverSEL2", node, ioModule);
  91. _timer = new DeviceTimer();
  92. }
  93. public override bool Home()
  94. {
  95. //在夹子关闭的状态下方可执行 否则在旋转过程中可能会导致wafer滑落
  96. //IO中已有interlock 是否拦两层?
  97. //整Home动作不能直接一个命令 应该分为两组 首先是闭合确认 然后是旋转home
  98. //LogObject.Error(_module.ToString(), $"flipper HOME:status = {_state}.");
  99. if (_state == FlipperState.Init || _state == FlipperState.Idle || _state == FlipperState.Error||_state==FlipperState.Gripping)
  100. {
  101. string reason = "";
  102. LOG.Info($"{_module.ToString()}: HOME Start.");
  103. _state = FlipperState.Homing;
  104. return true;
  105. //超时时间60s
  106. //_timer.Start(60000);
  107. }
  108. else
  109. {
  110. _trigError.CLK = true;
  111. _state = FlipperState.Error;
  112. LOG.Error($"{_module.ToString()}: HOME Failed:status = {_state}.");
  113. return false;
  114. }
  115. }
  116. public override void Monitor()
  117. {
  118. try
  119. {
  120. //超时就直接错误
  121. //if (_timer.IsTimeout())
  122. // _state = FlipperState.Error;
  123. switch (State)
  124. {
  125. case FlipperState.Gripping:
  126. if (IsClampClose)
  127. {
  128. _doClampRunMode.SetValue(false, out _);
  129. _doClampHome_START_STOP.SetValue(false, out _);
  130. _state = FlipperState.Idle;
  131. LOG.Info($"{_module.ToString()}: Grip over");
  132. }
  133. else
  134. {
  135. //_doClampHome_START_STOP.SetValue(true, out _);
  136. _doClampRunMode.SetValue(false, out _);
  137. _doClampHome_START_STOP.SetValue(true, out _);
  138. }
  139. break;
  140. case FlipperState.UnGripping:
  141. if (IsClampOpen)
  142. {
  143. _doClampRunMode.SetValue(false, out _);
  144. _doClampHome_START_STOP.SetValue(false, out _);
  145. _state = FlipperState.Idle;
  146. LOG.Info($"{_module.ToString()}: UnGrip over");
  147. }
  148. else
  149. {
  150. _doClampRunMode.SetValue(true, out _);
  151. _doClampHome_START_STOP.SetValue(true, out _);
  152. //_doClampPositionA.SetValue(true, out _);
  153. }
  154. break;
  155. case FlipperState.TurnOverJog:
  156. if (jogNP == "P")
  157. {
  158. _doTurnOveJOGP.SetValue(true, out _);
  159. }
  160. else { _doTurnOveJOGN.SetValue(true, out _); }
  161. break;
  162. case FlipperState.TurnOverJogStop:
  163. if (jogNP == "P")
  164. {
  165. _doTurnOveJOGP.SetValue(false, out _);
  166. }
  167. else {
  168. _doTurnOveJOGN.SetValue(false, out _);
  169. }
  170. _state = FlipperState.Idle;
  171. break;
  172. case FlipperState.Turning:
  173. if (_diIsHorizontal.Value && !_diIsOrigin.Value)
  174. {
  175. _doTurnOverRunMode.SetValue(false, out _);
  176. _doTurnHome_START_STOP.SetValue(false, out _);
  177. _state = FlipperState.Idle;
  178. }
  179. else
  180. {
  181. _doTurnOverRunMode.SetValue(true, out _);
  182. _doTurnHome_START_STOP.SetValue(true, out _);
  183. }
  184. break;
  185. case FlipperState.Homing:
  186. if (_diIsHorizontal.Value && _diIsOrigin.Value)
  187. {
  188. _doTurnOverRunMode.SetValue(false, out _);
  189. _doTurnHome_START_STOP.SetValue(false, out _);
  190. _state = FlipperState.Idle;
  191. }
  192. else
  193. {
  194. _doTurnOverRunMode.SetValue(false, out _);
  195. _doTurnHome_START_STOP.SetValue(true, out _);
  196. }
  197. break;
  198. case FlipperState.Idle:
  199. _doClampRunMode.SetValue(false, out _);
  200. _doClampHome_START_STOP?.SetValue(false, out _);
  201. _doTurnOverRunMode.SetValue(false, out _);
  202. _doTurnHome_START_STOP.SetValue(false, out _);
  203. break;
  204. default:
  205. break;
  206. }
  207. //如果是错误
  208. _trigError.CLK = State == FlipperState.Error;
  209. //DO_SafetytoFLP触发(待添加)
  210. if (_diIsHorizontal.Value && _diIsClampOpen.Value && _diEnableToRobot.Value)
  211. {
  212. //+ Safety to FLP sw interlock逻辑
  213. }
  214. }
  215. catch (Exception ex)
  216. {
  217. LOG.Error($"{_module.ToString()}: {ex}");
  218. }
  219. }
  220. public override bool TurnOver()
  221. {
  222. if (_state == FlipperState.Idle && IsClampClose)
  223. {
  224. if (_NotFlipped)
  225. _state = FlipperState.Turning;
  226. else
  227. _state = FlipperState.Homing;
  228. LOG.Info($"{_module.ToString()}: Turn over Start.");
  229. return true;
  230. //超时时间60s
  231. //_timer.Start(60000);
  232. }
  233. else
  234. {
  235. if (_state!= FlipperState.Idle)
  236. {
  237. LOG.Error($"{_module.ToString()}: Turn over failed. Status:{_state}");
  238. }
  239. if (!IsClampClose)
  240. {
  241. LOG.Error($"{_module.ToString()}: Turn over failed. Clamp is not close");
  242. }
  243. _trigError.CLK = true;
  244. _state = FlipperState.Error;
  245. return false;
  246. }
  247. }
  248. public override bool Clamp(bool ClampOn)
  249. {
  250. _targetClampON = ClampOn;
  251. if (_state == FlipperState.Idle || _state == FlipperState.Init)
  252. {
  253. //关闭
  254. if (ClampOn)
  255. {
  256. _state = FlipperState.Gripping;
  257. }
  258. //打开
  259. else
  260. {
  261. _state = FlipperState.UnGripping;
  262. }
  263. return true;
  264. }
  265. else
  266. {
  267. LOG.Error($"{_module.ToString()}: Clamp failed. Status:{_state}");
  268. return false;
  269. }
  270. }
  271. public bool TrunOverJog(string NorP)
  272. {
  273. LOG.Info($"{_module.ToString()}: TrunOverJog----" + NorP);
  274. jogNP = NorP;
  275. if (jogNP == "P")
  276. {
  277. _state = FlipperState.TurnOverJog;
  278. }
  279. else
  280. {
  281. _state = FlipperState.TurnOverJog;
  282. }
  283. return true;
  284. }
  285. public bool TrunOverJogStop(string NorP)
  286. {
  287. LOG.Info($"{_module.ToString()}: TrunOverJogStop----" + NorP);
  288. jogNP = NorP;
  289. if (jogNP == "P")
  290. {
  291. _state = FlipperState.TurnOverJogStop;
  292. }
  293. else
  294. {
  295. _state = FlipperState.TurnOverJogStop;
  296. }
  297. return true;
  298. }
  299. public override void Reset()
  300. {
  301. //错误条件下方可执行
  302. if (State == FlipperState.Error)
  303. {
  304. string error_reason;
  305. if (_doClearClampAlarm.SetValue(false, out error_reason) &&
  306. _doClearTurnOverAlarm.SetValue(false, out error_reason))
  307. {
  308. _trigError.RST = true;//清除错误
  309. _state = FlipperState.Idle;//可以直接出状态
  310. }
  311. else
  312. {
  313. LOG.Error($"{_module.ToString()}: Clear Error failed:{error_reason}");
  314. }
  315. }
  316. _state = FlipperState.Idle;
  317. }
  318. public override void ShowAction()
  319. {
  320. LOG.Info($"{_module.ToString()}: TurnOver Complete:{_diIsTurnOK.Value},Clamp Complete:{_diIsClampOK.Value}");
  321. }
  322. }
  323. }