249 lines
6.8 KiB
C#
249 lines
6.8 KiB
C#
|
using System;
|
|||
|
using System.Threading;
|
|||
|
using System.Threading.Tasks;
|
|||
|
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.Common.Equipment;
|
|||
|
using MECF.Framework.Common.Utilities;
|
|||
|
|
|||
|
namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.CarrierIdReaders.OmronBarcode
|
|||
|
{
|
|||
|
public class OmronBarcodeReader : CarrierIdReader
|
|||
|
{
|
|||
|
|
|||
|
private AsyncSerialPort _port;
|
|||
|
|
|||
|
private string _scannerName;
|
|||
|
|
|||
|
//private int _scan;
|
|||
|
|
|||
|
private int _timeout;
|
|||
|
|
|||
|
private int _retryTime;
|
|||
|
|
|||
|
DeviceTimer _scanTimer = new DeviceTimer();
|
|||
|
|
|||
|
private bool _cmdScan;
|
|||
|
private bool _cmdStopScan;
|
|||
|
//private bool _msgError;
|
|||
|
private bool _msgScanned;
|
|||
|
|
|||
|
public string _scanResult;
|
|||
|
|
|||
|
private object _locker = new object();
|
|||
|
|
|||
|
private bool _isScanning;
|
|||
|
|
|||
|
public OmronBarcodeReader(string module, string scannerName, string portName, int timeout, int retryTime):base(module, scannerName)
|
|||
|
{
|
|||
|
Module = module;
|
|||
|
Name = scannerName;
|
|||
|
_scannerName = scannerName;
|
|||
|
_timeout = timeout*1000;
|
|||
|
_retryTime = retryTime;
|
|||
|
|
|||
|
_port = new AsyncSerialPort(portName, 9600, 8 );
|
|||
|
_port.EnableLog = true;
|
|||
|
|
|||
|
_port.OnDataChanged += _port_OnDataReceived;
|
|||
|
_port.OnErrorHappened += _port_OnErrorHappened;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public override bool Initialize()
|
|||
|
{
|
|||
|
Task.Factory.StartNew(() =>
|
|||
|
{
|
|||
|
int count = SC.ContainsItem("System.ComPortRetryCount") ? SC.GetValue<int>("System.ComPortRetryCount") : 50;
|
|||
|
int sleep = SC.ContainsItem("System.ComPortRetryDelayTime") ? SC.GetValue<int>("System.ComPortRetryDelayTime") : 1;
|
|||
|
if (sleep <= 0 || sleep > 10)
|
|||
|
sleep = 2;
|
|||
|
|
|||
|
int retry = 0;
|
|||
|
do
|
|||
|
{
|
|||
|
if (_port.Open())
|
|||
|
{
|
|||
|
//LOG.Write($"Connected with {Module}.{Name} .");
|
|||
|
EV.PostInfoLog(Module, $"Connected with {Module}.{Name} .");
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
if (count>0 && retry++ > count)
|
|||
|
{
|
|||
|
LOG.Write($"Retry connect {Module}.{Name} stop retry.");
|
|||
|
EV.PostAlarmLog(Module, $"Can't connect to {Module}.{Name} .");
|
|||
|
break;
|
|||
|
}
|
|||
|
{
|
|||
|
Thread.Sleep(sleep * 1000);
|
|||
|
LOG.Write($"Retry connect {Module}.{Name} for the {retry + 1} time.");
|
|||
|
}
|
|||
|
} while (true);
|
|||
|
|
|||
|
});
|
|||
|
// RetryInstance.Instance().Execute<bool>(
|
|||
|
// ()=> _port.Open(),
|
|||
|
// SC.GetValue<int>("System.ComPortRetryDelayTime"),
|
|||
|
// SC.GetValue<int>("System.ComPortRetryCount"),
|
|||
|
// true
|
|||
|
// );
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
public override bool Read(out string reason)
|
|||
|
{
|
|||
|
Scan();
|
|||
|
reason = "";
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
private bool InvokeScan(string arg1, object[] arg2)
|
|||
|
{
|
|||
|
Scan();
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
private bool InvokeStopScan(string arg1, object[] arg2)
|
|||
|
{
|
|||
|
StopScan();
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
public void Scan()
|
|||
|
{
|
|||
|
if (!_port.IsOpen())
|
|||
|
{
|
|||
|
EV.PostWarningLog(Module, _scannerName + " not open, can not scan");
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
lock (_locker)
|
|||
|
{
|
|||
|
if (!_isScanning)
|
|||
|
{
|
|||
|
_scanTimer.Start(0);
|
|||
|
_cmdScan = true;
|
|||
|
_cmdStopScan = false;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public void StopScan()
|
|||
|
{
|
|||
|
if (!_port.IsOpen())
|
|||
|
{
|
|||
|
EV.PostWarningLog(Module, _scannerName + " not open, can not stop scan");
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
lock (_locker)
|
|||
|
{
|
|||
|
if (_isScanning)
|
|||
|
{
|
|||
|
_cmdScan = false;
|
|||
|
_cmdStopScan = true;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private void _port_OnErrorHappened(string obj)
|
|||
|
{
|
|||
|
EV.PostWarningLog(Module, _scannerName + " error, " + obj);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
private void _port_OnDataReceived(string obj)
|
|||
|
{
|
|||
|
lock (_locker)
|
|||
|
{
|
|||
|
if (_isScanning)
|
|||
|
{
|
|||
|
_scanResult = obj.Replace("\r","");
|
|||
|
_msgScanned = true;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public override void Monitor()
|
|||
|
{
|
|||
|
lock (_locker)
|
|||
|
{
|
|||
|
if (_isScanning)
|
|||
|
{
|
|||
|
if (_cmdStopScan)
|
|||
|
{
|
|||
|
_cmdStopScan = false;
|
|||
|
_isScanning = false;
|
|||
|
PerformStopTriggerScan();
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (_msgScanned)
|
|||
|
{
|
|||
|
_msgScanned = false;
|
|||
|
_isScanning = false;
|
|||
|
ReadOk(_scanResult);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (_scanTimer.GetElapseTime() > _timeout)
|
|||
|
{
|
|||
|
_isScanning = false;
|
|||
|
|
|||
|
EV.PostWarningLog(Module, _scannerName + " error, timeout");
|
|||
|
ReadFailed();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (_cmdScan)
|
|||
|
{
|
|||
|
_cmdScan = false;
|
|||
|
_isScanning = true;
|
|||
|
PerformTriggerScan();
|
|||
|
_scanTimer.Start(0);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public override void Terminate()
|
|||
|
{
|
|||
|
_port.Close();
|
|||
|
}
|
|||
|
|
|||
|
public override void Reset()
|
|||
|
{
|
|||
|
if (!_port.IsOpen())
|
|||
|
{
|
|||
|
if (_port.Open())
|
|||
|
{
|
|||
|
EV.PostMessage("System", EventEnum.GeneralInfo, _scannerName + " opened, ");
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
private void PerformTriggerScan()
|
|||
|
{
|
|||
|
_port.Write(new byte[] { 0x1B, 0x5A, 0x0D });
|
|||
|
}
|
|||
|
|
|||
|
private void PerformStopTriggerScan()
|
|||
|
{
|
|||
|
//_port.Write(new byte[] { 22, 85, 13 });
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|