JetFlipper.cs 15 KB

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