HirataR4Robot.cs 89 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO.Ports;
  4. using System.Linq;
  5. using System.Text;
  6. using Aitex.Core.Common.DeviceData;
  7. using Aitex.Core.RT.Device;
  8. using Aitex.Core.RT.Device.Unit;
  9. using Aitex.Core.RT.Event;
  10. using Aitex.Core.RT.Log;
  11. using Aitex.Core.RT.OperationCenter;
  12. using Aitex.Core.RT.SCCore;
  13. using Aitex.Core.Util;
  14. using MECF.Framework.Common.Communications;
  15. using MECF.Framework.Common.Device.Bases;
  16. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Common;
  17. using Newtonsoft.Json;
  18. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robots.RobotBase;
  19. using MECF.Framework.Common.Equipment;
  20. using MECF.Framework.Common.SubstrateTrackings;
  21. using System.Threading;
  22. using Aitex.Core.Common;
  23. using Aitex.Core.RT.DataCenter;
  24. namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robots.RobotHirataR4
  25. {
  26. public class HirataR4Robot : RobotBaseDevice, IConnection
  27. {
  28. private bool isSimulatorMode;
  29. public string Address { get { return _address; } }
  30. public string PortName;
  31. public bool IsConnected { get; }
  32. public bool Connect()
  33. {
  34. return _connection.Connect();
  35. }
  36. public bool Disconnect()
  37. {
  38. return _connection.Disconnect();
  39. }
  40. private HirataR4RobotConnection _connection;
  41. public HirataR4RobotConnection Connection
  42. {
  43. get { return _connection; }
  44. }
  45. private R_TRIG _trigError = new R_TRIG();
  46. private R_TRIG _trigCommunicationError = new R_TRIG();
  47. private R_TRIG _trigRetryConnect = new R_TRIG();
  48. private R_TRIG _trigActionDone = new R_TRIG();
  49. private PeriodicJob _thread;
  50. private LinkedList<HandlerBase> _lstHandler = new LinkedList<HandlerBase>();
  51. private LinkedList<HandlerBase> _lstMonitorHandler = new LinkedList<HandlerBase>();
  52. public List<IOResponse> IOResponseList { get; set; } = new List<IOResponse>();
  53. private object _locker = new object();
  54. private bool _enableLog;
  55. public int Axis { get; private set; }
  56. private float _armPitch { get; set; }
  57. private string _scRoot;
  58. public bool DIReadValue { get; set; }
  59. private bool[,] di_Values { get; set; } = new bool[8,8];
  60. public HirataR4Robot(string module, string name, string scRoot, string portName) : base(module, name)
  61. {
  62. isSimulatorMode = SC.ContainsItem("System.IsSimulatorMode") ? SC.GetValue<bool>("System.IsSimulatorMode"):false;
  63. _scRoot = scRoot;
  64. PortName = portName;
  65. //base.Initialize();
  66. ResetPropertiesAndResponses();
  67. RegisterSpecialData();
  68. _address = SC.GetStringValue($"{_scRoot}.{Name}.Address");
  69. _enableLog = SC.GetValue<bool>($"{_scRoot}.{Name}.EnableLogMessage");
  70. Axis = SC.GetValue<int>($"{_scRoot}.{Name}.RobotAxis");
  71. _armPitch = SC.GetValue<int>($"{_scRoot}.{Name}.ArmPitch") / 100;
  72. PortName = SC.GetStringValue($"{_scRoot}.{Name}.PortName");
  73. _connection = new HirataR4RobotConnection(PortName);
  74. _connection.EnableLog(_enableLog);
  75. if (_connection.Connect())
  76. {
  77. EV.PostInfoLog(Module, $"{Module}.{Name} connected");
  78. }
  79. _thread = new PeriodicJob(50, OnTimer, $"{Module}.{Name} MonitorHandler", true);
  80. //_address = SC.GetStringValue($"{_scRoot}.{Name}.DeviceAddress");
  81. }
  82. private void RegisterSpecialData()
  83. {
  84. DATA.Subscribe($"{Module}.{Name}.CurrentExtParaNO", () => CurrentReadExtParaNO);
  85. DATA.Subscribe($"{Module}.{Name}.CurrentExtParaValue", () => CurrentReadExtParaValue);
  86. DATA.Subscribe($"{Module}.{Name}.RobotIsOnline", () => IsOnLine);
  87. DATA.Subscribe($"{Module}.{Name}.RobotIsManual", () => IsManual);
  88. DATA.Subscribe($"{Module}.{Name}.RobotIsAuto", () => IsAuto);
  89. DATA.Subscribe($"{Module}.{Name}.RobotStopSignal", () => IsStop);
  90. DATA.Subscribe($"{Module}.{Name}.RobotEMSignal", () => IsES);
  91. DATA.Subscribe($"{Module}.{Name}.RobotZaxisSaftyZone", () => IsZaxisSafeZone);
  92. DATA.Subscribe($"{Module}.{Name}.RobotPositioningCompleted", () => MovingCompleted);
  93. DATA.Subscribe($"{Module}.{Name}.RobotACalCompleted", () => ACalCompleted);
  94. DATA.Subscribe($"{Module}.{Name}.RobotExecutionCompleted", () => ExecutionComplete);
  95. DATA.Subscribe($"{Module}.{Name}.RobotReadXPosition", () => ReadXPosition);
  96. DATA.Subscribe($"{Module}.{Name}.RobotReadYPosition", () => ReadYPosition);
  97. DATA.Subscribe($"{Module}.{Name}.RobotReadZPosition", () => ReadZPosition);
  98. DATA.Subscribe($"{Module}.{Name}.RobotReadWPosition", () => ReadWPosition);
  99. DATA.Subscribe($"{Module}.{Name}.RobotMdata", () => MData);
  100. DATA.Subscribe($"{Module}.{Name}.RobotFCode", () => FCode);
  101. DATA.Subscribe($"{Module}.{Name}.RobotSCode", () => SCode);
  102. DATA.Subscribe($"{Module}.{Name}.ExtPara_MapWaferCount", () => ExtPara_MapWaferCount);
  103. DATA.Subscribe($"{Module}.{Name}.ExtPara_WaferThickness", () => ExtPara_WaferThickness);
  104. DATA.Subscribe($"{Module}.{Name}.ExtPara_PositionRange", () => ExtPara_PositionRange);
  105. DATA.Subscribe($"{Module}.{Name}.ExtPara_Pitch", () => ExtPara_Pitch);
  106. DATA.Subscribe($"{Module}.{Name}.ExtPara_WaferMinThickness", () => ExtPara_WaferMinThickness);
  107. DATA.Subscribe($"{Module}.{Name}.ExtPara_Filter", () => ExtPara_Filter);
  108. }
  109. protected override bool Init()
  110. {
  111. return true;
  112. }
  113. private void ResetPropertiesAndResponses()
  114. {
  115. Connected = true;
  116. Error = null;
  117. RobotStatus = null;
  118. IsOnLine = false;
  119. IsManual = false;
  120. IsES = false;
  121. MovingCompleted = false;
  122. ACalCompleted = false;
  123. AddressOutSide = null;
  124. PositionOutSide = null;
  125. EmergencyStop = null;
  126. XLowerSide = null;
  127. XUpperSide = null;
  128. YLowerSide = null;
  129. YUpperSide = null;
  130. ZLowerSide = null;
  131. ZUpperSide = null;
  132. foreach (var ioResponse in IOResponseList)
  133. {
  134. ioResponse.ResonseContent = null;
  135. ioResponse.ResonseRecievedTime = DateTime.Now;
  136. }
  137. }
  138. public override bool IsReady()
  139. {
  140. return ((!_connection.IsBusy) && (_lstHandler.Count == 0) && (IsOnLine) && (ACalCompleted) &&
  141. (MovingCompleted)&&(!_connection.IsCommunicationError) && (!IsBusy) && (RobotState == RobotStateEnum.Idle));
  142. }
  143. private string _address;
  144. private bool OnTimer()
  145. {
  146. try
  147. {
  148. //return true;
  149. if (!_connection.IsConnected || _connection.IsCommunicationError)
  150. {
  151. lock (_locker)
  152. {
  153. _lstHandler.Clear();
  154. }
  155. _trigRetryConnect.CLK = !_connection.IsConnected;
  156. if (_trigRetryConnect.Q)
  157. {
  158. _connection.SetPortAddress(SC.GetStringValue($"{_scRoot}.{Name}.PortName"));
  159. if (!_connection.Connect())
  160. {
  161. EV.PostAlarmLog(Module, $"Can not connect with {_connection.Address}, {Module}.{Name}");
  162. }
  163. else
  164. {
  165. //_lstHandler.AddLast(new RobotHirataR4QueryPinHandler(this, _deviceAddress));
  166. //_lstHandler.AddLast(new RobotHirataR4SetCommModeHandler(this, _deviceAddress, EnumRfPowerCommunicationMode.Host));
  167. }
  168. }
  169. return true;
  170. }
  171. HandlerBase handler = null;
  172. lock (_locker)
  173. {
  174. if (_lstHandler.Count == 0 && (!_connection.IsBusy) &&
  175. ((!IsOnLine) || (!ACalCompleted) || (!MovingCompleted)))
  176. {
  177. //foreach (var monitorHandler in _lstMonitorHandler)
  178. //{
  179. // _lstHandler.AddLast(monitorHandler);
  180. //}
  181. Thread.Sleep(500);
  182. handler = new HirataR4RobotMonitorRobotStatusHandler(this);
  183. _connection.Execute(handler);
  184. return true;
  185. }
  186. _trigActionDone.CLK = (_lstHandler.Count == 0 && (!_connection.IsBusy)&&
  187. (IsOnLine) && (ACalCompleted) && (MovingCompleted));
  188. if (_trigActionDone.Q)
  189. OnActionDone(null);
  190. if (_lstHandler.Count > 0)
  191. {
  192. if (!_connection.IsBusy)
  193. {
  194. if ((IsOnLine) && (ACalCompleted) && (MovingCompleted))
  195. {
  196. handler = _lstHandler.First.Value;
  197. _lstHandler.RemoveFirst();
  198. }
  199. else
  200. {
  201. Thread.Sleep(100);
  202. handler = new HirataR4RobotMonitorRobotStatusHandler(this);
  203. }
  204. _connection.Execute(handler);
  205. }
  206. }
  207. if(_connection.IsBusy)
  208. {
  209. _connection.MonitorTimeout();
  210. _trigCommunicationError.CLK = _connection.IsCommunicationError;
  211. if (_trigCommunicationError.Q)
  212. {
  213. _lstHandler.Clear();
  214. //EV.PostAlarmLog(Module, $"{Module}.{Name} communication error, {_connection.LastCommunicationError}");
  215. OnError($"{Module}.{Name} communication error, {_connection.LastCommunicationError}");
  216. //_trigActionDone.CLK = true;
  217. }
  218. }
  219. }
  220. }
  221. catch (Exception ex)
  222. {
  223. LOG.Write(ex);
  224. }
  225. return true;
  226. }
  227. public override void Monitor()
  228. {
  229. try
  230. {
  231. }
  232. catch (Exception ex)
  233. {
  234. LOG.Write(ex);
  235. }
  236. }
  237. public override void Reset()
  238. {
  239. _trigError.RST = true;
  240. _connection.SetCommunicationError(false, "");
  241. _trigCommunicationError.RST = true;
  242. _enableLog = SC.GetValue<bool>($"{_scRoot}.{Name}.EnableLogMessage");
  243. _connection.EnableLog(_enableLog);
  244. _trigRetryConnect.RST = true;
  245. //base.Reset();
  246. }
  247. #region Command Functions
  248. public void PerformRawCommand(string command, string comandArgument)
  249. {
  250. lock (_locker)
  251. {
  252. _lstHandler.AddLast(new HirataR4RobotRawCommandHandler(this, command, comandArgument));
  253. }
  254. }
  255. public void PerformRawCommand(string command)
  256. {
  257. lock (_locker)
  258. {
  259. _lstHandler.AddLast(new HirataR4RobotRawCommandHandler(this, command));
  260. }
  261. }
  262. public bool WritePosition(int address, float x, float y, float z, float w,
  263. string Mdata, string Fcode, string Scode)
  264. {
  265. int intFcode,intScode;
  266. string strMdata;
  267. if (!int.TryParse(Fcode, out intFcode)) return false;
  268. if (!int.TryParse(Scode, out intScode)) return false;
  269. if (intFcode < 0 || intFcode > 99 || intScode < 0 || intScode > 99)
  270. {
  271. EV.PostAlarmLog("Robot", "Robot postion data format is not correct");
  272. return false;
  273. }
  274. if (!int.TryParse(Mdata, out _)) strMdata = "??";
  275. else strMdata = (Convert.ToInt32(Mdata) < 0 || Convert.ToInt32(Mdata) > 99) ?
  276. "??" : Mdata.ToString().PadLeft(2, '0');
  277. lock (_locker)
  278. {
  279. _lstHandler.AddLast(new HirataR4RobotWritePositionHandler(this, address, x, y, z, w, 0, 0,
  280. "R", strMdata, Fcode.ToString().PadLeft(2, '0'),
  281. Scode.ToString().PadLeft(2, '0')));
  282. }
  283. return true;
  284. }
  285. protected override bool fStop(object[] param)
  286. {
  287. MoveStop();
  288. return true;
  289. }
  290. public void MoveStop()
  291. {
  292. lock (_locker)
  293. {
  294. _lstHandler.Clear();
  295. _lstMonitorHandler.Clear();
  296. _connection.ForceClear();
  297. _connection.Execute(new HirataR4RobotSimpleActionHandler(this, "GD"));
  298. _connection.ForceClear();
  299. }
  300. }
  301. public void MoveReset()
  302. {
  303. lock (_locker)
  304. {
  305. _lstHandler.AddLast(new HirataR4RobotSimpleActionHandler(this, "GE"));
  306. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  307. }
  308. }
  309. public void ErrorClear()
  310. {
  311. lock (_locker)
  312. {
  313. _lstHandler.AddLast(new HirataR4RobotSimpleActionHandler(this, "CL"));
  314. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  315. }
  316. }
  317. public void MonitorRawCommand(bool isSelected, string command, string comandArgument)
  318. {
  319. lock (_locker)
  320. {
  321. string msg = comandArgument == null ? $"{command}\r" : $"{command} {comandArgument}\r";
  322. var existHandlers = _lstMonitorHandler.Where(handler => handler.GetType() == typeof(HirataR4RobotRawCommandHandler) && ((HirataR4RobotRawCommandHandler)handler)._parameter == comandArgument);
  323. if (isSelected)
  324. {
  325. if (!existHandlers.Any())
  326. _lstMonitorHandler.AddFirst(new HirataR4RobotRawCommandHandler(this, command, comandArgument));
  327. }
  328. else
  329. {
  330. if (existHandlers.Any())
  331. {
  332. _lstMonitorHandler.Remove(existHandlers.First());
  333. }
  334. }
  335. }
  336. }
  337. public void MonitorRawCommand(bool isSelected, string command)
  338. {
  339. lock (_locker)
  340. {
  341. var existHandlers = _lstMonitorHandler.Where(handler => handler.GetType() == typeof(HirataR4RobotRawCommandHandler) && ((HirataR4RobotRawCommandHandler)handler)._parameter == null);
  342. if (isSelected)
  343. {
  344. if (!existHandlers.Any())
  345. _lstMonitorHandler.AddFirst(new HirataR4RobotRawCommandHandler(this, command));
  346. }
  347. else
  348. {
  349. if (existHandlers.Any())
  350. {
  351. _lstMonitorHandler.Remove(existHandlers.First());
  352. }
  353. }
  354. }
  355. }
  356. public void ReadPosition(int address)
  357. {
  358. _lstHandler.AddLast(new HirataR4RobotReadRobotPositionHandler(this, address));
  359. }
  360. public void RobotConnected(bool isSelected)
  361. {
  362. lock (_locker)
  363. {
  364. var existHandlers = _lstMonitorHandler.Where(handler => handler.GetType() == typeof(HirataR4RobotMonitorRobotConnectedHandler));
  365. if (isSelected)
  366. {
  367. if (!existHandlers.Any())
  368. _lstMonitorHandler.AddFirst(new HirataR4RobotMonitorRobotConnectedHandler(this));
  369. }
  370. else
  371. {
  372. if (existHandlers.Any())
  373. {
  374. _lstMonitorHandler.Remove(existHandlers.First());
  375. }
  376. }
  377. }
  378. }
  379. #endregion
  380. #region Properties
  381. public bool Connected { get; private set; }
  382. public string Error { get; private set; }
  383. public string RobotStatus { get; private set; }
  384. public bool IsOnLine { get; private set; }
  385. public bool IsManual { get; private set; }
  386. public bool IsAuto { get; private set; }
  387. public bool IsStop { get; private set; }
  388. public bool IsES { get; private set; }
  389. public bool IsZaxisSafeZone { get; private set; }
  390. public bool MovingCompleted { get; private set; }
  391. public bool ACalCompleted { get; private set; }
  392. public bool ExecutionComplete { get; private set; }
  393. public string AddressOutSide { get; private set; }
  394. public string PositionOutSide { get; private set; }
  395. public string EmergencyStop { get; private set; }
  396. public string XLowerSide { get; private set; }
  397. public string XUpperSide { get; private set; }
  398. public string YLowerSide { get; private set; }
  399. public string YUpperSide { get; private set; }
  400. public string ZLowerSide { get; private set; }
  401. public string ZUpperSide { get; private set; }
  402. public string ReadRobotPositonData { get; private set; }
  403. public float ReadXPosition { get; private set; }
  404. public float ReadYPosition { get; private set; }
  405. public float ReadZPosition { get; private set; }
  406. public float ReadWPosition { get; private set; }
  407. public float ReadRPosition { get; private set; }
  408. public float ReadCPosition { get; private set; }
  409. public string RobotPosture { get; private set; }
  410. public string MData { get; private set; }
  411. public string FCode { get; private set; }
  412. public string SCode { get; private set; }
  413. public string ExtPara_MapWaferCount { get; private set; }
  414. public string ExtPara_WaferThickness { get; private set; }
  415. public string ExtPara_PositionRange { get; private set; }
  416. public string ExtPara_Pitch { get; private set; }
  417. public string ExtPara_WaferMinThickness { get; private set; }
  418. public string ExtPara_Filter { get; private set; }
  419. #endregion
  420. public string MapExistInfor { get; private set; }
  421. public string MapNGInfor { get; private set; }
  422. public string CurrentReadExtParaNO { get; private set; }
  423. public string CurrentReadExtParaValue { get; private set; }
  424. private ModuleName _currentMotionStation;
  425. private int _currentMotionSlot;
  426. private RobotArmEnum _currentMotionArm;
  427. #region Note Functions
  428. private R_TRIG _trigWarningMessage = new R_TRIG();
  429. public void NoteRobotDIByte(string data, int offset)
  430. {
  431. int tempvalue;
  432. if (!int.TryParse(data.Replace(Encoding.ASCII.GetString(new byte[] { 0x3}),""), out tempvalue)) return;
  433. di_Values[offset, 0] = ((tempvalue & 0x1) == 0x1);
  434. di_Values[offset, 1] = ((tempvalue & 0x2) == 0x2);
  435. di_Values[offset, 2] = ((tempvalue & 0x4) == 0x4);
  436. di_Values[offset, 3] = ((tempvalue & 0x8) == 0x8);
  437. di_Values[offset, 4] = ((tempvalue & 0x10) == 0x10);
  438. di_Values[offset, 5] = ((tempvalue & 0x10) == 0x20);
  439. di_Values[offset, 6] = ((tempvalue & 0x10) == 0x40);
  440. di_Values[offset, 7] = ((tempvalue & 0x10) == 0x80);
  441. }
  442. public void NoteError(string errorData)
  443. {
  444. if (errorData != null)
  445. {
  446. EV.PostAlarmLog("Robot", $"Robot occurred error:{errorData}");
  447. Error = errorData;
  448. ParseErrorData(errorData);
  449. }
  450. else
  451. {
  452. Error = null;
  453. }
  454. }
  455. private void ParseErrorData(string errorData)
  456. {
  457. errorData = errorData.Remove(0, 1);
  458. ParseStatusData(errorData);
  459. ErrorCode = errorData.Remove(0, 4);
  460. var statusArray = errorData.ToArray();
  461. char E1 = statusArray[5];
  462. char E2 = statusArray[4];
  463. char XErr = statusArray[6];
  464. char YErr = statusArray[7];
  465. char ZErr = statusArray[8];
  466. char WErr = statusArray[9];
  467. //char RErr = statusArray[10];
  468. //char CErr = statusArray[11];
  469. if (E2 == '0' && E1 == '9')
  470. {
  471. if (XErr == '1')
  472. {
  473. XLowerSide = "true";
  474. }
  475. else if (XErr == '2')
  476. {
  477. XUpperSide = "true";
  478. }
  479. if (YErr == '1')
  480. {
  481. YLowerSide = "true";
  482. }
  483. else if (YErr == '2')
  484. {
  485. YUpperSide = "true";
  486. }
  487. if (ZErr == '1')
  488. {
  489. ZLowerSide = "true";
  490. }
  491. else if (ZErr == '2')
  492. {
  493. ZUpperSide = "true";
  494. }
  495. }
  496. else if (E2 == '1' && E1 == '0')
  497. {
  498. EmergencyStop = "true";
  499. }
  500. else if (E2 == '2' && E1 == '0')
  501. {
  502. }
  503. else if (E2 == '3' && E1 == '0')
  504. {
  505. AddressOutSide = "true";
  506. }
  507. else if (E2 == '3' && E1 == '1')
  508. {
  509. }
  510. else if (E2 == '4' && E1 == '0')
  511. {
  512. PositionOutSide = "true";
  513. }
  514. OnError($"ErrorCode:{ErrorCode}");
  515. }
  516. public override void OnError(string errortext)
  517. {
  518. if (RobotState != RobotStateEnum.Error)
  519. {
  520. _lstHandler.Clear();
  521. _lstMonitorHandler.Clear();
  522. _connection.ForceClear();
  523. base.OnError(errortext);
  524. }
  525. }
  526. public void NoteRobotStatus(string statusData)
  527. {
  528. if (statusData != null)
  529. {
  530. RobotStatus = statusData;
  531. ParseStatusData(statusData);
  532. }
  533. else
  534. {
  535. Error = null;
  536. }
  537. }
  538. private void ParseStatusData(string statusData)
  539. {
  540. var statusArray = statusData.ToArray();
  541. int S1 = statusArray[3] - '0';
  542. int S2 = statusArray[2] - '0';
  543. int S3 = statusArray[1] - '0';
  544. int S4 = statusArray[0] - '0';
  545. IsOnLine = ((S1 & 0x1)==0x1);
  546. IsManual = ((S1 & 0x2) ==0x2);
  547. IsAuto = ((S1 & 0x4) == 0x4);
  548. IsStop = ((S2 & 1)==1);
  549. IsES = (S2 & 2)==2;
  550. IsZaxisSafeZone = (S3 & 1) == 1;
  551. MovingCompleted = (S3 & 2)==2;
  552. ACalCompleted = (S3 & 4)==4;
  553. ExecutionComplete = (S4 & 4) != 4;
  554. }
  555. internal void NoteRobotPositon(string positionData)
  556. {
  557. ReadRobotPositonData = positionData;
  558. ParseRobotPositon(positionData);
  559. }
  560. //"123.45-123.45 123.45 123.45-123.45 123.45 R 0 1 90 0" "-123.45-123.45 123.45 123.45-123.45 123.45 R 0 1 90 0"
  561. private void ParseRobotPositon(string statusData)
  562. {
  563. List<string> strList = new List<string>();
  564. var statusArray = statusData.ToArray();
  565. int segmentStartIndex = 0;
  566. for (int index = 0; index < statusArray.Length; index++)
  567. {
  568. if ((statusArray[index] == '-' || statusArray[index] == ' ') && index > 0)
  569. {
  570. strList.Add(statusData.Substring(segmentStartIndex, index - segmentStartIndex).Trim());
  571. segmentStartIndex = index;
  572. }
  573. }
  574. strList.Add(statusData.Substring(segmentStartIndex, statusArray.Length - segmentStartIndex).Trim());
  575. if (Axis == 6)
  576. {
  577. float tempvalue;
  578. if (float.TryParse(strList[0], out tempvalue))
  579. ReadXPosition = tempvalue;
  580. if(float.TryParse(strList[1], out tempvalue))
  581. ReadYPosition = tempvalue;
  582. if (float.TryParse(strList[2], out tempvalue))
  583. ReadZPosition = tempvalue;
  584. if (float.TryParse(strList[3], out tempvalue))
  585. ReadWPosition = tempvalue;
  586. if (float.TryParse(strList[4], out tempvalue))
  587. ReadRPosition = tempvalue;
  588. if (float.TryParse(strList[5], out tempvalue))
  589. ReadCPosition = tempvalue;
  590. RobotPosture = strList[6];
  591. MData = strList[8];
  592. FCode = strList[9];
  593. SCode = strList[10];
  594. }
  595. else
  596. {
  597. float tempvalue;
  598. if (float.TryParse(strList[0], out tempvalue))
  599. ReadXPosition = tempvalue;
  600. if (float.TryParse(strList[1], out tempvalue))
  601. ReadYPosition = tempvalue;
  602. if (float.TryParse(strList[2], out tempvalue))
  603. ReadZPosition = tempvalue;
  604. if (float.TryParse(strList[3], out tempvalue))
  605. ReadWPosition = tempvalue;
  606. RobotPosture = strList[4];
  607. MData = strList[6];
  608. FCode = strList[7];
  609. SCode = strList[8];
  610. }
  611. }
  612. public void ParseReadData(string cmd,string paraname,string data)
  613. {
  614. switch(cmd)
  615. {
  616. case "LE":
  617. CurrentReadExtParaNO = paraname;
  618. CurrentReadExtParaValue = data;
  619. if (paraname == "100") MapExistInfor = ParSlotMapData(data);
  620. if (paraname == "101") MapNGInfor = ParSlotMapData(data);
  621. int intParaNO;
  622. if (!int.TryParse(paraname, out intParaNO)) break;
  623. if(intParaNO >= 112 && intParaNO <=154)
  624. {
  625. if ((intParaNO - 112) % 5 == 0) ExtPara_MapWaferCount = data;
  626. }
  627. if (intParaNO >= 610 && intParaNO <= 654)
  628. {
  629. if ((intParaNO - 610) % 5 == 0) ExtPara_WaferThickness = data;
  630. if ((intParaNO - 611) % 5 == 0) ExtPara_PositionRange = data;
  631. if ((intParaNO - 612) % 5 == 0) ExtPara_Pitch = data;
  632. if ((intParaNO - 613) % 5 == 0) ExtPara_WaferMinThickness = data;
  633. if ((intParaNO - 614) % 5 == 0) ExtPara_Filter = data;
  634. }
  635. break;
  636. case "LR":
  637. if (paraname == null) ParseCurrentPostion(data);
  638. break;
  639. default:
  640. break;
  641. }
  642. }
  643. private void ParseCurrentPostion(string data)
  644. {
  645. List<string> strList = new List<string>();
  646. var statusArray = data.ToArray();
  647. int segmentStartIndex = 0;
  648. for (int index = 0; index < statusArray.Length; index++)
  649. {
  650. if ((statusArray[index] == '-' || statusArray[index] == ' ') && index > 0)
  651. {
  652. strList.Add(data.Substring(segmentStartIndex, index - segmentStartIndex).Trim());
  653. segmentStartIndex = index;
  654. }
  655. }
  656. strList.Add(data.Substring(segmentStartIndex, statusArray.Length - segmentStartIndex).Trim());
  657. if (Axis == 6)
  658. {
  659. if(strList.Count <6)
  660. {
  661. EV.PostAlarmLog("Robot", $"Received wrong position data:{data}");
  662. return;
  663. }
  664. float tempvalue;
  665. if (float.TryParse(strList[0], out tempvalue))
  666. PositionAxis1 = tempvalue;
  667. if (float.TryParse(strList[1], out tempvalue))
  668. PositionAxis2 = tempvalue;
  669. if (float.TryParse(strList[2], out tempvalue))
  670. PositionAxis3 = tempvalue;
  671. if (float.TryParse(strList[3], out tempvalue))
  672. PositionAxis4 = tempvalue;
  673. if (float.TryParse(strList[4], out tempvalue))
  674. PositionAxis5 = tempvalue;
  675. if (float.TryParse(strList[5], out tempvalue))
  676. PositionAxis6 = tempvalue;
  677. }
  678. else
  679. {
  680. if (strList.Count < 4)
  681. {
  682. EV.PostAlarmLog("Robot", $"Received wrong position data:{data}");
  683. return;
  684. }
  685. float tempvalue;
  686. if (float.TryParse(strList[0], out tempvalue))
  687. PositionAxis1 = tempvalue;
  688. if (float.TryParse(strList[1], out tempvalue))
  689. PositionAxis2 = tempvalue;
  690. if (float.TryParse(strList[2], out tempvalue))
  691. PositionAxis3 = tempvalue;
  692. if (float.TryParse(strList[3], out tempvalue))
  693. PositionAxis4 = tempvalue;
  694. }
  695. }
  696. private string ParSlotMapData(string data)
  697. {
  698. string ret = "";
  699. int ivalue;
  700. string svalut = data.Replace(Encoding.ASCII.GetString(new byte[] { 0x3}), "");
  701. if (!int.TryParse(svalut, out ivalue)) return "0000000000000000000000000";
  702. for(int i=0;i<25;i++)
  703. {
  704. if ((ivalue & (int)Math.Pow(2, i)) == (int)Math.Pow(2, i))
  705. ret = ret + "1";
  706. else
  707. ret = ret + "0";
  708. }
  709. return ret;
  710. }
  711. internal void NoteRobotConnected(bool connected)
  712. {
  713. Connected = connected;
  714. }
  715. internal void NoteRawCommandInfo(string command, string data)
  716. {
  717. var curIOResponse = IOResponseList.Find(res => res.SourceCommandName == command);
  718. if (curIOResponse != null)
  719. {
  720. IOResponseList.Remove(curIOResponse);
  721. }
  722. IOResponseList.Add(new IOResponse() { SourceCommandName = command, ResonseContent = data, ResonseRecievedTime = DateTime.Now });
  723. }
  724. #endregion
  725. protected override bool fStartTransferWafer(object[] param)
  726. {
  727. return true;
  728. }
  729. protected override bool fStartUnGrip(object[] param)
  730. {
  731. RobotArmEnum arm = (RobotArmEnum)param[0];
  732. if (arm == RobotArmEnum.Lower)
  733. {
  734. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 1, true));
  735. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 0, false));
  736. }
  737. if(arm == RobotArmEnum.Upper)
  738. {
  739. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 3, true));
  740. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 2, false));
  741. }
  742. if(arm == RobotArmEnum.Both)
  743. {
  744. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 1, true));
  745. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 0, false));
  746. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 3, true));
  747. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 2, false));
  748. }
  749. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  750. return true;
  751. }
  752. protected override bool fStartGrip(object[] param)
  753. {
  754. RobotArmEnum arm = (RobotArmEnum)param[0];
  755. if (arm == RobotArmEnum.Lower)
  756. {
  757. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 0, true));
  758. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 1, false));
  759. }
  760. if (arm == RobotArmEnum.Upper)
  761. {
  762. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 2, true));
  763. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 3, false));
  764. }
  765. if (arm == RobotArmEnum.Both)
  766. {
  767. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 0, true));
  768. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 1, false));
  769. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 2, true));
  770. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 3, false));
  771. }
  772. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  773. return true;
  774. }
  775. protected override bool fStartGoTo(object[] param)
  776. {
  777. try
  778. {
  779. if (param.Length == 1)
  780. {
  781. int address = Convert.ToInt16(param[0]);
  782. lock (_locker)
  783. {
  784. _lstHandler.AddLast(new HirataR4RobotMoveToPositionHandler(this, address));
  785. }
  786. }
  787. if (param.Length >= 8)
  788. {
  789. RobotArmEnum arm = (RobotArmEnum)param[0];
  790. string station = param[1].ToString();
  791. int slotindex = (int)param[2];
  792. RobotPostionEnum pos = (RobotPostionEnum)param[3];
  793. float xoffset = (float)param[4];
  794. float yoffset = (float)param[5];
  795. float zoffset = (float)param[6];
  796. float woffset = (float)param[7];
  797. ModuleName stationname = (ModuleName)Enum.Parse(typeof(ModuleName), station);
  798. WaferSize wz = WaferManager.Instance.GetWaferSize(stationname, slotindex);
  799. int address = GetBaseAddress(stationname, wz);
  800. float waferpitch = GetWaferPitch(stationname, wz);
  801. float insertdistance = GetInsertDistance(stationname, wz);
  802. float slowupdistance = GetSlowUpDistance(stationname, wz);
  803. zoffset += waferpitch * slotindex;
  804. if (arm == RobotArmEnum.Lower || arm == RobotArmEnum.Both)
  805. zoffset += _armPitch;
  806. if (pos == RobotPostionEnum.PickReady)
  807. {
  808. lock (_locker)
  809. {
  810. _lstHandler.AddLast(new HirataR4RobotMoveToPositionWithDeviationHandler(this, "A",
  811. address, xoffset, yoffset, zoffset, woffset));
  812. }
  813. }
  814. else if (pos == RobotPostionEnum.PlaceReady)
  815. {
  816. zoffset += slowupdistance;
  817. lock (_locker)
  818. {
  819. _lstHandler.AddLast(new HirataR4RobotMoveToPositionWithDeviationHandler(this, "A",
  820. address, xoffset, yoffset, zoffset, woffset));
  821. }
  822. }
  823. else
  824. {
  825. EV.PostAlarmLog("Robot", $"Robot doesn't support goto {pos} now.");
  826. return false;
  827. }
  828. }
  829. if (param.Length == 6|| param.Length == 7)
  830. {
  831. string motion = param[0].ToString();
  832. string address = param[1].ToString();
  833. float x, y, z, w;
  834. if (!float.TryParse(param[2].ToString(), out x)) return false;
  835. if (!float.TryParse(param[3].ToString(), out y)) return false;
  836. if (!float.TryParse(param[4].ToString(), out z)) return false;
  837. if (!float.TryParse(param[5].ToString(), out w)) return false;
  838. if (param.Length >= 7 && param[6].ToString() == "-")
  839. {
  840. x = x * -1;
  841. y = y * -1;
  842. z = z * -1;
  843. w = w * -1;
  844. }
  845. lock (_locker)
  846. {
  847. if (address == "*")
  848. _lstHandler.AddLast(new HirataR4RobotMoveDeviationHandler(this, motion, x, y, z, w));
  849. else
  850. {
  851. int intaddress;
  852. if (!int.TryParse(address, out intaddress)) return false;
  853. _lstHandler.AddLast(new HirataR4RobotMoveToPositionWithDeviationHandler(this, motion, intaddress, x, y, z, w));
  854. }
  855. ReadCurrentPostion();
  856. }
  857. }
  858. }
  859. catch(Exception ex)
  860. {
  861. EV.PostAlarmLog("Robot","Robot Goto execution failed.");
  862. LOG.Write(ex);
  863. return false;
  864. }
  865. return true;
  866. }
  867. protected override bool fStartMapWafer(object[] param)
  868. {
  869. ModuleName module = (ModuleName)param[0];
  870. int[] mappingaddress = GetMappingAddress(module);
  871. if (mappingaddress == null || mappingaddress.Length !=6) return false;
  872. _currentMotionStation = module;
  873. int thicknessIndex = 0;
  874. if (param.Length > 1)
  875. thicknessIndex = Convert.ToInt32(param[1]);
  876. EV.PostInfoLog(Module, $"Start mapping, {module} thickness type {thicknessIndex} ");
  877. if (thicknessIndex > 0 && thicknessIndex < 10)
  878. {
  879. lock (_locker)
  880. {
  881. _lstHandler.AddLast(new HirataR4RobotReadRobotPositionHandler(this, mappingaddress[1]));
  882. }
  883. int waitCount = 0;
  884. while(_lstHandler.Count !=0 ||_connection.IsBusy)
  885. {
  886. waitCount++;
  887. Thread.Sleep(10);
  888. if(waitCount >100)
  889. {
  890. OnError("MappingTimeout");
  891. IsBusy = false;
  892. return false;
  893. }
  894. }
  895. lock (_locker)
  896. {
  897. _lstHandler.AddLast(new HirataR4RobotWriteMdataOnCurrenPositionHandler(this, mappingaddress[1], $"0{thicknessIndex}"));
  898. }
  899. }
  900. lock (_locker)
  901. {
  902. _lstHandler.AddLast(new HirataR4RobotMoveToPositionHandler(this, mappingaddress[0], null));
  903. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  904. _lstHandler.AddLast(new HirataR4RobotMoveToPositionHandler(this, mappingaddress[1], null));
  905. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  906. _lstHandler.AddLast(new HirataR4RobotRawCommandHandler(this, "SM", "1"));
  907. _lstHandler.AddLast(new HirataR4RobotMoveToPositionHandler(this, mappingaddress[2], null));
  908. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  909. _lstHandler.AddLast(new HirataR4RobotMoveToPositionHandler(this, mappingaddress[3], null));
  910. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  911. _lstHandler.AddLast(new HirataR4RobotMoveToPositionHandler(this, mappingaddress[4], null));
  912. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  913. _lstHandler.AddLast(new HirataR4RobotReadHandler(this, "LE", "100"));
  914. _lstHandler.AddLast(new HirataR4RobotReadHandler(this, "LE", "101"));
  915. _lstHandler.AddLast(new HirataR4RobotRawCommandHandler(this, "SM", "0")); //Close laser
  916. _lstHandler.AddLast(new HirataR4RobotMoveToPositionHandler(this, mappingaddress[5], null));
  917. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  918. ReadCurrentPostion();
  919. }
  920. return true;
  921. }
  922. protected override bool fMapComplete(object[] param)
  923. {
  924. char[] exists = MapExistInfor.ToArray();
  925. char[] ngs = MapNGInfor.ToArray();
  926. for (int i = 0; i < 25; i++)
  927. {
  928. if (ngs[i] != '0') exists[i] = '2';
  929. }
  930. NotifySlotMapResult(_currentMotionStation, new string(exists));
  931. return base.fMapComplete(param);
  932. }
  933. protected override bool fStartSwapWafer(object[] param)
  934. {
  935. if (param.Length < 3) return false;
  936. RobotArmEnum arm = (RobotArmEnum)param[0];
  937. ModuleName station = (ModuleName)Enum.Parse(typeof(ModuleName), (string)param[1]);
  938. int slot = (int)param[2];
  939. _currentMotionStation = station;
  940. _currentMotionSlot = slot;
  941. _currentMotionArm = arm;
  942. float xoffset = 0;
  943. float yoffset = 0;
  944. float zoffset = 0;
  945. float woffset = 0;
  946. if (param.Length >= 7)
  947. {
  948. xoffset = (float)param[3];
  949. yoffset = (float)param[4];
  950. zoffset = (float)param[5];
  951. woffset = (float)param[6];
  952. }
  953. WaferSize wafersize = WaferManager.Instance.GetWaferSize(station,slot);
  954. int address = GetBaseAddress(station, wafersize);
  955. zoffset = zoffset + (slot) * GetWaferPitch(station, wafersize) + _armPitch;
  956. float insertdistance = GetInsertDistance(station, wafersize);
  957. float slowupdistance = GetSlowUpDistance(station, wafersize);
  958. lock (_locker)
  959. {
  960. if (arm == RobotArmEnum.Lower)
  961. {
  962. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  963. _lstHandler.AddLast(new HirataR4RobotMoveToPositionWithDeviationHandler(this, "A", address, xoffset, yoffset, zoffset + _armPitch, woffset));
  964. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  965. _lstHandler.AddLast(new HirataR4RobotMoveDeviationHandler(this, "I", insertdistance, 0, 0, 0));
  966. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  967. _lstHandler.AddLast(new HirataR4RobotMoveDeviationHandler(this, "U", 0, 0, slowupdistance, 0));
  968. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  969. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 0, true));
  970. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 1, false));
  971. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  972. _lstHandler.AddLast(new HirataR4RobotMoveDeviationHandler(this, "I", (-1) * insertdistance, insertdistance, 0, 0));
  973. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  974. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 3, true));
  975. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 2, false));
  976. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  977. _lstHandler.AddLast(new HirataR4RobotMoveDeviationHandler(this, "U", 0, 0, -(slowupdistance+ _armPitch), 0));
  978. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  979. _lstHandler.AddLast(new HirataR4RobotMoveDeviationHandler(this, "I", 0, -insertdistance, 0, 0));
  980. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  981. _lstHandler.AddLast(new HirataR4RobotReadDIByteHandler(this, 0));
  982. //WaferManager.Instance.WaferMoved( station, slot, ModuleName.Robot, 0);
  983. //WaferManager.Instance.WaferMoved(ModuleName.Robot, 1,station, slot);
  984. }
  985. if (arm == RobotArmEnum.Upper)
  986. {
  987. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  988. _lstHandler.AddLast(new HirataR4RobotMoveToPositionWithDeviationHandler(this, "A", address, xoffset, yoffset, zoffset, woffset));
  989. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  990. _lstHandler.AddLast(new HirataR4RobotMoveDeviationHandler(this, "I", 0, insertdistance, 0, 0));
  991. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  992. _lstHandler.AddLast(new HirataR4RobotMoveDeviationHandler(this, "U", 0, 0, slowupdistance+_armPitch, 0));
  993. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  994. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 2, true));
  995. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 3, false));
  996. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  997. _lstHandler.AddLast(new HirataR4RobotMoveDeviationHandler(this, "I", insertdistance, -insertdistance, 0, 0));
  998. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  999. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 1, true));
  1000. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 0, false));
  1001. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1002. _lstHandler.AddLast(new HirataR4RobotMoveDeviationHandler(this, "U", 0, 0, -slowupdistance, 0));
  1003. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1004. _lstHandler.AddLast(new HirataR4RobotMoveDeviationHandler(this, "I", -insertdistance,0, 0, 0));
  1005. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1006. _lstHandler.AddLast(new HirataR4RobotReadDIByteHandler(this, 0));
  1007. //WaferManager.Instance.WaferMoved(station, slot, ModuleName.Robot, 1);
  1008. //WaferManager.Instance.WaferMoved(ModuleName.Robot, 0, station, slot);
  1009. }
  1010. ReadCurrentPostion();
  1011. return true;
  1012. }
  1013. }
  1014. protected override bool fSwapComplete(object[] param)
  1015. {
  1016. if (GetWaferState(_currentMotionArm) == RobotArmWaferStateEnum.Present || isSimulatorMode)
  1017. {
  1018. if (_currentMotionArm == RobotArmEnum.Lower || _currentMotionArm == RobotArmEnum.Upper)
  1019. WaferManager.Instance.WaferMoved(_currentMotionStation, _currentMotionSlot,
  1020. ModuleName.Robot, (int)_currentMotionArm);
  1021. else
  1022. {
  1023. WaferManager.Instance.WaferMoved(_currentMotionStation, _currentMotionSlot,
  1024. ModuleName.Robot, 0);
  1025. WaferManager.Instance.WaferMoved(_currentMotionStation, _currentMotionSlot + 1,
  1026. ModuleName.Robot, 1);
  1027. }
  1028. }
  1029. else
  1030. {
  1031. _lstHandler.Clear();
  1032. OnError($"Detect wafer absent on {_currentMotionArm}");
  1033. }
  1034. RobotArmEnum otherarm = GetAnotherArm(_currentMotionArm);
  1035. if (GetWaferState(otherarm) == RobotArmWaferStateEnum.Present)
  1036. {
  1037. if (otherarm == RobotArmEnum.Lower || otherarm == RobotArmEnum.Upper)
  1038. WaferManager.Instance.WaferMoved(ModuleName.Robot, (int)otherarm,
  1039. _currentMotionStation, _currentMotionSlot);
  1040. else
  1041. {
  1042. WaferManager.Instance.WaferMoved(ModuleName.Robot, 0,
  1043. _currentMotionStation, _currentMotionSlot);
  1044. WaferManager.Instance.WaferMoved(ModuleName.Robot, 1,
  1045. _currentMotionStation, _currentMotionSlot + 1);
  1046. }
  1047. }
  1048. else
  1049. {
  1050. _lstHandler.Clear();
  1051. OnError($"Detect wafer present on {_currentMotionArm}");
  1052. }
  1053. return base.fSwapComplete(param);
  1054. }
  1055. protected override bool fStartPlaceWafer(object[] param)
  1056. {
  1057. if (param.Length < 3) return false;
  1058. RobotArmEnum arm = (RobotArmEnum)param[0];
  1059. ModuleName station = (ModuleName)Enum.Parse(typeof(ModuleName), (string)param[1]); ;
  1060. int slot = (int)param[2];
  1061. _currentMotionStation = station;
  1062. _currentMotionSlot = slot;
  1063. _currentMotionArm = arm;
  1064. float xoffset = 0;
  1065. float yoffset = 0;
  1066. float zoffset = 0;
  1067. float woffset = 0;
  1068. if (param.Length >= 7)
  1069. {
  1070. xoffset = (float)param[3];
  1071. yoffset = (float)param[4];
  1072. zoffset = (float)param[5];
  1073. woffset = (float)param[6];
  1074. }
  1075. WaferSize wafersize = WaferManager.Instance.GetWaferSize(ModuleName.Robot,
  1076. (int)(arm == RobotArmEnum.Both ? RobotArmEnum.Lower : arm));
  1077. float insertdistance = GetInsertDistance(station, wafersize);
  1078. float slowupdistance = GetSlowUpDistance(station, wafersize);
  1079. int address = GetBaseAddress(station, wafersize);
  1080. zoffset = zoffset + (slot) * GetWaferPitch(station, wafersize) + slowupdistance;
  1081. lock (_locker)
  1082. {
  1083. if (arm == RobotArmEnum.Lower)
  1084. {
  1085. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1086. _lstHandler.AddLast(new HirataR4RobotMoveToPositionWithDeviationHandler(this, "A", address, xoffset, yoffset, zoffset+ _armPitch, woffset));
  1087. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1088. _lstHandler.AddLast(new HirataR4RobotMoveDeviationHandler(this, "I", insertdistance, 0, 0, 0));
  1089. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1090. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 1, true));
  1091. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 0, false));
  1092. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1093. _lstHandler.AddLast(new HirataR4RobotMoveDeviationHandler(this, "U", 0, 0, (-1)*slowupdistance, 0));
  1094. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1095. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 0, true));
  1096. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 1, false));
  1097. _lstHandler.AddLast(new HirataR4RobotWaferInforMoveHandler(this, 0, false));
  1098. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 1, true));
  1099. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 0, false));
  1100. _lstHandler.AddLast(new HirataR4RobotMoveDeviationHandler(this, "I", (-1) * insertdistance, 0, 0, 0));
  1101. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1102. _lstHandler.AddLast(new HirataR4RobotReadDIByteHandler(this, 0));
  1103. //WaferManager.Instance.WaferMoved(ModuleName.Robot, 0, station, slot);
  1104. }
  1105. if (arm == RobotArmEnum.Upper)
  1106. {
  1107. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1108. _lstHandler.AddLast(new HirataR4RobotMoveToPositionWithDeviationHandler(this, "A", address, xoffset, yoffset, zoffset, woffset));
  1109. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1110. _lstHandler.AddLast(new HirataR4RobotMoveDeviationHandler(this, "I", 0, insertdistance, 0, 0));
  1111. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1112. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 3, true));
  1113. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 2, false));
  1114. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1115. _lstHandler.AddLast(new HirataR4RobotMoveDeviationHandler(this, "U", 0, 0, (-1)*slowupdistance, 0));
  1116. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1117. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 2, true));
  1118. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 3, false));
  1119. _lstHandler.AddLast(new HirataR4RobotWaferInforMoveHandler(this, 0, false));
  1120. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 3, true));
  1121. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 2, false));
  1122. _lstHandler.AddLast(new HirataR4RobotMoveDeviationHandler(this, "I", 0, (-1) * insertdistance, 0, 0));
  1123. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1124. _lstHandler.AddLast(new HirataR4RobotReadDIByteHandler(this, 0));
  1125. //WaferManager.Instance.WaferMoved(ModuleName.Robot, 1, station, slot);
  1126. }
  1127. if (arm == RobotArmEnum.Both)
  1128. {
  1129. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1130. _lstHandler.AddLast(new HirataR4RobotMoveToPositionWithDeviationHandler(this, "A", address, xoffset, yoffset, zoffset + _armPitch, woffset));
  1131. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1132. _lstHandler.AddLast(new HirataR4RobotMoveDeviationHandler(this, "I", insertdistance, insertdistance, 0, 0));
  1133. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1134. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 1, true));
  1135. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 0, false));
  1136. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 3, true));
  1137. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 2, false));
  1138. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1139. _lstHandler.AddLast(new HirataR4RobotMoveDeviationHandler(this, "U", 0, 0, (-1)*slowupdistance, 0));
  1140. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1141. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 0, true));
  1142. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 1, false));
  1143. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 2, true));
  1144. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 3, false));
  1145. _lstHandler.AddLast(new HirataR4RobotWaferInforMoveHandler(this, 0, false));
  1146. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 1, true));
  1147. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 0, false));
  1148. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 3, true));
  1149. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 2, false));
  1150. _lstHandler.AddLast(new HirataR4RobotMoveDeviationHandler(this, "I", (-1) * insertdistance, (-1) * insertdistance, 0, 0));
  1151. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1152. _lstHandler.AddLast(new HirataR4RobotReadDIByteHandler(this, 0));
  1153. //WaferManager.Instance.WaferMoved(ModuleName.Robot, 0, station, slot);
  1154. //WaferManager.Instance.WaferMoved(ModuleName.Robot, 1, station, slot+1);
  1155. }
  1156. ReadCurrentPostion();
  1157. return true;
  1158. }
  1159. }
  1160. public void MoveWaferInforToStation()
  1161. {
  1162. if (GetWaferState(_currentMotionArm) == RobotArmWaferStateEnum.Absent || isSimulatorMode)
  1163. {
  1164. if (_currentMotionArm == RobotArmEnum.Lower || _currentMotionArm == RobotArmEnum.Upper)
  1165. WaferManager.Instance.WaferMoved(ModuleName.Robot, (int)_currentMotionArm,
  1166. _currentMotionStation, _currentMotionSlot);
  1167. else
  1168. {
  1169. WaferManager.Instance.WaferMoved(ModuleName.Robot, 0,
  1170. _currentMotionStation, _currentMotionSlot);
  1171. WaferManager.Instance.WaferMoved(ModuleName.Robot, 1,
  1172. _currentMotionStation, _currentMotionSlot + 1);
  1173. }
  1174. }
  1175. else
  1176. {
  1177. _lstHandler.Clear();
  1178. OnError($"Detect wafer present on {_currentMotionArm}");
  1179. }
  1180. }
  1181. public void MoveWaferInforFromStation()
  1182. {
  1183. if (GetWaferState(_currentMotionArm) == RobotArmWaferStateEnum.Present || isSimulatorMode)
  1184. {
  1185. if (_currentMotionArm == RobotArmEnum.Lower || _currentMotionArm == RobotArmEnum.Upper)
  1186. WaferManager.Instance.WaferMoved(_currentMotionStation, _currentMotionSlot,
  1187. ModuleName.Robot, (int)_currentMotionArm);
  1188. else
  1189. {
  1190. WaferManager.Instance.WaferMoved(_currentMotionStation, _currentMotionSlot,
  1191. ModuleName.Robot, 0);
  1192. WaferManager.Instance.WaferMoved(_currentMotionStation, _currentMotionSlot + 1,
  1193. ModuleName.Robot, 1);
  1194. }
  1195. }
  1196. else
  1197. {
  1198. _lstHandler.Clear();
  1199. OnError($"Detect wafer absent on {_currentMotionArm}");
  1200. }
  1201. }
  1202. protected override bool fPlaceComplete(object[] param)
  1203. {
  1204. if (GetWaferState(_currentMotionArm) == RobotArmWaferStateEnum.Absent || isSimulatorMode)
  1205. {
  1206. }
  1207. else
  1208. {
  1209. _lstHandler.Clear();
  1210. OnError($"Detect wafer present on {_currentMotionArm}");
  1211. }
  1212. return base.fPlaceComplete(param);
  1213. }
  1214. protected override bool fStartPickWafer(object[] param)
  1215. {
  1216. if (param.Length < 3) return false;
  1217. RobotArmEnum arm = (RobotArmEnum)param[0];
  1218. ModuleName station = (ModuleName)Enum.Parse(typeof(ModuleName), (string)param[1]); ;
  1219. int slot = (int)param[2];
  1220. float xoffset = 0;
  1221. float yoffset = 0;
  1222. float zoffset = 0;
  1223. float woffset = 0;
  1224. if(param.Length >=7)
  1225. {
  1226. xoffset = (float)param[3];
  1227. yoffset = (float)param[4];
  1228. zoffset = (float)param[5];
  1229. woffset = (float)param[6];
  1230. }
  1231. WaferSize wafersize = WaferManager.Instance.GetWaferSize(station, slot);
  1232. int address = GetBaseAddress(station, wafersize);
  1233. zoffset = zoffset + slot * GetWaferPitch(station, wafersize);
  1234. float insertdistance = GetInsertDistance(station, wafersize);
  1235. float slowupdistance = GetSlowUpDistance(station, wafersize);
  1236. _currentMotionArm = arm;
  1237. _currentMotionStation = station;
  1238. _currentMotionSlot = slot;
  1239. lock (_locker)
  1240. {
  1241. if(arm == RobotArmEnum.Lower)
  1242. {
  1243. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1244. _lstHandler.AddLast(new HirataR4RobotMoveToPositionWithDeviationHandler(this, "A", address, xoffset, yoffset, zoffset + _armPitch, woffset));
  1245. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1246. _lstHandler.AddLast(new HirataR4RobotMoveDeviationHandler(this, "I", insertdistance, 0, 0, 0));
  1247. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1248. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 0, true));
  1249. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1250. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 1, false));
  1251. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1252. _lstHandler.AddLast(new HirataR4RobotMoveDeviationHandler(this, "U", 0, 0, slowupdistance, 0));
  1253. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1254. _lstHandler.AddLast(new HirataR4RobotWaferInforMoveHandler(this, 0, true));
  1255. _lstHandler.AddLast(new HirataR4RobotMoveDeviationHandler(this, "I", (-1)*insertdistance, 0, 0, 0));
  1256. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1257. _lstHandler.AddLast(new HirataR4RobotReadDIByteHandler(this, 0));
  1258. //WaferManager.Instance.WaferMoved(station, slot, ModuleName.Robot, 0);
  1259. }
  1260. if(arm == RobotArmEnum.Upper)
  1261. {
  1262. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1263. _lstHandler.AddLast(new HirataR4RobotMoveToPositionWithDeviationHandler(this, "A", address, xoffset, yoffset, zoffset, woffset));
  1264. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1265. _lstHandler.AddLast(new HirataR4RobotMoveDeviationHandler(this, "I", 0, insertdistance, 0, 0));
  1266. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1267. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 2, true));
  1268. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1269. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 3, false));
  1270. _lstHandler.AddLast(new HirataR4RobotMoveDeviationHandler(this, "U", 0, 0, slowupdistance, 0));
  1271. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1272. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1273. _lstHandler.AddLast(new HirataR4RobotWaferInforMoveHandler(this, 0, true));
  1274. _lstHandler.AddLast(new HirataR4RobotMoveDeviationHandler(this, "I", 0, (-1) * insertdistance, 0, 0));
  1275. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1276. _lstHandler.AddLast(new HirataR4RobotReadDIByteHandler(this, 0));
  1277. //WaferManager.Instance.WaferMoved(station, slot, ModuleName.Robot, 1);
  1278. }
  1279. if (arm == RobotArmEnum.Both)
  1280. {
  1281. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1282. _lstHandler.AddLast(new HirataR4RobotMoveToPositionWithDeviationHandler(this, "A", address, xoffset, yoffset, zoffset + _armPitch, woffset));
  1283. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1284. _lstHandler.AddLast(new HirataR4RobotMoveDeviationHandler(this, "I", insertdistance, insertdistance, 0, 0));
  1285. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1286. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 0, true));
  1287. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 1, false));
  1288. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 2, true));
  1289. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 3, false));
  1290. _lstHandler.AddLast(new HirataR4RobotMoveDeviationHandler(this, "U", 0, 0, slowupdistance, 0));
  1291. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1292. _lstHandler.AddLast(new HirataR4RobotWaferInforMoveHandler(this, 0, true));
  1293. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1294. _lstHandler.AddLast(new HirataR4RobotMoveDeviationHandler(this, "I", (-1) * insertdistance, (-1) * insertdistance, 0, 0));
  1295. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1296. _lstHandler.AddLast(new HirataR4RobotReadDIByteHandler(this, 0));
  1297. }
  1298. ReadCurrentPostion();
  1299. return true;
  1300. }
  1301. }
  1302. protected override bool fPickComplete(object[] param)
  1303. {
  1304. if (GetWaferState(_currentMotionArm) == RobotArmWaferStateEnum.Present || isSimulatorMode)
  1305. {
  1306. }
  1307. else
  1308. {
  1309. _lstHandler.Clear();
  1310. OnError($"Detect wafer absent on {_currentMotionArm}");
  1311. }
  1312. return base.fPickComplete(param);
  1313. }
  1314. protected override bool fResetToReady(object[] param)
  1315. {
  1316. return true;
  1317. }
  1318. protected override bool fReset(object[] param)
  1319. {
  1320. _connection.SetCommunicationError(false, "");
  1321. if (!_connection.IsConnected)
  1322. {
  1323. _connection.Disconnect();
  1324. _connection.Connect();
  1325. }
  1326. lock (_locker)
  1327. {
  1328. _lstHandler.AddLast(new HirataR4RobotSimpleActionHandler(this, "GE"));
  1329. _lstHandler.AddLast(new HirataR4RobotRawCommandHandler(this, "CL"));
  1330. }
  1331. return true;// throw new NotImplementedException();
  1332. }
  1333. protected override bool fStartInit(object[] param)
  1334. {
  1335. lock (_locker)
  1336. {
  1337. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 0, true));
  1338. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 1, false));
  1339. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 2, true));
  1340. _lstHandler.AddLast(new HirataR4RobotWriteDOHandler(this, 3, false));
  1341. ReadCurrentPostion();
  1342. _lstHandler.AddLast(new HirataR4RobotReadDIByteForInitHandler(this, 0));
  1343. }
  1344. int waitCount = 0;
  1345. while(_lstHandler.Count !=0 || _connection.IsBusy)
  1346. {
  1347. Thread.Sleep(10);
  1348. waitCount++;
  1349. if(waitCount >500)
  1350. {
  1351. OnError("HomeTimeOut");
  1352. IsBusy = false;
  1353. return false;
  1354. }
  1355. }
  1356. lock (_locker)
  1357. {
  1358. _lstHandler.AddLast(new HirataR4RobotOperateVacDependsOnWaferHandler(this, 0));
  1359. _lstHandler.AddLast(new HirataR4RobotOperateVacDependsOnWaferHandler(this, 1));
  1360. _lstHandler.AddLast(new HirataR4RobotOperateVacDependsOnWaferHandler(this, 2));
  1361. _lstHandler.AddLast(new HirataR4RobotOperateVacDependsOnWaferHandler(this, 3));
  1362. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1363. _lstHandler.AddLast(new HirataR4RobotMoveToPositionHandler(this, 0, "A"));
  1364. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1365. _lstHandler.AddLast(new HirataR4RobotMoveToPositionHandler(this, 1, "A"));
  1366. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1367. }
  1368. return true;
  1369. }
  1370. //protected override bool fMonitorInit(object[] param)
  1371. //{
  1372. // if (_lstHandler.Count == 0 && !_connection.IsBusy && (IsOnLine) && (ACalCompleted) && (MovingCompleted))
  1373. // return true;
  1374. // return base.fMonitorInit(param);
  1375. //}
  1376. protected override bool fInitComplete(object[] param)
  1377. {
  1378. if(GetWaferState(RobotArmEnum.Lower) == RobotArmWaferStateEnum.Present)
  1379. {
  1380. if (WaferManager.Instance.CheckNoWafer(RobotModuleName, 0))
  1381. WaferManager.Instance.CreateWafer(RobotModuleName, 0, WaferStatus.Normal);
  1382. }
  1383. if (GetWaferState(RobotArmEnum.Lower) == RobotArmWaferStateEnum.Absent)
  1384. {
  1385. if (WaferManager.Instance.CheckHasWafer(RobotModuleName, 0))
  1386. WaferManager.Instance.DeleteWafer(RobotModuleName, 0);
  1387. }
  1388. if (GetWaferState(RobotArmEnum.Upper) == RobotArmWaferStateEnum.Present)
  1389. {
  1390. if (WaferManager.Instance.CheckNoWafer(RobotModuleName, 1))
  1391. WaferManager.Instance.CreateWafer(RobotModuleName, 1, WaferStatus.Normal);
  1392. }
  1393. if (GetWaferState(RobotArmEnum.Upper) == RobotArmWaferStateEnum.Absent)
  1394. {
  1395. if (WaferManager.Instance.CheckHasWafer(RobotModuleName, 1))
  1396. WaferManager.Instance.DeleteWafer(RobotModuleName, 1);
  1397. }
  1398. return base.fInitComplete(param);
  1399. }
  1400. protected override bool fStartExtendForPick(object[] param)
  1401. {
  1402. return true;
  1403. }
  1404. protected override bool fStartExtendForPlace(object[] param)
  1405. {
  1406. return true;
  1407. }
  1408. protected override bool fStartRetractFromPick(object[] param)
  1409. {
  1410. return true;
  1411. }
  1412. protected override bool fStartRetractFromPlace(object[] param)
  1413. {
  1414. return true;
  1415. }
  1416. protected override bool fClear(object[] param)
  1417. {
  1418. return true; ;
  1419. }
  1420. protected override bool fError(object[] param)
  1421. {
  1422. return true;
  1423. }
  1424. private void ReadCurrentPostion()
  1425. {
  1426. _lstHandler.AddLast(new HirataR4RobotReadHandler(this, "LR", null));
  1427. }
  1428. private float GetWaferPitch(ModuleName module,WaferSize wz)
  1429. {
  1430. if (ModuleHelper.IsLoadPort(module))
  1431. {
  1432. int carrierindex = SC.GetValue<int>($"CarrierInfo.{module.ToString()}CarrierIndex");
  1433. return SC.ContainsItem($"CarrierInfo.CarrierWaferPitch{carrierindex}") ?
  1434. (float)SC.GetValue<int>($"CarrierInfo.CarrierWaferPitch{carrierindex}") / 100 : 20;
  1435. }
  1436. if (wz == WaferSize.WS12)
  1437. return (float)SC.GetValue<int>($"CarrierInfo.{module.ToString()}CarrierWaferPitch0")/100;
  1438. if (wz == WaferSize.WS8)
  1439. return (float)SC.GetValue<int>($"CarrierInfo.{module.ToString()}CarrierWaferPitch1") / 100;
  1440. if (wz == WaferSize.WS6)
  1441. return (float)SC.GetValue<int>($"CarrierInfo.{module.ToString()}CarrierWaferPitch2") / 100;
  1442. if (wz == WaferSize.WS4)
  1443. return (float)SC.GetValue<int>($"CarrierInfo.{module.ToString()}CarrierWaferPitch3") / 100;
  1444. if (wz == WaferSize.WS3)
  1445. return (float)SC.GetValue<int>($"CarrierInfo.{module.ToString()}CarrierWaferPitch4") / 100;
  1446. return 20;
  1447. }
  1448. private float GetInsertDistance(ModuleName module, WaferSize wz)
  1449. {
  1450. if (ModuleHelper.IsLoadPort(module))
  1451. {
  1452. int carrierindex = SC.GetValue<int>($"CarrierInfo.{module.ToString()}CarrierIndex");
  1453. return SC.ContainsItem($"CarrierInfo.InsertDistance{carrierindex}") ?
  1454. (float)SC.GetValue<int>($"CarrierInfo.InsertDistance{carrierindex}") / 100 : 300;
  1455. }
  1456. if(wz == WaferSize.WS12)
  1457. return (float)SC.GetValue<int>($"CarrierInfo.{module}InsertDistance0")/100;
  1458. if (wz == WaferSize.WS8)
  1459. return (float)SC.GetValue<int>($"CarrierInfo.{module}InsertDistance1") / 100;
  1460. if (wz == WaferSize.WS6)
  1461. return (float)SC.GetValue<int>($"CarrierInfo.{module}InsertDistance2") / 100;
  1462. if (wz == WaferSize.WS4)
  1463. return (float)SC.GetValue<int>($"CarrierInfo.{module}InsertDistance3") / 100;
  1464. if (wz == WaferSize.WS3)
  1465. return (float)SC.GetValue<int>($"CarrierInfo.{module}InsertDistance4") / 100;
  1466. return (float)SC.GetValue<int>($"CarrierInfo.{module}InsertDistance0") / 100;
  1467. }
  1468. private float GetSlowUpDistance(ModuleName module,WaferSize wz)
  1469. {
  1470. if (ModuleHelper.IsLoadPort(module))
  1471. {
  1472. int carrierindex = SC.GetValue<int>($"CarrierInfo.{module.ToString()}CarrierIndex");
  1473. return SC.ContainsItem($"CarrierInfo.SlowUpDistance{carrierindex}") ?
  1474. (float)SC.GetValue<int>($"CarrierInfo.SlowUpDistance{carrierindex}") / 100 : 10;
  1475. }
  1476. if (wz == WaferSize.WS12)
  1477. return (float)SC.GetValue<int>($"CarrierInfo.{module}SlowUpDistance0")/100;
  1478. if (wz == WaferSize.WS8)
  1479. return (float)SC.GetValue<int>($"CarrierInfo.{module}SlowUpDistance1") / 100;
  1480. if (wz == WaferSize.WS6)
  1481. return (float)SC.GetValue<int>($"CarrierInfo.{module}SlowUpDistance2") / 100;
  1482. if (wz == WaferSize.WS4)
  1483. return (float)SC.GetValue<int>($"CarrierInfo.{module}SlowUpDistance3") / 100;
  1484. if (wz == WaferSize.WS3)
  1485. return (float)SC.GetValue<int>($"CarrierInfo.{module}SlowUpDistance4") / 100;
  1486. return (float)SC.GetValue<int>($"CarrierInfo.{module}SlowUpDistance0") / 100;
  1487. }
  1488. private int GetBaseAddress(ModuleName module,WaferSize wz)
  1489. {
  1490. if (ModuleHelper.IsLoadPort(module))
  1491. {
  1492. int carrierindex = SC.GetValue<int>($"CarrierInfo.{module.ToString()}CarrierIndex");
  1493. return SC.ContainsItem($"CarrierInfo.{module}Station{carrierindex}") ?
  1494. Convert.ToInt16(SC.GetStringValue($"CarrierInfo.{module}Station{carrierindex}")) : 0;
  1495. }
  1496. if (wz == WaferSize.WS12)
  1497. return Convert.ToInt16(SC.GetStringValue($"CarrierInfo.{module}Station0"));
  1498. if (wz == WaferSize.WS8)
  1499. return Convert.ToInt16(SC.GetStringValue($"CarrierInfo.{module}Station1"));
  1500. if (wz == WaferSize.WS6)
  1501. return Convert.ToInt16(SC.GetStringValue($"CarrierInfo.{module}Station2"));
  1502. if (wz == WaferSize.WS4)
  1503. return Convert.ToInt16(SC.GetStringValue($"CarrierInfo.{module}Station3"));
  1504. if (wz == WaferSize.WS3)
  1505. return Convert.ToInt16(SC.GetStringValue($"CarrierInfo.{module}Station4"));
  1506. return Convert.ToInt16(SC.GetStringValue($"CarrierInfo.{module}Station0"));
  1507. }
  1508. private int[] GetMappingAddress(ModuleName module)
  1509. {
  1510. int carrierindex = SC.GetValue<int>($"CarrierInfo.{module.ToString()}CarrierIndex");
  1511. string addresses = SC.ContainsItem($"CarrierInfo.{module}MappingStation{carrierindex}") ?
  1512. SC.GetStringValue($"CarrierInfo.{module}MappingStation{carrierindex}") : "";
  1513. List<int> ret = new List<int>();
  1514. foreach (var add in addresses.Split(','))
  1515. {
  1516. ret.Add(Convert.ToInt16(add));
  1517. }
  1518. if (ret.Count != 6)
  1519. {
  1520. EV.PostAlarmLog("Robot","Mapping address setting error!");
  1521. return null;
  1522. }
  1523. return ret.ToArray();
  1524. }
  1525. public override RobotArmWaferStateEnum GetWaferState(RobotArmEnum arm)
  1526. {
  1527. switch(arm)
  1528. {
  1529. case RobotArmEnum.Lower:
  1530. if (di_Values[0, 0]) return RobotArmWaferStateEnum.Present;
  1531. else return RobotArmWaferStateEnum.Absent;
  1532. case RobotArmEnum.Upper:
  1533. if (di_Values[0, 2]) return RobotArmWaferStateEnum.Present;
  1534. else return RobotArmWaferStateEnum.Absent;
  1535. case RobotArmEnum.Both:
  1536. if(di_Values[0, 0] == di_Values[0, 2])
  1537. {
  1538. if (di_Values[0, 0]) return RobotArmWaferStateEnum.Present;
  1539. else return RobotArmWaferStateEnum.Absent;
  1540. }
  1541. break;
  1542. }
  1543. return RobotArmWaferStateEnum.Unknown;
  1544. }
  1545. private RobotArmEnum GetAnotherArm(RobotArmEnum arm)
  1546. {
  1547. if (arm == RobotArmEnum.Lower) return RobotArmEnum.Upper;
  1548. if (arm == RobotArmEnum.Upper) return RobotArmEnum.Lower;
  1549. return RobotArmEnum.Both;
  1550. }
  1551. protected override bool fStartReadData(object[] param)
  1552. {
  1553. string datatype = param[0].ToString();
  1554. lock (_locker)
  1555. {
  1556. switch (datatype)
  1557. {
  1558. case "CurrentPositionData":
  1559. ReadCurrentPostion();
  1560. break;
  1561. case "ExtParameter":
  1562. if (param.Length < 2) return false;
  1563. _lstHandler.AddLast(new HirataR4RobotReadHandler(this, "LE", param[1].ToString()));
  1564. break;
  1565. case "CurrentStatus":
  1566. _lstHandler.AddLast(new HirataR4RobotMonitorRobotStatusHandler(this));
  1567. break;
  1568. case "PositionData":
  1569. if (param.Length < 2) return false;
  1570. if (!uint.TryParse(param[1].ToString(), out _)) return false;
  1571. ReadPosition(int.Parse(param[1].ToString()));
  1572. break;
  1573. case "MappingData":
  1574. if (param.Length < 2) return false;
  1575. if (!param[1].ToString().Contains("M0")) return false;
  1576. int paraindex;
  1577. if (!int.TryParse(param[1].ToString().Replace("M", ""), out paraindex)) return false;
  1578. if (paraindex > 9 || paraindex < 0) return false;
  1579. lock (_locker)
  1580. {
  1581. _lstHandler.AddLast(new HirataR4RobotReadHandler(this, "LE", (112 + (5 * (paraindex - 1))).ToString()));
  1582. _lstHandler.AddLast(new HirataR4RobotReadHandler(this, "LE", (610 + (5 * (paraindex - 1))).ToString()));
  1583. _lstHandler.AddLast(new HirataR4RobotReadHandler(this, "LE", (611 + (5 * (paraindex - 1))).ToString()));
  1584. _lstHandler.AddLast(new HirataR4RobotReadHandler(this, "LE", (612 + (5 * (paraindex - 1))).ToString()));
  1585. _lstHandler.AddLast(new HirataR4RobotReadHandler(this, "LE", (613 + (5 * (paraindex - 1))).ToString()));
  1586. _lstHandler.AddLast(new HirataR4RobotReadHandler(this, "LE", (614 + (5 * (paraindex - 1))).ToString()));
  1587. _lstHandler.AddLast(new HirataR4RobotReadHandler(this, "LE", (615 + (5 * (paraindex - 1))).ToString()));
  1588. }
  1589. break;
  1590. }
  1591. }
  1592. return true;
  1593. }
  1594. protected override bool fStartSetParameters(object[] param)
  1595. {
  1596. string datatype = param[0].ToString();
  1597. if (datatype == "TransferSpeedLevel")
  1598. {
  1599. if (param.Length == 2)
  1600. {
  1601. int speed = 10;
  1602. if (param[1].ToString() == "3") speed = 10;
  1603. if (param[1].ToString() == "2") speed = 50;
  1604. if (param[1].ToString() == "1") speed = 100;
  1605. lock (_locker)
  1606. {
  1607. _lstHandler.AddLast(new HirataR4RobotRawCommandHandler(this, "SP", $"{speed} {speed}"));
  1608. }
  1609. }
  1610. if (param.Length == 4)
  1611. {
  1612. int ABWSpeed;
  1613. int ZSpeed;
  1614. if (!int.TryParse(param[2].ToString(), out ABWSpeed)) return false;
  1615. if (!int.TryParse(param[3].ToString(), out ZSpeed)) return false;
  1616. if (ABWSpeed > 100) ABWSpeed = 100;
  1617. if (ABWSpeed < 0) ABWSpeed = 0;
  1618. if (ZSpeed > 100) ZSpeed = 100;
  1619. if (ZSpeed < 0) ZSpeed = 0;
  1620. if (param[1].ToString() == "PTPSpeed")
  1621. {
  1622. lock (_locker)
  1623. {
  1624. _lstHandler.AddLast(new HirataR4RobotRawCommandHandler(this, "SP", $"{ABWSpeed} {ZSpeed}"));
  1625. }
  1626. }
  1627. if (param[1].ToString() == "ACC/DEC")
  1628. {
  1629. lock (_locker)
  1630. {
  1631. _lstHandler.AddLast(new HirataR4RobotRawCommandHandler(this, "SX", $"{ABWSpeed} {ZSpeed}"));
  1632. }
  1633. }
  1634. }
  1635. }
  1636. if (datatype == "ExtParameter")
  1637. {
  1638. if (param.Length < 3) return false;
  1639. if (!int.TryParse(param[1].ToString(), out _)) return false;
  1640. if (string.IsNullOrEmpty(param[2].ToString())) return false;
  1641. lock (_locker)
  1642. {
  1643. _lstHandler.AddLast(new HirataR4RobotWriteHandler(this, "SE", $"{param[1]} {param[2]}"));
  1644. }
  1645. }
  1646. if (datatype == "PositionData")
  1647. {
  1648. if (param.Length < 9)
  1649. {
  1650. EV.PostAlarmLog("Robot", "Robot postion data is not correct");
  1651. return false;
  1652. }
  1653. if (!int.TryParse(param[1].ToString(), out _))
  1654. {
  1655. EV.PostAlarmLog("Robot", "Robot postion data is not correct");
  1656. return false;
  1657. }
  1658. if (!float.TryParse(param[2].ToString(), out _))
  1659. {
  1660. EV.PostAlarmLog("Robot", "Robot postion data is not correct");
  1661. return false;
  1662. }
  1663. if (!float.TryParse(param[3].ToString(), out _))
  1664. {
  1665. EV.PostAlarmLog("Robot", "Robot postion data is not correct");
  1666. return false;
  1667. }
  1668. if (!float.TryParse(param[4].ToString(), out _))
  1669. {
  1670. EV.PostAlarmLog("Robot", "Robot postion data is not correct");
  1671. return false;
  1672. }
  1673. if (!float.TryParse(param[5].ToString(), out _))
  1674. {
  1675. EV.PostAlarmLog("Robot", "Robot postion data is not correct");
  1676. return false;
  1677. }
  1678. if (!int.TryParse(param[6].ToString(), out _))
  1679. {
  1680. EV.PostAlarmLog("Robot", "Robot postion data is not correct");
  1681. return false;
  1682. }
  1683. if (!int.TryParse(param[7].ToString(), out _))
  1684. {
  1685. EV.PostAlarmLog("Robot", "Robot postion data is not correct");
  1686. return false;
  1687. }
  1688. if (!int.TryParse(param[8].ToString(), out _))
  1689. {
  1690. EV.PostAlarmLog("Robot", "Robot postion data is not correct");
  1691. return false;
  1692. }
  1693. return WritePosition(int.Parse(param[1].ToString()), float.Parse(param[2].ToString()), float.Parse(param[3].ToString()),
  1694. float.Parse(param[4].ToString()), float.Parse(param[5].ToString()), param[6].ToString(), param[7].ToString(),
  1695. param[8].ToString());
  1696. }
  1697. if (datatype == "MappingData")
  1698. {
  1699. int paraindex;
  1700. if (!int.TryParse(param[1].ToString().Replace("M", ""), out paraindex)) return false;
  1701. if (paraindex > 9 || paraindex < 0) return false;
  1702. if (param.Length < 8) return false;
  1703. if(uint.TryParse(param[2].ToString(),out _))
  1704. lock (_locker)
  1705. {
  1706. _lstHandler.AddLast(new HirataR4RobotWriteHandler(this, "SE",
  1707. $"{(112 + (5 * (paraindex - 1)))} {param[2]}"));
  1708. }
  1709. if(float.TryParse(param[3].ToString(),out _))
  1710. lock (_locker)
  1711. {
  1712. _lstHandler.AddLast(new HirataR4RobotWriteHandler(this, "SE",
  1713. $"{(610 + (5 * (paraindex - 1)))} {param[3]}"));
  1714. }
  1715. if (float.TryParse(param[4].ToString(), out _))
  1716. lock (_locker)
  1717. {
  1718. _lstHandler.AddLast(new HirataR4RobotWriteHandler(this, "SE",
  1719. $"{(611 + (5 * (paraindex - 1)))} {param[4]}"));
  1720. }
  1721. if (float.TryParse(param[5].ToString(), out _))
  1722. lock (_locker)
  1723. {
  1724. _lstHandler.AddLast(new HirataR4RobotWriteHandler(this, "SE",
  1725. $"{(612 + (5 * (paraindex - 1)))} {param[5]}"));
  1726. }
  1727. if (float.TryParse(param[6].ToString(), out _))
  1728. lock (_locker)
  1729. {
  1730. _lstHandler.AddLast(new HirataR4RobotWriteHandler(this, "SE",
  1731. $"{(613 + (5 * (paraindex - 1)))} {param[6]}"));
  1732. }
  1733. if (!string.IsNullOrEmpty(param[7].ToString()))
  1734. lock (_locker)
  1735. {
  1736. _lstHandler.AddLast(new HirataR4RobotWriteHandler(this, "SE",
  1737. $"{(614 + (5 * (paraindex - 1)))} {param[7]}"));
  1738. }
  1739. }
  1740. if(datatype == "InsertMotionParameter")
  1741. {
  1742. if (param.Length < 3) return false;
  1743. float insertdistance;
  1744. int Decratio;
  1745. if (!float.TryParse(param[1].ToString(), out insertdistance)) return false;
  1746. if (!int.TryParse(param[2].ToString(), out Decratio)) return false;
  1747. if (Decratio > 99) Decratio = 99;
  1748. if (Decratio < 0) Decratio = 0;
  1749. _lstHandler.AddLast(new HirataR4RobotWriteHandler(this, "SI", $" {insertdistance} {Decratio}"));
  1750. }
  1751. if (datatype == "SlowUpMotionParameter")
  1752. {
  1753. if (param.Length < 3) return false;
  1754. float insertdistance;
  1755. int Decratio;
  1756. if (!float.TryParse(param[1].ToString(), out insertdistance)) return false;
  1757. if (!int.TryParse(param[2].ToString(), out Decratio)) return false;
  1758. if (Decratio > 99) Decratio = 99;
  1759. if (Decratio < 0) Decratio = 0;
  1760. _lstHandler.AddLast(new HirataR4RobotWriteHandler(this, "SJ", $" {insertdistance} {Decratio}"));
  1761. }
  1762. if(datatype == "MappingDataForLP")
  1763. {
  1764. if (param.Length < 4) return false;
  1765. string[] mappingstations;
  1766. if (param[3].ToString() == "WS4")
  1767. {
  1768. if (!SC.ContainsItem($"CarrierInfo.{param[1]}MappingStation3")) return false;
  1769. mappingstations = SC.GetStringValue($"CarrierInfo.{param[1]}MappingStation3").Split(',');
  1770. }
  1771. else if(param[3].ToString() == "WS6")
  1772. {
  1773. if (!SC.ContainsItem($"CarrierInfo.{param[1]}MappingStation2")) return false;
  1774. mappingstations = SC.GetStringValue($"CarrierInfo.{param[1]}MappingStation2").Split(',');
  1775. }
  1776. else
  1777. {
  1778. mappingstations = null;
  1779. return false;
  1780. }
  1781. if (mappingstations.Length < 6) return false;
  1782. for(int i =1;i<5;i++)
  1783. {
  1784. if (!uint.TryParse(mappingstations[i], out _)) return false;
  1785. lock(_locker)
  1786. {
  1787. _lstHandler.AddLast(new HirataR4RobotReadRobotPositionHandler(this, Convert.ToInt32(mappingstations[i])));
  1788. }
  1789. int waittime = 0;
  1790. while(_lstHandler.Count !=0 || _connection.IsBusy ||_connection.IsCommunicationError)
  1791. {
  1792. Thread.Sleep(200);
  1793. waittime++;
  1794. if (waittime > 10)
  1795. {
  1796. EV.PostAlarmLog("Robot", "Set LP mapping data failed.");
  1797. return false;
  1798. }
  1799. }
  1800. WritePosition(Convert.ToInt32(mappingstations[i]), ReadXPosition, ReadYPosition, ReadZPosition, ReadWPosition,
  1801. param[2].ToString().Replace("M", ""), FCode, SCode);
  1802. }
  1803. }
  1804. return true;
  1805. }
  1806. }
  1807. }