123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 |
- using Aitex.Core.RT.Event;
- using Aitex.Core.RT.Log;
- using Aitex.Core.Util;
- using MECF.Framework.Common.Equipment;
- using CyberX8_Core;
- using CyberX8_RT.Devices.YASKAWA;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Runtime.Remoting.Contexts;
- using System.Text;
- using System.Text.RegularExpressions;
- using System.Threading.Tasks;
- namespace CyberX8_RT.Devices.EFEM
- {
- public class JetMessageHandler : Singleton<JetMessageHandler>, IEfemMessageHander
- {
- private const string ERROR_MSG = "hardware message invalid";
- public EfemMessage ToMessage(string context)
- {
- if (string.IsNullOrEmpty(context) || context.Length < 3)
- throw new ArgumentNullException(ERROR_MSG);
- EfemMessage msg = new EfemMessage { RawString = context, Direct = MsgDirection.From, Data = new List<string>() };
- // remove EOT
- string messageBody = context.Substring(0, context.IndexOf(EfemMessage.EOF) + 1);
- try
- {
- // split up the string
- string[] sBodies = messageBody.Split(Constant.delimiters);
- string sHead = sBodies[0];
- string sBasic = sBodies[1];
- string sPort = sBodies[2];
- // Head
- if (Enum.TryParse(sHead, true, out EfemMessage.MsgHead msgHead))
- {
- msg.Head = msgHead;
- }
- switch (msg.Head)
- {
- case EfemMessage.MsgHead.ACK:
- case EfemMessage.MsgHead.MOV:
- case EfemMessage.MsgHead.INF:
- case EfemMessage.MsgHead.EVT:
- // Basic
- msg.Operation = EfemConstant.ToOperation(sBasic);
- // Port
- if (Regex.IsMatch(sPort, @"P[123]$"))
- {
- msg.Module = sPort.ToModule();
- }
- else if (Regex.IsMatch(sPort, @"ALIGN\d?", RegexOptions.IgnoreCase))
- {
- msg.Module = sPort.ToModule();
- }
- else
- {
- msg.Module = ModuleName.EFEM;
- }
- // Data
- switch (msg.Operation)
- {
- case EfemOperation.StateTrack:
- case EfemOperation.GetWaferInfo:
- msg.Data.Add(sBodies[3]);
- break;
- case EfemOperation.CarrierId:
- msg.Data.Add(msg.RawString.Substring("INF:CSTID/P1/".Length));
- break;
- case EfemOperation.SigStatus:
- msg.Data.Add(sBodies[2]);
- msg.Data.Add(sBodies[3]);
- msg.Data.Add(sBodies[4]);
- break;
- case EfemOperation.Ready:
- msg.Data.Add(sBodies[2]);
- break;
- default:
- break;
- }
- break;
- case EfemMessage.MsgHead.NAK:
- msg.Operation = EfemConstant.ToOperation(sBasic);
- // Port
- if (Regex.IsMatch(sPort, @"P[123]$"))
- {
- msg.Module = sPort.ToModule();
- }
- else if (Regex.IsMatch(sPort, @"ALIGN\d?", RegexOptions.IgnoreCase))
- {
- msg.Module = sPort.ToModule();
- }
- else
- {
- msg.Module = ModuleName.EFEM;
- }
- msg.Factor = sBodies[1];
- msg.Data.Add(sBodies[2]);
- msg.Operation = EfemConstant.ToOperation(sBasic);
- break;
- case EfemMessage.MsgHead.CAN:
- msg.Operation = EfemConstant.ToOperation(sBasic);
- // Port
- if (Regex.IsMatch(sPort, @"P[123]$"))
- {
- msg.Module = sPort.ToModule();
- }
- else if (Regex.IsMatch(sPort, @"ALIGN\d?", RegexOptions.IgnoreCase))
- {
- msg.Module = sPort.ToModule();
- }
- else
- {
- msg.Module = ModuleName.EFEM;
- }
- // CAN:ERROR/CLEAR;
- int a1 = messageBody.IndexOf(':');
- int a3 = messageBody.IndexOf(';');
- int a2 = messageBody.IndexOf('|');
- if (a2 > 0)
- {
- msg.Data.Add(messageBody.Substring(a1 + 1, a2 - a1 - 1));
- msg.Factor = messageBody.Substring(a2 + 1, a3 - a2 - 1);
- }
- else
- {
- int a8 = messageBody.IndexOf('/');
- msg.Factor = sBodies[2];
- }
- break;
- case EfemMessage.MsgHead.ABS:
- msg.Operation = EfemConstant.ToOperation(sBasic);
- // Port
- if (Regex.IsMatch(sPort, @"P[123]$"))
- {
- msg.Module = sPort.ToModule();
- }
- else if (Regex.IsMatch(sPort, @"ALIGN\d?", RegexOptions.IgnoreCase))
- {
- msg.Module = sPort.ToModule();
- }
- else
- {
- msg.Module = ModuleName.EFEM;
- }
- // ABS:INIT/ALL|ERROR/SYSTEM_FF10/UNDEFINITION;
- int a4 = messageBody.IndexOf('|');
- int a5 = messageBody.IndexOf(';');
- // ABS:LOAD/LLLB01/ARM2|ERROR/RB|2B80;
- string errStr = messageBody.Substring(a4 + 1, a5 - a4 - 1);
- //分割位置和因素 最后一位是需要处理
- string[] a6 = errStr.Split('/', '|');
- if (a6.Length < 3)
- {
- //因为小于导致后续使用相关变量时会越界
- //需要补全 已保证使用
- msg.Factor = errStr;
- msg.Data.Add($"ABS 格式错误");
- msg.Data.Add($"{errStr}");
- LOG.Write(eEvent.WARN_EFEM_COMMON_WARN, ModuleName.EFEM, $"ABS 格式错误 {errStr}");
- }
- else
- {
- msg.Factor = a6[0];
- msg.Data.Add(a6[1]);
- string errorcode = a6[2].Substring(1);
- if (Constant._EFEMHWErrorCode2Msg.ContainsKey(errorcode))
- msg.Data.Add(Constant._EFEMHWErrorCode2Msg[errorcode]);
- else if (!string.IsNullOrEmpty(MatchError(errorcode)))
- msg.Data.Add(MatchError(errorcode));
- else
- msg.Data.Add(a6[2]);
- }
- break;
- }
- }
- catch (Exception ex)
- {
- EV.PostAlarmLog(ModuleName.EFEM.ToString(), $"收到[{context}],解析出错[{ex.Message}]");
- }
- return msg;
- }
- private string MatchError(string errorcode)
- {
- foreach (KeyValuePair<Regex, string> item in Constant._EFEMHWRegexError2Msg)
- {
- if (item.Key.IsMatch(errorcode))
- return item.Value;
- }
- return string.Empty;
- }
- }
- }
|