增加入口自动扫码功能
This commit is contained in:
parent
5108f66352
commit
d61ad53d28
@ -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)
|
||||
{
|
||||
@ -75,7 +75,7 @@ public class HyosungPlcService(ILogger<HyosungPlcService> logger) : IHyosungPlcS
|
||||
}
|
||||
|
||||
public async Task LeaveCompletedAsync()
|
||||
{
|
||||
{
|
||||
await _writer.WriteShortsAsync(4020, 0);
|
||||
await _writer.WriteShortsAsync(13012, 0);
|
||||
await _writer.WriteShortsAsync(4520, 1);
|
||||
@ -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]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -61,6 +61,9 @@ public interface IHyosungPlcService
|
||||
Task WritePrintLableOptionsAsync(int side);
|
||||
|
||||
Task WritePrintLabelResultAsync(int index, bool result);
|
||||
|
||||
|
||||
Task WriteScanEntryResultAsync(int index, bool result);
|
||||
|
||||
/// <summary>
|
||||
/// Plc请求扫描产品
|
||||
@ -98,4 +101,6 @@ public interface IHyosungPlcService
|
||||
event Func<int, int, Task> OnRequestPrintLabel;
|
||||
|
||||
event Func<string, Task> OnRequestGetPrintLableOption;
|
||||
|
||||
event Func<int, Task> OnRequestScanEntry;
|
||||
}
|
@ -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)
|
||||
|
@ -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);
|
||||
@ -105,7 +144,7 @@ public class HyosungScannerService : IHyosungScannerService
|
||||
List<Task<string>> ls = _yarnScanners.Select(scanner => scanner.ScanAsync()).ToList();
|
||||
|
||||
//停止所有的扫码枪
|
||||
|
||||
|
||||
while (ls.Count > 0)
|
||||
{
|
||||
// 使用 Task.WhenAny 方法等待任意一个任务完成
|
||||
@ -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,13 +174,13 @@ 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();
|
||||
return await _fixtureScanners[fixtureId].ScanAsync();
|
||||
}
|
||||
|
||||
|
||||
//string code = "";
|
||||
//do
|
||||
//{
|
||||
@ -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();
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
@ -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,10 +49,48 @@ 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");
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user