344 lines
12 KiB
C#
344 lines
12 KiB
C#
using Aitex.Common.Util;
|
|
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 MECF.Framework.Common.Communications;
|
|
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadPorts;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Drawing;
|
|
using System.Drawing.Imaging;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Text.RegularExpressions;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.OcrReaders.Cognex
|
|
{
|
|
public class CognexWaferIDReader:OCRReaderBaseDevice, IConnection
|
|
{
|
|
private CognexOCRConnection _connection;
|
|
private static readonly object _lockerHandlerList = new object();
|
|
private string _scRoot;
|
|
private PeriodicJob _thread;
|
|
private LinkedList<HandlerBase> _lstHandler = new LinkedList<HandlerBase>();
|
|
private R_TRIG _trigError = new R_TRIG();
|
|
private R_TRIG _trigWarningMessage = new R_TRIG();
|
|
private R_TRIG _trigActionDone = new R_TRIG();
|
|
private bool _enableLog;
|
|
private string _imageStorePath;
|
|
private DateTime _dtActionStart;
|
|
|
|
public override string CurrentImageFileName
|
|
{
|
|
get
|
|
{
|
|
if (SC.ContainsItem($"OCRReader.{Name}.TempImageFilePath"))
|
|
{
|
|
return SC.GetStringValue($"OCRReader.{Name}.TempImageFilePath");
|
|
}
|
|
return "";
|
|
}
|
|
}
|
|
public bool IsLogined { get; set; }
|
|
public CognexWaferIDReader(string module,string name,string scRoot):base(module,name)
|
|
{
|
|
_scRoot = scRoot;
|
|
InitializeCognex();
|
|
CheckToPostMessage((int)OCRReaderMsg.StartInit, null);
|
|
}
|
|
public void InitializeCognex()
|
|
{
|
|
Address = SC.GetStringValue($"{_scRoot}.{Name}.Address");
|
|
_enableLog = SC.GetValue<bool>($"{_scRoot}.{Name}.EnableLogMessage");
|
|
TimeLimitForRead = SC.GetValue<int>($"{_scRoot}.{Name}.TimeLimitForWID");
|
|
_lstHandler.Clear();
|
|
_connection = new CognexOCRConnection(Address,this);
|
|
if (CheckAddressPort(Address))
|
|
{
|
|
if (_connection.Connect())
|
|
{
|
|
EV.PostInfoLog(Module, $"{Module}.{Name} connected");
|
|
}
|
|
}
|
|
else EV.PostWarningLog(Module, $"{Module}.{Name} Adress is illegal");
|
|
ConnectionManager.Instance.Subscribe(Name, this);
|
|
_thread = new PeriodicJob(50, OnTimer, $"{Module}.{Name} MonitorHandler", true);
|
|
var fileInfo = new FileInfo(PathManager.GetDirectory($"Logs\\{Name}"));
|
|
|
|
if (fileInfo.Directory != null && !fileInfo.Directory.Exists)
|
|
fileInfo.Directory.Create();
|
|
|
|
if (fileInfo.Directory != null)
|
|
_imageStorePath = fileInfo.FullName;
|
|
ConnectionManager.Instance.Subscribe($"{Name}", this);
|
|
}
|
|
|
|
|
|
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;
|
|
}
|
|
|
|
private bool OnTimer()
|
|
{
|
|
try
|
|
{
|
|
|
|
_connection.MonitorTimeout();
|
|
|
|
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();
|
|
}
|
|
}
|
|
_trigActionDone.CLK = (_lstHandler.Count == 0 && !_connection.IsBusy);
|
|
if (_trigActionDone.Q)
|
|
OnActionDone(null);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
LOG.Write(ex);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public string Address { get; private set; }
|
|
|
|
public bool IsConnected => _connection.IsConnected ;
|
|
|
|
public bool Connect()
|
|
{
|
|
_connection.Connect();
|
|
return true;
|
|
}
|
|
|
|
public bool Disconnect()
|
|
{
|
|
_connection.Disconnect();
|
|
return true;
|
|
}
|
|
protected override bool fStartInit(object[] param)
|
|
{
|
|
|
|
return true;
|
|
}
|
|
protected override bool fStartReadWaferID(object[] param)
|
|
{
|
|
string job = param[0].ToString();
|
|
int lasermarkindex = (int)param[1];
|
|
IsReadLaserMark1 = lasermarkindex == 0;
|
|
lock (_lockerHandlerList)
|
|
{
|
|
_lstHandler.AddLast(new OnlineHandler(this,false));
|
|
_lstHandler.AddLast(new LoadJobHandler(this, job));
|
|
_lstHandler.AddLast(new OnlineHandler(this, true));
|
|
_lstHandler.AddLast(new ReadWaferIDHandler(this));
|
|
}
|
|
_dtActionStart = DateTime.Now;
|
|
return true;
|
|
}
|
|
protected override bool fMonitorReading(object[] param)
|
|
{
|
|
IsBusy = false;
|
|
if(DateTime.Now - _dtActionStart >TimeSpan.FromSeconds(TimeLimitForRead))
|
|
{
|
|
EV.Notify(AlarmWIDReadTimeout);
|
|
ReadOK = false;
|
|
if(IsReadLaserMark1)
|
|
{
|
|
LaserMark1 = "******";
|
|
LaserMark1Score = "0";
|
|
LaserMark1ReadTime = (DateTime.Now - _dtActionStart).TotalSeconds.ToString();
|
|
}
|
|
Reset();
|
|
return true;
|
|
}
|
|
return false;
|
|
|
|
}
|
|
protected override bool fStartReadParameter(object[] param)
|
|
{
|
|
readparameter = param[0].ToString();
|
|
switch (readparameter)
|
|
{
|
|
case "JobList":
|
|
if (SC.ContainsItem($"{ _scRoot}.{ Name}.DirectoryForJob") && !string.IsNullOrEmpty(SC.GetStringValue($"{ _scRoot}.{ Name}.DirectoryForJob")))
|
|
{
|
|
string jobpath = SC.GetStringValue($"{ _scRoot}.{ Name}.DirectoryForJob");
|
|
string[] files = Directory.GetFiles(jobpath);
|
|
JobFileList = new List<string>();
|
|
JobFileList.Clear();
|
|
foreach(string strfile in files)
|
|
{
|
|
FileInfo f = new FileInfo(strfile);
|
|
if(f.Extension == ".job")
|
|
{
|
|
JobFileList.Add(f.Name);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
lock (_lockerHandlerList)
|
|
{
|
|
_lstHandler.AddLast(new GetJobListHandler(this));
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
return true; ;
|
|
}
|
|
private string readparameter = "";
|
|
|
|
protected override bool fMonitorReadParameter(object[] param)
|
|
{
|
|
if (readparameter == "JobList" && SC.ContainsItem($"{ _scRoot}.{ Name}.DirectoryForJob") && !string.IsNullOrEmpty(SC.GetStringValue($"{ _scRoot}.{ Name}.DirectoryForJob")))
|
|
{
|
|
return true;
|
|
}
|
|
return base.fMonitorReadParameter(param);
|
|
}
|
|
|
|
protected override bool fStartReset(object[] param)
|
|
{
|
|
_trigError.RST = true;
|
|
_trigWarningMessage.RST = true;
|
|
_lstHandler.Clear();
|
|
_connection.ForceClear();
|
|
if (_connection.IsCommunicationError || !_connection.IsConnected)
|
|
{
|
|
Address = SC.GetStringValue($"{_scRoot}.{Name}.Address");
|
|
_enableLog = SC.GetValue<bool>($"{_scRoot}.{Name}.EnableLogMessage");
|
|
_connection = new CognexOCRConnection(Address, this);
|
|
_connection.Connect();
|
|
}
|
|
_connection.SetCommunicationError(false, "");
|
|
//_trigCommunicationError.RST = true;
|
|
|
|
_enableLog = SC.GetValue<bool>($"{_scRoot}.{Name}.EnableLogMessage");
|
|
return true;
|
|
}
|
|
|
|
protected override bool fStartSetParameter(object[] param)
|
|
{
|
|
string paraname = param[0].ToString();
|
|
switch(paraname)
|
|
{
|
|
case "SetOnline":
|
|
|
|
break;
|
|
}
|
|
return true; ;
|
|
}
|
|
protected override bool fSetParameterComplete(object[] param)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
public override string[] GetJobFileList()
|
|
{
|
|
lock(_lockerHandlerList)
|
|
{
|
|
_lstHandler.AddLast(new GetJobListHandler(this));
|
|
}
|
|
int delaytime = 0;
|
|
while((_lstHandler.Count !=0 || _connection.IsBusy)&& delaytime<10)
|
|
{
|
|
Thread.Sleep(500);
|
|
delaytime++;
|
|
}
|
|
return JobFileList.ToArray();
|
|
}
|
|
protected override bool fStartSavePicture(object[] param)
|
|
{
|
|
lock(_lockerHandlerList)
|
|
{
|
|
|
|
}
|
|
return true;
|
|
}
|
|
public void SaveImage(string filename,string imgString)
|
|
{
|
|
DeleteEarlyImageFile();
|
|
var byBitmap = HexStringToBytes(imgString);
|
|
var bmp = new Bitmap(new MemoryStream(byBitmap));
|
|
|
|
bmp.Save($"{_imageStorePath}{filename}.bmp", ImageFormat.Bmp);
|
|
EV.PostInfoLog("WIDReader", $"Picture saved, file name is {filename}.bmp");
|
|
}
|
|
private void DeleteEarlyImageFile()
|
|
{
|
|
string[] fpath = Directory.GetFiles(_imageStorePath, "*.bmp", SearchOption.TopDirectoryOnly);
|
|
Dictionary<string, DateTime> fCreateDate = new Dictionary<string, DateTime>();
|
|
for (int i = 0; i < fpath.Length; i++)
|
|
{
|
|
FileInfo fi = new FileInfo(fpath[i]);
|
|
fCreateDate[fpath[i]] = fi.CreationTime;
|
|
}
|
|
fCreateDate = fCreateDate.OrderBy(f => f.Value).ToDictionary(f => f.Key, f => f.Value);
|
|
int fCount = fCreateDate.Count;
|
|
while (fCount > 99)
|
|
{
|
|
string strFile = fCreateDate.First().Key;
|
|
File.Delete(strFile);
|
|
fCreateDate.Remove(strFile);
|
|
fCount = fCreateDate.Count;
|
|
}
|
|
|
|
|
|
}
|
|
private static byte[] HexStringToBytes(string hex)
|
|
{
|
|
byte[] data = new byte[hex.Length / 2];
|
|
int j = 0;
|
|
for (int i = 0; i < hex.Length; i += 2)
|
|
{
|
|
data[j] = Convert.ToByte(hex.Substring(i, 2), 16);
|
|
++j;
|
|
}
|
|
return data;
|
|
}
|
|
|
|
protected override void OnWaferIDRead(string wid, string score, string readtime)
|
|
{
|
|
if(DeviceState == OCRReaderStateEnum.ReadWaferID)
|
|
base.OnWaferIDRead(wid, score, readtime);
|
|
}
|
|
|
|
}
|
|
|
|
}
|