TransporterEntity.cs 71 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756
  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. _currentRoutine = null;
  684. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  685. {
  686. AlarmList alarmList = new AlarmList(Module.ToString(), ((TransporterState)fsm.State).ToString(), (int)TransporterMSG.MoveTo,
  687. _placeRoutine.ErrorMsg, _placeRoutine.ErrorStep, (int)AlarmType.Error);
  688. AlarmListManager.Instance.AddAlarm(alarmList);
  689. }
  690. PostMsg(TransporterMSG.Error);
  691. return false;
  692. }
  693. bool result = ret == RState.End;
  694. if (result)
  695. {
  696. _targetCell = "";
  697. _currentRoutine = null;
  698. if (!string.IsNullOrEmpty(_sourceCell))
  699. {
  700. _sourceCell = "";
  701. }
  702. }
  703. return result;
  704. }
  705. /// <summary>
  706. /// 确认Place是否完成
  707. /// </summary>
  708. /// <param name="param"></param>
  709. /// <returns></returns>
  710. private bool ConfirmMoveto(object[] param)
  711. {
  712. int stepIdex = (int)param[0];
  713. bool result = _moveToRoutine.CheckCompleteCondition(stepIdex);
  714. if (!result)
  715. {
  716. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  717. {
  718. AlarmList alarmList = new AlarmList(Module.ToString(), ((TransporterState)fsm.State).ToString(), (int)TransporterMSG.MoveTo,
  719. _moveToRoutine.ErrorMsg, _moveToRoutine.ErrorStep, (int)AlarmType.Error);
  720. AlarmListManager.Instance.AddAlarm(alarmList);
  721. }
  722. PostMsg(TransporterMSG.Error);
  723. }
  724. else
  725. {
  726. _targetCell = "";
  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. _sourceCell = "";
  794. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), TransporterState.Placing.ToString());
  795. }
  796. return result;
  797. }
  798. /// <summary>
  799. /// 确认Place是否完成
  800. /// </summary>
  801. /// <param name="param"></param>
  802. /// <returns></returns>
  803. private bool ConfirmPlace(object[] param)
  804. {
  805. int stepIdex = (int)param[0];
  806. bool result = _placeRoutine.CheckCompleteCondition(stepIdex);
  807. if (!result)
  808. {
  809. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  810. {
  811. AlarmList alarmList = new AlarmList(Module.ToString(), ((TransporterState)fsm.State).ToString(), (int)TransporterMSG.Place,
  812. _placeRoutine.ErrorMsg, _placeRoutine.ErrorStep, (int)AlarmType.Error);
  813. AlarmListManager.Instance.AddAlarm(alarmList);
  814. }
  815. PostMsg(TransporterMSG.Error);
  816. }
  817. else
  818. {
  819. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  820. {
  821. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), TransporterState.Placing.ToString());
  822. }
  823. }
  824. return result;
  825. }
  826. #endregion
  827. #region Park
  828. /// <summary>
  829. /// Park
  830. /// </summary>
  831. /// <param name="param"></param>
  832. /// <returns></returns>
  833. private bool Park(object[] param)
  834. {
  835. bool result = _parkRoutine.Start() == RState.Running;
  836. if (result)
  837. {
  838. _currentRoutine = _parkRoutine;
  839. }
  840. return result;
  841. }
  842. /// <summary>
  843. /// Park超时
  844. /// </summary>
  845. /// <param name="param"></param>
  846. /// <returns></returns>
  847. private bool ParkTimeout(object[] param)
  848. {
  849. RState ret = _parkRoutine.Monitor();
  850. if (ret == RState.Failed || ret == RState.Timeout)
  851. {
  852. _currentRoutine = null;
  853. PostMsg(TransporterMSG.Error);
  854. return false;
  855. }
  856. bool result = ret == RState.End;
  857. if (result)
  858. {
  859. _currentRoutine = null;
  860. }
  861. return result;
  862. }
  863. #endregion
  864. #region Elevator Up
  865. /// <summary>
  866. /// Elevator Up
  867. /// </summary>
  868. /// <param name="param"></param>
  869. /// <returns></returns>
  870. private bool ElevatorUp(object[] param)
  871. {
  872. bool result = _elevatorUpRoutine.Start() == RState.Running;
  873. if (result)
  874. {
  875. _currentRoutine = _elevatorUpRoutine;
  876. }
  877. return result;
  878. }
  879. /// <summary>
  880. /// Elevator Up超时
  881. /// </summary>
  882. /// <param name="param"></param>
  883. /// <returns></returns>
  884. private bool ElevatorUpTimeout(object[] param)
  885. {
  886. RState ret = _elevatorUpRoutine.Monitor();
  887. if (ret == RState.Failed || ret == RState.Timeout)
  888. {
  889. _currentRoutine = null;
  890. PostMsg(TransporterMSG.Error);
  891. return false;
  892. }
  893. bool result = ret == RState.End;
  894. if (result)
  895. {
  896. _currentRoutine = null;
  897. }
  898. return result;
  899. }
  900. #endregion
  901. #region Elevator Low
  902. /// <summary>
  903. /// Elevator Low
  904. /// </summary>
  905. /// <param name="param"></param>
  906. /// <returns></returns>
  907. private bool ElevatorLow(object[] param)
  908. {
  909. bool result= _elevatorLowRoutine.Start() == RState.Running;
  910. if (result)
  911. {
  912. _currentRoutine = _elevatorLowRoutine;
  913. }
  914. return result;
  915. }
  916. /// <summary>
  917. /// Elevator Low超时
  918. /// </summary>
  919. /// <param name="param"></param>
  920. /// <returns></returns>
  921. private bool ElevatorLowTimeout(object[] param)
  922. {
  923. RState ret = _elevatorLowRoutine.Monitor();
  924. if (ret == RState.Failed || ret == RState.Timeout)
  925. {
  926. _currentRoutine = null;
  927. PostMsg(TransporterMSG.Error);
  928. return false;
  929. }
  930. bool result = ret == RState.End;
  931. if (result)
  932. {
  933. _currentRoutine = null;
  934. }
  935. return result;
  936. }
  937. #endregion
  938. #region Transfer
  939. /// <summary>
  940. /// Transfer
  941. /// </summary>
  942. /// <param name="param"></param>
  943. /// <returns></returns>
  944. private bool Transfer(object[] param)
  945. {
  946. if (!CheckOtherEntityStatus(param[0].ToString()))
  947. {
  948. LOG.WriteLog(eEvent.WARN_TRANSPORTER, Module.ToString(), $"Module Axis meets conflict of other Axis from {param[0]}");
  949. return false;
  950. }
  951. if (!CheckOtherEntityStatus(param[1].ToString()))
  952. {
  953. LOG.WriteLog(eEvent.WARN_TRANSPORTER, Module.ToString(), $"Module Axis meets conflict of other Axis to {param[1]}");
  954. return false;
  955. }
  956. bool result = _transferRoutine.Start(param) == RState.Running;
  957. if (result)
  958. {
  959. _sourceCell=param[0].ToString();
  960. _targetCell = param[1].ToString();
  961. _currentRoutine = _transferRoutine;
  962. }
  963. return result;
  964. }
  965. /// <summary>
  966. /// Retry Transfer
  967. /// </summary>
  968. /// <param name="param"></param>
  969. /// <returns></returns>
  970. private bool RetryTransfer(object[] param)
  971. {
  972. if (!CheckOtherEntityStatus(_sourceCell))
  973. {
  974. LOG.WriteLog(eEvent.WARN_TRANSPORTER, Module.ToString(), $"Module Axis meets conflict of other Axis from {_sourceCell}");
  975. return false;
  976. }
  977. if (!CheckOtherEntityStatus(_targetCell))
  978. {
  979. LOG.WriteLog(eEvent.WARN_TRANSPORTER, Module.ToString(), $"Module Axis meets conflict of other Axis to {_targetCell}");
  980. return false;
  981. }
  982. int stepIndex = (int)param[0];
  983. bool result = _transferRoutine.Retry(stepIndex) == RState.Running;
  984. if (result)
  985. {
  986. _currentRoutine = _transferRoutine;
  987. _sourceCell=_transferRoutine.SourceCell;
  988. _targetCell=_transferRoutine.TargetCell;
  989. }
  990. return result;
  991. }
  992. /// <summary>
  993. /// Transfer超时
  994. /// </summary>
  995. /// <param name="param"></param>
  996. /// <returns></returns>
  997. private bool TransferTimeout(object[] param)
  998. {
  999. RState ret = _transferRoutine.Monitor();
  1000. if (ret == RState.Failed || ret == RState.Timeout)
  1001. {
  1002. _currentRoutine = null;
  1003. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  1004. {
  1005. AlarmList alarmList = new AlarmList(Module.ToString(), ((TransporterState)fsm.State).ToString(), (int)TransporterMSG.Transfer,
  1006. _transferRoutine.ErrorMsg, _transferRoutine.ErrorStep, (int)AlarmType.Error);
  1007. AlarmListManager.Instance.AddAlarm(alarmList);
  1008. }
  1009. PostMsg(TransporterMSG.Error);
  1010. return false;
  1011. }
  1012. bool result = ret == RState.End;
  1013. if (result)
  1014. {
  1015. _targetCell = "";
  1016. _sourceCell = "";
  1017. _currentRoutine = null;
  1018. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), TransporterState.Transfering.ToString());
  1019. }
  1020. return result;
  1021. }
  1022. /// <summary>
  1023. /// 确认Transfer是否完成
  1024. /// </summary>
  1025. /// <param name="param"></param>
  1026. /// <returns></returns>
  1027. private bool ConfirmTransfer(object[] param)
  1028. {
  1029. int stepIdex = (int)param[0];
  1030. bool result = _transferRoutine.CheckCompleteCondition(stepIdex);
  1031. if (!result)
  1032. {
  1033. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  1034. {
  1035. AlarmList alarmList = new AlarmList(Module.ToString(), ((TransporterState)fsm.State).ToString(), (int)TransporterMSG.Transfer,
  1036. _transferRoutine.ErrorMsg, _transferRoutine.ErrorStep, (int)AlarmType.Error);
  1037. AlarmListManager.Instance.AddAlarm(alarmList);
  1038. }
  1039. PostMsg(TransporterMSG.Error);
  1040. }
  1041. else
  1042. {
  1043. _targetCell = "";
  1044. _sourceCell = "";
  1045. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  1046. {
  1047. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), TransporterState.Transfering.ToString());
  1048. }
  1049. }
  1050. return result;
  1051. }
  1052. /// <summary>
  1053. /// 检验另一个Axis状态
  1054. /// </summary>
  1055. /// <returns></returns>
  1056. public bool CheckOtherEntityStatus(string targetCell)
  1057. {
  1058. bool positive = false;
  1059. TransporterEntity otherEntity=null;
  1060. string otherModule = "";
  1061. if (Module == ModuleName.Transporter2)
  1062. {
  1063. otherModule = ModuleName.Transporter1.ToString();
  1064. otherEntity = Singleton<RouteManager>.Instance.GetModule<TransporterEntity>(ModuleName.Transporter1.ToString());
  1065. positive = true;
  1066. }
  1067. else
  1068. {
  1069. otherModule = ModuleName.Transporter2.ToString();
  1070. otherEntity = Singleton<RouteManager>.Instance.GetModule<TransporterEntity>(ModuleName.Transporter2.ToString());
  1071. }
  1072. if(otherEntity==null)
  1073. {
  1074. return true;
  1075. }
  1076. if (otherEntity.IsIdle)
  1077. {
  1078. return true;
  1079. }
  1080. if (otherEntity.IsError)
  1081. {
  1082. return false;
  1083. }
  1084. if(otherEntity.State==(int)TransporterState.Transfering||otherEntity.State==(int)TransporterState.PickUpMoveToing
  1085. ||otherEntity.State==(int)TransporterState.MovingTo||otherEntity.State==(int)TransporterState.PickUpValidating
  1086. ||otherEntity.State==(int)TransporterState.PickUpValidateComplete||otherEntity.State==(int)TransporterState.ValidateMoveTo)
  1087. {
  1088. bool conflict= CheckModuleWithOtherModuleConflict(otherEntity,otherModule,positive,targetCell);
  1089. if(conflict)
  1090. {
  1091. return false;
  1092. }
  1093. else
  1094. {
  1095. return true;
  1096. }
  1097. }
  1098. else
  1099. {
  1100. return true;
  1101. }
  1102. }
  1103. /// <summary>
  1104. /// 分析目标cell的位置
  1105. /// </summary>
  1106. /// <param name="otherModule"></param>
  1107. /// <param name="targetCell"></param>
  1108. /// <returns></returns>
  1109. private (bool result,double targetPosition) AnalyseTargetCellPosition(string otherModule,string targetCell)
  1110. {
  1111. ProcessLayoutCellItem _cellItem = ProcessLayoutManager.Instance.GetProcessLayoutCellItemByModuleName(targetCell);
  1112. string stationName = targetCell;
  1113. if (_cellItem != null)
  1114. {
  1115. if (targetCell.ToLower() != "loader" && targetCell.ToLower() != "park")
  1116. {
  1117. stationName = $"Cell{_cellItem.CellId}";
  1118. }
  1119. }
  1120. else
  1121. {
  1122. LOG.WriteLog(eEvent.ERR_TRANSPORTER, Module.ToString(), $"{targetCell} not in layout");
  1123. return (false,0);
  1124. }
  1125. JetAxisBase otherGantryAxis = DEVICE.GetDevice<JetAxisBase>($"{otherModule}.Gantry");
  1126. var result = otherGantryAxis.GetPositionByStation(stationName);
  1127. if(result.success)
  1128. {
  1129. return (true,result.position);
  1130. }
  1131. return (false,0);
  1132. }
  1133. /// <summary>
  1134. /// 检验当前模块与另一个模块是否存在冲突
  1135. /// </summary>
  1136. /// <returns></returns>
  1137. private bool CheckModuleWithOtherModuleConflict(TransporterEntity otherEntity,string otherModule,bool positive,string targetCell)
  1138. {
  1139. int transporterMinimumDistance = SC.GetValue<int>("Transporter.TransporterMinimumDistance");
  1140. double motorPosition = _gantryAxis.MotionData.MotorPosition;
  1141. if(targetCell==ModuleName.Loader1.ToString())
  1142. {
  1143. targetCell = "Loader";
  1144. }
  1145. var result = AnalyseTargetCellPosition(Module.ToString(), targetCell);
  1146. if(!result.result)
  1147. {
  1148. return false;
  1149. }
  1150. double targetPosition=result.targetPosition;
  1151. JetAxisBase otherGantryAxis = DEVICE.GetDevice<JetAxisBase>($"{otherModule}.Gantry");
  1152. if(otherGantryAxis==null)
  1153. {
  1154. return false;
  1155. }
  1156. double otherPosition = otherGantryAxis.MotionData.MotorPosition;
  1157. if (!string.IsNullOrEmpty(otherEntity.TargetCell))
  1158. {
  1159. return CheckOtherModuleCellConflict(otherModule, otherEntity.TargetCell,otherPosition, positive, targetPosition, motorPosition);
  1160. }
  1161. if(!string.IsNullOrEmpty(otherEntity.SourceCell))
  1162. {
  1163. bool conflict= CheckOtherModuleCellConflict(otherModule, otherEntity.SourceCell,otherPosition, positive, targetPosition, motorPosition);
  1164. if (conflict)
  1165. {
  1166. //另一个Entity已经到达了目标位置
  1167. if (!string.IsNullOrEmpty(otherEntity.TargetCell)&&CheckOtherEntityAlreadyInTargetCell(otherEntity, otherEntity.TargetCell))
  1168. {
  1169. return false;
  1170. }
  1171. }
  1172. return conflict;
  1173. }
  1174. else
  1175. {
  1176. return false;
  1177. }
  1178. }
  1179. /// <summary>
  1180. /// 检验其他TransporterEntity已经到达目标cell
  1181. /// </summary>
  1182. /// <param name="otherEntity"></param>
  1183. /// <param name="targetCell"></param>
  1184. /// <returns></returns>
  1185. private bool CheckOtherEntityAlreadyInTargetCell(TransporterEntity otherEntity,string targetCell)
  1186. {
  1187. //另一个Transporter已经取走了WaferHolder,同时gantry已经到达了目标cell
  1188. if (otherEntity.WaferHolderInfo != null)
  1189. {
  1190. JetAxisBase jetAxisBase = DEVICE.GetDevice<JetAxisBase>($"{otherEntity.Module}.Gantry");
  1191. if (jetAxisBase != null && jetAxisBase.CheckPositionIsInStation(jetAxisBase.MotionData.MotorPosition, targetCell))
  1192. {
  1193. return true;
  1194. }
  1195. }
  1196. return false;
  1197. }
  1198. /// <summary>
  1199. /// 检验另一个模块Cell是否存在冲突
  1200. /// </summary>
  1201. /// <param name="otherModule"></param>
  1202. /// <param name="cell"></param>
  1203. /// <param name="positive"></param>
  1204. /// <param name="motorPosition"></param>
  1205. /// <param name="targetPosition"></param>
  1206. /// <returns></returns>
  1207. private bool CheckOtherModuleCellConflict(string otherModule, string cell,double otherPosition, bool positive,double targetPosition, double motorPosition)
  1208. {
  1209. int transporterMinimumDistance = SC.GetValue<int>("Transporter.TransporterMinimumDistance");
  1210. var result = AnalyseTargetCellPosition(otherModule, cell);
  1211. if (!result.result)
  1212. {
  1213. return false;
  1214. }
  1215. else
  1216. {
  1217. if (positive)
  1218. {
  1219. // if (result.targetPosition - transporterMinimumDistance <= motorPosition)
  1220. // {
  1221. // return true;
  1222. // }
  1223. if (result.targetPosition - transporterMinimumDistance <= targetPosition)
  1224. {
  1225. return true;
  1226. }
  1227. if (otherPosition - transporterMinimumDistance <= targetPosition)
  1228. {
  1229. return true;
  1230. }
  1231. if (result.targetPosition - transporterMinimumDistance <= motorPosition)
  1232. {
  1233. return true;
  1234. }
  1235. return false;
  1236. }
  1237. else
  1238. {
  1239. //if (result.targetPosition + transporterMinimumDistance >= motorPosition)
  1240. //{
  1241. // return true;
  1242. //}
  1243. if (result.targetPosition + transporterMinimumDistance >= targetPosition)
  1244. {
  1245. return true;
  1246. }
  1247. if (otherPosition + transporterMinimumDistance >= targetPosition)
  1248. {
  1249. return true;
  1250. }
  1251. if (result.targetPosition + transporterMinimumDistance >= motorPosition)
  1252. {
  1253. return true;
  1254. }
  1255. return false;
  1256. }
  1257. }
  1258. }
  1259. #endregion
  1260. #region PickUpMoveTo
  1261. /// <summary>
  1262. /// PickUpMoveTo
  1263. /// </summary>
  1264. /// <param name="param"></param>
  1265. /// <returns></returns>
  1266. private bool PickUpMoveTo(object[] param)
  1267. {
  1268. if (!CheckOtherEntityStatus(param[0].ToString()))
  1269. {
  1270. LOG.WriteLog(eEvent.WARN_TRANSPORTER, Module.ToString(), $"Module Axis meets conflict of other Axis from {param[0]}");
  1271. return false;
  1272. }
  1273. if (!CheckOtherEntityStatus(param[1].ToString()))
  1274. {
  1275. LOG.WriteLog(eEvent.WARN_TRANSPORTER, Module.ToString(), $"Module Axis meets conflict of other Axis to {param[1]}");
  1276. return false;
  1277. }
  1278. bool result = _pickUpMoveToRoutine.Start(param) == RState.Running;
  1279. if (result)
  1280. {
  1281. _sourceCell = param[0].ToString();
  1282. _targetCell = param[1].ToString();
  1283. _currentRoutine = _pickUpMoveToRoutine;
  1284. }
  1285. return result;
  1286. }
  1287. /// <summary>
  1288. /// Retry PickUpMoveTo
  1289. /// </summary>
  1290. /// <param name="param"></param>
  1291. /// <returns></returns>
  1292. private bool RetryPickUpMoveTo(object[] param)
  1293. {
  1294. if (!CheckOtherEntityStatus(_sourceCell))
  1295. {
  1296. LOG.WriteLog(eEvent.WARN_TRANSPORTER, Module.ToString(), $"Module Axis meets conflict of other Axis from {_sourceCell}");
  1297. return false;
  1298. }
  1299. if (!CheckOtherEntityStatus(_targetCell))
  1300. {
  1301. LOG.WriteLog(eEvent.WARN_TRANSPORTER, Module.ToString(), $"Module Axis meets conflict of other Axis to {_targetCell}");
  1302. return false;
  1303. }
  1304. int stepIndex = (int)param[0];
  1305. bool result = _pickUpMoveToRoutine.Retry(stepIndex) == RState.Running;
  1306. if (result)
  1307. {
  1308. _currentRoutine = _pickUpMoveToRoutine;
  1309. _sourceCell = _pickUpMoveToRoutine.SourceCell;
  1310. _targetCell= _pickUpMoveToRoutine.TargetCell;
  1311. }
  1312. return result;
  1313. }
  1314. /// <summary>
  1315. /// PickUpMoveTo超时
  1316. /// </summary>
  1317. /// <param name="param"></param>
  1318. /// <returns></returns>
  1319. private bool PickUpMoveToTimeout(object[] param)
  1320. {
  1321. RState ret = _pickUpMoveToRoutine.Monitor();
  1322. if (ret == RState.Failed || ret == RState.Timeout)
  1323. {
  1324. _currentRoutine = null;
  1325. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  1326. {
  1327. AlarmList alarmList = new AlarmList(Module.ToString(), ((TransporterState)fsm.State).ToString(), (int)TransporterMSG.PickUpMoveTo,
  1328. _pickUpMoveToRoutine.ErrorMsg, _pickUpMoveToRoutine.ErrorStep, (int)AlarmType.Error);
  1329. AlarmListManager.Instance.AddAlarm(alarmList);
  1330. }
  1331. PostMsg(TransporterMSG.Error);
  1332. return false;
  1333. }
  1334. bool result = ret == RState.End;
  1335. if (result)
  1336. {
  1337. _targetCell = "";
  1338. _sourceCell = "";
  1339. _currentRoutine = null;
  1340. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), TransporterState.PickUpMoveToing.ToString());
  1341. }
  1342. return result;
  1343. }
  1344. /// <summary>
  1345. /// 确认PickupMoveto是否完成
  1346. /// </summary>
  1347. /// <param name="param"></param>
  1348. /// <returns></returns>
  1349. private bool ConfirmPickupMoveto(object[] param)
  1350. {
  1351. int stepIdex = (int)param[0];
  1352. bool result = _pickUpMoveToRoutine.CheckCompleteCondition(stepIdex);
  1353. if (!result)
  1354. {
  1355. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  1356. {
  1357. AlarmList alarmList = new AlarmList(Module.ToString(), ((TransporterState)fsm.State).ToString(), (int)TransporterMSG.PickUpMoveTo,
  1358. _pickUpMoveToRoutine.ErrorMsg, _pickUpMoveToRoutine.ErrorStep, (int)AlarmType.Error);
  1359. AlarmListManager.Instance.AddAlarm(alarmList);
  1360. }
  1361. PostMsg(TransporterMSG.Error);
  1362. }
  1363. else
  1364. {
  1365. _sourceCell = "";
  1366. _targetCell = "";
  1367. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  1368. {
  1369. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), TransporterState.PickUpMoveToing.ToString());
  1370. }
  1371. }
  1372. return result;
  1373. }
  1374. #endregion
  1375. #region PickUpValidate
  1376. /// <summary>
  1377. /// PickUpValidate
  1378. /// </summary>
  1379. /// <param name="param"></param>
  1380. /// <returns></returns>
  1381. private bool PickUpValidate(object[] param)
  1382. {
  1383. if (!CheckOtherEntityStatus(param[0].ToString()))
  1384. {
  1385. LOG.WriteLog(eEvent.WARN_TRANSPORTER, Module.ToString(), $"Module Axis meets conflict of other Axis from {param[0]}");
  1386. return false;
  1387. }
  1388. bool result = _pickUpValidateRoutine.Start(param) == RState.Running;
  1389. if (result)
  1390. {
  1391. _sourceCell = param[0].ToString();
  1392. _currentRoutine = _pickUpValidateRoutine;
  1393. }
  1394. return result;
  1395. }
  1396. /// <summary>
  1397. /// Retry PickUpValidate
  1398. /// </summary>
  1399. /// <param name="param"></param>
  1400. /// <returns></returns>
  1401. private bool RetryPickUpValidate(object[] param)
  1402. {
  1403. if (!CheckOtherEntityStatus(_sourceCell))
  1404. {
  1405. LOG.WriteLog(eEvent.WARN_TRANSPORTER, Module.ToString(), $"Module Axis meets conflict of other Axis from {_sourceCell}");
  1406. return false;
  1407. }
  1408. int stepIndex = (int)param[0];
  1409. bool result = _pickUpValidateRoutine.Retry(stepIndex) == RState.Running;
  1410. if (result)
  1411. {
  1412. _currentRoutine = _pickUpValidateRoutine;
  1413. _sourceCell = _pickUpValidateRoutine.SourceCell;
  1414. }
  1415. return result;
  1416. }
  1417. /// <summary>
  1418. /// PickUpValidate超时
  1419. /// </summary>
  1420. /// <param name="param"></param>
  1421. /// <returns></returns>
  1422. private bool PickUpValidateTimeout(object[] param)
  1423. {
  1424. RState ret = _pickUpValidateRoutine.Monitor();
  1425. if (ret == RState.Failed || ret == RState.Timeout)
  1426. {
  1427. _currentRoutine = null;
  1428. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  1429. {
  1430. AlarmList alarmList = new AlarmList(Module.ToString(), ((TransporterState)fsm.State).ToString(), (int)TransporterMSG.PickUpValidate,
  1431. _pickUpValidateRoutine.ErrorMsg, _pickUpValidateRoutine.ErrorStep, (int)AlarmType.Error);
  1432. AlarmListManager.Instance.AddAlarm(alarmList);
  1433. }
  1434. PostMsg(TransporterMSG.Error);
  1435. return false;
  1436. }
  1437. bool result = ret == RState.End;
  1438. if (result)
  1439. {
  1440. _currentRoutine = null;
  1441. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), TransporterState.PickUpValidating.ToString());
  1442. //Routine完成,但transporter却没有WaferHolder,则表示此次取WH失败,transporter返回Idle,便于调度重新选择下一个WaferHolder
  1443. if (WaferHolderInfo == null)
  1444. {
  1445. PostMsg(TransporterMSG.ReturnIdle);
  1446. return false;
  1447. }
  1448. }
  1449. return result;
  1450. }
  1451. /// <summary>
  1452. /// 确认PickupValidate是否完成
  1453. /// </summary>
  1454. /// <param name="param"></param>
  1455. /// <returns></returns>
  1456. private bool ConfirmPickupValidate(object[] param)
  1457. {
  1458. int stepIdex = (int)param[0];
  1459. bool result = _pickUpValidateRoutine.CheckCompleteCondition(stepIdex);
  1460. if (!result)
  1461. {
  1462. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  1463. {
  1464. AlarmList alarmList = new AlarmList(Module.ToString(), ((TransporterState)fsm.State).ToString(), (int)TransporterMSG.PickUpValidate,
  1465. _pickUpValidateRoutine.ErrorMsg, _pickUpValidateRoutine.ErrorStep, (int)AlarmType.Error);
  1466. AlarmListManager.Instance.AddAlarm(alarmList);
  1467. }
  1468. PostMsg(TransporterMSG.Error);
  1469. }
  1470. else
  1471. {
  1472. _sourceCell = "";
  1473. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  1474. {
  1475. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), TransporterState.PickUpValidating.ToString());
  1476. }
  1477. }
  1478. return result;
  1479. }
  1480. #endregion
  1481. #region TransporterRetry
  1482. /// <summary>
  1483. /// Retry
  1484. /// </summary>
  1485. /// <param name="param"></param>
  1486. /// <returns></returns>
  1487. private bool TransporterRetry(object[] param)
  1488. {
  1489. AlarmList alarmList = AlarmListManager.Instance.GetAlarmListByModule(Module.ToString());
  1490. if (alarmList != null)
  1491. {
  1492. CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), alarmList.ModuleCmd,
  1493. alarmList.ModuleStep);
  1494. }
  1495. return false;
  1496. }
  1497. #endregion
  1498. #region ConfirmComplete
  1499. /// <summary>
  1500. /// 确认是否完成
  1501. /// </summary>
  1502. /// <param name="param"></param>
  1503. /// <returns></returns>
  1504. private bool ConfirmComplete(object[] param)
  1505. {
  1506. AlarmList alarmList = AlarmListManager.Instance.GetAlarmListByModule(Module.ToString());
  1507. if (alarmList != null)
  1508. {
  1509. if (alarmList.ModuleState == TransporterState.Transfering.ToString())
  1510. {
  1511. CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.Transfer, alarmList.ModuleStep);
  1512. }
  1513. else if (alarmList.ModuleState == TransporterState.PickUpMoveToing.ToString())
  1514. {
  1515. CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.PickUpMoveTo, alarmList.ModuleStep);
  1516. }
  1517. else if (alarmList.ModuleState == TransporterState.Placing.ToString())
  1518. {
  1519. CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.Place, alarmList.ModuleStep);
  1520. }
  1521. else if (alarmList.ModuleState == TransporterState.MovingTo.ToString())
  1522. {
  1523. CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.MoveTo, alarmList.ModuleStep);
  1524. }
  1525. else
  1526. {
  1527. PostMsg(TransporterMSG.Error);
  1528. }
  1529. }
  1530. return false;
  1531. }
  1532. /// <summary>
  1533. /// 清除报警
  1534. /// </summary>
  1535. /// <param name="param"></param>
  1536. /// <returns></returns>
  1537. private bool ClearModuleAlarm(object[] param)
  1538. {
  1539. AlarmList alarmList = AlarmListManager.Instance.GetAlarmListByModule(Module.ToString());
  1540. if (alarmList != null)
  1541. {
  1542. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), "");
  1543. }
  1544. return true;
  1545. }
  1546. #endregion
  1547. #region switchWafer
  1548. /// <summary>
  1549. /// 交换Wafer
  1550. /// </summary>
  1551. /// <param name="from"></param>
  1552. /// <param name="to"></param>
  1553. public void SwitchWafer(string from,string to)
  1554. {
  1555. ModuleName fromModuleName = ModuleName.Unknown;
  1556. if (from == "Loader")
  1557. {
  1558. fromModuleName = ModuleName.Loader1;
  1559. }
  1560. else
  1561. {
  1562. fromModuleName = (ModuleName)Enum.Parse(typeof(ModuleName), from);
  1563. }
  1564. ModuleName toModuleName = ModuleName.Unknown;
  1565. if (to == "Loader")
  1566. {
  1567. toModuleName = ModuleName.Loader1;
  1568. }
  1569. else
  1570. {
  1571. toModuleName = (ModuleName)Enum.Parse(typeof(ModuleName), to);
  1572. }
  1573. bool reverse = false;
  1574. JetAxisBase loaderRotation = DEVICE.GetDevice<JetAxisBase>($"{ModuleName.Loader1}.Rotation");
  1575. if (fromModuleName == ModuleName.Loader1)
  1576. {
  1577. if (loaderRotation.CheckPositionInStationIgnoreWaferSize(loaderRotation.MotionData.MotorPosition, TRNPB))
  1578. {
  1579. reverse = true;
  1580. }
  1581. }
  1582. if (toModuleName == ModuleName.Loader1)
  1583. {
  1584. if (loaderRotation.CheckPositionInStationIgnoreWaferSize(loaderRotation.MotionData.MotorPosition, TRNPB))
  1585. {
  1586. reverse = true;
  1587. }
  1588. }
  1589. if (WaferManager.Instance.CheckHasWafer(fromModuleName, 0))
  1590. {
  1591. if (!reverse)
  1592. {
  1593. WaferManager.Instance.WaferMoved(fromModuleName, 0, toModuleName, 0);
  1594. }
  1595. else
  1596. {
  1597. WaferInfo waferInfo = WaferManager.Instance.GetWafer(fromModuleName, 0);
  1598. WaferHolderInfo info = WaferHolderManager.Instance.GetWaferHolder(to);
  1599. info.WaferBId = waferInfo.WaferID;
  1600. info.WaferBType =(int)waferInfo.WaferType;
  1601. WaferManager.Instance.WaferMoved(fromModuleName, 0, toModuleName, 1);
  1602. }
  1603. }
  1604. if (WaferManager.Instance.CheckHasWafer(fromModuleName, 1))
  1605. {
  1606. if (!reverse)
  1607. {
  1608. WaferManager.Instance.WaferMoved(fromModuleName, 1, toModuleName, 1);
  1609. }
  1610. else
  1611. {
  1612. WaferInfo waferInfo = WaferManager.Instance.GetWafer(fromModuleName, 1);
  1613. WaferHolderInfo info = WaferHolderManager.Instance.GetWaferHolder(to);
  1614. info.WaferAId = waferInfo.WaferID;
  1615. info.WaferAType = (int)waferInfo.WaferType;
  1616. WaferManager.Instance.WaferMoved(fromModuleName, 1, toModuleName, 0);
  1617. }
  1618. }
  1619. MaterialTrackerManager.Instance.UpdateModuleMaterial(to);
  1620. }
  1621. #endregion
  1622. public bool Check(int msg, out string reason, params object[] args)
  1623. {
  1624. reason = "";
  1625. return false;
  1626. }
  1627. public bool CheckAcked(int msg)
  1628. {
  1629. return false;
  1630. }
  1631. public int Invoke(string function, params object[] args)
  1632. {
  1633. switch (function)
  1634. {
  1635. case "HomeAll":
  1636. if(IsIdle)
  1637. {
  1638. return (int)FSM_MSG.NONE;
  1639. }
  1640. if (CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.HomeAll))
  1641. {
  1642. return (int)FSM_MSG.NONE;
  1643. }
  1644. else
  1645. {
  1646. return (int)FSM_MSG.ALARM;
  1647. }
  1648. case "Abort":
  1649. CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.Abort);
  1650. return (int)FSM_MSG.NONE;
  1651. case "Retry":
  1652. if (CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.Retry, args))
  1653. {
  1654. return (int)TransporterMSG.Retry;
  1655. }
  1656. else
  1657. {
  1658. return (int)FSM_MSG.NONE;
  1659. }
  1660. case "ConfirmComplete":
  1661. if (CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.ConfirmComplete, args))
  1662. {
  1663. return (int)TransporterMSG.ConfirmComplete;
  1664. }
  1665. else
  1666. {
  1667. return (int)FSM_MSG.NONE;
  1668. }
  1669. }
  1670. return (int)FSM_MSG.NONE;
  1671. }
  1672. }
  1673. public enum TransporterMSG
  1674. {
  1675. HomeAll, // 0
  1676. SwitchOn,
  1677. SwitchOff,
  1678. Error,
  1679. ResumeError,
  1680. ReturnIdle,
  1681. Abort,
  1682. GantryGoToSavedPosition,
  1683. GoToSavedPosition,
  1684. PickUpFrom,
  1685. MoveTo,
  1686. Place,
  1687. Park,
  1688. ElevatorUp,
  1689. ElevatorLow,
  1690. Transfer,
  1691. PickUpMoveTo,
  1692. PickUpValidate,
  1693. GantrySafeMove,
  1694. Retry,
  1695. ConfirmComplete,
  1696. Flip
  1697. }
  1698. }