TransporterEntity.cs 71 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751
  1. using Aitex.Core.RT.DataCenter;
  2. using Aitex.Core.RT.Device;
  3. using Aitex.Core.RT.Fsm;
  4. using Aitex.Core.RT.Log;
  5. using Aitex.Core.RT.OperationCenter;
  6. using Aitex.Core.RT.Routine;
  7. using Aitex.Core.Utilities;
  8. using MECF.Framework.Common.Equipment;
  9. using MECF.Framework.Common.WaferHolder;
  10. using CyberX8_Core;
  11. using CyberX8_RT.Devices.AXIS;
  12. using System;
  13. using System.Collections.Generic;
  14. using System.Linq;
  15. using System.Text;
  16. using System.Threading.Tasks;
  17. using Aitex.Core.Util;
  18. using MECF.Framework.Common.Layout;
  19. using Aitex.Core.RT.SCCore;
  20. using MECF.Framework.Common.SubstrateTrackings;
  21. using MECF.Framework.Common.CommonData;
  22. using MECF.Framework.Common.Alarm;
  23. using MECF.Framework.Common.Utilities;
  24. using Aitex.Core.Common;
  25. namespace CyberX8_RT.Modules.Transporter
  26. {
  27. public class TransporterEntity : Entity, IEntity, IModuleEntity
  28. {
  29. #region 常量
  30. private const string TRNPA = "TRNPA";
  31. private const string TRNPB = "TRNPB";
  32. #endregion
  33. #region 内部变量
  34. /// <summary>
  35. /// 是否完成Home
  36. /// </summary>
  37. private bool _isHomed;
  38. /// <summary>
  39. /// Gantry电机
  40. /// </summary>
  41. private JetAxisBase _gantryAxis;
  42. /// <summary>
  43. /// Elevator电机
  44. /// </summary>
  45. private JetAxisBase _elevatorAxis;
  46. /// <summary>
  47. /// 当前Routine
  48. /// </summary>
  49. private IRoutine _currentRoutine;
  50. /// <summary>
  51. /// 目标Cell(Transfer或pickupMoveto或moveto目标Cell)
  52. /// </summary>
  53. private string _targetCell;
  54. /// <summary>
  55. /// 源Cell(Transfer或pickupMoveto)
  56. /// </summary>
  57. private string _sourceCell;
  58. #endregion
  59. #region routine
  60. private TransporterHomeRoutine _homeAllRoutine;
  61. private TransporterSwitchOnRoutine _switchOnRoutine;
  62. private TransporterSwitchOffRoutine _switchOffRoutine;
  63. private TransporterPositionRoutine _positionRoutine;
  64. private TransporterGantryPositionRoutine _gantryPositionRoutine;
  65. private TransporterPickUpFromRoutine _pickUpFromRoutine;
  66. private TransporterMoveToRoutine _moveToRoutine;
  67. private TransporterPickDownToRoutine _placeRoutine;
  68. private TransporterParkRoutine _parkRoutine;
  69. private TransporterElevatorUpRoutine _elevatorUpRoutine;
  70. private TransporterElevatorLowRoutine _elevatorLowRoutine;
  71. private TransporterTransferRoutine _transferRoutine;
  72. private TransporterPickUpMoveToRoutine _pickUpMoveToRoutine;
  73. private TransporterPickUpValidateRoutine _pickUpValidateRoutine;
  74. #endregion
  75. #region 属性
  76. public ModuleName Module { get; private set; }
  77. //初始状态
  78. public bool IsInit
  79. {
  80. get { return fsm.State == (int)TransporterState.Init; }
  81. }
  82. /// <summary>
  83. ///Initialized状态(Safety)
  84. /// </summary>
  85. public bool IsInitialized { get { return fsm.State==(int)TransporterState.Initialized; } }
  86. /// <summary>
  87. /// Busy状态
  88. /// </summary>
  89. public bool IsBusy
  90. {
  91. get { return !IsInit && !IsError && !IsIdle; }
  92. }
  93. /// <summary>
  94. /// Idle状态
  95. /// </summary>
  96. public bool IsIdle
  97. {
  98. get { return fsm.State == (int)TransporterState.Idle; }
  99. }
  100. public bool IsAuto { get; } = true;
  101. /// <summary>
  102. /// 是否为工程模式
  103. /// </summary>
  104. public bool IsEngineering { get; } = false;
  105. /// <summary>
  106. /// 是否为产品模式
  107. /// </summary>
  108. public bool IsProduction { get; } = true;
  109. /// <summary>
  110. /// 错误状态
  111. /// </summary>
  112. public bool IsError
  113. {
  114. get { return fsm.State == (int)TransporterState.Error; }
  115. }
  116. /// <summary>
  117. /// Home状态
  118. /// </summary>
  119. public bool IsHomed
  120. {
  121. get { return _isHomed; }
  122. }
  123. /// <summary>
  124. /// 是否禁用
  125. /// </summary>
  126. public bool IsDisable { get; internal set; }
  127. /// <summary>
  128. /// Grantry是否SwitchOn
  129. /// </summary>
  130. public bool IsGantrySwitchOn
  131. {
  132. get { return _gantryAxis.IsSwitchOn; }
  133. }
  134. /// <summary>
  135. /// Elevator是否SwitchOn
  136. /// </summary>
  137. public bool IsElevatorSwitchOn
  138. {
  139. get { return _elevatorAxis.IsSwitchOn; }
  140. }
  141. /// <summary>
  142. /// 当前状态机状态
  143. /// </summary>
  144. public int State { get { return fsm.State; } }
  145. /// <summary>
  146. /// 目标Cell(Transfer或pickupMoveto或moveto目标Cell)
  147. /// </summary>
  148. public string TargetCell { get { return _targetCell; } }
  149. /// <summary>
  150. /// 源Cell(Transfer或pickupMoveto)
  151. /// </summary>
  152. public string SourceCell { get { return _sourceCell; } }
  153. /// <summary>
  154. /// WaferHolder信息
  155. /// </summary>
  156. public WaferHolderInfo WaferHolderInfo { get { return WaferHolderManager.Instance.GetWaferHolder(Module.ToString()); } }
  157. #endregion
  158. /// <summary>
  159. /// 构造函数
  160. /// </summary>
  161. /// <param name="module"></param>
  162. public TransporterEntity(ModuleName module)
  163. {
  164. this.Module = module;
  165. _elevatorAxis = DEVICE.GetDevice<JetAxisBase>($"{module}.Elevator");
  166. _gantryAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Gantry");
  167. WaferManager.Instance.SubscribeLocation(Module, 2);
  168. InitialFsm();
  169. }
  170. /// <summary>
  171. /// 初始化
  172. /// </summary>
  173. /// <returns></returns>
  174. protected override bool Init()
  175. {
  176. InitialOperation();
  177. InitialDATA();
  178. InitialRoutine();
  179. return true;
  180. }
  181. /// <summary>
  182. /// 检验所有电机是否已经完成Home
  183. /// </summary>
  184. /// <returns></returns>
  185. private bool CheckAllAxisIsHomed()
  186. {
  187. bool gantryIsHomed = _gantryAxis.CheckAxisIsAreadyHomed();
  188. if (!gantryIsHomed)
  189. {
  190. return false;
  191. }
  192. bool elevatorIsHomed = _elevatorAxis.CheckAxisIsAreadyHomed();
  193. if (!elevatorIsHomed)
  194. {
  195. return false;
  196. }
  197. bool elevatoeUp = _elevatorAxis.CheckPositionIsInStation(_elevatorAxis.MotionData.MotorPosition, "UP");
  198. if (!elevatorIsHomed)
  199. {
  200. return false;
  201. }
  202. if (WaferHolderInfo != null)
  203. {
  204. return false;
  205. }
  206. return true;
  207. }
  208. /// <summary>
  209. /// 初始化状态机
  210. /// </summary>
  211. private void InitialFsm()
  212. {
  213. if (CheckAllAxisIsHomed())
  214. {
  215. _isHomed = true;
  216. fsm = new StateMachine<TransporterEntity>(Module.ToString(), (int)TransporterState.Idle, 100);
  217. }
  218. else
  219. {
  220. fsm = new StateMachine<TransporterEntity>(Module.ToString(), (int)TransporterState.Init, 100);
  221. }
  222. fsm.EnableRepeatedMsg(true);
  223. AnyStateTransition(TransporterMSG.Error, EnterError, TransporterState.Error);
  224. AnyStateTransition(TransporterMSG.Abort, Abort, TransporterState.Init);
  225. AnyStateTransition(TransporterMSG.ReturnIdle, NullFunc, TransporterState.Idle);
  226. AnyStateTransition(TransporterMSG.HomeAll, HomeAll, TransporterState.Homing);
  227. Transition(TransporterState.Error, TransporterMSG.ResumeError,ResumeError, TransporterState.Init);
  228. //SwitchOn
  229. Transition(TransporterState.Init, TransporterMSG.SwitchOn, SwitchOnAll, TransporterState.SwitchOning);
  230. Transition(TransporterState.Idle, TransporterMSG.SwitchOn, SwitchOnAll, TransporterState.SwitchOning);
  231. Transition(TransporterState.Error, TransporterMSG.SwitchOn, SwitchOnAll, TransporterState.SwitchOning);
  232. Transition(TransporterState.SwitchOning, FSM_MSG.TIMER, SwitchOnTimeout, TransporterState.Init);
  233. //SwitchOff
  234. Transition(TransporterState.Init, TransporterMSG.SwitchOff, SwitchOffAll, TransporterState.SwitchOffing);
  235. Transition(TransporterState.Idle, TransporterMSG.SwitchOff, SwitchOffAll, TransporterState.SwitchOffing);
  236. Transition(TransporterState.Error, TransporterMSG.SwitchOff, SwitchOffAll, TransporterState.SwitchOffing);
  237. Transition(TransporterState.SwitchOffing, FSM_MSG.TIMER, SwitchOffTimeout, TransporterState.Init);
  238. // Home
  239. Transition(TransporterState.Homing, FSM_MSG.TIMER, HomingTimeout, TransporterState.Idle);
  240. //Gantry Save Move
  241. Transition(TransporterState.Idle, TransporterMSG.GantrySafeMove, GantrySafeMove, TransporterState.GantrySafeMoving);
  242. Transition(TransporterState.GantrySafeMoving, FSM_MSG.TIMER, GantrySafeMoveMonitor, TransporterState.Idle);
  243. //GantryGoToSavedPosition
  244. Transition(TransporterState.Error, TransporterMSG.GantryGoToSavedPosition, ManualGantryGotoPosition, TransporterState.ErrorGantryPositioning);
  245. Transition(TransporterState.ErrorGantryPositioning, FSM_MSG.TIMER, ManualGantryGotoPositionTimeout, TransporterState.Error);
  246. Transition(TransporterState.Idle,TransporterMSG.GantryGoToSavedPosition, ManualGantryGotoPosition, TransporterState.GantryPositioning);
  247. Transition(TransporterState.GantryPositioning, FSM_MSG.TIMER, ManualGantryGotoPositionTimeout, TransporterState.Idle);
  248. //Pickup
  249. Transition(TransporterState.Idle, TransporterMSG.PickUpFrom, PickUp, TransporterState.PickUping);
  250. Transition(TransporterState.PickUping, FSM_MSG.TIMER, PickUpFromTimeout, TransporterState.Idle);
  251. //MoveTo
  252. Transition(TransporterState.Idle, TransporterMSG.MoveTo, MoveTo, TransporterState.MovingTo);
  253. Transition(TransporterState.MovingTo, FSM_MSG.TIMER, MoveToTimeout, TransporterState.Idle);
  254. //Place
  255. Transition(TransporterState.Idle, TransporterMSG.Place, Place, TransporterState.Placing);
  256. Transition(TransporterState.Placing, FSM_MSG.TIMER, PlaceTimeout, TransporterState.Idle);
  257. //Park
  258. Transition(TransporterState.Idle, TransporterMSG.Park, Park, TransporterState.Parking);
  259. Transition(TransporterState.Parking, FSM_MSG.TIMER, ParkTimeout, TransporterState.Idle);
  260. //Elevator Up
  261. Transition(TransporterState.Idle, TransporterMSG.ElevatorUp, ElevatorUp, TransporterState.ElevatorUping);
  262. Transition(TransporterState.ElevatorUping, FSM_MSG.TIMER, ElevatorUpTimeout, TransporterState.Idle);
  263. //Elevator Low
  264. Transition(TransporterState.Idle, TransporterMSG.ElevatorLow, ElevatorLow, TransporterState.ElevatorLowing);
  265. Transition(TransporterState.ElevatorLowing, FSM_MSG.TIMER, ElevatorLowTimeout, TransporterState.Idle);
  266. //Transfer
  267. Transition(TransporterState.Idle, TransporterMSG.Transfer, Transfer, TransporterState.Transfering);
  268. Transition(TransporterState.Transfering, FSM_MSG.TIMER, TransferTimeout, TransporterState.Idle);
  269. //PickUpMoveTo
  270. Transition(TransporterState.Idle, TransporterMSG.PickUpMoveTo, PickUpMoveTo, TransporterState.PickUpMoveToing);
  271. Transition(TransporterState.PickUpMoveToing, FSM_MSG.TIMER, PickUpMoveToTimeout, TransporterState.PickUpMoveToComplete);
  272. Transition(TransporterState.PickUpMoveToComplete,TransporterMSG.Place, Place, TransporterState.Placing);
  273. Transition(TransporterState.Placing, FSM_MSG.TIMER, PlaceTimeout, TransporterState.Idle);
  274. //PickUpValidate
  275. Transition(TransporterState.Idle, TransporterMSG.PickUpValidate, PickUpValidate, TransporterState.PickUpValidating);
  276. Transition(TransporterState.PickUpValidating, FSM_MSG.TIMER, PickUpValidateTimeout, TransporterState.PickUpValidateComplete);
  277. Transition(TransporterState.PickUpValidateComplete, TransporterMSG.MoveTo, MoveTo, TransporterState.ValidateMoveTo);
  278. Transition(TransporterState.ValidateMoveTo, FSM_MSG.TIMER, MoveToTimeout, TransporterState.ValidateMoveToComplete);
  279. Transition(TransporterState.ValidateMoveToComplete, TransporterMSG.Place, Place, TransporterState.Placing);
  280. //Retry
  281. Transition(TransporterState.Error, TransporterMSG.Retry, NullFunc, TransporterState.Retrying);
  282. Transition(TransporterState.Retrying, FSM_MSG.TIMER, TransporterRetry, TransporterState.Retrying);
  283. Transition(TransporterState.Retrying, TransporterMSG.Transfer, RetryTransfer, TransporterState.Transfering);
  284. Transition(TransporterState.Retrying, TransporterMSG.PickUpMoveTo, RetryPickUpMoveTo, TransporterState.PickUpMoveToing);
  285. Transition(TransporterState.Retrying, TransporterMSG.PickUpValidate, RetryPickUpValidate, TransporterState.PickUpValidating);
  286. Transition(TransporterState.Retrying, TransporterMSG.Place, RetryPlace, TransporterState.Placing);
  287. Transition(TransporterState.Retrying, TransporterMSG.MoveTo, RetryMoveTo, TransporterState.MovingTo);
  288. //ConfirmComplete
  289. Transition(TransporterState.Init, TransporterMSG.ConfirmComplete, ClearModuleAlarm, TransporterState.Init);
  290. Transition(TransporterState.Idle, TransporterMSG.ConfirmComplete, ClearModuleAlarm, TransporterState.Idle);
  291. Transition(TransporterState.Error, TransporterMSG.ConfirmComplete, NullFunc, TransporterState.ConfirmCompleting);
  292. Transition(TransporterState.ConfirmCompleting, FSM_MSG.TIMER, ConfirmComplete, TransporterState.ConfirmCompleting);
  293. Transition(TransporterState.ConfirmCompleting, TransporterMSG.Transfer, ConfirmTransfer, TransporterState.Idle);
  294. Transition(TransporterState.ConfirmCompleting, TransporterMSG.PickUpValidate, ConfirmPickupValidate, TransporterState.PickUpValidateComplete);
  295. Transition(TransporterState.ConfirmCompleting, TransporterMSG.PickUpMoveTo, ConfirmPickupMoveto, TransporterState.PickUpMoveToComplete);
  296. Transition(TransporterState.ConfirmCompleting, TransporterMSG.Place, ConfirmPlace, TransporterState.Idle);
  297. Transition(TransporterState.ConfirmCompleting, TransporterMSG.MoveTo, ConfirmMoveto, TransporterState.ValidateMoveToComplete);
  298. EnumLoop<TransporterState>.ForEach((item) => { fsm.MapState((int)item, item.ToString()); });
  299. EnumLoop<TransporterMSG>.ForEach((item) => { fsm.MapMessage((int)item, item.ToString()); });
  300. }
  301. /// <summary>
  302. /// 初始化操作
  303. /// </summary>
  304. private void InitialOperation()
  305. {
  306. OP.Subscribe($"{Module}.Abort", (cmd, args) => { return CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.Abort); });
  307. OP.Subscribe($"{Module}.ClearError", (cmd, args) => { return CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.ResumeError); });
  308. OP.Subscribe($"{Module}.HomeAll", (cmd, args) => { return CheckToPostMessage<TransporterState,TransporterMSG>(eEvent.ERR_TRANSPORTER,Module.ToString(),(int)TransporterMSG.HomeAll); });
  309. OP.Subscribe($"{Module}.Gantry.GantryGotoSavedPosition", (cmd, args) => { return CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.GantryGoToSavedPosition, "Gantry", args); });
  310. //OP.Subscribe($"{Module}.Elevator.GotoSavedPosition", (cmd, args) => { return CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.GoToSavedPosition, "Elevator", args); });
  311. OP.Subscribe($"{Module}.PickUpFrom", (cmd, args) => { return CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.PickUpFrom,args); });
  312. OP.Subscribe($"{Module}.MoveTo", (cmd, args) => { return CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.MoveTo, args); });
  313. OP.Subscribe($"{Module}.PutDownTo", (cmd, args) => { return CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.Place, args); });
  314. OP.Subscribe($"{Module}.Park", (cmd, args) => { return CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.Park, args); });
  315. OP.Subscribe($"{Module}.ElevatorUp", (cmd, args) => { return CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.ElevatorUp, args); });
  316. OP.Subscribe($"{Module}.ElevatorLow", (cmd, args) => { return CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.ElevatorLow, args); });
  317. OP.Subscribe($"{Module}.SwitchOn", (cmd, args) => { return CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.SwitchOn, args); });
  318. OP.Subscribe($"{Module}.SwitchOff", (cmd, args) => { return CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.SwitchOff, args); });
  319. OP.Subscribe($"{Module}.Transfer", (cmd, args) => { return CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.Transfer, args); });
  320. }
  321. /// <summary>
  322. /// 初始化数据
  323. /// </summary>
  324. private void InitialDATA()
  325. {
  326. InitializeSvid();
  327. DATA.Subscribe($"{Module}.FsmState", () => ((TransporterState)fsm.State).ToString(), SubscriptionAttribute.FLAG.IgnoreSaveDB);
  328. DATA.Subscribe($"{Module}.IsHomed", () => _isHomed, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  329. DATA.Subscribe($"{Module}.IsIdle", () => IsIdle, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  330. DATA.Subscribe($"{Module}.IsError", () => IsError, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  331. }
  332. /// <summary>
  333. /// 初始化SVID
  334. /// </summary>
  335. private void InitializeSvid()
  336. {
  337. DATA.Subscribe($"{Module}.State", () => ((TransporterState)fsm.State).ToString(), SubscriptionAttribute.FLAG.IgnoreSaveDB);
  338. DATA.Subscribe($"{Module}.LotID", () => WaferHolderInfo?.LotId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  339. DATA.Subscribe($"{Module}.WSID", () => WaferHolderInfo?.Id, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  340. DATA.Subscribe($"{Module}.LSAID", () => WaferHolderInfo?.CrsAId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  341. DATA.Subscribe($"{Module}.LSBID", () => WaferHolderInfo?.CrsBId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  342. DATA.Subscribe($"{Module}.SequenceRecipe", () => WaferHolderInfo?.SequenceId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  343. DATA.Subscribe($"{Module}.WaferAID", () => WaferHolderInfo?.WaferAId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  344. DATA.Subscribe($"{Module}.WaferBID", () => WaferHolderInfo?.WaferBId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  345. DATA.Subscribe($"{Module}.Task", () => WaferHolderInfo?.CurrentControlJobId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  346. }
  347. /// <summary>
  348. /// 初始化Routine
  349. /// </summary>
  350. private void InitialRoutine()
  351. {
  352. _homeAllRoutine = new TransporterHomeRoutine(Module.ToString());
  353. _switchOnRoutine = new TransporterSwitchOnRoutine(Module.ToString());
  354. _switchOffRoutine=new TransporterSwitchOffRoutine(Module.ToString());
  355. _positionRoutine = new TransporterPositionRoutine(Module.ToString());
  356. _gantryPositionRoutine = new TransporterGantryPositionRoutine(Module.ToString());
  357. _pickUpFromRoutine = new TransporterPickUpFromRoutine(Module.ToString());
  358. _moveToRoutine=new TransporterMoveToRoutine(Module.ToString());
  359. _placeRoutine=new TransporterPickDownToRoutine(Module.ToString());
  360. _parkRoutine=new TransporterParkRoutine(Module.ToString());
  361. _elevatorUpRoutine=new TransporterElevatorUpRoutine(Module.ToString());
  362. _elevatorLowRoutine = new TransporterElevatorLowRoutine(Module.ToString());
  363. _transferRoutine =new TransporterTransferRoutine(Module.ToString());
  364. _pickUpMoveToRoutine = new TransporterPickUpMoveToRoutine(Module.ToString());
  365. _pickUpValidateRoutine=new TransporterPickUpValidateRoutine(Module.ToString());
  366. }
  367. /// <summary>
  368. /// 进入Error状态
  369. /// </summary>
  370. /// <param name="param"></param>
  371. /// <returns></returns>
  372. private bool EnterError(object[] param)
  373. {
  374. return true;
  375. }
  376. /// <summary>
  377. /// 恢复错误
  378. /// </summary>
  379. /// <param name="param"></param>
  380. /// <returns></returns>
  381. private bool ResumeError(object[] param)
  382. {
  383. if(_isHomed)
  384. {
  385. PostMsg(TransporterMSG.ReturnIdle);
  386. return false;
  387. }
  388. return true;
  389. }
  390. #region Abort
  391. private bool Abort(object parameter)
  392. {
  393. bool preHomed = IsHomed;
  394. _gantryAxis.StopPositionOperation();
  395. _elevatorAxis.StopPositionOperation();
  396. if (_currentRoutine != null)
  397. {
  398. _currentRoutine.Abort();
  399. _currentRoutine = null;
  400. }
  401. if (preHomed)
  402. {
  403. PostMsg(TransporterMSG.ReturnIdle);
  404. return false;
  405. }
  406. return true;
  407. }
  408. #endregion
  409. #region Switch On
  410. /// <summary>
  411. /// SwitchAll
  412. /// </summary>
  413. /// <param name="param"></param>
  414. /// <returns></returns>
  415. private bool SwitchOnAll(object[] param)
  416. {
  417. return _switchOnRoutine.Start() == RState.Running;
  418. }
  419. private bool SwitchOnTimeout(object[] param)
  420. {
  421. RState ret = _switchOnRoutine.Monitor();
  422. if (ret == RState.Failed || ret == RState.Timeout)
  423. {
  424. PostMsg(TransporterMSG.Error);
  425. return false;
  426. }
  427. bool result = ret == RState.End;
  428. if (result)
  429. {
  430. _isHomed = false;
  431. }
  432. return result;
  433. }
  434. #endregion
  435. #region Switch Off
  436. /// <summary>
  437. /// SwitchAll
  438. /// </summary>
  439. /// <param name="param"></param>
  440. /// <returns></returns>
  441. private bool SwitchOffAll(object[] param)
  442. {
  443. return _switchOffRoutine.Start() == RState.Running;
  444. }
  445. private bool SwitchOffTimeout(object[] param)
  446. {
  447. RState ret = _switchOffRoutine.Monitor();
  448. if (ret == RState.Failed || ret == RState.Timeout)
  449. {
  450. PostMsg(TransporterMSG.Error);
  451. return false;
  452. }
  453. bool result = ret == RState.End;
  454. if (result)
  455. {
  456. _isHomed = false;
  457. }
  458. return result;
  459. }
  460. #endregion
  461. #region Home
  462. /// <summary>
  463. /// HomeAll
  464. /// </summary>
  465. /// <param name="param"></param>
  466. /// <returns></returns>
  467. private bool HomeAll(object[] param)
  468. {
  469. _isHomed = false;
  470. bool result= _homeAllRoutine.Start() == RState.Running;
  471. if (result)
  472. {
  473. _currentRoutine = _homeAllRoutine;
  474. }
  475. return result;
  476. }
  477. /// <summary>
  478. /// Home超时
  479. /// </summary>
  480. /// <param name="param"></param>
  481. /// <returns></returns>
  482. private bool HomingTimeout(object[] param)
  483. {
  484. RState ret = _homeAllRoutine.Monitor();
  485. if (ret == RState.Failed || ret == RState.Timeout)
  486. {
  487. _currentRoutine = null;
  488. PostMsg(TransporterMSG.Error);
  489. _isHomed = false;
  490. return false;
  491. }
  492. bool result = ret == RState.End;
  493. if (result)
  494. {
  495. _currentRoutine = null;
  496. _isHomed = true;
  497. }
  498. return result;
  499. }
  500. #endregion
  501. #region GantrySafeMove
  502. /// <summary>
  503. /// Gantry安全移动
  504. /// </summary>
  505. /// <param name="param"></param>
  506. /// <returns></returns>
  507. private bool GantrySafeMove(object[] param)
  508. {
  509. double targetPosition=(double)param[0];
  510. return _gantryAxis.ProfilePositionOperation(targetPosition);
  511. }
  512. /// <summary>
  513. /// Gantry安全移动监控
  514. /// </summary>
  515. /// <param name="param"></param>
  516. /// <returns></returns>
  517. private bool GantrySafeMoveMonitor(object[] param)
  518. {
  519. if (_gantryAxis.Status == RState.End)
  520. {
  521. return true;
  522. }
  523. if (_gantryAxis.Status == RState.Failed || _gantryAxis.Status == RState.Timeout)
  524. {
  525. PostMsg(TransporterMSG.Error);
  526. return false;
  527. }
  528. return false;
  529. }
  530. #endregion
  531. #region Manual Gantry GoToPosition
  532. /// <summary>
  533. /// Manual Gantry Go to Position
  534. /// </summary>
  535. /// <param name="param"></param>
  536. /// <returns></returns>
  537. private bool ManualGantryGotoPosition(object[] param)
  538. {
  539. string axis = param[0].ToString();
  540. object[] objs = (object[])param[1];
  541. string position = objs[1].ToString();
  542. var result = CheckGotoPositionPreCondition(axis, position);
  543. if (result.result)
  544. {
  545. bool posresult = _gantryPositionRoutine.Start(position) == RState.Running;
  546. if (posresult)
  547. {
  548. _currentRoutine = _positionRoutine;
  549. }
  550. return posresult;
  551. }
  552. else
  553. {
  554. return false;
  555. }
  556. }
  557. /// <summary>
  558. /// Manual gantry Go to Position Time Out
  559. /// </summary>
  560. /// <param name="param"></param>
  561. /// <returns></returns>
  562. private bool ManualGantryGotoPositionTimeout(object[] param)
  563. {
  564. RState ret = _gantryPositionRoutine.Monitor();
  565. if (ret == RState.Failed || ret == RState.Timeout)
  566. {
  567. PostMsg(TransporterMSG.Error);
  568. _currentRoutine = null;
  569. return false;
  570. }
  571. bool result = ret == RState.End;
  572. if (result)
  573. {
  574. _currentRoutine = null;
  575. }
  576. return result;
  577. }
  578. /// <summary>
  579. /// 检验GotoPosition前置条件
  580. /// </summary>
  581. /// <param name="axis"></param>
  582. /// <param name="position"></param>
  583. /// <returns></returns>
  584. private (bool result, JetAxisBase axis) CheckGotoPositionPreCondition(string axis, string position)
  585. {
  586. switch (axis)
  587. {
  588. case "Gantry":
  589. return (_gantryAxis.CheckGotoPosition(position), _gantryAxis);
  590. case "Elevator":
  591. return (_elevatorAxis.CheckGotoPosition(position), _elevatorAxis);
  592. default:
  593. return (false, null);
  594. }
  595. }
  596. #endregion
  597. #region Pick Up
  598. /// <summary>
  599. /// Pick Up
  600. /// </summary>
  601. /// <param name="param"></param>
  602. /// <returns></returns>
  603. private bool PickUp(object[] param)
  604. {
  605. bool result= _pickUpFromRoutine.Start(param[0]) == RState.Running;
  606. if(result)
  607. {
  608. _currentRoutine = _pickUpFromRoutine;
  609. }
  610. return result;
  611. }
  612. /// <summary>
  613. /// PickUpFrom超时
  614. /// </summary>
  615. /// <param name="param"></param>
  616. /// <returns></returns>
  617. private bool PickUpFromTimeout(object[] param)
  618. {
  619. RState ret = _pickUpFromRoutine.Monitor();
  620. if (ret == RState.Failed || ret == RState.Timeout)
  621. {
  622. _currentRoutine = null;
  623. PostMsg(TransporterMSG.Error);
  624. return false;
  625. }
  626. bool result= ret == RState.End;
  627. if(result)
  628. {
  629. _currentRoutine = null;
  630. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), TransporterState.PickUping.ToString());
  631. }
  632. return result;
  633. }
  634. #endregion
  635. #region Move To
  636. /// <summary>
  637. /// Move To
  638. /// </summary>
  639. /// <param name="param"></param>
  640. /// <returns></returns>
  641. private bool MoveTo(object[] param)
  642. {
  643. if (!CheckOtherEntityStatus(param[0].ToString()))
  644. {
  645. LOG.WriteLog(eEvent.WARN_TRANSPORTER, Module.ToString(), $"Module Axis meets conflict of other Axis");
  646. return false;
  647. }
  648. bool result= _moveToRoutine.Start(param[0]) == RState.Running;
  649. if(result)
  650. {
  651. _targetCell = param[0].ToString();
  652. _sourceCell = "";
  653. _currentRoutine = _moveToRoutine;
  654. }
  655. return result;
  656. }
  657. /// <summary>
  658. /// Retry Place
  659. /// </summary>
  660. /// <param name="param"></param>
  661. /// <returns></returns>
  662. private bool RetryMoveTo(object[] param)
  663. {
  664. int stepIndex = (int)param[0];
  665. bool result = _moveToRoutine.Retry(stepIndex) == RState.Running;
  666. if (result)
  667. {
  668. _currentRoutine = _moveToRoutine;
  669. _targetCell = _moveToRoutine.TargetCell;
  670. }
  671. return result;
  672. }
  673. /// <summary>
  674. /// MoveTo超时
  675. /// </summary>
  676. /// <param name="param"></param>
  677. /// <returns></returns>
  678. private bool MoveToTimeout(object[] param)
  679. {
  680. RState ret = _moveToRoutine.Monitor();
  681. if (ret == RState.Failed || ret == RState.Timeout)
  682. {
  683. _targetCell = "";
  684. _currentRoutine = null;
  685. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  686. {
  687. AlarmList alarmList = new AlarmList(Module.ToString(), ((TransporterState)fsm.State).ToString(), (int)TransporterMSG.MoveTo,
  688. _placeRoutine.ErrorMsg, _placeRoutine.ErrorStep, (int)AlarmType.Error);
  689. AlarmListManager.Instance.AddAlarm(alarmList);
  690. }
  691. PostMsg(TransporterMSG.Error);
  692. return false;
  693. }
  694. bool result = ret == RState.End;
  695. if (result)
  696. {
  697. _targetCell = "";
  698. _currentRoutine = null;
  699. if (!string.IsNullOrEmpty(_sourceCell))
  700. {
  701. _sourceCell = "";
  702. }
  703. }
  704. return result;
  705. }
  706. /// <summary>
  707. /// 确认Place是否完成
  708. /// </summary>
  709. /// <param name="param"></param>
  710. /// <returns></returns>
  711. private bool ConfirmMoveto(object[] param)
  712. {
  713. int stepIdex = (int)param[0];
  714. bool result = _moveToRoutine.CheckCompleteCondition(stepIdex);
  715. if (!result)
  716. {
  717. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  718. {
  719. AlarmList alarmList = new AlarmList(Module.ToString(), ((TransporterState)fsm.State).ToString(), (int)TransporterMSG.MoveTo,
  720. _moveToRoutine.ErrorMsg, _moveToRoutine.ErrorStep, (int)AlarmType.Error);
  721. AlarmListManager.Instance.AddAlarm(alarmList);
  722. }
  723. PostMsg(TransporterMSG.Error);
  724. }
  725. else
  726. {
  727. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  728. {
  729. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), TransporterState.MovingTo.ToString());
  730. }
  731. }
  732. return result;
  733. }
  734. #endregion
  735. #region Place
  736. /// <summary>
  737. /// Place
  738. /// </summary>
  739. /// <param name="param"></param>
  740. /// <returns></returns>
  741. private bool Place(object[] param)
  742. {
  743. _targetCell = "";
  744. bool result = _placeRoutine.Start(param[0]) == RState.Running;
  745. if(result)
  746. {
  747. _currentRoutine = _placeRoutine;
  748. _targetCell = param[0].ToString();
  749. }
  750. return result;
  751. }
  752. /// <summary>
  753. /// Retry Place
  754. /// </summary>
  755. /// <param name="param"></param>
  756. /// <returns></returns>
  757. private bool RetryPlace(object[] param)
  758. {
  759. int stepIndex = (int)param[0];
  760. bool result = _placeRoutine.Retry(stepIndex) == RState.Running;
  761. if (result)
  762. {
  763. _currentRoutine = _placeRoutine;
  764. _targetCell = _placeRoutine.TargetCell;
  765. }
  766. return result;
  767. }
  768. /// <summary>
  769. /// Place超时
  770. /// </summary>
  771. /// <param name="param"></param>
  772. /// <returns></returns>
  773. private bool PlaceTimeout(object[] param)
  774. {
  775. RState ret = _placeRoutine.Monitor();
  776. if (ret == RState.Failed || ret == RState.Timeout)
  777. {
  778. _currentRoutine = null;
  779. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  780. {
  781. AlarmList alarmList = new AlarmList(Module.ToString(), ((TransporterState)fsm.State).ToString(), (int)TransporterMSG.Place,
  782. _placeRoutine.ErrorMsg, _placeRoutine.ErrorStep, (int)AlarmType.Error);
  783. AlarmListManager.Instance.AddAlarm(alarmList);
  784. }
  785. PostMsg(TransporterMSG.Error);
  786. return false;
  787. }
  788. bool result = ret == RState.End;
  789. if (result)
  790. {
  791. _currentRoutine = null;
  792. _targetCell = "";
  793. if (!string.IsNullOrEmpty(_sourceCell))
  794. {
  795. _sourceCell = "";
  796. }
  797. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), TransporterState.Placing.ToString());
  798. }
  799. return result;
  800. }
  801. /// <summary>
  802. /// 确认Place是否完成
  803. /// </summary>
  804. /// <param name="param"></param>
  805. /// <returns></returns>
  806. private bool ConfirmPlace(object[] param)
  807. {
  808. int stepIdex = (int)param[0];
  809. bool result = _placeRoutine.CheckCompleteCondition(stepIdex);
  810. if (!result)
  811. {
  812. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  813. {
  814. AlarmList alarmList = new AlarmList(Module.ToString(), ((TransporterState)fsm.State).ToString(), (int)TransporterMSG.Place,
  815. _placeRoutine.ErrorMsg, _placeRoutine.ErrorStep, (int)AlarmType.Error);
  816. AlarmListManager.Instance.AddAlarm(alarmList);
  817. }
  818. PostMsg(TransporterMSG.Error);
  819. }
  820. else
  821. {
  822. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  823. {
  824. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), TransporterState.Placing.ToString());
  825. }
  826. }
  827. return result;
  828. }
  829. #endregion
  830. #region Park
  831. /// <summary>
  832. /// Park
  833. /// </summary>
  834. /// <param name="param"></param>
  835. /// <returns></returns>
  836. private bool Park(object[] param)
  837. {
  838. bool result = _parkRoutine.Start() == RState.Running;
  839. if (result)
  840. {
  841. _currentRoutine = _parkRoutine;
  842. }
  843. return result;
  844. }
  845. /// <summary>
  846. /// Park超时
  847. /// </summary>
  848. /// <param name="param"></param>
  849. /// <returns></returns>
  850. private bool ParkTimeout(object[] param)
  851. {
  852. RState ret = _parkRoutine.Monitor();
  853. if (ret == RState.Failed || ret == RState.Timeout)
  854. {
  855. _currentRoutine = null;
  856. PostMsg(TransporterMSG.Error);
  857. return false;
  858. }
  859. bool result = ret == RState.End;
  860. if (result)
  861. {
  862. _currentRoutine = null;
  863. }
  864. return result;
  865. }
  866. #endregion
  867. #region Elevator Up
  868. /// <summary>
  869. /// Elevator Up
  870. /// </summary>
  871. /// <param name="param"></param>
  872. /// <returns></returns>
  873. private bool ElevatorUp(object[] param)
  874. {
  875. bool result = _elevatorUpRoutine.Start() == RState.Running;
  876. if (result)
  877. {
  878. _currentRoutine = _elevatorUpRoutine;
  879. }
  880. return result;
  881. }
  882. /// <summary>
  883. /// Elevator Up超时
  884. /// </summary>
  885. /// <param name="param"></param>
  886. /// <returns></returns>
  887. private bool ElevatorUpTimeout(object[] param)
  888. {
  889. RState ret = _elevatorUpRoutine.Monitor();
  890. if (ret == RState.Failed || ret == RState.Timeout)
  891. {
  892. _currentRoutine = null;
  893. PostMsg(TransporterMSG.Error);
  894. return false;
  895. }
  896. bool result = ret == RState.End;
  897. if (result)
  898. {
  899. _currentRoutine = null;
  900. }
  901. return result;
  902. }
  903. #endregion
  904. #region Elevator Low
  905. /// <summary>
  906. /// Elevator Low
  907. /// </summary>
  908. /// <param name="param"></param>
  909. /// <returns></returns>
  910. private bool ElevatorLow(object[] param)
  911. {
  912. bool result= _elevatorLowRoutine.Start() == RState.Running;
  913. if (result)
  914. {
  915. _currentRoutine = _elevatorLowRoutine;
  916. }
  917. return result;
  918. }
  919. /// <summary>
  920. /// Elevator Low超时
  921. /// </summary>
  922. /// <param name="param"></param>
  923. /// <returns></returns>
  924. private bool ElevatorLowTimeout(object[] param)
  925. {
  926. RState ret = _elevatorLowRoutine.Monitor();
  927. if (ret == RState.Failed || ret == RState.Timeout)
  928. {
  929. _currentRoutine = null;
  930. PostMsg(TransporterMSG.Error);
  931. return false;
  932. }
  933. bool result = ret == RState.End;
  934. if (result)
  935. {
  936. _currentRoutine = null;
  937. }
  938. return result;
  939. }
  940. #endregion
  941. #region Transfer
  942. /// <summary>
  943. /// Transfer
  944. /// </summary>
  945. /// <param name="param"></param>
  946. /// <returns></returns>
  947. private bool Transfer(object[] param)
  948. {
  949. if (!CheckOtherEntityStatus(param[0].ToString()))
  950. {
  951. LOG.WriteLog(eEvent.WARN_TRANSPORTER, Module.ToString(), $"Module Axis meets conflict of other Axis from {param[0]}");
  952. return false;
  953. }
  954. if (!CheckOtherEntityStatus(param[1].ToString()))
  955. {
  956. LOG.WriteLog(eEvent.WARN_TRANSPORTER, Module.ToString(), $"Module Axis meets conflict of other Axis to {param[1]}");
  957. return false;
  958. }
  959. bool result = _transferRoutine.Start(param) == RState.Running;
  960. if (result)
  961. {
  962. _sourceCell=param[0].ToString();
  963. _targetCell = param[1].ToString();
  964. _currentRoutine = _transferRoutine;
  965. }
  966. return result;
  967. }
  968. /// <summary>
  969. /// Retry Transfer
  970. /// </summary>
  971. /// <param name="param"></param>
  972. /// <returns></returns>
  973. private bool RetryTransfer(object[] param)
  974. {
  975. if (!CheckOtherEntityStatus(_sourceCell))
  976. {
  977. LOG.WriteLog(eEvent.WARN_TRANSPORTER, Module.ToString(), $"Module Axis meets conflict of other Axis from {_sourceCell}");
  978. return false;
  979. }
  980. if (!CheckOtherEntityStatus(_targetCell))
  981. {
  982. LOG.WriteLog(eEvent.WARN_TRANSPORTER, Module.ToString(), $"Module Axis meets conflict of other Axis to {_targetCell}");
  983. return false;
  984. }
  985. int stepIndex = (int)param[0];
  986. bool result = _transferRoutine.Retry(stepIndex) == RState.Running;
  987. if (result)
  988. {
  989. _currentRoutine = _transferRoutine;
  990. _sourceCell=_transferRoutine.SourceCell;
  991. _targetCell=_transferRoutine.TargetCell;
  992. }
  993. return result;
  994. }
  995. /// <summary>
  996. /// Transfer超时
  997. /// </summary>
  998. /// <param name="param"></param>
  999. /// <returns></returns>
  1000. private bool TransferTimeout(object[] param)
  1001. {
  1002. RState ret = _transferRoutine.Monitor();
  1003. if (ret == RState.Failed || ret == RState.Timeout)
  1004. {
  1005. _targetCell = "";
  1006. _sourceCell = "";
  1007. _currentRoutine = null;
  1008. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  1009. {
  1010. AlarmList alarmList = new AlarmList(Module.ToString(), ((TransporterState)fsm.State).ToString(), (int)TransporterMSG.Transfer,
  1011. _transferRoutine.ErrorMsg, _transferRoutine.ErrorStep, (int)AlarmType.Error);
  1012. AlarmListManager.Instance.AddAlarm(alarmList);
  1013. }
  1014. PostMsg(TransporterMSG.Error);
  1015. return false;
  1016. }
  1017. bool result = ret == RState.End;
  1018. if (result)
  1019. {
  1020. _targetCell = "";
  1021. _sourceCell = "";
  1022. _currentRoutine = null;
  1023. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), TransporterState.Transfering.ToString());
  1024. }
  1025. return result;
  1026. }
  1027. /// <summary>
  1028. /// 确认Transfer是否完成
  1029. /// </summary>
  1030. /// <param name="param"></param>
  1031. /// <returns></returns>
  1032. private bool ConfirmTransfer(object[] param)
  1033. {
  1034. int stepIdex = (int)param[0];
  1035. bool result = _transferRoutine.CheckCompleteCondition(stepIdex);
  1036. if (!result)
  1037. {
  1038. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  1039. {
  1040. AlarmList alarmList = new AlarmList(Module.ToString(), ((TransporterState)fsm.State).ToString(), (int)TransporterMSG.Transfer,
  1041. _transferRoutine.ErrorMsg, _transferRoutine.ErrorStep, (int)AlarmType.Error);
  1042. AlarmListManager.Instance.AddAlarm(alarmList);
  1043. }
  1044. PostMsg(TransporterMSG.Error);
  1045. }
  1046. else
  1047. {
  1048. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  1049. {
  1050. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), TransporterState.Transfering.ToString());
  1051. }
  1052. }
  1053. return result;
  1054. }
  1055. /// <summary>
  1056. /// 检验另一个Axis状态
  1057. /// </summary>
  1058. /// <returns></returns>
  1059. public bool CheckOtherEntityStatus(string targetCell)
  1060. {
  1061. bool positive = false;
  1062. TransporterEntity otherEntity=null;
  1063. string otherModule = "";
  1064. if (Module == ModuleName.Transporter2)
  1065. {
  1066. otherModule = ModuleName.Transporter1.ToString();
  1067. otherEntity = Singleton<RouteManager>.Instance.GetModule<TransporterEntity>(ModuleName.Transporter1.ToString());
  1068. positive = true;
  1069. }
  1070. else
  1071. {
  1072. otherModule = ModuleName.Transporter2.ToString();
  1073. otherEntity = Singleton<RouteManager>.Instance.GetModule<TransporterEntity>(ModuleName.Transporter2.ToString());
  1074. }
  1075. if(otherEntity==null)
  1076. {
  1077. return true;
  1078. }
  1079. if (otherEntity.IsIdle)
  1080. {
  1081. return true;
  1082. }
  1083. if (otherEntity.IsError)
  1084. {
  1085. return false;
  1086. }
  1087. if(otherEntity.State==(int)TransporterState.Transfering||otherEntity.State==(int)TransporterState.PickUpMoveToing
  1088. ||otherEntity.State==(int)TransporterState.MovingTo||otherEntity.State==(int)TransporterState.PickUpValidating
  1089. ||otherEntity.State==(int)TransporterState.PickUpValidateComplete||otherEntity.State==(int)TransporterState.ValidateMoveTo)
  1090. {
  1091. bool conflict= CheckModuleWithOtherModuleConflict(otherEntity,otherModule,positive,targetCell);
  1092. if(conflict)
  1093. {
  1094. return false;
  1095. }
  1096. else
  1097. {
  1098. return true;
  1099. }
  1100. }
  1101. else
  1102. {
  1103. return true;
  1104. }
  1105. }
  1106. /// <summary>
  1107. /// 分析目标cell的位置
  1108. /// </summary>
  1109. /// <param name="otherModule"></param>
  1110. /// <param name="targetCell"></param>
  1111. /// <returns></returns>
  1112. private (bool result,double targetPosition) AnalyseTargetCellPosition(string otherModule,string targetCell)
  1113. {
  1114. ProcessLayoutCellItem _cellItem = ProcessLayoutManager.Instance.GetProcessLayoutCellItemByModuleName(targetCell);
  1115. string stationName = targetCell;
  1116. if (_cellItem != null)
  1117. {
  1118. if (targetCell.ToLower() != "loader" && targetCell.ToLower() != "park")
  1119. {
  1120. stationName = $"Cell{_cellItem.CellId}";
  1121. }
  1122. }
  1123. else
  1124. {
  1125. LOG.WriteLog(eEvent.ERR_TRANSPORTER, Module.ToString(), $"{targetCell} not in layout");
  1126. return (false,0);
  1127. }
  1128. JetAxisBase otherGantryAxis = DEVICE.GetDevice<JetAxisBase>($"{otherModule}.Gantry");
  1129. var result = otherGantryAxis.GetPositionByStation(stationName);
  1130. if(result.success)
  1131. {
  1132. return (true,result.position);
  1133. }
  1134. return (false,0);
  1135. }
  1136. /// <summary>
  1137. /// 检验当前模块与另一个模块是否存在冲突
  1138. /// </summary>
  1139. /// <returns></returns>
  1140. private bool CheckModuleWithOtherModuleConflict(TransporterEntity otherEntity,string otherModule,bool positive,string targetCell)
  1141. {
  1142. int transporterMinimumDistance = SC.GetValue<int>("Transporter.TransporterMinimumDistance");
  1143. double motorPosition = _gantryAxis.MotionData.MotorPosition;
  1144. if(targetCell==ModuleName.Loader1.ToString())
  1145. {
  1146. targetCell = "Loader";
  1147. }
  1148. var result = AnalyseTargetCellPosition(Module.ToString(), targetCell);
  1149. if(!result.result)
  1150. {
  1151. return false;
  1152. }
  1153. double targetPosition=result.targetPosition;
  1154. JetAxisBase otherGantryAxis = DEVICE.GetDevice<JetAxisBase>($"{otherModule}.Gantry");
  1155. if(otherGantryAxis==null)
  1156. {
  1157. return false;
  1158. }
  1159. double otherPosition = otherGantryAxis.MotionData.MotorPosition;
  1160. if (!string.IsNullOrEmpty(otherEntity.TargetCell))
  1161. {
  1162. return CheckOtherModuleCellConflict(otherModule, otherEntity.TargetCell,otherPosition, positive, targetPosition);
  1163. }
  1164. if(!string.IsNullOrEmpty(otherEntity.SourceCell))
  1165. {
  1166. bool conflict= CheckOtherModuleCellConflict(otherModule, otherEntity.SourceCell,otherPosition, positive, targetPosition);
  1167. if (conflict)
  1168. {
  1169. //另一个Entity已经到达了目标位置
  1170. if (!string.IsNullOrEmpty(otherEntity.TargetCell)&&CheckOtherEntityAlreadyInTargetCell(otherEntity, otherEntity.TargetCell))
  1171. {
  1172. return false;
  1173. }
  1174. }
  1175. return conflict;
  1176. }
  1177. else
  1178. {
  1179. return false;
  1180. }
  1181. }
  1182. /// <summary>
  1183. /// 检验其他TransporterEntity已经到达目标cell
  1184. /// </summary>
  1185. /// <param name="otherEntity"></param>
  1186. /// <param name="targetCell"></param>
  1187. /// <returns></returns>
  1188. private bool CheckOtherEntityAlreadyInTargetCell(TransporterEntity otherEntity,string targetCell)
  1189. {
  1190. //另一个Transporter已经取走了WaferHolder,同时gantry已经到达了目标cell
  1191. if (otherEntity.WaferHolderInfo != null)
  1192. {
  1193. JetAxisBase jetAxisBase = DEVICE.GetDevice<JetAxisBase>($"{otherEntity.Module}.Gantry");
  1194. if (jetAxisBase != null && jetAxisBase.CheckPositionIsInStation(jetAxisBase.MotionData.MotorPosition, targetCell))
  1195. {
  1196. return true;
  1197. }
  1198. }
  1199. return false;
  1200. }
  1201. /// <summary>
  1202. /// 检验另一个模块Cell是否存在冲突
  1203. /// </summary>
  1204. /// <param name="otherModule"></param>
  1205. /// <param name="cell"></param>
  1206. /// <param name="positive"></param>
  1207. /// <param name="motorPosition"></param>
  1208. /// <param name="targetPosition"></param>
  1209. /// <returns></returns>
  1210. private bool CheckOtherModuleCellConflict(string otherModule, string cell,double otherPosition, bool positive,double targetPosition)
  1211. {
  1212. int transporterMinimumDistance = SC.GetValue<int>("Transporter.TransporterMinimumDistance");
  1213. var result = AnalyseTargetCellPosition(otherModule, cell);
  1214. if (!result.result)
  1215. {
  1216. return false;
  1217. }
  1218. else
  1219. {
  1220. if (positive)
  1221. {
  1222. // if (result.targetPosition - transporterMinimumDistance <= motorPosition)
  1223. // {
  1224. // return true;
  1225. // }
  1226. if (result.targetPosition - transporterMinimumDistance <= targetPosition)
  1227. {
  1228. return true;
  1229. }
  1230. if(otherPosition - transporterMinimumDistance <= targetPosition)
  1231. {
  1232. return true;
  1233. }
  1234. return false;
  1235. }
  1236. else
  1237. {
  1238. //if (result.targetPosition + transporterMinimumDistance >= motorPosition)
  1239. //{
  1240. // return true;
  1241. //}
  1242. if (result.targetPosition + transporterMinimumDistance >= targetPosition)
  1243. {
  1244. return true;
  1245. }
  1246. if(otherPosition + transporterMinimumDistance >= targetPosition)
  1247. {
  1248. return true;
  1249. }
  1250. return false;
  1251. }
  1252. }
  1253. }
  1254. #endregion
  1255. #region PickUpMoveTo
  1256. /// <summary>
  1257. /// PickUpMoveTo
  1258. /// </summary>
  1259. /// <param name="param"></param>
  1260. /// <returns></returns>
  1261. private bool PickUpMoveTo(object[] param)
  1262. {
  1263. if (!CheckOtherEntityStatus(param[0].ToString()))
  1264. {
  1265. LOG.WriteLog(eEvent.WARN_TRANSPORTER, Module.ToString(), $"Module Axis meets conflict of other Axis from {param[0]}");
  1266. return false;
  1267. }
  1268. if (!CheckOtherEntityStatus(param[1].ToString()))
  1269. {
  1270. LOG.WriteLog(eEvent.WARN_TRANSPORTER, Module.ToString(), $"Module Axis meets conflict of other Axis to {param[1]}");
  1271. return false;
  1272. }
  1273. bool result = _pickUpMoveToRoutine.Start(param) == RState.Running;
  1274. if (result)
  1275. {
  1276. _sourceCell = param[0].ToString();
  1277. _targetCell = param[1].ToString();
  1278. _currentRoutine = _pickUpMoveToRoutine;
  1279. }
  1280. return result;
  1281. }
  1282. /// <summary>
  1283. /// Retry PickUpMoveTo
  1284. /// </summary>
  1285. /// <param name="param"></param>
  1286. /// <returns></returns>
  1287. private bool RetryPickUpMoveTo(object[] param)
  1288. {
  1289. if (!CheckOtherEntityStatus(_sourceCell))
  1290. {
  1291. LOG.WriteLog(eEvent.WARN_TRANSPORTER, Module.ToString(), $"Module Axis meets conflict of other Axis from {_sourceCell}");
  1292. return false;
  1293. }
  1294. if (!CheckOtherEntityStatus(_targetCell))
  1295. {
  1296. LOG.WriteLog(eEvent.WARN_TRANSPORTER, Module.ToString(), $"Module Axis meets conflict of other Axis to {_targetCell}");
  1297. return false;
  1298. }
  1299. int stepIndex = (int)param[0];
  1300. bool result = _pickUpMoveToRoutine.Retry(stepIndex) == RState.Running;
  1301. if (result)
  1302. {
  1303. _currentRoutine = _pickUpMoveToRoutine;
  1304. _sourceCell = _pickUpMoveToRoutine.SourceCell;
  1305. _targetCell= _pickUpMoveToRoutine.TargetCell;
  1306. }
  1307. return result;
  1308. }
  1309. /// <summary>
  1310. /// PickUpMoveTo超时
  1311. /// </summary>
  1312. /// <param name="param"></param>
  1313. /// <returns></returns>
  1314. private bool PickUpMoveToTimeout(object[] param)
  1315. {
  1316. RState ret = _pickUpMoveToRoutine.Monitor();
  1317. if (ret == RState.Failed || ret == RState.Timeout)
  1318. {
  1319. _targetCell = "";
  1320. _sourceCell = "";
  1321. _currentRoutine = null;
  1322. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  1323. {
  1324. AlarmList alarmList = new AlarmList(Module.ToString(), ((TransporterState)fsm.State).ToString(), (int)TransporterMSG.PickUpMoveTo,
  1325. _pickUpMoveToRoutine.ErrorMsg, _pickUpMoveToRoutine.ErrorStep, (int)AlarmType.Error);
  1326. AlarmListManager.Instance.AddAlarm(alarmList);
  1327. }
  1328. PostMsg(TransporterMSG.Error);
  1329. return false;
  1330. }
  1331. bool result = ret == RState.End;
  1332. if (result)
  1333. {
  1334. _targetCell = "";
  1335. _sourceCell = "";
  1336. _currentRoutine = null;
  1337. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), TransporterState.PickUpMoveToing.ToString());
  1338. }
  1339. return result;
  1340. }
  1341. /// <summary>
  1342. /// 确认PickupMoveto是否完成
  1343. /// </summary>
  1344. /// <param name="param"></param>
  1345. /// <returns></returns>
  1346. private bool ConfirmPickupMoveto(object[] param)
  1347. {
  1348. int stepIdex = (int)param[0];
  1349. bool result = _pickUpMoveToRoutine.CheckCompleteCondition(stepIdex);
  1350. if (!result)
  1351. {
  1352. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  1353. {
  1354. AlarmList alarmList = new AlarmList(Module.ToString(), ((TransporterState)fsm.State).ToString(), (int)TransporterMSG.PickUpMoveTo,
  1355. _pickUpMoveToRoutine.ErrorMsg, _pickUpMoveToRoutine.ErrorStep, (int)AlarmType.Error);
  1356. AlarmListManager.Instance.AddAlarm(alarmList);
  1357. }
  1358. PostMsg(TransporterMSG.Error);
  1359. }
  1360. else
  1361. {
  1362. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  1363. {
  1364. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), TransporterState.PickUpMoveToing.ToString());
  1365. }
  1366. }
  1367. return result;
  1368. }
  1369. #endregion
  1370. #region PickUpValidate
  1371. /// <summary>
  1372. /// PickUpValidate
  1373. /// </summary>
  1374. /// <param name="param"></param>
  1375. /// <returns></returns>
  1376. private bool PickUpValidate(object[] param)
  1377. {
  1378. if (!CheckOtherEntityStatus(param[0].ToString()))
  1379. {
  1380. LOG.WriteLog(eEvent.WARN_TRANSPORTER, Module.ToString(), $"Module Axis meets conflict of other Axis from {param[0]}");
  1381. return false;
  1382. }
  1383. bool result = _pickUpValidateRoutine.Start(param) == RState.Running;
  1384. if (result)
  1385. {
  1386. _sourceCell = param[0].ToString();
  1387. _currentRoutine = _pickUpValidateRoutine;
  1388. }
  1389. return result;
  1390. }
  1391. /// <summary>
  1392. /// Retry PickUpValidate
  1393. /// </summary>
  1394. /// <param name="param"></param>
  1395. /// <returns></returns>
  1396. private bool RetryPickUpValidate(object[] param)
  1397. {
  1398. if (!CheckOtherEntityStatus(_sourceCell))
  1399. {
  1400. LOG.WriteLog(eEvent.WARN_TRANSPORTER, Module.ToString(), $"Module Axis meets conflict of other Axis from {_sourceCell}");
  1401. return false;
  1402. }
  1403. int stepIndex = (int)param[0];
  1404. bool result = _pickUpValidateRoutine.Retry(stepIndex) == RState.Running;
  1405. if (result)
  1406. {
  1407. _currentRoutine = _pickUpValidateRoutine;
  1408. _sourceCell = _pickUpValidateRoutine.SourceCell;
  1409. }
  1410. return result;
  1411. }
  1412. /// <summary>
  1413. /// PickUpValidate超时
  1414. /// </summary>
  1415. /// <param name="param"></param>
  1416. /// <returns></returns>
  1417. private bool PickUpValidateTimeout(object[] param)
  1418. {
  1419. RState ret = _pickUpValidateRoutine.Monitor();
  1420. if (ret == RState.Failed || ret == RState.Timeout)
  1421. {
  1422. _sourceCell = "";
  1423. _currentRoutine = null;
  1424. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  1425. {
  1426. AlarmList alarmList = new AlarmList(Module.ToString(), ((TransporterState)fsm.State).ToString(), (int)TransporterMSG.PickUpValidate,
  1427. _pickUpValidateRoutine.ErrorMsg, _pickUpValidateRoutine.ErrorStep, (int)AlarmType.Error);
  1428. AlarmListManager.Instance.AddAlarm(alarmList);
  1429. }
  1430. PostMsg(TransporterMSG.Error);
  1431. return false;
  1432. }
  1433. bool result = ret == RState.End;
  1434. if (result)
  1435. {
  1436. _currentRoutine = null;
  1437. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), TransporterState.PickUpValidating.ToString());
  1438. //Routine完成,但transporter却没有WaferHolder,则表示此次取WH失败,transporter返回Idle,便于调度重新选择下一个WaferHolder
  1439. if (WaferHolderInfo == null)
  1440. {
  1441. PostMsg(TransporterMSG.ReturnIdle);
  1442. return false;
  1443. }
  1444. }
  1445. return result;
  1446. }
  1447. /// <summary>
  1448. /// 确认PickupValidate是否完成
  1449. /// </summary>
  1450. /// <param name="param"></param>
  1451. /// <returns></returns>
  1452. private bool ConfirmPickupValidate(object[] param)
  1453. {
  1454. int stepIdex = (int)param[0];
  1455. bool result = _pickUpValidateRoutine.CheckCompleteCondition(stepIdex);
  1456. if (!result)
  1457. {
  1458. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  1459. {
  1460. AlarmList alarmList = new AlarmList(Module.ToString(), ((TransporterState)fsm.State).ToString(), (int)TransporterMSG.PickUpValidate,
  1461. _pickUpValidateRoutine.ErrorMsg, _pickUpValidateRoutine.ErrorStep, (int)AlarmType.Error);
  1462. AlarmListManager.Instance.AddAlarm(alarmList);
  1463. }
  1464. PostMsg(TransporterMSG.Error);
  1465. }
  1466. else
  1467. {
  1468. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  1469. {
  1470. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), TransporterState.PickUpValidating.ToString());
  1471. }
  1472. }
  1473. return result;
  1474. }
  1475. #endregion
  1476. #region TransporterRetry
  1477. /// <summary>
  1478. /// Retry
  1479. /// </summary>
  1480. /// <param name="param"></param>
  1481. /// <returns></returns>
  1482. private bool TransporterRetry(object[] param)
  1483. {
  1484. AlarmList alarmList = AlarmListManager.Instance.GetAlarmListByModule(Module.ToString());
  1485. if (alarmList != null)
  1486. {
  1487. CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), alarmList.ModuleCmd,
  1488. alarmList.ModuleStep);
  1489. }
  1490. return false;
  1491. }
  1492. #endregion
  1493. #region ConfirmComplete
  1494. /// <summary>
  1495. /// 确认是否完成
  1496. /// </summary>
  1497. /// <param name="param"></param>
  1498. /// <returns></returns>
  1499. private bool ConfirmComplete(object[] param)
  1500. {
  1501. AlarmList alarmList = AlarmListManager.Instance.GetAlarmListByModule(Module.ToString());
  1502. if (alarmList != null)
  1503. {
  1504. if (alarmList.ModuleState == TransporterState.Transfering.ToString())
  1505. {
  1506. CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.Transfer, alarmList.ModuleStep);
  1507. }
  1508. else if (alarmList.ModuleState == TransporterState.PickUpMoveToing.ToString())
  1509. {
  1510. CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.PickUpMoveTo, alarmList.ModuleStep);
  1511. }
  1512. else if (alarmList.ModuleState == TransporterState.Placing.ToString())
  1513. {
  1514. CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.Place, alarmList.ModuleStep);
  1515. }
  1516. else if (alarmList.ModuleState == TransporterState.MovingTo.ToString())
  1517. {
  1518. CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.MoveTo, alarmList.ModuleStep);
  1519. }
  1520. else
  1521. {
  1522. PostMsg(TransporterMSG.Error);
  1523. }
  1524. }
  1525. return false;
  1526. }
  1527. /// <summary>
  1528. /// 清除报警
  1529. /// </summary>
  1530. /// <param name="param"></param>
  1531. /// <returns></returns>
  1532. private bool ClearModuleAlarm(object[] param)
  1533. {
  1534. AlarmList alarmList = AlarmListManager.Instance.GetAlarmListByModule(Module.ToString());
  1535. if (alarmList != null)
  1536. {
  1537. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), "");
  1538. }
  1539. return true;
  1540. }
  1541. #endregion
  1542. #region switchWafer
  1543. /// <summary>
  1544. /// 交换Wafer
  1545. /// </summary>
  1546. /// <param name="from"></param>
  1547. /// <param name="to"></param>
  1548. public void SwitchWafer(string from,string to)
  1549. {
  1550. ModuleName fromModuleName = ModuleName.Unknown;
  1551. if (from == "Loader")
  1552. {
  1553. fromModuleName = ModuleName.Loader1;
  1554. }
  1555. else
  1556. {
  1557. fromModuleName = (ModuleName)Enum.Parse(typeof(ModuleName), from);
  1558. }
  1559. ModuleName toModuleName = ModuleName.Unknown;
  1560. if (to == "Loader")
  1561. {
  1562. toModuleName = ModuleName.Loader1;
  1563. }
  1564. else
  1565. {
  1566. toModuleName = (ModuleName)Enum.Parse(typeof(ModuleName), to);
  1567. }
  1568. bool reverse = false;
  1569. JetAxisBase loaderRotation = DEVICE.GetDevice<JetAxisBase>($"{ModuleName.Loader1}.Rotation");
  1570. if (fromModuleName == ModuleName.Loader1)
  1571. {
  1572. if (loaderRotation.CheckPositionInStationIgnoreWaferSize(loaderRotation.MotionData.MotorPosition, TRNPB))
  1573. {
  1574. reverse = true;
  1575. }
  1576. }
  1577. if (toModuleName == ModuleName.Loader1)
  1578. {
  1579. if (loaderRotation.CheckPositionInStationIgnoreWaferSize(loaderRotation.MotionData.MotorPosition, TRNPB))
  1580. {
  1581. reverse = true;
  1582. }
  1583. }
  1584. if (WaferManager.Instance.CheckHasWafer(fromModuleName, 0))
  1585. {
  1586. if (!reverse)
  1587. {
  1588. WaferManager.Instance.WaferMoved(fromModuleName, 0, toModuleName, 0);
  1589. }
  1590. else
  1591. {
  1592. WaferInfo waferInfo = WaferManager.Instance.GetWafer(fromModuleName, 0);
  1593. WaferHolderInfo info = WaferHolderManager.Instance.GetWaferHolder(to);
  1594. info.WaferBId = waferInfo.WaferID;
  1595. info.WaferBType =(int)waferInfo.WaferType;
  1596. WaferManager.Instance.WaferMoved(fromModuleName, 0, toModuleName, 1);
  1597. }
  1598. }
  1599. if (WaferManager.Instance.CheckHasWafer(fromModuleName, 1))
  1600. {
  1601. if (!reverse)
  1602. {
  1603. WaferManager.Instance.WaferMoved(fromModuleName, 1, toModuleName, 1);
  1604. }
  1605. else
  1606. {
  1607. WaferInfo waferInfo = WaferManager.Instance.GetWafer(fromModuleName, 1);
  1608. WaferHolderInfo info = WaferHolderManager.Instance.GetWaferHolder(to);
  1609. info.WaferAId = waferInfo.WaferID;
  1610. info.WaferAType = (int)waferInfo.WaferType;
  1611. WaferManager.Instance.WaferMoved(fromModuleName, 1, toModuleName, 0);
  1612. }
  1613. }
  1614. MaterialTrackerManager.Instance.UpdateModuleMaterial(to);
  1615. }
  1616. #endregion
  1617. public bool Check(int msg, out string reason, params object[] args)
  1618. {
  1619. reason = "";
  1620. return false;
  1621. }
  1622. public bool CheckAcked(int msg)
  1623. {
  1624. return false;
  1625. }
  1626. public int Invoke(string function, params object[] args)
  1627. {
  1628. switch (function)
  1629. {
  1630. case "HomeAll":
  1631. if(IsIdle)
  1632. {
  1633. return (int)FSM_MSG.NONE;
  1634. }
  1635. if (CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.HomeAll))
  1636. {
  1637. return (int)FSM_MSG.NONE;
  1638. }
  1639. else
  1640. {
  1641. return (int)FSM_MSG.ALARM;
  1642. }
  1643. case "Abort":
  1644. CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.Abort);
  1645. return (int)FSM_MSG.NONE;
  1646. case "Retry":
  1647. if (CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.Retry, args))
  1648. {
  1649. return (int)TransporterMSG.Retry;
  1650. }
  1651. else
  1652. {
  1653. return (int)FSM_MSG.NONE;
  1654. }
  1655. case "ConfirmComplete":
  1656. if (CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.ConfirmComplete, args))
  1657. {
  1658. return (int)TransporterMSG.ConfirmComplete;
  1659. }
  1660. else
  1661. {
  1662. return (int)FSM_MSG.NONE;
  1663. }
  1664. }
  1665. return (int)FSM_MSG.NONE;
  1666. }
  1667. }
  1668. public enum TransporterMSG
  1669. {
  1670. HomeAll, // 0
  1671. SwitchOn,
  1672. SwitchOff,
  1673. Error,
  1674. ResumeError,
  1675. ReturnIdle,
  1676. Abort,
  1677. GantryGoToSavedPosition,
  1678. GoToSavedPosition,
  1679. PickUpFrom,
  1680. MoveTo,
  1681. Place,
  1682. Park,
  1683. ElevatorUp,
  1684. ElevatorLow,
  1685. Transfer,
  1686. PickUpMoveTo,
  1687. PickUpValidate,
  1688. GantrySafeMove,
  1689. Retry,
  1690. ConfirmComplete,
  1691. Flip
  1692. }
  1693. }