349 lines
12 KiB
C#
349 lines
12 KiB
C#
|
using Aitex.Core.RT.Device;
|
|||
|
using Aitex.Core.RT.Event;
|
|||
|
using Aitex.Core.RT.Fsm;
|
|||
|
using MECF.Framework.Common.Equipment;
|
|||
|
using MECF.Framework.Common.Event;
|
|||
|
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadPorts;
|
|||
|
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadPorts.LoadPortBase;
|
|||
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Linq;
|
|||
|
using System.Text;
|
|||
|
using System.Threading.Tasks;
|
|||
|
|
|||
|
namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.CarrierIdReaders.CarrierIDReaderBase
|
|||
|
{
|
|||
|
public abstract class CIDReaderBaseDevice : Entity, IDevice, ICarrierIDReader, IEntity
|
|||
|
{
|
|||
|
public event Action<ModuleName, string,string> OnCarrierIDReadEvent;
|
|||
|
public event Action<ModuleName, string,string> OnCarrierIDReadFailedEvent;
|
|||
|
public event Action<ModuleName, string,string> OnCarrierIDWriteEvent;
|
|||
|
public event Action<ModuleName,string> OnCarrierIDWriteFailedEvent;
|
|||
|
public event Action<string, AlarmEventItem> OnDeviceAlarmStateChanged;
|
|||
|
public LoadPortBaseDevice ReaderOnLP { get; private set; }
|
|||
|
|
|||
|
public ModuleName ReaderOnModule { get; private set; }
|
|||
|
|
|||
|
public string Module { get; set; }
|
|||
|
public string Name { get; set; }
|
|||
|
public string CarrierIDBeRead { get; set; }
|
|||
|
public string CarrierIDToBeWriten { get; set; }
|
|||
|
|
|||
|
public bool HasAlarm { get; set; }
|
|||
|
|
|||
|
public CIDReaderStateEnum DeviceState => (CIDReaderStateEnum)(int)fsm.State;
|
|||
|
|
|||
|
public CIDReaderBaseDevice(string module,string name,LoadPortBaseDevice lp =null):base()
|
|||
|
{
|
|||
|
|
|||
|
Module = module;
|
|||
|
Name = name;
|
|||
|
ReaderOnLP = lp;
|
|||
|
if (ReaderOnLP != null)
|
|||
|
{
|
|||
|
ReaderOnModule = lp.LPModuleName;
|
|||
|
}
|
|||
|
else
|
|||
|
ReaderOnModule = ModuleName.System;
|
|||
|
|
|||
|
InitializeCIDReader();
|
|||
|
}
|
|||
|
|
|||
|
private void InitializeCIDReader()
|
|||
|
{
|
|||
|
BuildTransitionTable();
|
|||
|
SubscribeDataVariable();
|
|||
|
|
|||
|
SubscribeOperation();
|
|||
|
SubscribeDeviceOperation();
|
|||
|
Running = true;
|
|||
|
}
|
|||
|
protected override bool Init()
|
|||
|
{
|
|||
|
return base.Init();
|
|||
|
}
|
|||
|
|
|||
|
private void SubscribeDeviceOperation()
|
|||
|
{
|
|||
|
;
|
|||
|
}
|
|||
|
|
|||
|
private void SubscribeOperation()
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
private void SubscribeDataVariable()
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
private void BuildTransitionTable()
|
|||
|
{
|
|||
|
fsm = new StateMachine<CIDReaderBaseDevice>(Module + Name + ".CIDReaderStateMachine", (int)CIDReaderStateEnum.Init, 50);
|
|||
|
AnyStateTransition(CIDMsg.Error, fError, CIDReaderStateEnum.Error);
|
|||
|
AnyStateTransition(CIDMsg.Reset, fStartReset, CIDReaderStateEnum.Resetting);
|
|||
|
|
|||
|
Transition(CIDReaderStateEnum.Resetting, CIDMsg.ActionDone, fResetComplete, CIDReaderStateEnum.Idle);
|
|||
|
Transition(CIDReaderStateEnum.Resetting, CIDMsg.ResetComplete, fResetComplete, CIDReaderStateEnum.Idle);
|
|||
|
Transition(CIDReaderStateEnum.Resetting, FSM_MSG.TIMER, fMonitorReset, CIDReaderStateEnum.Idle);
|
|||
|
|
|||
|
Transition(CIDReaderStateEnum.Init, CIDMsg.StartInit, fStartInit, CIDReaderStateEnum.Initializing);
|
|||
|
Transition(CIDReaderStateEnum.Initializing, CIDMsg.InitComplete, fInitComplete, CIDReaderStateEnum.Initializing);
|
|||
|
|
|||
|
Transition(CIDReaderStateEnum.Initializing, CIDMsg.ActionDone, fInitComplete, CIDReaderStateEnum.Idle);
|
|||
|
Transition(CIDReaderStateEnum.Initializing, FSM_MSG.TIMER, fMonitorInit, CIDReaderStateEnum.Idle);
|
|||
|
|
|||
|
Transition(CIDReaderStateEnum.Error, CIDMsg.Clear, fStartClear, CIDReaderStateEnum.Idle);
|
|||
|
|
|||
|
Transition(CIDReaderStateEnum.Idle, CIDMsg.SetParameter, fStartSetParameter, CIDReaderStateEnum.SetParameter);
|
|||
|
Transition(CIDReaderStateEnum.SetParameter, CIDMsg.SetComplete, fSetParameterComplete, CIDReaderStateEnum.SetParameter);
|
|||
|
Transition(CIDReaderStateEnum.SetParameter, CIDMsg.ActionDone, fSetParameterComplete, CIDReaderStateEnum.SetParameter);
|
|||
|
|
|||
|
Transition(CIDReaderStateEnum.Idle, CIDMsg.ReadParameter, fStartReadParameter, CIDReaderStateEnum.ReadParameter);
|
|||
|
Transition(CIDReaderStateEnum.ReadParameter, CIDMsg.ReadParaComplete, fReadParameterComplete, CIDReaderStateEnum.Idle);
|
|||
|
Transition(CIDReaderStateEnum.ReadParameter, CIDMsg.ActionDone, fReadParameterComplete, CIDReaderStateEnum.Idle);
|
|||
|
|
|||
|
Transition(CIDReaderStateEnum.Idle, CIDMsg.ReadCarrierID, fStartReadCarrierID, CIDReaderStateEnum.ReadCarrierID);
|
|||
|
Transition(CIDReaderStateEnum.ReadCarrierID, CIDMsg.ReadCarrierIDComplete, fReadCarrierIDComplete, CIDReaderStateEnum.Idle);
|
|||
|
Transition(CIDReaderStateEnum.ReadCarrierID, CIDMsg.ActionDone, fReadCarrierIDComplete, CIDReaderStateEnum.Idle);
|
|||
|
Transition(CIDReaderStateEnum.ReadCarrierID, FSM_MSG.TIMER, fMonitorReadCarrierID, CIDReaderStateEnum.Idle);
|
|||
|
|
|||
|
|
|||
|
Transition(CIDReaderStateEnum.Idle, CIDMsg.WriteCarrierID, fStartWriteCarrierID, CIDReaderStateEnum.WriteCarrierID);
|
|||
|
Transition(CIDReaderStateEnum.WriteCarrierID, CIDMsg.WriteCarrierIDComplete, fWriteCarrierIDComplete, CIDReaderStateEnum.Idle);
|
|||
|
Transition(CIDReaderStateEnum.WriteCarrierID, CIDMsg.ActionDone, fWriteCarrierIDComplete, CIDReaderStateEnum.Idle);
|
|||
|
Transition(CIDReaderStateEnum.WriteCarrierID, FSM_MSG.TIMER, fMonitorWriteCarrierID, CIDReaderStateEnum.Idle);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
protected virtual bool fMonitorWriteCarrierID(object[] param)
|
|||
|
{
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
protected virtual bool fMonitorReadCarrierID(object[] param)
|
|||
|
{
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
protected virtual bool fWriteCarrierIDComplete(object[] param)
|
|||
|
{
|
|||
|
return true; ;
|
|||
|
}
|
|||
|
|
|||
|
protected virtual bool fStartWriteCarrierID(object[] param)
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
protected virtual bool fReadCarrierIDComplete(object[] param)
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
protected virtual bool fReadParameterComplete(object[] param)
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
protected virtual bool fSetParameterComplete(object[] param)
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
protected virtual bool fStartReadCarrierID(object[] param)
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
protected virtual bool fStartReadParameter(object[] param)
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
protected virtual bool fStartSetParameter(object[] param)
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
protected virtual bool fStartClear(object[] param)
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
protected virtual bool fMonitorInit(object[] param)
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
protected virtual bool fInitComplete(object[] param)
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
protected virtual bool fStartInit(object[] param)
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
protected virtual bool fMonitorReset(object[] param)
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
protected virtual bool fError(object[] param)
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
protected virtual bool fStartReset(object[] param)
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
protected virtual bool fResetComplete(object[] param)
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
public void OnCarrierIDRead(string carrierID)
|
|||
|
{
|
|||
|
if (OnCarrierIDReadEvent != null)
|
|||
|
OnCarrierIDReadEvent(ReaderOnModule, Name, carrierID);
|
|||
|
if (ReaderOnLP != null)
|
|||
|
ReaderOnLP.OnCarrierIdRead(ReaderOnModule, carrierID);
|
|||
|
OnActionDone();
|
|||
|
}
|
|||
|
public void OnCarrierIDReadFailed(string errorcode)
|
|||
|
{
|
|||
|
if (OnCarrierIDReadFailedEvent != null)
|
|||
|
OnCarrierIDReadFailedEvent(ReaderOnModule,Name,errorcode);
|
|||
|
if (ReaderOnLP != null)
|
|||
|
ReaderOnLP.OnCarrierIdReadFailed(ReaderOnModule);
|
|||
|
OnActionDone();
|
|||
|
}
|
|||
|
public void OnCarrierIDWrite()
|
|||
|
{
|
|||
|
if (OnCarrierIDWriteEvent != null)
|
|||
|
OnCarrierIDWriteEvent(ReaderOnModule, Name, CarrierIDToBeWriten);
|
|||
|
if (ReaderOnLP != null)
|
|||
|
ReaderOnLP.OnCarrierIdWrite(ReaderOnModule, CarrierIDToBeWriten);
|
|||
|
OnActionDone();
|
|||
|
}
|
|||
|
public void OnCarrierIDWriteFailed(string errorcode)
|
|||
|
{
|
|||
|
if (OnCarrierIDWriteFailedEvent != null)
|
|||
|
OnCarrierIDWriteFailedEvent(ReaderOnModule, Name);
|
|||
|
if (ReaderOnLP != null)
|
|||
|
ReaderOnLP.OnCarrierIdWriteFailed(ReaderOnModule);
|
|||
|
OnActionDone();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public void Monitor()
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
public void Reset()
|
|||
|
{
|
|||
|
CheckToPostMessage((int)CIDMsg.Reset,null);
|
|||
|
}
|
|||
|
|
|||
|
public bool ReadCarrierID()
|
|||
|
{
|
|||
|
return CheckToPostMessage((int)CIDMsg.ReadCarrierID, null);
|
|||
|
}
|
|||
|
|
|||
|
public bool WriteCarrierID(string carrierID)
|
|||
|
{
|
|||
|
return CheckToPostMessage((int)CIDMsg.WriteCarrierID, new object[] { carrierID});
|
|||
|
}
|
|||
|
|
|||
|
public bool ReadParameter(string parameter)
|
|||
|
{
|
|||
|
return CheckToPostMessage((int)CIDMsg.ReadParameter, new object[] { parameter });
|
|||
|
}
|
|||
|
|
|||
|
public bool SetParameter(string parameter, string value)
|
|||
|
{
|
|||
|
return CheckToPostMessage((int)CIDMsg.SetParameter, new object[] { parameter ,value});
|
|||
|
}
|
|||
|
|
|||
|
public bool ReadCarrierID(int offset, int length)
|
|||
|
{
|
|||
|
return CheckToPostMessage((int)CIDMsg.ReadCarrierID, new object[] { offset, length });
|
|||
|
}
|
|||
|
|
|||
|
public bool WriteCarrierID(int offset, int length, string carrierID)
|
|||
|
{
|
|||
|
return CheckToPostMessage((int)CIDMsg.WriteCarrierID, new object[] { carrierID, offset, length });
|
|||
|
}
|
|||
|
public void OnError()
|
|||
|
{
|
|||
|
CheckToPostMessage((int)CIDMsg.Error, null);
|
|||
|
}
|
|||
|
public void OnActionDone()
|
|||
|
{
|
|||
|
CheckToPostMessage((int)CIDMsg.ActionDone, null);
|
|||
|
}
|
|||
|
public bool CheckToPostMessage(int msg, params object[] args)
|
|||
|
{
|
|||
|
if (!fsm.FindTransition(fsm.State, msg))
|
|||
|
{
|
|||
|
EV.PostWarningLog(Name, $"{Name} is in { (CIDReaderStateEnum)fsm.State} state,can not do {(CIDMsg)msg}");
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
fsm.PostMsg(msg, args);
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
public bool Check(int msg, out string reason, params object[] args)
|
|||
|
{
|
|||
|
if (!fsm.FindTransition(fsm.State, msg))
|
|||
|
{
|
|||
|
reason = String.Format("{0} is in {1} state,can not do {2}", Name, (CIDReaderStateEnum)fsm.State, (CIDMsg)msg);
|
|||
|
return false;
|
|||
|
}
|
|||
|
reason = "";
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public enum CIDReaderStateEnum
|
|||
|
{
|
|||
|
Undefined = 0,
|
|||
|
Init,
|
|||
|
Initializing,
|
|||
|
Idle,
|
|||
|
SetParameter,
|
|||
|
ReadParameter,
|
|||
|
ReadCarrierID,
|
|||
|
WriteCarrierID,
|
|||
|
Error,
|
|||
|
Resetting,
|
|||
|
}
|
|||
|
public enum CIDMsg
|
|||
|
{
|
|||
|
Reset,
|
|||
|
ResetComplete,
|
|||
|
Clear,
|
|||
|
StartInit,
|
|||
|
InitComplete,
|
|||
|
SetParameter,
|
|||
|
SetComplete,
|
|||
|
ReadParameter,
|
|||
|
ReadParaComplete,
|
|||
|
ReadCarrierID,
|
|||
|
ReadCarrierIDComplete,
|
|||
|
WriteCarrierID,
|
|||
|
WriteCarrierIDComplete,
|
|||
|
ActionDone,
|
|||
|
Error,
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|