using Bro.Common.Base; using Bro.Common.Helper; using Bro.Common.Interface; using Bro.Common.Model; using Bro.M135.Common; using HalconDotNet; using Microsoft.VisualBasic; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Sunny.UI; using System.Data; using System.Data.SqlTypes; using System.Diagnostics; using System.Net; using System.Text; using System.Text.Encodings.Web; using System.Windows.Forms; using System.Xml.Linq; using static System.Net.Mime.MediaTypeNames; using static System.Net.WebRequestMethods; using static System.Windows.Forms.VisualStyles.VisualStyleElement.Tab; namespace Bro.M141.Process { public partial class M141Process { Dictionary> dicdate = new Dictionary>(); ManualResetEvent set1 = new ManualResetEvent(false); ManualResetEvent set2 = new ManualResetEvent(false); [ProcessMethod("ImageCheck", "ImageCheckOperation", "通用图片检测操作", InvokeType.TestInvoke)] public ResponseMessage ImageCheckOperation(IOperationConfig config, IDevice invokeDevice, IDevice sourceDevice) { ResponseMessage msg = new ResponseMessage(); if (config is IImageCheckOperationConfig opConfig) { var results = opConfig.Products.Select(u => { DetectResult result = new DetectResult(); result.PID = u.PID; result.Specs = GetSpecListFromConfigSelection(opConfig.SpecCollection); return result; }).ToList(); msg.DataObj = results; var tool = GetHalconTool(null, "", opConfig.AlgorithemPath); Tuple, Dictionary, string, int> ret = null; if (opConfig.BDstate) { List bdlist = M141Config.BDCollection.FirstOrDefault(u => u.CameraId == opConfig.ExecuteDevice && u.CheckIndex == opConfig.BDindex)?.BDList; if (bdlist == null) { LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"未找到标定配置,序号{opConfig.BDindex}"); return msg; } ret = tool.RunProcedure(new Dictionary() { { "INPUT_CalibrationData", bdlist.ToArray() } }, new Dictionary() { { "INPUT_Image", opConfig.ImageSet.HImage } }, new List() { "OUTPUT_Results_1", "OUTPUT_Results_2" }, null); } else { ret = tool.RunProcedure(null, new Dictionary() { { "INPUT_Image", opConfig.ImageSet.HImage } }, new List() { "OUTPUT_Results_1", "OUTPUT_Results_2" }, null); } //var ret = tool.RunProcedure(null, new Dictionary() { { "INPUT_Image", opConfig.ImageSet.HImage } }, new List() { "OUTPUT_Results_1", "OUTPUT_Results_2" }, null); if (!ret.Item1) { LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"脚本{opConfig.AlgorithemPath}运行异常,{ret.Item4}"); } else { //for (int i = 1; i <= 2; i++) //{ // var p = opConfig.Products.FirstOrDefault(u => u.SEQUENCE.EndsWith(i.ToString())); // if (p != null) // { // var pResult = results.FirstOrDefault(u => u.PID == p.PID); // var datas = ret.Item2[$"OUTPUT_Results_{i}"].HTupleToDouble(); // LogAsync(DateTime.Now, EnumHelper.LogLevel.Action, $"当前脚本结果OUTPUT_Results_{i}:{string.Join(",", datas.Select(u => u.ToString("f3")))}"); // if (pResult != null && datas.Count > 0) // { // FillSpecResults(pResult.PID, pResult.Specs, datas); // } // } //} opConfig.Products.ForEach(p => { var pResult = results.FirstOrDefault(u => u.PID == p.PID); string i = p.SEQUENCE[p.SEQUENCE.Length - 1].ToString(); var datas = ret.Item2[$"OUTPUT_Results_{i}"].HTupleToDouble(); LogAsync(DateTime.Now, EnumHelper.LogLevel.Action, $"当前脚本结果OUTPUT_Results_{i}:{string.Join(",", datas.Select(u => u.ToString("f3")))}"); if (pResult != null && datas.Count > 0) { FillSpecResults(pResult.PID, pResult.Specs, datas, p.SEQUENCE); } }); } } return msg; } [ProcessMethod("ImageCheck", "ImageCheckOperation2", "通用图片检测操作,数据交互输出", InvokeType.TestInvoke)] public ResponseMessage ImageCheckOperationOUT(IOperationConfig config, IDevice invokeDevice, IDevice sourceDevice) { ResponseMessage msg = new ResponseMessage(); if (config is IImageCheckOperationConfig opConfig) { var results = opConfig.Products.Select(u => { DetectResult result = new DetectResult(); result.PID = u.PID; result.Specs = GetSpecListFromConfigSelection(opConfig.SpecCollection); return result; }).ToList(); msg.DataObj = results; var tool = GetHalconTool(null, "", opConfig.AlgorithemPath); Tuple, Dictionary, string, int> ret = null; if (opConfig.BDstate) { List bdlist = M141Config.BDCollection.FirstOrDefault(u => u.CameraId == opConfig.ExecuteDevice && u.CheckIndex == opConfig.BDindex)?.BDList; if (bdlist == null) { LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"未找到标定配置,序号{opConfig.BDindex}"); return msg; } ret = tool.RunProcedure(new Dictionary() { { "INPUT_CalibrationData", bdlist.ToArray() } }, new Dictionary() { { "INPUT_Image", opConfig.ImageSet.HImage } }, new List() { "OUTPUT_Results_1", "OUTPUT_Results_2", "OUTPUT_TransmitData" }, null); } else { ret = tool.RunProcedure(null, new Dictionary() { { "INPUT_Image", opConfig.ImageSet.HImage } }, new List() { "OUTPUT_Results_1", "OUTPUT_Results_2", "OUTPUT_TransmitData" }, null); } //var ret = tool.RunProcedure(null, new Dictionary() { { "INPUT_Image", opConfig.ImageSet.HImage } }, new List() { "OUTPUT_Results_1", "OUTPUT_Results_2" }, null); if (!ret.Item1) { LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"脚本{opConfig.AlgorithemPath}运行异常,{ret.Item4}"); } else { //for (int i = 1; i <= 2; i++) //{ // var p = opConfig.Products.FirstOrDefault(u => u.SEQUENCE.EndsWith(i.ToString())); // if (p != null) // { // var pResult = results.FirstOrDefault(u => u.PID == p.PID); // var datas = ret.Item2[$"OUTPUT_Results_{i}"].HTupleToDouble(); // LogAsync(DateTime.Now, EnumHelper.LogLevel.Action, $"当前脚本结果OUTPUT_Results_{i}:{string.Join(",", datas.Select(u => u.ToString("f3")))}"); // if (pResult != null && datas.Count > 0) // { // FillSpecResults(pResult.PID, pResult.Specs, datas); // } // } //} opConfig.Products.ForEach(p => { var pResult = results.FirstOrDefault(u => u.PID == p.PID); string i = p.SEQUENCE[p.SEQUENCE.Length - 1].ToString(); var datas = ret.Item2[$"OUTPUT_Results_{i}"].HTupleToDouble(); dicdate[i] = ret.Item2["OUTPUT_TransmitData"].HTupleToDouble(); LogAsync(DateTime.Now, EnumHelper.LogLevel.Detail, $"数据交互输出{i} {string.Join(",", dicdate[i])}"); if (i == "1") { set1.Set(); } else { set2.Set(); } LogAsync(DateTime.Now, EnumHelper.LogLevel.Action, $"当前脚本结果OUTPUT_Results_{i}:{string.Join(",", datas.Select(u => u.ToString("f3")))}"); if (pResult != null && datas.Count > 0) { FillSpecResults(pResult.PID, pResult.Specs, datas, p.SEQUENCE); } }); } } return msg; } [ProcessMethod("ImageCheck", "ImageCheckOperation3", "通用图片检测操作,数据交互输入,不清数据", InvokeType.TestInvoke)] public ResponseMessage ImageCheckOperationIN1(IOperationConfig config, IDevice invokeDevice, IDevice sourceDevice) { ResponseMessage msg = new ResponseMessage(); if (config is IImageCheckOperationConfig opConfig) { var results = opConfig.Products.Select(u => { DetectResult result = new DetectResult(); result.PID = u.PID; result.Specs = GetSpecListFromConfigSelection(opConfig.SpecCollection); return result; }).ToList(); msg.DataObj = results; var tool = GetHalconTool(null, "", opConfig.AlgorithemPath); Tuple, Dictionary, string, int> ret = null; string index = "1"; opConfig.Products.ForEach(p => { index = p.SEQUENCE[p.SEQUENCE.Length - 1].ToString(); }); if (dicdate[index].Count == 0) { if (index == "1") { set1.Reset(); set1.WaitOne(3000); } else { set2.Reset(); set2.WaitOne(3000); } } LogAsync(DateTime.Now, EnumHelper.LogLevel.Detail, $"数据交互输入{index} {string.Join(",", dicdate[index])}"); double[] tem = dicdate[index].ToArray(); if (opConfig.BDstate) { List bdlist = M141Config.BDCollection.FirstOrDefault(u => u.CameraId == opConfig.ExecuteDevice && u.CheckIndex == opConfig.BDindex)?.BDList; if (bdlist == null) { LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"未找到标定配置,序号{opConfig.BDindex}"); return msg; } ret = tool.RunProcedure(new Dictionary() { { "INPUT_TransmitData", tem }, { "INPUT_CalibrationData", bdlist.ToArray() } }, new Dictionary() { { "INPUT_Image", opConfig.ImageSet.HImage } }, new List() { "OUTPUT_Results_1", "OUTPUT_Results_2" }, null); } else { ret = tool.RunProcedure(new Dictionary() { { "INPUT_TransmitData", tem } }, new Dictionary() { { "INPUT_Image", opConfig.ImageSet.HImage } }, new List() { "OUTPUT_Results_1", "OUTPUT_Results_2" }, null); } ret = tool.RunProcedure(new Dictionary() { { "INPUT_TransmitData", tem } }, new Dictionary() { { "INPUT_Image", opConfig.ImageSet.HImage } }, new List() { "OUTPUT_Results_1", "OUTPUT_Results_2" }, null); //var ret = tool.RunProcedure(null, new Dictionary() { { "INPUT_Image", opConfig.ImageSet.HImage } }, new List() { "OUTPUT_Results_1", "OUTPUT_Results_2" }, null); if (!ret.Item1) { LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"脚本{opConfig.AlgorithemPath}运行异常,{ret.Item4}"); } else { //for (int i = 1; i <= 2; i++) //{ // var p = opConfig.Products.FirstOrDefault(u => u.SEQUENCE.EndsWith(i.ToString())); // if (p != null) // { // var pResult = results.FirstOrDefault(u => u.PID == p.PID); // var datas = ret.Item2[$"OUTPUT_Results_{i}"].HTupleToDouble(); // LogAsync(DateTime.Now, EnumHelper.LogLevel.Action, $"当前脚本结果OUTPUT_Results_{i}:{string.Join(",", datas.Select(u => u.ToString("f3")))}"); // if (pResult != null && datas.Count > 0) // { // FillSpecResults(pResult.PID, pResult.Specs, datas); // } // } //} opConfig.Products.ForEach(p => { var pResult = results.FirstOrDefault(u => u.PID == p.PID); string i = p.SEQUENCE[p.SEQUENCE.Length - 1].ToString(); var datas = ret.Item2[$"OUTPUT_Results_{i}"].HTupleToDouble(); LogAsync(DateTime.Now, EnumHelper.LogLevel.Action, $"当前脚本结果OUTPUT_Results_{i}:{string.Join(",", datas.Select(u => u.ToString("f3")))}"); if (pResult != null && datas.Count > 0) { FillSpecResults(pResult.PID, pResult.Specs, datas, p.SEQUENCE); } }); } } return msg; } [ProcessMethod("ImageCheck", "ImageCheckOperation4", "通用图片检测操作,数据交互输入,清数据", InvokeType.TestInvoke)] public ResponseMessage ImageCheckOperationIN2(IOperationConfig config, IDevice invokeDevice, IDevice sourceDevice) { ResponseMessage msg = new ResponseMessage(); if (config is IImageCheckOperationConfig opConfig) { var results = opConfig.Products.Select(u => { DetectResult result = new DetectResult(); result.PID = u.PID; result.Specs = GetSpecListFromConfigSelection(opConfig.SpecCollection); return result; }).ToList(); msg.DataObj = results; var tool = GetHalconTool(null, "", opConfig.AlgorithemPath); Tuple, Dictionary, string, int> ret = null; string index = "1"; opConfig.Products.ForEach(p => { index = p.SEQUENCE[p.SEQUENCE.Length - 1].ToString(); }); if (dicdate[index].Count == 0) { if (index == "1") { set1.Reset(); set1.WaitOne(3000); } else { set2.Reset(); set2.WaitOne(3000); } } LogAsync(DateTime.Now, EnumHelper.LogLevel.Detail, $"数据交互输入{index} {string.Join(",", dicdate[index])}"); double[] tem = dicdate[index].ToArray(); if (opConfig.BDstate) { List bdlist = M141Config.BDCollection.FirstOrDefault(u => u.CameraId == opConfig.ExecuteDevice && u.CheckIndex == opConfig.BDindex)?.BDList; if (bdlist == null) { LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"未找到标定配置,序号{opConfig.BDindex}"); return msg; } ret = tool.RunProcedure(new Dictionary() { { "INPUT_TransmitData", tem }, { "INPUT_CalibrationData", bdlist.ToArray() } }, new Dictionary() { { "INPUT_Image", opConfig.ImageSet.HImage } }, new List() { "OUTPUT_Results_1", "OUTPUT_Results_2" }, null); } else { ret = tool.RunProcedure(new Dictionary() { { "INPUT_TransmitData", tem } }, new Dictionary() { { "INPUT_Image", opConfig.ImageSet.HImage } }, new List() { "OUTPUT_Results_1", "OUTPUT_Results_2" }, null); } //ret = tool.RunProcedure(new Dictionary() { { "INPUT_TransmitData", tem } }, new Dictionary() { { "INPUT_Image", opConfig.ImageSet.HImage } }, new List() { "OUTPUT_Results_1", "OUTPUT_Results_2" }, null); dicdate[index].Clear(); //var ret = tool.RunProcedure(null, new Dictionary() { { "INPUT_Image", opConfig.ImageSet.HImage } }, new List() { "OUTPUT_Results_1", "OUTPUT_Results_2" }, null); if (!ret.Item1) { LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"脚本{opConfig.AlgorithemPath}运行异常,{ret.Item4}"); } else { //for (int i = 1; i <= 2; i++) //{ // var p = opConfig.Products.FirstOrDefault(u => u.SEQUENCE.EndsWith(i.ToString())); // if (p != null) // { // var pResult = results.FirstOrDefault(u => u.PID == p.PID); // var datas = ret.Item2[$"OUTPUT_Results_{i}"].HTupleToDouble(); // LogAsync(DateTime.Now, EnumHelper.LogLevel.Action, $"当前脚本结果OUTPUT_Results_{i}:{string.Join(",", datas.Select(u => u.ToString("f3")))}"); // if (pResult != null && datas.Count > 0) // { // FillSpecResults(pResult.PID, pResult.Specs, datas); // } // } //} opConfig.Products.ForEach(p => { var pResult = results.FirstOrDefault(u => u.PID == p.PID); string i = p.SEQUENCE[p.SEQUENCE.Length - 1].ToString(); var datas = ret.Item2[$"OUTPUT_Results_{i}"].HTupleToDouble(); LogAsync(DateTime.Now, EnumHelper.LogLevel.Action, $"当前脚本结果OUTPUT_Results_{i}:{string.Join(",", datas.Select(u => u.ToString("f3")))}"); if (pResult != null && datas.Count > 0) { FillSpecResults(pResult.PID, pResult.Specs, datas, p.SEQUENCE); } }); } } return msg; } protected List GetSpecListFromConfigSelection(List specSelectors) { List specList = new List(); specSelectors.ForEach(u => { var spec = M141Config.SpecCollection.FirstOrDefault(s => s.Code == u.SpecCode); if (spec != null) { var temp = spec.Copy(); temp.ActualValue = null; temp.MeasureResult = null; specList.Add(temp); } }); return specList; } protected void FillSpecResults(string pid, List detectSpec, List results, string SEQUENCE) { detectSpec.ForEach(s => { if (!s.IsEnabled) return; if (results.Count > s.OutputIndex) { s.ActualValue = results[s.OutputIndex]; if (s.IsEnableCompensation && s.CompensationValue.Count > 1) { string index1 = SEQUENCE.Split('_')[SEQUENCE.Split('_').Count() - 1]; if (index1 == "2") { s.ActualValue += s.CompensationValue[1]; } else { s.ActualValue += s.CompensationValue[0]; } } LogAsync(DateTime.Now, EnumHelper.LogLevel.Assist, $"产品{pid}检测项{s.Code}赋值{s.GetMeasureValueStr()},结果{s.GetMeasureResultStr()}"); } else { s.ActualValue = null; LogAsync(DateTime.Now, EnumHelper.LogLevel.Error, $"产品{pid}检测项{s.Code}未能赋值,结果{s.GetMeasureResultStr()}"); } }); } protected List GenerateSpecByMeasureItems(List measureItems) { List measureSpecs = new List(); measureItems.ForEach(m => { var originSpec = M141Config.SpecCollection.FirstOrDefault(u => u.Code == m.SpecCode); if (originSpec == null) { LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"{m.SpecCode}设置的检测标准未能在配置中获取"); return; } if (m.IsSubscribeSpecForPoints) { int index = 0; m.MeasurePointNameCollection.ForEach(mp => { var spec_p = originSpec.Copy(); spec_p.Code = mp.MeasurePointName; spec_p.OutputIndex = index; measureSpecs.Add(spec_p); index++; }); } else { var spec = originSpec.Copy(); if (!string.IsNullOrWhiteSpace(m.FAIName)) { spec.Code = m.FAIName; } measureSpecs.Add(spec); } }); return measureSpecs; } DateTime? _ct = null; [ProcessMethod("", "ProductDataUpload", "产品数据上传", InvokeType.TestInvoke)] public ResponseMessage ProductDataUpload(IOperationConfig config, IDevice invokeDevice, IDevice sourceDevice) { ResponseMessage msg = new ResponseMessage(); var triggerDatas = config.TriggerStr.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); string inputSequence = triggerDatas[triggerDatas.Length - 1]; var productList = new List() { 1, 2 }.Select(u => { string sequence = $"{inputSequence}_{u}"; return FindProductBySequence(sequence, true); }).ToList(); string replyData = "#,UpData"; int waitInterval = 300; int repeatTime = /*M141Config.DetectTimeout / waitInterval+*/2; do { if (productList.All(p => !string.IsNullOrWhiteSpace(p.Result))) { break; } else { Thread.Sleep(waitInterval); repeatTime--; } if (repeatTime < 0) { LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"产品{string.Join(",", productList.Select(u => u.PID))}检测获取汇总结果超时,使用当前结果"); break; } } while (true); var Defaultclass = M141Config.DefectClassCollection.FirstOrDefault(u => u.IsDefault); productList.ForEach(p => { if (Defaultclass == null) { replyData += $",{(string.IsNullOrEmpty(p.Result) ? "NG" : p.Result)}"; if (string.IsNullOrEmpty(p.Result)) { p.Result = "NG"; } } else { replyData += $",{(string.IsNullOrEmpty(p.Result) ? Defaultclass.ClassName : p.Result)}"; if (string.IsNullOrEmpty(p.Result)) { p.Result = Defaultclass.ClassName; } } var specList = p.Details.SelectMany(u => u.ResultList.SelectMany(r => r.Specs)).ToList(); p.Details.SelectMany(u => u.SpecList).ToList().ForEach(s => { if (!specList.Any(u => u.Code == s.Code)) { specList.Add(s); } }); List Pointdatas11 = new List(); foreach (var item in specList) { try { Pointdatas11.Add(new Pointdata() { Code = item.Code, Value = Convert.ToDouble(item.GetMeasureValueStr()), Stand = item.StandardValue, Min = item.StandardValue - item.Tolrenance_Negative, Max = item.StandardValue + item.Tolrenance_Positive, ispoint = false, }); } catch { } } M141Codelist.Add(Pointdatas11); HandleProductStatistc(p); }); if (!M141Config.IsEnabelMESUpload) { replyData += ",OK"; } else { int mesres = UploadProductDataToMES(productList); if (mesres == 0) { replyData += $",OK"; } else { if (M141Config.MESProjectCode.ToUpper().Contains("AOI2")) { if (mesres == 3) { replyData += $",OK"; } else { replyData += $",NG"; } } else { replyData += $",NG{mesres.ToString()}"; } } } productList.ForEach(p => { replyData += $",{(p.SN.ToLower().Contains("read") ? "No Read" : p.SN)}"; }); ReplyTcpData("All", config.TriggerSource, replyData); //保存压缩图 productList.ForEach(p => { SaveZip(p.PID, p.Result); }); //if (M141Config.IsEnableOEEDataUpload) //{ // productList.ForEach(p => // { // OEEDataUpload(M141Config.OEEConfig_WorkPlace, p.SN, p.Details.SelectMany(u => u.ResultList).ToList()); // }); //} return msg; } string _csvHead = ""; List _specHeadList = null; List _positionList = new List(); private void UpdateProductResult(ProductModel p, out bool isOK) { isOK = false; int waitTimes = 1; if (p.Details.Any(u => u.IsDone == false) && waitTimes > 0) { //var pDB = _manager_P_Product.QueryProductByPID(p.PID); //for (int i = 0; i < p.Details.Count; i++) //{ // if (!p.Details[i].IsDone) // { // var correspondingDetail = pDB?.Details.FirstOrDefault(u => u.PositionName == p.Details[i].PositionName); // if (correspondingDetail?.IsDone ?? false) // { // p.Details[i] = correspondingDetail; // } // } //} waitTimes--; } if (waitTimes == 0) { var unfinishedPositions = p.Details.Where(u => u.IsDone == false).Select(u => u.PositionName).ToList(); if (unfinishedPositions.Count > 0) { LogAsync(DateTime.Now, EnumHelper.LogLevel.Error, $"产品{string.Join(",", unfinishedPositions)}站点结果未完成"); } } 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()).Where(u => u.MeasureResult != true).Select(u => u.Code); var ngDefectDescList = p.Details.SelectMany(u => u.DefectList ?? new List()).ToList(); defects.AddRange(ngSpecCodes); defects.AddRange(ngDefectDescList); if (p.Details.Any(u => !u.IsDone)) { defects.Add("TBD"); } defects = defects.Distinct().ToList(); isOK = defects.Count <= 0; UpdateDefectAsync(defects); var defectClass = GetDefectClassFromDefectList(defects); UpdateResult(DateTime.Now, p.SN, defectClass.ClassName, ""); //产品序号+1 Interlocked.Increment(ref _productIndex); List specList = new List(); specList.AddRange(p.Details.SelectMany(u => u.SpecList).ToList().ConvertAll(u => (ISpec)u)); specList.AddRange(p.Details.SelectMany(u => u.ResultList.SelectMany(d => d.Specs))); //ReplyRealTimeData(p.DataTag as List, specList); p.Result = defectClass.ClassName; p.EndTime = DateTime.Now; LogAsync(DateTime.Now, EnumHelper.LogLevel.Action, $"产品{p.PID} {p.SEQUENCE} {p.SN}检测结果{p.Result},缺陷明细:{string.Join(",", defects)}"); //} //catch (Exception e) //{ // LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, e.ToString()); //} } private void ReplyRealTimeData(List? contourPoints, List specList) { if (contourPoints != null && contourPoints.Count > 0) { M141Config.RealTimeDataModels.ForEach(r => { if (!r.IsEnabled) return; List selectPoints = new List(); r.DataDetails.ForEach(u => { var point = contourPoints.FirstOrDefault(c => c.Name == u.PointName); if (point != null) { double pValue = 0; switch (u.EdgeSelect) { case ContourEdge.X: pValue = point.ActualX; break; case ContourEdge.Y: pValue = point.ActualY; break; } if (pValue > u.ValidRangeMin && pValue < u.ValidRangeMax) { selectPoints.Add($"{point.Name.Replace(' ', '-').Replace('_', '-')}-{u.EdgeSelect.ToString()}:{pValue.ToString("f3")}"); } } }); if (selectPoints.Count == r.DataDetails.Count) { string reply = r.DataHead + ","; reply += $"{string.Join(",", selectPoints)},Count:{_productIndex}*\r\n"; _realTimeServer.WriteAndRead(reply, out _, out _); } }); } if (specList != null && specList.Count > 0) { M141Config.RealTimeDataModels.ForEach(r => { if (!r.IsEnabled) return; List selectPoints = new List(); r.DataDetails.ForEach(u => { var spec = specList.FirstOrDefault(s => s.Code == u.SpecCode); if (spec != null) { double pValue = spec.ActualValue ?? -999; if (pValue > u.ValidRangeMin && pValue < u.ValidRangeMax) { selectPoints.Add($"{spec.Code.Replace(' ', '-').Replace('_', '-')}{u.SpecAfter}:{pValue.ToString("f3")}"); //selectPoints.Add($"{u.EdgeSelect.ToString()}:{pValue.ToString("f3")}"); } } }); if (selectPoints.Count == r.DataDetails.Count) { string reply = r.DataHead + ","; reply += $"{string.Join(",", selectPoints)},Count:{_productIndex}*\r\n"; _realTimeServer.WriteAndRead(reply, out _, out _); } }); } } private void UpdateProductResultAsync(ProductModel p) { UpdateProductResult(p, out bool isOK); //_taskFactory.StartNew(() => //{ // if (M141Config.IsEnableOEEDataUpload) // { // OEEDataUpload(M141Config.OEEConfig_WorkPlace, p.SN, p.Details.SelectMany(u => u.ResultList).ToList()); // } //}); _taskFactory.StartNew(() => { if (string.IsNullOrWhiteSpace(_csvHead)) { _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); }); //return await _taskFactory.StartNew(() => // { // UpdateProductResult(p, out bool isOK); // return isOK; // }); } [ProcessMethod("", "UploadDataToMES", "上传信息至MES", InvokeType.TestInvoke)] public ResponseMessage UploadDataToMES(IOperationConfig config, IDevice executeDevice, IDevice sourceDevice) { ResponseMessage msg = new ResponseMessage(); try { LogAsync(DateTime.Now, EnumHelper.LogLevel.Action, $"MES上传信息:{config.TriggerStr}"); //MESService.WSTESTSoapClient client = new MESService.WSTESTSoapClient(MESService.WSTESTSoapClient.EndpointConfiguration.WSTESTSoap, M141Config.MESUploadURL); //string reply = client.aoidataX2966aoi3Insert(config.TriggerStr); HttpPost(M141Config.MESUploadURL, config.TriggerStr, out string reply, out StatusCode_en encode); LogAsync(DateTime.Now, EnumHelper.LogLevel.Action, $"MES反馈信息:{reply}\r\n{JsonConvert.SerializeObject(encode)}"); XDocument doc = XDocument.Parse(reply); foreach (XElement element in doc.Root.Elements()) { reply = element.Value; } msg.DataStr = reply; Mes_re jObj = JsonConvert.DeserializeObject(reply); msg.Result = jObj.code; /*== 1000 ? 1 : -1;*/ if (msg.Result == 1003) { if (jObj.msg.Contains("导通测试")) { msg.Result = 4; } else { msg.Result = 1; } } } catch (Exception ex) { LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"上传信息至{M141Config.MESUploadURL}异常,{ex.GetExceptionMessage()}"); msg.Result = -1; } return msg; } public bool HttpPost(string url, string postDataStr, out string Result, out StatusCode_en ResultStatus) { if (M141Config.MESProjectCode.ToUpper().Contains("3221AOI1")) { postDataStr = "\r\n\r\n \r\n \r\n " + postDataStr + "\r\n \r\n \r\n"; } else if (M141Config.MESProjectCode.ToUpper().Contains("3221AOI2")) { postDataStr = "\r\n\r\n \r\n \r\n " + postDataStr + "\r\n \r\n \r\n"; } else if (M141Config.MESProjectCode.ToUpper().Contains("3221AOI3B")) { postDataStr = "\r\n\r\n \r\n \r\n " + postDataStr + "\r\n \r\n \r\n"; } else if (M141Config.MESProjectCode.ToUpper().Contains("3221AOI3")) { postDataStr = "\r\n\r\n \r\n \r\n " + postDataStr + "\r\n \r\n \r\n"; } else if (M141Config.MESProjectCode.ToUpper().Contains("3222AOI2")) { postDataStr = "\r\n\r\n \r\n \r\n " + postDataStr + "\r\n \r\n \r\n"; } else if (M141Config.MESProjectCode.ToUpper().Contains("3222AOI3")) { postDataStr = "\r\n\r\n \r\n \r\n " + postDataStr + "\r\n \r\n \r\n"; } bool flag = false; Result = string.Empty; ResultStatus = new StatusCode_en(); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); HttpWebResponse response; try { request.Timeout = 2000;//连接MES超时不超过2S byte[] bytesToPost = System.Text.Encoding.UTF8.GetBytes(postDataStr); //转换为bytes数据 request.Method = "POST"; request.ContentType = "text/xml; charset=utf-8"; //request.ContentLength = bytesToPost.Length; // POST / CYWebService.asmx / X3221_AOI2_Upload HTTP / 1.1 //Host: 10.8.0.66 //Content - Type: application / x - www - form - urlencoded //Content - Length: length //json = string //request.ContentType = "application/json"; //request.Headers["Authorization"] = "09a2815ab6814ea3a87166d2bf866085"; //客供 //request.Headers["Content-MD5"] = "c69fac58411218a8f4a7b1f8e00cf791";//MD5解析 request.Accept = "*/*"; CookieContainer cookie = new CookieContainer(); request.CookieContainer = cookie; #region 其他没有设置的参数 //request.ContentLength = Encoding.UTF8.GetByteCount(postDataStr);//添加长度后写入流后关闭不了,可能流方式不同问题 //request.Referer = ""; //request.Accept = "Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; //request.Headers["Accept-Language"] = "zh-CN,zh;q=0."; //request.Headers["Accept-Charset"] = "GBK,utf-8;q=0.7,*;q=0.3"; //request.UserAgent = "User-Agent:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202 Safari/535.1"; //request.KeepAlive = true; //Stream myRequestStream = request.GetRequestStream(); //StreamWriter myStreamWriter = new StreamWriter(myRequestStream, Encoding.GetEncoding("gb2312")); //myStreamWriter.Write(bytesToPost); //myStreamWriter.Flush(); //myStreamWriter.Close(); #endregion Stream stream = request.GetRequestStream(); byte[] bs = System.Text.Encoding.UTF8.GetBytes(postDataStr); stream.Write(bs, 0, bs.Length); stream.Flush(); stream.Close(); response = (HttpWebResponse)request.GetResponse(); ResultStatus = new StatusCode_en { StatusCode = (int)response.StatusCode, StatusCodeDiscribe = response.StatusDescription, }; response.Cookies = cookie.GetCookies(response.ResponseUri); Stream myResponseStream = response.GetResponseStream(); //获取全部返回值XML字符串 StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8")); Result = myStreamReader.ReadToEnd(); flag = true; } catch (WebException ex) { //response = (HttpWebResponse)ex.Response;//有些异常如操作超时,对象会为空,想要详细数据不建议加判断 ResultStatus = new StatusCode_en { ErrDiscribe = ex.Message }; flag = false; } return flag; } public class StatusCode_en//结果合集 { /// /// 状态码,如404 /// public int StatusCode { get; set; } /// /// 状态描述,如NotFound /// public string StatusCodeDiscribe { get; set; } /// /// 错误描述,如 /// public string ErrDiscribe { get; set; } } public class Mes_re//结果合集 { public int code { get; set; } public string msg { get; set; } public object value { get; set; } public object data { get; set; } } [ProcessMethod("", "CheckProductSNByMES", "检测产品条码(前站结果)", InvokeType.TestInvoke)] public ResponseMessage CheckProductSNByMES(IOperationConfig config, IDevice executeDevice, IDevice sourceDevice) { ResponseMessage msg = new ResponseMessage(); try { LogAsync(DateTime.Now, EnumHelper.LogLevel.Action, $"MES检测条码:{config.TriggerStr}"); MESService.WSTESTSoapClient client = new MESService.WSTESTSoapClient(MESService.WSTESTSoapClient.EndpointConfiguration.WSTESTSoap, M141Config.MESUploadURL); Stopwatch sw = new Stopwatch(); sw.Start(); string reply = client.checkaoidataX2966aoi3Insert(config.TriggerStr); msg.DataStr = reply; sw.Stop(); LogAsync(DateTime.Now, EnumHelper.LogLevel.Action, $"MES检测条码{config.TriggerSource},反馈信息:{reply},耗时:{sw.ElapsedMilliseconds}ms"); JObject jObj = JsonConvert.DeserializeObject(reply); msg.Result = jObj.Value("msg") == "OK" ? 1 : -1; } catch (Exception ex) { LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"检测条码信息至{M141Config.MESUploadURL}异常,{ex.GetExceptionMessage()}"); msg.Result = -1; } return msg; } } }