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

289 lines
7.6 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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);
}
}
}