CognexHandler.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. using Aitex.Core.RT.Event;
  2. using Aitex.Core.RT.Log;
  3. using MECF.Framework.Common.Communications;
  4. using MECF.Framework.Common.Equipment;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Text.RegularExpressions;
  10. using System.Threading.Tasks;
  11. namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.OcrReaders.Cognex
  12. {
  13. public abstract class CognexHandler : HandlerBase
  14. {
  15. protected ModuleName _target;
  16. protected int _slot;
  17. public CognexWaferIDReader OCRDevice { get; set; }
  18. public string Command;
  19. protected CognexHandler(CognexWaferIDReader device, string command, string para,int ackLimit=10,int comlimit =90) : base(BuildMessage(command, para))
  20. {
  21. OCRDevice = device;
  22. Command = command;
  23. AckTimeout = TimeSpan.FromSeconds(ackLimit);
  24. CompleteTimeout = TimeSpan.FromSeconds(comlimit);
  25. //_isSimulator = SC.GetValue<bool>("System.IsSimulatorMode");
  26. }
  27. public static string BuildMessage(string command, string para)
  28. {
  29. return command + (string.IsNullOrEmpty(para)?"":para ) + "\r\n";
  30. }
  31. public virtual void Update()
  32. {
  33. }
  34. }
  35. public class OnlineHandler : CognexHandler
  36. {
  37. public OnlineHandler(CognexWaferIDReader reader, bool online,int ackTimelimit=10,int comTimeLimit=90) : base(reader, "SO", online ? "1" : "0", ackTimelimit, comTimeLimit)
  38. {
  39. OCRDevice = reader;
  40. Command = "SO";
  41. }
  42. public override bool HandleMessage(MessageBase msg, out bool transactionComplete)
  43. {
  44. CognexOCRMessage response = msg as CognexOCRMessage;
  45. ResponseMessage = msg;
  46. if (response.IsAck)
  47. {
  48. SetState(EnumHandlerState.Acked);
  49. transactionComplete = true;
  50. return true;
  51. }
  52. if (response.IsNak)
  53. {
  54. SetState(EnumHandlerState.Nak);
  55. transactionComplete = false;
  56. return true;
  57. }
  58. if (response.IsResponse)
  59. {
  60. //SetState(EnumHandlerState.Completed);
  61. transactionComplete = false;
  62. return true;
  63. }
  64. transactionComplete = true;
  65. return true;
  66. }
  67. }
  68. public class LoadJobHandler : CognexHandler
  69. {
  70. private string jobname;
  71. public LoadJobHandler(CognexWaferIDReader reader, string jobfile, int ackTimelimit = 10, int comTimeLimit = 90) : base(reader, "LF", jobfile, ackTimelimit, comTimeLimit)
  72. {
  73. OCRDevice = reader;
  74. jobname = jobfile;
  75. Command = string.Format("LF{0}.job", jobfile);
  76. }
  77. public override bool HandleMessage(MessageBase msg, out bool transactionComplete)
  78. {
  79. CognexOCRMessage response = msg as CognexOCRMessage;
  80. ResponseMessage = msg;
  81. if (response.IsAck)
  82. {
  83. SetState(EnumHandlerState.Acked);
  84. OCRDevice.CurrentJobName = jobname;
  85. transactionComplete = true;
  86. return true;
  87. }
  88. if (response.IsNak)
  89. {
  90. SetState(EnumHandlerState.Nak);
  91. transactionComplete = false;
  92. return true;
  93. }
  94. if (response.IsResponse)
  95. {
  96. //SetState(EnumHandlerState.Completed);
  97. transactionComplete = false;
  98. return true;
  99. }
  100. transactionComplete = true;
  101. return true;
  102. }
  103. }
  104. public class ReadWaferIDHandler : CognexHandler
  105. {
  106. public ReadWaferIDHandler(CognexWaferIDReader reader, int ackTimelimit = 10, int comTimeLimit = 90) : base(reader, "SM\"READ\"0 ", null, ackTimelimit, comTimeLimit)
  107. {
  108. OCRDevice = reader;
  109. Command = "SM\"READ\"0 ";
  110. reader.CurrentLaserMarkScore = 400;
  111. }
  112. public override bool HandleMessage(MessageBase msg, out bool transactionComplete)
  113. {
  114. CognexOCRMessage response = msg as CognexOCRMessage;
  115. ResponseMessage = msg;
  116. if (response.IsAck)
  117. {
  118. SetState(EnumHandlerState.Acked);
  119. transactionComplete = false;
  120. return true;
  121. }
  122. if (response.IsNak)
  123. {
  124. SetState(EnumHandlerState.Nak);
  125. transactionComplete = false;
  126. return true;
  127. }
  128. if (response.IsResponse && IsAcked)
  129. {
  130. SetState(EnumHandlerState.Completed);
  131. string[] items = response.Data.Replace("\r","").Replace("\n","").TrimStart('[').TrimEnd(']').Replace("[","").Replace("]","").Split(',');
  132. if (OCRDevice.IsReadLaserMark1)
  133. {
  134. if(!string.IsNullOrEmpty(items[0]) && items[0].Length > OCRDevice.KeepLaserMarkCharatersNumber)
  135. {
  136. OCRDevice.CurrentLaserMark = items[0].Substring(0, OCRDevice.KeepLaserMarkCharatersNumber);
  137. }
  138. else
  139. {
  140. OCRDevice.CurrentLaserMark = items[0];
  141. }
  142. OCRDevice.LaserMark1ReadResult = response.Data;
  143. OCRDevice.LaserMark1 = OCRDevice.CurrentLaserMark;
  144. if (items.Length > 1)
  145. {
  146. OCRDevice.LaserMark1Score = items[1];
  147. float fvalue;
  148. if(float.TryParse(items[1],out fvalue))
  149. {
  150. OCRDevice.CurrentLaserMarkScore = fvalue;
  151. }
  152. }
  153. if (items.Length > 2)
  154. {
  155. OCRDevice.LaserMark1ReadTime = items[2];
  156. OCRDevice.CurrentLaserMarkReadTime = items[2];
  157. }
  158. LOG.Write($"{OCRDevice.Name} laser mark1 updated to {OCRDevice.LaserMark1}");
  159. }
  160. else
  161. {
  162. if (!string.IsNullOrEmpty(items[0]) && items[0].Length > OCRDevice.KeepLaserMarkCharatersNumber)
  163. {
  164. OCRDevice.CurrentLaserMark = items[0].Substring(0, OCRDevice.KeepLaserMarkCharatersNumber);
  165. }
  166. else
  167. {
  168. OCRDevice.CurrentLaserMark = items[0];
  169. }
  170. OCRDevice.LaserMark2ReadResult = response.Data;
  171. OCRDevice.LaserMark2 = OCRDevice.CurrentLaserMark;
  172. if (items.Length > 1)
  173. {
  174. OCRDevice.LaserMark2Score = items[1];
  175. float fvalue;
  176. if (float.TryParse(items[1], out fvalue))
  177. {
  178. OCRDevice.CurrentLaserMarkScore = fvalue;
  179. }
  180. }
  181. if (items.Length > 2)
  182. {
  183. OCRDevice.LaserMark2ReadTime = items[2];
  184. OCRDevice.CurrentLaserMarkReadTime = items[2];
  185. }
  186. LOG.Write($"{OCRDevice.Name} laser mark2 updated to {OCRDevice.LaserMark2}");
  187. }
  188. OCRDevice.OnLaserMarkRead();
  189. transactionComplete = true;
  190. return true;
  191. }
  192. transactionComplete = false;
  193. return true;
  194. }
  195. }
  196. public class GetJobListHandler: CognexHandler
  197. {
  198. public GetJobListHandler(CognexWaferIDReader reader, int ackTimelimit = 10, int comTimeLimit = 90) : base(reader, "Get Filelist", "", ackTimelimit, comTimeLimit)
  199. {
  200. OCRDevice = reader;
  201. Command = "Get Filelist";
  202. reader.JobFileList = new List<string>();
  203. reader.JobFileList.Clear();
  204. fileCount = -2;
  205. tempCount = 0;
  206. }
  207. private int fileCount;
  208. private int tempCount;
  209. public override bool HandleMessage(MessageBase msg, out bool transactionComplete)
  210. {
  211. CognexOCRMessage response = msg as CognexOCRMessage;
  212. ResponseMessage = msg;
  213. if (response.IsAck) SetState(EnumHandlerState.Acked);
  214. if (response.IsNak)
  215. {
  216. SetState(EnumHandlerState.Nak);
  217. transactionComplete = false;
  218. return true;
  219. }
  220. if (response.IsResponse|| response.IsAck)
  221. {
  222. SetState(EnumHandlerState.Completed);
  223. var data = Regex.Split(response.Data, "\r\n");
  224. tempCount += data.Length;
  225. if (fileCount == -1) //Second Message
  226. {
  227. fileCount = Convert.ToInt32(data[0].Trim());
  228. }
  229. if (fileCount == -2) // First Time get message
  230. {
  231. if (data[0] != "1")
  232. {
  233. OCRDevice.OnError($"Response Error:{response.Data}");
  234. transactionComplete = true;
  235. return true;
  236. }
  237. if (data.Length ==2 )
  238. {
  239. fileCount = -1;
  240. }
  241. else
  242. {
  243. fileCount = Convert.ToInt32(data[1].Trim());
  244. }
  245. }
  246. var job = data.Where(i => i.Contains(".job")).ToList();
  247. OCRDevice.JobFileList.AddRange(job);
  248. transactionComplete = false;
  249. if(tempCount >= fileCount+2 && fileCount>=0)
  250. transactionComplete = true;
  251. return true;
  252. }
  253. transactionComplete = false;
  254. return true;
  255. }
  256. }
  257. public class SavePictureHandler: CognexHandler
  258. {
  259. private int _imageLength;
  260. private StringBuilder _stringBuilder;
  261. private DateTime _dtStart;
  262. private string _filename;
  263. public SavePictureHandler(CognexWaferIDReader reader,string filename, int ackTimelimit = 10, int comTimeLimit = 90) : base(reader, "RI", "", ackTimelimit, comTimeLimit)
  264. {
  265. OCRDevice = reader;
  266. Command = "RI";
  267. _imageLength = 0;
  268. _stringBuilder = new StringBuilder();
  269. _filename= filename;
  270. _dtStart = DateTime.Now;
  271. //OCRDevice.SetLogEnable(false);
  272. }
  273. public override bool HandleMessage(MessageBase msg, out bool transactionComplete)
  274. {
  275. CognexOCRMessage response = msg as CognexOCRMessage;
  276. if(response.IsAck)
  277. {
  278. var data = Regex.Split(response.Data, "\r\n");
  279. if (data.Length >= 2 && data[0].Trim() == "1" && int.TryParse(data[1], out _imageLength))
  280. {
  281. SetState(EnumHandlerState.Acked);
  282. transactionComplete = false;
  283. return false;
  284. }
  285. else
  286. {
  287. OCRDevice.OnError("Invalid data");
  288. transactionComplete = true;
  289. return true;
  290. }
  291. }
  292. if (response.IsNak)
  293. {
  294. SetState(EnumHandlerState.Nak);
  295. transactionComplete = false;
  296. return true;
  297. }
  298. if (response.IsResponse)
  299. {
  300. foreach(string str in Regex.Split(response.Data, "\r\n"))
  301. _stringBuilder?.Append(str.Trim());
  302. if (_stringBuilder.Length >= _imageLength)
  303. {
  304. string strimage = _stringBuilder?.ToString().Substring(0, _imageLength);
  305. OCRDevice.SaveImage(_filename,strimage);
  306. EV.PostInfoLog($"{OCRDevice.Name}", $"Complete save image for {_filename},cost {(DateTime.Now - _dtStart).TotalSeconds} seconds.");
  307. OCRDevice.SetLogEnable(true);
  308. transactionComplete = true;
  309. return true;
  310. }
  311. }
  312. transactionComplete = false;
  313. return true;
  314. }
  315. }
  316. }