OcrReader.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text.RegularExpressions;
  4. using Aitex.Core.RT.DataCenter;
  5. using Aitex.Core.RT.Device;
  6. using Aitex.Core.RT.Event;
  7. using Aitex.Core.RT.SCCore;
  8. using Aitex.Sorter.Common;
  9. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadPorts;
  10. namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.OcrReaders
  11. {
  12. public class OcrReader : BaseDevice, IDevice
  13. {
  14. public DeviceState State
  15. {
  16. get
  17. {
  18. if (!Initalized)
  19. {
  20. return DeviceState.Unknown;
  21. }
  22. if (Error)
  23. {
  24. return DeviceState.Error;
  25. }
  26. if (Busy)
  27. return DeviceState.Busy;
  28. return DeviceState.Idle;
  29. }
  30. }
  31. public bool Initalized { get; set; }
  32. public Guid OCRGuid { get; set; }
  33. public bool Busy
  34. {
  35. get { return _handlers.Count > 0 || _foregroundHandler != null; }
  36. }
  37. public bool Error
  38. {
  39. get
  40. {
  41. return _commErr || ExeError || !_socket.IsConnected;
  42. }
  43. }
  44. public bool SocketIsConnected { set; get; }
  45. public bool ExeError { get; set; } = false;
  46. public bool ReadLaserMaker { get; set; }
  47. public string JobName { get; set; }
  48. public string LaserMaker { get; set; }
  49. public string LaserMark1 { get; set; }
  50. public string LaserMark1Score { get; set; }
  51. public string LaserMark1ReadTime { get; set; }
  52. public string T7Code { get; set; }
  53. public string LaserMark2 { get; set; }
  54. public string LaserMark2Score { get; set; }
  55. public string LaserMark2ReadTime { get; set; }
  56. public bool ReadOK { get; set; }
  57. public string ImageFileName { get; set; }
  58. public string ImageStorePath { get; set; }
  59. private static Object _locker = new Object();
  60. private AsyncSocket _socket;
  61. private IHandler _foregroundHandler = null; //current handler
  62. private Queue<IHandler> _handlers = new Queue<IHandler>();
  63. public const string delimiter = "\r\n";
  64. private bool _commErr = false;
  65. private string _addr;
  66. //private bool _onlineInited;
  67. public OcrReader(string module, string name, string display, string deviceId, string address)
  68. : base(module, name, display, deviceId)
  69. {
  70. _addr = address;
  71. _socket = new AsyncSocket(address, delimiter);
  72. _socket.OnDataChanged += new AsyncSocket.MessageHandler(OnDataChanged);
  73. _socket.OnErrorHappened += new AsyncSocket.ErrorHandler(OnErrorHandler);
  74. Initalized = false;
  75. }
  76. public bool Initialize()
  77. {
  78. _socket.Connect(this._addr);
  79. DEVICE.Register(String.Format("{0}.{1}", Name, "ReadWaferID"), (out string reason, int time, object[] param) =>
  80. {
  81. bool bLaser = bool.Parse((string)param[0]);
  82. string jobName = (string)param[1];
  83. bool ret = Read(bLaser, jobName, out reason);
  84. if (ret)
  85. {
  86. reason = string.Format("{0}", Name, "读WaferID");
  87. return true;
  88. }
  89. return false;
  90. });
  91. DATA.Subscribe(Name, "WRIDReaderState", () => State);
  92. DATA.Subscribe(Name, "WRIDReaderBusy", () => Busy);
  93. DATA.Subscribe(Name, "LaserMaker1", () => LaserMaker);
  94. DATA.Subscribe(Name, "LaserMaker2", () => T7Code);
  95. _handlers.Clear();
  96. Online(false, out _);
  97. Initalized = true;
  98. return true;
  99. }
  100. public void Terminate()
  101. {
  102. }
  103. //private int timerCount = 0;
  104. public void Monitor()
  105. {
  106. //if(timerCount ++>50)
  107. //{
  108. // timerCount = 0;
  109. // lock (_locker)
  110. // {
  111. // if (!Busy)
  112. // {
  113. // if (!_socket.IsHstConnected) _commErr = true;
  114. // }
  115. // }
  116. //}
  117. //if (!Busy)
  118. //{
  119. // lock (_locker)
  120. // {
  121. // SocketIsConnected = _socket.IsConnected;
  122. // }
  123. //}
  124. }
  125. public void Reset()
  126. {
  127. lock (_locker)
  128. {
  129. _foregroundHandler = null;
  130. _handlers.Clear();
  131. }
  132. if (_commErr || !_socket.IsConnected)
  133. {
  134. _commErr = false;
  135. _socket.Connect(this._addr);
  136. }
  137. ExeError = false;
  138. Initalized = true;
  139. }
  140. #region Command
  141. public bool Read(bool bLaserMaker, string jobName, out string reason)
  142. {
  143. _handlers.Clear();
  144. if (string.IsNullOrEmpty(jobName))
  145. {
  146. reason = "Job is undefine.";
  147. return false;
  148. }
  149. _handlers.Enqueue(new handler(new OnlineHandler(this), false)); //offline
  150. _handlers.Enqueue(new handler(new LoadJobHandler(this), ConvetJobName(jobName))); //LoadJob
  151. _handlers.Enqueue(new handler(new OnlineHandler(this), true)); //online
  152. ReadOK = false;
  153. ReadLaserMaker = bLaserMaker;
  154. _handlers.Enqueue(new handler(new ReadHandler(this))); //Read
  155. return execute(out reason);
  156. }
  157. public bool Read(bool bLaserMaker, out string reason)
  158. {
  159. _handlers.Clear();
  160. string[] jobs = GetJobName(bLaserMaker);
  161. if (jobs.Length == 0 || string.IsNullOrEmpty(jobs[0]))
  162. {
  163. reason = "Job is undefine";
  164. return false;
  165. }
  166. string jobName = ConvetJobName(jobs[0]);
  167. if (JobName != jobName)
  168. {
  169. _handlers.Enqueue(new handler(new OnlineHandler(this), false)); //offline
  170. _handlers.Enqueue(new handler(new LoadJobHandler(this), jobName)); //LoadJob
  171. _handlers.Enqueue(new handler(new OnlineHandler(this), true)); //online
  172. }
  173. _handlers.Enqueue(new handler(new ReadHandler(this))); //Read
  174. ReadOK = false;
  175. ReadLaserMaker = bLaserMaker;
  176. return execute(out reason);
  177. }
  178. public bool ReadOnHostMode(bool bLaserMaker, string[] jobnames, out string reason)
  179. {
  180. _handlers.Clear();
  181. ReadOK = false;
  182. string[] jobs = jobnames;
  183. if (jobs.Length == 0 || string.IsNullOrEmpty(jobs[0]))
  184. {
  185. reason = "Job is undefine";
  186. return false;
  187. }
  188. _handlers.Enqueue(new handler(new OnlineHandler(this), false)); //offline
  189. _handlers.Enqueue(new handler(new LoadJobHandler(this), ConvetJobName(jobnames[0]))); //LoadJob
  190. _handlers.Enqueue(new handler(new OnlineHandler(this), true)); //online
  191. _handlers.Enqueue(new handler(new ReadHandler(this))); //Read
  192. ReadLaserMaker = bLaserMaker;
  193. return execute(out reason);
  194. }
  195. public bool Read(out string reason)
  196. {
  197. reason = string.Empty;
  198. return execute(new handler(new ReadHandler(this)), out reason);
  199. }
  200. public bool ReadJobName(out string reason)
  201. {
  202. reason = string.Empty;
  203. return execute(new handler(new GetJobHandler(this)), out reason);
  204. }
  205. public bool Online(bool online, out string reason)
  206. {
  207. reason = string.Empty;
  208. return execute(new handler(new OnlineHandler(this), online), out reason);
  209. }
  210. public bool LoadJob(string jobName, out string reason)
  211. {
  212. reason = string.Empty;
  213. return execute(new handler(new LoadJobHandler(this), jobName), out reason);
  214. }
  215. #endregion
  216. private string[] GetJobName(bool bLaserMark1)
  217. {
  218. string jobs = string.Empty;
  219. if (bLaserMark1)
  220. {
  221. jobs = SC.GetStringValue("OcrReader.ReaderJob1Main");
  222. }
  223. else
  224. {
  225. jobs = SC.GetStringValue("OcrReader.ReaderJob2Main");
  226. }
  227. return jobs.Split(';');
  228. }
  229. private bool execute(IHandler handler, out string reason)
  230. {
  231. reason = string.Empty;
  232. lock (_locker)
  233. {
  234. _handlers.Enqueue(handler);
  235. if (_foregroundHandler == null) execute(out _);
  236. }
  237. return true;
  238. }
  239. private bool execute(out string reason)
  240. {
  241. reason = string.Empty;
  242. lock (_locker)
  243. {
  244. if (_handlers.Count > 0)
  245. {
  246. ExeError = false;
  247. _foregroundHandler = _handlers.Dequeue();
  248. if (!_foregroundHandler.Execute(ref _socket))
  249. {
  250. reason = " communication failed, please recovery it.";
  251. //LOG.Error(reason);
  252. EV.PostMessage(Name, EventEnum.DefaultWarning, "【Reader】" + reason);
  253. _handlers.Clear();
  254. _foregroundHandler = null;
  255. return false;
  256. }
  257. }
  258. }
  259. return true;
  260. }
  261. private void OnDataChanged(string package)
  262. {
  263. try
  264. {
  265. package = package.ToUpper();
  266. string[] msgs = Regex.Split(package, delimiter);
  267. foreach (string msg in msgs)
  268. {
  269. if (msg.Length > 0)
  270. {
  271. bool completed = false;
  272. string resp = msg;
  273. lock (_locker)
  274. {
  275. if (_foregroundHandler != null && _foregroundHandler.OnMessage(ref _socket, resp, out completed))
  276. {
  277. if (completed && !Error)
  278. {
  279. _foregroundHandler = null;
  280. string reason = string.Empty;
  281. execute(out reason);
  282. }
  283. else if(Error)
  284. {
  285. _handlers.Clear();
  286. _foregroundHandler = null;
  287. }
  288. }
  289. }
  290. }
  291. }
  292. }
  293. catch (ExcuteFailedException ex)
  294. {
  295. EV.PostMessage(DeviceID, EventEnum.DefaultWarning, ex.Message);
  296. }
  297. catch (InvalidPackageException ex)
  298. {
  299. EV.PostMessage(DeviceID, EventEnum.DefaultWarning, ex.Message);
  300. }
  301. catch (System.Exception ex)
  302. {
  303. EV.PostMessage(Name, EventEnum.DefaultWarning, "【Reader】has exception:" + ex.ToString());
  304. }
  305. }
  306. public void OnLaskerMarkerRead()
  307. {
  308. }
  309. private void OnErrorHandler(ErrorEventArgs args)
  310. {
  311. _commErr = true;
  312. Initalized = false;
  313. EV.PostMessage(Module, EventEnum.CommunicationError, Display, args.Reason);
  314. //EV.PostMessage(Name, EventEnum.DefaultWarning, string.Format("{0} Communication failed,please check it.{1}", Name, args.Reason));
  315. }
  316. private string ConvetJobName(string name)
  317. {
  318. name = name.Substring(name.LastIndexOf("\\") + 1); //remove dir
  319. name = name.Substring(0, name.LastIndexOf(".")); //remove expand
  320. return name;
  321. }
  322. }
  323. }