Sic.Framework/MECF.Framework.RT.Equipment.../HardwareUnits/Aligners/YaskawaAligner/YaskawaAlignerConnection.cs

140 lines
4.7 KiB
C#

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 YaskawaRobotMessage : 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 YaskawaAlignerConnection : TCPPortConnectionBase
{
private YaskawaAligner _aligner;
public YaskawaAlignerConnection(YaskawaAligner pa, string ipaddress)
: base(ipaddress, "\r", true)
{
_aligner = pa;
}
protected override MessageBase ParseResponse(string rawMessage)
{
YaskawaRobotMessage msg = new YaskawaRobotMessage();
try
{
msg.RawMessage = rawMessage.Replace("\r", "");
string[] msgdata = msg.RawMessage.Split(',');
msg.UNo = Convert.ToInt16(msgdata[1]);
msg.IsAck = false;
msg.IsComplete = false;
msg.IsFormatError = false;
msg.IsEvent = false;
if (msgdata[0] == "$") msg.IsAck = true;
if (msgdata[0] == "!") msg.IsComplete = true;
if (msgdata[0] == "?")
{
msg.IsFormatError = true;
}
if (msgdata[0] == ">" && msgdata[2] == "EVNT")
{
msg.IsEvent = true;
msg.EvNo = msgdata[3];
msg.EvDate = msgdata[4];
msg.EvData = msgdata[5];
return msg;
}
if (_aligner.IsEnableSeqNo)
{
msg.SeqNo = Convert.ToInt16(msgdata[2]);
msg.Status = msgdata[3];
msg.Ackcd = msgdata[4];
msg.Command = msgdata[5];
msg.Data = msgdata.Skip(6).Take(msgdata.Length - 6 - (_aligner.IsEnableCheckSum ? 1 : 0)).ToArray();
}
else
{
msg.Status = msgdata[2];
msg.Ackcd = msgdata[3];
msg.Command = msgdata[4];
msg.Data = msgdata.Skip(6).Take(msgdata.Length - 5 - (_aligner.IsEnableCheckSum ? 1 : 0)).ToArray();
}
_aligner.ParseStatus(msg.Status);
return msg;
}
catch (Exception ex)
{
LOG.Write(ex);
msg.IsFormatError = true;
return msg;
}
}
protected override void OnEventArrived(MessageBase msg)
{
YaskawaRobotMessage evt = msg as YaskawaRobotMessage;
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;
}
}
}