TransporterEntity.cs 63 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568
  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. }
  589. return result;
  590. }
  591. #endregion
  592. #region Move To
  593. /// <summary>
  594. /// Move To
  595. /// </summary>
  596. /// <param name="param"></param>
  597. /// <returns></returns>
  598. private bool MoveTo(object[] param)
  599. {
  600. if (!CheckOtherEntityStatus(param[0].ToString()))
  601. {
  602. LOG.WriteLog(eEvent.WARN_TRANSPORTER, Module.ToString(), $"Module Axis meets conflict of other Axis");
  603. return false;
  604. }
  605. bool result= _moveToRoutine.Start(param[0]) == RState.Running;
  606. if(result)
  607. {
  608. _targetCell = param[0].ToString();
  609. _sourceCell = "";
  610. _currentRoutine = _moveToRoutine;
  611. }
  612. return result;
  613. }
  614. /// <summary>
  615. /// MoveTo超时
  616. /// </summary>
  617. /// <param name="param"></param>
  618. /// <returns></returns>
  619. private bool MoveToTimeout(object[] param)
  620. {
  621. RState ret = _moveToRoutine.Monitor();
  622. if (ret == RState.Failed || ret == RState.Timeout)
  623. {
  624. _targetCell = "";
  625. _currentRoutine = null;
  626. PostMsg(TransporterMSG.Error);
  627. return false;
  628. }
  629. bool result = ret == RState.End;
  630. if(result)
  631. {
  632. _targetCell = "";
  633. _currentRoutine = null;
  634. if (!string.IsNullOrEmpty(_sourceCell))
  635. {
  636. _sourceCell = "";
  637. }
  638. }
  639. return result;
  640. }
  641. #endregion
  642. #region Place
  643. /// <summary>
  644. /// Place
  645. /// </summary>
  646. /// <param name="param"></param>
  647. /// <returns></returns>
  648. private bool Place(object[] param)
  649. {
  650. _targetCell = "";
  651. bool result = _placeRoutine.Start(param[0]) == RState.Running;
  652. if(result)
  653. {
  654. _currentRoutine = _placeRoutine;
  655. _targetCell = param[0].ToString();
  656. }
  657. return result;
  658. }
  659. /// <summary>
  660. /// Retry Place
  661. /// </summary>
  662. /// <param name="param"></param>
  663. /// <returns></returns>
  664. private bool RetryPlace(object[] param)
  665. {
  666. int stepIndex = (int)param[0];
  667. bool result = _placeRoutine.Retry(stepIndex) == RState.Running;
  668. if (result)
  669. {
  670. _currentRoutine = _placeRoutine;
  671. }
  672. return result;
  673. }
  674. /// <summary>
  675. /// Place超时
  676. /// </summary>
  677. /// <param name="param"></param>
  678. /// <returns></returns>
  679. private bool PlaceTimeout(object[] param)
  680. {
  681. RState ret = _placeRoutine.Monitor();
  682. if (ret == RState.Failed || ret == RState.Timeout)
  683. {
  684. _currentRoutine = null;
  685. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  686. {
  687. AlarmList alarmList = new AlarmList(Module.ToString(), ((TransporterState)fsm.State).ToString(), (int)TransporterMSG.Place,
  688. _placeRoutine.ErrorMsg, _placeRoutine.ErrorStep, (int)AlarmType.Error);
  689. AlarmListManager.Instance.AddAlarm(alarmList);
  690. }
  691. PostMsg(TransporterMSG.Error);
  692. return false;
  693. }
  694. bool result = ret == RState.End;
  695. if (result)
  696. {
  697. _currentRoutine = null;
  698. _targetCell = "";
  699. if (!string.IsNullOrEmpty(_sourceCell))
  700. {
  701. _sourceCell = "";
  702. }
  703. }
  704. return result;
  705. }
  706. /// <summary>
  707. /// 确认Place是否完成
  708. /// </summary>
  709. /// <param name="param"></param>
  710. /// <returns></returns>
  711. private bool ConfirmPlace(object[] param)
  712. {
  713. int stepIdex = (int)param[0];
  714. bool result = _placeRoutine.CheckCompleteCondition(stepIdex);
  715. if (!result)
  716. {
  717. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  718. {
  719. AlarmList alarmList = new AlarmList(Module.ToString(), ((TransporterState)fsm.State).ToString(), (int)TransporterMSG.Place,
  720. _placeRoutine.ErrorMsg, _placeRoutine.ErrorStep, (int)AlarmType.Error);
  721. AlarmListManager.Instance.AddAlarm(alarmList);
  722. }
  723. PostMsg(TransporterMSG.Error);
  724. }
  725. else
  726. {
  727. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  728. {
  729. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), TransporterState.Placing.ToString());
  730. }
  731. }
  732. return result;
  733. }
  734. #endregion
  735. #region Park
  736. /// <summary>
  737. /// Park
  738. /// </summary>
  739. /// <param name="param"></param>
  740. /// <returns></returns>
  741. private bool Park(object[] param)
  742. {
  743. bool result = _parkRoutine.Start() == RState.Running;
  744. if (result)
  745. {
  746. _currentRoutine = _parkRoutine;
  747. }
  748. return result;
  749. }
  750. /// <summary>
  751. /// Park超时
  752. /// </summary>
  753. /// <param name="param"></param>
  754. /// <returns></returns>
  755. private bool ParkTimeout(object[] param)
  756. {
  757. RState ret = _parkRoutine.Monitor();
  758. if (ret == RState.Failed || ret == RState.Timeout)
  759. {
  760. _currentRoutine = null;
  761. PostMsg(TransporterMSG.Error);
  762. return false;
  763. }
  764. bool result = ret == RState.End;
  765. if (result)
  766. {
  767. _currentRoutine = null;
  768. }
  769. return result;
  770. }
  771. #endregion
  772. #region Elevator Up
  773. /// <summary>
  774. /// Elevator Up
  775. /// </summary>
  776. /// <param name="param"></param>
  777. /// <returns></returns>
  778. private bool ElevatorUp(object[] param)
  779. {
  780. bool result = _elevatorUpRoutine.Start() == RState.Running;
  781. if (result)
  782. {
  783. _currentRoutine = _elevatorUpRoutine;
  784. }
  785. return result;
  786. }
  787. /// <summary>
  788. /// Elevator Up超时
  789. /// </summary>
  790. /// <param name="param"></param>
  791. /// <returns></returns>
  792. private bool ElevatorUpTimeout(object[] param)
  793. {
  794. RState ret = _elevatorUpRoutine.Monitor();
  795. if (ret == RState.Failed || ret == RState.Timeout)
  796. {
  797. _currentRoutine = null;
  798. PostMsg(TransporterMSG.Error);
  799. return false;
  800. }
  801. bool result = ret == RState.End;
  802. if (result)
  803. {
  804. _currentRoutine = null;
  805. }
  806. return result;
  807. }
  808. #endregion
  809. #region Elevator Low
  810. /// <summary>
  811. /// Elevator Low
  812. /// </summary>
  813. /// <param name="param"></param>
  814. /// <returns></returns>
  815. private bool ElevatorLow(object[] param)
  816. {
  817. bool result= _elevatorLowRoutine.Start() == RState.Running;
  818. if (result)
  819. {
  820. _currentRoutine = _elevatorLowRoutine;
  821. }
  822. return result;
  823. }
  824. /// <summary>
  825. /// Elevator Low超时
  826. /// </summary>
  827. /// <param name="param"></param>
  828. /// <returns></returns>
  829. private bool ElevatorLowTimeout(object[] param)
  830. {
  831. RState ret = _elevatorLowRoutine.Monitor();
  832. if (ret == RState.Failed || ret == RState.Timeout)
  833. {
  834. _currentRoutine = null;
  835. PostMsg(TransporterMSG.Error);
  836. return false;
  837. }
  838. bool result = ret == RState.End;
  839. if (result)
  840. {
  841. _currentRoutine = null;
  842. }
  843. return result;
  844. }
  845. #endregion
  846. #region Transfer
  847. /// <summary>
  848. /// Transfer
  849. /// </summary>
  850. /// <param name="param"></param>
  851. /// <returns></returns>
  852. private bool Transfer(object[] param)
  853. {
  854. if (!CheckOtherEntityStatus(param[0].ToString()))
  855. {
  856. LOG.WriteLog(eEvent.WARN_TRANSPORTER, Module.ToString(), $"Module Axis meets conflict of other Axis from {param[0]}");
  857. return false;
  858. }
  859. if (!CheckOtherEntityStatus(param[1].ToString()))
  860. {
  861. LOG.WriteLog(eEvent.WARN_TRANSPORTER, Module.ToString(), $"Module Axis meets conflict of other Axis to {param[1]}");
  862. return false;
  863. }
  864. bool result = _transferRoutine.Start(param) == RState.Running;
  865. if (result)
  866. {
  867. _sourceCell=param[0].ToString();
  868. _targetCell = param[1].ToString();
  869. _currentRoutine = _transferRoutine;
  870. }
  871. return result;
  872. }
  873. /// <summary>
  874. /// Retry Transfer
  875. /// </summary>
  876. /// <param name="param"></param>
  877. /// <returns></returns>
  878. private bool RetryTransfer(object[] param)
  879. {
  880. if (!CheckOtherEntityStatus(_sourceCell))
  881. {
  882. LOG.WriteLog(eEvent.WARN_TRANSPORTER, Module.ToString(), $"Module Axis meets conflict of other Axis from {_sourceCell}");
  883. return false;
  884. }
  885. if (!CheckOtherEntityStatus(_targetCell))
  886. {
  887. LOG.WriteLog(eEvent.WARN_TRANSPORTER, Module.ToString(), $"Module Axis meets conflict of other Axis to {_targetCell}");
  888. return false;
  889. }
  890. int stepIndex = (int)param[0];
  891. bool result = _transferRoutine.Retry(stepIndex) == RState.Running;
  892. if (result)
  893. {
  894. _currentRoutine = _transferRoutine;
  895. }
  896. return result;
  897. }
  898. /// <summary>
  899. /// Transfer超时
  900. /// </summary>
  901. /// <param name="param"></param>
  902. /// <returns></returns>
  903. private bool TransferTimeout(object[] param)
  904. {
  905. RState ret = _transferRoutine.Monitor();
  906. if (ret == RState.Failed || ret == RState.Timeout)
  907. {
  908. _targetCell = "";
  909. _sourceCell = "";
  910. _currentRoutine = null;
  911. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  912. {
  913. AlarmList alarmList = new AlarmList(Module.ToString(), ((TransporterState)fsm.State).ToString(), (int)TransporterMSG.Transfer,
  914. _transferRoutine.ErrorMsg, _transferRoutine.ErrorStep, (int)AlarmType.Error);
  915. AlarmListManager.Instance.AddAlarm(alarmList);
  916. }
  917. PostMsg(TransporterMSG.Error);
  918. return false;
  919. }
  920. bool result = ret == RState.End;
  921. if (result)
  922. {
  923. _targetCell = "";
  924. _sourceCell = "";
  925. _currentRoutine = null;
  926. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), TransporterState.Transfering.ToString());
  927. }
  928. return result;
  929. }
  930. /// <summary>
  931. /// 确认Transfer是否完成
  932. /// </summary>
  933. /// <param name="param"></param>
  934. /// <returns></returns>
  935. private bool ConfirmTransfer(object[] param)
  936. {
  937. int stepIdex = (int)param[0];
  938. bool result = _transferRoutine.CheckCompleteCondition(stepIdex);
  939. if (!result)
  940. {
  941. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  942. {
  943. AlarmList alarmList = new AlarmList(Module.ToString(), ((TransporterState)fsm.State).ToString(), (int)TransporterMSG.Transfer,
  944. _transferRoutine.ErrorMsg, _transferRoutine.ErrorStep, (int)AlarmType.Error);
  945. AlarmListManager.Instance.AddAlarm(alarmList);
  946. }
  947. PostMsg(TransporterMSG.Error);
  948. }
  949. else
  950. {
  951. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  952. {
  953. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), TransporterState.Transfering.ToString());
  954. }
  955. }
  956. return result;
  957. }
  958. /// <summary>
  959. /// 检验另一个Axis状态
  960. /// </summary>
  961. /// <returns></returns>
  962. public bool CheckOtherEntityStatus(string targetCell)
  963. {
  964. bool positive = false;
  965. TransporterEntity otherEntity=null;
  966. string otherModule = "";
  967. if (Module == ModuleName.Transporter2)
  968. {
  969. otherModule = ModuleName.Transporter1.ToString();
  970. otherEntity = Singleton<RouteManager>.Instance.GetModule<TransporterEntity>(ModuleName.Transporter1.ToString());
  971. positive = true;
  972. }
  973. else
  974. {
  975. otherModule = ModuleName.Transporter2.ToString();
  976. otherEntity = Singleton<RouteManager>.Instance.GetModule<TransporterEntity>(ModuleName.Transporter2.ToString());
  977. }
  978. if(otherEntity==null)
  979. {
  980. return true;
  981. }
  982. if (otherEntity.IsIdle)
  983. {
  984. return true;
  985. }
  986. if (otherEntity.IsError)
  987. {
  988. return false;
  989. }
  990. if(otherEntity.State==(int)TransporterState.Transfering||otherEntity.State==(int)TransporterState.PickUpMoveToing
  991. ||otherEntity.State==(int)TransporterState.MovingTo||otherEntity.State==(int)TransporterState.PickUpValidating
  992. ||otherEntity.State==(int)TransporterState.PickUpValidateComplete||otherEntity.State==(int)TransporterState.ValidateMoveTo)
  993. {
  994. bool conflict= CheckModuleWithOtherModuleConflict(otherEntity,otherModule,positive,targetCell);
  995. if(conflict)
  996. {
  997. return false;
  998. }
  999. else
  1000. {
  1001. return true;
  1002. }
  1003. }
  1004. else
  1005. {
  1006. return true;
  1007. }
  1008. }
  1009. /// <summary>
  1010. /// 分析目标cell的位置
  1011. /// </summary>
  1012. /// <param name="otherModule"></param>
  1013. /// <param name="targetCell"></param>
  1014. /// <returns></returns>
  1015. private (bool result,double targetPosition) AnalyseTargetCellPosition(string otherModule,string targetCell)
  1016. {
  1017. ProcessLayoutCellItem _cellItem = ProcessLayoutManager.Instance.GetProcessLayoutCellItemByModuleName(targetCell);
  1018. string stationName = targetCell;
  1019. if (_cellItem != null)
  1020. {
  1021. if (targetCell.ToLower() != "loader" && targetCell.ToLower() != "park")
  1022. {
  1023. stationName = $"Cell{_cellItem.CellId}";
  1024. }
  1025. }
  1026. else
  1027. {
  1028. LOG.WriteLog(eEvent.ERR_TRANSPORTER, Module.ToString(), $"{targetCell} not in layout");
  1029. return (false,0);
  1030. }
  1031. JetAxisBase otherGantryAxis = DEVICE.GetDevice<JetAxisBase>($"{otherModule}.Gantry");
  1032. var result = otherGantryAxis.GetPositionByStation(stationName);
  1033. if(result.success)
  1034. {
  1035. return (true,result.position);
  1036. }
  1037. return (false,0);
  1038. }
  1039. /// <summary>
  1040. /// 检验当前模块与另一个模块是否存在冲突
  1041. /// </summary>
  1042. /// <returns></returns>
  1043. private bool CheckModuleWithOtherModuleConflict(TransporterEntity otherEntity,string otherModule,bool positive,string targetCell)
  1044. {
  1045. int transporterMinimumDistance = SC.GetValue<int>("Transporter.TransporterMinimumDistance");
  1046. double motorPosition = _gantryAxis.MotionData.MotorPosition;
  1047. if(targetCell==ModuleName.Loader1.ToString())
  1048. {
  1049. targetCell = "Loader";
  1050. }
  1051. var result = AnalyseTargetCellPosition(Module.ToString(), targetCell);
  1052. if(!result.result)
  1053. {
  1054. return false;
  1055. }
  1056. double targetPosition=result.targetPosition;
  1057. JetAxisBase otherGantryAxis = DEVICE.GetDevice<JetAxisBase>($"{otherModule}.Gantry");
  1058. if(otherGantryAxis==null)
  1059. {
  1060. return false;
  1061. }
  1062. double otherPosition = otherGantryAxis.MotionData.MotorPosition;
  1063. if (!string.IsNullOrEmpty(otherEntity.TargetCell))
  1064. {
  1065. return CheckOtherModuleCellConflict(otherModule, otherEntity.TargetCell,otherPosition, positive, targetPosition);
  1066. }
  1067. if(!string.IsNullOrEmpty(otherEntity.SourceCell))
  1068. {
  1069. bool conflict= CheckOtherModuleCellConflict(otherModule, otherEntity.SourceCell,otherPosition, positive, targetPosition);
  1070. if (conflict)
  1071. {
  1072. //另一个Entity已经到达了目标位置
  1073. if (!string.IsNullOrEmpty(otherEntity.TargetCell)&&CheckOtherEntityAlreadyInTargetCell(otherEntity, otherEntity.TargetCell))
  1074. {
  1075. return false;
  1076. }
  1077. }
  1078. return conflict;
  1079. }
  1080. else
  1081. {
  1082. return false;
  1083. }
  1084. }
  1085. /// <summary>
  1086. /// 检验其他TransporterEntity已经到达目标cell
  1087. /// </summary>
  1088. /// <param name="otherEntity"></param>
  1089. /// <param name="targetCell"></param>
  1090. /// <returns></returns>
  1091. private bool CheckOtherEntityAlreadyInTargetCell(TransporterEntity otherEntity,string targetCell)
  1092. {
  1093. //另一个Transporter已经取走了WaferHolder,同时gantry已经到达了目标cell
  1094. if (otherEntity.WaferHolderInfo != null)
  1095. {
  1096. JetAxisBase jetAxisBase = DEVICE.GetDevice<JetAxisBase>($"{otherEntity.Module}.Gantry");
  1097. if (jetAxisBase != null && jetAxisBase.CheckPositionIsInStation(jetAxisBase.MotionData.MotorPosition, targetCell))
  1098. {
  1099. return true;
  1100. }
  1101. }
  1102. return false;
  1103. }
  1104. /// <summary>
  1105. /// 检验另一个模块Cell是否存在冲突
  1106. /// </summary>
  1107. /// <param name="otherModule"></param>
  1108. /// <param name="cell"></param>
  1109. /// <param name="positive"></param>
  1110. /// <param name="motorPosition"></param>
  1111. /// <param name="targetPosition"></param>
  1112. /// <returns></returns>
  1113. private bool CheckOtherModuleCellConflict(string otherModule, string cell,double otherPosition, bool positive,double targetPosition)
  1114. {
  1115. int transporterMinimumDistance = SC.GetValue<int>("Transporter.TransporterMinimumDistance");
  1116. var result = AnalyseTargetCellPosition(otherModule, cell);
  1117. if (!result.result)
  1118. {
  1119. return false;
  1120. }
  1121. else
  1122. {
  1123. if (positive)
  1124. {
  1125. // if (result.targetPosition - transporterMinimumDistance <= motorPosition)
  1126. // {
  1127. // return true;
  1128. // }
  1129. if (result.targetPosition - transporterMinimumDistance <= targetPosition)
  1130. {
  1131. return true;
  1132. }
  1133. if(otherPosition - transporterMinimumDistance <= targetPosition)
  1134. {
  1135. return true;
  1136. }
  1137. return false;
  1138. }
  1139. else
  1140. {
  1141. //if (result.targetPosition + transporterMinimumDistance >= motorPosition)
  1142. //{
  1143. // return true;
  1144. //}
  1145. if (result.targetPosition + transporterMinimumDistance >= targetPosition)
  1146. {
  1147. return true;
  1148. }
  1149. if(otherPosition + transporterMinimumDistance >= targetPosition)
  1150. {
  1151. return true;
  1152. }
  1153. return false;
  1154. }
  1155. }
  1156. }
  1157. #endregion
  1158. #region PickUpMoveTo
  1159. /// <summary>
  1160. /// PickUpMoveTo
  1161. /// </summary>
  1162. /// <param name="param"></param>
  1163. /// <returns></returns>
  1164. private bool PickUpMoveTo(object[] param)
  1165. {
  1166. if (!CheckOtherEntityStatus(param[0].ToString()))
  1167. {
  1168. LOG.WriteLog(eEvent.WARN_TRANSPORTER, Module.ToString(), $"Module Axis meets conflict of other Axis from {param[0]}");
  1169. return false;
  1170. }
  1171. if (!CheckOtherEntityStatus(param[1].ToString()))
  1172. {
  1173. LOG.WriteLog(eEvent.WARN_TRANSPORTER, Module.ToString(), $"Module Axis meets conflict of other Axis to {param[1]}");
  1174. return false;
  1175. }
  1176. bool result = _pickUpMoveToRoutine.Start(param) == RState.Running;
  1177. if (result)
  1178. {
  1179. _sourceCell = param[0].ToString();
  1180. _targetCell = param[1].ToString();
  1181. _currentRoutine = _pickUpMoveToRoutine;
  1182. }
  1183. return result;
  1184. }
  1185. /// <summary>
  1186. /// Retry PickUpMoveTo
  1187. /// </summary>
  1188. /// <param name="param"></param>
  1189. /// <returns></returns>
  1190. private bool RetryPickUpMoveTo(object[] param)
  1191. {
  1192. if (!CheckOtherEntityStatus(_sourceCell))
  1193. {
  1194. LOG.WriteLog(eEvent.WARN_TRANSPORTER, Module.ToString(), $"Module Axis meets conflict of other Axis from {_sourceCell}");
  1195. return false;
  1196. }
  1197. if (!CheckOtherEntityStatus(_targetCell))
  1198. {
  1199. LOG.WriteLog(eEvent.WARN_TRANSPORTER, Module.ToString(), $"Module Axis meets conflict of other Axis to {_targetCell}");
  1200. return false;
  1201. }
  1202. int stepIndex = (int)param[0];
  1203. bool result = _pickUpMoveToRoutine.Retry(stepIndex) == RState.Running;
  1204. if (result)
  1205. {
  1206. _currentRoutine = _pickUpMoveToRoutine;
  1207. }
  1208. return result;
  1209. }
  1210. /// <summary>
  1211. /// PickUpMoveTo超时
  1212. /// </summary>
  1213. /// <param name="param"></param>
  1214. /// <returns></returns>
  1215. private bool PickUpMoveToTimeout(object[] param)
  1216. {
  1217. RState ret = _pickUpMoveToRoutine.Monitor();
  1218. if (ret == RState.Failed || ret == RState.Timeout)
  1219. {
  1220. _targetCell = "";
  1221. _sourceCell = "";
  1222. _currentRoutine = null;
  1223. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  1224. {
  1225. AlarmList alarmList = new AlarmList(Module.ToString(), ((TransporterState)fsm.State).ToString(), (int)TransporterMSG.PickUpMoveTo,
  1226. _pickUpMoveToRoutine.ErrorMsg, _pickUpMoveToRoutine.ErrorStep, (int)AlarmType.Error);
  1227. AlarmListManager.Instance.AddAlarm(alarmList);
  1228. }
  1229. PostMsg(TransporterMSG.Error);
  1230. return false;
  1231. }
  1232. bool result = ret == RState.End;
  1233. if (result)
  1234. {
  1235. _targetCell = "";
  1236. _sourceCell = "";
  1237. _currentRoutine = null;
  1238. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), TransporterState.PickUpMoveToing.ToString());
  1239. }
  1240. return result;
  1241. }
  1242. /// <summary>
  1243. /// 确认PickupMoveto是否完成
  1244. /// </summary>
  1245. /// <param name="param"></param>
  1246. /// <returns></returns>
  1247. private bool ConfirmPickupMoveto(object[] param)
  1248. {
  1249. int stepIdex = (int)param[0];
  1250. bool result = _pickUpMoveToRoutine.CheckCompleteCondition(stepIdex);
  1251. if (!result)
  1252. {
  1253. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  1254. {
  1255. AlarmList alarmList = new AlarmList(Module.ToString(), ((TransporterState)fsm.State).ToString(), (int)TransporterMSG.PickUpMoveTo,
  1256. _pickUpMoveToRoutine.ErrorMsg, _pickUpMoveToRoutine.ErrorStep, (int)AlarmType.Error);
  1257. AlarmListManager.Instance.AddAlarm(alarmList);
  1258. }
  1259. PostMsg(TransporterMSG.Error);
  1260. }
  1261. else
  1262. {
  1263. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  1264. {
  1265. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), TransporterState.PickUpMoveToing.ToString());
  1266. }
  1267. }
  1268. return result;
  1269. }
  1270. #endregion
  1271. #region PickUpValidate
  1272. /// <summary>
  1273. /// PickUpValidate
  1274. /// </summary>
  1275. /// <param name="param"></param>
  1276. /// <returns></returns>
  1277. private bool PickUpValidate(object[] param)
  1278. {
  1279. if (!CheckOtherEntityStatus(param[0].ToString()))
  1280. {
  1281. LOG.WriteLog(eEvent.WARN_TRANSPORTER, Module.ToString(), $"Module Axis meets conflict of other Axis from {param[0]}");
  1282. return false;
  1283. }
  1284. bool result = _pickUpValidateRoutine.Start(param) == RState.Running;
  1285. if (result)
  1286. {
  1287. _sourceCell = param[0].ToString();
  1288. _currentRoutine = _pickUpValidateRoutine;
  1289. }
  1290. return result;
  1291. }
  1292. /// <summary>
  1293. /// Retry PickUpValidate
  1294. /// </summary>
  1295. /// <param name="param"></param>
  1296. /// <returns></returns>
  1297. private bool RetryPickUpValidate(object[] param)
  1298. {
  1299. if (!CheckOtherEntityStatus(_sourceCell))
  1300. {
  1301. LOG.WriteLog(eEvent.WARN_TRANSPORTER, Module.ToString(), $"Module Axis meets conflict of other Axis from {_sourceCell}");
  1302. return false;
  1303. }
  1304. int stepIndex = (int)param[0];
  1305. bool result = _pickUpValidateRoutine.Retry(stepIndex) == RState.Running;
  1306. if (result)
  1307. {
  1308. _currentRoutine = _pickUpValidateRoutine;
  1309. }
  1310. return result;
  1311. }
  1312. /// <summary>
  1313. /// PickUpValidate超时
  1314. /// </summary>
  1315. /// <param name="param"></param>
  1316. /// <returns></returns>
  1317. private bool PickUpValidateTimeout(object[] param)
  1318. {
  1319. RState ret = _pickUpValidateRoutine.Monitor();
  1320. if (ret == RState.Failed || ret == RState.Timeout)
  1321. {
  1322. _sourceCell = "";
  1323. _currentRoutine = null;
  1324. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  1325. {
  1326. AlarmList alarmList = new AlarmList(Module.ToString(), ((TransporterState)fsm.State).ToString(), (int)TransporterMSG.PickUpValidate,
  1327. _pickUpValidateRoutine.ErrorMsg, _pickUpValidateRoutine.ErrorStep, (int)AlarmType.Error);
  1328. AlarmListManager.Instance.AddAlarm(alarmList);
  1329. }
  1330. PostMsg(TransporterMSG.Error);
  1331. return false;
  1332. }
  1333. bool result = ret == RState.End;
  1334. if (result)
  1335. {
  1336. _currentRoutine = null;
  1337. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), TransporterState.PickUpValidating.ToString());
  1338. //Routine完成,但transporter却没有WaferHolder,则表示此次取WH失败,transporter返回Idle,便于调度重新选择下一个WaferHolder
  1339. if (WaferHolderInfo == null)
  1340. {
  1341. PostMsg(TransporterMSG.ReturnIdle);
  1342. return false;
  1343. }
  1344. }
  1345. return result;
  1346. }
  1347. /// <summary>
  1348. /// 确认PickupValidate是否完成
  1349. /// </summary>
  1350. /// <param name="param"></param>
  1351. /// <returns></returns>
  1352. private bool ConfirmPickupValidate(object[] param)
  1353. {
  1354. int stepIdex = (int)param[0];
  1355. bool result = _pickUpValidateRoutine.CheckCompleteCondition(stepIdex);
  1356. if (!result)
  1357. {
  1358. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  1359. {
  1360. AlarmList alarmList = new AlarmList(Module.ToString(), ((TransporterState)fsm.State).ToString(), (int)TransporterMSG.PickUpValidate,
  1361. _pickUpValidateRoutine.ErrorMsg, _pickUpValidateRoutine.ErrorStep, (int)AlarmType.Error);
  1362. AlarmListManager.Instance.AddAlarm(alarmList);
  1363. }
  1364. PostMsg(TransporterMSG.Error);
  1365. }
  1366. else
  1367. {
  1368. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  1369. {
  1370. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), TransporterState.PickUpValidating.ToString());
  1371. }
  1372. }
  1373. return result;
  1374. }
  1375. #endregion
  1376. #region TransporterRetry
  1377. /// <summary>
  1378. /// Retry
  1379. /// </summary>
  1380. /// <param name="param"></param>
  1381. /// <returns></returns>
  1382. private bool TransporterRetry(object[] param)
  1383. {
  1384. AlarmList alarmList = AlarmListManager.Instance.GetAlarmListByModule(Module.ToString());
  1385. if (alarmList != null)
  1386. {
  1387. CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), alarmList.ModuleCmd,
  1388. alarmList.ModuleStep);
  1389. }
  1390. return false;
  1391. }
  1392. #endregion
  1393. #region ConfirmComplete
  1394. /// <summary>
  1395. /// 确认是否完成
  1396. /// </summary>
  1397. /// <param name="param"></param>
  1398. /// <returns></returns>
  1399. private bool ConfirmComplete(object[] param)
  1400. {
  1401. AlarmList alarmList = AlarmListManager.Instance.GetAlarmListByModule(Module.ToString());
  1402. if (alarmList != null)
  1403. {
  1404. if (alarmList.ModuleState == TransporterState.Transfering.ToString())
  1405. {
  1406. CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.Transfer, alarmList.ModuleStep);
  1407. }
  1408. else if (alarmList.ModuleState == TransporterState.PickUpMoveToing.ToString())
  1409. {
  1410. CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.PickUpMoveTo, alarmList.ModuleStep);
  1411. }
  1412. else if (alarmList.ModuleState == TransporterState.Placing.ToString())
  1413. {
  1414. CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.Place, alarmList.ModuleStep);
  1415. }
  1416. else
  1417. {
  1418. PostMsg(TransporterMSG.Error);
  1419. }
  1420. }
  1421. return false;
  1422. }
  1423. /// <summary>
  1424. /// 清除报警
  1425. /// </summary>
  1426. /// <param name="param"></param>
  1427. /// <returns></returns>
  1428. private bool ClearModuleAlarm(object[] param)
  1429. {
  1430. AlarmList alarmList = AlarmListManager.Instance.GetAlarmListByModule(Module.ToString());
  1431. if (alarmList != null)
  1432. {
  1433. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), "");
  1434. }
  1435. return true;
  1436. }
  1437. #endregion
  1438. public bool Check(int msg, out string reason, params object[] args)
  1439. {
  1440. reason = "";
  1441. return false;
  1442. }
  1443. public bool CheckAcked(int msg)
  1444. {
  1445. return false;
  1446. }
  1447. public int Invoke(string function, params object[] args)
  1448. {
  1449. switch (function)
  1450. {
  1451. case "HomeAll":
  1452. if(IsIdle)
  1453. {
  1454. return (int)FSM_MSG.NONE;
  1455. }
  1456. if (CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.HomeAll))
  1457. {
  1458. return (int)FSM_MSG.NONE;
  1459. }
  1460. else
  1461. {
  1462. return (int)FSM_MSG.ALARM;
  1463. }
  1464. case "Abort":
  1465. CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.Abort);
  1466. return (int)FSM_MSG.NONE;
  1467. case "Retry":
  1468. if (CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.Retry, args))
  1469. {
  1470. return (int)TransporterMSG.Retry;
  1471. }
  1472. else
  1473. {
  1474. return (int)FSM_MSG.NONE;
  1475. }
  1476. case "ConfirmComplete":
  1477. if (CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.ERR_TRANSPORTER, Module.ToString(), (int)TransporterMSG.ConfirmComplete, args))
  1478. {
  1479. return (int)TransporterMSG.ConfirmComplete;
  1480. }
  1481. else
  1482. {
  1483. return (int)FSM_MSG.NONE;
  1484. }
  1485. }
  1486. return (int)FSM_MSG.NONE;
  1487. }
  1488. }
  1489. public enum TransporterMSG
  1490. {
  1491. HomeAll, // 0
  1492. SwitchOn,
  1493. SwitchOff,
  1494. Error,
  1495. ResumeError,
  1496. ReturnIdle,
  1497. Abort,
  1498. GantryGoToSavedPosition,
  1499. GoToSavedPosition,
  1500. PickUpFrom,
  1501. MoveTo,
  1502. Place,
  1503. Park,
  1504. ElevatorUp,
  1505. ElevatorLow,
  1506. Transfer,
  1507. PickUpMoveTo,
  1508. PickUpValidate,
  1509. GantrySafeMove,
  1510. Retry,
  1511. ConfirmComplete
  1512. }
  1513. }