quanzhou
2 天以前 86f899fa91e811415614dff1a699141144bfc802
src/Bro.M141_AOI1.Process/AOI1Process.cs
@@ -11,12 +11,16 @@
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;
@@ -132,7 +136,7 @@
                    }
                    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);
                   // 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;
@@ -140,22 +144,40 @@
                    eleList.Add(text);
                    text.StartX = text.StartY = 0;
                    text.AddText("点检运行成功", Color.Lime, Color.Transparent);
                    var b = ret.Item2["OUTPUT_Results"].HTupleToDouble();
                    if (ret != null&& results1.Count== b.Count())
                    if (results1 != null&& results1.Count== b.Count())
                    {
                        var itemDict = results1.ToDictionary(u => u.OutputIndex);
                        b.ForEach(u =>
                        for (int i = 0; i < itemDict.Count(); i++)
                        {
                            int index = b.IndexOf(u); // 获取当前值的索引
                            if (itemDict.TryGetValue(index, out var item))
                            double CValue;
                            if (itemDict[i].CompensationValue != null)
                            {
                                double diff = u - item.StandardValue;
                                bool isInTolerance = (diff - item.Tolrenance_Positive) *(diff - item.Tolrenance_Negative) <= 0;
                                text.AddText($"{item.Code} {u}", isInTolerance == true ? Color.Lime: Color.Red, Color.Transparent);
                                 Head += $"{item.Code},";
                                 data += $"{u},";
                                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, $"点检功能运行成功");
@@ -341,11 +363,11 @@
                                    LogAsync(DateTime.Now, EnumHelper.LogLevel.Information, $"RabbitMQ zwoid获取失败 {zwordstr} ");
                                }
                            }
                            catch
                            catch(Exception ex)
                            {
                                Plc1.WriteSingleAddress(1524, 2, out _);
                                Plc1.WriteSingleAddress(1514, 1, out _);
                                LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"RabbitMQ zwoid获取异常  返回数据为 {zwordstr} ");
                                LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"RabbitMQ zwoid获取异常  返回数据为 {zwordstr},异常错误{ex.GetExceptionMessage()}");
                            }
                        }                       
                    }
@@ -593,105 +615,121 @@
            return msg;
        }
        [ProcessMethod("", "MESupdata", "MES正常上传OK产品获取条码", InvokeType.TestInvoke)]
        [ProcessMethod("", "MESupdata", "MES正常上传单个OK产品获取条码", InvokeType.TestInvoke)]
        public ResponseMessage MESupdata(IOperationConfig config, IDevice invokeDevice, IDevice sourceDevice)
        {
            ResponseMessage msg = new ResponseMessage();
            Plc3 = invokeDevice as PLCBase;
            ///产品1上传
            //上传反馈结果
            bool Issuccess = false;
            bool Issuccess1 = false;
            string tary_label = string.Empty;
            string tary_label1 = string.Empty;
            var plcnum = Plc3.Read(2100, 1, out _);
            if (plcnum[0] != 0)
            var plcnum1 = Plc3.Read(2102, 1, out _);
            if (plcnum[0] == 0)
            {
                var plist = mysqlhelper.GetProductList(plcnum + "_1");
                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;
                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);
                var tems = Task.Run(() => mqtt.MESForProduceAsync(newp, M141Config.mesnum2.ToString(), M141Config.numpro)).Result;
                M141Config.mesnum2++;
                if (tems == null)
                if (M141Config.Isprint && !string.IsNullOrEmpty(tary_label1))
                {
                    LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"产品{plist[0].PID}数据上传MES异常 返回数据为null");
                    StartPrint(tary_label1, "Honeywell PX240S(300 dpi)");
                }
                else
                {
                    try
                    {
                        var obj = JsonConvert.DeserializeObject<AutoLineMacBarcodeQueueBak>(tems);
                        if (obj.zstatus == "200")
                        {
                            Plc1.WriteSingleAddress(2120, 1, out _);
                            LogAsync(DateTime.Now, EnumHelper.LogLevel.Assist, $"产品{plist[0].PID}数据上传MES成功  {tems}");
                        }
                        else
                        {
                            LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"产品{plist[0].PID}数据上传MES失败  {tems}");
                        }
                    }
                    catch (Exception)
                    {
                        LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"产品{plist[0].PID}数据上传MES失败  {tems}");
                    }
                }
                ///产品1上传
                var plcnum1 = Plc3.Read(2102, 1, out _);
                if (plcnum1[0] != 0)
                {
                    var plist1 = mysqlhelper.GetProductList(plcnum1 + "_1");
                    ProductModel newp1 = new ProductModel();
                    newp1.SEQUENCE = plist[0].SEQUENCE;
                    newp1.PID = plist[0].PID;
                    newp1.BasketCode = plist[0].BasketCode;
                    newp1.Zword = plist[0].Zword;
                    newp1.Result = "OK";
                    newp1.SN = plist[0].SN;
                    var tems1 = Task.Run(() => mqtt.MESForProduceAsync(newp1, M141Config.mesnum2.ToString(), M141Config.numpro)).Result;
                    M141Config.mesnum2++;
                    if (tems1 == null)
                    {
                        LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"产品{plist[0].PID}数据上传MES异常 返回数据为null");
                    }
                    else
                    {
                        try
                        {
                            var obj1 = JsonConvert.DeserializeObject<AutoLineMacBarcodeQueueBak>(tems1);
                            if (obj1.zstatus == "200")
                            {
                                Plc1.WriteSingleAddress(2120, 1, out _);
                                LogAsync(DateTime.Now, EnumHelper.LogLevel.Assist, $"产品{plist[0].PID}数据上传MES成功  {tems}");
                            }
                            else
                            {
                                LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"产品{plist[0].PID}数据上传MES失败  {tems}");
                            }
                        }
                        catch (Exception)
                        {
                            LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"产品{plist[0].PID}数据上传MES失败  {tems}");
                        }
                    }
                }
            }
            if (Issuccess && Issuccess1)
            {
                Plc3.WriteSingleAddress(2120, 1, out _);
            }
            else
            {
                Plc3.WriteSingleAddress(2120, 2, out _);
            }
            return msg;
        }
        [ProcessMethod("", "MESupFinallydata", "MES上传尾盘OK产品获取条码", InvokeType.TestInvoke)]
        [ProcessMethod("", "MESupFinallydata", "MES上传单个尾盘OK产品获取条码", InvokeType.TestInvoke)]
        public ResponseMessage MESupFinallydata(IOperationConfig config, IDevice invokeDevice, IDevice sourceDevice)
        {
            ResponseMessage msg = new ResponseMessage();
            Plc3 = invokeDevice as PLCBase;
            ///产品1上传
            //上传反馈结果
            bool Issuccess = false;
            bool Issuccess1 = false;
            string tary_label = string.Empty;
            string tary_label1 = string.Empty;
            var plcnum = Plc3.Read(2100, 1, out _);
            var plist = mysqlhelper.GetProductList(plcnum+"_1");
            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;
@@ -699,12 +737,24 @@
            newp.Zword = plist[0].Zword;
            newp.Result = "OK";
            newp.SN = plist[0].SN;
            //上传尾盘数据
            var tems = Task.Run(() => mqtt.MESForProduceAsync(newp, M141Config.mesnum2.ToString(), M141Config.numpro,"Y")).Result;
            M141Config.mesnum2 = 0;
            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, $"产品{plist[0].PID}数据上传MES异常 返回数据为null");
                LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"产品{pro.PID}数据上传MES异常 返回数据为null");
                result = string.Empty;
                return false;
            }
            else
            {
@@ -713,28 +763,237 @@
                    var obj = JsonConvert.DeserializeObject<AutoLineMacBarcodeQueueBak>(tems);
                    if (obj.zstatus == "200")
                    {
                        LogAsync(DateTime.Now, EnumHelper.LogLevel.Assist, $"产品{plist[0].PID}数据上传MES成功  {tems}");
                        //打印获取的条码
                        if (M141Config.Isprint && !string.IsNullOrEmpty(obj.tary_label))
                        {
                            StartPrint(obj.tary_label);
                        }
                        LogAsync(DateTime.Now, EnumHelper.LogLevel.Assist, $"产品{pro.PID}数据上传MES成功 {tems}");
                        result = obj.tary_label;
                        return true;
                    }
                    else
                    {
                        LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"产品{plist[0].PID}数据上传MES失败  {tems}");
                        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, $"产品{plist[0].PID}数据上传MES失败  {tems}");
                    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)
@@ -871,7 +1130,6 @@
                                }
                                Plc1.WriteSingleAddress(1590, 2, out _);
                            }
                            LogAsync(DateTime.Now, obj?.zstatus == "200" ? EnumHelper.LogLevel.Information : EnumHelper.LogLevel.Exception, $"RabbitMQ 篮具  进料口满载 上传{(obj?.zstatus == "200" ? "成功" : "失败")}   {obj?.zstatus}");
                        }
                        catch
@@ -892,8 +1150,6 @@
                LogAsync(DateTime.Now, EnumHelper.LogLevel.Information, $"已关闭mes连接");
                Plc1.WriteSingleAddress(1590, 1, out _);
            }
            return msg;
        }
@@ -909,7 +1165,6 @@
                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);