TransporterEntity.cs 68 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689
  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. //ConfirmComplete
  288. Transition(TransporterState.Init, TransporterMSG.ConfirmComplete, ClearModuleAlarm, TransporterState.Init);
  289. Transition(TransporterState.Idle, TransporterMSG.ConfirmComplete, ClearModuleAlarm, TransporterState.Idle);
  290. Transition(TransporterState.Error, TransporterMSG.ConfirmComplete, NullFunc, TransporterState.ConfirmCompleting);
  291. Transition(TransporterState.ConfirmCompleting, FSM_MSG.TIMER, ConfirmComplete, TransporterState.ConfirmCompleting);
  292. Transition(TransporterState.ConfirmCompleting, TransporterMSG.Transfer, ConfirmTransfer, TransporterState.Idle);
  293. Transition(TransporterState.ConfirmCompleting, TransporterMSG.PickUpValidate, ConfirmPickupValidate, TransporterState.PickUpValidateComplete);
  294. Transition(TransporterState.ConfirmCompleting, TransporterMSG.PickUpMoveTo, ConfirmPickupMoveto, TransporterState.PickUpMoveToComplete);
  295. Transition(TransporterState.ConfirmCompleting, TransporterMSG.Place, ConfirmPlace, TransporterState.Idle);
  296. EnumLoop<TransporterState>.ForEach((item) => { fsm.MapState((int)item, item.ToString()); });
  297. EnumLoop<TransporterMSG>.ForEach((item) => { fsm.MapMessage((int)item, item.ToString()); });
  298. }
  299. /// <summary>
  300. /// 初始化操作
  301. /// </summary>
  302. private void InitialOperation()
  303. {
  304. OP.Subscribe($"{Module}.Abort", (cmd, args) => { return CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.Abort); });
  305. OP.Subscribe($"{Module}.ClearError", (cmd, args) => { return CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.ResumeError); });
  306. OP.Subscribe($"{Module}.HomeAll", (cmd, args) => { return CheckToPostMessage<TransporterState,TransporterMSG>(eEvent.ERR_TRANSPORTER,Module.ToString(),(int)TransporterMSG.HomeAll); });
  307. OP.Subscribe($"{Module}.Gantry.GantryGotoSavedPosition", (cmd, args) => { return CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.GantryGoToSavedPosition, "Gantry", args); });
  308. //OP.Subscribe($"{Module}.Elevator.GotoSavedPosition", (cmd, args) => { return CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.GoToSavedPosition, "Elevator", args); });
  309. OP.Subscribe($"{Module}.PickUpFrom", (cmd, args) => { return CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.PickUpFrom,args); });
  310. OP.Subscribe($"{Module}.MoveTo", (cmd, args) => { return CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.MoveTo, args); });
  311. OP.Subscribe($"{Module}.PutDownTo", (cmd, args) => { return CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.Place, args); });
  312. OP.Subscribe($"{Module}.Park", (cmd, args) => { return CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.Park, args); });
  313. OP.Subscribe($"{Module}.ElevatorUp", (cmd, args) => { return CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.ElevatorUp, args); });
  314. OP.Subscribe($"{Module}.ElevatorLow", (cmd, args) => { return CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.ElevatorLow, args); });
  315. OP.Subscribe($"{Module}.SwitchOn", (cmd, args) => { return CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.SwitchOn, args); });
  316. OP.Subscribe($"{Module}.SwitchOff", (cmd, args) => { return CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.SwitchOff, args); });
  317. OP.Subscribe($"{Module}.Transfer", (cmd, args) => { return CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.Transfer, args); });
  318. }
  319. /// <summary>
  320. /// 初始化数据
  321. /// </summary>
  322. private void InitialDATA()
  323. {
  324. InitializeSvid();
  325. DATA.Subscribe($"{Module}.FsmState", () => ((TransporterState)fsm.State).ToString(), SubscriptionAttribute.FLAG.IgnoreSaveDB);
  326. DATA.Subscribe($"{Module}.IsHomed", () => _isHomed, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  327. DATA.Subscribe($"{Module}.IsIdle", () => IsIdle, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  328. DATA.Subscribe($"{Module}.IsError", () => IsError, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  329. }
  330. /// <summary>
  331. /// 初始化SVID
  332. /// </summary>
  333. private void InitializeSvid()
  334. {
  335. DATA.Subscribe($"{Module}.State", () => ((TransporterState)fsm.State).ToString(), SubscriptionAttribute.FLAG.IgnoreSaveDB);
  336. DATA.Subscribe($"{Module}.LotID", () => WaferHolderInfo?.LotId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  337. DATA.Subscribe($"{Module}.WSID", () => WaferHolderInfo?.Id, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  338. DATA.Subscribe($"{Module}.LSAID", () => WaferHolderInfo?.CrsAId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  339. DATA.Subscribe($"{Module}.LSBID", () => WaferHolderInfo?.CrsBId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  340. DATA.Subscribe($"{Module}.SequenceRecipe", () => WaferHolderInfo?.SequenceId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  341. DATA.Subscribe($"{Module}.WaferAID", () => WaferHolderInfo?.WaferAId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  342. DATA.Subscribe($"{Module}.WaferBID", () => WaferHolderInfo?.WaferBId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  343. DATA.Subscribe($"{Module}.Task", () => WaferHolderInfo?.CurrentControlJobId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  344. }
  345. /// <summary>
  346. /// 初始化Routine
  347. /// </summary>
  348. private void InitialRoutine()
  349. {
  350. _homeAllRoutine = new TransporterHomeRoutine(Module.ToString());
  351. _switchOnRoutine = new TransporterSwitchOnRoutine(Module.ToString());
  352. _switchOffRoutine=new TransporterSwitchOffRoutine(Module.ToString());
  353. _positionRoutine = new TransporterPositionRoutine(Module.ToString());
  354. _gantryPositionRoutine = new TransporterGantryPositionRoutine(Module.ToString());
  355. _pickUpFromRoutine = new TransporterPickUpFromRoutine(Module.ToString());
  356. _moveToRoutine=new TransporterMoveToRoutine(Module.ToString());
  357. _placeRoutine=new TransporterPickDownToRoutine(Module.ToString());
  358. _parkRoutine=new TransporterParkRoutine(Module.ToString());
  359. _elevatorUpRoutine=new TransporterElevatorUpRoutine(Module.ToString());
  360. _elevatorLowRoutine = new TransporterElevatorLowRoutine(Module.ToString());
  361. _transferRoutine =new TransporterTransferRoutine(Module.ToString());
  362. _pickUpMoveToRoutine = new TransporterPickUpMoveToRoutine(Module.ToString());
  363. _pickUpValidateRoutine=new TransporterPickUpValidateRoutine(Module.ToString());
  364. }
  365. /// <summary>
  366. /// 进入Error状态
  367. /// </summary>
  368. /// <param name="param"></param>
  369. /// <returns></returns>
  370. private bool EnterError(object[] param)
  371. {
  372. return true;
  373. }
  374. /// <summary>
  375. /// 恢复错误
  376. /// </summary>
  377. /// <param name="param"></param>
  378. /// <returns></returns>
  379. private bool ResumeError(object[] param)
  380. {
  381. if(_isHomed)
  382. {
  383. PostMsg(TransporterMSG.ReturnIdle);
  384. return false;
  385. }
  386. return true;
  387. }
  388. #region Abort
  389. private bool Abort(object parameter)
  390. {
  391. bool preHomed = IsHomed;
  392. _gantryAxis.StopPositionOperation();
  393. _elevatorAxis.StopPositionOperation();
  394. if (_currentRoutine != null)
  395. {
  396. _currentRoutine.Abort();
  397. _currentRoutine = null;
  398. }
  399. if (preHomed)
  400. {
  401. PostMsg(TransporterMSG.ReturnIdle);
  402. return false;
  403. }
  404. return true;
  405. }
  406. #endregion
  407. #region Switch On
  408. /// <summary>
  409. /// SwitchAll
  410. /// </summary>
  411. /// <param name="param"></param>
  412. /// <returns></returns>
  413. private bool SwitchOnAll(object[] param)
  414. {
  415. return _switchOnRoutine.Start() == RState.Running;
  416. }
  417. private bool SwitchOnTimeout(object[] param)
  418. {
  419. RState ret = _switchOnRoutine.Monitor();
  420. if (ret == RState.Failed || ret == RState.Timeout)
  421. {
  422. PostMsg(TransporterMSG.Error);
  423. return false;
  424. }
  425. bool result = ret == RState.End;
  426. if (result)
  427. {
  428. _isHomed = false;
  429. }
  430. return result;
  431. }
  432. #endregion
  433. #region Switch Off
  434. /// <summary>
  435. /// SwitchAll
  436. /// </summary>
  437. /// <param name="param"></param>
  438. /// <returns></returns>
  439. private bool SwitchOffAll(object[] param)
  440. {
  441. return _switchOffRoutine.Start() == RState.Running;
  442. }
  443. private bool SwitchOffTimeout(object[] param)
  444. {
  445. RState ret = _switchOffRoutine.Monitor();
  446. if (ret == RState.Failed || ret == RState.Timeout)
  447. {
  448. PostMsg(TransporterMSG.Error);
  449. return false;
  450. }
  451. bool result = ret == RState.End;
  452. if (result)
  453. {
  454. _isHomed = false;
  455. }
  456. return result;
  457. }
  458. #endregion
  459. #region Home
  460. /// <summary>
  461. /// HomeAll
  462. /// </summary>
  463. /// <param name="param"></param>
  464. /// <returns></returns>
  465. private bool HomeAll(object[] param)
  466. {
  467. _isHomed = false;
  468. bool result= _homeAllRoutine.Start() == RState.Running;
  469. if (result)
  470. {
  471. _currentRoutine = _homeAllRoutine;
  472. }
  473. return result;
  474. }
  475. /// <summary>
  476. /// Home超时
  477. /// </summary>
  478. /// <param name="param"></param>
  479. /// <returns></returns>
  480. private bool HomingTimeout(object[] param)
  481. {
  482. RState ret = _homeAllRoutine.Monitor();
  483. if (ret == RState.Failed || ret == RState.Timeout)
  484. {
  485. _currentRoutine = null;
  486. PostMsg(TransporterMSG.Error);
  487. _isHomed = false;
  488. return false;
  489. }
  490. bool result = ret == RState.End;
  491. if (result)
  492. {
  493. _currentRoutine = null;
  494. _isHomed = true;
  495. }
  496. return result;
  497. }
  498. #endregion
  499. #region GantrySafeMove
  500. /// <summary>
  501. /// Gantry安全移动
  502. /// </summary>
  503. /// <param name="param"></param>
  504. /// <returns></returns>
  505. private bool GantrySafeMove(object[] param)
  506. {
  507. double targetPosition=(double)param[0];
  508. return _gantryAxis.ProfilePositionOperation(targetPosition);
  509. }
  510. /// <summary>
  511. /// Gantry安全移动监控
  512. /// </summary>
  513. /// <param name="param"></param>
  514. /// <returns></returns>
  515. private bool GantrySafeMoveMonitor(object[] param)
  516. {
  517. if (_gantryAxis.Status == RState.End)
  518. {
  519. return true;
  520. }
  521. if (_gantryAxis.Status == RState.Failed || _gantryAxis.Status == RState.Timeout)
  522. {
  523. PostMsg(TransporterMSG.Error);
  524. return false;
  525. }
  526. return false;
  527. }
  528. #endregion
  529. #region Manual Gantry GoToPosition
  530. /// <summary>
  531. /// Manual Gantry Go to Position
  532. /// </summary>
  533. /// <param name="param"></param>
  534. /// <returns></returns>
  535. private bool ManualGantryGotoPosition(object[] param)
  536. {
  537. string axis = param[0].ToString();
  538. object[] objs = (object[])param[1];
  539. string position = objs[1].ToString();
  540. var result = CheckGotoPositionPreCondition(axis, position);
  541. if (result.result)
  542. {
  543. bool posresult = _gantryPositionRoutine.Start(position) == RState.Running;
  544. if (posresult)
  545. {
  546. _currentRoutine = _positionRoutine;
  547. }
  548. return posresult;
  549. }
  550. else
  551. {
  552. return false;
  553. }
  554. }
  555. /// <summary>
  556. /// Manual gantry Go to Position Time Out
  557. /// </summary>
  558. /// <param name="param"></param>
  559. /// <returns></returns>
  560. private bool ManualGantryGotoPositionTimeout(object[] param)
  561. {
  562. RState ret = _gantryPositionRoutine.Monitor();
  563. if (ret == RState.Failed || ret == RState.Timeout)
  564. {
  565. PostMsg(TransporterMSG.Error);
  566. _currentRoutine = null;
  567. return false;
  568. }
  569. bool result = ret == RState.End;
  570. if (result)
  571. {
  572. _currentRoutine = null;
  573. }
  574. return result;
  575. }
  576. /// <summary>
  577. /// 检验GotoPosition前置条件
  578. /// </summary>
  579. /// <param name="axis"></param>
  580. /// <param name="position"></param>
  581. /// <returns></returns>
  582. private (bool result, JetAxisBase axis) CheckGotoPositionPreCondition(string axis, string position)
  583. {
  584. switch (axis)
  585. {
  586. case "Gantry":
  587. return (_gantryAxis.CheckGotoPosition(position), _gantryAxis);
  588. case "Elevator":
  589. return (_elevatorAxis.CheckGotoPosition(position), _elevatorAxis);
  590. default:
  591. return (false, null);
  592. }
  593. }
  594. #endregion
  595. #region Pick Up
  596. /// <summary>
  597. /// Pick Up
  598. /// </summary>
  599. /// <param name="param"></param>
  600. /// <returns></returns>
  601. private bool PickUp(object[] param)
  602. {
  603. bool result= _pickUpFromRoutine.Start(param[0]) == RState.Running;
  604. if(result)
  605. {
  606. _currentRoutine = _pickUpFromRoutine;
  607. }
  608. return result;
  609. }
  610. /// <summary>
  611. /// PickUpFrom超时
  612. /// </summary>
  613. /// <param name="param"></param>
  614. /// <returns></returns>
  615. private bool PickUpFromTimeout(object[] param)
  616. {
  617. RState ret = _pickUpFromRoutine.Monitor();
  618. if (ret == RState.Failed || ret == RState.Timeout)
  619. {
  620. _currentRoutine = null;
  621. PostMsg(TransporterMSG.Error);
  622. return false;
  623. }
  624. bool result= ret == RState.End;
  625. if(result)
  626. {
  627. _currentRoutine = null;
  628. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), TransporterState.PickUping.ToString());
  629. }
  630. return result;
  631. }
  632. #endregion
  633. #region Move To
  634. /// <summary>
  635. /// Move To
  636. /// </summary>
  637. /// <param name="param"></param>
  638. /// <returns></returns>
  639. private bool MoveTo(object[] param)
  640. {
  641. if (!CheckOtherEntityStatus(param[0].ToString()))
  642. {
  643. LOG.WriteLog(eEvent.WARN_TRANSPORTER, Module.ToString(), $"Module Axis meets conflict of other Axis");
  644. return false;
  645. }
  646. bool result= _moveToRoutine.Start(param[0]) == RState.Running;
  647. if(result)
  648. {
  649. _targetCell = param[0].ToString();
  650. _sourceCell = "";
  651. _currentRoutine = _moveToRoutine;
  652. }
  653. return result;
  654. }
  655. /// <summary>
  656. /// MoveTo超时
  657. /// </summary>
  658. /// <param name="param"></param>
  659. /// <returns></returns>
  660. private bool MoveToTimeout(object[] param)
  661. {
  662. RState ret = _moveToRoutine.Monitor();
  663. if (ret == RState.Failed || ret == RState.Timeout)
  664. {
  665. _targetCell = "";
  666. _currentRoutine = null;
  667. PostMsg(TransporterMSG.Error);
  668. return false;
  669. }
  670. bool result = ret == RState.End;
  671. if(result)
  672. {
  673. _targetCell = "";
  674. _currentRoutine = null;
  675. if (!string.IsNullOrEmpty(_sourceCell))
  676. {
  677. _sourceCell = "";
  678. }
  679. }
  680. return result;
  681. }
  682. #endregion
  683. #region Place
  684. /// <summary>
  685. /// Place
  686. /// </summary>
  687. /// <param name="param"></param>
  688. /// <returns></returns>
  689. private bool Place(object[] param)
  690. {
  691. _targetCell = "";
  692. bool result = _placeRoutine.Start(param[0]) == RState.Running;
  693. if(result)
  694. {
  695. _currentRoutine = _placeRoutine;
  696. _targetCell = param[0].ToString();
  697. }
  698. return result;
  699. }
  700. /// <summary>
  701. /// Retry Place
  702. /// </summary>
  703. /// <param name="param"></param>
  704. /// <returns></returns>
  705. private bool RetryPlace(object[] param)
  706. {
  707. int stepIndex = (int)param[0];
  708. bool result = _placeRoutine.Retry(stepIndex) == RState.Running;
  709. if (result)
  710. {
  711. _currentRoutine = _placeRoutine;
  712. }
  713. return result;
  714. }
  715. /// <summary>
  716. /// Place超时
  717. /// </summary>
  718. /// <param name="param"></param>
  719. /// <returns></returns>
  720. private bool PlaceTimeout(object[] param)
  721. {
  722. RState ret = _placeRoutine.Monitor();
  723. if (ret == RState.Failed || ret == RState.Timeout)
  724. {
  725. _currentRoutine = null;
  726. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  727. {
  728. AlarmList alarmList = new AlarmList(Module.ToString(), ((TransporterState)fsm.State).ToString(), (int)TransporterMSG.Place,
  729. _placeRoutine.ErrorMsg, _placeRoutine.ErrorStep, (int)AlarmType.Error);
  730. AlarmListManager.Instance.AddAlarm(alarmList);
  731. }
  732. PostMsg(TransporterMSG.Error);
  733. return false;
  734. }
  735. bool result = ret == RState.End;
  736. if (result)
  737. {
  738. _currentRoutine = null;
  739. _targetCell = "";
  740. if (!string.IsNullOrEmpty(_sourceCell))
  741. {
  742. _sourceCell = "";
  743. }
  744. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), TransporterState.Placing.ToString());
  745. }
  746. return result;
  747. }
  748. /// <summary>
  749. /// 确认Place是否完成
  750. /// </summary>
  751. /// <param name="param"></param>
  752. /// <returns></returns>
  753. private bool ConfirmPlace(object[] param)
  754. {
  755. int stepIdex = (int)param[0];
  756. bool result = _placeRoutine.CheckCompleteCondition(stepIdex);
  757. if (!result)
  758. {
  759. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  760. {
  761. AlarmList alarmList = new AlarmList(Module.ToString(), ((TransporterState)fsm.State).ToString(), (int)TransporterMSG.Place,
  762. _placeRoutine.ErrorMsg, _placeRoutine.ErrorStep, (int)AlarmType.Error);
  763. AlarmListManager.Instance.AddAlarm(alarmList);
  764. }
  765. PostMsg(TransporterMSG.Error);
  766. }
  767. else
  768. {
  769. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  770. {
  771. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), TransporterState.Placing.ToString());
  772. }
  773. }
  774. return result;
  775. }
  776. #endregion
  777. #region Park
  778. /// <summary>
  779. /// Park
  780. /// </summary>
  781. /// <param name="param"></param>
  782. /// <returns></returns>
  783. private bool Park(object[] param)
  784. {
  785. bool result = _parkRoutine.Start() == RState.Running;
  786. if (result)
  787. {
  788. _currentRoutine = _parkRoutine;
  789. }
  790. return result;
  791. }
  792. /// <summary>
  793. /// Park超时
  794. /// </summary>
  795. /// <param name="param"></param>
  796. /// <returns></returns>
  797. private bool ParkTimeout(object[] param)
  798. {
  799. RState ret = _parkRoutine.Monitor();
  800. if (ret == RState.Failed || ret == RState.Timeout)
  801. {
  802. _currentRoutine = null;
  803. PostMsg(TransporterMSG.Error);
  804. return false;
  805. }
  806. bool result = ret == RState.End;
  807. if (result)
  808. {
  809. _currentRoutine = null;
  810. }
  811. return result;
  812. }
  813. #endregion
  814. #region Elevator Up
  815. /// <summary>
  816. /// Elevator Up
  817. /// </summary>
  818. /// <param name="param"></param>
  819. /// <returns></returns>
  820. private bool ElevatorUp(object[] param)
  821. {
  822. bool result = _elevatorUpRoutine.Start() == RState.Running;
  823. if (result)
  824. {
  825. _currentRoutine = _elevatorUpRoutine;
  826. }
  827. return result;
  828. }
  829. /// <summary>
  830. /// Elevator Up超时
  831. /// </summary>
  832. /// <param name="param"></param>
  833. /// <returns></returns>
  834. private bool ElevatorUpTimeout(object[] param)
  835. {
  836. RState ret = _elevatorUpRoutine.Monitor();
  837. if (ret == RState.Failed || ret == RState.Timeout)
  838. {
  839. _currentRoutine = null;
  840. PostMsg(TransporterMSG.Error);
  841. return false;
  842. }
  843. bool result = ret == RState.End;
  844. if (result)
  845. {
  846. _currentRoutine = null;
  847. }
  848. return result;
  849. }
  850. #endregion
  851. #region Elevator Low
  852. /// <summary>
  853. /// Elevator Low
  854. /// </summary>
  855. /// <param name="param"></param>
  856. /// <returns></returns>
  857. private bool ElevatorLow(object[] param)
  858. {
  859. bool result= _elevatorLowRoutine.Start() == RState.Running;
  860. if (result)
  861. {
  862. _currentRoutine = _elevatorLowRoutine;
  863. }
  864. return result;
  865. }
  866. /// <summary>
  867. /// Elevator Low超时
  868. /// </summary>
  869. /// <param name="param"></param>
  870. /// <returns></returns>
  871. private bool ElevatorLowTimeout(object[] param)
  872. {
  873. RState ret = _elevatorLowRoutine.Monitor();
  874. if (ret == RState.Failed || ret == RState.Timeout)
  875. {
  876. _currentRoutine = null;
  877. PostMsg(TransporterMSG.Error);
  878. return false;
  879. }
  880. bool result = ret == RState.End;
  881. if (result)
  882. {
  883. _currentRoutine = null;
  884. }
  885. return result;
  886. }
  887. #endregion
  888. #region Transfer
  889. /// <summary>
  890. /// Transfer
  891. /// </summary>
  892. /// <param name="param"></param>
  893. /// <returns></returns>
  894. private bool Transfer(object[] param)
  895. {
  896. if (!CheckOtherEntityStatus(param[0].ToString()))
  897. {
  898. LOG.WriteLog(eEvent.WARN_TRANSPORTER, Module.ToString(), $"Module Axis meets conflict of other Axis from {param[0]}");
  899. return false;
  900. }
  901. if (!CheckOtherEntityStatus(param[1].ToString()))
  902. {
  903. LOG.WriteLog(eEvent.WARN_TRANSPORTER, Module.ToString(), $"Module Axis meets conflict of other Axis to {param[1]}");
  904. return false;
  905. }
  906. bool result = _transferRoutine.Start(param) == RState.Running;
  907. if (result)
  908. {
  909. _sourceCell=param[0].ToString();
  910. _targetCell = param[1].ToString();
  911. _currentRoutine = _transferRoutine;
  912. }
  913. return result;
  914. }
  915. /// <summary>
  916. /// Retry Transfer
  917. /// </summary>
  918. /// <param name="param"></param>
  919. /// <returns></returns>
  920. private bool RetryTransfer(object[] param)
  921. {
  922. if (!CheckOtherEntityStatus(_sourceCell))
  923. {
  924. LOG.WriteLog(eEvent.WARN_TRANSPORTER, Module.ToString(), $"Module Axis meets conflict of other Axis from {_sourceCell}");
  925. return false;
  926. }
  927. if (!CheckOtherEntityStatus(_targetCell))
  928. {
  929. LOG.WriteLog(eEvent.WARN_TRANSPORTER, Module.ToString(), $"Module Axis meets conflict of other Axis to {_targetCell}");
  930. return false;
  931. }
  932. int stepIndex = (int)param[0];
  933. bool result = _transferRoutine.Retry(stepIndex) == RState.Running;
  934. if (result)
  935. {
  936. _currentRoutine = _transferRoutine;
  937. }
  938. return result;
  939. }
  940. /// <summary>
  941. /// Transfer超时
  942. /// </summary>
  943. /// <param name="param"></param>
  944. /// <returns></returns>
  945. private bool TransferTimeout(object[] param)
  946. {
  947. RState ret = _transferRoutine.Monitor();
  948. if (ret == RState.Failed || ret == RState.Timeout)
  949. {
  950. _targetCell = "";
  951. _sourceCell = "";
  952. _currentRoutine = null;
  953. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  954. {
  955. AlarmList alarmList = new AlarmList(Module.ToString(), ((TransporterState)fsm.State).ToString(), (int)TransporterMSG.Transfer,
  956. _transferRoutine.ErrorMsg, _transferRoutine.ErrorStep, (int)AlarmType.Error);
  957. AlarmListManager.Instance.AddAlarm(alarmList);
  958. }
  959. PostMsg(TransporterMSG.Error);
  960. return false;
  961. }
  962. bool result = ret == RState.End;
  963. if (result)
  964. {
  965. _targetCell = "";
  966. _sourceCell = "";
  967. _currentRoutine = null;
  968. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), TransporterState.Transfering.ToString());
  969. }
  970. return result;
  971. }
  972. /// <summary>
  973. /// 确认Transfer是否完成
  974. /// </summary>
  975. /// <param name="param"></param>
  976. /// <returns></returns>
  977. private bool ConfirmTransfer(object[] param)
  978. {
  979. int stepIdex = (int)param[0];
  980. bool result = _transferRoutine.CheckCompleteCondition(stepIdex);
  981. if (!result)
  982. {
  983. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  984. {
  985. AlarmList alarmList = new AlarmList(Module.ToString(), ((TransporterState)fsm.State).ToString(), (int)TransporterMSG.Transfer,
  986. _transferRoutine.ErrorMsg, _transferRoutine.ErrorStep, (int)AlarmType.Error);
  987. AlarmListManager.Instance.AddAlarm(alarmList);
  988. }
  989. PostMsg(TransporterMSG.Error);
  990. }
  991. else
  992. {
  993. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  994. {
  995. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), TransporterState.Transfering.ToString());
  996. }
  997. }
  998. return result;
  999. }
  1000. /// <summary>
  1001. /// 检验另一个Axis状态
  1002. /// </summary>
  1003. /// <returns></returns>
  1004. public bool CheckOtherEntityStatus(string targetCell)
  1005. {
  1006. bool positive = false;
  1007. TransporterEntity otherEntity=null;
  1008. string otherModule = "";
  1009. if (Module == ModuleName.Transporter2)
  1010. {
  1011. otherModule = ModuleName.Transporter1.ToString();
  1012. otherEntity = Singleton<RouteManager>.Instance.GetModule<TransporterEntity>(ModuleName.Transporter1.ToString());
  1013. positive = true;
  1014. }
  1015. else
  1016. {
  1017. otherModule = ModuleName.Transporter2.ToString();
  1018. otherEntity = Singleton<RouteManager>.Instance.GetModule<TransporterEntity>(ModuleName.Transporter2.ToString());
  1019. }
  1020. if(otherEntity==null)
  1021. {
  1022. return true;
  1023. }
  1024. if (otherEntity.IsIdle)
  1025. {
  1026. return true;
  1027. }
  1028. if (otherEntity.IsError)
  1029. {
  1030. return false;
  1031. }
  1032. if(otherEntity.State==(int)TransporterState.Transfering||otherEntity.State==(int)TransporterState.PickUpMoveToing
  1033. ||otherEntity.State==(int)TransporterState.MovingTo||otherEntity.State==(int)TransporterState.PickUpValidating
  1034. ||otherEntity.State==(int)TransporterState.PickUpValidateComplete||otherEntity.State==(int)TransporterState.ValidateMoveTo)
  1035. {
  1036. bool conflict= CheckModuleWithOtherModuleConflict(otherEntity,otherModule,positive,targetCell);
  1037. if(conflict)
  1038. {
  1039. return false;
  1040. }
  1041. else
  1042. {
  1043. return true;
  1044. }
  1045. }
  1046. else
  1047. {
  1048. return true;
  1049. }
  1050. }
  1051. /// <summary>
  1052. /// 分析目标cell的位置
  1053. /// </summary>
  1054. /// <param name="otherModule"></param>
  1055. /// <param name="targetCell"></param>
  1056. /// <returns></returns>
  1057. private (bool result,double targetPosition) AnalyseTargetCellPosition(string otherModule,string targetCell)
  1058. {
  1059. ProcessLayoutCellItem _cellItem = ProcessLayoutManager.Instance.GetProcessLayoutCellItemByModuleName(targetCell);
  1060. string stationName = targetCell;
  1061. if (_cellItem != null)
  1062. {
  1063. if (targetCell.ToLower() != "loader" && targetCell.ToLower() != "park")
  1064. {
  1065. stationName = $"Cell{_cellItem.CellId}";
  1066. }
  1067. }
  1068. else
  1069. {
  1070. LOG.WriteLog(eEvent.ERR_TRANSPORTER, Module.ToString(), $"{targetCell} not in layout");
  1071. return (false,0);
  1072. }
  1073. JetAxisBase otherGantryAxis = DEVICE.GetDevice<JetAxisBase>($"{otherModule}.Gantry");
  1074. var result = otherGantryAxis.GetPositionByStation(stationName);
  1075. if(result.success)
  1076. {
  1077. return (true,result.position);
  1078. }
  1079. return (false,0);
  1080. }
  1081. /// <summary>
  1082. /// 检验当前模块与另一个模块是否存在冲突
  1083. /// </summary>
  1084. /// <returns></returns>
  1085. private bool CheckModuleWithOtherModuleConflict(TransporterEntity otherEntity,string otherModule,bool positive,string targetCell)
  1086. {
  1087. int transporterMinimumDistance = SC.GetValue<int>("Transporter.TransporterMinimumDistance");
  1088. double motorPosition = _gantryAxis.MotionData.MotorPosition;
  1089. if(targetCell==ModuleName.Loader1.ToString())
  1090. {
  1091. targetCell = "Loader";
  1092. }
  1093. var result = AnalyseTargetCellPosition(Module.ToString(), targetCell);
  1094. if(!result.result)
  1095. {
  1096. return false;
  1097. }
  1098. double targetPosition=result.targetPosition;
  1099. JetAxisBase otherGantryAxis = DEVICE.GetDevice<JetAxisBase>($"{otherModule}.Gantry");
  1100. if(otherGantryAxis==null)
  1101. {
  1102. return false;
  1103. }
  1104. double otherPosition = otherGantryAxis.MotionData.MotorPosition;
  1105. if (!string.IsNullOrEmpty(otherEntity.TargetCell))
  1106. {
  1107. return CheckOtherModuleCellConflict(otherModule, otherEntity.TargetCell,otherPosition, positive, targetPosition);
  1108. }
  1109. if(!string.IsNullOrEmpty(otherEntity.SourceCell))
  1110. {
  1111. bool conflict= CheckOtherModuleCellConflict(otherModule, otherEntity.SourceCell,otherPosition, positive, targetPosition);
  1112. if (conflict)
  1113. {
  1114. //另一个Entity已经到达了目标位置
  1115. if (!string.IsNullOrEmpty(otherEntity.TargetCell)&&CheckOtherEntityAlreadyInTargetCell(otherEntity, otherEntity.TargetCell))
  1116. {
  1117. return false;
  1118. }
  1119. }
  1120. return conflict;
  1121. }
  1122. else
  1123. {
  1124. return false;
  1125. }
  1126. }
  1127. /// <summary>
  1128. /// 检验其他TransporterEntity已经到达目标cell
  1129. /// </summary>
  1130. /// <param name="otherEntity"></param>
  1131. /// <param name="targetCell"></param>
  1132. /// <returns></returns>
  1133. private bool CheckOtherEntityAlreadyInTargetCell(TransporterEntity otherEntity,string targetCell)
  1134. {
  1135. //另一个Transporter已经取走了WaferHolder,同时gantry已经到达了目标cell
  1136. if (otherEntity.WaferHolderInfo != null)
  1137. {
  1138. JetAxisBase jetAxisBase = DEVICE.GetDevice<JetAxisBase>($"{otherEntity.Module}.Gantry");
  1139. if (jetAxisBase != null && jetAxisBase.CheckPositionIsInStation(jetAxisBase.MotionData.MotorPosition, targetCell))
  1140. {
  1141. return true;
  1142. }
  1143. }
  1144. return false;
  1145. }
  1146. /// <summary>
  1147. /// 检验另一个模块Cell是否存在冲突
  1148. /// </summary>
  1149. /// <param name="otherModule"></param>
  1150. /// <param name="cell"></param>
  1151. /// <param name="positive"></param>
  1152. /// <param name="motorPosition"></param>
  1153. /// <param name="targetPosition"></param>
  1154. /// <returns></returns>
  1155. private bool CheckOtherModuleCellConflict(string otherModule, string cell,double otherPosition, bool positive,double targetPosition)
  1156. {
  1157. int transporterMinimumDistance = SC.GetValue<int>("Transporter.TransporterMinimumDistance");
  1158. var result = AnalyseTargetCellPosition(otherModule, cell);
  1159. if (!result.result)
  1160. {
  1161. return false;
  1162. }
  1163. else
  1164. {
  1165. if (positive)
  1166. {
  1167. // if (result.targetPosition - transporterMinimumDistance <= motorPosition)
  1168. // {
  1169. // return true;
  1170. // }
  1171. if (result.targetPosition - transporterMinimumDistance <= targetPosition)
  1172. {
  1173. return true;
  1174. }
  1175. if(otherPosition - transporterMinimumDistance <= targetPosition)
  1176. {
  1177. return true;
  1178. }
  1179. return false;
  1180. }
  1181. else
  1182. {
  1183. //if (result.targetPosition + transporterMinimumDistance >= motorPosition)
  1184. //{
  1185. // return true;
  1186. //}
  1187. if (result.targetPosition + transporterMinimumDistance >= targetPosition)
  1188. {
  1189. return true;
  1190. }
  1191. if(otherPosition + transporterMinimumDistance >= targetPosition)
  1192. {
  1193. return true;
  1194. }
  1195. return false;
  1196. }
  1197. }
  1198. }
  1199. #endregion
  1200. #region PickUpMoveTo
  1201. /// <summary>
  1202. /// PickUpMoveTo
  1203. /// </summary>
  1204. /// <param name="param"></param>
  1205. /// <returns></returns>
  1206. private bool PickUpMoveTo(object[] param)
  1207. {
  1208. if (!CheckOtherEntityStatus(param[0].ToString()))
  1209. {
  1210. LOG.WriteLog(eEvent.WARN_TRANSPORTER, Module.ToString(), $"Module Axis meets conflict of other Axis from {param[0]}");
  1211. return false;
  1212. }
  1213. if (!CheckOtherEntityStatus(param[1].ToString()))
  1214. {
  1215. LOG.WriteLog(eEvent.WARN_TRANSPORTER, Module.ToString(), $"Module Axis meets conflict of other Axis to {param[1]}");
  1216. return false;
  1217. }
  1218. bool result = _pickUpMoveToRoutine.Start(param) == RState.Running;
  1219. if (result)
  1220. {
  1221. _sourceCell = param[0].ToString();
  1222. _targetCell = param[1].ToString();
  1223. _currentRoutine = _pickUpMoveToRoutine;
  1224. }
  1225. return result;
  1226. }
  1227. /// <summary>
  1228. /// Retry PickUpMoveTo
  1229. /// </summary>
  1230. /// <param name="param"></param>
  1231. /// <returns></returns>
  1232. private bool RetryPickUpMoveTo(object[] param)
  1233. {
  1234. if (!CheckOtherEntityStatus(_sourceCell))
  1235. {
  1236. LOG.WriteLog(eEvent.WARN_TRANSPORTER, Module.ToString(), $"Module Axis meets conflict of other Axis from {_sourceCell}");
  1237. return false;
  1238. }
  1239. if (!CheckOtherEntityStatus(_targetCell))
  1240. {
  1241. LOG.WriteLog(eEvent.WARN_TRANSPORTER, Module.ToString(), $"Module Axis meets conflict of other Axis to {_targetCell}");
  1242. return false;
  1243. }
  1244. int stepIndex = (int)param[0];
  1245. bool result = _pickUpMoveToRoutine.Retry(stepIndex) == RState.Running;
  1246. if (result)
  1247. {
  1248. _currentRoutine = _pickUpMoveToRoutine;
  1249. }
  1250. return result;
  1251. }
  1252. /// <summary>
  1253. /// PickUpMoveTo超时
  1254. /// </summary>
  1255. /// <param name="param"></param>
  1256. /// <returns></returns>
  1257. private bool PickUpMoveToTimeout(object[] param)
  1258. {
  1259. RState ret = _pickUpMoveToRoutine.Monitor();
  1260. if (ret == RState.Failed || ret == RState.Timeout)
  1261. {
  1262. _targetCell = "";
  1263. _sourceCell = "";
  1264. _currentRoutine = null;
  1265. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  1266. {
  1267. AlarmList alarmList = new AlarmList(Module.ToString(), ((TransporterState)fsm.State).ToString(), (int)TransporterMSG.PickUpMoveTo,
  1268. _pickUpMoveToRoutine.ErrorMsg, _pickUpMoveToRoutine.ErrorStep, (int)AlarmType.Error);
  1269. AlarmListManager.Instance.AddAlarm(alarmList);
  1270. }
  1271. PostMsg(TransporterMSG.Error);
  1272. return false;
  1273. }
  1274. bool result = ret == RState.End;
  1275. if (result)
  1276. {
  1277. _targetCell = "";
  1278. _sourceCell = "";
  1279. _currentRoutine = null;
  1280. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), TransporterState.PickUpMoveToing.ToString());
  1281. }
  1282. return result;
  1283. }
  1284. /// <summary>
  1285. /// 确认PickupMoveto是否完成
  1286. /// </summary>
  1287. /// <param name="param"></param>
  1288. /// <returns></returns>
  1289. private bool ConfirmPickupMoveto(object[] param)
  1290. {
  1291. int stepIdex = (int)param[0];
  1292. bool result = _pickUpMoveToRoutine.CheckCompleteCondition(stepIdex);
  1293. if (!result)
  1294. {
  1295. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  1296. {
  1297. AlarmList alarmList = new AlarmList(Module.ToString(), ((TransporterState)fsm.State).ToString(), (int)TransporterMSG.PickUpMoveTo,
  1298. _pickUpMoveToRoutine.ErrorMsg, _pickUpMoveToRoutine.ErrorStep, (int)AlarmType.Error);
  1299. AlarmListManager.Instance.AddAlarm(alarmList);
  1300. }
  1301. PostMsg(TransporterMSG.Error);
  1302. }
  1303. else
  1304. {
  1305. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  1306. {
  1307. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), TransporterState.PickUpMoveToing.ToString());
  1308. }
  1309. }
  1310. return result;
  1311. }
  1312. #endregion
  1313. #region PickUpValidate
  1314. /// <summary>
  1315. /// PickUpValidate
  1316. /// </summary>
  1317. /// <param name="param"></param>
  1318. /// <returns></returns>
  1319. private bool PickUpValidate(object[] param)
  1320. {
  1321. if (!CheckOtherEntityStatus(param[0].ToString()))
  1322. {
  1323. LOG.WriteLog(eEvent.WARN_TRANSPORTER, Module.ToString(), $"Module Axis meets conflict of other Axis from {param[0]}");
  1324. return false;
  1325. }
  1326. bool result = _pickUpValidateRoutine.Start(param) == RState.Running;
  1327. if (result)
  1328. {
  1329. _sourceCell = param[0].ToString();
  1330. _currentRoutine = _pickUpValidateRoutine;
  1331. }
  1332. return result;
  1333. }
  1334. /// <summary>
  1335. /// Retry PickUpValidate
  1336. /// </summary>
  1337. /// <param name="param"></param>
  1338. /// <returns></returns>
  1339. private bool RetryPickUpValidate(object[] param)
  1340. {
  1341. if (!CheckOtherEntityStatus(_sourceCell))
  1342. {
  1343. LOG.WriteLog(eEvent.WARN_TRANSPORTER, Module.ToString(), $"Module Axis meets conflict of other Axis from {_sourceCell}");
  1344. return false;
  1345. }
  1346. int stepIndex = (int)param[0];
  1347. bool result = _pickUpValidateRoutine.Retry(stepIndex) == RState.Running;
  1348. if (result)
  1349. {
  1350. _currentRoutine = _pickUpValidateRoutine;
  1351. }
  1352. return result;
  1353. }
  1354. /// <summary>
  1355. /// PickUpValidate超时
  1356. /// </summary>
  1357. /// <param name="param"></param>
  1358. /// <returns></returns>
  1359. private bool PickUpValidateTimeout(object[] param)
  1360. {
  1361. RState ret = _pickUpValidateRoutine.Monitor();
  1362. if (ret == RState.Failed || ret == RState.Timeout)
  1363. {
  1364. _sourceCell = "";
  1365. _currentRoutine = null;
  1366. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  1367. {
  1368. AlarmList alarmList = new AlarmList(Module.ToString(), ((TransporterState)fsm.State).ToString(), (int)TransporterMSG.PickUpValidate,
  1369. _pickUpValidateRoutine.ErrorMsg, _pickUpValidateRoutine.ErrorStep, (int)AlarmType.Error);
  1370. AlarmListManager.Instance.AddAlarm(alarmList);
  1371. }
  1372. PostMsg(TransporterMSG.Error);
  1373. return false;
  1374. }
  1375. bool result = ret == RState.End;
  1376. if (result)
  1377. {
  1378. _currentRoutine = null;
  1379. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), TransporterState.PickUpValidating.ToString());
  1380. //Routine完成,但transporter却没有WaferHolder,则表示此次取WH失败,transporter返回Idle,便于调度重新选择下一个WaferHolder
  1381. if (WaferHolderInfo == null)
  1382. {
  1383. PostMsg(TransporterMSG.ReturnIdle);
  1384. return false;
  1385. }
  1386. }
  1387. return result;
  1388. }
  1389. /// <summary>
  1390. /// 确认PickupValidate是否完成
  1391. /// </summary>
  1392. /// <param name="param"></param>
  1393. /// <returns></returns>
  1394. private bool ConfirmPickupValidate(object[] param)
  1395. {
  1396. int stepIdex = (int)param[0];
  1397. bool result = _pickUpValidateRoutine.CheckCompleteCondition(stepIdex);
  1398. if (!result)
  1399. {
  1400. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  1401. {
  1402. AlarmList alarmList = new AlarmList(Module.ToString(), ((TransporterState)fsm.State).ToString(), (int)TransporterMSG.PickUpValidate,
  1403. _pickUpValidateRoutine.ErrorMsg, _pickUpValidateRoutine.ErrorStep, (int)AlarmType.Error);
  1404. AlarmListManager.Instance.AddAlarm(alarmList);
  1405. }
  1406. PostMsg(TransporterMSG.Error);
  1407. }
  1408. else
  1409. {
  1410. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  1411. {
  1412. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), TransporterState.PickUpValidating.ToString());
  1413. }
  1414. }
  1415. return result;
  1416. }
  1417. #endregion
  1418. #region TransporterRetry
  1419. /// <summary>
  1420. /// Retry
  1421. /// </summary>
  1422. /// <param name="param"></param>
  1423. /// <returns></returns>
  1424. private bool TransporterRetry(object[] param)
  1425. {
  1426. AlarmList alarmList = AlarmListManager.Instance.GetAlarmListByModule(Module.ToString());
  1427. if (alarmList != null)
  1428. {
  1429. CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), alarmList.ModuleCmd,
  1430. alarmList.ModuleStep);
  1431. }
  1432. return false;
  1433. }
  1434. #endregion
  1435. #region ConfirmComplete
  1436. /// <summary>
  1437. /// 确认是否完成
  1438. /// </summary>
  1439. /// <param name="param"></param>
  1440. /// <returns></returns>
  1441. private bool ConfirmComplete(object[] param)
  1442. {
  1443. AlarmList alarmList = AlarmListManager.Instance.GetAlarmListByModule(Module.ToString());
  1444. if (alarmList != null)
  1445. {
  1446. if (alarmList.ModuleState == TransporterState.Transfering.ToString())
  1447. {
  1448. CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.Transfer, alarmList.ModuleStep);
  1449. }
  1450. else if (alarmList.ModuleState == TransporterState.PickUpMoveToing.ToString())
  1451. {
  1452. CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.PickUpMoveTo, alarmList.ModuleStep);
  1453. }
  1454. else if (alarmList.ModuleState == TransporterState.Placing.ToString())
  1455. {
  1456. CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.Place, alarmList.ModuleStep);
  1457. }
  1458. else
  1459. {
  1460. PostMsg(TransporterMSG.Error);
  1461. }
  1462. }
  1463. return false;
  1464. }
  1465. /// <summary>
  1466. /// 清除报警
  1467. /// </summary>
  1468. /// <param name="param"></param>
  1469. /// <returns></returns>
  1470. private bool ClearModuleAlarm(object[] param)
  1471. {
  1472. AlarmList alarmList = AlarmListManager.Instance.GetAlarmListByModule(Module.ToString());
  1473. if (alarmList != null)
  1474. {
  1475. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), "");
  1476. }
  1477. return true;
  1478. }
  1479. #endregion
  1480. #region switchWafer
  1481. /// <summary>
  1482. /// 交换Wafer
  1483. /// </summary>
  1484. /// <param name="from"></param>
  1485. /// <param name="to"></param>
  1486. public void SwitchWafer(string from,string to)
  1487. {
  1488. ModuleName fromModuleName = ModuleName.Unknown;
  1489. if (from == "Loader")
  1490. {
  1491. fromModuleName = ModuleName.Loader1;
  1492. }
  1493. else
  1494. {
  1495. fromModuleName = (ModuleName)Enum.Parse(typeof(ModuleName), from);
  1496. }
  1497. ModuleName toModuleName = ModuleName.Unknown;
  1498. if (to == "Loader")
  1499. {
  1500. toModuleName = ModuleName.Loader1;
  1501. }
  1502. else
  1503. {
  1504. toModuleName = (ModuleName)Enum.Parse(typeof(ModuleName), to);
  1505. }
  1506. bool reverse = false;
  1507. JetAxisBase loaderRotation = DEVICE.GetDevice<JetAxisBase>($"{ModuleName.Loader1}.Rotation");
  1508. if (fromModuleName == ModuleName.Loader1)
  1509. {
  1510. if (loaderRotation.CheckPositionInStationIgnoreWaferSize(loaderRotation.MotionData.MotorPosition, TRNPB))
  1511. {
  1512. reverse = true;
  1513. }
  1514. }
  1515. if (toModuleName == ModuleName.Loader1)
  1516. {
  1517. if (loaderRotation.CheckPositionInStationIgnoreWaferSize(loaderRotation.MotionData.MotorPosition, TRNPB))
  1518. {
  1519. reverse = true;
  1520. }
  1521. }
  1522. if (WaferManager.Instance.CheckHasWafer(fromModuleName, 0))
  1523. {
  1524. if (!reverse)
  1525. {
  1526. WaferManager.Instance.WaferMoved(fromModuleName, 0, toModuleName, 0);
  1527. }
  1528. else
  1529. {
  1530. WaferInfo waferInfo = WaferManager.Instance.GetWafer(fromModuleName, 0);
  1531. WaferHolderInfo info = WaferHolderManager.Instance.GetWaferHolder(to);
  1532. info.WaferBId = waferInfo.WaferID;
  1533. info.WaferBType =(int)waferInfo.WaferType;
  1534. WaferManager.Instance.WaferMoved(fromModuleName, 0, toModuleName, 1);
  1535. }
  1536. }
  1537. if (WaferManager.Instance.CheckHasWafer(fromModuleName, 1))
  1538. {
  1539. if (!reverse)
  1540. {
  1541. WaferManager.Instance.WaferMoved(fromModuleName, 1, toModuleName, 1);
  1542. }
  1543. else
  1544. {
  1545. WaferInfo waferInfo = WaferManager.Instance.GetWafer(fromModuleName, 1);
  1546. WaferHolderInfo info = WaferHolderManager.Instance.GetWaferHolder(to);
  1547. info.WaferAId = waferInfo.WaferID;
  1548. info.WaferAType = (int)waferInfo.WaferType;
  1549. WaferManager.Instance.WaferMoved(fromModuleName, 1, toModuleName, 0);
  1550. }
  1551. }
  1552. MaterialTrackerManager.Instance.UpdateModuleMaterial(to);
  1553. }
  1554. #endregion
  1555. public bool Check(int msg, out string reason, params object[] args)
  1556. {
  1557. reason = "";
  1558. return false;
  1559. }
  1560. public bool CheckAcked(int msg)
  1561. {
  1562. return false;
  1563. }
  1564. public int Invoke(string function, params object[] args)
  1565. {
  1566. switch (function)
  1567. {
  1568. case "HomeAll":
  1569. if(IsIdle)
  1570. {
  1571. return (int)FSM_MSG.NONE;
  1572. }
  1573. if (CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.HomeAll))
  1574. {
  1575. return (int)FSM_MSG.NONE;
  1576. }
  1577. else
  1578. {
  1579. return (int)FSM_MSG.ALARM;
  1580. }
  1581. case "Abort":
  1582. CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.Abort);
  1583. return (int)FSM_MSG.NONE;
  1584. case "Retry":
  1585. if (CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.Retry, args))
  1586. {
  1587. return (int)TransporterMSG.Retry;
  1588. }
  1589. else
  1590. {
  1591. return (int)FSM_MSG.NONE;
  1592. }
  1593. case "ConfirmComplete":
  1594. if (CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.ConfirmComplete, args))
  1595. {
  1596. return (int)TransporterMSG.ConfirmComplete;
  1597. }
  1598. else
  1599. {
  1600. return (int)FSM_MSG.NONE;
  1601. }
  1602. }
  1603. return (int)FSM_MSG.NONE;
  1604. }
  1605. }
  1606. public enum TransporterMSG
  1607. {
  1608. HomeAll, // 0
  1609. SwitchOn,
  1610. SwitchOff,
  1611. Error,
  1612. ResumeError,
  1613. ReturnIdle,
  1614. Abort,
  1615. GantryGoToSavedPosition,
  1616. GoToSavedPosition,
  1617. PickUpFrom,
  1618. MoveTo,
  1619. Place,
  1620. Park,
  1621. ElevatorUp,
  1622. ElevatorLow,
  1623. Transfer,
  1624. PickUpMoveTo,
  1625. PickUpValidate,
  1626. GantrySafeMove,
  1627. Retry,
  1628. ConfirmComplete,
  1629. Flip
  1630. }
  1631. }