增加入口自动扫码功能

This commit is contained in:
anerx 2025-03-23 15:26:01 +08:00
parent 5108f66352
commit d61ad53d28
6 changed files with 163 additions and 44 deletions

View File

@ -47,7 +47,7 @@ public class HyosungPlcService(ILogger<HyosungPlcService> logger) : IHyosungPlcS
logger.LogInformation($"write [{variety.Id}] to plc address[4230]");
}
public async Task WriteScanYarnResultAsync(bool result, short? varietyId = null, string? yarnCode= null )
public async Task WriteScanYarnResultAsync(bool result, short? varietyId = null, string? yarnCode = null)
{
if (result && yarnCode != null && varietyId != null)
{
@ -127,15 +127,23 @@ public class HyosungPlcService(ILogger<HyosungPlcService> logger) : IHyosungPlcS
data = 30;
break;
}
await _writer.WriteShortsAsync(13050, [1, 1, 1, 2]);
}
public async Task WritePrintLabelResultAsync(int index, bool result)
public async Task WritePrintLabelResultAsync(int index, bool result)
{
var address = index == 1 ? 13060 : 13061;
await _writer.WriteShortsAsync(address, (short)(result ? 1 : 2));
}
public async Task WriteScanEntryResultAsync(int index, bool result)
{
var address = index == 1 ? 4530 : 4531;
await _writer.WriteShortsAsync(address, (short)(result ? 1 : 2));
}
//static byte SetBit(byte value, int bitPosition)
//{
// // 创建一个掩码,该掩码只有第 bitPosition 位为 1
@ -156,8 +164,9 @@ public class HyosungPlcService(ILogger<HyosungPlcService> logger) : IHyosungPlcS
public event Func<string, Task>? OnPlcRequestPackLineOption;
public event Func<int, int, Task>? OnRequestPrintLabel;
public event Func<int, int, Task>? OnRequestPrintLabel;
public event Func<string, Task> OnRequestGetPrintLableOption;
public event Func<int, Task>? OnRequestScanEntry;
private async Task ReadLoop(CancellationToken token)
{
@ -165,10 +174,11 @@ public class HyosungPlcService(ILogger<HyosungPlcService> logger) : IHyosungPlcS
{
try
{
await QueryScanEntry();
await QueryScanProductRequest();
await QueryScanFixtureRequest();
if(!isLeaving)
await QueryLeavingProductionLine();
if (!isLeaving)
await QueryLeavingProductionLine();
await QueryNeedTrayCode();
await QueryPutOnceCompleted();
await QueryPackLineOption();
@ -235,17 +245,16 @@ public class HyosungPlcService(ILogger<HyosungPlcService> logger) : IHyosungPlcS
// var stackStatus = await _reader.ReadShortsAsync(12110, 1);
if (leavingProductionLine[0] == 1)
{
var trayCode = await _reader.ReadStringAsync(12600);
//if (!string.IsNullOrEmpty(trayCode))
//{
PlcStackInfo info = new PlcStackInfo()
{
TrayCode = trayCode
};
isLeaving = true;
OnPlcRequestLeavingProductionLine?.Invoke(info);
// }
PlcStackInfo info = new PlcStackInfo()
{
TrayCode = trayCode
};
isLeaving = true;
OnPlcRequestLeavingProductionLine?.Invoke(info);
// }
}
}
@ -319,21 +328,36 @@ public class HyosungPlcService(ILogger<HyosungPlcService> logger) : IHyosungPlcS
}
}
private async Task QueryScanEntry()
{
var requestScanEntry = await _reader.ReadShortsAsync(4030, 2);
if (requestScanEntry[0] == 1)
{
await _writer.WriteShortsAsync(4030, 0);
OnRequestScanEntry?.Invoke(1);
}
else if (requestScanEntry[1] == 1)
{
await _writer.WriteShortsAsync(4030, 0);
OnRequestScanEntry?.Invoke(2);
}
}
private async Task QueryGetPrintLabel()
{
var trayCode = await _reader.ReadStringAsync(13000);
if (!string.IsNullOrEmpty(trayCode)&&!trayCode.StartsWith("0000"))
if (!string.IsNullOrEmpty(trayCode) && !trayCode.StartsWith("0000"))
{
await _reader.WriteStringAsync(13000, "00000000000000000000");
await _reader.WriteStringAsync(13000, "00000000000000000000");
OnRequestGetPrintLableOption?.Invoke(trayCode);
}
}
private async Task QueryPrintLabel()
{
var requestPrintLabel = await _reader.ReadShortsAsync(13010, 3);
if (requestPrintLabel[0] == 1)
{
await _writer.WriteShortsAsync(13010, 0);
await _writer.WriteShortsAsync(13012, 0);
OnRequestPrintLabel?.Invoke(1, requestPrintLabel[2]);
@ -341,12 +365,9 @@ public class HyosungPlcService(ILogger<HyosungPlcService> logger) : IHyosungPlcS
if (requestPrintLabel[1] == 1)
{
await _writer.WriteShortsAsync(13011, 0);
await _writer.WriteShortsAsync(13012, 0);
OnRequestPrintLabel?.Invoke(2, requestPrintLabel[2]);
}
}
}

View File

@ -62,6 +62,9 @@ public interface IHyosungPlcService
Task WritePrintLabelResultAsync(int index, bool result);
Task WriteScanEntryResultAsync(int index, bool result);
/// <summary>
/// Plc请求扫描产品
/// </summary>
@ -98,4 +101,6 @@ public interface IHyosungPlcService
event Func<int, int, Task> OnRequestPrintLabel;
event Func<string, Task> OnRequestGetPrintLableOption;
event Func<int, Task> OnRequestScanEntry;
}

View File

@ -5,10 +5,12 @@ using Newtonsoft.Json.Linq;
namespace Seyounth.Hyosung.Core.Scanner;
public class HikScanner(string host, int port)
public class HikScanner(string host, int port,int timeout=1000)
{
public string Host => host;
public int Port => port;
public int Timeout => timeout;
private Socket _socket = new(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
public async Task ConnectAsync(CancellationToken token)
@ -62,7 +64,7 @@ public class HikScanner(string host, int port)
byte[] cmd = "start"u8.ToArray();
await _socket.SendAsync(cmd);
byte[] buffer = new byte[1024];
int len = await _socket.ReceiveAsync(buffer).WaitAsync(TimeSpan.FromMilliseconds(1000));
int len = await _socket.ReceiveAsync(buffer).WaitAsync(TimeSpan.FromMilliseconds(Timeout));
barcode= Encoding.ASCII.GetString(buffer, 0, len);
}
catch (Exception e)

View File

@ -12,7 +12,8 @@ public class HyosungScannerService : IHyosungScannerService
private readonly ConcurrentDictionary<int, HikScanner> _fixtureScanners = new();
private readonly List<HikScanner> _carScanners = new();
private readonly List<HikScanner> _varietyScanners = new();
private List<string> lastCodes = new List<string>();
@ -27,6 +28,10 @@ public class HyosungScannerService : IHyosungScannerService
_fixtureScanners.TryAdd(2, new HikScanner("192.168.3.32", 2001));
_fixtureScanners.TryAdd(3, new HikScanner("192.168.3.33", 2001));
_fixtureScanners.TryAdd(4, new HikScanner("192.168.3.30", 2001));
_carScanners.Add(new HikScanner("192.168.3.46", 2001,5000));
_carScanners.Add(new HikScanner("1920.168.3.48", 2001,5000));
_varietyScanners.Add(new HikScanner("192.168.3.47", 2001,10000));
_varietyScanners.Add(new HikScanner("192.168.3.49", 2001,10000));
_logger = logger;
lastCodes.Add("");
lastCodes.Add("");
@ -36,7 +41,6 @@ public class HyosungScannerService : IHyosungScannerService
public async Task StartAsync(CancellationToken token)
{
// 创建一个超时任务
var timeoutTask = Task.Delay(2000, token);
@ -54,8 +58,23 @@ public class HyosungScannerService : IHyosungScannerService
return Task.WhenAny(connectTask, timeoutTask);
}).ToList();
var varietyScannerTasks = _varietyScanners.Select(scanner =>
{
var connectTask = scanner.ConnectAsync(token);
return Task.WhenAny(connectTask, timeoutTask);
}).ToList();
// 为每个车号扫描器创建一个带有超时的连接任务
var carScannerTasks = _carScanners.Select(scanner =>
{
var connectTask = scanner.ConnectAsync(token);
return Task.WhenAny(connectTask, timeoutTask);
}).ToList();
// 合并所有任务
var allTasks = new List<Task>();
allTasks.AddRange(carScannerTasks);
allTasks.AddRange(varietyScannerTasks);
allTasks.AddRange(yarnScannerTasks);
allTasks.AddRange(fixtureScannerTasks);
@ -82,6 +101,26 @@ public class HyosungScannerService : IHyosungScannerService
Console.WriteLine($"夹具扫描器连接超时");
}
}
foreach (var task in varietyScannerTasks)
{
var innerTask = task as Task<Task>;
if (innerTask.Result == timeoutTask)
{
// 处理纱线扫描器连接超时的情况
Console.WriteLine($"产品扫描器连接超时");
}
}
foreach (var task in carScannerTasks)
{
var innerTask = task as Task<Task>;
if (innerTask.Result == timeoutTask)
{
// 处理车号扫描器连接超时的情况
Console.WriteLine($"车号扫描器连接超时");
}
}
// foreach (var scanner in _yarnScanners)
// {
// await scanner.ConnectAsync(token);
@ -119,11 +158,9 @@ public class HyosungScannerService : IHyosungScannerService
{
_yarnScanners.Select(async scanner => await scanner.Stop());
return Yarn.Create(result, varietyId);
}
}
//_yarnScanners.Select( scanner => scanner.Stop());
_logger.LogWarning($"all scanner no scan yarn");
_yarnScanners.Select(async scanner => await scanner.Restart());
@ -137,7 +174,7 @@ public class HyosungScannerService : IHyosungScannerService
{
return await _fixtureScanners[fixtureId].ScanAsync();
}
catch(Exception e)
catch (Exception e)
{
_logger.LogError(e, $"Fixture{fixtureId} Scan Error");
await _fixtureScanners[fixtureId].Restart();
@ -153,4 +190,14 @@ public class HyosungScannerService : IHyosungScannerService
//lastCodes[fixtureId - 1] = code;
//return code;
}
public async Task<string> ScanYarnCarAsync(int entryId)
{
return await _carScanners[entryId - 1].ScanAsync();
}
public async Task<string> ScanVarietyAsync(int entryId)
{
return await _varietyScanners[entryId - 1].ScanAsync();
}
}

View File

@ -21,4 +21,8 @@ public interface IHyosungScannerService
/// <param name="fixtureId"></param>
/// <returns></returns>
Task<string> ScanFixtureAsync(int fixtureId);
Task<string> ScanYarnCarAsync(int entryId);
Task<string> ScanVarietyAsync(int entryId);
}

View File

@ -12,7 +12,6 @@ using Seyounth.Hyosung.Data.Services;
using Seyounth.Hyosung.Data.Services.Hyosung;
using Seyounth.Hyosung.Data.Services.Hyosung.Entities;
using Seyounth.Hyosung.Runtime.Models;
using static System.Runtime.CompilerServices.RuntimeHelpers;
namespace Seyounth.Hyosung.Runtime;
@ -50,9 +49,47 @@ public class HyosungRuntime(
hyosungPlcService.OnPlcRequestPackLineOption += OnPlcRequestPackLineOption;
hyosungPlcService.OnRequestPrintLabel += OnPlcRequestPrintLabel;
hyosungPlcService.OnRequestGetPrintLableOption += OnRequestGetPrintLabel;
hyosungPlcService.OnRequestScanEntry += OnPlcRequestScanEntry;
await hyosungPlcService.StartAsync(token);
}
private async Task OnPlcRequestScanEntry(int arg)
{
logger.LogInformation($"plc request scan entry:{arg}");
try
{
var carCode = await hyosungScannerService.ScanYarnCarAsync(arg);
var varietyId = await hyosungScannerService.ScanVarietyAsync(arg);
if (string.IsNullOrEmpty(carCode) || string.IsNullOrEmpty(varietyId))
{
await hyosungPlcService.WriteScanEntryResultAsync(arg, false);
logger.LogInformation($"scan entry fail");
}
else
{
var carType = carCode[..1];
int carNumber = carType switch
{
"A" => 1,
"B" => 2,
"C" => 3,
"D" => 4,
_ => 0
};
var variety = await varietyService.GetById(int.Parse(varietyId));
variety.YarnCarType = carNumber;
variety.YarnCarSide = 1;
await SendVarietyToPlcAsync(variety);
await hyosungPlcService.WriteScanEntryResultAsync(arg, true);
logger.LogInformation($"scan entry success: {carCode}");
}
}
catch (Exception e)
{
await hyosungPlcService.WriteScanEntryResultAsync(arg, false);
logger.LogError(e, $"scan entry fail");
}
}
public async Task StopAsync(CancellationToken token)
@ -261,7 +298,6 @@ public class HyosungRuntime(
logger.LogInformation($"plc request pack line option");
try
{
var tray = await trayService.GetByCode(arg);
var variety = await varietyService.GetById(tray.VarietyId);
if (_packingQueue is null)
@ -275,7 +311,7 @@ public class HyosungRuntime(
if (control is null)
control = await hyosungWmsService.GetControlNo(variety, grade);
else
control =control+count;
control = control + count;
var isEven = control % 2 == 0;
PackLineOption = new PackLineOption()
{
@ -283,19 +319,24 @@ public class HyosungRuntime(
HasBox = variety.HasBox,
TrayCode = arg
};
if (variety.NeedTopBoard == NeedType.Need || (isEven && variety.NeedTopBoard == NeedType.EvenNeed) || (!isEven && variety.NeedTopBoard == NeedType.OddNeed))
if (variety.NeedTopBoard == NeedType.Need || (isEven && variety.NeedTopBoard == NeedType.EvenNeed) ||
(!isEven && variety.NeedTopBoard == NeedType.OddNeed))
PackLineOption.IsTop = true;
else
PackLineOption.IsTop = false;
if (variety.NeedPackStrap == NeedType.Need || (isEven && variety.NeedPackStrap == NeedType.EvenNeed) || (!isEven && variety.NeedPackStrap == NeedType.OddNeed))
if (variety.NeedPackStrap == NeedType.Need || (isEven && variety.NeedPackStrap == NeedType.EvenNeed) ||
(!isEven && variety.NeedPackStrap == NeedType.OddNeed))
PackLineOption.IsPack = true;
else
PackLineOption.IsPack = false;
if (variety.NeedFilmWrapping == NeedType.Need || (isEven && variety.NeedFilmWrapping == NeedType.EvenNeed) || (!isEven && variety.NeedFilmWrapping == NeedType.OddNeed))
if (variety.NeedFilmWrapping == NeedType.Need ||
(isEven && variety.NeedFilmWrapping == NeedType.EvenNeed) ||
(!isEven && variety.NeedFilmWrapping == NeedType.OddNeed))
PackLineOption.IsFilm = true;
else
PackLineOption.IsFilm = false;
if (variety.NeedFilmCoating == NeedType.Need || (isEven && variety.NeedFilmCoating == NeedType.EvenNeed) || (!isEven && variety.NeedFilmCoating == NeedType.OddNeed))
if (variety.NeedFilmCoating == NeedType.Need || (isEven && variety.NeedFilmCoating == NeedType.EvenNeed) ||
(!isEven && variety.NeedFilmCoating == NeedType.OddNeed))
PackLineOption.IsLam = true;
else
PackLineOption.IsLam = false;
@ -326,8 +367,9 @@ public class HyosungRuntime(
controlNo += 1;
tray = await trayService.PrintTrayAsync(arg, controlNo.Value, mod);
}
await dictService.SetValue("System", "CurrentPackingTrayCode", arg);
await hyosungPlcService.WritePrintLableOptionsAsync( variety.MasterLabelCount);
await hyosungPlcService.WritePrintLableOptionsAsync(variety.MasterLabelCount);
}
/// <summary>
@ -337,7 +379,7 @@ public class HyosungRuntime(
/// <param name="arg2"></param>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
private async Task OnPlcRequestPrintLabel(int arg1, int height)
private async Task OnPlcRequestPrintLabel(int arg1, int height)
{
var trayCode = await dictService.GetValue("System", "CurrentPackingTrayCode");
var tray = await trayService.GetByCode(trayCode);
@ -347,7 +389,6 @@ public class HyosungRuntime(
await trayService.UpdateHeightAsync(tray.TrayCode, height);
try
{
if (arg1 == 1)
{
await printer.PrintAsync(1, tray.TrayCode);
@ -356,19 +397,18 @@ public class HyosungRuntime(
else
{
await printer.PrintAsync(2, tray.TrayCode);
await hyosungPlcService.WritePrintLabelResultAsync(arg1, true);
await hyosungPlcService.WritePrintLabelResultAsync(arg1, true);
await varietyService.SetLastNo(variety.Id, tray.ControlNo.Value);
//await hyosungWmsService.UpdateControlNo(variety, tray.ControlNo.Value);
await hyosungWmsService.AddLabelResult(new LabelResult(tray, variety));
}
logger.LogInformation($"plc request print label success");
}
catch (Exception e)
{
await hyosungPlcService.WritePrintLabelResultAsync(arg1, false);
await hyosungPlcService.WritePrintLabelResultAsync(arg1, false);
logger.LogError(e, "print label fail");
}
}