diff --git a/Seyounth.Hyosung.Core/Plc/HyosungPlcService.cs b/Seyounth.Hyosung.Core/Plc/HyosungPlcService.cs index ab449a4..923d337 100644 --- a/Seyounth.Hyosung.Core/Plc/HyosungPlcService.cs +++ b/Seyounth.Hyosung.Core/Plc/HyosungPlcService.cs @@ -47,7 +47,7 @@ public class HyosungPlcService(ILogger 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 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 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 logger) : IHyosungPlcS public event Func? OnPlcRequestPackLineOption; - public event Func? OnRequestPrintLabel; + public event Func? OnRequestPrintLabel; public event Func OnRequestGetPrintLableOption; + public event Func? OnRequestScanEntry; private async Task ReadLoop(CancellationToken token) { @@ -165,10 +174,11 @@ public class HyosungPlcService(ILogger 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 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 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 logger) : IHyosungPlcS if (requestPrintLabel[1] == 1) { - await _writer.WriteShortsAsync(13011, 0); await _writer.WriteShortsAsync(13012, 0); OnRequestPrintLabel?.Invoke(2, requestPrintLabel[2]); } } - - } \ No newline at end of file diff --git a/Seyounth.Hyosung.Core/Plc/IHyosungPlcService.cs b/Seyounth.Hyosung.Core/Plc/IHyosungPlcService.cs index d5e0ab4..e16d3e3 100644 --- a/Seyounth.Hyosung.Core/Plc/IHyosungPlcService.cs +++ b/Seyounth.Hyosung.Core/Plc/IHyosungPlcService.cs @@ -61,6 +61,9 @@ public interface IHyosungPlcService Task WritePrintLableOptionsAsync(int side); Task WritePrintLabelResultAsync(int index, bool result); + + + Task WriteScanEntryResultAsync(int index, bool result); /// /// Plc请求扫描产品 @@ -98,4 +101,6 @@ public interface IHyosungPlcService event Func OnRequestPrintLabel; event Func OnRequestGetPrintLableOption; + + event Func OnRequestScanEntry; } \ No newline at end of file diff --git a/Seyounth.Hyosung.Core/Scanner/HikScanner.cs b/Seyounth.Hyosung.Core/Scanner/HikScanner.cs index e3294af..5cdf384 100644 --- a/Seyounth.Hyosung.Core/Scanner/HikScanner.cs +++ b/Seyounth.Hyosung.Core/Scanner/HikScanner.cs @@ -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) diff --git a/Seyounth.Hyosung.Core/Scanner/HyosungScannerService.cs b/Seyounth.Hyosung.Core/Scanner/HyosungScannerService.cs index e8da46d..4ebfd01 100644 --- a/Seyounth.Hyosung.Core/Scanner/HyosungScannerService.cs +++ b/Seyounth.Hyosung.Core/Scanner/HyosungScannerService.cs @@ -12,7 +12,8 @@ public class HyosungScannerService : IHyosungScannerService private readonly ConcurrentDictionary _fixtureScanners = new(); - + private readonly List _carScanners = new(); + private readonly List _varietyScanners = new(); private List lastCodes = new List(); @@ -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(); + 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; + if (innerTask.Result == timeoutTask) + { + // 处理纱线扫描器连接超时的情况 + Console.WriteLine($"产品扫描器连接超时"); + } + } + + foreach (var task in carScannerTasks) + { + var innerTask = task as 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> 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 ScanYarnCarAsync(int entryId) + { + return await _carScanners[entryId - 1].ScanAsync(); + } + + public async Task ScanVarietyAsync(int entryId) + { + return await _varietyScanners[entryId - 1].ScanAsync(); + } } \ No newline at end of file diff --git a/Seyounth.Hyosung.Core/Scanner/IHyosungScannerService.cs b/Seyounth.Hyosung.Core/Scanner/IHyosungScannerService.cs index e136916..324333d 100644 --- a/Seyounth.Hyosung.Core/Scanner/IHyosungScannerService.cs +++ b/Seyounth.Hyosung.Core/Scanner/IHyosungScannerService.cs @@ -21,4 +21,8 @@ public interface IHyosungScannerService /// /// Task ScanFixtureAsync(int fixtureId); + + Task ScanYarnCarAsync(int entryId); + + Task ScanVarietyAsync(int entryId); } \ No newline at end of file diff --git a/Seyounth.Hyosung.Runtime/HyosungRuntime.cs b/Seyounth.Hyosung.Runtime/HyosungRuntime.cs index 33c0d9c..abb3ac7 100644 --- a/Seyounth.Hyosung.Runtime/HyosungRuntime.cs +++ b/Seyounth.Hyosung.Runtime/HyosungRuntime.cs @@ -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); } /// @@ -337,7 +379,7 @@ public class HyosungRuntime( /// /// /// - 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"); } }