Sic04/FrameworkLocal/RTEquipmentLibrary/HardwareUnits/OcrReaders/HST/HstOcrReader.cs

321 lines
9.2 KiB
C#

using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using Aitex.Core.RT.DataCenter;
using Aitex.Core.RT.Device;
using Aitex.Core.RT.Event;
using Aitex.Core.RT.Log;
using Aitex.Core.RT.SCCore;
using Aitex.Core.Util;
using Aitex.Sorter.Common;
using MECF.Framework.Common.Communications;
namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.OcrReaders.HST
{
public class HstOcrReader : BaseDevice, IDevice
{
#region properties
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 Guid OCRGuid { get; set; }
public bool Busy
{
get { return _lstHandler.Count > 0 || _connection.IsBusy; }
}
public bool Error
{
get
{
return _commErr || ExeError|| _connection.IsCommunicationError||!_connection.IsConnected;
}
}
public bool ExeError { get; set; } = false;
public bool ReadLaserMaker { get; set; }
public string JobName { get; set; }
public string LaserMaker { get; set; }
public string T7Code { get; set; }
public string LaserMark1 { get; set; }
public string LaserMark1Score { get; set; }
public string LaserMark1ReadTime { get; set; }
public string LaserMark2 { get; set; }
public string LaserMark2Score { get; set; }
public string LaserMark2ReadTime { get; set; }
public bool ReadOK { get; set; }
public string ImageFileName { get; set; }
public string ImageStorePath { get; set; }
#endregion
#region fields
private HstConnection _connection;
private string _address;
private PeriodicJob _thread;
private LinkedList<HandlerBase> _lstHandler = new LinkedList<HandlerBase>();
private object _lockerHandlerList = new object();
private R_TRIG _trigError = new R_TRIG();
private R_TRIG _trigWarningMessage = new R_TRIG();
private bool _enableLog;
#endregion
public const string delimiter = "\r\n";
private bool _commErr = false;
public HstOcrReader(string module, string name, string display, string deviceId, string address)
: base(module, name, display, deviceId)
{
_address = address;
Initalized = false;
}
public bool Initialize()
{
_address = SC.GetStringValue($"{Module}.{Name}.Address");
_enableLog = SC.GetValue<bool>($"{Module}.{Name}.EnableLogMessage");
_lstHandler.Clear();
_connection = new HstConnection(_address);
if (CheckAddressPort(_address))
{
if (_connection.Connect())
{
EV.PostInfoLog(Module, $"{Module}.{Name} connected");
}
}
else EV.PostWarningLog(Module, $"{Module}.{Name} Adress is illegal");
_thread = new PeriodicJob(50, OnTimer, $"{Module} MonitorHandler", true);
DEVICE.Register(String.Format("{0}.{1}", Name, "ReadWaferID"), (out string reason, int time, object[] param) =>
{
bool bLaser = bool.Parse((string)param[0]);
string jobName = (string)param[1];
bool ret = Read(bLaser, jobName, out reason);
if (ret)
{
reason = string.Format("{0}", Name, "读WaferID");
return true;
}
return false;
});
DATA.Subscribe(Name, "WRIDReaderState", () => State);
DATA.Subscribe(Name, "WRIDReaderBusy", () => Busy);
DATA.Subscribe(Name, "LaserMaker1", () => LaserMark1);
DATA.Subscribe(Name, "LaserMaker2", () => LaserMark2);
Initalized = true;
_lstHandler.AddLast(new OnlineHandler(this, true));
return true;
}
//int queryintervalcount = 0;
private bool OnTimer()
{
try
{
_connection.MonitorTimeout();
//if (!_connection.IsConnected || _connection.IsCommunicationError)
if (_connection.IsCommunicationError)
{
_lstHandler.Clear();
return true;
}
if (_connection.IsBusy)
return true;
HandlerBase handler = null;
lock (_lockerHandlerList)
{
if (_lstHandler.Count > 0)
{
handler = _lstHandler.First.Value;
if (handler != null) _connection.Execute(handler);
_lstHandler.RemoveFirst();
}
//else
//{
// if (queryintervalcount > 100)
// {
// _lstHandler.AddLast(new OnlineHandler(this, true));
// _lstHandler.AddLast(new OnlineHandler(this, false));
// queryintervalcount = 0;
// }
// else
// queryintervalcount++;
//}
}
}
catch (Exception ex)
{
LOG.Write(ex);
}
return true;
}
static bool CheckAddressPort(string s)
{
bool isLegal;
Regex regex = new Regex(@"^((2[0-4]\d|25[0-5]|[1]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[1]?\d\d?)\:([1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-6][0-5][0-5][0-3][0-5])$");//CheckAddressPort
Match match = regex.Match(s);
if (match.Success)
{
isLegal = true;
}
else
{
isLegal = false;
}
return isLegal;
}
public void Terminate()
{
}
public void Monitor()
{
//if (!_onlineInited && _socket.IsConnected)
//{
// _onlineInited = true;
// string error = string.Empty;
// Online(true, out error);
//}
}
public void Reset()
{
_trigError.RST = true;
_trigWarningMessage.RST = true;
_lstHandler.Clear();
if(_connection.IsCommunicationError ||!_connection.IsConnected)
{
_connection.Connect();
}
_connection.SetCommunicationError(false, "");
//_trigCommunicationError.RST = true;
_enableLog = SC.GetValue<bool>($"{Module}.{Name}.EnableLogMessage");
//_trigRetryConnect.RST = true;
ExeError = false;
}
#region Command
public bool Read(bool bLaserMaker, string jobName, out string reason)
{
lock(_lockerHandlerList)
{
_lstHandler.AddLast(new OnlineHandler(this, false));
_lstHandler.AddLast(new LoadJobHandler(this, ConvetJobName(jobName)));
_lstHandler.AddLast(new OnlineHandler(this, true));
_lstHandler.AddLast(new ReadLMHandler(this));
}
ReadOK = false;
ReadLaserMaker = bLaserMaker;
reason = "";
return true;
}
public bool ReadOnHostMode(bool bLaserMaker, string[] jobnames, out string reason)
{
lock (_lockerHandlerList)
{
_lstHandler.AddLast(new OnlineHandler(this, false));
_lstHandler.AddLast(new LoadJobHandler(this, ConvetJobName(jobnames[0])));
_lstHandler.AddLast(new OnlineHandler(this, true));
_lstHandler.AddLast(new ReadLMHandler(this));
}
ReadOK = false;
ReadLaserMaker = bLaserMaker;
reason = "";
return true;
}
#endregion
private string[] GetJobName(bool bLaserMark1)
{
string jobs = string.Empty;
if (bLaserMark1)
{
jobs = SC.GetStringValue("OcrReader.ReaderJob1Main");
}
else
{
jobs = SC.GetStringValue("OcrReader.ReaderJob2Main");
}
return jobs.Split(';');
}
public void OnLaskerMarkerRead()
{
}
private string ConvetJobName(string name)
{
name = name.Substring(name.LastIndexOf("\\") + 1); //remove dir
name = name.Substring(0, name.LastIndexOf(".")); //remove expand
return name;
}
}
}