IoE84.cs 52 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing.Text;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using System.Xml;
  8. using Aitex.Core.Common.DeviceData;
  9. using Aitex.Core.RT.DataCenter;
  10. using Aitex.Core.RT.Device;
  11. using Aitex.Core.RT.Event;
  12. using Aitex.Core.RT.IOCore;
  13. using Aitex.Core.RT.Log;
  14. using Aitex.Core.RT.OperationCenter;
  15. using Aitex.Core.RT.SCCore;
  16. using Aitex.Core.Util;
  17. using MECF.Framework.Common.Equipment;
  18. namespace Aitex.Core.RT.Device.Unit
  19. {
  20. public enum LPReservedState
  21. {
  22. NO_STATE = 0,
  23. NOT_RESERVED,
  24. RESERVED,
  25. }
  26. public enum LPTransferState
  27. {
  28. No_state = 10,
  29. OUT_OF_SERVICE = 0,
  30. IN_SERVICE,
  31. TRANSFER_READY,
  32. READY_TO_LOAD,
  33. READY_TO_UNLOAD,
  34. TRANSFER_BLOCKED,
  35. //PLACED_NORMAL_NOT_RUNNING,
  36. }
  37. public enum LPAccessMode
  38. {
  39. NO_STATE = -1,
  40. MANUAL,
  41. AUTO,
  42. }
  43. public enum SignalType
  44. {
  45. Acitvie,
  46. Passive,
  47. }
  48. public enum SignalID
  49. {
  50. LightCurtain,
  51. CS_0,
  52. CS_1,
  53. AM_AVBL,
  54. VALID,
  55. TR_REQ,
  56. BUSY,
  57. COMPT,
  58. CONT,
  59. L_REQ,
  60. U_REQ,
  61. HO_AVBL,
  62. READY,
  63. ES
  64. }
  65. public class Signal
  66. {
  67. public bool Value
  68. {
  69. get
  70. {
  71. if (_di != null)
  72. return _di.Value;
  73. if (_do != null)
  74. return _do.Value;
  75. return false;
  76. }
  77. }
  78. private SignalID _id;
  79. private RD_TRIG _trig = new RD_TRIG();
  80. private DIAccessor _di = null;
  81. private DOAccessor _do = null;
  82. public event Action<SignalID, bool> OnChanged;
  83. public Signal(SignalID id, DIAccessor diAccessor, DOAccessor doAccessor)
  84. {
  85. _id = id;
  86. _di = diAccessor;
  87. _do = doAccessor;
  88. }
  89. public void Monitor()
  90. {
  91. if (_di != null)
  92. _trig.CLK = _di.Value;
  93. if (_do != null)
  94. _trig.CLK = _do.Value;
  95. if (_trig.R)
  96. {
  97. if (OnChanged != null)
  98. OnChanged(_id, true);
  99. }
  100. if (_trig.M)
  101. {
  102. if (OnChanged != null)
  103. OnChanged(_id, false);
  104. }
  105. }
  106. public void Reset()
  107. {
  108. _trig.RST = true;
  109. }
  110. }
  111. public interface IE84Provider
  112. {
  113. bool IsCarrierPlacement();
  114. LPTransferState GetTransferState();
  115. LPAccessMode GetAccessMode();
  116. LPReservedState GetReservedState();
  117. bool SetAccessMode(bool value);
  118. void E84LoadStart();
  119. void E84LoadComplete();
  120. void E84UnloadStart();
  121. void E84UnloadComplte();
  122. void E84LoadError(string errorcode);
  123. void E84UnloadError(string errorcode);
  124. void E84Retry();
  125. }
  126. public class E84Passiver : BaseDevice, IDevice
  127. {
  128. public enum E84State
  129. {
  130. Normal,
  131. LD_TP1_Timeout,
  132. LD_TP2_Timeout,
  133. LD_TP3_Timeout,
  134. LD_TP4_Timeout,
  135. LD_TP5_Timeout,
  136. LD_TP6_Timeout,
  137. ULD_TP1_Timeout,
  138. ULD_TP2_Timeout,
  139. ULD_TP3_Timeout,
  140. ULD_TP4_Timeout,
  141. ULD_TP5_Timeout,
  142. ULD_TP6_Timeout,
  143. Error,
  144. }
  145. public enum Timeout
  146. {
  147. TP1,
  148. TP2,
  149. TP3,
  150. TP4,
  151. TP5,
  152. }
  153. public bool LightCurtainBroken { get { return !DiLightCurtain; } } //interlock
  154. public LPAccessMode Mode { get; set; }
  155. public LPTransferState TransferState { get; set; }
  156. public LPReservedState LPReserved { get; set; }
  157. public IE84Provider Provider { get; set; }
  158. public bool DiLightCurtain { get; set; }
  159. public bool DiValid { get { return _diValid != null ? _diValid.Value : false; } }
  160. public bool DiCS0 { get { return _diCS0 != null ? _diCS0.Value : false; } }
  161. public bool DiCS1 { get { return _diCS1 != null ? _diCS1.Value : false; } }
  162. public bool DiTrReq { get { return _diTrReq != null ? _diTrReq.Value : false; } }
  163. public bool DiBusy { get { return _diBusy != null ? _diBusy.Value : false; } }
  164. public bool DiCompt { get { return _diCompt != null ? _diCompt.Value : false; } }
  165. public bool DiCont { get { return _diCont != null ? _diCont.Value : false; } }
  166. public bool DiAmAvbl { get { return _diAmAvbl != null ? _diAmAvbl.Value : false; } }
  167. public bool DoLoadReq { get { return _doLoadReq != null ? _doLoadReq.Value : false; } }
  168. public bool DoUnloadReq { get { return _doUnloadReq != null ? _doUnloadReq.Value : false; } }
  169. public bool DoReady { get { return _doReady != null ? _doReady.Value : false; } }
  170. public bool DoHOAvbl { get { return _doHOAvbl != null ? _doHOAvbl.Value : false; } }
  171. public bool DoES { get { return _doES != null ? _doES.Value : false; } }
  172. public static string EventE84LoadTransactionStart = "E84LoadTransactionStart";
  173. public static string EventE84UnloadTransactionStart = "E84UnloadTransactionStart";
  174. public static string EventE84LoadTransactionComplete = "E84LoadTransactionComplete";
  175. public static string EventE84UnloadTransactionComplete = "E84UnloadTransactionComplete";
  176. public static string EventE84LoadTransactionRestart = "E84LoadTransactionRestart";
  177. public static string EventE84UnloadTransactionRestart = "E84UnloadTransactionRestart";
  178. public static string EventE84ChangeAccessModeToAuto = "EventE84ChangeAccessModeToAuto";
  179. public static string EventE84ChangeAccessModeToManual = "EventE84ChangeAccessModeToManual";
  180. //public static string EventE84TP1Timeout = "E84TP1Timeout";
  181. //public static string EventE84TP2Timeout = "E84TP2Timeout";
  182. //public static string EventE84TP3Timeout = "E84TP3Timeout";
  183. //public static string EventE84TP4Timeout = "E84TP4Timeout";
  184. //public static string EventE84TP5Timeout = "E84TP5Timeout";
  185. //public static string EventE84TP6Timeout = "E84TP6Timeout";
  186. //Active equipment signal
  187. private DIAccessor _diLightCurtain;
  188. private DIAccessor _diValid;
  189. private DIAccessor _diCS0;
  190. private DIAccessor _diCS1;
  191. private DIAccessor _diAmAvbl;
  192. private DIAccessor _diTrReq;
  193. private DIAccessor _diBusy;
  194. private DIAccessor _diCompt;
  195. private DIAccessor _diCont;
  196. //Passive
  197. private DOAccessor _doLoadReq;
  198. private DOAccessor _doUnloadReq;
  199. private DOAccessor _doReady;
  200. private DOAccessor _doHOAvbl;
  201. private DOAccessor _doES;
  202. private DeviceTimer _timer = new DeviceTimer();
  203. private DeviceTimer _timer_TP1 = new DeviceTimer();
  204. private DeviceTimer _timer_TP2 = new DeviceTimer();
  205. private DeviceTimer _timer_TP3 = new DeviceTimer();
  206. private DeviceTimer _timer_TP4 = new DeviceTimer();
  207. private DeviceTimer _timer_TP5 = new DeviceTimer();
  208. private DeviceTimer _timer_TP6 = new DeviceTimer();
  209. private R_TRIG _trigReset = new R_TRIG();
  210. private List<Signal> _signals = new List<Signal>();
  211. //timeout
  212. private SCConfigItem _scTimeoutTP1;
  213. private SCConfigItem _scTimeoutTP2;
  214. private SCConfigItem _scTimeoutTP3;
  215. private SCConfigItem _scTimeoutTP4;
  216. private SCConfigItem _scTimeoutTP5;
  217. private SCConfigItem _scTimeoutTP6;
  218. private SCConfigItem _scTimeoutTP7;
  219. private SCConfigItem _scTimeoutTP8;
  220. //private int reqOnTimeout = 2; //L_REQ|U_REQ_ON ON ---> TR REQ ON
  221. //private int readyOnTimeout = 2; //READY ON ---> BUSY ON
  222. //private int busyOnTimeout = 2; //BUSYON -- CARRIAGE DETECT|CARRIAGE REMOVE
  223. //private int reqOffTimeout = 2; //L_REQ|U_REQ off --->BUSY off
  224. //private int readyOffTimeout = 2; //Ready off --->Valid off
  225. private E84State _state;
  226. //private Timeout _tp;
  227. /// <summary>
  228. /// This constructor uses DeviceModel's node to define IOs
  229. /// </summary>
  230. /// <param name="module"></param>
  231. /// <param name="node"></param>
  232. /// <param name="ioModule"></param>
  233. public E84Passiver(string module, XmlElement node, string ioModule = "")
  234. {
  235. base.Module = node.GetAttribute("module");
  236. base.Name = node.GetAttribute("id");
  237. base.Display = node.GetAttribute("display");
  238. base.DeviceID = node.GetAttribute("schematicId");
  239. _diLightCurtain = ParseDiNode("LightCurtain", node, ioModule);
  240. _signals.Add(new Signal(SignalID.LightCurtain, _diLightCurtain, null));
  241. //Indicates that the signal transition is active and selected
  242. //ON: valid; OFF: not valid
  243. _diValid = ParseDiNode("VALID", node, ioModule);
  244. _signals.Add(new Signal(SignalID.VALID, _diValid, null));
  245. //Carrier stage 0
  246. //ON: Use the load port for carrier handoff; vice versa
  247. _diCS0 = ParseDiNode("CS_0", node, ioModule);
  248. _signals.Add(new Signal(SignalID.CS_0, _diCS0, null));
  249. //Carrier stage 1
  250. //ON: Use the load port for carrier handoff; vice versa
  251. _diCS1 = ParseDiNode("CS_1", node, ioModule);
  252. _signals.Add(new Signal(SignalID.CS_1, _diCS1, null));
  253. //Transfer Arm Available
  254. //ON: Handoff is available; OFF: Handoff is unavailable with any error
  255. _diAmAvbl = ParseDiNode("AM_AVBL", node, ioModule);
  256. _signals.Add(new Signal(SignalID.AM_AVBL, _diAmAvbl, null));
  257. //Transfer Request
  258. //ON: Request Handoff; vice versa
  259. _diTrReq = ParseDiNode("TR_REQ", node, ioModule);
  260. _signals.Add(new Signal(SignalID.TR_REQ, _diTrReq, null));
  261. //BUSY for transfer
  262. //ON: Handoff is in progress; vice versa
  263. _diBusy = ParseDiNode("BUSY", node, ioModule);
  264. _signals.Add(new Signal(SignalID.BUSY, _diBusy, null));
  265. //Complete Transfer
  266. //ON:The handoff is completed; vice versa
  267. _diCompt = ParseDiNode("COMPT", node, ioModule);
  268. _signals.Add(new Signal(SignalID.COMPT, _diCompt, null));
  269. //Continuous Handoff
  270. //ON: Continuous Handoff; vice versa
  271. _diCont = ParseDiNode("CONT", node, ioModule);
  272. _signals.Add(new Signal(SignalID.CONT, _diCont, null));
  273. //Load Request
  274. //ON: The load port is assigned to load a carrier; vice versa
  275. //CS_0 && VALID && !CarrierLoaded
  276. _doLoadReq = ParseDoNode("L_REQ", node, ioModule);
  277. _signals.Add(new Signal(SignalID.L_REQ, null, _doLoadReq));
  278. //Unload Request
  279. //ON: The load port is assigned to unload a carrier; vice versa
  280. //CS_0 && VALID && !CarrierUnloaded
  281. _doUnloadReq = ParseDoNode("U_REQ", node, ioModule);
  282. _signals.Add(new Signal(SignalID.U_REQ, null, _doUnloadReq));
  283. //READY for transfer(after accepted the transfer request set ON, turned OFF when COMPT ON)
  284. //ON: Ready for handoff; vice versa
  285. _doReady = ParseDoNode("READY", node, ioModule);
  286. _signals.Add(new Signal(SignalID.READY, null, _doReady));
  287. //Indicates the passive equipment is not available for the handoff.
  288. //ON: Handoff is available; OFF: vice versa but with error
  289. //ON when normal; OFF when : Maintenance mode / Error State
  290. _doHOAvbl = ParseDoNode("HO_AVBL", node, ioModule);
  291. _signals.Add(new Signal(SignalID.HO_AVBL, null, _doHOAvbl));
  292. //Emergency stop
  293. _doES = ParseDoNode("ES", node, ioModule);
  294. _signals.Add(new Signal(SignalID.ES, null, _doES));
  295. foreach (var signal in _signals)
  296. {
  297. signal.OnChanged += OnSignalChange;
  298. }
  299. _scTimeoutTP1 = SC.GetConfigItem("FA.E84.TP1");
  300. _scTimeoutTP2 = SC.GetConfigItem("FA.E84.TP2");
  301. _scTimeoutTP3 = SC.GetConfigItem("FA.E84.TP3");
  302. _scTimeoutTP4 = SC.GetConfigItem("FA.E84.TP4");
  303. _scTimeoutTP5 = SC.GetConfigItem("FA.E84.TP5");
  304. _scTimeoutTP6 = SC.GetConfigItem("FA.E84.TP6");
  305. _scTimeoutTP7 = SC.GetConfigItem("FA.E84.TP7");
  306. _scTimeoutTP8 = SC.GetConfigItem("FA.E84.TP8");
  307. OP.Subscribe($"{Module}.E84Place", (cmd, param) =>
  308. {
  309. if (!AutoLoad(out var reason))
  310. {
  311. EV.PostWarningLog(Module, $"{Name} can not Place, {reason}");
  312. return false;
  313. }
  314. return true;
  315. });
  316. OP.Subscribe($"{Module}.E84Pick", (cmd, param) =>
  317. {
  318. if (!AutoUnLoad(out var reason))
  319. {
  320. EV.PostWarningLog(Module, $"{Name} can not Pick, {reason}");
  321. return false;
  322. }
  323. return true;
  324. });
  325. OP.Subscribe($"{Module}.E84Retry", (cmd, param) =>
  326. {
  327. if (!E84Retry(out var reason))
  328. {
  329. EV.PostWarningLog(Module, $"{Name} can not retry E84 transaction, {reason}");
  330. return false;
  331. }
  332. return true;
  333. });
  334. OP.Subscribe($"{Module}.E84Complete", (cmd, param) =>
  335. {
  336. if (!E84Complete(out var reason))
  337. {
  338. EV.PostWarningLog(Module, $"{Name} can not complete E84 transaction, {reason}");
  339. return false;
  340. }
  341. return true;
  342. });
  343. DATA.Subscribe($"{Module}.E84State", () => _state.ToString());
  344. //DATA.Subscribe($"{Module}.TransferState", () => TransferState.ToString());
  345. //DATA.Subscribe($"{Module}.AccessMode", () => Mode.ToString());
  346. //DATA.Subscribe($"{Module}_E84STATE", () => (ushort)_state);
  347. //DATA.Subscribe($"{Module}_TRANSFER_STATE", () => (ushort)TransferState);
  348. //DATA.Subscribe($"{Module}_ACCESS_MODE", () => (ushort)Mode);
  349. DATA.Subscribe($"{Module}.LightCurtain", () => (_diLightCurtain != null ? _diLightCurtain.Value : true));
  350. DATA.Subscribe($"{Module}.Valid", () => _diValid.Value);
  351. DATA.Subscribe($"{Module}.TransferRequest", () => _diTrReq.Value);
  352. DATA.Subscribe($"{Module}.Busy", () => _diBusy.Value);
  353. DATA.Subscribe($"{Module}.TransferComplete", () => _diCompt.Value);
  354. DATA.Subscribe($"{Module}.CS0", () => _diCS0.Value);
  355. DATA.Subscribe($"{Module}.CS1", () => _diCS1.Value);
  356. DATA.Subscribe($"{Module}.CONT", () => _diCont.Value);
  357. DATA.Subscribe($"{Module}.LoadRequest", () => _doLoadReq.Value);
  358. DATA.Subscribe($"{Module}.UnloadRequest", () => _doUnloadReq.Value);
  359. DATA.Subscribe($"{Module}.ReadyToTransfer", () => _doReady.Value);
  360. DATA.Subscribe($"{Module}.HandoffAvailable", () => _doHOAvbl.Value);
  361. DATA.Subscribe($"{Module}.ES", () => _doES.Value);
  362. int index = (int)(ModuleName)(Enum.Parse(typeof(ModuleName), Module)) - 1;
  363. EV.Subscribe(new EventItem(60061 + 10 * index, "Event", AlarmTP1timeout, $"{Module} Occurred TP1 Timeout", EventLevel.Alarm, Aitex.Core.RT.Event.EventType.HostNotification));
  364. EV.Subscribe(new EventItem(60062 + 10 * index, "Event", AlarmTP2timeout, $"{Module} Occurred TP2 Timeout", EventLevel.Alarm, Aitex.Core.RT.Event.EventType.HostNotification));
  365. EV.Subscribe(new EventItem(60063 + 10 * index, "Event", AlarmTP3timeout, $"{Module} Occurred TP3 Timeout", EventLevel.Alarm, Aitex.Core.RT.Event.EventType.HostNotification));
  366. EV.Subscribe(new EventItem(60064 + 10 * index, "Event", AlarmTP4timeout, $"{Module} Occurred TP4 Timeout", EventLevel.Alarm, Aitex.Core.RT.Event.EventType.HostNotification));
  367. EV.Subscribe(new EventItem(60065 + 10 * index, "Event", AlarmTP5timeout, $"{Module} Occurred TP5 Timeout", EventLevel.Alarm, Aitex.Core.RT.Event.EventType.HostNotification));
  368. _thread = new PeriodicJob(10, OnTimer, $"{Module}.{Name} MonitorE84Handler", true);
  369. }
  370. private string AlarmTP1timeout { get => $"{Module}TP1Timeout"; }
  371. private string AlarmTP2timeout { get => $"{Module}TP2Timeout"; }
  372. private string AlarmTP3timeout { get => $"{Module}TP3Timeout"; }
  373. private string AlarmTP4timeout { get => $"{Module}TP4Timeout"; }
  374. private string AlarmTP5timeout { get => $"{Module}TP5Timeout"; }
  375. /// <summary>
  376. /// This constructor gets IO signals using GetIO
  377. /// </summary>
  378. /// <param name="module"></param>
  379. /// <param name="name"></param>
  380. /// <param name="display"></param>
  381. /// <param name="deviceId"></param>
  382. public E84Passiver(string module, string name, string display, string deviceId)
  383. {
  384. Module = module;
  385. Name = name;
  386. Display = display;
  387. DeviceID = deviceId;
  388. _diLightCurtain = IO.DI[$"DI_{module}_LightCurtain"];
  389. _signals.Add(new Signal(SignalID.LightCurtain, _diLightCurtain, null));
  390. //Indicates that the signal transition is active and selected
  391. //ON: valid; OFF: not valid
  392. _diValid = IO.DI[$"DI_{module}_VALID"];
  393. _signals.Add(new Signal(SignalID.VALID, _diValid, null));
  394. //Carrier stage 0
  395. //ON: Use the load port for carrier handoff; vice versa
  396. _diCS0 = IO.DI[$"DI_{module}_CS_0"];
  397. _signals.Add(new Signal(SignalID.CS_0, _diCS0, null));
  398. //Carrier stage 1
  399. //ON: Use the load port for carrier handoff; vice versa
  400. _diCS1 = IO.DI[$"DI_{module}_CS_1"] ?? IO.DI[$"DI_{module}_CS_0"];
  401. _signals.Add(new Signal(SignalID.CS_1, _diCS1, null));
  402. //Transfer Arm Available
  403. //ON: Handoff is available; OFF: Handoff is unavailable with any error
  404. _diAmAvbl = IO.DI[$"DI_{module}_AM_AVBL"];
  405. _signals.Add(new Signal(SignalID.AM_AVBL, _diAmAvbl, null));
  406. //Transfer Request
  407. //ON: Request Handoff; vice versa
  408. _diTrReq = IO.DI[$"DI_{module}_TR_REQ"];
  409. _signals.Add(new Signal(SignalID.TR_REQ, _diTrReq, null));
  410. //BUSY for transfer
  411. //ON: Handoff is in progress; vice versa
  412. _diBusy = IO.DI[$"DI_{module}_BUSY"];
  413. _signals.Add(new Signal(SignalID.BUSY, _diBusy, null));
  414. //Complete Transfer
  415. //ON:The handoff is completed; vice versa
  416. _diCompt = IO.DI[$"DI_{module}_COMPT"];
  417. _signals.Add(new Signal(SignalID.COMPT, _diCompt, null));
  418. //Continuous Handoff
  419. //ON: Continuous Handoff; vice versa
  420. _diCont = IO.DI[$"DI_{module}_CONT"];
  421. _signals.Add(new Signal(SignalID.CONT, _diCont, null));
  422. //Load Request
  423. //ON: The load port is assigned to load a carrier; vice versa
  424. //CS_0 && VALID && !CarrierLoaded
  425. _doLoadReq = IO.DO[$"DI_{module}_L_REQ"];
  426. _signals.Add(new Signal(SignalID.L_REQ, null, _doLoadReq));
  427. //Unload Request
  428. //ON: The load port is assigned to unload a carrier; vice versa
  429. //CS_0 && VALID && !CarrierUnloaded
  430. _doUnloadReq = IO.DO[$"DI_{module}_U_REQ"];
  431. _signals.Add(new Signal(SignalID.U_REQ, null, _doUnloadReq));
  432. //READY for transfer(after accepted the transfer request set ON, turned OFF when COMPT ON)
  433. //ON: Ready for handoff; vice versa
  434. _doReady = IO.DO[$"DI_{module}_READY"];
  435. _signals.Add(new Signal(SignalID.READY, null, _doReady));
  436. //Indicates the passive equipment is not available for the handoff.
  437. //ON: Handoff is available; OFF: vice versa but with error
  438. //ON when normal; OFF when : Maintenance mode / Error State
  439. _doHOAvbl = IO.DO[$"DI_{module}_HO_AVBL"];
  440. _signals.Add(new Signal(SignalID.HO_AVBL, null, _doHOAvbl));
  441. //Emergency stop
  442. _doES = IO.DO[$"DI_{module}_ES"];
  443. _signals.Add(new Signal(SignalID.ES, null, _doES));
  444. foreach (var signal in _signals)
  445. {
  446. signal.OnChanged += OnSignalChange;
  447. }
  448. _scTimeoutTP1 = SC.GetConfigItem("FA.E84.TP1");
  449. _scTimeoutTP2 = SC.GetConfigItem("FA.E84.TP2");
  450. _scTimeoutTP3 = SC.GetConfigItem("FA.E84.TP3");
  451. _scTimeoutTP4 = SC.GetConfigItem("FA.E84.TP4");
  452. _scTimeoutTP5 = SC.GetConfigItem("FA.E84.TP5");
  453. _scTimeoutTP6 = SC.GetConfigItem("FA.E84.TP6");
  454. _scTimeoutTP7 = SC.GetConfigItem("FA.E84.TP7");
  455. _scTimeoutTP8 = SC.GetConfigItem("FA.E84.TP8");
  456. OP.Subscribe($"{Module}.E84Place", (cmd, param) =>
  457. {
  458. if (!AutoLoad(out var reason))
  459. {
  460. EV.PostWarningLog(Module, $"{Name} can not Place, {reason}");
  461. return false;
  462. }
  463. return true;
  464. });
  465. OP.Subscribe($"{Module}.E84Pick", (cmd, param) =>
  466. {
  467. if (!AutoUnLoad(out var reason))
  468. {
  469. EV.PostWarningLog(Module, $"{Name} can not Pick, {reason}");
  470. return false;
  471. }
  472. return true;
  473. });
  474. OP.Subscribe($"{Module}.E84Retry", (cmd, param) =>
  475. {
  476. if (!E84Retry(out var reason))
  477. {
  478. EV.PostWarningLog(Module, $"{Name} can not retry E84 transaction, {reason}");
  479. return false;
  480. }
  481. return true;
  482. });
  483. OP.Subscribe($"{Module}.E84Complete", (cmd, param) =>
  484. {
  485. if (!E84Complete(out var reason))
  486. {
  487. EV.PostWarningLog(Module, $"{Name} can not complete E84 transaction, {reason}");
  488. return false;
  489. }
  490. return true;
  491. });
  492. DATA.Subscribe($"{Module}.E84State", () => _state.ToString());
  493. //DATA.Subscribe($"{Module}.TransferState", () => TransferState.ToString());
  494. // DATA.Subscribe($"{Module}.AccessMode", () => Mode.ToString());
  495. DATA.Subscribe($"{Module}.LightCurtain", () => _diLightCurtain.Value);
  496. DATA.Subscribe($"{Module}.Valid", () => _diValid.Value);
  497. DATA.Subscribe($"{Module}.TransferRequest", () => _diTrReq.Value);
  498. DATA.Subscribe($"{Module}.Busy", () => _diBusy.Value);
  499. DATA.Subscribe($"{Module}.TransferComplete", () => _diCompt.Value);
  500. DATA.Subscribe($"{Module}.CS0", () => _diCS0.Value);
  501. DATA.Subscribe($"{Module}.CS1", () => _diCS1.Value);
  502. DATA.Subscribe($"{Module}.CONT", () => _diCont.Value);
  503. DATA.Subscribe($"{Module}.LoadRequest", () => _doLoadReq.Value);
  504. DATA.Subscribe($"{Module}.UnloadRequest", () => _doUnloadReq.Value);
  505. DATA.Subscribe($"{Module}.ReadyToTransfer", () => _doReady.Value);
  506. DATA.Subscribe($"{Module}.HandoffAvailable", () => _doHOAvbl.Value);
  507. DATA.Subscribe($"{Module}.ES", () => _doES.Value);
  508. int index = (int)(ModuleName)(Enum.Parse(typeof(ModuleName), Module)) - 1;
  509. EV.Subscribe(new EventItem(60061 + 10 * index, "Event", AlarmTP1timeout, $"{Module} Occurred TP1 Timeout", EventLevel.Alarm, Aitex.Core.RT.Event.EventType.HostNotification));
  510. EV.Subscribe(new EventItem(60062 + 10 * index, "Event", AlarmTP2timeout, $"{Module} Occurred TP2 Timeout", EventLevel.Alarm, Aitex.Core.RT.Event.EventType.HostNotification));
  511. EV.Subscribe(new EventItem(60063 + 10 * index, "Event", AlarmTP3timeout, $"{Module} Occurred TP3 Timeout", EventLevel.Alarm, Aitex.Core.RT.Event.EventType.HostNotification));
  512. EV.Subscribe(new EventItem(60064 + 10 * index, "Event", AlarmTP4timeout, $"{Module} Occurred TP4 Timeout", EventLevel.Alarm, Aitex.Core.RT.Event.EventType.HostNotification));
  513. EV.Subscribe(new EventItem(60065 + 10 * index, "Event", AlarmTP5timeout, $"{Module} Occurred TP5 Timeout", EventLevel.Alarm, Aitex.Core.RT.Event.EventType.HostNotification));
  514. _thread = new PeriodicJob(10, OnTimer, $"{Module}.{Name} MonitorE84Handler", true);
  515. }
  516. private PeriodicJob _thread;
  517. public bool Stop(out string reason)
  518. {
  519. reason = String.Empty;
  520. ResetSignal();
  521. return false;
  522. }
  523. public bool AutoLoad(out string reason)
  524. {
  525. //reason = String.Empty;
  526. //if (Mode != LPAccessMode.AUTO)
  527. //{
  528. // if (!SetAMHS(out reason))
  529. // {
  530. // return false;
  531. // }
  532. //}
  533. //if (Provider.ReadyForLoad())
  534. //{
  535. // TransferState = LPTransferState.READY_TO_LOAD;
  536. // return true;
  537. //}
  538. reason = "Not Ready For Auto Load";
  539. return false;
  540. }
  541. public bool AutoUnLoad(out string reason)
  542. {
  543. //reason = String.Empty;
  544. //if (Mode != LPAccessMode.AUTO)
  545. //{
  546. // if (!SetAMHS(out reason))
  547. // {
  548. // return false;
  549. // }
  550. //}
  551. //if (Provider.ReadyForUnload())
  552. //{
  553. // TransferState = LPTransferState.READY_TO_UNLOAD;
  554. // return true;
  555. //}
  556. reason = "Not Ready For Auto Load";
  557. return false;
  558. }
  559. public bool SetAMHS(out string reason)
  560. {
  561. reason = "";
  562. Provider.SetAccessMode(true);
  563. return true;
  564. }
  565. public bool SetManual(out string reason)
  566. {
  567. reason = "";
  568. Provider.SetAccessMode(false);
  569. return true;
  570. }
  571. public bool E84Retry(out string reason)
  572. {
  573. reason = "";
  574. var dvid = new SerializableDictionary<string, object>();
  575. int portID = 0;
  576. dvid["PORT_ID"] = int.TryParse(Module.Replace("LP", ""), out portID) ? portID : portID;
  577. ResetSignal();
  578. Provider.E84Retry();
  579. return true;
  580. }
  581. public bool E84Complete(out string reason)
  582. {
  583. reason = "";
  584. var dvid = new SerializableDictionary<string, object>();
  585. int portID = 0;
  586. dvid["PORT_ID"] = int.TryParse(Module.Replace("LP", ""), out portID) ? portID : portID;
  587. switch (_state)
  588. {
  589. case E84State.Error:
  590. ResetSignal();
  591. break;
  592. case E84State.LD_TP1_Timeout:
  593. if (Provider.IsCarrierPlacement())
  594. {
  595. EV.Notify(EventE84LoadTransactionComplete, dvid);
  596. ResetSignal();
  597. }
  598. else
  599. {
  600. reason = "Foup not detected";
  601. return false;
  602. }
  603. break;
  604. case E84State.LD_TP2_Timeout:
  605. if (Provider.IsCarrierPlacement())
  606. {
  607. EV.Notify(EventE84LoadTransactionComplete, dvid);
  608. ResetSignal();
  609. }
  610. else
  611. {
  612. reason = "Foup not detected";
  613. return false;
  614. }
  615. break;
  616. case E84State.LD_TP3_Timeout:
  617. if (Provider.IsCarrierPlacement())
  618. {
  619. EV.Notify(EventE84LoadTransactionComplete, dvid);
  620. ResetSignal();
  621. }
  622. else
  623. {
  624. reason = "Foup not detected";
  625. return false;
  626. }
  627. break;
  628. case E84State.LD_TP4_Timeout:
  629. if (Provider.IsCarrierPlacement())
  630. {
  631. EV.Notify(EventE84LoadTransactionComplete, dvid);
  632. ResetSignal();
  633. }
  634. else
  635. {
  636. reason = "Foup not detected";
  637. return false;
  638. }
  639. break;
  640. case E84State.LD_TP5_Timeout:
  641. ResetSignal();
  642. break;
  643. case E84State.ULD_TP1_Timeout:
  644. if (!Provider.IsCarrierPlacement())
  645. {
  646. EV.Notify(EventE84UnloadTransactionComplete, dvid);
  647. ResetSignal();
  648. }
  649. else
  650. {
  651. reason = "Foup detected";
  652. return false;
  653. }
  654. break;
  655. case E84State.ULD_TP2_Timeout:
  656. if (!Provider.IsCarrierPlacement())
  657. {
  658. EV.Notify(EventE84UnloadTransactionComplete, dvid);
  659. ResetSignal();
  660. }
  661. else
  662. {
  663. reason = "Foup detected";
  664. return false;
  665. }
  666. break;
  667. case E84State.ULD_TP3_Timeout:
  668. if (!Provider.IsCarrierPlacement())
  669. {
  670. EV.Notify(EventE84UnloadTransactionComplete, dvid);
  671. ResetSignal();
  672. }
  673. else
  674. {
  675. reason = "Foup detected";
  676. return false;
  677. }
  678. break;
  679. case E84State.ULD_TP4_Timeout:
  680. if (!Provider.IsCarrierPlacement())
  681. {
  682. EV.Notify(EventE84UnloadTransactionComplete, dvid);
  683. ResetSignal();
  684. }
  685. else
  686. {
  687. reason = "Foup detected";
  688. return false;
  689. }
  690. break;
  691. case E84State.ULD_TP5_Timeout:
  692. ResetSignal();
  693. break;
  694. default:
  695. ResetSignal();
  696. break;
  697. }
  698. return true;
  699. }
  700. public bool Initialize()
  701. {
  702. ResetSignal();
  703. EV.Subscribe(new EventItem("Event", EventE84LoadTransactionStart, "EventE84LoadTransactionStart"));
  704. EV.Subscribe(new EventItem("Event", EventE84UnloadTransactionStart, "EventE84UnloadTransactionStart"));
  705. EV.Subscribe(new EventItem("Event", EventE84LoadTransactionComplete, "EventE84LoadTransactionComplete"));
  706. EV.Subscribe(new EventItem("Event", EventE84UnloadTransactionComplete, "EventE84UnloadTransactionComplete"));
  707. EV.Subscribe(new EventItem("Event", EventE84LoadTransactionRestart, "EventE84LoadTransactionRestart"));
  708. EV.Subscribe(new EventItem("Event", EventE84UnloadTransactionRestart, "EventE84UnloadTransactionRestart"));
  709. return true;
  710. }
  711. private bool InvokeReset(string arg1, object[] arg2)
  712. {
  713. //string reason;
  714. EV.PostInfoLog(Module, $"E84 reset {Module}.{Name}");
  715. ResetSignal();
  716. return true;
  717. }
  718. public void Terminate()
  719. {
  720. ResetSignal();
  721. }
  722. private void ResetSignal()
  723. {
  724. _doLoadReq.Value = false;
  725. _doUnloadReq.Value = false;
  726. _doReady.Value = false;
  727. _doHOAvbl.Value = false;
  728. _doES.Value = false;
  729. _timer_TP1.Stop();
  730. _timer_TP2.Stop();
  731. _timer_TP3.Stop();
  732. _timer_TP4.Stop();
  733. _timer_TP5.Stop();
  734. _state = E84State.Normal;
  735. foreach (var signal in _signals)
  736. {
  737. signal.Reset();
  738. }
  739. }
  740. private LPTransferState preTranState;
  741. private string _lastSignalValue = "";
  742. private void RecordSignalChange()
  743. {
  744. string tempSignal = $"{Name} E84 signal change to following,Active: Valid:{_diValid.Value}," +
  745. $"CS0:{_diCS0.Value},TransferRequest:{_diTrReq.Value},Busy:{_diBusy.Value},Complete:{_diCompt.Value}," +
  746. $"Passive:LoadRequest:{_doLoadReq.Value},UnloadRequest:{_doUnloadReq.Value},Ready:{_doReady.Value}," +
  747. $"HoAvl:{_doHOAvbl.Value},ES:{_doES.Value},LightCurtain:" +
  748. $"{(_diLightCurtain == null ? "None" : _diLightCurtain.Value.ToString())}," +
  749. $"Present Sensor:{(Provider == null ? "None" : Provider.IsCarrierPlacement().ToString())}";
  750. if (tempSignal != _lastSignalValue)
  751. {
  752. _lastSignalValue = tempSignal;
  753. LOG.Write(_lastSignalValue);
  754. }
  755. }
  756. private bool OnTimer()
  757. {
  758. try
  759. {
  760. foreach (var signal in _signals)
  761. {
  762. signal.Monitor();
  763. }
  764. RecordSignalChange();
  765. if (Provider == null)
  766. return true;
  767. TransferState = Provider.GetTransferState();
  768. Mode = Provider.GetAccessMode();
  769. LPReserved = Provider.GetReservedState();
  770. if (_diLightCurtain != null)
  771. {
  772. DiLightCurtain = _diLightCurtain.Value;
  773. if (SC.ContainsItem("Fa.E84.BypassLightCurtain") && SC.GetValue<bool>("Fa.E84.BypassLightCurtain"))
  774. DiLightCurtain = true;
  775. }
  776. else DiLightCurtain = true;
  777. if (LightCurtainBroken || TransferState == LPTransferState.OUT_OF_SERVICE || Mode != LPAccessMode.AUTO)
  778. {
  779. _doHOAvbl.Value = false;
  780. _doLoadReq.Value = false;
  781. _doUnloadReq.Value = false;
  782. _doReady.Value = false;
  783. _doES.Value = false;
  784. _timer_TP1.Stop();
  785. _timer_TP2.Stop();
  786. _timer_TP3.Stop();
  787. _timer_TP4.Stop();
  788. _timer_TP5.Stop();
  789. _timer_TP6.Stop();
  790. preTranState = TransferState;
  791. return true;
  792. }
  793. if (_state != E84State.Normal)
  794. return true;
  795. _doHOAvbl.Value = true;
  796. _doES.Value = true;
  797. var dvid = new SerializableDictionary<string, object>();
  798. int portID = 0;
  799. dvid["PORT_ID"] = int.TryParse(Module.Replace("LP", ""), out portID) ? portID : portID;
  800. if (TransferState == LPTransferState.READY_TO_LOAD)
  801. {
  802. preTranState = TransferState;
  803. if (DiCS0 && DiValid && !_doLoadReq.Value)
  804. {
  805. _doLoadReq.Value = true;
  806. }
  807. if (DiCS0 && DiValid && _doLoadReq.Value && !DiTrReq)
  808. {
  809. if (_timer_TP1.IsIdle()) _timer_TP1.Start(_scTimeoutTP1.IntValue * 1000);
  810. }
  811. if (DiCS0 && DiValid && _doLoadReq.Value && DiTrReq && !_doReady.Value)
  812. {
  813. _timer_TP1.Stop();
  814. _doReady.Value = true;
  815. if (Provider != null) Provider.E84LoadStart();
  816. EV.Notify(EventE84LoadTransactionStart, dvid);
  817. }
  818. }
  819. if (TransferState == LPTransferState.TRANSFER_BLOCKED && preTranState == LPTransferState.READY_TO_LOAD) //Load Sequence
  820. {
  821. if (DiCS0 && DiValid && _doLoadReq.Value && DiTrReq && _doReady.Value && !DiBusy)
  822. {
  823. if (_timer_TP2.IsIdle()) _timer_TP2.Start(_scTimeoutTP2.IntValue * 1000);
  824. }
  825. if (DiCS0 && DiValid && _doLoadReq.Value && DiTrReq && _doReady.Value && DiBusy)
  826. {
  827. _timer_TP2.Stop();
  828. if (!Provider.IsCarrierPlacement())
  829. {
  830. if (_timer_TP3.IsIdle()) _timer_TP3.Start(_scTimeoutTP3.IntValue * 1000);
  831. }
  832. else
  833. {
  834. _timer_TP3.Stop();
  835. _doLoadReq.Value = false;
  836. }
  837. }
  838. if (DiCS0 && DiValid && !_doLoadReq.Value && DiTrReq && _doReady.Value && DiBusy)
  839. {
  840. if (_timer_TP4.IsIdle()) _timer_TP4.Start(_scTimeoutTP4.IntValue * 1000);
  841. }
  842. if (DiCS0 && DiValid && !_doLoadReq.Value && _doReady.Value && !DiBusy)
  843. {
  844. _timer_TP4.Stop();
  845. }
  846. if (DiCS0 && DiValid && !_doLoadReq.Value && _doReady.Value && DiCompt)
  847. {
  848. _doReady.Value = false;
  849. _timer_TP4.Stop();
  850. if (_timer_TP5.IsIdle()) _timer_TP5.Start(_scTimeoutTP5.IntValue * 1000);
  851. }
  852. if (!DiCS0 && !_doLoadReq.Value && !_doUnloadReq.Value && !DiTrReq && !_doReady.Value && !DiBusy && !DiCompt)
  853. {
  854. _timer_TP5.Stop();
  855. EV.Notify(EventE84LoadTransactionComplete, dvid);
  856. preTranState = LPTransferState.TRANSFER_BLOCKED;
  857. if (Provider != null) Provider.E84LoadComplete();
  858. }
  859. }
  860. if (TransferState == LPTransferState.READY_TO_UNLOAD)
  861. {
  862. preTranState = TransferState;
  863. if (DiCS0 && DiValid && !_doUnloadReq.Value)
  864. {
  865. _doUnloadReq.Value = true;
  866. //Provider.LPTSTrans();
  867. //EV.Notify(EventE84UnloadTransactionStart, dvid);
  868. }
  869. if (DiCS0 && DiValid && _doUnloadReq.Value && !DiTrReq)
  870. {
  871. if (_timer_TP1.IsIdle()) _timer_TP1.Start(_scTimeoutTP1.IntValue * 1000);
  872. }
  873. if (DiCS0 && DiValid && _doUnloadReq.Value && DiTrReq && !_doReady.Value)
  874. {
  875. _timer_TP1.Stop();
  876. _doReady.Value = true;
  877. EV.Notify(EventE84UnloadTransactionStart, dvid);
  878. if (Provider != null) Provider.E84UnloadStart();
  879. }
  880. }
  881. if (TransferState == LPTransferState.TRANSFER_BLOCKED && preTranState == LPTransferState.READY_TO_UNLOAD) //Unload Sequence
  882. {
  883. if (DiCS0 && DiValid && _doUnloadReq.Value && DiTrReq && _doReady.Value && !DiBusy)
  884. {
  885. if (_timer_TP2.IsIdle()) _timer_TP2.Start(_scTimeoutTP1.IntValue * 1000);
  886. }
  887. if (DiCS0 && DiValid && _doUnloadReq.Value && DiTrReq && _doReady.Value && DiBusy)
  888. {
  889. _timer_TP2.Stop();
  890. if (Provider.IsCarrierPlacement())
  891. {
  892. if (_timer_TP3.IsIdle()) _timer_TP3.Start(_scTimeoutTP3.IntValue * 1000);
  893. }
  894. else
  895. {
  896. _timer_TP3.Stop();
  897. _doUnloadReq.Value = false;
  898. }
  899. }
  900. if (DiCS0 && DiValid && !_doUnloadReq.Value && DiTrReq && _doReady.Value && DiBusy)
  901. {
  902. if (_timer_TP4.IsIdle()) _timer_TP4.Start(_scTimeoutTP4.IntValue * 1000);
  903. }
  904. if (DiCS0 && DiValid && DiTrReq && _doReady.Value && !DiBusy)
  905. {
  906. _timer_TP4.Stop();
  907. }
  908. if (DiCS0 && DiValid && !_doUnloadReq.Value && _doReady.Value && DiCompt)
  909. {
  910. _doReady.Value = false;
  911. _timer_TP4.Stop();
  912. if (_timer_TP5.IsIdle()) _timer_TP5.Start(_scTimeoutTP5.IntValue * 1000);
  913. }
  914. if (!DiValid && !_doUnloadReq.Value && !DiTrReq && !_doReady.Value && !DiBusy && !DiCompt)
  915. {
  916. _timer_TP5.Stop();
  917. EV.Notify(EventE84UnloadTransactionComplete, dvid);
  918. preTranState = LPTransferState.TRANSFER_BLOCKED;
  919. if (Provider != null) Provider.E84UnloadComplte();
  920. }
  921. }
  922. if (_timer_TP1.IsTimeout())
  923. {
  924. if (preTranState == LPTransferState.READY_TO_LOAD)
  925. {
  926. _doLoadReq.Value = false;
  927. _doUnloadReq.Value = false;
  928. _doReady.Value = false;
  929. _doHOAvbl.Value = false;
  930. //EV.Notify(EventE84TP1Timeout, dvid);
  931. _state = E84State.LD_TP1_Timeout;
  932. _timer_TP1.Stop();
  933. if (Provider != null) Provider.E84LoadError(_state.ToString());
  934. }
  935. if (preTranState == LPTransferState.READY_TO_UNLOAD)
  936. {
  937. _doLoadReq.Value = false;
  938. _doUnloadReq.Value = false;
  939. _doReady.Value = false;
  940. _doHOAvbl.Value = false;
  941. //EV.Notify(EventE84TP1Timeout, dvid);
  942. _state = E84State.ULD_TP1_Timeout;
  943. if (Provider != null) Provider.E84UnloadError(_state.ToString());
  944. }
  945. _timer_TP1.Stop();
  946. EV.Notify(AlarmTP1timeout);
  947. }
  948. if (_timer_TP2.IsTimeout())
  949. {
  950. if (preTranState == LPTransferState.READY_TO_LOAD)
  951. {
  952. _doLoadReq.Value = false;
  953. _doUnloadReq.Value = false;
  954. _doReady.Value = false;
  955. _doHOAvbl.Value = false;
  956. //EV.Notify(EventE84TP2Timeout, dvid);
  957. _state = E84State.LD_TP2_Timeout;
  958. if (Provider != null) Provider.E84LoadError(_state.ToString());
  959. }
  960. if (preTranState == LPTransferState.READY_TO_UNLOAD)
  961. {
  962. _doLoadReq.Value = false;
  963. _doUnloadReq.Value = false;
  964. _doReady.Value = false;
  965. _doHOAvbl.Value = false;
  966. //EV.Notify(EventE84TP2Timeout, dvid);
  967. _state = E84State.ULD_TP2_Timeout;
  968. if (Provider != null) Provider.E84UnloadError(_state.ToString());
  969. }
  970. _timer_TP2.Stop();
  971. EV.Notify(AlarmTP2timeout);
  972. }
  973. if (_timer_TP3.IsTimeout())
  974. {
  975. if (preTranState == LPTransferState.READY_TO_LOAD)
  976. {
  977. _doLoadReq.Value = false;
  978. _doUnloadReq.Value = false;
  979. _doReady.Value = false;
  980. _doHOAvbl.Value = false;
  981. //EV.Notify(EventE84TP3Timeout, dvid);
  982. _state = E84State.LD_TP3_Timeout;
  983. if (Provider != null) Provider.E84LoadError(_state.ToString());
  984. }
  985. if (preTranState == LPTransferState.READY_TO_UNLOAD)
  986. {
  987. _doLoadReq.Value = false;
  988. _doUnloadReq.Value = false;
  989. _doReady.Value = false;
  990. _doHOAvbl.Value = false;
  991. //EV.Notify(EventE84TP3Timeout, dvid);
  992. _state = E84State.ULD_TP3_Timeout;
  993. if (Provider != null) Provider.E84UnloadError(_state.ToString());
  994. }
  995. _timer_TP3.Stop();
  996. EV.Notify(AlarmTP3timeout);
  997. }
  998. if (_timer_TP4.IsTimeout())
  999. {
  1000. if (preTranState == LPTransferState.READY_TO_LOAD)
  1001. {
  1002. _doLoadReq.Value = false;
  1003. _doUnloadReq.Value = false;
  1004. _doReady.Value = false;
  1005. _doHOAvbl.Value = false;
  1006. //EV.Notify(EventE84TP4Timeout, dvid);
  1007. _state = E84State.LD_TP4_Timeout;
  1008. if (Provider != null) Provider.E84LoadError(_state.ToString());
  1009. }
  1010. if (preTranState == LPTransferState.READY_TO_UNLOAD)
  1011. {
  1012. _doLoadReq.Value = false;
  1013. _doUnloadReq.Value = false;
  1014. _doReady.Value = false;
  1015. _doHOAvbl.Value = false;
  1016. //EV.Notify(EventE84TP4Timeout, dvid);
  1017. _state = E84State.ULD_TP4_Timeout;
  1018. if (Provider != null) Provider.E84UnloadError(_state.ToString());
  1019. }
  1020. _timer_TP4.Stop();
  1021. EV.Notify(AlarmTP4timeout);
  1022. }
  1023. if (_timer_TP5.IsTimeout())
  1024. {
  1025. if (preTranState == LPTransferState.READY_TO_LOAD)
  1026. {
  1027. _doLoadReq.Value = false;
  1028. _doUnloadReq.Value = false;
  1029. _doReady.Value = false;
  1030. _doHOAvbl.Value = false;
  1031. //EV.Notify(EventE84TP5Timeout, dvid);
  1032. _state = E84State.LD_TP5_Timeout;
  1033. if (Provider != null) Provider.E84LoadError(_state.ToString());
  1034. }
  1035. if (preTranState == LPTransferState.READY_TO_UNLOAD)
  1036. {
  1037. _doLoadReq.Value = false;
  1038. _doUnloadReq.Value = false;
  1039. _doReady.Value = false;
  1040. _doHOAvbl.Value = false;
  1041. //EV.Notify(EventE84TP5Timeout, dvid);
  1042. _state = E84State.ULD_TP5_Timeout;
  1043. if (Provider != null) Provider.E84UnloadError(_state.ToString());
  1044. }
  1045. _timer_TP5.Stop();
  1046. EV.Notify(AlarmTP5timeout);
  1047. }
  1048. }
  1049. catch (Exception ex)
  1050. {
  1051. LOG.Write(ex);
  1052. }
  1053. return true;
  1054. }
  1055. public void Reset()
  1056. {
  1057. //_doLoadReq.Value = false;
  1058. //_doUnloadReq.Value = false;
  1059. //_doReady.Value = false;
  1060. //_doHOAvbl.Value = false;
  1061. //_doES.Value = false;
  1062. //_state = E84State.Normal;
  1063. //foreach (var signal in _signals)
  1064. //{
  1065. // signal.Reset();
  1066. //}
  1067. }
  1068. private void autoRecovery()
  1069. {
  1070. var dvid = new SerializableDictionary<string, object>();
  1071. int portID = 0;
  1072. dvid["PORT_ID"] = int.TryParse(Module.Replace("LP", ""), out portID) ? portID : portID;
  1073. switch (_state)
  1074. {
  1075. case E84State.Error:
  1076. break;
  1077. case E84State.LD_TP1_Timeout:
  1078. if (Provider.IsCarrierPlacement()) EV.Notify(EventE84LoadTransactionComplete, dvid);
  1079. else EV.Notify(EventE84LoadTransactionRestart, dvid);
  1080. ResetSignal();
  1081. break;
  1082. case E84State.LD_TP2_Timeout:
  1083. if (Provider.IsCarrierPlacement()) EV.Notify(EventE84LoadTransactionComplete, dvid);
  1084. else EV.Notify(EventE84LoadTransactionRestart, dvid);
  1085. ResetSignal();
  1086. break;
  1087. case E84State.LD_TP3_Timeout:
  1088. if (Provider.IsCarrierPlacement()) EV.Notify(EventE84LoadTransactionComplete, dvid);
  1089. else EV.Notify(EventE84LoadTransactionRestart, dvid);
  1090. ResetSignal();
  1091. break;
  1092. case E84State.LD_TP4_Timeout:
  1093. if (Provider.IsCarrierPlacement()) EV.Notify(EventE84LoadTransactionComplete, dvid);
  1094. else EV.Notify(EventE84LoadTransactionRestart, dvid);
  1095. ResetSignal();
  1096. break;
  1097. case E84State.LD_TP5_Timeout:
  1098. if (!Provider.IsCarrierPlacement()) EV.Notify(EventE84LoadTransactionComplete, dvid);
  1099. else EV.Notify(EventE84LoadTransactionRestart, dvid);
  1100. ResetSignal();
  1101. break;
  1102. case E84State.ULD_TP1_Timeout:
  1103. if (!Provider.IsCarrierPlacement()) EV.Notify(EventE84UnloadTransactionComplete, dvid);
  1104. else EV.Notify(EventE84UnloadTransactionRestart, dvid);
  1105. ResetSignal();
  1106. break;
  1107. case E84State.ULD_TP2_Timeout:
  1108. if (!Provider.IsCarrierPlacement()) EV.Notify(EventE84UnloadTransactionComplete, dvid);
  1109. else EV.Notify(EventE84UnloadTransactionRestart, dvid);
  1110. ResetSignal();
  1111. break;
  1112. case E84State.ULD_TP3_Timeout:
  1113. if (!Provider.IsCarrierPlacement()) EV.Notify(EventE84UnloadTransactionComplete, dvid);
  1114. else EV.Notify(EventE84UnloadTransactionRestart, dvid);
  1115. ResetSignal();
  1116. break;
  1117. case E84State.ULD_TP4_Timeout:
  1118. if (!Provider.IsCarrierPlacement()) EV.Notify(EventE84UnloadTransactionComplete, dvid);
  1119. else EV.Notify(EventE84UnloadTransactionRestart, dvid);
  1120. ResetSignal();
  1121. break;
  1122. case E84State.ULD_TP5_Timeout:
  1123. if (!Provider.IsCarrierPlacement()) EV.Notify(EventE84UnloadTransactionComplete, dvid);
  1124. else EV.Notify(EventE84UnloadTransactionRestart, dvid);
  1125. ResetSignal();
  1126. break;
  1127. default: break;
  1128. }
  1129. ResetSignal();
  1130. }
  1131. private void OnSignalChange(SignalID signal, bool value)
  1132. {
  1133. }
  1134. public void Monitor()
  1135. {
  1136. }
  1137. }
  1138. }