InitRoutine.cs 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664
  1. using System;
  2. using System.Collections.Generic;
  3. using Aitex.Core.Common;
  4. using Aitex.Core.RT.Device;
  5. using Aitex.Core.RT.Device.Unit;
  6. using Aitex.Core.RT.Event;
  7. using Aitex.Core.RT.Routine;
  8. using Aitex.Core.RT.SCCore;
  9. using Aitex.Core.Util;
  10. using EFEM.RT.Devices;
  11. using Aitex.Sorter.Common;
  12. using EFEMSC;
  13. using MECF.Framework.Common.Equipment;
  14. using MECF.Framework.Common.SubstrateTrackings;
  15. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadPorts;
  16. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robot;
  17. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robots.RobotBase;
  18. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadPorts.LoadPortBase;
  19. using Aitex.Core.RT.Log;
  20. namespace EFEM.RT.Routines
  21. {
  22. public class InitRoutine : CommonRoutine, IRoutine, IEfemRoutine
  23. {
  24. enum Home
  25. {
  26. DeviceReset,
  27. FfuStart1,
  28. FfuStart2,
  29. RobotClear,
  30. RobotInit,
  31. WaitingRobotInit,
  32. RobotHome,
  33. WaitingRobotHome,
  34. RobotSet,
  35. AlignClear,
  36. AlignerInit,
  37. WaitingAlignerInit,
  38. AlignerHome,
  39. WaitingAlignerHome,
  40. AlignerMoveUp,
  41. WaitingAlignerUp,
  42. Coolingbuffer1Home,
  43. Coolingbuffer2Home,
  44. Aligner1Home,
  45. Aligner2Home,
  46. AxisClearAlarm,
  47. AxisServon,
  48. AxisServonDelay,
  49. AxisSetConfig,
  50. AxisSetConfigDelay,
  51. AxisHome,
  52. CloseAtmShutterDoor,
  53. CloseVtmShutterDoor,
  54. LoadportAClear,
  55. LoadportAHome,
  56. WaitingLoadportAHome,
  57. LoadportBClear,
  58. LoadportBHome,
  59. WaitingLoadportBHome,
  60. LoadportCClear,
  61. LoadportCHome,
  62. WaitingLoadportCHome,
  63. LoadportDClear,
  64. LoadportDHome,
  65. WaitingLoadportDHome,
  66. LoadportEClear,
  67. LoadportEHome,
  68. WaitingLoadportEHome,
  69. LoadportFClear,
  70. LoadportFHome,
  71. WaitingLoadportFHome,
  72. LoadportGClear,
  73. LoadportGHome,
  74. WaitingLoadportGHome,
  75. LoadportHClear,
  76. LoadportHHome,
  77. WaitingLoadportHHome,
  78. LoadportIClear,
  79. LoadportIHome,
  80. WaitingLoadportIHome,
  81. LoadportJClear,
  82. LoadportJHome,
  83. WaitingLoadportJHome,
  84. LoadportAllReset,
  85. LoadportAllInit,
  86. RobotBlade1Grip,
  87. RobotBlade1ConfirmWafer,
  88. RobotBlade1Release,
  89. CheckWaferPrecense,
  90. CheckBlade1WaferPrecense,
  91. CheckBlade1WaferPrecenseWait,
  92. CheckBlade2WaferPrecense,
  93. CheckBlade2WaferPrecenseWait,
  94. RobotBlade2Grip,
  95. RobotBlade2ConfirmWafer,
  96. RobotBlade2Release,
  97. QuerySignalStatus,
  98. RobotBlade1Hold,
  99. RobotBlade2Hold
  100. }
  101. private SetSpeedRoutine RbSetRoutine = null;
  102. private bool _scanBuffer = true;
  103. private SCConfigItem _scRobotHomeTimeout = null;
  104. private int _scFfuSpeed;
  105. private int _timeoutRobot = 0;
  106. private int _timeoutBuffer = 0;
  107. public InitRoutine(string module, string name)
  108. {
  109. Module = module;
  110. Name = name;
  111. RbSetRoutine = new SetSpeedRoutine(module, name);
  112. }
  113. public bool Initalize()
  114. {
  115. RbSetRoutine.Initalize();
  116. _scRobotHomeTimeout = SC.GetConfigItem(SorterCommon.ScPathName.Robot_TimeLimitRobotHome);
  117. IsStopped = true;
  118. return true;
  119. }
  120. public void Terminate()
  121. {
  122. RbSetRoutine.Terminate();
  123. }
  124. public Result Start(params object[] objs)
  125. {
  126. Name = "Init";
  127. Reset();
  128. _timeoutRobot = _scRobotHomeTimeout.IntValue;
  129. _timeoutBuffer = SC.GetValue<int>(ScPathName.Coolbuffer_DownTimeout);
  130. RbSetRoutine.Speed = SC.GetValue<int>(SorterCommon.ScPathName.Robot_RobotSpeed);
  131. if (DeviceDefineManager.Instance.GetValue<bool>("FfuMemoBusControl") ?? false)
  132. {
  133. _scFfuSpeed = SC.GetValue<int>("System.FFUSetSpeed");
  134. }
  135. EV.PostMessage(ModuleName.System.ToString(), EventEnum.HomeBegins, ModuleName.System.ToString());
  136. robot = DEVICE.GetDevice<RobotBaseDevice>(DeviceName.Robot);
  137. _scanBuffer = true;
  138. WaferSensorResetCreate();
  139. IsStopped = false;
  140. return Result.RUN;
  141. }
  142. public Result Monitor()
  143. {
  144. if (IsStopped)
  145. return Result.DONE;
  146. try
  147. {
  148. DeviceReset((int)Home.DeviceReset, "Device Reset", 1, Notify, Stop);
  149. if (DeviceDefineManager.Instance.GetValue<bool>("FfuMemoBusControl") ?? false)
  150. {
  151. FfuSpeedSet((int)Home.FfuStart1, "FFU1", _scFfuSpeed, _timeoutRobot, Notify, Stop);
  152. FfuSpeedSet((int)Home.FfuStart2, "FFU2", _scFfuSpeed, _timeoutRobot, Notify, Stop);
  153. }
  154. RobotReset((int)Home.RobotClear, robot, "Robot reset", _timeoutRobot, Notify, Stop);
  155. RobotHome((int)Home.RobotHome, robot, "Robot home", Notify, Stop);
  156. WaitRobotMotion((int)Home.WaitingRobotHome, robot, "Robot homing...", _timeoutRobot, Notify, Stop);
  157. //GripRobotBlade((int)Home.RobotBlade1Hold, Hand.Blade1, robot, _timeoutRobot);
  158. //GripRobotBlade((int)Home.RobotBlade2Hold, Hand.Blade2, robot, _timeoutRobot);
  159. CheckBladeWaferIsExist((int)Home.CheckBlade1WaferPrecense, robot, Hand.Blade1, _timeoutRobot);
  160. WaitRobotMotion((int)Home.CheckBlade1WaferPrecenseWait, robot, "wait check blade1", _timeoutRobot, Notify, Stop);
  161. CheckBladeWaferIsExist((int)Home.CheckBlade2WaferPrecense, robot, Hand.Blade2, _timeoutRobot);
  162. WaitRobotMotion((int)Home.CheckBlade2WaferPrecenseWait, robot, "wait check blade2", _timeoutRobot, Notify, Stop);
  163. ConfirmRobotBladeWafer((int)Home.RobotBlade1ConfirmWafer, Hand.Blade1);
  164. ConfirmRobotBladeWafer((int)Home.RobotBlade2ConfirmWafer, Hand.Blade2);
  165. // if (NeedRobotGripAndUngrip)
  166. {
  167. HomeGripAndUngripRobotBlade((int)Home.RobotBlade1Grip, Hand.Blade1, robot, _timeoutRobot);
  168. HomeGripAndUngripRobotBlade((int)Home.RobotBlade2Grip, Hand.Blade2, robot, _timeoutRobot);
  169. }
  170. // //CheckRobotBladeWaferPrecense((int)Home.CheckWaferPrecense, robot, _timeoutRobot);
  171. //// RobotSignalStatus((int)Home.QuerySignalStatus, robot, _timeoutRobot);
  172. //HomeReleaseRobotBlade((int)Home.RobotBlade1Release, Hand.Blade1, robot, _timeoutRobot);
  173. //HomeReleaseRobotBlade((int)Home.RobotBlade2Release, Hand.Blade2, robot, _timeoutRobot);
  174. if (DeviceDefineManager.Instance.GetValue<bool>("CoolingBufferInstalled") ?? false)
  175. {
  176. if(!SC.GetValue<bool>("System.CoolingBuffer1Disable"))
  177. CooingbufferHome((int)Home.Coolingbuffer1Home, buffer1, "Cooling buffer1 moving down",
  178. _timeoutBuffer, Notify, Stop);
  179. if (!SC.GetValue<bool>("System.CoolingBuffer2Disable"))
  180. CooingbufferHome((int)Home.Coolingbuffer2Home, buffer2, "Cooling buffer2 moving down",
  181. _timeoutBuffer, Notify, Stop);
  182. if (!SC.GetValue<bool>("System.Aligner1Disable"))
  183. CooingbufferHome((int)Home.Aligner1Home, aligner1, "Aligner1 moving down",
  184. _timeoutBuffer, Notify, Stop);
  185. if (!SC.GetValue<bool>("System.Aligner2Disable"))
  186. CooingbufferHome((int)Home.Aligner2Home, aligner2, "Aligner2 moving down",
  187. _timeoutBuffer, Notify, Stop);
  188. }
  189. if (LoadLockDoorControlByStation)
  190. {
  191. LoadLockCloseAtmDoor((int)Home.CloseAtmShutterDoor, DEVICE.GetDevice<LoadLockDevice>(ModuleName.LL1.ToString()), "Wait Atm Door Close", _timeoutRobot, Notify, Stop);
  192. LoadLockCloseVtmDoor((int)Home.CloseVtmShutterDoor, DEVICE.GetDevice<LoadLockDevice>(ModuleName.LL1.ToString()), "Wait Vtm Door Close", _timeoutRobot, Notify, Stop);
  193. }
  194. //if (initIndex < LoadPortQuantity)
  195. //{
  196. // LoadportReset((int)Home.LoadportAClear + initIndex * 3, DEVICE.GetDevice<LoadPortBaseDevice>($"LP{initIndex + 1}"), $"LP{initIndex + 1} reset", _timeoutRobot, Notify, Stop);
  197. // initIndex++;
  198. // return Result.RUN;
  199. //}
  200. LoadportAllReset((int)Home.LoadportAllReset, _timeoutRobot);
  201. LoadportAllInit((int)Home.LoadportAllInit, _timeoutRobot);
  202. }
  203. catch (RoutineBreakException)
  204. {
  205. return Result.RUN;
  206. }
  207. catch (RoutineFaildException)
  208. {
  209. IsStopped = true;
  210. return Result.FAIL;
  211. }
  212. EV.PostMessage(ModuleName.System.ToString(), EventEnum.HomeEnds, ModuleName.System.ToString());
  213. IsStopped = true;
  214. return Result.DONE;
  215. }
  216. public void FfuSpeedSet(int id, string name, int speed, int time, Action<string> notify, Action<string> error)
  217. {
  218. Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
  219. {
  220. var device = DEVICE.GetDevice<Ffu>(name);
  221. notify($"{device.Name} start and set speed");
  222. string reason = string.Empty;
  223. device.StartAndSetSpeed(speed);
  224. return true;
  225. }, () =>
  226. {
  227. var device = DEVICE.GetDevice<Ffu>(name);
  228. switch (device.Name)
  229. {
  230. case "FFU1":
  231. if (Ffu.SpeedSet1)
  232. {
  233. notify($"{device.Name} is running");
  234. return true;
  235. }
  236. break;
  237. case "FFU2":
  238. if (Ffu.SpeedSet2)
  239. {
  240. notify($"{device.Name} is running");
  241. return true;
  242. }
  243. break;
  244. }
  245. return false;
  246. }, time * 1000);
  247. if (ret.Item1)
  248. {
  249. if (ret.Item2 == Result.FAIL)
  250. {
  251. throw (new RoutineFaildException());
  252. }
  253. else if (ret.Item2 == Result.TIMEOUT) //timeout
  254. {
  255. error(String.Format("{0} timeout, than {1} seconds", name, time));
  256. throw (new RoutineFaildException());
  257. }
  258. else
  259. throw (new RoutineBreakException());
  260. }
  261. }
  262. protected void WaitRobotSet(int id, string name, IRoutine routines, Action<string> notify, Action<string> error)
  263. {
  264. Tuple<bool, Result> ret = ExecuteAndWait(id, routines);
  265. if (ret.Item1)
  266. {
  267. if (ret.Item2 == Result.FAIL)
  268. {
  269. error(name);
  270. throw (new RoutineFaildException());
  271. }
  272. else if (ret.Item2 == Result.RUN)
  273. {
  274. throw (new RoutineBreakException());
  275. }
  276. }
  277. }
  278. protected void DeviceReset(int id, string name, int time, Action<string> notify, Action<string> error)
  279. {
  280. Tuple<bool, Result> ret = Delay(id, () =>
  281. {
  282. notify(String.Format("Device reset"));
  283. Singleton<DeviceEntity>.Instance.PostMsg(DeviceEntity.MSG.RESET);
  284. return true;
  285. }, time * 1000);
  286. if (ret.Item1)
  287. {
  288. if (ret.Item2 == Result.RUN)
  289. {
  290. throw (new RoutineBreakException());
  291. }
  292. }
  293. }
  294. #region aligner
  295. public void AlignerReset(int id, Aligner device, string name, int time, Action<string> notify, Action<string> error)
  296. {
  297. Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
  298. {
  299. notify(String.Format("{0} clear error", device.Name));
  300. string reason = string.Empty;
  301. return device.Clear(out reason);
  302. }, () =>
  303. {
  304. if (device.Busy == false)
  305. {
  306. return true;
  307. }
  308. return false;
  309. }, time * 1000);
  310. if (ret.Item1)
  311. {
  312. if (ret.Item2 == Result.FAIL)
  313. {
  314. throw (new RoutineFaildException());
  315. }
  316. else if (ret.Item2 == Result.TIMEOUT) //timeout
  317. {
  318. error(String.Format("{0} timeout, than {1} seconds", name, time));
  319. throw (new RoutineFaildException());
  320. }
  321. else
  322. throw (new RoutineBreakException());
  323. }
  324. }
  325. public void AlignerInit(int id, Aligner device, string name, Action<string> notify, Action<string> error)
  326. {
  327. Tuple<bool, Result> ret = Execute(id, () =>
  328. {
  329. notify(String.Format("{0} Home", device.Name));
  330. string reason = string.Empty;
  331. return device.Init(out reason);
  332. });
  333. if (ret.Item1)
  334. {
  335. if (ret.Item2 == Result.FAIL)
  336. {
  337. throw (new RoutineFaildException());
  338. }
  339. }
  340. }
  341. public void AlignerHome(int id, Aligner device, string name, Action<string> notify, Action<string> error)
  342. {
  343. Tuple<bool, Result> ret = Execute(id, () =>
  344. {
  345. notify(String.Format("{0} Home", device.Name));
  346. string reason = string.Empty;
  347. return device.Home(out reason);
  348. });
  349. if (ret.Item1)
  350. {
  351. if (ret.Item2 == Result.FAIL)
  352. {
  353. throw (new RoutineFaildException());
  354. }
  355. }
  356. }
  357. public void AlignerMoveUp(int id, Aligner device, string name, Action<string> notify, Action<string> error)
  358. {
  359. Tuple<bool, Result> ret = Execute(id, () =>
  360. {
  361. notify(String.Format("{0} Lift up", device.Name));
  362. string reason = string.Empty;
  363. return device.LiftUp(out reason);
  364. });
  365. if (ret.Item1)
  366. {
  367. if (ret.Item2 == Result.FAIL)
  368. {
  369. throw (new RoutineFaildException());
  370. }
  371. }
  372. }
  373. #endregion
  374. #region Loadport
  375. ///等待 Loadport
  376. public void QueryLoadportState(int id, LoadPort device, string name, int time, Action<string> notify, Action<string> error)
  377. {
  378. Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
  379. {
  380. notify(String.Format("{0} query state", device.Name));
  381. string reason = string.Empty;
  382. device.QueryState(out reason);
  383. return true;
  384. }, () =>
  385. {
  386. if (!device.IsBusy)
  387. {
  388. return true;
  389. }
  390. return false;
  391. }, time * 1000);
  392. if (ret.Item1)
  393. {
  394. if (ret.Item2 == Result.FAIL)
  395. {
  396. throw (new RoutineFaildException());
  397. }
  398. else if (ret.Item2 == Result.TIMEOUT) //timeout
  399. {
  400. error(String.Format("{0} query timeout, than {1} seconds", name, time));
  401. throw (new RoutineFaildException());
  402. }
  403. else
  404. throw (new RoutineBreakException());
  405. }
  406. }
  407. #endregion
  408. void WaferSensorResetCreate()
  409. {
  410. if (!_scanBuffer) return;
  411. //var sensors = new List<bool>
  412. //{
  413. // DeviceModel.SensorCoolingStageSLOT1WaferON != null ? DeviceModel.SensorCoolingStageSLOT1WaferON.Value : true,
  414. // DeviceModel.SensorCoolingStageSLOT2WaferON != null ? DeviceModel.SensorCoolingStageSLOT2WaferON.Value : true,
  415. // DeviceModel.SensorCoolingStageSLOT3WaferON != null ? DeviceModel.SensorCoolingStageSLOT3WaferON.Value : true,
  416. // DeviceModel.SensorCoolingStageSLOT4WaferON != null ? DeviceModel.SensorCoolingStageSLOT4WaferON.Value : true,
  417. // DeviceModel.SensorCoolingStageSLOT5WaferON != null ? DeviceModel.SensorCoolingStageSLOT5WaferON.Value : true,
  418. // DeviceModel.SensorCoolingStageSLOT6WaferON != null ? DeviceModel.SensorCoolingStageSLOT6WaferON.Value : true,
  419. //};
  420. var index = 0;
  421. //foreach (var sensor in sensors)
  422. //{
  423. // if (!sensor && WaferManager.Instance.CheckNoWafer(ModuleName.CoolingBuffer1, index))
  424. // {
  425. // WaferManager.Instance.CreateWafer(ModuleName.CoolingBuffer1, index, WaferStatus.Normal);
  426. // }
  427. // else if (sensor && WaferManager.Instance.CheckHasWafer(ModuleName.CoolingBuffer1, index))
  428. // {
  429. // WaferManager.Instance.DeleteWafer(ModuleName.CoolingBuffer1, index);
  430. // }
  431. // if (!sensor && WaferManager.Instance.CheckNoWafer(ModuleName.CoolingBuffer2, index))
  432. // {
  433. // WaferManager.Instance.CreateWafer(ModuleName.CoolingBuffer2, index, WaferStatus.Normal);
  434. // }
  435. // else if (sensor && WaferManager.Instance.CheckHasWafer(ModuleName.CoolingBuffer2, index))
  436. // {
  437. // WaferManager.Instance.DeleteWafer(ModuleName.CoolingBuffer2, index);
  438. // }
  439. // index++;
  440. //}
  441. //var robotSensors = new List<bool>
  442. //{
  443. // DeviceModel.SensorRBlowerArmhavewafer != null ? DeviceModel.SensorRBlowerArmhavewafer.Value : true,
  444. // DeviceModel.SensorRBupperArmhavewafer != null ? DeviceModel.SensorRBupperArmhavewafer.Value : true,
  445. //};
  446. //index = 0;
  447. //foreach (var sensor in robotSensors)
  448. //{
  449. // if (!sensor && WaferManager.Instance.CheckNoWafer(ModuleName.Robot, index))
  450. // {
  451. // WaferManager.Instance.CreateWafer(ModuleName.Robot, index, WaferStatus.Normal);
  452. // }
  453. // else if (sensor && WaferManager.Instance.CheckHasWafer(ModuleName.Robot, index))
  454. // {
  455. // WaferManager.Instance.DeleteWafer(ModuleName.Robot, index);
  456. // }
  457. // index++;
  458. //}
  459. if (DeviceModel.SensorPreAlignerWaferOn != null && !DeviceModel.SensorPreAlignerWaferOn.Value && WaferManager.Instance.CheckNoWafer(ModuleName.Aligner, 0))
  460. {
  461. WaferManager.Instance.CreateWafer(ModuleName.Aligner, 0, WaferStatus.Normal);
  462. }
  463. else
  464. {
  465. if (DeviceDefineManager.Instance.GetValue<bool>("AlignerInstalled") ?? false)
  466. WaferManager.Instance.DeleteWafer(ModuleName.Aligner, 0);
  467. }
  468. //var loadLockQuantity = DeviceDefineManager.Instance.GetValue<int>("LoadLockQuantity") ?? 0;
  469. //if (loadLockQuantity > 0 && Singleton<EfemEntity>.Instance.IsOnlineMode)
  470. //{
  471. // for (int i = 1; i <= loadLockQuantity; i++)
  472. // {
  473. // var moduleName = ModuleHelper.Converter($"LL{i}");
  474. // if (WaferManager.Instance.CheckHasWafer(moduleName, 0))
  475. // {
  476. // WaferManager.Instance.DeleteWafer(moduleName, 0);
  477. // }
  478. // }
  479. //}
  480. _scanBuffer = false;
  481. }
  482. public void CooingbufferHome(int id, IoCoolingBuffer device, string name, int time, Action<string> notify, Action<string> error)
  483. {
  484. Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
  485. {
  486. if (SC.GetValue<bool>($"System.{device.Name}Disable"))
  487. {
  488. EV.PostInfoLog("System", String.Format("{0} is Disable", device.Name));
  489. return true;
  490. }
  491. notify(String.Format("{0} {1}", device.Name, name));
  492. string reason = string.Empty;
  493. return device.Home(out reason);
  494. }, () =>
  495. {
  496. if (SC.GetValue<bool>($"System.{device.Name}Disable"))
  497. {
  498. //EV.PostInfoLog("System", String.Format("{0} is Disable", device.Name));
  499. return true;
  500. }
  501. if (device.Error == true)
  502. {
  503. return null;
  504. }
  505. return device.CheckMovedDown() && !device.Busy;
  506. }, time * 1000);
  507. if (ret.Item1)
  508. {
  509. if (ret.Item2 == Result.FAIL)
  510. {
  511. throw (new RoutineFaildException());
  512. }
  513. else if (ret.Item2 == Result.TIMEOUT) //timeout
  514. {
  515. error(String.Format("{0} timeout, than {1} seconds", name, time));
  516. throw (new RoutineFaildException());
  517. }
  518. else
  519. throw (new RoutineBreakException());
  520. }
  521. }
  522. protected override void Notify(string message)
  523. {
  524. EV.PostMessage(Module, EventEnum.GeneralInfo, String.Format("Home sequence :{0}", message));
  525. }
  526. /// <summary>
  527. /// prepare process failed
  528. /// </summary>
  529. /// <param name="failReason"></param>
  530. /// <param name="reactor"></param>
  531. protected override void Stop(string failReason)
  532. {
  533. string reason = String.Empty;
  534. EV.PostMessage(Module, EventEnum.HomeFailed, failReason);
  535. }
  536. }
  537. }