123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Xml;
- using Aitex.Core.Common.DeviceData;
- using Aitex.Core.RT.DataCenter;
- using Aitex.Core.RT.Device;
- using Aitex.Core.RT.Event;
- using Aitex.Core.RT.IOCore;
- using Aitex.Core.RT.Log;
- using Aitex.Core.RT.OperationCenter;
- using Aitex.Core.RT.SCCore;
- using Aitex.Core.Util;
- namespace Aitex.Core.RT.Device.Unit
- {
- public enum SignalType
- {
- Acitvie,
- Passive,
- }
- public enum SignalID
- {
- CS_0,
- CS_1,
- AM_AVBL,
- VALID,
- TR_REQ,
- BUSY,
- COMPT,
- CONT,
- L_REQ,
- U_REQ,
- HO_AVBL,
- READY,
- ES
- }
- public class Signal
- {
- public bool Value
- {
- get
- {
- if (_di != null)
- return _di.Value;
- if (_do != null)
- return _do.Value;
- return false;
- }
- }
- private SignalID _id;
- private RD_TRIG _trig = new RD_TRIG();
- private DIAccessor _di = null;
- private DOAccessor _do = null;
- public event Action<SignalID, bool> OnChanged;
- public Signal(SignalID id, DIAccessor diAccessor, DOAccessor doAccessor)
- {
- _id = id;
- _di = diAccessor;
- _do = doAccessor;
- }
-
- public void Monitor()
- {
- if (_di != null)
- _trig.CLK = _di.Value;
- if (_do != null)
- _trig.CLK = _do.Value;
- if (_trig.R)
- {
- if (OnChanged != null)
- OnChanged(_id, true);
- }
- if (_trig.M)
- {
- if (OnChanged != null)
- OnChanged(_id, false);
- }
- }
- public void Reset()
- {
- _trig.RST = true;
- }
-
- }
- public enum LPAccessMode
- {
- Operator = 0,
- AMHS = 1,
- };
- public enum LPTransferState
- {
- OutOfService = 0,
- TransferBlocked = 1,
- ReadyToLoad = 2,
- ReadyToUnload = 3,
- InService = 4,
- TransferReady = 5,
- }
- public interface IE84Provider
- {
- bool ReadyForLoad();
- bool ReadyForUnload();
- bool FoupArrirved();
- bool FoupRemoved();
- }
- public class E84Passiver : BaseDevice, IDevice
- {
- public enum E84State
- {
- Idle,
- WaitForTrReqOn,
- WaitForBusyOn,
- WaitForTransfer,
- WaitForBusyOff,
- WaitForValidOff,
- Error,
- }
- public enum Timeout
- {
- TP1,
- TP2,
- TP3,
- TP4,
- TP5,
- }
- public bool LightCurtainBroken { get; set; } //interlock
- public LPAccessMode Mode{ get; set; }
- public LPTransferState TransferState { get; set; }
- public IE84Provider Provider { get; set; }
- //Active equipment signal
- private DIAccessor _diValid;
- private DIAccessor _diCS0;
- private DIAccessor _diCS1;
- private DIAccessor _diAmAvbl;
- private DIAccessor _diTrReq;
- private DIAccessor _diBusy;
- private DIAccessor _diCompt;
- private DIAccessor _diCont;
- //Passive
- private DOAccessor _doLoadReq;
- private DOAccessor _doUnloadReq;
- private DOAccessor _doReady;
- private DOAccessor _doHOAvbl;
- private DOAccessor _doES;
-
- private DeviceTimer _timer = new DeviceTimer();
- private R_TRIG _trigReset = new R_TRIG();
- private List<Signal> _signals = new List<Signal>();
- //timeout
- private SCConfigItem _scTimeoutTP1;
- private SCConfigItem _scTimeoutTP2;
- private SCConfigItem _scTimeoutTP3;
- private SCConfigItem _scTimeoutTP4;
- private SCConfigItem _scTimeoutTP5;
- private int reqOnTimeout = 2; //L_REQ|U_REQ_ON ON ---> TR REQ ON
- private int readyOnTimeout = 2; //READY ON ---> BUSY ON
- private int busyOnTimeout = 2; //BUSYON -- CARRIAGE DETECT|CARRIAGE REMOVE
- private int reqOffTimeout = 2; //L_REQ|U_REQ off --->BUSY off
- private int readyOffTimeout = 2; //Ready off --->Valid off
- private E84State _state;
- private Timeout _tp;
- public E84Passiver(string module, XmlElement node, string ioModule = "")
- {
- base.Module = node.GetAttribute("module");
- base.Name = node.GetAttribute("id");
- base.Display = node.GetAttribute("display");
- base.DeviceID = node.GetAttribute("schematicId");
- _diValid = ParseDiNode("VALID", node, ioModule);
- _signals.Add(new Signal(SignalID.VALID, _diValid, null));
- _diCS0 = ParseDiNode("CS_0", node, ioModule);
- _signals.Add(new Signal(SignalID.CS_0, _diCS0, null));
- _diCS1 = ParseDiNode("CS_1", node, ioModule);
- _signals.Add(new Signal(SignalID.CS_1, _diCS1, null));
- _diAmAvbl = ParseDiNode("AM_AVBL", node, ioModule);
- _signals.Add(new Signal(SignalID.AM_AVBL, _diAmAvbl, null));
- _diTrReq = ParseDiNode("TR_REQ", node, ioModule);
- _signals.Add(new Signal(SignalID.TR_REQ, _diTrReq, null));
- _diBusy = ParseDiNode("BUSY", node, ioModule);
- _signals.Add(new Signal(SignalID.BUSY, _diBusy, null));
- _diCompt = ParseDiNode("COMPT", node, ioModule);
- _signals.Add(new Signal(SignalID.COMPT, _diCompt, null));
- _diCont = ParseDiNode("CONT", node, ioModule);
- _signals.Add(new Signal(SignalID.CONT, _diCont, null));
- _doLoadReq = ParseDoNode("L_REQ", node, ioModule);
- _signals.Add(new Signal(SignalID.L_REQ, null, _doLoadReq));
- _doUnloadReq = ParseDoNode("U_REQ", node, ioModule);
- _signals.Add(new Signal(SignalID.U_REQ, null, _doUnloadReq));
- _doReady = ParseDoNode("READY", node, ioModule);
- _signals.Add(new Signal(SignalID.READY, null, _doReady));
- _doHOAvbl = ParseDoNode("HO_AVBL", node, ioModule);
- _signals.Add(new Signal(SignalID.HO_AVBL, null, _doHOAvbl));
- _doES = ParseDoNode("ES", node, ioModule);
- _signals.Add(new Signal(SignalID.ES, null, _doES));
- foreach (var signal in _signals)
- {
- signal.OnChanged += OnSignalChange;
- }
- _scTimeoutTP1 = SC.GetConfigItem("Fa.E84.TP1");
- _scTimeoutTP2 = SC.GetConfigItem("Fa.E84.TP2");
- _scTimeoutTP3 = SC.GetConfigItem("Fa.E84.TP3");
- _scTimeoutTP4 = SC.GetConfigItem("Fa.E84.TP4");
- _scTimeoutTP5 = SC.GetConfigItem("Fa.E84.TP5");
- }
- public bool Initialize()
- {
- reset();
- return true;
- }
- private bool InvokeReset(string arg1, object[] arg2)
- {
- //string reason;
- EV.PostInfoLog(Module, $"E84 reset {Module}.{Name}");
- reset();
- return true;
- }
- public void Terminate()
- {
- reset();
- }
- private void reset()
- {
- _doLoadReq.Value = false;
- _doUnloadReq.Value = false;
- _doReady.Value = false;
- _doHOAvbl.Value = false;
- _doES.Value = false;
- _state = E84State.Idle;
- foreach (var signal in _signals)
- {
- signal.Reset();
- }
- }
- public void Monitor()
- {
- try
- {
- foreach (var signal in _signals)
- {
- signal.Monitor();
- }
- if (LightCurtainBroken)
- {
- _doES.Value = false;
- }
- else
- {
- _doES.Value = true;
- }
- if (Mode != LPAccessMode.AMHS)
- {
- _doHOAvbl.Value = false;
- return;
- }
- if (_timer.IsTimeout())
- {
- _doHOAvbl.Value = false;
- _doLoadReq.Value = false;
- _doUnloadReq.Value = false;
- _doReady.Value = false;
- _doES.Value = false;
- _state = E84State.Error;
- switch (_state)
- {
- case E84State.WaitForTrReqOn:
- _tp = Timeout.TP1;
- break;
- case E84State.WaitForBusyOn:
- _tp = Timeout.TP2;
- break;
- case E84State.WaitForTransfer:
- _tp = Timeout.TP3;
- break;
- case E84State.WaitForBusyOff:
- _tp = Timeout.TP4;
- break;
- case E84State.WaitForValidOff:
- _tp = Timeout.TP5;
- break;
- }
- EV.PostMessage("E84", EventEnum.DefaultAlarm, string.Format("E84 {0} Timeout", _tp));
- }
- switch (_state)
- {
- case E84State.Idle:
- {
- if (waitValidOn())
- {
- _state = E84State.WaitForTrReqOn;
- if (_scTimeoutTP1 != null)
- reqOnTimeout = _scTimeoutTP1.IntValue;
- _timer.Start(reqOnTimeout);
- }
- }
- break;
- case E84State.WaitForTrReqOn:
- {
- if (wait4TrReqOn())
- {
- _state = E84State.WaitForBusyOn;
- if(_scTimeoutTP2!= null)
- readyOnTimeout = _scTimeoutTP2.IntValue;
- _timer.Start(readyOnTimeout);
- }
- }
- break;
- case E84State.WaitForBusyOn:
- {
- if (wait4BusyOn())
- {
- _state = E84State.WaitForTransfer;
- if (_scTimeoutTP3 != null)
- busyOnTimeout = _scTimeoutTP3.IntValue;
- _timer.Start(busyOnTimeout);
- }
- }
- break;
- case E84State.WaitForTransfer:
- {
- if (wait4Transfer())
- {
- _state = E84State.WaitForBusyOff;
- if (_scTimeoutTP4 != null)
- reqOffTimeout = _scTimeoutTP4.IntValue;
- _timer.Start(reqOffTimeout);
- }
- }
- break;
- case E84State.WaitForBusyOff:
- {
- if (wait4BusyOff())
- {
- _state = E84State.WaitForValidOff;
- if (_scTimeoutTP5 != null)
- readyOffTimeout = _scTimeoutTP5.IntValue;
- _timer.Start(readyOffTimeout);
- }
- }
- break;
- case E84State.WaitForValidOff:
- {
- if (waitValidOff())
- {
- _state = E84State.Idle;
- _timer.Stop();
- }
- }
- break;
- case E84State.Error:
- {
- if (autoRecovery())
- {
- _state = E84State.Idle;
- _timer.Stop();
- }
- }
- break;
- }
- }
- catch (Exception ex)
- {
- LOG.Write(ex);
- }
- }
- public void Reset()
- {
- _doLoadReq.Value = false;
- _doUnloadReq.Value = false;
- _doReady.Value = false;
- _doHOAvbl.Value = false;
- _doES.Value = false;
- foreach (var signal in _signals)
- {
- signal.Reset();
- }
- if (TransferState != LPTransferState.OutOfService)
- {
- if (Mode == LPAccessMode.AMHS)
- {
- _doHOAvbl.Value = true;
- _doES.Value = true;
- }
- }
- }
- private bool waitValidOn()
- {
- if (_diValid.Value)
- {
- if (!_diCS0.Value && !_diCS1.Value)
- {
- EV.PostMessage("E84", EventEnum.DefaultWarning, "When VALID turn on, CS0 or CS1 should be on");
- _doHOAvbl.Value = false;
- return false;
- }
- if (_diTrReq.Value)
- {
- EV.PostMessage("E84", EventEnum.DefaultWarning, "When VALID turn on, VALID should be off");
- _doHOAvbl.Value = false;
- return false;
- }
- if (_diBusy.Value)
- {
- EV.PostMessage("E84", EventEnum.DefaultWarning, "When VALID turn on, BUSY should be off");
- _doHOAvbl.Value = false;
- return false;
- }
- if (_diCompt.Value)
- {
- EV.PostMessage("E84", EventEnum.DefaultWarning, "When VALID turn on, COMPT should be off");
- _doHOAvbl.Value = false;
- return false;
- }
- if (TransferState == LPTransferState.ReadyToLoad)
- {
- _doLoadReq.Value = true;
- }
- else if (TransferState == LPTransferState.ReadyToUnload)
- {
- _doUnloadReq.Value = true;
- }
- }
- return true;
- }
- private bool wait4TrReqOn()
- {
- if (_diTrReq.Value)
- {
- if (!_diCS0.Value && !_diCS1.Value)
- {
- EV.PostMessage("E84", EventEnum.DefaultWarning, "When TR_REQ turn on, CS0 or CS1 should be on");
- _doHOAvbl.Value = false;
- return false;
- }
- if (!_diValid.Value)
- {
- EV.PostMessage("E84", EventEnum.DefaultWarning, "When TR_REQ turn on, TR_REQ should be off");
- _doHOAvbl.Value = false;
- return false;
- }
- if (_diBusy.Value)
- {
- EV.PostMessage("E84", EventEnum.DefaultWarning, "When TR_REQ turn on, BUSY should be off");
- _doHOAvbl.Value = false;
- return false;
- }
- if (_diCompt.Value)
- {
- EV.PostMessage("E84", EventEnum.DefaultWarning, "When TR_REQ turn on, COMPT should be off");
- _doHOAvbl.Value = false;
- return false;
- }
- if (TransferState == LPTransferState.ReadyToLoad)
- {
- if(Provider.ReadyForLoad())
- _doReady.Value = true;
- }
- else if (TransferState == LPTransferState.ReadyToUnload)
- {
- if(Provider.ReadyForUnload())
- _doReady.Value = true;
- }
- return true;
- }
- return false;
- }
- private bool wait4BusyOn()
- {
- if (_diBusy.Value)
- {
- if (!_diCS0.Value && !_diCS1.Value)
- {
- EV.PostMessage("E84", EventEnum.DefaultWarning, "When BUSY turn on, CS0 or CS1 should be on");
- _doHOAvbl.Value = false;
- return false;
- }
- if (!_diValid.Value)
- {
- EV.PostMessage("E84", EventEnum.DefaultWarning, "When BUSY turn on, VALID should be on");
- _doHOAvbl.Value = false;
- return false;
- }
- if (!_diTrReq.Value)
- {
- EV.PostMessage("E84", EventEnum.DefaultWarning, "When TR_REQ turn on, TR_REQ should be on");
- _doHOAvbl.Value = false;
- return false;
- }
- if (_diCompt.Value)
- {
- EV.PostMessage("E84", EventEnum.DefaultWarning, "When TR_REQ turn on, COMPT should be off");
- _doHOAvbl.Value = false;
- return false;
- }
- return true;
- }
- return false;
- }
- private bool wait4Transfer()
- {
- if (TransferState == LPTransferState.ReadyToLoad)
- {
- if (Provider.FoupArrirved()) //FOUP placement
- {
- _doLoadReq.Value = false;
- return true;
- }
-
- }
- else if (TransferState == LPTransferState.ReadyToUnload)
- {
- if (Provider.FoupArrirved()) //FOUP placement
- {
- _doUnloadReq.Value = false;
- return true;
- }
- }
- return false;
- }
- private bool wait4BusyOff()
- {
- if (_diCompt.Value && !_diTrReq.Value && !_diBusy.Value)
- {
- if (!_diValid.Value)
- {
- EV.PostMessage("E84", EventEnum.DefaultWarning, "When BUSY turn off, VALID should be on");
- _doHOAvbl.Value = false;
- return false;
- }
- if (!_diCS0.Value && !_diCS1.Value)
- {
- EV.PostMessage("E84", EventEnum.DefaultWarning, "When BUSY turn off, CS0 or CS1 should be on");
- _doHOAvbl.Value = false;
- return false;
- }
- _doReady.Value = false;
- return true;
- }
- return false;
- }
- private bool waitValidOff()
- {
- if (_diValid.Value && (_diCS0.Value || _diCS1.Value) && !_diCompt.Value)
- {
- _doHOAvbl.Value = true;
- if (_diBusy.Value)
- {
- EV.PostMessage("E84", EventEnum.DefaultWarning, "When VALID turn off, BUSY should be off");
- _doHOAvbl.Value = false;
- return false;
- }
- if (_diTrReq.Value)
- {
- EV.PostMessage("E84", EventEnum.DefaultWarning, "When VALID turn off, TR REQ should be off");
- _doHOAvbl.Value = false;
- return false;
- }
- _doLoadReq.Value = false;
- _doUnloadReq.Value = false;
- _doReady.Value = false;
- _doES.Value = false;
- return true;
- }
- return false;
- }
- private bool autoRecovery()
- {
- bool ret = false;
- switch (_tp)
- {
- case Timeout.TP1:
- case Timeout.TP2:
- case Timeout.TP5:
- {
- if ( !_diAmAvbl.Value && !_diValid.Value && !_diCS0.Value && !_diCS1.Value
- &&!_diTrReq.Value && !_diBusy.Value && !_diCompt.Value && !_diCont.Value)
- ret = true;
- }
- break;
- }
- return ret;
- }
- private void OnSignalChange(SignalID signal, bool value)
- {
- }
- }
- }
|