using Aitex.Core.RT.Event; using Aitex.Core.RT.Log; using MECF.Framework.Common.Communications; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Aligners.YaskawaAligner { public class YaskawaNxcAlignerMessage : AsciiMessage { public int UNo { get; set; } public int SeqNo { get; set; } public string Status { get; set; } public string Ackcd { get; set; } public string Command { get; set; } public string Data { get; set; } public string ErrorCode { get; set; } public string EvNo { get; set; } public string EvDate { get; set; } public string EvData { get; set; } } public class YaskawaNxcAlignerConnection : TCPPortConnectionBase { private YaskawaNxcAligner _aligner; public YaskawaNxcAlignerConnection(YaskawaNxcAligner pa, string ipaddress) : base(ipaddress, "\r", true) { _aligner = pa; } protected override MessageBase ParseResponse(string rawMessage) { YaskawaNxcAlignerMessage msg = new YaskawaNxcAlignerMessage(); try { msg.RawMessage = rawMessage.Replace("\r", ""); string msgdata = rawMessage.Replace("\r", ""); string startTag = msgdata.Substring(0, 1); msg.UNo = Convert.ToInt16(msgdata.Substring(1, 1)); msg.IsAck = false; msg.IsComplete = false; msg.IsFormatError = false; msg.IsEvent = false; if (startTag == "$") { msg.IsAck = true; msg.IsComplete = false; } if (startTag == "?") { msg.IsFormatError = true; } if (startTag == ">" && msgdata.Substring(4, 4) == "EVNT") { msg.IsEvent = true; msg.EvNo = msgdata.Substring(8, 3); msg.EvData = msgdata.Substring(11, msgdata.Length - 13); msg.EvDate = DateTime.Now.ToString(); return msg; } if (startTag == "!") { SendAck(); msg.IsComplete = true; } if (_aligner.IsEnableSeqNo) { msg.SeqNo = Convert.ToInt16(msgdata.Substring(2, 2)); msg.Status = msgdata.Substring(4, 2); msg.Data = msgdata.Substring(4, msgdata.Length - 6); if (msg.IsAck) { msg.Ackcd = msgdata.Substring(6, 4); if (msg.Ackcd != "0000") { _aligner.OnError($"Execution error,Ack code is {msg.ErrorCode}"); } } if (msg.IsComplete) { msg.ErrorCode = msgdata.Substring(6, 4); if (msg.ErrorCode != "0000") { _aligner.OnError($"Execution error,Error code is {msg.ErrorCode}"); } } //msg.Command = msgdata[5]; //msg.Data = msgdata.Skip(6).Take(msgdata.Length -6 - (_robot.IsEnableCheckSum?1:0)).ToArray(); } else { //msg.SeqNo = Convert.ToInt16(msgdata.Substring(2, 2)); msg.Status = msgdata.Substring(2, 2); msg.Data = msgdata.Substring(2, msgdata.Length - 4); if (msg.IsAck) { msg.Ackcd = msgdata.Substring(4, 4); if (msg.Ackcd != "0000") { _aligner.OnError($"Execution error,Ack code is {msg.ErrorCode}"); } } if (msg.IsComplete) { msg.ErrorCode = msgdata.Substring(4, 4); if (msg.ErrorCode != "0000") { _aligner.OnError($"Execution error,Error code is {msg.ErrorCode}"); } } } _aligner.ParseStatus(msg.Status); return msg; } catch (Exception ex) { LOG.Write(ex); msg.IsFormatError = true; return msg; } } protected override void OnEventArrived(MessageBase msg) { YaskawaNxcAlignerMessage evt = msg as YaskawaNxcAlignerMessage; if (evt.EvNo == "100") { string errocode = evt.EvData.Substring(1, evt.EvData.Length - 1); _aligner.NotifyAlarmByErrorCode(errocode); if (Convert.ToInt32(errocode,16) > 0xF0) _aligner.OnError($"Robot occurred error:{evt.EvData} on {evt.EvDate}."); else EV.PostWarningLog("Robot", $"Robot occurred error:{evt.EvData} on {evt.EvDate}."); } if (evt.EvNo == "140") { } } public void SendAck() { if (_aligner.IsEnableSeqNo) { _aligner.CurrentSeqNo = _aligner.SeqnoGenerator.create(); _aligner.SeqnoGenerator.release(_aligner.CurrentSeqNo); } string commandstr = $"{_aligner.UnitNumber}" + (_aligner.IsEnableSeqNo ? $"{_aligner.CurrentSeqNo:D2}" : "") + "ACKN"; if (_aligner.IsEnableCheckSum) { commandstr += ""; commandstr = commandstr + Checksum(Encoding.ASCII.GetBytes(commandstr)) + "\r"; } commandstr = "$" + commandstr; SendMessage(commandstr); } private string Checksum(byte[] bytes) { int sum = 0; foreach (byte code in bytes) { sum += code; } string hex = String.Format("{0:X2}", sum % 256); return hex; } } }