| | |
| | | using HalconDotNet; |
| | | using Newtonsoft.Json; |
| | | using Newtonsoft.Json.Linq; |
| | | using NPOI.OpenXmlFormats.Vml; |
| | | using NPOI.POIFS.Crypt.Dsig; |
| | | using NPOI.POIFS.FileSystem; |
| | | using NPOI.SS.Formula.Functions; |
| | | using NPOI.XSSF.Streaming.Values; |
| | | using ScottPlot.Drawing.Colormaps; |
| | | using System; |
| | | using System.Collections.Concurrent; |
| | | using System.Collections.Generic; |
| | | using System.Net.Sockets; |
| | | using System.Text.RegularExpressions; |
| | | using Windows.Media.AppBroadcasting; |
| | | using static Bro.Common.Helper.EnumHelper; |
| | | using static NPOI.HSSF.Util.HSSFColor; |
| | | using static Org.BouncyCastle.Crypto.Engines.SM2Engine; |
| | |
| | | } |
| | | |
| | | |
| | | [ProcessMethod("ImageCheck", "CheckProduction", "产品点检", InvokeType.TestInvoke)] |
| | | public ResponseMessage CheckProduction(IOperationConfig config, IDevice invokeDevice, IDevice sourceDevice) |
| | | { |
| | | ResponseMessage msg = new ResponseMessage(); |
| | | |
| | | if (config is IImageCheckOperationConfig opConfig) |
| | | { |
| | | var results1 = GetSpecListFromConfigSelection(opConfig.SpecCollection); |
| | | IImageSet imageSet = null; |
| | | string Head = "时间,"; |
| | | string data = $"{DateTime.Now.ToString("yyyyMMddHHmmss")}T,"; |
| | | try |
| | | { |
| | | var messure = M141Config.MeasureBindCollection_Check.FirstOrDefault(u => u.CameraId == invokeDevice.Id); |
| | | var camera = DeviceCollection.FirstOrDefault(u => u.Id == messure.CameraId) as CameraBase; |
| | | try |
| | | { |
| | | imageSet = CollectHImage(camera, messure.SnapshotOpConfig); |
| | | } |
| | | catch (Exception exx) |
| | | { |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"点检功能获取图像失败{exx.ToString()}"); |
| | | } |
| | | var tool = GetHalconTool(null, "", opConfig.AlgorithemPath); |
| | | var ret = tool.RunProcedure(null, new Dictionary<string, HalconDotNet.HObject>() { { "INPUT_Image", imageSet.HImage } }, new List<string>() { "OUTPUT_Results" }, null); |
| | | // var ret = tool.RunProcedure(null, null, new List<string>() { "OUTPUT_Results" }, null); |
| | | List<IShapeElement> eleList = new List<IShapeElement>(); |
| | | TextDisplay text = new TextDisplay(); |
| | | text.LineLimit = M141Config.LineLimit_p; |
| | | text.FontSize = M141Config.FontSize_p; |
| | | eleList.Add(text); |
| | | text.StartX = text.StartY = 0; |
| | | text.AddText("点检运行成功", Color.Lime, Color.Transparent); |
| | | |
| | | var b = ret.Item2["OUTPUT_Results"].HTupleToDouble(); |
| | | |
| | | if (results1 != null&& results1.Count== b.Count()) |
| | | { |
| | | |
| | | var itemDict = results1.ToDictionary(u => u.OutputIndex); |
| | | |
| | | for (int i = 0; i < itemDict.Count(); i++) |
| | | { |
| | | double CValue; |
| | | if (itemDict[i].CompensationValue != null) |
| | | { |
| | | CValue = itemDict[i].CompensationValue[0]; |
| | | } |
| | | else |
| | | { |
| | | CValue = 0; |
| | | } |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Action, $"点检结果{itemDict[i].Code}算法输出值为{b[i]}"); |
| | | double diff = b[i] + CValue; |
| | | double Upvalue = itemDict[i].StandardValue + itemDict[i].Tolrenance_Positive; |
| | | double Downvalue = itemDict[i].StandardValue - itemDict[i].Tolrenance_Negative; |
| | | bool isInTolerance = false; |
| | | |
| | | if (diff >= Downvalue && diff <= Upvalue) |
| | | { |
| | | isInTolerance = true; |
| | | } |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Action, $"点检结果{itemDict[i].Code}为{isInTolerance}"); |
| | | text.AddText($"{itemDict[i].Code} {diff}", isInTolerance == true ? Color.Lime : Color.Red, Color.Transparent); |
| | | Head += $"{itemDict[i].Code},"; |
| | | data += $"{diff},"; |
| | | } |
| | | } |
| | | camera.SaveFitImage(eleList, imageSet); |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Action, $"点检功能运行成功"); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"点检功能失败,{ex.ToString()}"); |
| | | } |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Action, $"点检图片开始释放"); |
| | | imageSet.HImage?.Dispose(); |
| | | imageSet.HImage = null; |
| | | imageSet.Dispose(); |
| | | imageSet = null; |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Action, $"图片已释放"); |
| | | //报表输出 |
| | | CSVRecordAsync($"相机{invokeDevice.Name}_点检数据记录.csv", data, Head); |
| | | } |
| | | return msg; |
| | | } |
| | | |
| | | [ProcessMethod("ImageCheck", "ReadBarcode", "读码", InvokeType.TestInvoke)] |
| | | public ResponseMessage ReadBarcode(IOperationConfig config, IDevice invokeDevice, IDevice sourceDevice) |
| | | { |
| | |
| | | { |
| | | codestr = "10"; |
| | | } |
| | | |
| | | if (codestr.Equals(mh.ToString())) |
| | | { |
| | | ret.Add(1); |
| | |
| | | } |
| | | |
| | | FillSpecResults(results[0].PID, results[0].Specs, ret, opConfig.Products[0].SEQUENCE); |
| | | |
| | | |
| | | opConfig.Products[0].SN = barcode; |
| | | opConfig.Products[0].PID = barcode + "_1"; |
| | |
| | | } |
| | | return msg; |
| | | } |
| | | |
| | | |
| | | [ProcessMethod("ImageCheck", "ReadBarcode2", "读栏具码", InvokeType.TestInvoke)] |
| | | public ResponseMessage ReadBarcode2(IOperationConfig config, IDevice invokeDevice, IDevice sourceDevice) |
| | |
| | | string zwordstr = Task.Run(() => mqtt.MESForBasketAsync("2", "DS02217", barcode, "1", ConfigAOI1.mesnum2.ToString())).Result; |
| | | |
| | | ConfigAOI1.mesnum2++; |
| | | |
| | | try |
| | | if (ConfigAOI1.ISokMes) |
| | | { |
| | | var obj = JsonConvert.DeserializeObject<AutoLineMacQueueBak>(zwordstr); |
| | | ConfigAOI1.zwoid = obj.zwoid; |
| | | if (!string.IsNullOrEmpty(obj.zwoid) && obj.zstatus == "200") |
| | | Plc1.WriteSingleAddress(1524, 1, out _); |
| | | Plc1.WriteSingleAddress(1514, 1, out _); |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Information, $"已强制读栏具码运行设备"); |
| | | } |
| | | else |
| | | { |
| | | try |
| | | { |
| | | Plc1.WriteSingleAddress(1524, 1, out _); |
| | | Plc1.WriteSingleAddress(1514, 1, out _); |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Information, $"RabbitMQ zwoid获取成功 {obj.zstatus} {obj.zwoid} "); |
| | | var obj = JsonConvert.DeserializeObject<AutoLineMacQueueBak>(zwordstr); |
| | | ConfigAOI1.zwoid = obj.zwoid; |
| | | if (!string.IsNullOrEmpty(obj.zwoid) && obj.zstatus == "200") |
| | | { |
| | | Plc1.WriteSingleAddress(1524, 1, out _); |
| | | Plc1.WriteSingleAddress(1514, 1, out _); |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Information, $"RabbitMQ zwoid获取成功 {obj.zstatus} {obj.zwoid} "); |
| | | } |
| | | else |
| | | { |
| | | try |
| | | { |
| | | if (zwordstr.Contains("version错误")) |
| | | { |
| | | Regex reg = new Regex("[0-9]+", RegexOptions.IgnoreCase | RegexOptions.Singleline, TimeSpan.FromSeconds(2)); |
| | | MatchCollection matches = reg.Matches(obj.zerrmsg); |
| | | if (matches[0] != null && matches.Count == 3) |
| | | { |
| | | ConfigAOI1.mesnum2 = int.Parse(matches[0].Value)+1; |
| | | } |
| | | else |
| | | { |
| | | ConfigAOI1.mesnum2 = 0; |
| | | } |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | } |
| | | Plc1.WriteSingleAddress(1524, 2, out _); |
| | | Plc1.WriteSingleAddress(1514, 1, out _); |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Information, $"RabbitMQ zwoid获取失败 {zwordstr} "); |
| | | } |
| | | } |
| | | else |
| | | catch(Exception ex) |
| | | { |
| | | Plc1.WriteSingleAddress(1524, 2, out _); |
| | | Plc1.WriteSingleAddress(1514, 1, out _); |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Information, $"RabbitMQ zwoid获取失败 {zwordstr} "); |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"RabbitMQ zwoid获取异常 返回数据为 {zwordstr},异常错误{ex.GetExceptionMessage()}"); |
| | | } |
| | | } |
| | | catch |
| | | { |
| | | Plc1.WriteSingleAddress(1524, 2, out _); |
| | | Plc1.WriteSingleAddress(1514, 1, out _); |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"RabbitMQ zwoid获取异常 返回数据为 {zwordstr} "); |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Information, $"已关闭mes连接"); |
| | | Plc1.WriteSingleAddress(1524, 1, out _); |
| | | Plc1.WriteSingleAddress(1514, 1, out _); |
| | | } |
| | |
| | | |
| | | return msg; |
| | | } |
| | | |
| | | |
| | | private string BarcodeScannerCommunicate(TcpClientWrapBase client) |
| | | { |
| | |
| | | return "NOREAD"; |
| | | } |
| | | |
| | | |
| | | private bool CheckBarcodeValid(string barcode) |
| | | { |
| | | bool isBarcodeValid = true; |
| | |
| | | } |
| | | return isBarcodeValid; |
| | | } |
| | | |
| | | |
| | | [ProcessMethod("ImageCheck", "CheckLineProfile", "检测产品线轮廓度", InvokeType.TestInvoke)] |
| | | public ResponseMessage CheckLineProfile(IOperationConfig config, IDevice invokeDevice, IDevice sourceDevice) |
| | |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Detail, $"检测产品线轮廓度输入点数据 {string.Join(',', pointdataF)}"); |
| | | |
| | | var tool = GetHalconTool(null, "", opConfig.AlgorithemPath); |
| | | var ret = tool.RunProcedure(new Dictionary<string, HalconDotNet.HTuple>() { { "INPUT_Points", pointdataF.ToArray() } }, new Dictionary<string, HalconDotNet.HObject>() { { "INPUT_Image", opConfig.ImageSet.HImage } }, new List<string>() { "OUTPUT_Results", "OUTPUT_PointZ" }, null); |
| | | |
| | | var ret = tool.RunProcedure(new Dictionary<string, HalconDotNet.HTuple>() { { "INPUT_Points", pointdataF.ToArray() } }, new Dictionary<string, HalconDotNet.HObject>() { { "INPUT_Image", opConfig.ImageSet.HImage } }, new List<string>() { "OUTPUT_Results", "OUTPUT_PointZ" }, null); |
| | | if (ret == null) |
| | | { |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"脚本{opConfig.AlgorithemPath}运行异常,返回值为null"); |
| | |
| | | if (datasZ.Count == CheckPointList.Count) |
| | | { |
| | | string Postion = "P" + opConfig.TriggerStr.Split('#')[0]; |
| | | string csvhead = "Time,Pid,Postion"; |
| | | string csvhead = "Time,Pid" + |
| | | ",Postion"; |
| | | string csvdata = $"{DateTime.Now.ToString("yyyyMMddHHmmss")}T,{results[0].PID},{Postion}"; |
| | | |
| | | for (int i = 0; i < CheckPointList.Count; i++) |
| | |
| | | else |
| | | { |
| | | item.ActualValue = retcal.Item2["OUTPUT_Results"].HTupleToDouble()[0]; |
| | | |
| | | if (item.IsEnableCompensation && item.CompensationValue.Count > 1) |
| | | { |
| | | string index = opConfig.TriggerStr.Split('#')[0]; |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Detail, $"{item.Code}进入双重补偿{index},初始值为{item.ActualValue}"); |
| | | |
| | | if (index=="1") |
| | | { |
| | | item.ActualValue += item.CompensationValue[0]; |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Detail, $"{item.Code}进入双重补偿,补偿值为{item.CompensationValue[0]},最终结果为{item.ActualValue}"); |
| | | } |
| | | else |
| | | { |
| | | item.ActualValue += item.CompensationValue[1]; |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Detail, $"{item.Code}进入双重补偿,补偿值为{item.CompensationValue[1]},最终结果为{item.ActualValue}"); |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Detail, $"{results[0].PID}获取计算公式数据{item.Code} {item.GetMeasureValueStr()}"); |
| | | } |
| | | } |
| | |
| | | |
| | | return msg; |
| | | } |
| | | |
| | | |
| | | [ProcessMethod("ImageCheck", "GetMatrix", "获取矩阵", InvokeType.TestInvoke)] |
| | | public ResponseMessage GetMatrix(IOperationConfig config, IDevice invokeDevice, IDevice sourceDevice) |
| | |
| | | return msg; |
| | | } |
| | | |
| | | [ProcessMethod("", "MESupdata", "MES正常上传单个OK产品获取条码", InvokeType.TestInvoke)] |
| | | public ResponseMessage MESupdata(IOperationConfig config, IDevice invokeDevice, IDevice sourceDevice) |
| | | { |
| | | ResponseMessage msg = new ResponseMessage(); |
| | | |
| | | Plc3 = invokeDevice as PLCBase; |
| | | //上传反馈结果 |
| | | bool Issuccess = false; |
| | | bool Issuccess1 = false; |
| | | |
| | | string tary_label = string.Empty; |
| | | |
| | | string tary_label1 = string.Empty; |
| | | |
| | | var plcnum = Plc3.Read(2100, 1, out _); |
| | | var plcnum1 = Plc3.Read(2102, 1, out _); |
| | | if (plcnum[0] == 0) |
| | | { |
| | | Issuccess = true; |
| | | } |
| | | else |
| | | { |
| | | Issuccess = UpMES(plcnum[0] + "_1", "N", out tary_label); |
| | | if (M141Config.Isprint && !string.IsNullOrEmpty(tary_label)) |
| | | { |
| | | StartPrint(tary_label, "Honeywell PX240S(300 dpi)"); |
| | | } |
| | | } |
| | | if (plcnum1[0] == 0) |
| | | { |
| | | Issuccess1 = true; |
| | | } |
| | | else |
| | | { |
| | | Issuccess1 = UpMES(plcnum1[0] + "_1", "N", out tary_label1); |
| | | |
| | | if (M141Config.Isprint && !string.IsNullOrEmpty(tary_label1)) |
| | | { |
| | | StartPrint(tary_label1, "Honeywell PX240S(300 dpi)"); |
| | | } |
| | | } |
| | | if (Issuccess && Issuccess1) |
| | | { |
| | | Plc3.WriteSingleAddress(2120, 1, out _); |
| | | } |
| | | else |
| | | { |
| | | Plc3.WriteSingleAddress(2120, 2, out _); |
| | | } |
| | | return msg; |
| | | } |
| | | |
| | | [ProcessMethod("", "MESupFinallydata", "MES上传单个尾盘OK产品获取条码", InvokeType.TestInvoke)] |
| | | public ResponseMessage MESupFinallydata(IOperationConfig config, IDevice invokeDevice, IDevice sourceDevice) |
| | | { |
| | | ResponseMessage msg = new ResponseMessage(); |
| | | |
| | | Plc3 = invokeDevice as PLCBase; |
| | | //上传反馈结果 |
| | | bool Issuccess = false; |
| | | bool Issuccess1 = false; |
| | | |
| | | string tary_label = string.Empty; |
| | | |
| | | string tary_label1 = string.Empty; |
| | | |
| | | var plcnum = Plc3.Read(2100, 1, out _); |
| | | var plcnum1 = Plc3.Read(2102, 1, out _); |
| | | if (plcnum[0] != 0|| plcnum1[0] != 0) |
| | | { |
| | | if (plcnum[0] == 0) |
| | | { |
| | | Issuccess1 = UpMES(plcnum1[0] + "_1", "Y", out tary_label1); |
| | | if (M141Config.Isprint && !string.IsNullOrEmpty(tary_label1)) |
| | | { |
| | | StartPrint(tary_label1, "Honeywell PX240S(300 dpi)"); |
| | | } |
| | | } |
| | | else if(plcnum1[0] == 0) |
| | | { |
| | | Issuccess = UpMES(plcnum[0] + "_1", "Y", out tary_label); |
| | | if (M141Config.Isprint && !string.IsNullOrEmpty(tary_label)) |
| | | { |
| | | StartPrint(tary_label, "Honeywell PX240S(300 dpi)"); |
| | | } |
| | | } |
| | | else if (plcnum[0] != 0 && plcnum1[0] != 0) |
| | | { |
| | | Issuccess = UpMES(plcnum[0] + "_1", "N", out tary_label); |
| | | if (M141Config.Isprint && !string.IsNullOrEmpty(tary_label1)) |
| | | { |
| | | StartPrint(tary_label1, "Honeywell PX240S(300 dpi)"); |
| | | } |
| | | Issuccess1 = UpMES(plcnum1[0] + "_1", "Y", out tary_label1); |
| | | if (M141Config.Isprint && !string.IsNullOrEmpty(tary_label)) |
| | | { |
| | | StartPrint(tary_label, "Honeywell PX240S(300 dpi)"); |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (Issuccess && Issuccess1) |
| | | { |
| | | Plc3.WriteSingleAddress(2120, 1, out _); |
| | | } |
| | | else |
| | | { |
| | | Plc3.WriteSingleAddress(2120, 2, out _); |
| | | } |
| | | return msg; |
| | | } |
| | | |
| | | private bool UpMES(string PLCNum ,string endtray , out string result ) |
| | | { |
| | | var plist = mysqlhelper.GetProductList(PLCNum); |
| | | ProductModel newp = new ProductModel(); |
| | | newp.SEQUENCE = plist[0].SEQUENCE; |
| | | newp.PID = plist[0].PID; |
| | | newp.BasketCode = plist[0].BasketCode; |
| | | newp.Zword = plist[0].Zword; |
| | | newp.Result = "OK"; |
| | | newp.SN = plist[0].SN; |
| | | bool isok = UptoMES(newp, endtray, out result); |
| | | return isok; |
| | | |
| | | } |
| | | |
| | | private bool UptoMES( ProductModel pro, string endtray, out string result) |
| | | { |
| | | if (M141Config.numpro >= 50) |
| | | { |
| | | M141Config.numpro = 0; |
| | | } |
| | | M141Config.numpro++; |
| | | var tems = Task.Run(() => mqtt.MESForProduceAsync(pro, M141Config.mesnum2.ToString(), M141Config.numpro, endtray)).Result; |
| | | if (tems == null) |
| | | { |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"产品{pro.PID}数据上传MES异常 返回数据为null"); |
| | | result = string.Empty; |
| | | return false; |
| | | } |
| | | else |
| | | { |
| | | try |
| | | { |
| | | var obj = JsonConvert.DeserializeObject<AutoLineMacBarcodeQueueBak>(tems); |
| | | if (obj.zstatus == "200") |
| | | { |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Assist, $"产品{pro.PID}数据上传MES成功 {tems}"); |
| | | result = obj.tary_label; |
| | | return true; |
| | | } |
| | | else |
| | | { |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"产品{pro.PID}数据上传MES失败 {tems}"); |
| | | result = "obj.zerrmsg"; |
| | | if (obj.zerrmsg.Contains("重复数据")) |
| | | { |
| | | return true; |
| | | } |
| | | return false; |
| | | } |
| | | } |
| | | catch (Exception) |
| | | { |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"产品{pro.PID}数据上传MES失败 {tems}"); |
| | | result = string.Empty; |
| | | return false; |
| | | } |
| | | |
| | | } |
| | | } |
| | | |
| | | [ProcessMethod("", "PLCtosaveproduction", "MES通过plc获取产品PID并保存", InvokeType.TestInvoke)] |
| | | public ResponseMessage PLCtosaveproduction(IOperationConfig config, IDevice invokeDevice, IDevice sourceDevice) |
| | | { |
| | | ResponseMessage msg = new ResponseMessage(); |
| | | |
| | | Plc3 = invokeDevice as PLCBase; |
| | | |
| | | bool Issuccess = false; |
| | | |
| | | bool Issuccess1 = false; |
| | | |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Assist, $"产品信息记录保存触发"); |
| | | |
| | | var plcnum = Plc3.Read(2100, 1, out _); |
| | | Issuccess = GetProImformation(plcnum[0]); |
| | | |
| | | var plcnum1 = Plc3.Read(2102, 1, out _); |
| | | Issuccess1 = GetProImformation(plcnum1[0]); |
| | | |
| | | if (Issuccess && Issuccess1) |
| | | { |
| | | Plc3.WriteSingleAddress(2120, 1, out _); |
| | | } |
| | | else |
| | | { |
| | | Plc3.WriteSingleAddress(2120, 2, out _); |
| | | } |
| | | return msg; |
| | | } |
| | | |
| | | private bool GetProImformation(int PLC_order) |
| | | { |
| | | if (PLC_order == 0) |
| | | { |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Assist, $"PLC反馈机械手吸盘无产品"); |
| | | return true; |
| | | } |
| | | else |
| | | { |
| | | var plist = mysqlhelper.GetProductList(PLC_order + "_1"); |
| | | if (plist != null) |
| | | { |
| | | if (!M141Config.Productioncode.Any(u => u.PID == plist[0].PID)) |
| | | { |
| | | int num = M141Config.Productioncode.Count + 1; |
| | | M141Config.Productioncode.Add(new ProductionID |
| | | { |
| | | Uptomesid = num, |
| | | PID = plist[0].PID, |
| | | SEQUENCE = plist[0].SEQUENCE, |
| | | BasketCode = plist[0].BasketCode, |
| | | Zword = plist[0].Zword, |
| | | //newp.Result = "OK"; |
| | | SN = plist[0].SN |
| | | }); |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Assist, $"产品{plist[0].PID}数据记录成功"); |
| | | return true; |
| | | } |
| | | else |
| | | { |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Error, $"产品{plist[0].PID}数据重复,记录失败"); |
| | | return false; |
| | | } |
| | | } |
| | | else |
| | | { |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Error, $"PLC序号:{PLC_order}无法从数据库中获取数据"); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | [ProcessMethod("", "MEStogetcode", "MES上传整批数据并获取条码", InvokeType.TestInvoke)] |
| | | public ResponseMessage MEStogetcode(IOperationConfig config, IDevice invokeDevice, IDevice sourceDevice) |
| | | { |
| | | ResponseMessage msg = new ResponseMessage(); |
| | | Plc3 = invokeDevice as PLCBase; |
| | | bool Issuccess = false; |
| | | bool Issuccess1 = false; |
| | | |
| | | var plcnum = Plc3.Read(2100, 1, out _); |
| | | Issuccess = GetProImformation(plcnum[0]); |
| | | |
| | | var plcnum1 = Plc3.Read(2102, 1, out _); |
| | | Issuccess1 = GetProImformation(plcnum1[0]); |
| | | |
| | | if (!Issuccess && !Issuccess1) |
| | | { |
| | | Plc3.WriteSingleAddress(2120, 2, out _); |
| | | return msg; |
| | | } |
| | | |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Assist, $"产品信息上传MES触发"); |
| | | |
| | | if (M141Config.Productioncode.Count == 50) |
| | | { |
| | | //产品正常上传 |
| | | while(M141Config.Productioncode.Count>0) |
| | | { |
| | | ProductModel newp = new ProductModel(); |
| | | newp.SEQUENCE = M141Config.Productioncode[0].SEQUENCE; |
| | | newp.PID = M141Config.Productioncode[0].PID; |
| | | newp.BasketCode = M141Config.Productioncode[0].BasketCode; |
| | | newp.Zword = M141Config.Productioncode[0].Zword; |
| | | newp.Result = "OK"; |
| | | newp.SN = M141Config.Productioncode[0].SN; |
| | | string tary_ID = string.Empty; |
| | | bool isok = UptoMES(newp, "N", out tary_ID); |
| | | if (!isok) |
| | | { |
| | | Plc3.WriteSingleAddress(2120, 2, out _); |
| | | } |
| | | if (M141Config.Isprint && !string.IsNullOrEmpty(tary_ID)) |
| | | { |
| | | StartPrint(tary_ID, "Honeywell PX240S(300 dpi)"); |
| | | M141Config.MES_codes.Add(new MES_code |
| | | { |
| | | Printers_code = tary_ID |
| | | }); |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Assist, $"条码:{tary_ID}已触发S6打印并且保存"); |
| | | } |
| | | M141Config.Productioncode.RemoveAt(0); |
| | | } |
| | | } |
| | | else if (M141Config.Productioncode.Count > 50) |
| | | { |
| | | //中途有产品被取走 |
| | | for (int i = 0; i < 50; i++) |
| | | { |
| | | ProductModel newp = new ProductModel(); |
| | | newp.SEQUENCE = M141Config.Productioncode[-1].SEQUENCE; |
| | | newp.PID = M141Config.Productioncode[-1].PID; |
| | | newp.BasketCode = M141Config.Productioncode[-1].BasketCode; |
| | | newp.Zword = M141Config.Productioncode[-1].Zword; |
| | | newp.Result = "OK"; |
| | | newp.SN = M141Config.Productioncode[-1].SN; |
| | | string tary_ID = string.Empty; |
| | | bool isok = UptoMES(newp, "N", out tary_ID); |
| | | if (!isok) |
| | | { |
| | | Plc3.WriteSingleAddress(2120, 2, out _); |
| | | } |
| | | if (M141Config.Isprint && !string.IsNullOrEmpty(tary_ID)) |
| | | { |
| | | StartPrint(tary_ID, "Honeywell PX240S(300 dpi)"); |
| | | M141Config.MES_codes.Add(new MES_code |
| | | { |
| | | Printers_code = tary_ID |
| | | }); |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Assist, $"条码:{tary_ID}已触发S6打印并且保存"); |
| | | } |
| | | M141Config.Productioncode.RemoveAt(-1); |
| | | } |
| | | M141Config.Productioncode.Clear(); |
| | | } |
| | | else if (M141Config.Productioncode.Count < 50) |
| | | { |
| | | //产品缺少需要额外的条码补救 |
| | | while (M141Config.Productioncode.Count > 0) |
| | | { |
| | | ProductModel newp = new ProductModel(); |
| | | newp.SEQUENCE = M141Config.Productioncode[0].SEQUENCE; |
| | | newp.PID = M141Config.Productioncode[0].PID; |
| | | newp.BasketCode = M141Config.Productioncode[0].BasketCode; |
| | | newp.Zword = M141Config.Productioncode[0].Zword; |
| | | newp.Result = "OK"; |
| | | newp.SN = M141Config.Productioncode[0].SN; |
| | | string tary_ID = string.Empty; |
| | | bool isok = false; |
| | | |
| | | if (M141Config.Productioncode.Count==1) |
| | | { |
| | | isok = UptoMES(newp, "Y", out tary_ID); |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Assist, $"产品{newp.PID}触发零数尾盘"); |
| | | } |
| | | else |
| | | { |
| | | isok = UptoMES(newp, "N", out tary_ID); |
| | | } |
| | | if (!isok) |
| | | { |
| | | Plc3.WriteSingleAddress(2120, 2, out _); |
| | | } |
| | | if (M141Config.Isprint && !string.IsNullOrEmpty(tary_ID)) |
| | | { |
| | | StartPrint(tary_ID, "Honeywell PX240S(300 dpi)"); |
| | | M141Config.MES_codes.Add(new MES_code |
| | | { |
| | | Printers_code = tary_ID |
| | | }); |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Assist, $"条码:{tary_ID}已触发S6打印并且保存"); |
| | | } |
| | | M141Config.Productioncode.RemoveAt(0); |
| | | } |
| | | } |
| | | if (Issuccess && Issuccess1) |
| | | { |
| | | Plc3.WriteSingleAddress(2120, 1, out _); |
| | | } |
| | | else |
| | | { |
| | | Plc3.WriteSingleAddress(2120, 2, out _); |
| | | } |
| | | return msg; |
| | | } |
| | | |
| | | [ProcessMethod("", "MESup1", "MES上传进料口空篮", InvokeType.TestInvoke)] |
| | | public ResponseMessage MESup1(IOperationConfig config, IDevice invokeDevice, IDevice sourceDevice) |
| | |
| | | if (ConfigAOI1.ISupMES) |
| | | { |
| | | string Msg = Task.Run(() => mqtt.MESForBasketAsync("1", "DS02216", "", "0", ConfigAOI1.mesnum1.ToString())).Result; |
| | | if (Msg != null) |
| | | { |
| | | try |
| | | { |
| | | var obj = JsonConvert.DeserializeObject<AutoLineMacQueueBak>(Msg); |
| | | if (obj?.zstatus == "200") |
| | | { |
| | | ConfigAOI1.mesnum1++; |
| | | Plc1.WriteSingleAddress(1590, 1, out _); |
| | | } |
| | | else |
| | | { |
| | | Plc1.WriteSingleAddress(1590, 2, out _); |
| | | } |
| | | LogAsync(DateTime.Now, obj?.zstatus == "200" ? EnumHelper.LogLevel.Information : EnumHelper.LogLevel.Exception, $"RabbitMQ 篮具 进料口空篮 上传{(obj?.zstatus == "200" ? "成功" : "失败")} {obj?.zstatus}"); |
| | | |
| | | } |
| | | catch |
| | | { |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"RabbitMQ 篮具 进料口空篮 获取返回值解析异常 返回数据{Msg} "); |
| | | Plc1.WriteSingleAddress(1590, 2, out _); |
| | | } |
| | | if (ConfigAOI1.ISokMes) |
| | | { |
| | | ConfigAOI1.mesnum1++; |
| | | Plc1.WriteSingleAddress(1590, 1, out _); |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"已强制MES上传进料口空篮"); |
| | | } |
| | | else |
| | | { |
| | | Plc1.WriteSingleAddress(1590, 2, out _); |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"RabbitMQ 篮具 进料口空篮 获取返回值失败 返回数据null "); |
| | | } |
| | | if (Msg != null) |
| | | { |
| | | try |
| | | { |
| | | var obj = JsonConvert.DeserializeObject<AutoLineMacQueueBak>(Msg); |
| | | if (obj?.zstatus == "200") |
| | | { |
| | | ConfigAOI1.mesnum1++; |
| | | Plc1.WriteSingleAddress(1590, 1, out _); |
| | | } |
| | | else |
| | | { |
| | | try |
| | | { |
| | | if (Msg.Contains("version错误")) |
| | | { |
| | | Regex reg = new Regex("[0-9]+", RegexOptions.IgnoreCase | RegexOptions.Singleline, TimeSpan.FromSeconds(2)); |
| | | MatchCollection matches = reg.Matches(obj.zerrmsg); |
| | | if (matches[0] != null && matches.Count == 3) |
| | | { |
| | | ConfigAOI1.mesnum1 = int.Parse(matches[0].Value)+ 1; |
| | | } |
| | | else |
| | | { |
| | | ConfigAOI1.mesnum1 = 0; |
| | | } |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | } |
| | | Plc1.WriteSingleAddress(1590, 2, out _); |
| | | } |
| | | LogAsync(DateTime.Now, obj?.zstatus == "200" ? EnumHelper.LogLevel.Information : EnumHelper.LogLevel.Exception, $"RabbitMQ 篮具 进料口空篮 上传{(obj?.zstatus == "200" ? "成功" : "失败")} {obj?.zstatus}"); |
| | | |
| | | } |
| | | catch |
| | | { |
| | | |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"RabbitMQ 篮具 进料口空篮 获取返回值解析异常 返回数据{Msg} "); |
| | | Plc1.WriteSingleAddress(1590, 2, out _); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | Plc1.WriteSingleAddress(1590, 2, out _); |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"RabbitMQ 篮具 进料口空篮 获取返回值失败 返回数据null "); |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Information, $"已关闭mes连接"); |
| | | Plc1.WriteSingleAddress(1590, 1, out _); |
| | | |
| | | } |
| | | |
| | | return msg; |
| | | } |
| | | |
| | | |
| | | |
| | | [ProcessMethod("", "MESup2", "MES上传进料口满载", InvokeType.TestInvoke)] |
| | |
| | | if (ConfigAOI1.ISupMES) |
| | | { |
| | | string Msg = Task.Run(() => mqtt.MESForBasketAsync("1", "DS02216", "", "1", ConfigAOI1.mesnum1.ToString())).Result; |
| | | if (Msg != null) |
| | | if (ConfigAOI1.ISokMes) |
| | | { |
| | | |
| | | try |
| | | { |
| | | var obj = JsonConvert.DeserializeObject<AutoLineMacQueueBak>(Msg); |
| | | if (obj?.zstatus == "200") |
| | | { |
| | | ConfigAOI1.mesnum1++; |
| | | Plc1.WriteSingleAddress(1590, 1, out _); |
| | | } |
| | | else |
| | | { |
| | | Plc1.WriteSingleAddress(1590, 2, out _); |
| | | } |
| | | |
| | | LogAsync(DateTime.Now, obj?.zstatus == "200" ? EnumHelper.LogLevel.Information : EnumHelper.LogLevel.Exception, $"RabbitMQ 篮具 进料口满载 上传{(obj?.zstatus == "200" ? "成功" : "失败")} {obj?.zstatus}"); |
| | | } |
| | | catch |
| | | { |
| | | Plc1.WriteSingleAddress(1590, 2, out _); |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"RabbitMQ 篮具 进料口满载 获取返回值解析异常 返回数据{Msg} "); |
| | | } |
| | | } |
| | | ConfigAOI1.mesnum1++; |
| | | Plc1.WriteSingleAddress(1590, 1, out _); |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"已强制MES上传进料口满载"); |
| | | } |
| | | else |
| | | { |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"RabbitMQ 篮具 进料口满载 获取返回值解析异常 返回数据null "); |
| | | Plc1.WriteSingleAddress(1590, 2, out _); |
| | | } |
| | | if (Msg != null) |
| | | { |
| | | |
| | | try |
| | | { |
| | | var obj = JsonConvert.DeserializeObject<AutoLineMacQueueBak>(Msg); |
| | | if (obj?.zstatus == "200") |
| | | { |
| | | ConfigAOI1.mesnum1++; |
| | | Plc1.WriteSingleAddress(1590, 1, out _); |
| | | } |
| | | else |
| | | { |
| | | try |
| | | { |
| | | if (Msg.Contains("version错误")) |
| | | { |
| | | Regex reg = new Regex("[0-9]+", RegexOptions.IgnoreCase | RegexOptions.Singleline, TimeSpan.FromSeconds(2)); |
| | | MatchCollection matches = reg.Matches(obj.zerrmsg); |
| | | if (matches[0] != null && matches.Count == 3) |
| | | { |
| | | ConfigAOI1.mesnum1 = int.Parse(matches[0].Value) + 1; |
| | | } |
| | | else |
| | | { |
| | | ConfigAOI1.mesnum1 = 0; |
| | | } |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | } |
| | | Plc1.WriteSingleAddress(1590, 2, out _); |
| | | } |
| | | LogAsync(DateTime.Now, obj?.zstatus == "200" ? EnumHelper.LogLevel.Information : EnumHelper.LogLevel.Exception, $"RabbitMQ 篮具 进料口满载 上传{(obj?.zstatus == "200" ? "成功" : "失败")} {obj?.zstatus}"); |
| | | } |
| | | catch |
| | | { |
| | | Plc1.WriteSingleAddress(1590, 2, out _); |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"RabbitMQ 篮具 进料口满载 获取返回值解析异常 返回数据{Msg} "); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"RabbitMQ 篮具 进料口满载 获取返回值解析异常 返回数据null "); |
| | | Plc1.WriteSingleAddress(1590, 2, out _); |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Information, $"已关闭mes连接"); |
| | | Plc1.WriteSingleAddress(1590, 1, out _); |
| | | } |
| | | |
| | | |
| | | return msg; |
| | | } |
| | | |
| | |
| | | { |
| | | ResponseMessage msg = new ResponseMessage(); |
| | | |
| | | |
| | | |
| | | if (ConfigAOI1.ISupMES) |
| | | { |
| | | int num = Plc1.Read(1578, 1, out _)[0]; |
| | |
| | | string Msg = Task.Run(() => mqtt.MESForBasketAsync("3", "DS02217", ConfigAOI1.PlcAndBasketcodes.Any(u => u.id == num) ? ConfigAOI1.PlcAndBasketcodes.FirstOrDefault(u => u.id == num).code : "NoRead", "0", ConfigAOI1.mesnum3.ToString())).Result; |
| | | if (Msg != null) |
| | | { |
| | | |
| | | try |
| | | { |
| | | var obj = JsonConvert.DeserializeObject<AutoLineMacQueueBak>(Msg); |
| | |
| | | } |
| | | else |
| | | { |
| | | try |
| | | { |
| | | if (Msg.Contains("version错误")) |
| | | { |
| | | Regex reg = new Regex("[0-9]+", RegexOptions.IgnoreCase | RegexOptions.Singleline, TimeSpan.FromSeconds(2)); |
| | | MatchCollection matches = reg.Matches(obj.zerrmsg); |
| | | if (matches[0] != null && matches.Count == 3) |
| | | { |
| | | ConfigAOI1.mesnum3 = int.Parse(matches[0].Value)+1; |
| | | } |
| | | else |
| | | { |
| | | ConfigAOI1.mesnum3 = 0; |
| | | } |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | } |
| | | Plc1.WriteSingleAddress(1591, 2, out _); |
| | | } |
| | | LogAsync(DateTime.Now, obj?.zstatus == "200" ? EnumHelper.LogLevel.Information : EnumHelper.LogLevel.Exception, $"RabbitMQ 篮具 下料口空篮 上传{(obj?.zstatus == "200" ? "成功" : "失败")} {obj?.zstatus}"); |
| | |
| | | } |
| | | else |
| | | { |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Information, $"已关闭mes连接"); |
| | | Plc1.WriteSingleAddress(1591, 1, out _); |
| | | } |
| | | |
| | |
| | | { |
| | | ConfigAOI1.mesnum3++; |
| | | } |
| | | LogAsync(DateTime.Now, obj?.zstatus == "200" ? EnumHelper.LogLevel.Information : EnumHelper.LogLevel.Exception, $"RabbitMQ 篮具 下料口满载1 上传{(obj?.zstatus == "200" ? "成功" : "失败")} {obj?.zstatus}"); |
| | | else |
| | | { |
| | | try |
| | | { |
| | | if (Msg.Contains("version错误")) |
| | | { |
| | | Regex reg = new Regex("[0-9]+", RegexOptions.IgnoreCase | RegexOptions.Singleline, TimeSpan.FromSeconds(2)); |
| | | MatchCollection matches = reg.Matches(obj.zerrmsg); |
| | | if (matches[0] != null && matches.Count == 3) |
| | | { |
| | | ConfigAOI1.mesnum3 = int.Parse(matches[0].Value) + 1; |
| | | } |
| | | else |
| | | { |
| | | ConfigAOI1.mesnum3 = 0; |
| | | } |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | } |
| | | } |
| | | LogAsync(DateTime.Now, obj?.zstatus == "200" ? EnumHelper.LogLevel.Information : EnumHelper.LogLevel.Exception, $"RabbitMQ 篮具 下料口满载1 上传{(obj?.zstatus == "200" ? "成功" : "失败")} {obj?.zstatus}"); |
| | | } |
| | | catch |
| | | { |
| | |
| | | { |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"RabbitMQ 篮具 下料口满载1 获取返回值解析异常 返回数据null "); |
| | | } |
| | | |
| | | |
| | | Thread.Sleep(1000); |
| | | //mqtt.Send("4", "DS02217", ConfigAOI1.Dicbasketcode.ContainsKey(num) ? ConfigAOI1.Dicbasketcode[num] : ConfigAOI1.basketcode, "1", num.ToString()); |
| | | Msg = Task.Run(() => mqtt.MESForBasketAsync("4", "DS02217", ConfigAOI1.PlcAndBasketcodes.Any(u => u.id == num) ? ConfigAOI1.PlcAndBasketcodes.FirstOrDefault(u => u.id == num).code : "NoRead", "1", ConfigAOI1.mesnum4.ToString())).Result; |
| | |
| | | } |
| | | else |
| | | { |
| | | try |
| | | { |
| | | if (Msg.Contains("version错误")) |
| | | { |
| | | Regex reg = new Regex("[0-9]+", RegexOptions.IgnoreCase | RegexOptions.Singleline, TimeSpan.FromSeconds(2)); |
| | | MatchCollection matches = reg.Matches(obj.zerrmsg); |
| | | if (matches[0] != null && matches.Count == 3) |
| | | { |
| | | ConfigAOI1.mesnum4 = int.Parse(matches[0].Value) + 1; |
| | | } |
| | | else |
| | | { |
| | | ConfigAOI1.mesnum4 = 0; |
| | | } |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | } |
| | | Plc1.WriteSingleAddress(1591, 2, out _); |
| | | } |
| | | LogAsync(DateTime.Now, obj?.zstatus == "200" ? EnumHelper.LogLevel.Information : EnumHelper.LogLevel.Exception, $"RabbitMQ 篮具 下料口满载 上传{(obj?.zstatus == "200" ? "成功" : "失败")} {obj?.zstatus}"); |
| | |
| | | } |
| | | else |
| | | { |
| | | LogAsync(DateTime.Now, EnumHelper.LogLevel.Information, $"已关闭mes连接"); |
| | | Plc1.WriteSingleAddress(1591, 1, out _); |
| | | } |
| | | return msg; |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | } |
| | | } |