Sic.Framework-Nanjing-Baishi/MECF.Framework.RT.Equipment.../HardwareUnits/CarrierIdReaders/Old/OmronBarcode/OmronRFID/OmronRfidReader.cs

289 lines
7.6 KiB
C#
Raw Normal View History

2023-04-13 11:51:03 +08:00
using System;
using System.Text.RegularExpressions;
using Aitex.Core.Common.DeviceData;
using Aitex.Core.RT.DataCenter;
using Aitex.Core.RT.Device;
using Aitex.Core.RT.Event;
using Aitex.Core.RT.OperationCenter;
using Aitex.Core.Util;
using Aitex.Sorter.Common;
using MECF.Framework.Common.Communications;
using MECF.Framework.Common.Equipment;
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadPorts;
namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.CarrierIdReaders.OmronRFID
{
public class OmronRfidReader : CarrierIdReader, IConnection
{
public DeviceState State
{
get
{
if (!Initalized)
{
return DeviceState.Unknown;
}
if (Error)
{
return DeviceState.Error;
}
if (Busy)
return DeviceState.Busy;
return DeviceState.Idle;
}
}
public bool Initalized { get; set; }
public bool Busy
{
get { return _foregroundHandler != null; }
}
public bool Error
{
get{return _commErr;}
}
public bool Communication
{
get
{
return _socket == null ? !_commErr : !_commErr && _socket.IsConnected;
}
}
private string _foupId;
public string FoupID
{
get
{
return _foupId;
}
set
{
//FAManager.Instance.ChangeFoupId(Name, value);
_foupId = value;
}
}
public string LoadPortName
{
get
{
return _loadPort;
}
}
private static Object _locker = new Object();
private AsyncSocket _socket;
private IHandler _foregroundHandler = null; //current handler
public const string delimiter = "\r";
private bool _commErr = false;
private string page;
private string _addr;
private string _loadPort ;
public OmronRfidReader(string module, string name, string display, string deviceId, string address, string page, string loadport )
: base(module, name, display, deviceId, address, page, loadport)
{
this.page = page;
_addr = address;
_loadPort = loadport ;
_socket = new AsyncSocket(address);
_socket.OnDataChanged += new AsyncSocket.MessageHandler(OnDataChanged);
_socket.OnErrorHappened += new AsyncSocket.ErrorHandler(OnErrorHandler);
Initalized = false;
}
public override bool Initialize()
{
ConnectionManager.Instance.Subscribe(Name, this);
_socket.Connect(this._addr);
DATA.Subscribe(Name, "RIDReaderBusy", () => Busy);
DATA.Subscribe(Name, "FoupID", () => FoupID);
DATA.Subscribe(Name, "RIDReaderState", () => State);
DATA.Subscribe(Name, "CommunicationStatus", () => IsConnected);
DATA.Subscribe(string.Format("Device.{0}.{1}", Module , Name),
() =>
{
AITRfidReaderData data = new AITRfidReaderData()
{
DeviceName = Name,
DeviceSchematicId = DeviceID,
DisplayName = Display,
IsBusy = Busy,
IsError = Error,
IsInitalized = Initalized,
State = State.ToString(),
};
return data;
}, SubscriptionAttribute.FLAG.IgnoreSaveDB);
OP.Subscribe($"{Name}.Reconnect", (string cmd, object[] args) => Connect());
Initalized = true;
return true;
}
public override void Reset()
{
base.Reset();
lock (_locker)
{
_foregroundHandler = null;
}
if (_commErr)
{
Connect();
}
}
public string Address
{
get { return _addr; }
}
public bool IsConnected
{
get { return _socket.IsConnected; }
}
public override bool Connect()
{
_commErr = false;
_socket.Connect(this._addr);
return true;
}
public bool Disconnect()
{
return true;
}
#region Command
public override bool Read(out string reason)
{
reason = string.Empty;
return execute(new handler<ReadHandler>(this.DeviceID, this.page), out reason);
}
public override bool Write(string id, out string reason)
{
reason = string.Empty;
return execute(new handler<WriteHandler>(this.DeviceID, this.page,id), out reason);
}
#endregion
private bool execute(IHandler handler, out string reason)
{
reason = string.Empty;
lock (_locker)
{
if (_foregroundHandler != null)
{
reason = string.Format("Busy,can not execute");
return false;
}
if(!handler.Execute(ref _socket))
{
reason = "Communication error, please re-connect";
return false;
}
_foregroundHandler = handler;
}
return true;
}
private void OnDataChanged(string package)
{
try
{
package = package.ToUpper();
string[] msgs = Regex.Split(package, delimiter);
foreach (string msg in msgs)
{
if (msg.Length > 0)
{
bool completed = false;
string resp = msg;
lock (_locker)
{
if (_foregroundHandler != null && _foregroundHandler.OnMessage(ref _socket, resp, out completed))
{
_foregroundHandler = null;
}
}
}
}
}
catch (ExcuteFailedException ex)
{
EV.PostMessage(DeviceID, EventEnum.DefaultWarning, ex.Message);
_foregroundHandler = null;
}
catch (InvalidPackageException ex)
{
EV.PostMessage(DeviceID, EventEnum.DefaultWarning, ex.Message);
_foregroundHandler = null;
}
catch (System.Exception ex)
{
EV.PostMessage(Name, EventEnum.DefaultWarning, "【RFID】has exception" + ex.ToString());
}
}
private void OnErrorHandler(ErrorEventArgs args)
{
ReadFailed();
_commErr = true;
Initalized = false;
EV.PostMessage(Module, EventEnum.CommunicationError, Display, args.Reason);
}
public void SetCarrierIdReadResult(string carrierId)
{
FoupID = carrierId;
ReadOk( carrierId);
}
}
}