Files
6078/src/StandardDomeNewApp/Communication/SweepCodeGun/ScanCode_Keyence.cs

246 lines
8.2 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 Keyence.AutoID.SDK;
using StandardDomeNewApp.Mappering;
using StandardDomeNewApp.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace StandardDomeNewApp.Communication.SweepCodeGun
{
public class ScanCode_Keyence : IScanCode
{
/// <summary>
/// 是否连接
/// </summary>
public override bool IsConnect
{
get => base.IsConnect;
protected set
{
if (base.IsConnect != value)
{
base.IsConnect = value;
if (configModel == null)
{
return;
}
using (var dbContext = new DataBaseMappering())
{
var find = dbContext.TSweepCodeGunConfigs.Where(o => o.PrimaryKey == configModel.PrimaryKey);
if (find != null)
{
var list = find.ToList();
if (list.Count > 0)
{
var one = list.ElementAt(0);
//修改这个one
one.IsConnect = value ? 1 : 0;
dbContext.SaveChanges();
}
}
}
}
}
}
/// <summary>
/// 虚拟码
/// </summary>
public override int Vcode
{
get => base.Vcode;
set
{
if (base.Vcode != value)
{
base.Vcode = value;
if (configModel == null)
{
return;
}
using (var dbContext = new DataBaseMappering())
{
var find = dbContext.TSweepCodeGunConfigs.Where(o => o.PrimaryKey == configModel.PrimaryKey);
if (find != null)
{
var list = find.ToList();
if (list.Count > 0)
{
var one = list.ElementAt(0);
//修改这个one
one.VCode = value;
dbContext.SaveChanges();
}
}
}
}
}
}
/// <summary>
/// 扫码枪配置参数
/// </summary>
private SweepCodeGunConfigModel configModel { set; get; }
/// <summary>
/// 基恩士扫码枪的读取器
/// </summary>
private ReaderAccessor reader { set; get; }
/// <summary>
/// 正则对象
/// </summary>
private Regex regex { set; get; }
public override void Build(object config)
{
if (config is SweepCodeGunConfigModel model)
{
configModel = model;
KeyName = configModel.PrimaryKey;
reader = new ReaderAccessor();
if (configModel.MaxVCode == -1 || configModel.MinVCode == -1)
{
IsUserVCode = false;
}
MaxVCode = configModel.MaxVCode;
MinVCode = configModel.MinVCode;
Vcode = configModel.VCode;
if (configModel.ErrorCode != null)
{
var errorcodes = configModel.ErrorCode.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
foreach (var item in errorcodes)
{
ErrorCodes.Add(item);
}
}
if (!string.IsNullOrEmpty(configModel.CodeRegex))
{
regex = new Regex(configModel.CodeRegex);
}
}
}
public override bool Connect()
{
IsConnect = false;
if (configModel == null)
{
ShowMessageAction?.Invoke("请先Build后再尝试连接", false, Core.SysEnumInfon.MessageLogType.Info);
return false;
}
KeyenceConnectModel keyence = contentCache.GetContent<KeyenceConnectModel>(configModel.ProtocolKey);
if (keyence != null)
{
reader.CommandPort = reader.DataPort = keyence.Port;
}
oneEncoding = Encoding.ASCII;//sdk里写死的
return IsConnect = reader.Connect();
}
public override Tuple<string, int, bool> ReadCode()
{
IsBusy = true;
string datapack = "";
int vcode = -1;
bool isok = false;
if (IsSimulation)
{
//模拟
isok = true;
datapack = Guid.NewGuid().ToString();
if (IsUserVCode)
{
Vcode++;
if (Vcode > MaxVCode)
{
Vcode = MinVCode;
}
vcode = Vcode;
}
}
else
{
for (int i = 0; i < MaxReadCount; i++)
{
var cmd = configModel.Command.Split('+')[0];
var code = reader.ExecCommand(cmd, configModel.OutTime);
if (regex == null)
{
var find = ErrorCodes.Find(o => o == code);
if (find == null)
{
datapack = code;
if (IsUserVCode)
{
Vcode++;
if (Vcode > MaxVCode)
{
Vcode = MinVCode;
}
vcode = Vcode;
}
isok = true;
break;
}
}
else
{
var result = regex.Match(code);
if (result.Success)
{
//去头去尾
string str = result.Value;
var arrayconnand = configModel.CodeRegex.Split(new string[] { ".*" }, StringSplitOptions.RemoveEmptyEntries);
foreach (var item in arrayconnand)
{
str = str.Replace(item, "");
}
var find = ErrorCodes.Find(o => o == str);
if (find == null)
{
datapack = str;
if (IsUserVCode)
{
Vcode++;
if (Vcode > MaxVCode)
{
Vcode = MinVCode;
}
vcode = Vcode;
}
isok = true;
break;
}
}
}
}
}
IsBusy = false;
return Tuple.Create(datapack, vcode, isok);
}
public override void ReConnect()
{
if (!IsConnect)
{
reader.Connect();
}
}
public override bool UnConnect()
{
try
{
reader.Disconnect();
reader.Dispose();
return true;
}
catch (Exception)
{
return false;
}
}
}
}