JetMessageHandler.cs 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. using Aitex.Core.RT.Event;
  2. using Aitex.Core.RT.Log;
  3. using Aitex.Core.Util;
  4. using MECF.Framework.Common.Equipment;
  5. using CyberX8_Core;
  6. using CyberX8_RT.Devices.YASKAWA;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Linq;
  10. using System.Runtime.Remoting.Contexts;
  11. using System.Text;
  12. using System.Text.RegularExpressions;
  13. using System.Threading.Tasks;
  14. namespace CyberX8_RT.Devices.EFEM
  15. {
  16. public class JetMessageHandler : Singleton<JetMessageHandler>, IEfemMessageHander
  17. {
  18. private const string ERROR_MSG = "hardware message invalid";
  19. public EfemMessage ToMessage(string context)
  20. {
  21. if (string.IsNullOrEmpty(context) || context.Length < 3)
  22. throw new ArgumentNullException(ERROR_MSG);
  23. EfemMessage msg = new EfemMessage { RawString = context, Direct = MsgDirection.From, Data = new List<string>() };
  24. // remove EOT
  25. string messageBody = context.Substring(0, context.IndexOf(EfemMessage.EOF) + 1);
  26. try
  27. {
  28. // split up the string
  29. string[] sBodies = messageBody.Split(Constant.delimiters);
  30. string sHead = sBodies[0];
  31. string sBasic = sBodies[1];
  32. string sPort = sBodies[2];
  33. // Head
  34. if (Enum.TryParse(sHead, true, out EfemMessage.MsgHead msgHead))
  35. {
  36. msg.Head = msgHead;
  37. }
  38. switch (msg.Head)
  39. {
  40. case EfemMessage.MsgHead.ACK:
  41. case EfemMessage.MsgHead.MOV:
  42. case EfemMessage.MsgHead.INF:
  43. case EfemMessage.MsgHead.EVT:
  44. // Basic
  45. msg.Operation = EfemConstant.ToOperation(sBasic);
  46. // Port
  47. if (Regex.IsMatch(sPort, @"P[123]$"))
  48. {
  49. msg.Module = sPort.ToModule();
  50. }
  51. else if (Regex.IsMatch(sPort, @"ALIGN\d?", RegexOptions.IgnoreCase))
  52. {
  53. msg.Module = sPort.ToModule();
  54. }
  55. else
  56. {
  57. msg.Module = ModuleName.EFEM;
  58. }
  59. // Data
  60. switch (msg.Operation)
  61. {
  62. case EfemOperation.StateTrack:
  63. case EfemOperation.GetWaferInfo:
  64. msg.Data.Add(sBodies[3]);
  65. break;
  66. case EfemOperation.CarrierId:
  67. msg.Data.Add(msg.RawString.Substring("INF:CSTID/P1/".Length));
  68. break;
  69. case EfemOperation.SigStatus:
  70. msg.Data.Add(sBodies[2]);
  71. msg.Data.Add(sBodies[3]);
  72. msg.Data.Add(sBodies[4]);
  73. break;
  74. case EfemOperation.Ready:
  75. msg.Data.Add(sBodies[2]);
  76. break;
  77. default:
  78. break;
  79. }
  80. break;
  81. case EfemMessage.MsgHead.NAK:
  82. msg.Operation = EfemConstant.ToOperation(sBasic);
  83. // Port
  84. if (Regex.IsMatch(sPort, @"P[123]$"))
  85. {
  86. msg.Module = sPort.ToModule();
  87. }
  88. else if (Regex.IsMatch(sPort, @"ALIGN\d?", RegexOptions.IgnoreCase))
  89. {
  90. msg.Module = sPort.ToModule();
  91. }
  92. else
  93. {
  94. msg.Module = ModuleName.EFEM;
  95. }
  96. msg.Factor = sBodies[1];
  97. msg.Data.Add(sBodies[2]);
  98. msg.Operation = EfemConstant.ToOperation(sBasic);
  99. break;
  100. case EfemMessage.MsgHead.CAN:
  101. msg.Operation = EfemConstant.ToOperation(sBasic);
  102. // Port
  103. if (Regex.IsMatch(sPort, @"P[123]$"))
  104. {
  105. msg.Module = sPort.ToModule();
  106. }
  107. else if (Regex.IsMatch(sPort, @"ALIGN\d?", RegexOptions.IgnoreCase))
  108. {
  109. msg.Module = sPort.ToModule();
  110. }
  111. else
  112. {
  113. msg.Module = ModuleName.EFEM;
  114. }
  115. // CAN:ERROR/CLEAR;
  116. int a1 = messageBody.IndexOf(':');
  117. int a3 = messageBody.IndexOf(';');
  118. int a2 = messageBody.IndexOf('|');
  119. if (a2 > 0)
  120. {
  121. msg.Data.Add(messageBody.Substring(a1 + 1, a2 - a1 - 1));
  122. msg.Factor = messageBody.Substring(a2 + 1, a3 - a2 - 1);
  123. }
  124. else
  125. {
  126. int a8 = messageBody.IndexOf('/');
  127. msg.Factor = sBodies[2];
  128. }
  129. break;
  130. case EfemMessage.MsgHead.ABS:
  131. msg.Operation = EfemConstant.ToOperation(sBasic);
  132. // Port
  133. if (Regex.IsMatch(sPort, @"P[123]$"))
  134. {
  135. msg.Module = sPort.ToModule();
  136. }
  137. else if (Regex.IsMatch(sPort, @"ALIGN\d?", RegexOptions.IgnoreCase))
  138. {
  139. msg.Module = sPort.ToModule();
  140. }
  141. else
  142. {
  143. msg.Module = ModuleName.EFEM;
  144. }
  145. // ABS:INIT/ALL|ERROR/SYSTEM_FF10/UNDEFINITION;
  146. int a4 = messageBody.IndexOf('|');
  147. int a5 = messageBody.IndexOf(';');
  148. // ABS:LOAD/LLLB01/ARM2|ERROR/RB|2B80;
  149. string errStr = messageBody.Substring(a4 + 1, a5 - a4 - 1);
  150. //分割位置和因素 最后一位是需要处理
  151. string[] a6 = errStr.Split('/', '|');
  152. if (a6.Length < 3)
  153. {
  154. //因为小于导致后续使用相关变量时会越界
  155. //需要补全 已保证使用
  156. msg.Factor = errStr;
  157. msg.Data.Add($"ABS 格式错误");
  158. msg.Data.Add($"{errStr}");
  159. LOG.Write(eEvent.WARN_EFEM_COMMON_WARN, ModuleName.EFEM, $"ABS 格式错误 {errStr}");
  160. }
  161. else
  162. {
  163. msg.Factor = a6[0];
  164. msg.Data.Add(a6[1]);
  165. string errorcode = a6[2].Substring(1);
  166. if (Constant._EFEMHWErrorCode2Msg.ContainsKey(errorcode))
  167. msg.Data.Add(Constant._EFEMHWErrorCode2Msg[errorcode]);
  168. else if (!string.IsNullOrEmpty(MatchError(errorcode)))
  169. msg.Data.Add(MatchError(errorcode));
  170. else
  171. msg.Data.Add(a6[2]);
  172. }
  173. break;
  174. }
  175. }
  176. catch (Exception ex)
  177. {
  178. EV.PostAlarmLog(ModuleName.EFEM.ToString(), $"收到[{context}],解析出错[{ex.Message}]");
  179. }
  180. return msg;
  181. }
  182. private string MatchError(string errorcode)
  183. {
  184. foreach (KeyValuePair<Regex, string> item in Constant._EFEMHWRegexError2Msg)
  185. {
  186. if (item.Key.IsMatch(errorcode))
  187. return item.Value;
  188. }
  189. return string.Empty;
  190. }
  191. }
  192. }