TransporterEntity.cs 64 KB

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