From 6a4463810e276b62356d77c88509fa6fa7af65cf Mon Sep 17 00:00:00 2001 From: kingno <30263@KINGNO> Date: 星期三, 23 七月 2025 15:46:33 +0800 Subject: [PATCH] mes数据逻辑上传完善,缺陷代码完善,添加S4工位的S2结果上传Plc的通信日志mes优化 --- src/Bro.M141.Process/M141Process_ImageCheck.cs | 292 ++++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 262 insertions(+), 30 deletions(-) diff --git a/src/Bro.M141.Process/M141Process_ImageCheck.cs b/src/Bro.M141.Process/M141Process_ImageCheck.cs index 78e0296..91dc61d 100644 --- a/src/Bro.M141.Process/M141Process_ImageCheck.cs +++ b/src/Bro.M141.Process/M141Process_ImageCheck.cs @@ -2,11 +2,17 @@ using Bro.Common.Helper; using Bro.Common.Interface; using Bro.Common.Model; +using Bro.DataBase.Model; using Bro.M135.Common; +using Bro.M135.DBManager; using HalconDotNet; using Microsoft.VisualBasic; using Newtonsoft.Json; using Newtonsoft.Json.Linq; +using NPOI.SS.Formula.Functions; +using NPOI.SS.UserModel; +using NPOI.Util; +using NPOI.XSSF.UserModel; using Sunny.UI; using System.Data; using System.Data.SqlTypes; @@ -28,6 +34,9 @@ Dictionary<string, List<double>> dicdate = new Dictionary<string, List<double>>(); ManualResetEvent set1 = new ManualResetEvent(false); ManualResetEvent set2 = new ManualResetEvent(false); + + + public event Action<string> StartPrinter; [ProcessMethod("ImageCheck", "ImageCheckOperation", "閫氱敤鍥剧墖妫�娴嬫搷浣�", InvokeType.TestInvoke)] public ResponseMessage ImageCheckOperation(IOperationConfig config, IDevice invokeDevice, IDevice sourceDevice) @@ -442,7 +451,8 @@ public ResponseMessage ProductDataUpload(IOperationConfig config, IDevice invokeDevice, IDevice sourceDevice) { ResponseMessage msg = new ResponseMessage(); - string inputSequence = Plc1.Read(1536, 1, out _)[0].ToString(); + int numplca = Plc1.Read(1536, 1, out _)[0]; + string inputSequence = numplca.ToString(); var productList = new List<int>() { 1 }.Select(u => { @@ -450,6 +460,10 @@ return FindProductBySequence(sequence, true); }).ToList(); + if (PlcNumForAll == -1) + { + PlcNumForAll = numplca; + } int waitInterval = 300; int repeatTime = M141Config.DetectTimeout / waitInterval; @@ -474,33 +488,241 @@ } while (true); - var Defaultclass = M141Config.DefectClassCollection.FirstOrDefault(u => u.IsDefault); - productList.ForEach(p => - { - if (Defaultclass == null) - { - if (string.IsNullOrEmpty(p.Result)) - { - p.Result = "NG"; - } - } - else - { - if (string.IsNullOrEmpty(p.Result)) - { - p.Result = Defaultclass.ClassName; - } - } + var Defaultclass = M141Config.DefectClassCollection.FirstOrDefault(u => u.ClassName == productList[0].Result); - Plc1.WriteSingleAddress(1526, p.Result.ToUpper().Contains("NG") ? 2 : 1, out _); - }); + if (M141Config.StationCode == "S4" && productList[0].Result == "OK") + { + ////mysqlhelper.GetS2Result(productList[0].SEQUENCE); + Plc1.WriteSingleAddress(1526, mysqlhelper.GetS2Result(productList[0].SEQUENCE) ? 1 : 2, out _); + + LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"浜у搧{string.Join(",", productList.Select(u => u.PID))}妫�娴嬪弽棣坽mysqlhelper.GetS2Result(productList[0].SEQUENCE)}"); + + } + else + { + Plc1.WriteSingleAddress(1526, Defaultclass?.ClassValue ?? 2, out _); + } + Plc1.WriteSingleAddress(1516, 1, out _); + + //if (M141Config.ISupMES && (M141Config.MESchannel == -1 || M141Config.MESchannel == 1)) + //{ + // if (M141Config.numpro >= 50) + // { + // M141Config.numpro = 0; + // } + + // if (productList[0].Result == "OK") + // { + // M141Config.numpro++; + // } + + // //mqtt.demes(productList[0], M141Config.zwoid); + // string Msgreceice = Task.Run(() => mqtt.MESForProduceAsync(productList[0], M141Config.zwoid, M141Config.numpro)).Result; + // if (Msgreceice == null) + // { + // LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"浜у搧{productList[0].PID}鏁版嵁涓婁紶MES寮傚父 杩斿洖鏁版嵁涓簄ull"); + // } + // else + // { + // try + // { + // var obj = JsonConvert.DeserializeObject<AutoLineMacBarcodeQueueBak>(Msgreceice); + + // if (obj.zstatus == "200") + // { + // LogAsync(DateTime.Now, EnumHelper.LogLevel.Assist, $"浜у搧{productList[0].PID}鏁版嵁涓婁紶MES鎴愬姛 {Msgreceice}"); + // } + // else + // { + // LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"浜у搧{productList[0].PID}鏁版嵁涓婁紶MES澶辫触 {Msgreceice}"); + // } + // } + // catch + // { + // LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"浜у搧{productList[0].PID}鏁版嵁涓婁紶MES寮傚父 {Msgreceice}"); + // } + // } + + + + // lock (plcnumlock) + // { + // int differ = numplca - PlcNumForAll; + // if (differ > 1) + // { + // for (int i = PlcNumForAll + 1; i < numplca; i++) + // { + // try + // { + // var plist = mysqlhelper.GetProductList(i + "_1"); + // ProductModel newp = new ProductModel(); + // newp.SEQUENCE = plist[0].SEQUENCE; + // newp.PID = plist[0].PID; + // newp.BasketCode = plist[0].BasketCode; + // newp.Result = "NG"; + // newp.SN = plist[0].SN; + // var tems = Task.Run(() => mqtt.MESForProduceAsync(newp, M141Config.zwoid, M141Config.numpro)).Result; + + // } + // catch + // { + + // } + // } + // } + // else if (differ != -29998) + // { + // for (int i = PlcNumForAll + 1; i <= 29999; i++) + // { + // try + // { + // var plist = mysqlhelper.GetProductList(i + "_1"); + // ProductModel newp = new ProductModel(); + // newp.SEQUENCE = plist[0].SEQUENCE; + // newp.PID = plist[0].PID; + // newp.BasketCode = plist[0].BasketCode; + // newp.Result = "NG"; + // newp.SN = plist[0].SN; + // var tems = Task.Run(() => mqtt.MESForProduceAsync(newp, M141Config.zwoid, M141Config.numpro)).Result; + + // } + // catch + // { + + // } + // } + + + + // for (int i = 1; i < numplca; i++) + // { + // try + // { + // var plist = mysqlhelper.GetProductList(i + "_1"); + // ProductModel newp = new ProductModel(); + // newp.SEQUENCE = plist[0].SEQUENCE; + // newp.PID = plist[0].PID; + // newp.BasketCode = plist[0].BasketCode; + // newp.Result = "NG"; + // newp.SN = plist[0].SN; + // var tems = Task.Run(() => mqtt.MESForProduceAsync(newp, M141Config.zwoid, M141Config.numpro)).Result; + + // } + // catch + // { + + // } + // } + + + // } + // PlcNumForAll = numplca; + // } + + //} return msg; } + object plcnumlock = new object(); + int PlcNumForAll = -1; + + private bool _isDemoStarted = false; + [ProcessMethod("OfflineDemo", "OfflineDemo", "绂荤嚎娴嬭瘯", InvokeType.CalibInvoke)] + public ResponseMessage OfflineDemo(IOperationConfig config, IDevice invokeDevice, IDevice sourceDevice) + { + if (config is OfflineDemoOperationConfig opConfig) + { + if (_isDemoStarted) + { + _isDemoStarted = false; + } + else + { + _isDemoStarted = true; + OfflineDemoAsync(opConfig.ImageFolder, opConfig.IsOK, opConfig.SaveImageTime); + } + } + + return new ResponseMessage(); + } + + private async void OfflineDemoAsync(string imageFolder, bool isok, int saveimagetime) + { + await Task.Run(() => + { + var imageFileNames = new DirectoryInfo(imageFolder).GetFiles().Select(u => u.FullName).ToList(); + + for (int i = 0; i < imageFileNames.Count; i++) + { + if (!_isDemoStarted) + { + return; + } + var imageFile = Path.GetFileNameWithoutExtension(imageFileNames[i]); + if (imageFile.EndsWith("Fit")) + { + continue; + } + if (imageFile.EndsWith("OK") & isok == false) + { + continue; + } + if (imageFile.EndsWith("NG") & isok == true) + { + continue; + } + var nameDatas = imageFile.Split(new char[] { '_' }, StringSplitOptions.RemoveEmptyEntries).ToList(); + if (nameDatas.Count != 5) + { + LogAsync(DateTime.Now, EnumHelper.LogLevel.Error, $"鏂囦欢{imageFile}鍛藉悕涓嶇鍚堣鑼冿紝涓嶆墽琛岀绾挎祴璇�"); + continue; + } + + var sn = nameDatas[0] + "_1"; + var imageSeq = nameDatas[2][^1].ToString(); + var measureBind = M141Config.MeasureBindCollection.FirstOrDefault(u => u.ImageSaveSeq == imageSeq); + + if (measureBind == null || !measureBind.IsFixed) + { + LogAsync(DateTime.Now, EnumHelper.LogLevel.Assist, $"绂荤嚎娴嬭瘯锛屽伐浣峽(measureBind == null ? "鏈尮閰�" : $"{measureBind.WorkPosition}鏈紑鍚�")}"); + continue; + } + + LogAsync(DateTime.Now, EnumHelper.LogLevel.Action, $"绂荤嚎娴嬭瘯锛屼骇鍝亄sn}寮�濮嬪伐浣峽measureBind.WorkPosition}绂荤嚎妫�娴�"); + MLImageSet imgSet = new MLImageSet(); + + imgSet.HImage = new HalconDotNet.HImage(imageFileNames[i]); + imgSet.PID = sn; + + var detectResults = ML.RunMLDetectionSync(imgSet, null, measureBind.DetectionId); + Thread.Sleep(saveimagetime); + imgSet.HImage?.Dispose(); + imgSet.HImage = null; + + } + }); + } + + [ProcessMethod("printer", "printer", "鎵撳嵃鏈烘墦鍗�", InvokeType.TestInvoke)] + public ResponseMessage Printer(IOperationConfig config, IDevice invokeDevice, IDevice sourceDevice) + { + ResponseMessage msg = new ResponseMessage(); + + Plc2 = invokeDevice as PLCBase; + string message = ""; + StartPrinter.Invoke(message); + return msg; + } + + + public void PlcwritePrinter(int add, int value) + { + Plc2.WriteSingleAddress(add, value, out _); + } @@ -515,9 +737,10 @@ var spec = M141Config.SpecCollection.FirstOrDefault(s => s.Code == u.SpecCode); if (spec != null) { - var temp = spec.Copy<Spec>(); + var temp = spec.Copy(); temp.ActualValue = null; temp.MeasureResult = null; + temp.Source = ""; specList.Add(temp); } }); @@ -539,6 +762,9 @@ }); return specList; } + + + protected void FillSpecResults(string pid, List<ISpec> detectSpec, List<double> results, string SEQUENCE) { @@ -563,8 +789,6 @@ } } - - LogAsync(DateTime.Now, EnumHelper.LogLevel.Assist, $"浜у搧{pid}妫�娴嬮」{s.Code}璧嬪�納s.GetMeasureValueStr()}锛岀粨鏋渰s.GetMeasureResultStr()}"); } else @@ -587,12 +811,21 @@ { isOK = false; + int num = 0; + + while (p.Details.Any(u => !u.IsDone) && num < 10) + { + num++; + Thread.Sleep(500); + } + + p.InitialDetailSpecs(); var resultList = p.Details.SelectMany(u => u.ResultList).ToList(); resultList.ForEach(u => u.SetResult()); var defects = resultList.GetDefectDescList(); - var ngSpecCodes = p.Details.SelectMany(u => u.SpecList ?? new List<Spec>()).Where(u => u.MeasureResult != true).Select(u => u.Code); + var ngSpecCodes = p.Details.SelectMany(u => u.SpecList ?? new List<ISpec>()).Where(u => u.MeasureResult != true).Select(u => u.Code); var ngDefectDescList = p.Details.SelectMany(u => u.DefectList ?? new List<string>()).ToList(); defects.AddRange(ngSpecCodes); @@ -602,16 +835,18 @@ { defects.Add("TBD"); } + + defects = defects.Distinct().ToList(); isOK = defects.Count <= 0; UpdateDefectAsync(defects); var defectClass = GetDefectClassFromDefectList(defects); - UpdateResult(DateTime.Now, p.SN, defectClass.ClassName, ""); + UpdateResult(DateTime.Now, p.SN, defectClass.ClassName, "", p.ImagePaths); //浜у搧搴忓彿+1 - Interlocked.Increment(ref _productIndex); + //Interlocked.Increment(ref _productIndex); List<ISpec> specList = new List<ISpec>(); specList.AddRange(p.Details.SelectMany(u => u.SpecList).ToList().ConvertAll(u => (ISpec)u)); @@ -638,10 +873,7 @@ _taskFactory.StartNew(() => { - if (string.IsNullOrWhiteSpace(_csvHead)) - { - _csvHead = p.GetCSVHead(ref _specHeadList, ref _positionList); - } + _csvHead = p.GetCSVHead(ref _specHeadList, ref _positionList); CSVRecordAsync($"ProductRecord_{DateTime.Now.ToString("yyyyMMdd")}.csv", p.GetCSVData(_specHeadList, _positionList), _csvHead); //_manager_P_Product.UpdateProductResult(p.ID, p.PID, p.SN, p.Result); }); -- Gitblit v1.8.0