| | |
| | | using static System.Net.WebRequestMethods; |
| | | using File = System.IO.File; |
| | | using Spire.Additions.Xps.Schema; |
| | | using log4net; |
| | | |
| | | namespace iWare_SCADA_BusinessLogical |
| | | { |
| | |
| | | string path36 = ConfigHelper.GetConfigString("OP30QualityDataFor36Station");//op30 3工位,6工位地址 |
| | | string path45 = ConfigHelper.GetConfigString("OP30QualityDataFor45Station");//op30 4工位,5工位地址 |
| | | string pathOP20 = ConfigHelper.GetConfigString("OP20QualityData"); |
| | | string pathOP60 = ConfigHelper.GetConfigString("OP60QualityData"); |
| | | //string pathOP60 = ConfigHelper.GetConfigString("OP60QualityData"); |
| | | string pathOP60 = @"Q:\Measuring_Data_dfq\";//写死地址 【Editby shaocx,2024-06-25】 |
| | | if (string.IsNullOrEmpty(path36)) |
| | | { |
| | | path36 = @"Z:\"; |
| | |
| | | } |
| | | if (string.IsNullOrEmpty(pathOP60)) |
| | | { |
| | | pathOP60 = @"V:\"; |
| | | pathOP60 = @"Q:\Measuring_Data_dfq\"; |
| | | } |
| | | |
| | | if (DataCapturePointCode.Contains("CH3")) |
| | |
| | | } |
| | | DateTime? fileFindTime = null; |
| | | DateTime? op60QualityTime = null; |
| | | |
| | | // 质量信息:涨断力矩... 预拧紧力矩 预拧紧角度 终拧紧力矩 终拧紧角度 |
| | | //kistler_crack 涨断力矩 工位3 涨断力矩(Y - Maximum) 质量结果(Result) |
| | | //kistler_bush 压装力矩 工位6 衬套压装力矩(Y - Maximum) 衬套压装位移(Block X) 质量结果(Result) |
| | |
| | | Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}进入测量完成【{value_02}】【{value.ToString()}】"); |
| | | |
| | | threadStatusMonitor.Threadlastmodifytime = DateTime.Now; |
| | | WorkPieceLogMiddle wplog = new WorkPieceLogMiddle(); |
| | | wplog.Id = Yitter.IdGenerator.YitIdHelper.NextId(); |
| | | wplog.WorkingProcedure = WorkingProcedure; |
| | | wplog.EquipmentID = _dataCaptureConfig.EquipmentID; ; |
| | | wplog.Remarks = WorkingProcedure; |
| | | wplog.MonitoringPoint = DataCapturePointCode; |
| | | wplog.CreatedTime = DateTimeHelper.GetDateTime(); |
| | | wplog.CreatedUserName = DataCapturePointCode; |
| | | wplog.UpdatedUserName = Environment.MachineName + "自动" + Thread.CurrentThread.ManagedThreadId.ToString(); |
| | | wplog.UpdatedTime = DateTimeHelper.GetDateTime(); |
| | | wplog.IsDeleted = false; |
| | | wplog.QualityType = QualityType.Online.ToString(); |
| | | WorkPieceLogMiddle logMiddle = new WorkPieceLogMiddle(); |
| | | logMiddle.Id = Yitter.IdGenerator.YitIdHelper.NextId(); |
| | | logMiddle.WorkingProcedure = WorkingProcedure; |
| | | logMiddle.EquipmentID = _dataCaptureConfig.EquipmentID; ; |
| | | logMiddle.Remarks = WorkingProcedure; |
| | | logMiddle.MonitoringPoint = DataCapturePointCode; |
| | | logMiddle.CreatedTime = DateTimeHelper.GetDateTime(); |
| | | logMiddle.CreatedUserName = DataCapturePointCode; |
| | | logMiddle.UpdatedUserName = Environment.MachineName + "自动" + Thread.CurrentThread.ManagedThreadId.ToString(); |
| | | logMiddle.UpdatedTime = DateTimeHelper.GetDateTime(); |
| | | logMiddle.IsDeleted = false; |
| | | logMiddle.QualityType = QualityType.Online.ToString(); |
| | | |
| | | foreach (var col in colConfig.Where(o => o.DataCapturePointCode == DataCapturePointCode)) |
| | | { |
| | |
| | | { |
| | | var valuecol = plcService.ReadValuePoint(col.DbNumber, col.Offset, col.DataCaptureColumnLength.Value, PLCManger.GetTypeForString(col.DataCaptureColumnType)); |
| | | //wplog.GetType().GetProperty(col.DataCaptureColumnTabelName).SetValue(wplog, valuecol);//给动态字段赋值 |
| | | var set = wplog.GetType().GetProperty(col.DataCaptureColumnTabelName); |
| | | var set = logMiddle.GetType().GetProperty(col.DataCaptureColumnTabelName); |
| | | if (set == null) |
| | | { |
| | | Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $" {DataCapturePointCode}工序监控测量完成标记 读取工件码动态由于字段名没找到,赋值【{WorkingProcedure ?? "空字符串"}】失败{wplog.Id}"); |
| | | Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $" {DataCapturePointCode}工序监控测量完成标记 读取工件码动态由于字段名没找到,赋值【{WorkingProcedure ?? "空字符串"}】失败{logMiddle.Id}"); |
| | | } |
| | | if (set.PropertyType.FullName.Equals("System.String")) |
| | | { |
| | | set.SetValue(wplog, valuecol.ToString());//给动态字段赋值 |
| | | set.SetValue(logMiddle, valuecol.ToString());//给动态字段赋值 |
| | | } |
| | | else |
| | | { |
| | | set.SetValue(wplog, valuecol);//给动态字段赋值 |
| | | set.SetValue(logMiddle, valuecol);//给动态字段赋值 |
| | | } |
| | | } |
| | | catch (Exception setex) |
| | | { |
| | | Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $" {DataCapturePointCode}工序监控测量完成标记 读取工件码动态赋值【{WorkingProcedure ?? "空字符串"}】异常{wplog.Id}", setex); |
| | | Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $" {DataCapturePointCode}工序监控测量完成标记 读取工件码动态赋值【{WorkingProcedure ?? "空字符串"}】异常{logMiddle.Id}", setex); |
| | | } |
| | | } |
| | | |
| | |
| | | files = files.OrderByDescending(o => o.LastWriteTime).ToList(); |
| | | if (files.Count > 0) |
| | | { |
| | | Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"工位【{DataCapturePointCode}】工件【{wplog.WorkPieceID ?? "空字符"}】文件{files[0].FullName}测量完成读取文件数据开始"); |
| | | Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"工位【{DataCapturePointCode}】工件【{logMiddle.WorkPieceID ?? "空字符"}】文件{files[0].FullName}测量完成读取文件数据开始"); |
| | | switch (DataCapturePointCode) |
| | | { |
| | | case "OP3002CH3": |
| | | wplog.OP30QualityFilePathCH3 = files[0].FullName; |
| | | wplog.QualityStateStr = FileHelper.ReadPdfFileForSpire(files[0].FullName, "Result"); |
| | | wplog.QualityOP30To1 = FileHelper.ReadPdfFileForSpire(files[0].FullName, "Y-Maximum");//涨断力矩 |
| | | logMiddle.OP30QualityFilePathCH3 = files[0].FullName; |
| | | logMiddle.QualityStateStr = FileHelper.ReadPdfFileForSpire(files[0].FullName, "Result"); |
| | | logMiddle.QualityOP30To1 = FileHelper.ReadPdfFileForSpire(files[0].FullName, "Y-Maximum");//涨断力矩 |
| | | break; |
| | | case "OP3002CH4": |
| | | wplog = GetCH4Info(files[0].FullName, wplog); |
| | | wplog.OP30QualityFilePathCH4 = files[0].FullName; |
| | | logMiddle = GetCH4Info(files[0].FullName, logMiddle); |
| | | logMiddle.OP30QualityFilePathCH4 = files[0].FullName; |
| | | break; |
| | | case "OP3002CH5": |
| | | wplog = GetCH5Info(files[0].FullName, wplog); |
| | | wplog.OP30QualityFilePathCH5 = files[0].FullName; |
| | | logMiddle = GetCH5Info(files[0].FullName, logMiddle); |
| | | logMiddle.OP30QualityFilePathCH5 = files[0].FullName; |
| | | break; |
| | | case "OP3002CH6": |
| | | wplog.OP30QualityFilePathCH6 = files[0].FullName; |
| | | wplog.QualityStateStr = FileHelper.ReadPdfFileForSpire(files[0].FullName, "Result"); |
| | | wplog.QualityOP30To6 = FileHelper.ReadPdfFileForSpire(files[0].FullName, "Y-Maximum");//衬套压装力矩 |
| | | wplog.QualityOP30To7 = FileHelper.ReadPdfFileForSpire(files[0].FullName, "Block X");//衬套压装位移 |
| | | logMiddle.OP30QualityFilePathCH6 = files[0].FullName; |
| | | logMiddle.QualityStateStr = FileHelper.ReadPdfFileForSpire(files[0].FullName, "Result"); |
| | | logMiddle.QualityOP30To6 = FileHelper.ReadPdfFileForSpire(files[0].FullName, "Y-Maximum");//衬套压装力矩 |
| | | logMiddle.QualityOP30To7 = FileHelper.ReadPdfFileForSpire(files[0].FullName, "Block X");//衬套压装位移 |
| | | break; |
| | | default: |
| | | break; |
| | |
| | | } |
| | | else if (WorkingProcedure.Equals("OP35")) |
| | | { |
| | | if (wplog.OP35OK) |
| | | if (logMiddle.OP35OK) |
| | | { |
| | | wplog.QualityStateStr = "OK"; |
| | | logMiddle.QualityStateStr = "OK"; |
| | | } |
| | | else |
| | | { |
| | | wplog.QualityStateStr = "NG"; |
| | | logMiddle.QualityStateStr = "NG"; |
| | | } |
| | | } |
| | | else if (WorkingProcedure.Equals("OP60")) |
| | | { |
| | | //增加OP60 质量信息读取校验 【Editby shaocx,2024-06-07】 |
| | | if (wplog.Op60_Place_Flag == false) continue; |
| | | var gongweiStr = DataCapturePointCode.Substring(DataCapturePointCode.Length - 1, 1); |
| | | if (logMiddle.Op60_Place_Flag == false) |
| | | { |
| | | Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成,是指定的工件{logMiddle.WorkPieceID},工位{gongweiStr},不通过,读取Op60_Place_Flag:false"); |
| | | continue; |
| | | }; |
| | | Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成,是指定的工件{logMiddle.WorkPieceID},工位{gongweiStr},校验通过,读取Op60_Place_Flag:true"); |
| | | |
| | | |
| | | var time = DateTimeHelper.GetDateTime(); |
| | | if (fileFindTime == null) |
| | |
| | | { |
| | | files.Add((FileInfo)file); |
| | | } |
| | | //注意:一定要筛选制定的文件数据 |
| | | files = files.Where(x => x.Name.Contains("SP-" + gongweiStr)).OrderByDescending(o => o.LastWriteTime).ToList();//筛选取最新的文件 【Editby shaocx,2024-06-19】 |
| | | if (files.Count() > 0) |
| | | { |
| | | files = files.OrderByDescending(o => o.LastWriteTime).ToList(); |
| | | Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取到文件{files.Count()}个,是指定的工件{logMiddle.WorkPieceID},,工位{gongweiStr}上次获取尼伯丁文件里的时间值:{(op60QualityTime == null ? "" : op60QualityTime.ToString())}"); |
| | | List<OP60Info> op60Infos = new List<OP60Info>(); |
| | | foreach (var file in files) |
| | | {//取倒序匹配的文件名为工件号的文件 |
| | | if (file.Name.Contains("SP-" + DataCapturePointCode.Substring(DataCapturePointCode.Length - 1, 1))) |
| | | { |
| | | Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取到文件{file.Name},是指定的工件{wplog.WorkPieceID},上次获取尼伯丁文件里的时间值:{(op60QualityTime == null ? "" : op60QualityTime.ToString())}"); |
| | | bool isFindFile = false; |
| | | //注意:只取第一个文件就可以啦!!!!!! 【Editby shaocx,2024-06-19】 |
| | | var source_doFile = files.First();//原始读的文件 |
| | | |
| | | //拷贝文件 |
| | | //目标文件的完整目录 |
| | | string destFileName = source_doFile.FullName.Replace("Measuring_Data_dfq", "Measuring_Data_df_Copy"); |
| | | string source_file_name = source_doFile.Name.Replace(".dfq", "");//不带扩展名的文件名字 |
| | | destFileName = destFileName.Replace(source_file_name, source_file_name + "_" + logMiddle.WorkPieceID + "_" + DateTime.Now.ToString("yyyyMMddHHmmss")); |
| | | File.Copy(source_doFile.FullName, destFileName, true); |
| | | |
| | | |
| | | FileInfo destFile = new FileInfo(destFileName); |
| | | var doFiles = new List<FileInfo>() { destFile }; |
| | | foreach (var file in doFiles) |
| | | {//取倒序匹配的文件名为工件号的文件 |
| | | if (file.Name.Contains("SP-" + gongweiStr)) |
| | | { |
| | | Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取到文件{file.Name},是指定的工件{logMiddle.WorkPieceID},,工位{gongweiStr}上次获取尼伯丁文件里的时间值:{(op60QualityTime == null ? "" : op60QualityTime.ToString())}"); |
| | | isFindFile = true; |
| | | var datatable = CSVHelper.ReadCSVList(file.FullName); |
| | | Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取文件{file.Name},指定工件号{logMiddle.WorkPieceID},,工位{gongweiStr}发现文件行数{datatable.Count}"); |
| | | if (datatable.Count < 106) |
| | | {//质量数据从106行开始 |
| | | Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取文件{file.Name},指定工件号{logMiddle.WorkPieceID},,工位{gongweiStr}发现文件行数{datatable.Count}小于106"); |
| | | continue; |
| | | } |
| | | datatable.Reverse(); |
| | |
| | | { |
| | | if (op60QualityTime.HasValue) |
| | | { |
| | | //if (op60Infos[0].datetimeHandle > op60QualityTime.Value) |
| | | //{//这个时间判断要不要拿掉?? 【Editby shaocx,2024-06-19】 |
| | | // wplog.QualityOP60To1 = op60Infos[0].value; |
| | | // wplog.QualityOP60To2 = op60Infos[1].value; |
| | | // wplog.OP60QualityFilePath = file.FullName; |
| | | // Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取到文件{file.Name},是指定的工件{wplog.WorkPieceID},工位{gongweiStr}成功赋值了OP60QualityFilePath等字段"); |
| | | //} |
| | | //else |
| | | //{ |
| | | // var msg = $",因为判断时间不符合,op60Infos[0].datetimeHandle:{(op60Infos[0].datetimeHandle == null ? "" : op60Infos[0].datetimeHandle.ToString())}小于等于op60QualityTime:{(op60QualityTime.Value == null ? "" : op60QualityTime.Value.ToString())}"; |
| | | // Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取到文件{file.Name},是指定的工件{wplog.WorkPieceID},工位{gongweiStr}没能赋值OP60QualityFilePath等字段,{msg}"); |
| | | // break; |
| | | //} |
| | | logMiddle.QualityOP60To1 = op60Infos[0].value; |
| | | logMiddle.QualityOP60To2 = op60Infos[1].value; |
| | | logMiddle.OP60QualityFilePath = file.FullName; |
| | | Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取到文件{file.Name},是指定的工件{logMiddle.WorkPieceID},工位{gongweiStr}成功赋值了OP60QualityFilePath等字段,读取时间:{op60Infos[0].datetimeHandle.ToString()}"); |
| | | if (op60Infos[0].datetimeHandle > op60QualityTime.Value) |
| | | { |
| | | wplog.QualityOP60To1 = op60Infos[0].value; |
| | | wplog.QualityOP60To2 = op60Infos[1].value; |
| | | wplog.OP60QualityFilePath = file.FullName; |
| | | {//这个时间判断要不要拿掉?? 【Editby shaocx,2024-06-19】 |
| | | } |
| | | else |
| | | { |
| | | break; |
| | | var msg = $",只是警告!因为判断时间不符合,op60Infos[0].datetimeHandle:{(op60Infos[0].datetimeHandle == null ? "" : op60Infos[0].datetimeHandle.ToString())}小于等于op60QualityTime:{(op60QualityTime.Value == null ? "" : op60QualityTime.Value.ToString())}"; |
| | | Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取到文件{file.Name},是指定的工件{logMiddle.WorkPieceID},工位{gongweiStr}没能赋值OP60QualityFilePath等字段,{msg}"); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | wplog.QualityOP60To1 = op60Infos[0].value; |
| | | wplog.QualityOP60To2 = op60Infos[1].value; |
| | | wplog.OP60QualityFilePath = file.FullName; |
| | | logMiddle.QualityOP60To1 = op60Infos[0].value; |
| | | logMiddle.QualityOP60To2 = op60Infos[1].value; |
| | | logMiddle.OP60QualityFilePath = file.FullName; |
| | | Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取到文件{file.Name},是指定的工件{logMiddle.WorkPieceID},工位{gongweiStr}成功赋值了OP60QualityFilePath等字段,读取时间:{op60Infos[0].datetimeHandle.ToString()}"); |
| | | } |
| | | op60QualityTime = op60Infos[0].datetimeHandle; |
| | | |
| | | |
| | | |
| | | break; |
| | | } |
| | | |
| | | } |
| | | else |
| | | { |
| | | Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取文件{file.FullName}不是指定工件{wplog.WorkPieceID}"); |
| | | Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取文件{file.Name}不是指定工件{logMiddle.WorkPieceID},工位{gongweiStr}"); |
| | | } |
| | | } |
| | | if (isFindFile == false) |
| | | { |
| | | Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成没有找到文件,指定工件{logMiddle.WorkPieceID},工位{gongweiStr}"); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成,通过筛选过滤,没有找到文件,指定工件{logMiddle.WorkPieceID},工位{gongweiStr}"); |
| | | } |
| | | } |
| | | else if (WorkingProcedure.Equals("OP20")) |
| | | { |
| | | var gongweiStr = DataCapturePointCode.Substring(DataCapturePointCode.Length - 1, 1); |
| | | //记录公用变量,保存点位M88的信息 【Editby shaocx,2024-06-07】 |
| | | if (DataCapturePointCode.Contains("OP2002C")) |
| | | {//从OP2002C读取,因为顺序是 CBA,而不是ABC |
| | | string sideValue = GetSideForOP20(plcService); |
| | | string sideValue = GetSideForOP20(plcService, logMiddle); |
| | | SystemValue.OP20_Side_Value = sideValue; |
| | | } |
| | | wplog.MonitoringPoint += SystemValue.OP20_Side_Value; |
| | | wplog.CreatedUserName = wplog.MonitoringPoint; |
| | | logMiddle.MonitoringPoint += SystemValue.OP20_Side_Value; |
| | | logMiddle.CreatedUserName = logMiddle.MonitoringPoint; |
| | | |
| | | Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成,是指定的工件{logMiddle.WorkPieceID},工位{gongweiStr},校验通过,读取Op60_Place_Flag:true"); |
| | | |
| | | var time = DateTimeHelper.GetDateTime(); |
| | | if (fileFindTime == null) |
| | |
| | | { |
| | | files.Add((FileInfo)file); |
| | | } |
| | | Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"工位【{DataCapturePointCode}】工件【{wplog.WorkPieceID ?? "空字符"}】获取到【{files.Count()}】个文件,【{fileFindTime.Value}】【{time.AddHours(2)}】"); |
| | | //注意:一定要筛选制定的文件数据 |
| | | files = files.Where(x => x.Name.Contains("SP-" + gongweiStr)).OrderByDescending(o => o.LastWriteTime).ToList();//筛选取最新的文件 【Editby shaocx,2024-06-19】 |
| | | |
| | | Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"工位【{DataCapturePointCode}】工件【{logMiddle.WorkPieceID ?? "空字符"}】获取到【{files.Count()}】个文件,【{fileFindTime.Value}】【{time.AddHours(2)}】"); |
| | | |
| | | if (files.Count() > 0) |
| | | { |
| | | bool isFindFile = false; |
| | | Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取到文件{files.Count()}个,是指定的工件{logMiddle.WorkPieceID},工位{gongweiStr},上次获取尼伯丁文件里的时间值:{(op60QualityTime == null ? "" : op60QualityTime.ToString())}"); |
| | | files = files.OrderByDescending(o => o.LastWriteTime).ToList(); |
| | | List<OP60Info> op60Infos = new List<OP60Info>(); |
| | | foreach (var file in files) |
| | | //注意:只取第一个文件就可以啦!!!!!! 【Editby shaocx,2024-06-19】 |
| | | var doFiles = new List<FileInfo>() { files.First() }; |
| | | foreach (var file in doFiles) |
| | | {//取倒序匹配的文件名为工件号的文件 |
| | | if (file.Name.Contains("SP-" + DataCapturePointCode.Substring(DataCapturePointCode.Length - 1, 1))) |
| | | if (file.Name.Contains("SP-" + gongweiStr)) |
| | | { |
| | | Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取到文件{file.Name},是指定的工件{wplog.WorkPieceID},上次获取尼伯丁文件里的时间值:{(op60QualityTime == null ? "" : op60QualityTime.ToString())}"); |
| | | isFindFile = true; |
| | | Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取到文件{file.Name},是指定的工件{logMiddle.WorkPieceID},工位{gongweiStr},上次获取尼伯丁文件里的时间值:{(op60QualityTime == null ? "" : op60QualityTime.ToString())}"); |
| | | |
| | | var datatable = CSVHelper.ReadCSVList(file.FullName); |
| | | Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取文件{file.Name},指定工件号{logMiddle.WorkPieceID},,工位{gongweiStr}发现文件行数{datatable.Count}"); |
| | | if (datatable.Count < 57) |
| | | {//质量数据从106行开始 |
| | | Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取文件{file.Name},指定工件号{logMiddle.WorkPieceID},,工位{gongweiStr}发现文件行数{datatable.Count}小于106"); |
| | | continue; |
| | | } |
| | | datatable.Reverse(); |
| | |
| | | { |
| | | if (op60QualityTime.HasValue) |
| | | { |
| | | //if (op60Infos[0].datetimeHandle > op60QualityTime.Value) |
| | | //{ |
| | | // wplog.QualityOP20To1 = op60Infos[0].value; |
| | | // wplog.OP20QualityFilePath = file.FullName; |
| | | //} |
| | | //else |
| | | //{ |
| | | // break; |
| | | //} |
| | | logMiddle.QualityOP20To1 = op60Infos[0].value; |
| | | logMiddle.OP20QualityFilePath = file.FullName; |
| | | Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取到文件{file.Name},是指定的工件{logMiddle.WorkPieceID},工位{gongweiStr}成功赋值了OP20QualityFilePath等字段,读取时间:{op60Infos[0].datetimeHandle.ToString()}"); |
| | | if (op60Infos[0].datetimeHandle > op60QualityTime.Value) |
| | | { |
| | | wplog.QualityOP20To1 = op60Infos[0].value; |
| | | wplog.OP20QualityFilePath = file.FullName; |
| | | {//这个时间判断要不要拿掉?? 【Editby shaocx,2024-06-19】 |
| | | } |
| | | else |
| | | { |
| | | break; |
| | | var msg = $",只是警告!因为判断时间不符合,op60Infos[0].datetimeHandle:{(op60Infos[0].datetimeHandle == null ? "" : op60Infos[0].datetimeHandle.ToString())}小于等于op60QualityTime:{(op60QualityTime.Value == null ? "" : op60QualityTime.Value.ToString())}"; |
| | | Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取到文件{file.Name},是指定的工件{logMiddle.WorkPieceID},工位{gongweiStr}没能赋值OP60QualityFilePath等字段,{msg}"); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | wplog.QualityOP20To1 = op60Infos[0].value; |
| | | wplog.OP20QualityFilePath = file.FullName; |
| | | logMiddle.QualityOP20To1 = op60Infos[0].value; |
| | | logMiddle.OP20QualityFilePath = file.FullName; |
| | | Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取到文件{file.Name},是指定的工件{logMiddle.WorkPieceID},工位{gongweiStr}成功赋值了OP20QualityFilePath等字段,读取时间:{op60Infos[0].datetimeHandle.ToString()}"); |
| | | } |
| | | op60QualityTime = op60Infos[0].datetimeHandle; |
| | | break; |
| | |
| | | } |
| | | else |
| | | { |
| | | Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取文件{file.FullName}不是指定工件{wplog.WorkPieceID}"); |
| | | Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取文件{file.FullName}不是指定工件{logMiddle.WorkPieceID}"); |
| | | } |
| | | } |
| | | |
| | | if (isFindFile == false) |
| | | { |
| | | Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成没有找到文件,指定工件{logMiddle.WorkPieceID},工位{gongweiStr}"); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成,通过筛选过滤,没有找到文件,指定工件{logMiddle.WorkPieceID},工位{gongweiStr}"); |
| | | } |
| | | } |
| | | |
| | |
| | | Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}测量完成读取文件数据时异常,避免工序完成异常:", ex); |
| | | } |
| | | |
| | | //根据质量数据判断是否合格/不合格 【Editby shaocx,2024-06-25】 |
| | | QualityNoOkEnum? qualityNoOkEnum = null; |
| | | QualityState qualityState = CalcQualityStateForOP(logMiddle, ref qualityNoOkEnum); |
| | | logMiddle.QualityState = (int)qualityState; |
| | | if (qualityNoOkEnum != null) |
| | | { |
| | | logMiddle.QualityNoOk = (int)qualityNoOkEnum; |
| | | logMiddle.QualityNoOkReason = qualityNoOkEnum.ToString(); |
| | | } |
| | | //更新WorkPieceInfo表以及插入WorkPieceLog表和WorkPieceInfoLog表 |
| | | WorkPieceInfoManager.QualityInfoComplete(wplog, PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure)); |
| | | WorkPieceInfoManager.QualityInfoComplete(logMiddle, PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure)); |
| | | threadStatusMonitor.Threadstatue = 1; |
| | | |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// 获取OP20的哪个面 |
| | | /// </summary> |
| | | /// <param name="plcService"></param> |
| | | /// <returns></returns> |
| | | private string GetSideForOP20(PLCService plcService) |
| | | private string GetSideForOP20(PLCService plcService, WorkPieceLogMiddle wplog) |
| | | { |
| | | try |
| | | { |
| | | object value_M88 = plcService.ReadValuePointV2("M88", PLCManger.GetTypeForString("int")); |
| | | int i_value_M88 = 0; |
| | | var isRight = int.TryParse(value_M88.ToString(), out i_value_M88); |
| | | Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"读取 {DataCapturePointCode}工序监控测量标记数据时异常,获取OP20的哪个面,i_value_M88:{i_value_M88}"); |
| | | Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"读取 {DataCapturePointCode}工序监控测量标记数据,获取OP20的哪个面,i_value_M88:{i_value_M88},工件号:{wplog.WorkPieceID}"); |
| | | if (isRight) |
| | | { |
| | | if (i_value_M88 == 64) |
| | | { |
| | | return "1"; |
| | | } |
| | | else if (i_value_M88 == 16384) |
| | | {//原定为16384为正在旋转,监控下来,发现 16384应该是工位1的问题 【Editby shaocx,2024-06-12】 |
| | | return "1"; |
| | | } |
| | | else if (i_value_M88 == 256) |
| | |
| | | return "4"; |
| | | } |
| | | } |
| | | Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"读取 {DataCapturePointCode}工序监控测量标记数据时,无效数值,获取OP20的哪个面,,i_value_M88:{i_value_M88},工件号:{wplog.WorkPieceID}", null); |
| | | return ""; |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"读取 {DataCapturePointCode}工序监控测量标记数据时异常,获取OP20的哪个面,:", ex); |
| | | Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"读取 {DataCapturePointCode}工序监控测量标记数据时异常,获取OP20的哪个面,工件号:{wplog.WorkPieceID}", ex); |
| | | return ""; |
| | | } |
| | | } |
| | |
| | | |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 计算OP 质量数据是否合格 |
| | | /// </summary> |
| | | public QualityState CalcQualityStateForOP(WorkPieceLogMiddle logMiddle, ref QualityNoOkEnum? qualityNoOkEnum) |
| | | { |
| | | QualityState qualityState = QualityState.Suspected; |
| | | if (logMiddle.WorkingProcedure == "OP60") |
| | | { |
| | | decimal _QualityOP60To1 = SystemHelper.GetDecimal(logMiddle.QualityOP60To1); |
| | | decimal _QualityOP60To2 = SystemHelper.GetDecimal(logMiddle.QualityOP60To2); |
| | | var isPass_QualityOP60To1 = false; |
| | | var isPass_QualityOP60To2 = false; |
| | | |
| | | |
| | | if (_QualityOP60To1 >= (decimal)53.018 && _QualityOP60To1 <= (decimal)53.030) |
| | | { |
| | | isPass_QualityOP60To1 = true; |
| | | } |
| | | else |
| | | { |
| | | qualityNoOkEnum = QualityNoOkEnum.OP60大头孔直径超差; |
| | | } |
| | | if (_QualityOP60To2 >= (decimal)22.005 && _QualityOP60To2 <= (decimal)22.011) |
| | | { |
| | | isPass_QualityOP60To2 = true; |
| | | } |
| | | else |
| | | { |
| | | qualityNoOkEnum = QualityNoOkEnum.OP60小头孔直径超差; |
| | | } |
| | | |
| | | if (isPass_QualityOP60To1 && isPass_QualityOP60To2) |
| | | { |
| | | qualityState = QualityState.OK; |
| | | } |
| | | else |
| | | { |
| | | qualityState = QualityState.NG; |
| | | } |
| | | if (_QualityOP60To1 == 0 || _QualityOP60To2 == 0) |
| | | { |
| | | qualityState = QualityState.Suspected; |
| | | return qualityState; |
| | | } |
| | | return qualityState; |
| | | } |
| | | else if (logMiddle.WorkingProcedure == "OP10") |
| | | { |
| | | if (logMiddle.QualityState != (int)QualityState.OK) |
| | | { |
| | | qualityNoOkEnum = QualityNoOkEnum.OP10厚度超差; |
| | | } |
| | | return qualityState; |
| | | } |
| | | else if (logMiddle.WorkingProcedure == "OP20") |
| | | { |
| | | if (logMiddle.QualityState != (int)QualityState.OK) |
| | | { |
| | | qualityNoOkEnum = QualityNoOkEnum.OP20小头孔直径超差; |
| | | } |
| | | return qualityState; |
| | | } |
| | | else if (logMiddle.WorkingProcedure == "OP35") |
| | | { |
| | | if (logMiddle.QualityState != (int)QualityState.OK) |
| | | { |
| | | qualityNoOkEnum = QualityNoOkEnum.OP35滚压力不合格; |
| | | } |
| | | return qualityState; |
| | | } |
| | | else if (logMiddle.WorkingProcedure == "OP40") |
| | | { |
| | | if (logMiddle.QualityState != (int)QualityState.OK) |
| | | { |
| | | qualityNoOkEnum = QualityNoOkEnum.OP40厚度超差; |
| | | } |
| | | return qualityState; |
| | | } |
| | | return qualityState; |
| | | } |
| | | |
| | | |
| | | } |
| | | } |