YaskawaAlignerConnection.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. using Aitex.Core.RT.Event;
  2. using Aitex.Core.RT.Log;
  3. using MECF.Framework.Common.Communications;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Aligners.YaskawaAligner
  10. {
  11. public class YaskawaRobotMessage : AsciiMessage
  12. {
  13. public int UNo { get; set; }
  14. public int SeqNo { get; set; }
  15. public string Status { get; set; }
  16. public string Ackcd { get; set; }
  17. public string Command { get; set; }
  18. public string[] Data { get; set; }
  19. public string ErrorCode { get; set; }
  20. public string EvNo { get; set; }
  21. public string EvDate { get; set; }
  22. public string EvData { get; set; }
  23. }
  24. public class YaskawaAlignerConnection : TCPPortConnectionBase
  25. {
  26. private YaskawaAligner _aligner;
  27. public YaskawaAlignerConnection(YaskawaAligner pa, string ipaddress)
  28. : base(ipaddress, "\r", true)
  29. {
  30. _aligner = pa;
  31. }
  32. protected override MessageBase ParseResponse(string rawMessage)
  33. {
  34. YaskawaRobotMessage msg = new YaskawaRobotMessage();
  35. try
  36. {
  37. msg.RawMessage = rawMessage.Replace("\r", "");
  38. string[] msgdata = msg.RawMessage.Split(',');
  39. msg.UNo = Convert.ToInt16(msgdata[1]);
  40. msg.IsAck = false;
  41. msg.IsComplete = false;
  42. msg.IsFormatError = false;
  43. msg.IsEvent = false;
  44. if (msgdata[0] == "$") msg.IsAck = true;
  45. if (msgdata[0] == "!")
  46. {
  47. msg.IsComplete = true;
  48. SendAck();
  49. }
  50. if (msgdata[0] == "?")
  51. {
  52. msg.IsFormatError = true;
  53. msg.ErrorCode = msgdata[1];
  54. return msg;
  55. }
  56. if (msgdata[0] == ">" && msgdata[2] == "EVNT")
  57. {
  58. msg.IsEvent = true;
  59. msg.EvNo = msgdata[3];
  60. msg.EvDate = msgdata[4];
  61. msg.EvData = msgdata[5];
  62. return msg;
  63. }
  64. if (_aligner.IsEnableSeqNo)
  65. {
  66. msg.SeqNo = Convert.ToInt16(msgdata[2]);
  67. msg.Status = msgdata[3];
  68. msg.Ackcd = msgdata[4];
  69. msg.Command = msgdata[5];
  70. msg.Data = msgdata.Skip(6).Take(msgdata.Length - 6 - (_aligner.IsEnableCheckSum ? 1 : 0)).ToArray();
  71. }
  72. else
  73. {
  74. msg.Status = msgdata[2];
  75. msg.Ackcd = msgdata[3];
  76. msg.Command = msgdata[4];
  77. msg.Data = msgdata.Skip(6).Take(msgdata.Length - 5 - (_aligner.IsEnableCheckSum ? 1 : 0)).ToArray();
  78. }
  79. _aligner.ParseStatus(msg.Status);
  80. return msg;
  81. }
  82. catch (Exception ex)
  83. {
  84. LOG.Write(ex);
  85. msg.IsFormatError = true;
  86. return msg;
  87. }
  88. }
  89. protected override void OnEventArrived(MessageBase msg)
  90. {
  91. YaskawaRobotMessage evt = msg as YaskawaRobotMessage;
  92. if (evt.EvNo == "100")
  93. {
  94. string errocode = evt.EvData.Substring(1, evt.EvData.Length - 1);
  95. int nErrorCode = Convert.ToInt32(errocode, 16);
  96. if (nErrorCode == 2384)
  97. {
  98. _aligner.ResetError();
  99. }
  100. else
  101. {
  102. _aligner.NotifyAlarmByErrorCode(errocode.ToUpper());
  103. if (Convert.ToInt32(errocode, 16) > 0xF0)
  104. _aligner.OnError($"Robot occurred error:{evt.EvData} on {evt.EvDate}.");
  105. else
  106. EV.PostWarningLog("Robot", $"Robot occurred error:{evt.EvData} on {evt.EvDate}.");
  107. }
  108. }
  109. if (evt.EvNo == "140")
  110. {
  111. }
  112. }
  113. public void SendAck()
  114. {
  115. if (_aligner.IsEnableSeqNo)
  116. {
  117. _aligner.CurrentSeqNo = _aligner.SeqnoGenerator.create();
  118. _aligner.SeqnoGenerator.release(_aligner.CurrentSeqNo);
  119. }
  120. string commandstr = $",{_aligner.UnitNumber}" + (_aligner.IsEnableSeqNo ? $",{_aligner.CurrentSeqNo:D2}" : "") + ",ACKN";
  121. if (_aligner.IsEnableCheckSum)
  122. {
  123. commandstr += ",";
  124. commandstr = commandstr + Checksum(Encoding.ASCII.GetBytes(commandstr)) + "\r";
  125. }
  126. commandstr = "$" + commandstr;
  127. SendMessage(commandstr);
  128. }
  129. private string Checksum(byte[] bytes)
  130. {
  131. int sum = 0;
  132. foreach (byte code in bytes)
  133. {
  134. sum += code;
  135. }
  136. string hex = String.Format("{0:X2}", sum % 256);
  137. return hex;
  138. }
  139. }
  140. }