diff --git a/Analysis/CenterControl.cs b/Analysis/CenterControl.cs index 7da1f4e..c6ab28a 100644 --- a/Analysis/CenterControl.cs +++ b/Analysis/CenterControl.cs @@ -1,1368 +1,1221 @@ -using System; +using BaseFunction; +using DAL; +using HslCommunication.Profinet.Siemens; +using Newtonsoft.Json; +using NSAnalysis.Properties; +using PLCModule; +using System; using System.Collections.Generic; -using System.ComponentModel; using System.Data; using System.Drawing; -using System.Text; -using System.Windows.Forms; -using System.Text.RegularExpressions; -using System.Collections; using System.IO; -using System.Xml; -using BaseFunction; -using Telerik.WinControls.UI; -using Telerik.WinControls; -using System.Linq; -using System.Windows.Forms.DataVisualization.Charting; -using NSAnalysis.Properties; -using static Telerik.WinControls.UI.ValueMapper; -using PLCModule; -using HslCommunication.Profinet.Siemens; -using static System.Windows.Forms.VisualStyles.VisualStyleElement.TrackBar; -using System.Threading; -using UserControlClass; -using DAL; -using System.Linq.Expressions; -using Newtonsoft.Json; -using System.Net; -using System.Xml.Linq; using System.IO.Ports; -using System.Drawing.Printing; -using System.Drawing.Text; -using NSAnalysis; +using System.Linq; +using System.Net; +using System.Text; +using System.Threading; +using System.Windows.Forms; +using Telerik.WinControls; +using Telerik.WinControls.UI; +using UserControlClass; namespace NSAnalysis { - public partial class CenterControl : Telerik.WinControls.UI.ShapedForm - { - #region 全局变量 + /// + /// + /// + /// + /// + /// 2025.08.29 ---------------------------------------------------- + /// 1、增加对 生成报告数据的备份 √ + /// 2、增加对上传json的记录和重发 + /// 3、增加对 PLC启动测量信号的判断 4、PLC通讯阻塞问题 + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// - private int[] yValues = new int[3]; - private string[] xValues = new string[3]; - private DataTable dtCSVContent = new DataTable(); - private DataTable dtRangeData = new DataTable(); - private TMeasureMSSQLDAL tmdal = new TMeasureMSSQLDAL(); - private string strSaveReprotPath = ""; - private bool bReadCSVFlag = false; - private List ListPostIOTData = new List(); - private FEHYLeftCarData fLEHY = null; - private FEHYRightCarData fREHY = null; + public partial class CenterControl : Telerik.WinControls.UI.ShapedForm + { + #region 全局变量 - private FEH3LeftCarData fLEH3 = null; - private FEH3RightCarData fREH3 = null; + private int[] yValues = new int[3]; + private string[] xValues = new string[3]; + private DataTable dtCSVContent = new DataTable(); + private DataTable dtRangeData = new DataTable(); + private TMeasureMSSQLDAL tmdal = new TMeasureMSSQLDAL(); + private string strSaveReprotPath = ""; + private bool bReadCSVFlag = false; + private List ListPostIOTData = new List(); + private FEHYLeftCarData fLEHY = null; + private FEHYRightCarData fREHY = null; - private int iCurrentMeasureItemsFailedCount = 0; - #region PLC相关变量 + private FEH3LeftCarData fLEH3 = null; + private FEH3RightCarData fREH3 = null; - private bool bStopPlcNormal = false; - private static int HeartBeatCount = 0; - private bool bPlcLiveTickLast = false; + private int iCurrentMeasureItemsFailedCount = 0; + #region PLC相关变量 - private Thread m_ThreadReconnectPLC = null; - private int m_ReConnectNum = 0; - private bool bTickt = true; - private int iLastNSStartMeasure = 0; - private int iLastCarPassFlag = 0; - private int iLastStation1To2 = 0; - private int iLastStation2To3 = 0; - private int iLastReadVINFinishFlag = 0; + private bool bStopPlcNormal = false; + private static int HeartBeatCount = 0; + private bool bPlcLiveTickLast = false; - private SerialPort serialTestPort = null; + private Thread m_ThreadReconnectPLC = null; + private int m_ReConnectNum = 0; + private bool bTickt = true; + private int iLastNSStartMeasure = 0; + private int iLastCarPassFlag = 0; + private int iLastStation1To2 = 0; + private int iLastStation2To3 = 0; + private int iLastReadVINFinishFlag = 0; - private SerialPort serialPort = null; - private int iLastMesureCount = 0; + private SerialPort serialTestPort = null; - #endregion PLC相关变量 + private SerialPort serialPort = null; + private int iLastMesureCount = 0; - #region 分页全局变量 + #endregion PLC相关变量 - private DataTable PageTable = new DataTable(); + #region 分页全局变量 - /// - /// 每页记录数 - /// - public int pageSize = 20; + private DataTable PageTable = new DataTable(); - /// - /// 总记录数 - /// - public int recordCount = 0; + /// + /// 每页记录数 + /// + public int pageSize = 20; - /// - /// 总页数 - /// - public int pageCount = 0; + /// + /// 总记录数 + /// + public int recordCount = 0; - /// - /// 当前页 - /// - public int currentPage = 0; + /// + /// 总页数 + /// + public int pageCount = 0; - #endregion 分页全局变量 + /// + /// 当前页 + /// + public int currentPage = 0; - #endregion 全局变量 + #endregion 分页全局变量 - #region 主窗口事件 + #endregion 全局变量 - public CenterControl() - { - InitializeComponent(); - SQLHelper.connStr = DatabaseDfn.SqlConnectStr(); + // 定义三个文件路径,分别存储 plc, csv 和iot过点数据,位于程序运行目录下 plc.csv iot.csv nextsense.csv + private string strPlcDataPath = Application.StartupPath + "\\plc.csv"; - // + private string strIotDataPath = Application.StartupPath + "\\iot.csv"; + private string strNextsenseDataPath = Application.StartupPath + "\\nextsense.csv"; - #region 加载皮肤 + #region 主窗口事件 - ThemeResolutionService.LoadPackageFile(ConfigDfn.strTheme); - this.ThemeName = ConfigDfn.strSkinName.Substring(0, ConfigDfn.strSkinName.Length - 5); - RPV.ThemeName = ConfigDfn.strSkinName.Substring(0, ConfigDfn.strSkinName.Length - 5); + public CenterControl() + { + InitializeComponent(); + SQLHelper.connStr = DatabaseDfn.SqlConnectStr(); - #endregion 加载皮肤 - } + #region 加载皮肤 - private void CenterControl_Load(object sender, EventArgs e) - { - #region 初始化全局变量 - fLEHY = new FEHYLeftCarData(this); - fREHY = new FEHYRightCarData(this); - fLEH3 = new FEH3LeftCarData(this); - fREH3 = new FEH3RightCarData(this); - MyBase.rleMessage = rleMessage; - rdtpStartTime.Text = DateTime.Now.ToString("yyyy-MM-dd"); - rdtpEndTime.Text = DateTime.Now.ToString("yyyy-MM-dd"); - - #endregion - //需要显示车身数据 不分析csv文件 - if (ConfigDfn.iShowCarDataFlag == 1) - { - MyBase.TraceWriteLine(" 进入显示车身模式!显示车身界面。"); - lpcShowCarData_Click(null, null); - //serialPort = new SerialPort(ConfigDfn.strCOMPort, 115200, Parity.None, 8, StopBits.One); // 设置串口参数 - //serialPort.DataReceived += new SerialDataReceivedEventHandler(DataAutoReceivedHandler); // 注册数据接收事件处理方法 - //serialPort.Open(); // 打开串口 - //if (serialPort.IsOpen) - //{ - // MyBase.TraceWriteLine(ConfigDfn.strCOMPort + "打开成功O(∩_∩)O"); - //} - //else - //{ - // MyBase.TraceWriteLine(ConfigDfn.strCOMPort + "打开失败!"); - // MessageBox.Show(ConfigDfn.strCOMPort + "打开失败!请检查扫抢串口设置是否正确。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); - //} - - } - else - { - MyBase.TraceWriteLine(" 进入不显示车身模式!"); - } - if (ConfigDfn.iAnalysisCSVFlag == 1) - { - btnConnectPlc_Click(null, null); - MyBase.TraceWriteLine(" 进入解析CSV文件模式,开始解析扫码CSV文件!"); - tmReadNextsenseCSV.Interval = 500; - tmReadNextsenseCSV.Start(); - //tmdal.updateMaintenceInfoEmpty(); - } - else - { - MyBase.TraceWriteLine(" 进入不解析CSV文件模式!"); - tmReadNextsenseCSV.Stop(); - } - - if (Directory.Exists(ConfigDfn.strNextSenseCSVEH3Path)) - { - MyBase.TraceWriteLine("软件首次启动, Nextsense EH3 CSV读取路径存在;不清空,读取NextSense生成 CSV报告路径下的所有文件,路径为:" + ConfigDfn.strNextSenseCSVEH3Path); - } - else - { - string strTip = "错误:软件首次启动,读取NextSense生成EH3 CSV报告的路径:" + ConfigDfn.strNextSenseCSVEH3Path + " 不存在!请检查并进行修改!点击是按钮,软件将自动创建该路径!"; - MyBase.TraceWriteLine(strTip); - Directory.CreateDirectory(ConfigDfn.strNextSenseCSVEH3Path); - //DialogResult dResult = MessageBox.Show(strTip, "错误", MessageBoxButtons.YesNo, MessageBoxIcon.Error); - //if (dResult == DialogResult.Yes) - //{ - // Directory.CreateDirectory(ConfigDfn.strNextSenseCSVEH3Path); - // MyBase.TraceWriteLine(strTip + " ; 点击了是按钮,软件自动创建读取目录:" + ConfigDfn.strNextSenseCSVEH3Path); - //} - //else - //{ - // MyBase.TraceWriteLine(strTip + " ;点击了否按钮,不创建目录!"); - //} - } - if (Directory.Exists(ConfigDfn.strNextSenseCSVEHYPath)) - { - MyBase.TraceWriteLine("软件首次启动, Nextsense EHY CSV读取路径存在;不清空,读取NextSense生成 CSV报告路径下的所有文件,路径为:" + ConfigDfn.strNextSenseCSVEHYPath); - } - else - { - string strTip = "错误:软件首次启动,读取NextSense生成EHY CSV报告的路径:" + ConfigDfn.strNextSenseCSVEHYPath + " 不存在!请检查并进行修改!点击是按钮,软件将自动创建该路径!"; - MyBase.TraceWriteLine(strTip); - Directory.CreateDirectory(ConfigDfn.strNextSenseCSVEHYPath); - //DialogResult dResult = MessageBox.Show(strTip, "错误", MessageBoxButtons.YesNo, MessageBoxIcon.Error); - //if (dResult == DialogResult.Yes) - //{ - // Directory.CreateDirectory(ConfigDfn.strNextSenseCSVEHYPath); - // MyBase.TraceWriteLine(strTip + " ; 点击了是按钮,软件自动创建读取目录:" + ConfigDfn.strNextSenseCSVEHYPath); - //} - //else - //{ - // MyBase.TraceWriteLine(strTip + " ;点击了否按钮,不创建目录!"); - //} - } - initLPCControl(); - - - rddlSizeName.SelectedIndex = 0; - DataTable dtMPName = tmdal.SelectAllMeasPointName(); - if (dtMPName.Rows.Count > 0) - { - for (int i = 0; i < dtMPName.Rows.Count; i++) - { - rddlMeasurePoint.Items.Add(dtMPName.Rows[i][0].ToString()); - } - rddlMeasurePoint.SelectedIndex = 0; - } - //tmdal.updateMaintenceInfoEmpty(); - //iLastMesureCount = tmdal.SelectTMeasureResultCount(); - - #region 清空信息 - - labVIN.Text = ""; - labOKCount.Text = ""; - labNGCount.Text = ""; - labRejectCount.Text = ""; - labSumMeasureCount.Text = ""; - labMeaTime.Text = ""; - labResultPercent.Text = ""; - labResult.Text = ""; - labCarType.Text = ""; - - #endregion 清空信息 - - InitTableColumns(); - strSaveReprotPath = ConfigDfn.strReportPath + @"\"; - - - //testIotUpload(); + ThemeResolutionService.LoadPackageFile(ConfigDfn.strTheme); + this.ThemeName = ConfigDfn.strSkinName.Substring(0, ConfigDfn.strSkinName.Length - 5); + RPV.ThemeName = ConfigDfn.strSkinName.Substring(0, ConfigDfn.strSkinName.Length - 5); + #endregion 加载皮肤 } - private void InitTableColumns() - { - #region 测量数据表始化表 - - //创建虚拟表 - DataColumn column2 = new DataColumn("CarID", Type.GetType("System.String")); - DataColumn dcCarType = new DataColumn("CarType", Type.GetType("System.String")); - DataColumn column3 = new DataColumn("MeasPointName", Type.GetType("System.String")); - DataColumn column4 = new DataColumn("DimensionName", Type.GetType("System.String")); - DataColumn column5 = new DataColumn("NormalValue", Type.GetType("System.String")); - DataColumn column6 = new DataColumn("LowerTolVal", Type.GetType("System.String")); - DataColumn column7 = new DataColumn("UpperTolVal", Type.GetType("System.String")); - DataColumn column8 = new DataColumn("MeasureValue", Type.GetType("System.String")); - DataColumn column10 = new DataColumn("MeasureItemResult", Type.GetType("System.String")); - DataColumn column9 = new DataColumn("MeasureDate", Type.GetType("System.DateTime")); - DataColumn column1 = new DataColumn("Remark", Type.GetType("System.String")); - //将列添加到table表中 - - dtCSVContent.Columns.Add(column2); - dtCSVContent.Columns.Add(dcCarType); - dtCSVContent.Columns.Add(column3); - dtCSVContent.Columns.Add(column4); - dtCSVContent.Columns.Add(column5); - dtCSVContent.Columns.Add(column6); - dtCSVContent.Columns.Add(column7); - dtCSVContent.Columns.Add(column8); - dtCSVContent.Columns.Add(column10); - dtCSVContent.Columns.Add(column9); - dtCSVContent.Columns.Add(column1); - - #endregion 测量数据表始化表 - - #region 极差数据Table初始化 - - //创建虚拟表 - DataColumn dcCarID = new DataColumn("CarID", Type.GetType("System.String")); - DataColumn dcRangeName = new DataColumn("RangeName", Type.GetType("System.String")); - DataColumn dcRangeValue = new DataColumn("RangeValue", Type.GetType("System.String")); - DataColumn dcRangeLowUpp = new DataColumn("RangeLowUpp", Type.GetType("System.String")); - DataColumn dcResult = new DataColumn("Result", Type.GetType("System.String")); - DataColumn dcCreateTime = new DataColumn("CreateTime", Type.GetType("System.DateTime")); - DataColumn dcRemark = new DataColumn("Remark", Type.GetType("System.String")); - //将列添加到table表中 - - dtRangeData.Columns.Add(dcCarID); - dtRangeData.Columns.Add(dcRangeName); - dtRangeData.Columns.Add(dcRangeValue); - dtRangeData.Columns.Add(dcRangeLowUpp); - dtRangeData.Columns.Add(dcResult); - dtRangeData.Columns.Add(dcCreateTime); - dtRangeData.Columns.Add(dcRemark); - - #endregion 测量数据表始化表 - - #region 分页相关 - - //创建分页虚拟表 - DataColumn column11 = new DataColumn("CarID", Type.GetType("System.String")); - DataColumn column12 = new DataColumn("MeasPointName", Type.GetType("System.String")); - DataColumn column13 = new DataColumn("DimensionName", Type.GetType("System.String")); - DataColumn column14 = new DataColumn("NormalValue", Type.GetType("System.String")); - DataColumn column15 = new DataColumn("LowerTolVal", Type.GetType("System.String")); - DataColumn column16 = new DataColumn("UpperTolVal", Type.GetType("System.String")); - DataColumn column17 = new DataColumn("MeasureValue", Type.GetType("System.String")); - DataColumn column18 = new DataColumn("MeasureDate", Type.GetType("System.String")); - DataColumn column19 = new DataColumn("MeasureItemResult", Type.GetType("System.String")); - - //将列添加到table表中 - PageTable.Columns.Add(column11); - PageTable.Columns.Add(column12); - PageTable.Columns.Add(column13); - PageTable.Columns.Add(column14); - PageTable.Columns.Add(column15); - PageTable.Columns.Add(column16); - PageTable.Columns.Add(column17); - PageTable.Columns.Add(column18); - PageTable.Columns.Add(column19); - - labCurrentPage.Text = "当前页:" + currentPage.ToString(); //当前页 - labSumPages.Text = "共 " + pageCount.ToString() + " 页";//总页数 - labSumRecorders.Text = "总共 " + recordCount.ToString() + " 条记录";//总记录数 - rddlPageRecorderCount.SelectedIndex = 0; - - #endregion 分页相关 - } - - private void DataAutoReceivedHandler(object sender, SerialDataReceivedEventArgs e) - { - SerialPort sp = (SerialPort)sender; - string strScanVIN = sp.ReadExisting(); - MyBase.TraceWriteLine("扫抢获取的VIN码为:" + strScanVIN); - if (strScanVIN.Length > 0) - { - tmdal.updateMaintenceInfo(strScanVIN, 3); - MyBase.TraceWriteLine("更新数据库中存储的VIN码:" + strScanVIN); - } - } - - private void initLPCControl() - { - lpcSoftwareSetup.labPicture.Click += new EventHandler(lpcSoftwareSetup_Click); - lpcSoftwareSetup.labText.Click += new EventHandler(lpcSoftwareSetup_Click); - - lpcToleranceSetup.labPicture.Click += new EventHandler(lpcToleranceSetup_Click); - lpcToleranceSetup.labText.Click += new EventHandler(lpcToleranceSetup_Click); - - lpcRange.labPicture.Click += new EventHandler(lpcRange_Click); - lpcRange.labText.Click += new EventHandler(lpcRange_Click); - - lpcPLCAddress.labPicture.Click += new EventHandler(lpcPLCAddress_Click); - lpcPLCAddress.labText.Click += new EventHandler(lpcPLCAddress_Click); - - lpcPLCTest.labPicture.Click += new EventHandler(lpcPLCTest_Click); - lpcPLCTest.labText.Click += new EventHandler(lpcPLCTest_Click); - - lpcAboutSoftware.labPicture.Click += new EventHandler(lpcAboutSoftware_Click); - lpcAboutSoftware.labText.Click += new EventHandler(lpcAboutSoftware_Click); - - lpcUploadIOTTest.labPicture.Click += new EventHandler(lpcUploadIOTTest_Click); - lpcUploadIOTTest.labText.Click += new EventHandler(lpcUploadIOTTest_Click); - - lpcTestGetCarTye.labPicture.Click += new EventHandler(lpcTestGetCarTye_Click); - lpcTestGetCarTye.labText.Click += new EventHandler(lpcTestGetCarTye_Click); - - lpcShowCarData.labPicture.Click += new EventHandler(lpcShowCarData_Click); - lpcShowCarData.labText.Click += new EventHandler(lpcShowCarData_Click); - - lpcShowLog.labPicture.Click += new EventHandler(lpcShowLog_Click); - lpcShowLog.labText.Click += new EventHandler(lpcShowLog_Click); - } - - - - private void CenterControl_FormClosed(object sender, FormClosedEventArgs e) - { - MyBase.TraceWriteLine("-------------海克斯康面隙分析软件程序关闭---------------------"); - LogDebugDfn.strEndTime = DateTime.Now.ToString("yyyy.MM.dd HH-mm-ss"); - string CopyFileName = ConfigDfn.strFileFolder + "\\DebugFiles\\" + "Debug(" + LogDebugDfn.strStartTime + " To " + LogDebugDfn.strEndTime + ")" + ".txt"; - if (File.Exists(LogDebugDfn.strDebugFile)) - File.Copy(LogDebugDfn.strDebugFile, CopyFileName); - System.Environment.Exit(0); - } - - private void tmSystem_Tick(object sender, EventArgs e) - { - rleTime.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); - if (ConfigDfn.iAnalysisCSVFlag == 1) - rleReadCSVStatus.ForeColor = bReadCSVFlag ? Color.Green : Color.White; - bReadCSVFlag = !bReadCSVFlag; - } - - #endregion 主窗口事件 - - private void tmReadNextsenseCSV_Tick(object sender, EventArgs e) - { - tmReadNextsenseCSV.Stop(); - AnalysisNextSenseSelfMeasureCSV(); - AnalysisNextSenseEH3CSV(); - AnalysisNextSenseEHYCSV(); - tmReadNextsenseCSV.Start(); - } - - #region⭐⭐⭐⭐⭐ 解析Nextsense CSV文件功能 核心算法 ⭐⭐⭐⭐⭐ - - private double CalculateStrictLowerTolerance(double dLower, double dUpper) - { - double dStrictLower = 0; - double dNormalValue = (dLower + dUpper) / 2; - dStrictLower = dNormalValue + (dLower - dNormalValue) * ConfigDfn.dTolerancePer; - return dStrictLower; - } - - private double CalculateStrictUpperTolerance(double dLower, double dUpper) - { - double dStrictUpper = 0; - double dNormalValue = (dLower + dUpper) / 2; - dStrictUpper = dNormalValue + (dUpper - dNormalValue) * ConfigDfn.dTolerancePer; - return dStrictUpper; - } - private double CalculateExceptionLowerTolerance(double dLower, double dUpper) - { - double dStrictLower = 0; - double dNormalValue = (dLower + dUpper) / 2; - dStrictLower = dNormalValue + (dLower - dNormalValue) * ConfigDfn.dExceptionTolerancePer; - return dStrictLower; - } - - private double CalculateExceptionUpperTolerance(double dLower, double dUpper) - { - double dStrictUpper = 0; - double dNormalValue = (dLower + dUpper) / 2; - dStrictUpper = dNormalValue + (dUpper - dNormalValue) * ConfigDfn.dExceptionTolerancePer; - return dStrictUpper; - } - /// - /// 解析EH3 CSV文件函数;后续如果Nextsense的csv报告模板变了,修改该函数的行号即可LineNum wsp - /// - private void AnalysisNextSenseEH3CSV() - { - try - { - lbCSVFiles.Items.Clear(); - FileInfo[] fileInfos = null; - if (Directory.Exists(ConfigDfn.strNextSenseCSVEH3Path)) - { - DirectoryInfo di = new DirectoryInfo(ConfigDfn.strNextSenseCSVEH3Path); - fileInfos = di.GetFiles("*.CSV"); - if (fileInfos.Count() >= 1) - { - MyBase.TraceWriteLine("存在EH3 CSV文件,开始解析:"); - List listCSVTitleInfo = new List(); - string strCarID = ""; - foreach (FileInfo fi in fileInfos) - { - listCSVTitleInfo.Clear(); - ListPostIOTData.Clear(); - dtCSVContent.Clear(); - dgvMeasureContent.Rows.Clear(); - string strCSVName = fi.FullName; - File.Copy(fi.FullName, ConfigDfn.strFileFolder + "\\NextSenseCSVBackup\\" + fi.Name, true); - MyBase.TraceWriteLine("Copy " + fi.FullName + " TO " + ConfigDfn.strFileFolder + "\\NextSenseCSVBackup\\" + fi.Name + " Done. 备份完成"); - lbCSVFiles.Items.Add(fi.Name); - - #region 解析EH3 CSV报告 - - MyBase.TraceWriteLine("开始解析NextSense EH3 CSV 报告:" + strCSVName); - Encoding encoding = GetType(strCSVName); - FileStream fs = new FileStream(strCSVName, FileMode.Open, FileAccess.Read); - StreamReader sr = new StreamReader(fs, encoding); - //记录每次读取的一行记录 - string strLine = ""; - //记录每行记录中的各字段内容 - string[] aryLineContent = null; - - //逐行读取CSV中的数据 - int LineNum = 0; - //表格行数 - int dtRowCount = 0; - //超差个数 - double OutCount = 0; - //Ok个数 - double OKCount = 0; - //异常个数 - double RejectedCount = 0; - //合格率 - double FPYPercent = 0; - double dStrictTLower = 0; - double dStrictTUpper = 0; - double dLowerValue = 0; - double dUpperValue = 0; - double dExcepitonTLower = 0; - double dExceptionTUpper = 0; - double dMeasureValue = 0.0; - DataTable dt = null; - while ((strLine = sr.ReadLine()) != null) - { - LineNum++; - if (LineNum >= 3 & LineNum <= 16) - { - listCSVTitleInfo.Add(strLine); - } - if (LineNum == 10) - { - aryLineContent = strLine.Split(','); - MyBase.TraceWriteLine("解析出NextSense CSV中的VIN为:" + aryLineContent[1]); - strCarID = tmdal.SelectVINByCSVVIN(aryLineContent[1]); - MyBase.TraceWriteLine("通过CSV VIN从数据库中获取的完整VIN为:" + strCarID); - if (strCarID.ToLower().Contains("nofind")) - { - MyBase.TraceWriteLine("数据库中没有查找到VIN码,NoFind, +L 使用CSV码"); - labVIN.Text = "L" + aryLineContent[1]; - strCarID = "L" + aryLineContent[1]; - } - else - { - labVIN.Text = strCarID; - tmdal.DeleteOneTTempVIN(strCarID); - MyBase.TraceWriteLine("在数据库表TTempSaveVIN中删除该VIN:" + strCarID); - } - } - if (LineNum >= 19) - { - aryLineContent = strLine.Split(','); - //ConfigDfn.strMeasureTime = aryLineContent[6].Substring(0, 4) + "-" + aryLineContent[6].Substring(4, 2) + "-" + aryLineContent[6].Substring(6, 2) + " " + aryLineContent[7].Substring(0, 2) + ":" + aryLineContent[7].Substring(2, 2) + ":" + aryLineContent[7].Substring(4, 2); - ConfigDfn.strMeasureTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); - double dNormalValue = 0.0d; - - dt = tmdal.SelectOneToleranceByCondition("EH3", aryLineContent[0], aryLineContent[1]); - if (dt.Rows.Count == 1) - { - dLowerValue = double.Parse(dt.Rows[0]["TolLower"].ToString()); - dUpperValue = double.Parse(dt.Rows[0]["TolUpper"].ToString()); - dNormalValue = (dLowerValue + dUpperValue) / 2; - dStrictTLower = CalculateStrictLowerTolerance(dLowerValue, dUpperValue); - dStrictTUpper = CalculateStrictUpperTolerance(dLowerValue, dUpperValue); - dExcepitonTLower = CalculateExceptionLowerTolerance(dLowerValue, dUpperValue); - dExceptionTUpper = CalculateExceptionUpperTolerance(dLowerValue, dUpperValue); - } - else - { - dStrictTLower = 0; - dStrictTUpper = 0; - dLowerValue = 0; - dUpperValue = 0; - MyBase.TraceWriteLine("EH3 " + aryLineContent[0] + " " + aryLineContent[1] + " 查询数据获取公差带失败!数据库中数量不唯一,请检查公差带配置!"); - } - - if (aryLineContent[2].ToLower().Contains("inv")) - { - aryLineContent[2]= ""; - aryLineContent[4] = "ng2"; - } - else - { - dMeasureValue = double.Parse(aryLineContent[2]); - if (dMeasureValue >= dLowerValue && dMeasureValue <= dUpperValue) - { - aryLineContent[4] = "good"; - } - else if (dMeasureValue >= dStrictTLower && dMeasureValue <= dStrictTUpper) - { - aryLineContent[4] = "ng1"; - } - else if (dMeasureValue >= dExceptionTUpper || dMeasureValue <= dExcepitonTLower) - { - aryLineContent[4] = "ng3"; - aryLineContent[2] = ""; - } - else - { - aryLineContent[4] = "ng2"; - } - } - - //测量数据存储到table里 - dtCSVContent.Rows.Add(strCarID, "EH3", aryLineContent[0], aryLineContent[1], dNormalValue.ToString("F1"), dLowerValue.ToString("F1"), dUpperValue.ToString("F1"), aryLineContent[2], aryLineContent[4], DateTime.Now, ""); - string strMeasureResult = aryLineContent[4].ToLower(); - if (strMeasureResult.Contains("good") || strMeasureResult.Contains("best") || strMeasureResult.Contains("ng1")) - { - OKCount++; - aryLineContent[4] = "OK"; - } - else if ( strMeasureResult.Contains("ng2")) - { - OutCount++; - aryLineContent[4] = "NG"; - } - else - { - RejectedCount++; - aryLineContent[4] = ""; - aryLineContent[2] = ""; - } - - dgvMeasureContent.Rows.Add(aryLineContent[0], aryLineContent[1], dNormalValue.ToString("F1"), dLowerValue.ToString("F1"), dUpperValue.ToString("F1"), aryLineContent[2], ConfigDfn.strMeasureTime, aryLineContent[4]); - - CheryIOTData cIOTData = new CheryIOTData(); - cIOTData.vin = strCarID; - cIOTData.gfNo = aryLineContent[1]; - cIOTData.pointNumber = aryLineContent[0]; - cIOTData.actualValue = aryLineContent[2]; - cIOTData.controlLine = dLowerValue.ToString("F1") + @"/" + dUpperValue.ToString("F1"); - if (strMeasureResult.Contains("good") || strMeasureResult.Contains("best") || strMeasureResult.Contains("ng1")) - { - cIOTData.measurementResult = "OK"; - } - else - { - cIOTData.measurementResult = "NG"; - } - ListPostIOTData.Add(cIOTData); - dtRowCount++; - dgvMeasureContent.Rows[dtRowCount - 1].HeaderCell.Value = dtRowCount.ToString(); - } - }//End While - sr.Close(); - fs.Close(); - tmdal.InsertTMeasureDatabyDataTable(dtCSVContent); - MyBase.TraceWriteLine("解析EH3数据完成,并将所有测量数据插入到数据库完毕。"); - MyBase.TraceWriteLine("解析NextSense EH3 CSV 报告完毕!检测项数=" + dtRowCount.ToString()); - if (dtRowCount <= ConfigDfn.iMeasureItemsCount) - { - iCurrentMeasureItemsFailedCount++; - } - else - { - iCurrentMeasureItemsFailedCount = 0; - } - - // 连续多个车异常 - if (iCurrentMeasureItemsFailedCount >= ConfigDfn.iFailedCarCount) - { - MyBase.TraceWriteLine("iCurrentMeasureItemsFailedCount=" + iCurrentMeasureItemsFailedCount.ToString() + "超过报警数量" + ConfigDfn.iFailedCarCount.ToString() + " ;给PLC发送报警10。"); - PlcObject.InsertWriteQueue(PlcSignalDfn.MeasureError, (byte)10); - } - - // 单个报告内 invalued 项超过某个值 - - - - // 机器人忙碌状态 且 多个小时无测量报告 - - - - - - #endregion 解析EH3 CSV报告 - - #region 计算极差 - CalculateRange(strCarID, "EH3"); - Thread.Sleep(20); - DataTable dtAllRangeDate = tmdal.SelectRangeDatabyCarID(strCarID); - if (dtAllRangeDate.Rows.Count > 0) - { - foreach (DataRow row in dtAllRangeDate.Rows) - { - if (ConfigDfn.iIncludeRangeFlag == 1) - { - if (row.ItemArray[5].ToString().Contains("OK")) - { - OKCount++; - } - else - { - OutCount++; - } - } - - dgvMeasureContent.Rows.Add(row.ItemArray[2].ToString(), "G", "0", row.ItemArray[4].ToString().Substring(0, 3), row.ItemArray[4].ToString().Substring(4, 3), row.ItemArray[3].ToString(), ConfigDfn.strMeasureTime, row.ItemArray[5].ToString()); - } - } - - if (ConfigDfn.iIncludeRangeFlag == 1) - { - dtRowCount = dtRowCount + dtAllRangeDate.Rows.Count; - for (int i = 1; i <= dtRowCount; i++) - { - dgvMeasureContent.Rows[i - 1].HeaderCell.Value = i.ToString(); - } - - MyBase.TraceWriteLine("计算合格率的时:包含极差计算项!"); - } - #endregion - - #region 界面显示功能 - - labCarType.Text = "EH3"; - TMeasureResultModel tmrm = new TMeasureResultModel(); - labNGCount.Text = OutCount.ToString(); - labOKCount.Text = OKCount.ToString(); - labRejectCount.Text = RejectedCount.ToString(); - labMeaTime.Text = ConfigDfn.strMeasureTime; - labSumMeasureCount.Text = dtRowCount.ToString(); - FPYPercent = OKCount / (OKCount + OutCount); - if (FPYPercent >= ConfigDfn.dFPY) - { - labResultPercent.Text = Math.Round(FPYPercent * 100.00d, 2).ToString("F2") + "%"; - labResult.Text = "合格"; - labResultPercent.ForeColor = Color.LimeGreen; - labResult.ForeColor = Color.LimeGreen; - pbResult.Image = Resources.OK; - tmrm.Result = 1; - PlcObject.InsertWriteQueue(PlcSignalDfn.CMMResult, (byte)10); - } - else if (FPYPercent >= ConfigDfn.dFPY2 && FPYPercent < ConfigDfn.dFPY) - { - labResultPercent.Text = Math.Round(FPYPercent * 100.00d, 2).ToString("F2") + "%"; - labResult.Text = "合格"; - labResultPercent.ForeColor = Color.Yellow; - labResult.ForeColor = Color.Yellow; - pbResult.Image = Resources.OK; - tmrm.Result = 1; - PlcObject.InsertWriteQueue(PlcSignalDfn.CMMResult, (byte)20); - } - else - { - labResultPercent.Text = Math.Round(FPYPercent * 100.00d, 2).ToString("F2") + "%"; - labResult.Text = "不合格"; - labResultPercent.ForeColor = Color.Red; - labResult.ForeColor = Color.Red; - pbResult.Image = Resources.NG; - tmrm.Result = 2; - PlcObject.InsertWriteQueue(PlcSignalDfn.CMMResult, (byte)30); - } - xValues[0] = "合格 : " + OKCount.ToString(); - xValues[1] = "不合格 : " + OutCount.ToString(); - xValues[2] = "异常 : " + RejectedCount.ToString(); - yValues[0] = (int)OKCount; - yValues[1] = (int)OutCount; - yValues[2] = (int)RejectedCount; - chartResultPie.Series[0].Points.DataBindXY(xValues, yValues); - - string strTargetRate = Math.Round(ConfigDfn.dFPY2 * 100.00d, 2).ToString("F2") + "%"; - - tmrm.CarID = strCarID; - tmrm.CarType = "EH3"; - tmrm.SumMeasureItems = dtRowCount; - tmrm.GoodMeasureItems = (int)OKCount; - tmrm.NoGoodMeasureItems = (int)OutCount; - tmrm.RejectMeasureItems = (int)RejectedCount; - tmrm.FPY = FPYPercent.ToString("F4"); - tmrm.Remark = ""; - tmrm.MeasureDate = ConfigDfn.strMeasureTime; - tmdal.InsertTMeasureResult(tmrm); - MyBase.TraceWriteLine("将EH3总结果插入数据库完毕。"); - MyBase.TraceWriteLine("全部插入解析完毕,删除文件:" + fi.Name); - fi.Delete(); - dgvMeasureContent.Rows.Add(); - dgvMeasureContent.Rows[dgvMeasureContent.Rows.Count - 1].Cells["MResult"].Value = (dtRowCount - OutCount - RejectedCount).ToString() + "/" + dtRowCount.ToString(); - this.dgvMeasureContent.Rows[dgvMeasureContent.Rows.Count - 1].DefaultCellStyle.ForeColor = Color.White; - if (dgvMeasureContent.Rows.Count > 0) - { - SetdgvRowBgColor(dgvMeasureContent); - for (int i = 0; i < dgvMeasureContent.Rows.Count; i++) - { - //if (dgvMeasureContent.Rows[i].Cells["MResult"].Value.ToString().ToLower().Contains("ok")) - //{ - // dgvMeasureContent.Rows[i].DefaultCellStyle.BackColor = Color.Orange; - //} - if (dgvMeasureContent.Rows[i].Cells["MResult"].Value.ToString().ToLower().Contains("ng")) - { - dgvMeasureContent.Rows[i].DefaultCellStyle.BackColor = Color.Orange; - } - else if (string.IsNullOrEmpty(dgvMeasureContent.Rows[i].Cells["MResult"].Value.ToString())) - { - dgvMeasureContent.Rows[i].DefaultCellStyle.BackColor = Color.Red; - } - else - { - } - } - } - - #endregion 界面显示功能 - - - //生成客户的 CSV文件 - if (ConfigDfn.iCreateReportFlag == 1) - { - #region 解析完报告后,重新生成客户模板报告 - - string filePath = strSaveReprotPath + DateTime.Now.ToString("yyyyMMddHHmmss") + "_" + strCarID + ".csv"; //wsp 后期还要再改 - string strWithoutLCarVin = strCarID.Substring(1); - StringBuilder sb = new StringBuilder(); - //添加表头 - sb.Append("Measurement Info Name"); - sb.Append(","); - sb.Append("Measurement Info"); - sb.AppendLine(); - sb.Append("Date_Time"); - sb.Append(","); - sb.Append(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")); - sb.AppendLine(); - for (int i = 0; i < listCSVTitleInfo.Count; i++) - { - if (listCSVTitleInfo[i].Contains("prodnum")) - { - listCSVTitleInfo[i] = listCSVTitleInfo[i].Replace("prodnum", "Part_ident"); - } - if (listCSVTitleInfo[i].Contains(strWithoutLCarVin)) - { - listCSVTitleInfo[i] = listCSVTitleInfo[i].Replace(strWithoutLCarVin, strCarID); - } - sb.Append(listCSVTitleInfo[i]); - sb.AppendLine(); - } - sb.AppendLine(); - sb.AppendLine(); - sb.AppendLine(); - sb.AppendLine(); - sb.AppendLine(); - //添加测量数据 - sb.Append("Characteristic"); - sb.Append(","); - sb.Append("Extension"); - sb.Append(","); - sb.Append("Measured_Value"); - sb.AppendLine(); - foreach (DataRow row in dtCSVContent.Rows) - { - sb.Append(row.ItemArray[2]); - sb.Append(","); - sb.Append(row.ItemArray[3]); - sb.Append(","); - sb.Append(row.ItemArray[7]); - sb.AppendLine(); - } - if (dtAllRangeDate.Rows.Count > 0) - { - foreach (DataRow row in dtAllRangeDate.Rows) - { - sb.Append(row.ItemArray[2]); - sb.Append(","); - sb.Append("G"); - sb.Append(","); - sb.Append(row.ItemArray[3]); - sb.AppendLine(); - } - } - sb.Append("POP"); - sb.Append(","); - sb.Append("P"); - sb.Append(","); - sb.Append(Math.Round(FPYPercent * 100.00d, 2).ToString("F2")); - sb.AppendLine(); - // 将数据写入CSV文件 - File.WriteAllText(filePath, sb.ToString()); - MyBase.TraceWriteLine("客户csv报告生成完毕,路径为:" + filePath); - - #endregion 解析完报告后,重新生成客户模板报告 - } - else - { - MyBase.TraceWriteLine("EH3数据生成报告功能未启用!"); - } - - #region Update Data To IOT - - if (ConfigDfn.iStartIOTFlag == 1) - { - bool bVINMeasuedFlag = tmdal.CheckVINExistInDB(strCarID); - if (bVINMeasuedFlag) - { - MyBase.TraceWriteLine("VIN:" + strCarID + " 该VIN码已经在数据库中存在了,说明已经测量过了,不再进行IOT数据上传操作。"); - } - else - { - #region IOT上传功能 - if (dtAllRangeDate.Rows.Count > 0) - { - foreach (DataRow row in dtAllRangeDate.Rows) - { - CheryIOTData cIOTData = new CheryIOTData(); - cIOTData.vin = strCarID; - cIOTData.gfNo = "G"; - cIOTData.pointNumber = row.ItemArray[2].ToString(); - cIOTData.actualValue = row.ItemArray[3].ToString(); - cIOTData.controlLine = row.ItemArray[4].ToString(); - cIOTData.measurementResult = row.ItemArray[5].ToString(); - if (cIOTData.measurementResult.ToUpper().Contains("NG")) - { - if (!cIOTData.actualValue.ToLower().Contains("inv")) - { - dLowerValue = double.Parse(row.ItemArray[4].ToString().Substring(0, 3)); - dUpperValue = double.Parse(row.ItemArray[4].ToString().Substring(4, 3)); - dStrictTLower = CalculateStrictLowerTolerance(dLowerValue, dUpperValue); - dStrictTUpper = CalculateStrictUpperTolerance(dLowerValue, dUpperValue); - double dValue = double.Parse(row.ItemArray[3].ToString()); - if (dValue > dStrictTLower && dValue < dStrictTUpper) - { - cIOTData.measurementResult = "OK"; - } - } - } - ListPostIOTData.Add(cIOTData); - } - } - string strGapList = JsonHelper.ObjectToJson(ListPostIOTData); - string strCaliResult = "OK"; - if (labResult.Text == "合格") - { - strCaliResult = "OK"; - } - else - { - strCaliResult = "NG"; - } - string strPostData = "{\"serno\":\"" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + "\",\"requestData\":[{\"vin\":\"" + strCarID + "\",\"model\":\"EH3\",\"equipmentNo\":\"" + ConfigDfn.strEquipNo + "\",\"equipmentName\":\"" + ConfigDfn.strEquipName + "\",\"calibrationResult\":\"" + strCaliResult + "\",\"detectionTime\":\"" + ConfigDfn.strMeasureTime + "\",\"targetRate\":\"" + strTargetRate + "\",\"rate\":\"" + labResultPercent.Text + "\",\"GapList\":" + strGapList + "}]}"; - MyBase.TraceWriteLine("Update To IOT Data Content: " + strPostData); - string strPostResult = PostJsonToIOT(ConfigDfn.strIOTAddress, strPostData, 10000); - MyBase.TraceWriteLine("EH3数据上传IOT完成,结果返回为:" + strPostResult); - if (strPostResult.Contains("成功")) - { - MyBase.TraceWriteLine("EH3数据上传IOT成功 ^_^"); - } - else - { - MyBase.TraceWriteLine("EH3数据上传IOT失败!"); - } - - #endregion IOT上传功能 - } - } - else - { - MyBase.TraceWriteLine("数据上传IOT功能未启用!"); - } - - #endregion Update Data To IOT - } - } - } - //else - //{ - // MyBase.TraceWriteLine("错误:AnalysisNextSenseEH3CSV函数中,检测EH3 CSV 路径不存在:" + ConfigDfn.strNextSenseCSVPath); - //} - } - catch (Exception ex) - { - MyBase.TraceWriteLine("AnalysisNextSenseCSV 函数分析异常:" + ex.ToString()); - } - } - - private void AnalysisNextSenseEHYCSV() - { - try - { - lbCSVFiles.Items.Clear(); - FileInfo[] fileInfos = null; - if (Directory.Exists(ConfigDfn.strNextSenseCSVEHYPath)) - { - DirectoryInfo di = new DirectoryInfo(ConfigDfn.strNextSenseCSVEHYPath); - fileInfos = di.GetFiles("*.CSV"); - if (fileInfos.Count() >= 1) - { - MyBase.TraceWriteLine("存在EHY CSV文件,开始解析:"); - List listCSVTitleInfo = new List(); - string strCarID = ""; - foreach (FileInfo fi in fileInfos) - { - listCSVTitleInfo.Clear(); - ListPostIOTData.Clear(); - dtCSVContent.Clear(); - dgvMeasureContent.Rows.Clear(); - string strCSVName = fi.FullName; - File.Copy(fi.FullName, ConfigDfn.strFileFolder + "\\NextSenseCSVBackup\\" + fi.Name, true); - MyBase.TraceWriteLine("Copy " + fi.FullName + " TO " + ConfigDfn.strFileFolder + "\\NextSenseCSVBackup\\" + fi.Name + " Done. 备份完成"); - lbCSVFiles.Items.Add(fi.Name); - - #region 解析EHY CSV报告 - - MyBase.TraceWriteLine("开始解析NextSense EHY CSV 报告:" + strCSVName); - Encoding encoding = GetType(strCSVName); - FileStream fs = new FileStream(strCSVName, FileMode.Open, FileAccess.Read); - StreamReader sr = new StreamReader(fs, encoding); - //记录每次读取的一行记录 - string strLine = ""; - //记录每行记录中的各字段内容 - string[] aryLineContent = null; - - //逐行读取CSV中的数据 - int LineNum = 0; - //表格行数 - int dtRowCount = 0; - //超差个数 - double OutCount = 0; - //Ok个数 - double OKCount = 0; - //异常个数 - double RejectedCount = 0; - //合格率 - double FPYPercent = 0; - double dStrictTLower = 0; - double dStrictTUpper = 0; - double dLowerValue = 0; - double dUpperValue = 0; - double dExcepitonTLower = 0; - double dExceptionTUpper = 0; - double dMeasureValue = 0.0; - DataTable dt = null; - while ((strLine = sr.ReadLine()) != null) - { - LineNum++; - if (LineNum >= 3 & LineNum <= 16) - { - listCSVTitleInfo.Add(strLine); - } - if (LineNum == 10) - { - aryLineContent = strLine.Split(','); - MyBase.TraceWriteLine("解析出NextSense CSV中的VIN为:" + aryLineContent[1]); - strCarID = tmdal.SelectVINByCSVVIN(aryLineContent[1]); - MyBase.TraceWriteLine("通过CSV VIN从数据库中获取的完整VIN为:" + strCarID); - if (strCarID.ToLower().Contains("nofind")) - { - MyBase.TraceWriteLine("数据库中没有查找到VIN码,NoFind, +L 使用CSV码"); - labVIN.Text = "L" + aryLineContent[1]; - strCarID = "L" + aryLineContent[1]; - } - else - { - labVIN.Text = strCarID; - tmdal.DeleteOneTTempVIN(strCarID); - MyBase.TraceWriteLine("在数据库表TTempSaveVIN中删除该VIN:" + strCarID); - } - } - if (LineNum >= 19) - { - aryLineContent = strLine.Split(','); - ConfigDfn.strMeasureTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); - double dNormalValue = 0.0d; - - dt = tmdal.SelectOneToleranceByCondition("EHY", aryLineContent[0], aryLineContent[1]); - if (dt.Rows.Count == 1) - { - dLowerValue = double.Parse(dt.Rows[0]["TolLower"].ToString()); - dUpperValue = double.Parse(dt.Rows[0]["TolUpper"].ToString()); - dNormalValue = (dLowerValue + dUpperValue) / 2; - dStrictTLower = CalculateStrictLowerTolerance(dLowerValue, dUpperValue); - dStrictTUpper = CalculateStrictUpperTolerance(dLowerValue, dUpperValue); - dExcepitonTLower = CalculateExceptionLowerTolerance(dLowerValue, dUpperValue); - dExceptionTUpper = CalculateExceptionUpperTolerance(dLowerValue, dUpperValue); - } - else - { - dStrictTLower = 0; - dStrictTUpper = 0; - dLowerValue = 0; - dUpperValue = 0; - MyBase.TraceWriteLine("EHY " + aryLineContent[0] + " " + aryLineContent[1] + " 查询数据获取公差带失败!数据库中数量不唯一或不存在,请检查公差带配置!"); - } - - if (aryLineContent[2].ToLower().Contains("inv")) - { + private void CenterControl_Load(object sender, EventArgs e) + { + #region 初始化全局变量 + fLEHY = new FEHYLeftCarData(this); + fREHY = new FEHYRightCarData(this); + fLEH3 = new FEH3LeftCarData(this); + fREH3 = new FEH3RightCarData(this); + MyBase.rleMessage = rleMessage; + rdtpStartTime.Text = DateTime.Now.ToString("yyyy-MM-dd"); + rdtpEndTime.Text = DateTime.Now.ToString("yyyy-MM-dd"); + + #endregion 初始化全局变量 + //需要显示车身数据 不分析csv文件 + if (ConfigDfn.iShowCarDataFlag == 1) + { + MyBase.TraceWriteLine(" 进入显示车身模式!显示车身界面。"); + lpcShowCarData_Click(null, null); + //serialPort = new SerialPort(ConfigDfn.strCOMPort, 115200, Parity.None, 8, StopBits.One); // 设置串口参数 + //serialPort.DataReceived += new SerialDataReceivedEventHandler(DataAutoReceivedHandler); // 注册数据接收事件处理方法 + //serialPort.Open(); // 打开串口 + //if (serialPort.IsOpen) + //{ + // MyBase.TraceWriteLine(ConfigDfn.strCOMPort + "打开成功O(∩_∩)O"); + //} + //else + //{ + // MyBase.TraceWriteLine(ConfigDfn.strCOMPort + "打开失败!"); + // MessageBox.Show(ConfigDfn.strCOMPort + "打开失败!请检查扫抢串口设置是否正确。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); + //} + } + else + { + MyBase.TraceWriteLine(" 进入不显示车身模式!"); + } + if (ConfigDfn.iAnalysisCSVFlag == 1) + { + btnConnectPlc_Click(null, null); + MyBase.TraceWriteLine(" 进入解析CSV文件模式,开始解析扫码CSV文件!"); + tmReadNextsenseCSV.Interval = 500; + tmReadNextsenseCSV.Start(); + //tmdal.updateMaintenceInfoEmpty(); + } + else + { + MyBase.TraceWriteLine(" 进入不解析CSV文件模式!"); + tmReadNextsenseCSV.Stop(); + } + + if (Directory.Exists(ConfigDfn.strNextSenseCSVEH3Path)) + { + MyBase.TraceWriteLine("软件首次启动, Nextsense EH3 CSV读取路径存在;不清空,读取NextSense生成 CSV报告路径下的所有文件,路径为:" + ConfigDfn.strNextSenseCSVEH3Path); + } + else + { + string strTip = "错误:软件首次启动,读取NextSense生成EH3 CSV报告的路径:" + ConfigDfn.strNextSenseCSVEH3Path + " 不存在!请检查并进行修改!点击是按钮,软件将自动创建该路径!"; + MyBase.TraceWriteLine(strTip); + Directory.CreateDirectory(ConfigDfn.strNextSenseCSVEH3Path); + //DialogResult dResult = MessageBox.Show(strTip, "错误", MessageBoxButtons.YesNo, MessageBoxIcon.Error); + //if (dResult == DialogResult.Yes) + //{ + // Directory.CreateDirectory(ConfigDfn.strNextSenseCSVEH3Path); + // MyBase.TraceWriteLine(strTip + " ; 点击了是按钮,软件自动创建读取目录:" + ConfigDfn.strNextSenseCSVEH3Path); + //} + //else + //{ + // MyBase.TraceWriteLine(strTip + " ;点击了否按钮,不创建目录!"); + //} + } + if (Directory.Exists(ConfigDfn.strNextSenseCSVEHYPath)) + { + MyBase.TraceWriteLine("软件首次启动, Nextsense EHY CSV读取路径存在;不清空,读取NextSense生成 CSV报告路径下的所有文件,路径为:" + ConfigDfn.strNextSenseCSVEHYPath); + } + else + { + string strTip = "错误:软件首次启动,读取NextSense生成EHY CSV报告的路径:" + ConfigDfn.strNextSenseCSVEHYPath + " 不存在!请检查并进行修改!点击是按钮,软件将自动创建该路径!"; + MyBase.TraceWriteLine(strTip); + Directory.CreateDirectory(ConfigDfn.strNextSenseCSVEHYPath); + //DialogResult dResult = MessageBox.Show(strTip, "错误", MessageBoxButtons.YesNo, MessageBoxIcon.Error); + //if (dResult == DialogResult.Yes) + //{ + // Directory.CreateDirectory(ConfigDfn.strNextSenseCSVEHYPath); + // MyBase.TraceWriteLine(strTip + " ; 点击了是按钮,软件自动创建读取目录:" + ConfigDfn.strNextSenseCSVEHYPath); + //} + //else + //{ + // MyBase.TraceWriteLine(strTip + " ;点击了否按钮,不创建目录!"); + //} + } + initLPCControl(); + + //tmdal.updateMaintenceInfoEmpty(); + //iLastMesureCount = tmdal.SelectTMeasureResultCount(); + + #region 清空信息 + + labVIN.Text = ""; + labOKCount.Text = ""; + labNGCount.Text = ""; + labRejectCount.Text = ""; + labSumMeasureCount.Text = ""; + labMeaTime.Text = ""; + labResultPercent.Text = ""; + labResult.Text = ""; + labCarType.Text = ""; + + #endregion 清空信息 + + InitTableColumns(); + strSaveReprotPath = ConfigDfn.strReportPath + @"\"; + + //testIotUpload(); + } + + private void InitTableColumns() + { + #region 测量数据表始化表 + + //创建虚拟表 + DataColumn column2 = new DataColumn("CarID", Type.GetType("System.String")); + DataColumn dcCarType = new DataColumn("CarType", Type.GetType("System.String")); + DataColumn column3 = new DataColumn("MeasPointName", Type.GetType("System.String")); + DataColumn column4 = new DataColumn("DimensionName", Type.GetType("System.String")); + DataColumn column5 = new DataColumn("NormalValue", Type.GetType("System.String")); + DataColumn column6 = new DataColumn("LowerTolVal", Type.GetType("System.String")); + DataColumn column7 = new DataColumn("UpperTolVal", Type.GetType("System.String")); + DataColumn column8 = new DataColumn("MeasureValue", Type.GetType("System.String")); + DataColumn column10 = new DataColumn("MeasureItemResult", Type.GetType("System.String")); + DataColumn column9 = new DataColumn("MeasureDate", Type.GetType("System.DateTime")); + DataColumn column1 = new DataColumn("Remark", Type.GetType("System.String")); + //将列添加到table表中 + + dtCSVContent.Columns.Add(column2); + dtCSVContent.Columns.Add(dcCarType); + dtCSVContent.Columns.Add(column3); + dtCSVContent.Columns.Add(column4); + dtCSVContent.Columns.Add(column5); + dtCSVContent.Columns.Add(column6); + dtCSVContent.Columns.Add(column7); + dtCSVContent.Columns.Add(column8); + dtCSVContent.Columns.Add(column10); + dtCSVContent.Columns.Add(column9); + dtCSVContent.Columns.Add(column1); + + #endregion 测量数据表始化表 + + #region 极差数据Table初始化 + + //创建虚拟表 + DataColumn dcCarID = new DataColumn("CarID", Type.GetType("System.String")); + DataColumn dcRangeName = new DataColumn("RangeName", Type.GetType("System.String")); + DataColumn dcRangeValue = new DataColumn("RangeValue", Type.GetType("System.String")); + DataColumn dcRangeLowUpp = new DataColumn("RangeLowUpp", Type.GetType("System.String")); + DataColumn dcResult = new DataColumn("Result", Type.GetType("System.String")); + DataColumn dcCreateTime = new DataColumn("CreateTime", Type.GetType("System.DateTime")); + DataColumn dcRemark = new DataColumn("Remark", Type.GetType("System.String")); + //将列添加到table表中 + + dtRangeData.Columns.Add(dcCarID); + dtRangeData.Columns.Add(dcRangeName); + dtRangeData.Columns.Add(dcRangeValue); + dtRangeData.Columns.Add(dcRangeLowUpp); + dtRangeData.Columns.Add(dcResult); + dtRangeData.Columns.Add(dcCreateTime); + dtRangeData.Columns.Add(dcRemark); + + #endregion 极差数据Table初始化 + + #region 分页相关 + + //创建分页虚拟表 + DataColumn column11 = new DataColumn("CarID", Type.GetType("System.String")); + DataColumn column12 = new DataColumn("MeasPointName", Type.GetType("System.String")); + DataColumn column13 = new DataColumn("DimensionName", Type.GetType("System.String")); + DataColumn column14 = new DataColumn("NormalValue", Type.GetType("System.String")); + DataColumn column15 = new DataColumn("LowerTolVal", Type.GetType("System.String")); + DataColumn column16 = new DataColumn("UpperTolVal", Type.GetType("System.String")); + DataColumn column17 = new DataColumn("MeasureValue", Type.GetType("System.String")); + DataColumn column18 = new DataColumn("MeasureDate", Type.GetType("System.String")); + DataColumn column19 = new DataColumn("MeasureItemResult", Type.GetType("System.String")); + + //将列添加到table表中 + PageTable.Columns.Add(column11); + PageTable.Columns.Add(column12); + PageTable.Columns.Add(column13); + PageTable.Columns.Add(column14); + PageTable.Columns.Add(column15); + PageTable.Columns.Add(column16); + PageTable.Columns.Add(column17); + PageTable.Columns.Add(column18); + PageTable.Columns.Add(column19); + + labCurrentPage.Text = "当前页:" + currentPage.ToString(); //当前页 + labSumPages.Text = "共 " + pageCount.ToString() + " 页";//总页数 + labSumRecorders.Text = "总共 " + recordCount.ToString() + " 条记录";//总记录数 + rddlPageRecorderCount.SelectedIndex = 0; + + #endregion 分页相关 + } + + private void DataAutoReceivedHandler(object sender, SerialDataReceivedEventArgs e) + { + SerialPort sp = (SerialPort)sender; + string strScanVIN = sp.ReadExisting(); + MyBase.TraceWriteLine("扫抢获取的VIN码为:" + strScanVIN); + if (strScanVIN.Length > 0) + { + tmdal.updateMaintenceInfo(strScanVIN, 3); + MyBase.TraceWriteLine("更新数据库中存储的VIN码:" + strScanVIN); + } + } + + private void initLPCControl() + { + lpcSoftwareSetup.labPicture.Click += new EventHandler(lpcSoftwareSetup_Click); + lpcSoftwareSetup.labText.Click += new EventHandler(lpcSoftwareSetup_Click); + + lpcToleranceSetup.labPicture.Click += new EventHandler(lpcToleranceSetup_Click); + lpcToleranceSetup.labText.Click += new EventHandler(lpcToleranceSetup_Click); + + lpcRange.labPicture.Click += new EventHandler(lpcRange_Click); + lpcRange.labText.Click += new EventHandler(lpcRange_Click); + + lpcPLCAddress.labPicture.Click += new EventHandler(lpcPLCAddress_Click); + lpcPLCAddress.labText.Click += new EventHandler(lpcPLCAddress_Click); + + lpcPLCTest.labPicture.Click += new EventHandler(lpcPLCTest_Click); + lpcPLCTest.labText.Click += new EventHandler(lpcPLCTest_Click); + + lpcAboutSoftware.labPicture.Click += new EventHandler(lpcAboutSoftware_Click); + lpcAboutSoftware.labText.Click += new EventHandler(lpcAboutSoftware_Click); + + lpcUploadIOTTest.labPicture.Click += new EventHandler(lpcUploadIOTTest_Click); + lpcUploadIOTTest.labText.Click += new EventHandler(lpcUploadIOTTest_Click); + + lpcTestGetCarTye.labPicture.Click += new EventHandler(lpcTestGetCarTye_Click); + lpcTestGetCarTye.labText.Click += new EventHandler(lpcTestGetCarTye_Click); + + lpcShowCarData.labPicture.Click += new EventHandler(lpcShowCarData_Click); + lpcShowCarData.labText.Click += new EventHandler(lpcShowCarData_Click); + + lpcShowLog.labPicture.Click += new EventHandler(lpcShowLog_Click); + lpcShowLog.labText.Click += new EventHandler(lpcShowLog_Click); + } + + private void CenterControl_FormClosed(object sender, FormClosedEventArgs e) + { + MyBase.TraceWriteLine("-------------海克斯康面隙分析软件程序关闭---------------------"); + LogDebugDfn.strEndTime = DateTime.Now.ToString("yyyy.MM.dd HH-mm-ss"); + string CopyFileName = ConfigDfn.strFileFolder + "\\DebugFiles\\" + "Debug(" + LogDebugDfn.strStartTime + " To " + LogDebugDfn.strEndTime + ")" + ".txt"; + if (File.Exists(LogDebugDfn.strDebugFile)) + File.Copy(LogDebugDfn.strDebugFile, CopyFileName); + System.Environment.Exit(0); + } + + private void tmSystem_Tick(object sender, EventArgs e) + { + rleTime.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + if (ConfigDfn.iAnalysisCSVFlag == 1) + rleReadCSVStatus.ForeColor = bReadCSVFlag ? Color.Green : Color.White; + bReadCSVFlag = !bReadCSVFlag; + } + + #endregion 主窗口事件 + + private void tmReadNextsenseCSV_Tick(object sender, EventArgs e) + { + tmReadNextsenseCSV.Stop(); + AnalysisNextSenseSelfMeasureCSV(); + AnalysisNextSenseEH3CSV(); + AnalysisNextSenseEHYCSV(); + tmReadNextsenseCSV.Start(); + } + + #region⭐⭐⭐⭐⭐ 解析Nextsense CSV文件功能 核心算法 ⭐⭐⭐⭐⭐ + + private double CalculateStrictLowerTolerance(double dLower, double dUpper) + { + double dStrictLower = 0; + double dNormalValue = (dLower + dUpper) / 2; + dStrictLower = dNormalValue + (dLower - dNormalValue) * ConfigDfn.dTolerancePer; + return dStrictLower; + } + + private double CalculateStrictUpperTolerance(double dLower, double dUpper) + { + double dStrictUpper = 0; + double dNormalValue = (dLower + dUpper) / 2; + dStrictUpper = dNormalValue + (dUpper - dNormalValue) * ConfigDfn.dTolerancePer; + return dStrictUpper; + } + + private double CalculateExceptionLowerTolerance(double dLower, double dUpper) + { + double dStrictLower = 0; + double dNormalValue = (dLower + dUpper) / 2; + dStrictLower = dNormalValue + (dLower - dNormalValue) * ConfigDfn.dExceptionTolerancePer; + return dStrictLower; + } + + private double CalculateExceptionUpperTolerance(double dLower, double dUpper) + { + double dStrictUpper = 0; + double dNormalValue = (dLower + dUpper) / 2; + dStrictUpper = dNormalValue + (dUpper - dNormalValue) * ConfigDfn.dExceptionTolerancePer; + return dStrictUpper; + } + + /// + /// 解析EH3 CSV文件函数;后续如果Nextsense的csv报告模板变了,修改该函数的行号即可LineNum wsp + /// + private void AnalysisNextSenseEH3CSV() + { + try + { + lbCSVFiles.Items.Clear(); + FileInfo[] fileInfos = null; + if (Directory.Exists(ConfigDfn.strNextSenseCSVEH3Path)) + { + DirectoryInfo di = new DirectoryInfo(ConfigDfn.strNextSenseCSVEH3Path); + fileInfos = di.GetFiles("*.CSV"); + if (fileInfos.Count() >= 1) + { + MyBase.TraceWriteLine("存在EH3 CSV文件,开始解析:"); + List listCSVTitleInfo = new List(); + string strCarID = ""; + foreach (FileInfo fi in fileInfos) + { + listCSVTitleInfo.Clear(); + ListPostIOTData.Clear(); + dtCSVContent.Clear(); + dgvMeasureContent.Rows.Clear(); + string strCSVName = fi.FullName; + File.Copy(fi.FullName, ConfigDfn.strFileFolder + "\\NextSenseCSVBackup\\" + fi.Name, true); + MyBase.TraceWriteLine("Copy " + fi.FullName + " TO " + ConfigDfn.strFileFolder + "\\NextSenseCSVBackup\\" + fi.Name + " Done. 备份完成"); + lbCSVFiles.Items.Add(fi.Name); + + #region 解析EH3 CSV报告 + + MyBase.TraceWriteLine("开始解析NextSense EH3 CSV 报告:" + strCSVName); + Encoding encoding = GetType(strCSVName); + FileStream fs = new FileStream(strCSVName, FileMode.Open, FileAccess.Read); + StreamReader sr = new StreamReader(fs, encoding); + //记录每次读取的一行记录 + string strLine = ""; + //记录每行记录中的各字段内容 + string[] aryLineContent = null; + + //逐行读取CSV中的数据 + int LineNum = 0; + //表格行数 + int dtRowCount = 0; + //超差个数 + double OutCount = 0; + //Ok个数 + double OKCount = 0; + //异常个数 + double RejectedCount = 0; + //合格率 + double FPYPercent = 0; + double dStrictTLower = 0; + double dStrictTUpper = 0; + double dLowerValue = 0; + double dUpperValue = 0; + double dExcepitonTLower = 0; + double dExceptionTUpper = 0; + double dMeasureValue = 0.0; + DataTable dt = null; + while ((strLine = sr.ReadLine()) != null) + { + LineNum++; + if (LineNum >= 3 & LineNum <= 16) + { + listCSVTitleInfo.Add(strLine); + } + if (LineNum == 10) + { + aryLineContent = strLine.Split(','); + MyBase.TraceWriteLine("解析出NextSense CSV中的VIN为:" + aryLineContent[1]); + strCarID = tmdal.SelectVINByCSVVIN(aryLineContent[1]); + MyBase.TraceWriteLine("通过CSV VIN从数据库中获取的完整VIN为:" + strCarID); + if (strCarID.ToLower().Contains("nofind")) + { + MyBase.TraceWriteLine("数据库中没有查找到VIN码,NoFind, +L 使用CSV码"); + labVIN.Text = "L" + aryLineContent[1]; + strCarID = "L" + aryLineContent[1]; + } + else + { + labVIN.Text = strCarID; + tmdal.DeleteOneTTempVIN(strCarID); + MyBase.TraceWriteLine("在数据库表TTempSaveVIN中删除该VIN:" + strCarID); + } + + // 向 strNextsenseDataPath 文件中插入数据 strCarID + AppendRecord(strCarID, strNextsenseDataPath); + } + if (LineNum >= 19) + { + aryLineContent = strLine.Split(','); + //ConfigDfn.strMeasureTime = aryLineContent[6].Substring(0, 4) + "-" + aryLineContent[6].Substring(4, 2) + "-" + aryLineContent[6].Substring(6, 2) + " " + aryLineContent[7].Substring(0, 2) + ":" + aryLineContent[7].Substring(2, 2) + ":" + aryLineContent[7].Substring(4, 2); + ConfigDfn.strMeasureTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + double dNormalValue = 0.0d; + + dt = tmdal.SelectOneToleranceByCondition("EH3", aryLineContent[0], aryLineContent[1]); + if (dt.Rows.Count == 1) + { + dLowerValue = double.Parse(dt.Rows[0]["TolLower"].ToString()); + dUpperValue = double.Parse(dt.Rows[0]["TolUpper"].ToString()); + dNormalValue = (dLowerValue + dUpperValue) / 2; + dStrictTLower = CalculateStrictLowerTolerance(dLowerValue, dUpperValue); + dStrictTUpper = CalculateStrictUpperTolerance(dLowerValue, dUpperValue); + dExcepitonTLower = CalculateExceptionLowerTolerance(dLowerValue, dUpperValue); + dExceptionTUpper = CalculateExceptionUpperTolerance(dLowerValue, dUpperValue); + } + else + { + dStrictTLower = 0; + dStrictTUpper = 0; + dLowerValue = 0; + dUpperValue = 0; + MyBase.TraceWriteLine("EH3 " + aryLineContent[0] + " " + aryLineContent[1] + " 查询数据获取公差带失败!数据库中数量不唯一,请检查公差带配置!"); + } + + if (aryLineContent[2].ToLower().Contains("inv")) + { aryLineContent[2] = ""; aryLineContent[4] = "ng2"; - } - else - { - dMeasureValue = double.Parse(aryLineContent[2]); - if (dMeasureValue >= dLowerValue && dMeasureValue <= dUpperValue) - { - aryLineContent[4] = "good"; - } - else if (dMeasureValue >= dStrictTLower && dMeasureValue <= dStrictTUpper) - { - aryLineContent[4] = "ng1"; - } - else if (dMeasureValue >= dExceptionTUpper || dMeasureValue <= dExcepitonTLower) - { - aryLineContent[4] = "ng3"; - aryLineContent[2] = ""; - } - else - { - aryLineContent[4] = "ng2"; - } - } + } + else + { + dMeasureValue = double.Parse(aryLineContent[2]); + if (dMeasureValue >= dLowerValue && dMeasureValue <= dUpperValue) + { + aryLineContent[4] = "good"; + } + else if (dMeasureValue >= dStrictTLower && dMeasureValue <= dStrictTUpper) + { + aryLineContent[4] = "ng1"; + } + else if (dMeasureValue >= dExceptionTUpper || dMeasureValue <= dExcepitonTLower) + { + aryLineContent[4] = "ng3"; + aryLineContent[2] = ""; + } + else + { + aryLineContent[4] = "ng2"; + } + } - //测量数据存储到table里 - dtCSVContent.Rows.Add(strCarID, "EHY", aryLineContent[0], aryLineContent[1], dNormalValue.ToString("F1"), dLowerValue.ToString("F1"), dUpperValue.ToString("F1"), aryLineContent[2], aryLineContent[4], DateTime.Now, ""); - string strMeasureResult = aryLineContent[4].ToLower(); - if (strMeasureResult.Contains("good") || strMeasureResult.Contains("best") || strMeasureResult.Contains("ng1")) - { - OKCount++; - aryLineContent[4] = "OK"; - } - else if ( strMeasureResult.Contains("ng2")) - { - OutCount++; - aryLineContent[4] = "NG"; - } - else - { - RejectedCount++; - aryLineContent[4] = ""; - aryLineContent[2] = ""; - } + //测量数据存储到table里 + dtCSVContent.Rows.Add(strCarID, "EH3", aryLineContent[0], aryLineContent[1], dNormalValue.ToString("F1"), dLowerValue.ToString("F1"), dUpperValue.ToString("F1"), aryLineContent[2], aryLineContent[4], DateTime.Now, ""); + string strMeasureResult = aryLineContent[4].ToLower(); + if (strMeasureResult.Contains("good") || strMeasureResult.Contains("best") || strMeasureResult.Contains("ng1")) + { + OKCount++; + aryLineContent[4] = "OK"; + } + else if (strMeasureResult.Contains("ng2")) + { + OutCount++; + aryLineContent[4] = "NG"; + } + else + { + RejectedCount++; + aryLineContent[4] = ""; + aryLineContent[2] = ""; + } - dgvMeasureContent.Rows.Add(aryLineContent[0], aryLineContent[1], dNormalValue.ToString("F1"), dLowerValue.ToString("F1"), dUpperValue.ToString("F1"), aryLineContent[2], ConfigDfn.strMeasureTime, aryLineContent[4]); + dgvMeasureContent.Rows.Add(aryLineContent[0], aryLineContent[1], dNormalValue.ToString("F1"), dLowerValue.ToString("F1"), dUpperValue.ToString("F1"), aryLineContent[2], ConfigDfn.strMeasureTime, aryLineContent[4]); - CheryIOTData cIOTData = new CheryIOTData(); - cIOTData.vin = strCarID; - cIOTData.gfNo = aryLineContent[1]; - cIOTData.pointNumber = aryLineContent[0]; - cIOTData.actualValue = aryLineContent[2]; - cIOTData.controlLine = dLowerValue.ToString("F1") + @"/" + dUpperValue.ToString("F1"); - if (strMeasureResult.Contains("good") || strMeasureResult.Contains("best") || strMeasureResult.Contains("ng1")) - { - cIOTData.measurementResult = "OK"; - } - else - { - cIOTData.measurementResult = "NG"; - } - ListPostIOTData.Add(cIOTData); - dtRowCount++; - dgvMeasureContent.Rows[dtRowCount - 1].HeaderCell.Value = dtRowCount.ToString(); - } - }//End While - sr.Close(); - fs.Close(); - tmdal.InsertTMeasureDatabyDataTable(dtCSVContent); - MyBase.TraceWriteLine("解析EHY数据完成,并将所有测量数据插入到数据库完毕。"); - MyBase.TraceWriteLine("解析NextSense EHY CSV 报告完毕!检查数量=" + dtRowCount.ToString()); - if (dtRowCount <= ConfigDfn.iMeasureItemsCount) - { - iCurrentMeasureItemsFailedCount++; - } - else - { - iCurrentMeasureItemsFailedCount = 0; - } + CheryIOTData cIOTData = new CheryIOTData(); + cIOTData.vin = strCarID; + cIOTData.gfNo = aryLineContent[1]; + cIOTData.pointNumber = aryLineContent[0]; + cIOTData.actualValue = aryLineContent[2]; + cIOTData.controlLine = dLowerValue.ToString("F1") + @"/" + dUpperValue.ToString("F1"); + if (strMeasureResult.Contains("good") || strMeasureResult.Contains("best") || strMeasureResult.Contains("ng1")) + { + cIOTData.measurementResult = "OK"; + } + else + { + cIOTData.measurementResult = "NG"; + } + ListPostIOTData.Add(cIOTData); + dtRowCount++; + dgvMeasureContent.Rows[dtRowCount - 1].HeaderCell.Value = dtRowCount.ToString(); + } + }//End While + sr.Close(); + fs.Close(); + tmdal.InsertTMeasureDatabyDataTable(dtCSVContent); + MyBase.TraceWriteLine("解析EH3数据完成,并将所有测量数据插入到数据库完毕。"); + MyBase.TraceWriteLine("解析NextSense EH3 CSV 报告完毕!检测项数=" + dtRowCount.ToString()); + if (dtRowCount <= ConfigDfn.iMeasureItemsCount) + { + iCurrentMeasureItemsFailedCount++; + } + else + { + iCurrentMeasureItemsFailedCount = 0; + } - if (iCurrentMeasureItemsFailedCount >= ConfigDfn.iFailedCarCount) - { - MyBase.TraceWriteLine("iCurrentMeasureItemsFailedCount=" + iCurrentMeasureItemsFailedCount.ToString() + "超过报警数量" + ConfigDfn.iFailedCarCount.ToString() + " ;给PLC发送报警10。"); - PlcObject.InsertWriteQueue(PlcSignalDfn.MeasureError, (byte)10); - } - #endregion 解析EHY CSV报告 + // 连续多个车异常 + if (iCurrentMeasureItemsFailedCount >= ConfigDfn.iFailedCarCount) + { + MyBase.TraceWriteLine("iCurrentMeasureItemsFailedCount=" + iCurrentMeasureItemsFailedCount.ToString() + "超过报警数量" + ConfigDfn.iFailedCarCount.ToString() + " ;给PLC发送报警10。"); + PlcObject.InsertWriteQueue(PlcSignalDfn.MeasureError, (byte)10); + } - #region 计算极差 - CalculateRange(strCarID, "EHY"); - Thread.Sleep(20); - DataTable dtAllRangeDate = tmdal.SelectRangeDatabyCarID(strCarID); - if (dtAllRangeDate.Rows.Count > 0) - { - foreach (DataRow row in dtAllRangeDate.Rows) - { - if (ConfigDfn.iIncludeRangeFlag == 1) - { - if (row.ItemArray[5].ToString().Contains("OK")) - { - OKCount++; - } - else - { - OutCount++; - } - } + // 单个报告内 invalued 项超过某个值 - dgvMeasureContent.Rows.Add(row.ItemArray[2].ToString(), "G", "0", row.ItemArray[4].ToString().Substring(0, 3), row.ItemArray[4].ToString().Substring(4, 3), row.ItemArray[3].ToString(), ConfigDfn.strMeasureTime, row.ItemArray[5].ToString()); - } - } + // 机器人忙碌状态 且 多个小时无测量报告 - if (ConfigDfn.iIncludeRangeFlag == 1) - { - dtRowCount = dtRowCount + dtAllRangeDate.Rows.Count; - for (int i = 1; i <= dtRowCount; i++) - { - dgvMeasureContent.Rows[i - 1].HeaderCell.Value = i.ToString(); - } - MyBase.TraceWriteLine("计算合格率的时:包含极差计算项!"); - } + #endregion 解析EH3 CSV报告 - #endregion + #region 计算极差 + CalculateRange(strCarID, "EH3"); + Thread.Sleep(20); + DataTable dtAllRangeDate = tmdal.SelectRangeDatabyCarID(strCarID); + if (dtAllRangeDate.Rows.Count > 0) + { + foreach (DataRow row in dtAllRangeDate.Rows) + { + if (ConfigDfn.iIncludeRangeFlag == 1) + { + if (row.ItemArray[5].ToString().Contains("OK")) + { + OKCount++; + } + else + { + OutCount++; + } + } - #region 界面显示功能 + dgvMeasureContent.Rows.Add(row.ItemArray[2].ToString(), "G", "0", row.ItemArray[4].ToString().Substring(0, 3), row.ItemArray[4].ToString().Substring(4, 3), row.ItemArray[3].ToString(), ConfigDfn.strMeasureTime, row.ItemArray[5].ToString()); + } + } - labCarType.Text = "EHY"; - TMeasureResultModel tmrm = new TMeasureResultModel(); - labNGCount.Text = OutCount.ToString(); - labOKCount.Text = OKCount.ToString(); - labRejectCount.Text = RejectedCount.ToString(); - labMeaTime.Text = ConfigDfn.strMeasureTime; - labSumMeasureCount.Text = dtRowCount.ToString(); - FPYPercent = OKCount / (OKCount + OutCount); - if (FPYPercent >= ConfigDfn.dFPY) - { - labResultPercent.Text = Math.Round(FPYPercent * 100.00d, 2).ToString("F2") + "%"; - labResult.Text = "合格"; - labResultPercent.ForeColor = Color.LimeGreen; - labResult.ForeColor = Color.LimeGreen; - pbResult.Image = Resources.OK; - tmrm.Result = 1; - PlcObject.InsertWriteQueue(PlcSignalDfn.CMMResult, (byte)10); - } - else if (FPYPercent >= ConfigDfn.dFPY2 && FPYPercent < ConfigDfn.dFPY) - { - labResultPercent.Text = Math.Round(FPYPercent * 100.00d, 2).ToString("F2") + "%"; - labResult.Text = "合格"; - labResultPercent.ForeColor = Color.Yellow; - labResult.ForeColor = Color.Yellow; - pbResult.Image = Resources.OK; - tmrm.Result = 1; - PlcObject.InsertWriteQueue(PlcSignalDfn.CMMResult, (byte)20); - } - else - { - labResultPercent.Text = Math.Round(FPYPercent * 100.00d, 2).ToString("F2") + "%"; - labResult.Text = "不合格"; - labResultPercent.ForeColor = Color.Red; - labResult.ForeColor = Color.Red; - pbResult.Image = Resources.NG; - tmrm.Result = 2; - PlcObject.InsertWriteQueue(PlcSignalDfn.CMMResult, (byte)30); - } - xValues[0] = "合格 : " + OKCount.ToString(); - xValues[1] = "不合格 : " + OutCount.ToString(); - xValues[2] = "异常 : " + RejectedCount.ToString(); - yValues[0] = (int)OKCount; - yValues[1] = (int)OutCount; - yValues[2] = (int)RejectedCount; - chartResultPie.Series[0].Points.DataBindXY(xValues, yValues); + if (ConfigDfn.iIncludeRangeFlag == 1) + { + dtRowCount = dtRowCount + dtAllRangeDate.Rows.Count; + for (int i = 1; i <= dtRowCount; i++) + { + dgvMeasureContent.Rows[i - 1].HeaderCell.Value = i.ToString(); + } - string strTargetRate = Math.Round(ConfigDfn.dFPY2 * 100.00d, 2).ToString("F2") + "%"; + MyBase.TraceWriteLine("计算合格率的时:包含极差计算项!"); + } + #endregion 计算极差 - tmrm.CarID = strCarID; - tmrm.CarType = "EHY"; - tmrm.SumMeasureItems = dtRowCount; - tmrm.GoodMeasureItems = (int)OKCount; - tmrm.NoGoodMeasureItems = (int)OutCount; - tmrm.RejectMeasureItems = (int)RejectedCount; - tmrm.FPY = FPYPercent.ToString("F4"); - tmrm.Remark = ""; - tmrm.MeasureDate = ConfigDfn.strMeasureTime; - tmdal.InsertTMeasureResult(tmrm); - MyBase.TraceWriteLine("将总结果插入数据库完毕。"); - MyBase.TraceWriteLine("全部插入解析完毕,删除文件:" + fi.Name); - fi.Delete(); + #region 界面显示功能 - dgvMeasureContent.Rows.Add(); - dgvMeasureContent.Rows[dgvMeasureContent.Rows.Count - 1].Cells["MResult"].Value = (dtRowCount - OutCount - RejectedCount).ToString() + "/" + dtRowCount.ToString(); - this.dgvMeasureContent.Rows[dgvMeasureContent.Rows.Count - 1].DefaultCellStyle.ForeColor = Color.White; - if (dgvMeasureContent.Rows.Count > 0) - { - SetdgvRowBgColor(dgvMeasureContent); - for (int i = 0; i < dgvMeasureContent.Rows.Count; i++) - { - //if (dgvMeasureContent.Rows[i].Cells["MResult"].Value.ToString().ToLower().Contains("ok")) - //{ - // dgvMeasureContent.Rows[i].DefaultCellStyle.BackColor = Color.Orange; - //} - if (dgvMeasureContent.Rows[i].Cells["MResult"].Value.ToString().ToLower().Contains("ng")) - { - dgvMeasureContent.Rows[i].DefaultCellStyle.BackColor = Color.Orange; - } - else if (string.IsNullOrEmpty(dgvMeasureContent.Rows[i].Cells["MResult"].Value.ToString())) - { - dgvMeasureContent.Rows[i].DefaultCellStyle.BackColor = Color.Red; - } - else - { - } - } - } + labCarType.Text = "EH3"; + TMeasureResultModel tmrm = new TMeasureResultModel(); + labNGCount.Text = OutCount.ToString(); + labOKCount.Text = OKCount.ToString(); + labRejectCount.Text = RejectedCount.ToString(); + labMeaTime.Text = ConfigDfn.strMeasureTime; + labSumMeasureCount.Text = dtRowCount.ToString(); + FPYPercent = OKCount / (OKCount + OutCount); + if (FPYPercent >= ConfigDfn.dFPY) + { + labResultPercent.Text = Math.Round(FPYPercent * 100.00d, 2).ToString("F2") + "%"; + labResult.Text = "合格"; + labResultPercent.ForeColor = Color.LimeGreen; + labResult.ForeColor = Color.LimeGreen; + pbResult.Image = Resources.OK; + tmrm.Result = 1; + PlcObject.InsertWriteQueue(PlcSignalDfn.CMMResult, (byte)10); + } + else if (FPYPercent >= ConfigDfn.dFPY2 && FPYPercent < ConfigDfn.dFPY) + { + labResultPercent.Text = Math.Round(FPYPercent * 100.00d, 2).ToString("F2") + "%"; + labResult.Text = "合格"; + labResultPercent.ForeColor = Color.Yellow; + labResult.ForeColor = Color.Yellow; + pbResult.Image = Resources.OK; + tmrm.Result = 1; + PlcObject.InsertWriteQueue(PlcSignalDfn.CMMResult, (byte)20); + } + else + { + labResultPercent.Text = Math.Round(FPYPercent * 100.00d, 2).ToString("F2") + "%"; + labResult.Text = "不合格"; + labResultPercent.ForeColor = Color.Red; + labResult.ForeColor = Color.Red; + pbResult.Image = Resources.NG; + tmrm.Result = 2; + PlcObject.InsertWriteQueue(PlcSignalDfn.CMMResult, (byte)30); + } + xValues[0] = "合格 : " + OKCount.ToString(); + xValues[1] = "不合格 : " + OutCount.ToString(); + xValues[2] = "异常 : " + RejectedCount.ToString(); + yValues[0] = (int)OKCount; + yValues[1] = (int)OutCount; + yValues[2] = (int)RejectedCount; + chartResultPie.Series[0].Points.DataBindXY(xValues, yValues); - #endregion 界面显示功能 + string strTargetRate = Math.Round(ConfigDfn.dFPY2 * 100.00d, 2).ToString("F2") + "%"; + tmrm.CarID = strCarID; + tmrm.CarType = "EH3"; + tmrm.SumMeasureItems = dtRowCount; + tmrm.GoodMeasureItems = (int)OKCount; + tmrm.NoGoodMeasureItems = (int)OutCount; + tmrm.RejectMeasureItems = (int)RejectedCount; + tmrm.FPY = FPYPercent.ToString("F4"); + tmrm.Remark = ""; + tmrm.MeasureDate = ConfigDfn.strMeasureTime; + tmdal.InsertTMeasureResult(tmrm); + MyBase.TraceWriteLine("将EH3总结果插入数据库完毕。"); + MyBase.TraceWriteLine("全部插入解析完毕,删除文件:" + fi.Name); + fi.Delete(); + dgvMeasureContent.Rows.Add(); + dgvMeasureContent.Rows[dgvMeasureContent.Rows.Count - 1].Cells["MResult"].Value = (dtRowCount - OutCount - RejectedCount).ToString() + "/" + dtRowCount.ToString(); + this.dgvMeasureContent.Rows[dgvMeasureContent.Rows.Count - 1].DefaultCellStyle.ForeColor = Color.White; + if (dgvMeasureContent.Rows.Count > 0) + { + SetdgvRowBgColor(dgvMeasureContent); + for (int i = 0; i < dgvMeasureContent.Rows.Count; i++) + { + //if (dgvMeasureContent.Rows[i].Cells["MResult"].Value.ToString().ToLower().Contains("ok")) + //{ + // dgvMeasureContent.Rows[i].DefaultCellStyle.BackColor = Color.Orange; + //} + if (dgvMeasureContent.Rows[i].Cells["MResult"].Value.ToString().ToLower().Contains("ng")) + { + dgvMeasureContent.Rows[i].DefaultCellStyle.BackColor = Color.Orange; + } + else if (string.IsNullOrEmpty(dgvMeasureContent.Rows[i].Cells["MResult"].Value.ToString())) + { + dgvMeasureContent.Rows[i].DefaultCellStyle.BackColor = Color.Red; + } + else + { + } + } + } - if (ConfigDfn.iCreateReportFlag == 1) - { - #region 解析完报告后,重新生成客户模板报告 + #endregion 界面显示功能 - MyBase.TraceWriteLine("开始生成客户所需要的CSV格式文件:"); - string filePath = strSaveReprotPath + DateTime.Now.ToString("yyyyMMddHHmmss") + "_" + strCarID + ".csv"; //wsp 后期还要再改 - string strWithoutLCarVin = strCarID.Substring(1); - StringBuilder sb = new StringBuilder(); - //添加表头 - sb.Append("Measurement Info Name"); - sb.Append(","); - sb.Append("Measurement Info"); - sb.AppendLine(); - sb.Append("Date_Time"); - sb.Append(","); - sb.Append(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")); - sb.AppendLine(); - for (int i = 0; i < listCSVTitleInfo.Count; i++) - { - if (listCSVTitleInfo[i].Contains("prodnum")) - { - listCSVTitleInfo[i] = listCSVTitleInfo[i].Replace("prodnum", "Part_ident"); - } - if (listCSVTitleInfo[i].Contains(strWithoutLCarVin)) - { - listCSVTitleInfo[i] = listCSVTitleInfo[i].Replace(strWithoutLCarVin, strCarID); - } - sb.Append(listCSVTitleInfo[i]); - sb.AppendLine(); - } - sb.AppendLine(); - sb.AppendLine(); - sb.AppendLine(); - sb.AppendLine(); - sb.AppendLine(); - //添加测量数据 - sb.Append("Characteristic"); - sb.Append(","); - sb.Append("Extension"); - sb.Append(","); - sb.Append("Measured_Value"); - sb.AppendLine(); - foreach (DataRow row in dtCSVContent.Rows) - { - sb.Append(row.ItemArray[2]); - sb.Append(","); - sb.Append(row.ItemArray[3]); - sb.Append(","); - sb.Append(row.ItemArray[7]); - sb.AppendLine(); - } - if (dtAllRangeDate.Rows.Count > 0) - { - foreach (DataRow row in dtAllRangeDate.Rows) - { - sb.Append(row.ItemArray[2]); - sb.Append(","); - sb.Append("G"); - sb.Append(","); - sb.Append(row.ItemArray[3]); - sb.AppendLine(); - } - } - sb.Append("POP"); - sb.Append(","); - sb.Append("P"); - sb.Append(","); - sb.Append(Math.Round(FPYPercent * 100.00d, 2).ToString("F2")); - sb.AppendLine(); - // 将数据写入CSV文件 - File.WriteAllText(filePath, sb.ToString()); - MyBase.TraceWriteLine("客户EHY csv报告生成完毕,路径为:" + filePath); + //生成客户的 CSV文件 + if (ConfigDfn.iCreateReportFlag == 1) + { + GenUserReportCSV(strCarID, listCSVTitleInfo, dtAllRangeDate, FPYPercent); + } + else + { + MyBase.TraceWriteLine("EH3数据生成报告功能未启用!"); + } - #endregion 解析完报告后,重新生成客户模板报告 - } - else - { - MyBase.TraceWriteLine("iCreateReportFlag=0 : EHY数据生成报告功能未启用!"); - } + #region Update Data To IOT + if (ConfigDfn.iStartIOTFlag == 1) + { + bool bVINMeasuedFlag = tmdal.CheckVINExistInDB(strCarID); + if (bVINMeasuedFlag) + { + MyBase.TraceWriteLine("VIN:" + strCarID + " 该VIN码已经在数据库中存在了,说明已经测量过了,不再进行IOT数据上传操作。"); + } + else + { + #region IOT上传功能 + if (dtAllRangeDate.Rows.Count > 0) + { + foreach (DataRow row in dtAllRangeDate.Rows) + { + CheryIOTData cIOTData = new CheryIOTData(); + cIOTData.vin = strCarID; + cIOTData.gfNo = "G"; + cIOTData.pointNumber = row.ItemArray[2].ToString(); + cIOTData.actualValue = row.ItemArray[3].ToString(); + cIOTData.controlLine = row.ItemArray[4].ToString(); + cIOTData.measurementResult = row.ItemArray[5].ToString(); + if (cIOTData.measurementResult.ToUpper().Contains("NG")) + { + if (!string.IsNullOrEmpty(cIOTData.actualValue) && !cIOTData.actualValue.ToLower().Contains("inv")) //避免为空的情况 + { + dLowerValue = double.Parse(row.ItemArray[4].ToString().Substring(0, 3)); + dUpperValue = double.Parse(row.ItemArray[4].ToString().Substring(4, 3)); + dStrictTLower = CalculateStrictLowerTolerance(dLowerValue, dUpperValue); + dStrictTUpper = CalculateStrictUpperTolerance(dLowerValue, dUpperValue); + double dValue = double.Parse(row.ItemArray[3].ToString()); + if (dValue > dStrictTLower && dValue < dStrictTUpper) + { + cIOTData.measurementResult = "OK"; + } + } + } + ListPostIOTData.Add(cIOTData); + } + } + string strGapList = JsonHelper.ObjectToJson(ListPostIOTData); + string strCaliResult = "OK"; + if (labResult.Text == "合格") + { + strCaliResult = "OK"; + } + else + { + strCaliResult = "NG"; + } + string strPostData = "{\"serno\":\"" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + "\",\"requestData\":[{\"vin\":\"" + strCarID + "\",\"model\":\"EH3\",\"equipmentNo\":\"" + ConfigDfn.strEquipNo + "\",\"equipmentName\":\"" + ConfigDfn.strEquipName + "\",\"calibrationResult\":\"" + strCaliResult + "\",\"detectionTime\":\"" + ConfigDfn.strMeasureTime + "\",\"targetRate\":\"" + strTargetRate + "\",\"rate\":\"" + labResultPercent.Text + "\",\"GapList\":" + strGapList + "}]}"; + MyBase.TraceWriteLine("Update To IOT Data Content: " + strPostData); + string strPostResult = PostJsonToIOT(ConfigDfn.strIOTAddress, strPostData, 10000); + MyBase.TraceWriteLine("EH3数据上传IOT完成,结果返回为:" + strPostResult); + if (strPostResult.Contains("成功")) + { + MyBase.TraceWriteLine("EH3数据上传IOT成功 ^_^"); + } + else + { + MyBase.TraceWriteLine("EH3数据上传IOT失败!"); + } - #region Update Data To IOT + #endregion IOT上传功能 + } + } + else + { + MyBase.TraceWriteLine("数据上传IOT功能未启用!"); + } - if (ConfigDfn.iStartIOTFlag == 1) - { + #endregion Update Data To IOT + } + } + } + //else + //{ + // MyBase.TraceWriteLine("错误:AnalysisNextSenseEH3CSV函数中,检测EH3 CSV 路径不存在:" + ConfigDfn.strNextSenseCSVPath); + //} + } + catch (Exception ex) + { + MyBase.TraceWriteLine("AnalysisNextSenseCSV 函数分析异常:" + ex.ToString()); + } + } + private void AnalysisNextSenseEHYCSV() + { + try + { + lbCSVFiles.Items.Clear(); + FileInfo[] fileInfos = null; + if (Directory.Exists(ConfigDfn.strNextSenseCSVEHYPath)) + { + DirectoryInfo di = new DirectoryInfo(ConfigDfn.strNextSenseCSVEHYPath); + fileInfos = di.GetFiles("*.CSV"); + if (fileInfos.Count() >= 1) + { + MyBase.TraceWriteLine("存在EHY CSV文件,开始解析:"); + List listCSVTitleInfo = new List(); + string strCarID = ""; + foreach (FileInfo fi in fileInfos) + { + listCSVTitleInfo.Clear(); + ListPostIOTData.Clear(); + dtCSVContent.Clear(); + dgvMeasureContent.Rows.Clear(); + string strCSVName = fi.FullName; + File.Copy(fi.FullName, ConfigDfn.strFileFolder + "\\NextSenseCSVBackup\\" + fi.Name, true); + MyBase.TraceWriteLine("Copy " + fi.FullName + " TO " + ConfigDfn.strFileFolder + "\\NextSenseCSVBackup\\" + fi.Name + " Done. 备份完成"); + lbCSVFiles.Items.Add(fi.Name); + + #region 解析EHY CSV报告 + + MyBase.TraceWriteLine("开始解析NextSense EHY CSV 报告:" + strCSVName); + Encoding encoding = GetType(strCSVName); + FileStream fs = new FileStream(strCSVName, FileMode.Open, FileAccess.Read); + StreamReader sr = new StreamReader(fs, encoding); + //记录每次读取的一行记录 + string strLine = ""; + //记录每行记录中的各字段内容 + string[] aryLineContent = null; + + //逐行读取CSV中的数据 + int LineNum = 0; + //表格行数 + int dtRowCount = 0; + //超差个数 + double OutCount = 0; + //Ok个数 + double OKCount = 0; + //异常个数 + double RejectedCount = 0; + //合格率 + double FPYPercent = 0; + double dStrictTLower = 0; + double dStrictTUpper = 0; + double dLowerValue = 0; + double dUpperValue = 0; + double dExcepitonTLower = 0; + double dExceptionTUpper = 0; + double dMeasureValue = 0.0; + DataTable dt = null; + while ((strLine = sr.ReadLine()) != null) + { + LineNum++; + if (LineNum >= 3 & LineNum <= 16) + { + listCSVTitleInfo.Add(strLine); + } + if (LineNum == 10) + { + aryLineContent = strLine.Split(','); + MyBase.TraceWriteLine("解析出NextSense CSV中的VIN为:" + aryLineContent[1]); + strCarID = tmdal.SelectVINByCSVVIN(aryLineContent[1]); + MyBase.TraceWriteLine("通过CSV VIN从数据库中获取的完整VIN为:" + strCarID); + if (strCarID.ToLower().Contains("nofind")) + { + MyBase.TraceWriteLine("数据库中没有查找到VIN码,NoFind, +L 使用CSV码"); + labVIN.Text = "L" + aryLineContent[1]; + strCarID = "L" + aryLineContent[1]; + } + else + { + labVIN.Text = strCarID; + tmdal.DeleteOneTTempVIN(strCarID); + MyBase.TraceWriteLine("在数据库表TTempSaveVIN中删除该VIN:" + strCarID); + } + + // 向 strNextsenseDataPath 文件中插入数据 strCarID + AppendRecord(strCarID, strNextsenseDataPath); + } + if (LineNum >= 19) + { + aryLineContent = strLine.Split(','); + ConfigDfn.strMeasureTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + double dNormalValue = 0.0d; + + dt = tmdal.SelectOneToleranceByCondition("EHY", aryLineContent[0], aryLineContent[1]); + if (dt.Rows.Count == 1) + { + dLowerValue = double.Parse(dt.Rows[0]["TolLower"].ToString()); + dUpperValue = double.Parse(dt.Rows[0]["TolUpper"].ToString()); + dNormalValue = (dLowerValue + dUpperValue) / 2; + dStrictTLower = CalculateStrictLowerTolerance(dLowerValue, dUpperValue); + dStrictTUpper = CalculateStrictUpperTolerance(dLowerValue, dUpperValue); + dExcepitonTLower = CalculateExceptionLowerTolerance(dLowerValue, dUpperValue); + dExceptionTUpper = CalculateExceptionUpperTolerance(dLowerValue, dUpperValue); + } + else + { + dStrictTLower = 0; + dStrictTUpper = 0; + dLowerValue = 0; + dUpperValue = 0; + MyBase.TraceWriteLine("EHY " + aryLineContent[0] + " " + aryLineContent[1] + " 查询数据获取公差带失败!数据库中数量不唯一或不存在,请检查公差带配置!"); + } + + if (aryLineContent[2].ToLower().Contains("inv")) + { + aryLineContent[2] = ""; + aryLineContent[4] = "ng2"; + } + else + { + dMeasureValue = double.Parse(aryLineContent[2]); + if (dMeasureValue >= dLowerValue && dMeasureValue <= dUpperValue) + { + aryLineContent[4] = "good"; + } + else if (dMeasureValue >= dStrictTLower && dMeasureValue <= dStrictTUpper) + { + aryLineContent[4] = "ng1"; + } + else if (dMeasureValue >= dExceptionTUpper || dMeasureValue <= dExcepitonTLower) + { + aryLineContent[4] = "ng3"; + aryLineContent[2] = ""; + } + else + { + aryLineContent[4] = "ng2"; + } + } + + //测量数据存储到table里 + dtCSVContent.Rows.Add(strCarID, "EHY", aryLineContent[0], aryLineContent[1], dNormalValue.ToString("F1"), dLowerValue.ToString("F1"), dUpperValue.ToString("F1"), aryLineContent[2], aryLineContent[4], DateTime.Now, ""); + string strMeasureResult = aryLineContent[4].ToLower(); + if (strMeasureResult.Contains("good") || strMeasureResult.Contains("best") || strMeasureResult.Contains("ng1")) + { + OKCount++; + aryLineContent[4] = "OK"; + } + else if (strMeasureResult.Contains("ng2")) + { + OutCount++; + aryLineContent[4] = "NG"; + } + else + { + RejectedCount++; + aryLineContent[4] = ""; + aryLineContent[2] = ""; + } + + dgvMeasureContent.Rows.Add(aryLineContent[0], aryLineContent[1], dNormalValue.ToString("F1"), dLowerValue.ToString("F1"), dUpperValue.ToString("F1"), aryLineContent[2], ConfigDfn.strMeasureTime, aryLineContent[4]); + + CheryIOTData cIOTData = new CheryIOTData(); + cIOTData.vin = strCarID; + cIOTData.gfNo = aryLineContent[1]; + cIOTData.pointNumber = aryLineContent[0]; + cIOTData.actualValue = aryLineContent[2]; + cIOTData.controlLine = dLowerValue.ToString("F1") + @"/" + dUpperValue.ToString("F1"); + if (strMeasureResult.Contains("good") || strMeasureResult.Contains("best") || strMeasureResult.Contains("ng1")) + { + cIOTData.measurementResult = "OK"; + } + else + { + cIOTData.measurementResult = "NG"; + } + ListPostIOTData.Add(cIOTData); + dtRowCount++; + dgvMeasureContent.Rows[dtRowCount - 1].HeaderCell.Value = dtRowCount.ToString(); + } + }//End While + sr.Close(); + fs.Close(); + tmdal.InsertTMeasureDatabyDataTable(dtCSVContent); + MyBase.TraceWriteLine("解析EHY数据完成,并将所有测量数据插入到数据库完毕。"); + MyBase.TraceWriteLine("解析NextSense EHY CSV 报告完毕!检查数量=" + dtRowCount.ToString()); + if (dtRowCount <= ConfigDfn.iMeasureItemsCount) + { + iCurrentMeasureItemsFailedCount++; + } + else + { + iCurrentMeasureItemsFailedCount = 0; + } + + if (iCurrentMeasureItemsFailedCount >= ConfigDfn.iFailedCarCount) + { + MyBase.TraceWriteLine("iCurrentMeasureItemsFailedCount=" + iCurrentMeasureItemsFailedCount.ToString() + "超过报警数量" + ConfigDfn.iFailedCarCount.ToString() + " ;给PLC发送报警10。"); + PlcObject.InsertWriteQueue(PlcSignalDfn.MeasureError, (byte)10); + } + #endregion 解析EHY CSV报告 + + #region 计算极差 + CalculateRange(strCarID, "EHY"); + Thread.Sleep(20); + DataTable dtAllRangeDate = tmdal.SelectRangeDatabyCarID(strCarID); + if (dtAllRangeDate.Rows.Count > 0) + { + foreach (DataRow row in dtAllRangeDate.Rows) + { + if (ConfigDfn.iIncludeRangeFlag == 1) + { + if (row.ItemArray[5].ToString().Contains("OK")) + { + OKCount++; + } + else + { + OutCount++; + } + } + + dgvMeasureContent.Rows.Add(row.ItemArray[2].ToString(), "G", "0", row.ItemArray[4].ToString().Substring(0, 3), row.ItemArray[4].ToString().Substring(4, 3), row.ItemArray[3].ToString(), ConfigDfn.strMeasureTime, row.ItemArray[5].ToString()); + } + } + + if (ConfigDfn.iIncludeRangeFlag == 1) + { + dtRowCount = dtRowCount + dtAllRangeDate.Rows.Count; + for (int i = 1; i <= dtRowCount; i++) + { + dgvMeasureContent.Rows[i - 1].HeaderCell.Value = i.ToString(); + } + MyBase.TraceWriteLine("计算合格率的时:包含极差计算项!"); + } + + #endregion 计算极差 + + #region 界面显示功能 + + labCarType.Text = "EHY"; + TMeasureResultModel tmrm = new TMeasureResultModel(); + labNGCount.Text = OutCount.ToString(); + labOKCount.Text = OKCount.ToString(); + labRejectCount.Text = RejectedCount.ToString(); + labMeaTime.Text = ConfigDfn.strMeasureTime; + labSumMeasureCount.Text = dtRowCount.ToString(); + FPYPercent = OKCount / (OKCount + OutCount); + if (FPYPercent >= ConfigDfn.dFPY) + { + labResultPercent.Text = Math.Round(FPYPercent * 100.00d, 2).ToString("F2") + "%"; + labResult.Text = "合格"; + labResultPercent.ForeColor = Color.LimeGreen; + labResult.ForeColor = Color.LimeGreen; + pbResult.Image = Resources.OK; + tmrm.Result = 1; + PlcObject.InsertWriteQueue(PlcSignalDfn.CMMResult, (byte)10); + } + else if (FPYPercent >= ConfigDfn.dFPY2 && FPYPercent < ConfigDfn.dFPY) + { + labResultPercent.Text = Math.Round(FPYPercent * 100.00d, 2).ToString("F2") + "%"; + labResult.Text = "合格"; + labResultPercent.ForeColor = Color.Yellow; + labResult.ForeColor = Color.Yellow; + pbResult.Image = Resources.OK; + tmrm.Result = 1; + PlcObject.InsertWriteQueue(PlcSignalDfn.CMMResult, (byte)20); + } + else + { + labResultPercent.Text = Math.Round(FPYPercent * 100.00d, 2).ToString("F2") + "%"; + labResult.Text = "不合格"; + labResultPercent.ForeColor = Color.Red; + labResult.ForeColor = Color.Red; + pbResult.Image = Resources.NG; + tmrm.Result = 2; + PlcObject.InsertWriteQueue(PlcSignalDfn.CMMResult, (byte)30); + } + xValues[0] = "合格 : " + OKCount.ToString(); + xValues[1] = "不合格 : " + OutCount.ToString(); + xValues[2] = "异常 : " + RejectedCount.ToString(); + yValues[0] = (int)OKCount; + yValues[1] = (int)OutCount; + yValues[2] = (int)RejectedCount; + chartResultPie.Series[0].Points.DataBindXY(xValues, yValues); + + string strTargetRate = Math.Round(ConfigDfn.dFPY2 * 100.00d, 2).ToString("F2") + "%"; + + tmrm.CarID = strCarID; + tmrm.CarType = "EHY"; + tmrm.SumMeasureItems = dtRowCount; + tmrm.GoodMeasureItems = (int)OKCount; + tmrm.NoGoodMeasureItems = (int)OutCount; + tmrm.RejectMeasureItems = (int)RejectedCount; + tmrm.FPY = FPYPercent.ToString("F4"); + tmrm.Remark = ""; + tmrm.MeasureDate = ConfigDfn.strMeasureTime; + tmdal.InsertTMeasureResult(tmrm); + MyBase.TraceWriteLine("将总结果插入数据库完毕。"); + MyBase.TraceWriteLine("全部插入解析完毕,删除文件:" + fi.Name); + fi.Delete(); + + dgvMeasureContent.Rows.Add(); + dgvMeasureContent.Rows[dgvMeasureContent.Rows.Count - 1].Cells["MResult"].Value = (dtRowCount - OutCount - RejectedCount).ToString() + "/" + dtRowCount.ToString(); + this.dgvMeasureContent.Rows[dgvMeasureContent.Rows.Count - 1].DefaultCellStyle.ForeColor = Color.White; + if (dgvMeasureContent.Rows.Count > 0) + { + SetdgvRowBgColor(dgvMeasureContent); + for (int i = 0; i < dgvMeasureContent.Rows.Count; i++) + { + //if (dgvMeasureContent.Rows[i].Cells["MResult"].Value.ToString().ToLower().Contains("ok")) + //{ + // dgvMeasureContent.Rows[i].DefaultCellStyle.BackColor = Color.Orange; + //} + if (dgvMeasureContent.Rows[i].Cells["MResult"].Value.ToString().ToLower().Contains("ng")) + { + dgvMeasureContent.Rows[i].DefaultCellStyle.BackColor = Color.Orange; + } + else if (string.IsNullOrEmpty(dgvMeasureContent.Rows[i].Cells["MResult"].Value.ToString())) + { + dgvMeasureContent.Rows[i].DefaultCellStyle.BackColor = Color.Red; + } + else + { + } + } + } + + #endregion 界面显示功能 + + if (ConfigDfn.iCreateReportFlag == 1) + { + GenUserReportCSV(strCarID, listCSVTitleInfo, dtAllRangeDate, FPYPercent); + } + else + { + MyBase.TraceWriteLine("iCreateReportFlag=0 : EHY数据生成报告功能未启用!"); + } + + #region Update Data To IOT + + if (ConfigDfn.iStartIOTFlag == 1) + { bool bVINMeasuedFlag = tmdal.CheckVINExistInDB(strCarID); if (bVINMeasuedFlag) { @@ -1375,7 +1228,6 @@ namespace NSAnalysis { foreach (DataRow row in dtAllRangeDate.Rows) { - CheryIOTData cIOTData = new CheryIOTData(); cIOTData.vin = strCarID; cIOTData.gfNo = "G"; @@ -1385,7 +1237,7 @@ namespace NSAnalysis cIOTData.measurementResult = row.ItemArray[5].ToString(); if (cIOTData.measurementResult.ToUpper().Contains("NG")) { - if (!cIOTData.actualValue.ToLower().Contains("inv")) + if (!string.IsNullOrEmpty(cIOTData.actualValue) && !cIOTData.actualValue.ToLower().Contains("inv")) //避免为空的情况 { dLowerValue = double.Parse(row.ItemArray[4].ToString().Substring(0, 3)); dUpperValue = double.Parse(row.ItemArray[4].ToString().Substring(4, 3)); @@ -1423,50 +1275,317 @@ namespace NSAnalysis { MyBase.TraceWriteLine("EHY数据上传IOT失败!"); } - } - } - else - { - MyBase.TraceWriteLine("EHY数据上传IOT功能未启用!"); - } - - #endregion Update Data To IOT - } - } - } - //else - //{ - // MyBase.TraceWriteLine("错误:AnalysisNextSenseEHYCSV 函数中,检测EHY CSV 路径不存在:" + ConfigDfn.strNextSenseCSVEHYPath); - //} - } - catch (Exception ex) - { - MyBase.TraceWriteLine("AnalysisNextSenseEHYCSV 函数分析异常:" + ex.ToString()); - } - } - - - private void testIotUpload() - { - - // 修复极差 计算问题 - //LNNBBDEC7SDF49695 - //string strVIN = "LNNBBDEC5SDF49694"; - // string strCarType = "EHY"; - //CalculateRange(strVIN, strCarType); - - - //修复IOt上传问题 - string strCarID = "LNNBDDEF4SDF49707"; - DataTable dtAllRangeDate = tmdal.SelectRangeDatabyCarID(strCarID); - string strTargetRate = "97.00%"; - UploadIOTData(strCarID, dtAllRangeDate, strTargetRate); + else + { + MyBase.TraceWriteLine("EHY数据上传IOT功能未启用!"); + } + #endregion Update Data To IOT + } + } + } + //else + //{ + // MyBase.TraceWriteLine("错误:AnalysisNextSenseEHYCSV 函数中,检测EHY CSV 路径不存在:" + ConfigDfn.strNextSenseCSVEHYPath); + //} + } + catch (Exception ex) + { + MyBase.TraceWriteLine("AnalysisNextSenseEHYCSV 函数分析异常:" + ex.ToString()); + } } - private void UploadIOTData(string strCarID, DataTable dtAllRangeDate, string strTargetRate) + private void AnalysisNextSenseSelfMeasureCSV() + { + try + { + lbCSVFiles.Items.Clear(); + FileInfo[] fileInfos = null; + if (Directory.Exists(ConfigDfn.strNextSenseSelfMeasurePath)) + { + DirectoryInfo di = new DirectoryInfo(ConfigDfn.strNextSenseSelfMeasurePath); + fileInfos = di.GetFiles("*.CSV"); + if (fileInfos.Count() >= 1) + { + MyBase.TraceWriteLine("存在EHY CSV文件,开始解析:"); + List listCSVTitleInfo = new List(); + string strCarID = "SelfMeasure" + DateTime.Now.ToString("yyyyMMddHHmmss"); + foreach (FileInfo fi in fileInfos) + { + listCSVTitleInfo.Clear(); + ListPostIOTData.Clear(); + dtCSVContent.Clear(); + dgvMeasureContent.Rows.Clear(); + string strCSVName = fi.FullName; + File.Copy(fi.FullName, ConfigDfn.strFileFolder + "\\NextSenseCSVBackup\\" + fi.Name, true); + MyBase.TraceWriteLine("Copy " + fi.FullName + " TO " + ConfigDfn.strFileFolder + "\\NextSenseCSVBackup\\" + fi.Name + " Done. 备份完成"); + lbCSVFiles.Items.Add(fi.Name); + + #region 解析NextSense自检CSV报告 + + MyBase.TraceWriteLine("开始解析NextSense EHY CSV 报告:" + strCSVName); + Encoding encoding = GetType(strCSVName); + FileStream fs = new FileStream(strCSVName, FileMode.Open, FileAccess.Read); + StreamReader sr = new StreamReader(fs, encoding); + //记录每次读取的一行记录 + string strLine = ""; + //记录每行记录中的各字段内容 + string[] aryLineContent = null; + + //逐行读取CSV中的数据 + int LineNum = 0; + //表格行数 + int dtRowCount = 0; + + while ((strLine = sr.ReadLine()) != null) + { + LineNum++; + if (LineNum >= 1 & LineNum <= 17) + { + listCSVTitleInfo.Add(strLine); + } + if (LineNum >= 19) + { + aryLineContent = strLine.Split(','); + ConfigDfn.strMeasureTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + + if (aryLineContent[2].ToLower().Contains("inv")) + { + aryLineContent[2] = ""; //当为inv ,内容为空 + aryLineContent[10] = "NG"; + } + string strMeasPointName = ""; + if (aryLineContent[0].ToUpper().Contains("L")) + { + strMeasPointName = "L-ZJ1"; + } + else + { + strMeasPointName = "R-ZJ1"; + } + //测量数据存储到table里 + dtCSVContent.Rows.Add(strCarID, "SelfMeasure", strMeasPointName, aryLineContent[1], aryLineContent[4], aryLineContent[8], aryLineContent[9], aryLineContent[2], aryLineContent[10], DateTime.Now, ""); + + dgvMeasureContent.Rows.Add(strMeasPointName, aryLineContent[1], aryLineContent[4], aryLineContent[8], aryLineContent[9], aryLineContent[2], ConfigDfn.strMeasureTime, aryLineContent[10]); + + dtRowCount++; + dgvMeasureContent.Rows[dtRowCount - 1].HeaderCell.Value = dtRowCount.ToString(); + } + }//End While + sr.Close(); + fs.Close(); + + MyBase.TraceWriteLine("解析NextSense 自检报告完毕!检查数量=" + dtRowCount.ToString()); + labCarType.Text = "自检报告"; + + fi.Delete(); + #endregion 解析NextSense自检CSV报告 + + if (ConfigDfn.iCreateReportFlag == 1) + { + #region 解析完报告后,重新生成客户模板报告 + + MyBase.TraceWriteLine("开始生成客户所需要的CSV格式文件:"); + string targetFilePath = strSaveReprotPath + DateTime.Now.ToString("yyyyMMddHHmmss") + "_" + strCarID + ".csv"; //wsp 后期还要再改 + + // 创建临时路径,为应用程序目录\ReportBackup 路径下 + string tempFilePath = Application.StartupPath + "\\ReportBackup"; + + if (!Directory.Exists(tempFilePath)) + { + Directory.CreateDirectory(tempFilePath); + //日志 + MyBase.TraceWriteLine("创建ReportBackup文件夹完毕,路径为:" + tempFilePath); + } + + StringBuilder sb = new StringBuilder(); + //添加表头 + sb.Append("Measurement Info Name"); + sb.Append(","); + sb.Append("Measurement Info"); + sb.AppendLine(); + sb.Append("Date_Time"); + sb.Append(","); + sb.Append(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")); + sb.AppendLine(); + for (int i = 2; i < listCSVTitleInfo.Count - 1; i++) + { + if (listCSVTitleInfo[i].Contains("prodnum")) + { + listCSVTitleInfo[i] = listCSVTitleInfo[i].Replace("prodnum,", "Part_ident," + DateTime.Now.ToString("yyyyMMdd")); + } + + sb.Append(listCSVTitleInfo[i]); + sb.AppendLine(); + } + sb.AppendLine(); + sb.AppendLine(); + sb.AppendLine(); + sb.AppendLine(); + sb.AppendLine(); + //添加测量数据 + sb.Append("Characteristic"); + sb.Append(","); + sb.Append("Extension"); + sb.Append(","); + sb.Append("Measured_Value"); + sb.AppendLine(); + foreach (DataRow row in dtCSVContent.Rows) + { + sb.Append(row.ItemArray[2]); + sb.Append(","); + sb.Append(row.ItemArray[3]); + sb.Append(","); + sb.Append(row.ItemArray[7]); + sb.AppendLine(); + } + sb.AppendLine(); + // 将数据写入CSV文件 + File.WriteAllText(tempFilePath, sb.ToString()); + MyBase.TraceWriteLine("客户自检报告生成完毕,备份路径为:" + targetFilePath); + + // 尝试进行复制到 目标路径 往目标路径copy该文件,并记录是否成功 + try + { + File.Copy(tempFilePath, targetFilePath, true); + if (File.Exists(targetFilePath)) + { + MyBase.TraceWriteLine("客户自检报告生成并复制成功,路径为:" + targetFilePath); + } + else + { + MyBase.TraceWriteLine("客户自检报告复制失败,目标文件不存在:" + targetFilePath); + } + } + catch (Exception ex) + { + MyBase.TraceWriteLine("客户自检报告复制异常:" + ex.Message); + } + + #endregion 解析完报告后,重新生成客户模板报告 + } + else + { + MyBase.TraceWriteLine("iCreateReportFlag=0 : 数据生成报告功能未启用!"); + } + } + } + } + } + catch (Exception ex) + { + MyBase.TraceWriteLine("AnalysisNextSenseSelfMeasureCSV 函数分析异常:" + ex.ToString()); + } + } + + public void GenUserReportCSV(string strCarID, List listCSVTitleInfo, DataTable dtAllRangeDate, double FPYPercent) + { + #region 解析完报告后,重新生成客户模板报告 + + // 目的路径 + string targetFilePath = strSaveReprotPath + DateTime.Now.ToString("yyyyMMddHHmmss") + "_" + strCarID + ".csv"; //wsp 后期还要再改 + + // 新建一个备份路径,应用程序根目录\ReportBackup + string backupPath = Application.StartupPath + "\\ReportBackup"; + if (!Directory.Exists(backupPath)) + { + Directory.CreateDirectory(backupPath); + //日志 + MyBase.TraceWriteLine("创建ReportBackup文件夹完毕,路径为:" + backupPath); + } + + string strWithoutLCarVin = strCarID.Substring(1); + StringBuilder sb = new StringBuilder(); + //添加表头 + sb.Append("Measurement Info Name"); + sb.Append(","); + sb.Append("Measurement Info"); + sb.AppendLine(); + sb.Append("Date_Time"); + sb.Append(","); + sb.Append(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")); + sb.AppendLine(); + for (int i = 0; i < listCSVTitleInfo.Count; i++) + { + if (listCSVTitleInfo[i].Contains("prodnum")) + { + listCSVTitleInfo[i] = listCSVTitleInfo[i].Replace("prodnum", "Part_ident"); + } + if (listCSVTitleInfo[i].Contains(strWithoutLCarVin)) + { + listCSVTitleInfo[i] = listCSVTitleInfo[i].Replace(strWithoutLCarVin, strCarID); + } + sb.Append(listCSVTitleInfo[i]); + sb.AppendLine(); + } + sb.AppendLine(); + sb.AppendLine(); + sb.AppendLine(); + sb.AppendLine(); + sb.AppendLine(); + //添加测量数据 + sb.Append("Characteristic"); + sb.Append(","); + sb.Append("Extension"); + sb.Append(","); + sb.Append("Measured_Value"); + sb.AppendLine(); + foreach (DataRow row in dtCSVContent.Rows) + { + sb.Append(row.ItemArray[2]); + sb.Append(","); + sb.Append(row.ItemArray[3]); + sb.Append(","); + sb.Append(row.ItemArray[7]); + sb.AppendLine(); + } + if (dtAllRangeDate.Rows.Count > 0) + { + foreach (DataRow row in dtAllRangeDate.Rows) + { + sb.Append(row.ItemArray[2]); + sb.Append(","); + sb.Append("G"); + sb.Append(","); + sb.Append(row.ItemArray[3]); + sb.AppendLine(); + } + } + sb.Append("POP"); + sb.Append(","); + sb.Append("P"); + sb.Append(","); + sb.Append(Math.Round(FPYPercent * 100.00d, 2).ToString("F2")); + sb.AppendLine(); + // 将数据写入CSV文件 + File.WriteAllText(backupPath, sb.ToString()); + // 记录日志,说明备份成功 + MyBase.TraceWriteLine("客户EHY csv报告备份完毕,路径为:" + backupPath); + + // 往目标路径copy该文件,并记录是否成功 + try + { + File.Copy(backupPath, targetFilePath, true); + if (File.Exists(targetFilePath)) + { + MyBase.TraceWriteLine("客户csv报告生成并复制成功,路径为:" + targetFilePath); + } + else + { + MyBase.TraceWriteLine("客户csv报告复制失败,目标文件不存在:" + targetFilePath); + } + } + catch (Exception ex) + { + MyBase.TraceWriteLine("客户csv报告复制异常:" + ex.Message); + } + + #endregion 解析完报告后,重新生成客户模板报告 + } + + private void UploadIOTData(string strCarID, DataTable dtAllRangeDate, string strTargetRate) { double dStrictTLower = 0; double dStrictTUpper = 0; @@ -1484,7 +1603,6 @@ namespace NSAnalysis { foreach (DataRow row in dtAllRangeDate.Rows) { - CheryIOTData cIOTData = new CheryIOTData(); cIOTData.vin = strCarID; cIOTData.gfNo = "G"; @@ -1532,1762 +1650,1671 @@ namespace NSAnalysis { MyBase.TraceWriteLine("EHY数据上传IOT失败!"); } - } - } - private void CalculateRange(string strVIN, string strCarType) - { - MyBase.TraceWriteLine(strVIN + " " + strCarType + "开始计算极差:============"); - tmdal.DeleteRangeData(strVIN); - dtRangeData.Clear(); - DataTable dtRange = tmdal.SelectRangeByCarType(strCarType); - if (dtRange != null && dtRange.Rows.Count > 0) - { - string strRangeValue = ""; - string strRangeLowUpp = ""; - string strRangeResult = ""; - DateTime dtTime = DateTime.Now; - string strRemark = ""; - for (int i = 0; i < dtRange.Rows.Count; i++) - { - string[] strArrRangePoint = dtRange.Rows[i]["RangePoint"].ToString().Split(','); - double[] dMeasureData = new double[strArrRangePoint.Length]; - int iCalcCount = 0; - for (int j = 0; j < strArrRangePoint.Length; j++) - { - string strMeasureValue = tmdal.SelectOneMeasureValueByCondition(strVIN, strArrRangePoint[j].Substring(0, 4)); - if (string.IsNullOrEmpty(strMeasureValue) || strMeasureValue.ToLower().Contains("inv")) - { - strRangeValue = ""; - strRangeResult = "NG"; - MyBase.TraceWriteLine(strArrRangePoint[j] + " G 查询的测量值为inv"); - break; - } - else if (strMeasureValue.ToLower().Contains("nofind")) - { - strRangeValue = ""; - strRangeResult = "NG"; - MyBase.TraceWriteLine(strArrRangePoint[j] + " G 查询的测量值为no find"); - break; - } - else - { - dMeasureData[j] = Convert.ToDouble(strMeasureValue); - iCalcCount++; - } - } + private void CalculateRange(string strVIN, string strCarType) + { + MyBase.TraceWriteLine(strVIN + " " + strCarType + "开始计算极差:============"); + tmdal.DeleteRangeData(strVIN); + dtRangeData.Clear(); + DataTable dtRange = tmdal.SelectRangeByCarType(strCarType); + if (dtRange != null && dtRange.Rows.Count > 0) + { + string strRangeValue = ""; + string strRangeLowUpp = ""; + string strRangeResult = ""; + DateTime dtTime = DateTime.Now; + string strRemark = ""; + for (int i = 0; i < dtRange.Rows.Count; i++) + { + string[] strArrRangePoint = dtRange.Rows[i]["RangePoint"].ToString().Split(','); + double[] dMeasureData = new double[strArrRangePoint.Length]; + int iCalcCount = 0; + for (int j = 0; j < strArrRangePoint.Length; j++) + { + string strMeasureValue = tmdal.SelectOneMeasureValueByCondition(strVIN, strArrRangePoint[j].Substring(0, 4)); + + if (string.IsNullOrEmpty(strMeasureValue) || strMeasureValue.ToLower().Contains("inv")) + { + strRangeValue = ""; + strRangeResult = "NG"; + MyBase.TraceWriteLine(strArrRangePoint[j] + " G 查询的测量值为inv"); + break; + } + else if (strMeasureValue.ToLower().Contains("nofind")) + { + strRangeValue = ""; + strRangeResult = "NG"; + MyBase.TraceWriteLine(strArrRangePoint[j] + " G 查询的测量值为no find"); + break; + } + else + { + dMeasureData[j] = Convert.ToDouble(strMeasureValue); + iCalcCount++; + } + } //iCalcCount 的作用就是确保只有全部测点都有效时才计算极差,否则提前退出。 if (iCalcCount == strArrRangePoint.Length) - { - double dMax = dMeasureData.Max(); - double dMin = dMeasureData.Min(); - double dRangeData = dMax - dMin; - strRangeValue = dRangeData.ToString("F1"); - if (dRangeData >= Convert.ToDouble(dtRange.Rows[i]["RangeLower"]) && dRangeData <= Convert.ToDouble(dtRange.Rows[i]["RangeUpper"])) - { - strRangeResult = "OK"; - } - else - { - strRangeResult = "NG"; - } - } - strRangeLowUpp = dtRange.Rows[i]["RangeLower"].ToString() + @"/" + dtRange.Rows[i]["RangeUpper"].ToString(); - dtRangeData.Rows.Add(strVIN, dtRange.Rows[i]["RangeName"].ToString(), strRangeValue, strRangeLowUpp, strRangeResult, dtTime, strRemark); - } - tmdal.InsertTRangeDatabyDataTable(dtRangeData); - MyBase.TraceWriteLine(strVIN + " " + strCarType + "计算极差完成,并插入数据库:============"); - } - - } - - public string PostJsonToIOT(string url, string jsonData, int? timeout = null) - { - try - { - HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url); - - if (null != timeout && 0 != timeout) - { - req.Timeout = timeout.Value; - } - Encoding encoding = Encoding.UTF8; - byte[] bs = Encoding.UTF8.GetBytes(jsonData); - string responseData; - req.Method = "POST"; - req.ContentType = "application/json"; - req.ContentLength = bs.Length; - using (Stream reqStream = req.GetRequestStream()) - { - reqStream.Write(bs, 0, bs.Length); - reqStream.Close(); - } - using (HttpWebResponse response = (HttpWebResponse)req.GetResponse()) - { - using (StreamReader reader = new StreamReader(response.GetResponseStream(), encoding)) - { - responseData = reader.ReadToEnd(); - } - } - return responseData; - } - catch (Exception ex) - { - return "Error: " + ex.ToString(); - } - } - - /// 通过给定的文件流,判断文件的编码类型 - /// 文件流 - /// 文件的编码类型 - public static Encoding GetType(FileStream fs) - { - byte[] Unicode = new byte[] { 0xFF, 0xFE, 0x41 }; - byte[] UnicodeBIG = new byte[] { 0xFE, 0xFF, 0x00 }; - byte[] UTF8 = new byte[] { 0xEF, 0xBB, 0xBF }; //带BOM - System.Text.Encoding reVal = System.Text.Encoding.Default; - - System.IO.BinaryReader r = new System.IO.BinaryReader(fs, System.Text.Encoding.Default); - int i; - int.TryParse(fs.Length.ToString(), out i); - byte[] ss = r.ReadBytes(i); - if (IsUTF8Bytes(ss) || (ss[0] == 0xEF && ss[1] == 0xBB && ss[2] == 0xBF)) - { - reVal = System.Text.Encoding.UTF8; - } - else if (ss[0] == 0xFE && ss[1] == 0xFF && ss[2] == 0x00) - { - reVal = System.Text.Encoding.BigEndianUnicode; - } - else if (ss[0] == 0xFF && ss[1] == 0xFE && ss[2] == 0x41) - { - reVal = System.Text.Encoding.Unicode; - } - r.Close(); - return reVal; - } - - /// 判断是否是不带 BOM 的 UTF8 格式 - /// - /// - private static bool IsUTF8Bytes(byte[] data) - { - int charByteCounter = 1; //计算当前正分析的字符应还有的字节数 - byte curByte; //当前分析的字节. - for (int i = 0; i < data.Length; i++) - { - curByte = data[i]; - if (charByteCounter == 1) - { - if (curByte >= 0x80) - { - //判断当前 - while (((curByte <<= 1) & 0x80) != 0) - { - charByteCounter++; - } - //标记位首位若为非0 则至少以2个1开始 如:110XXXXX...........1111110X  - if (charByteCounter == 1 || charByteCounter > 6) - { - return false; - } - } - } - else - { - //若是UTF-8 此时第一位必须为1 - if ((curByte & 0xC0) != 0x80) - { - return false; - } - charByteCounter--; - } - } - if (charByteCounter > 1) - { - throw new Exception("非预期的byte格式"); - } - return true; - } - - public Encoding GetType(string FileName) - { - FileStream fs = new FileStream(FileName, FileMode.Open, FileAccess.Read); - Encoding er = GetType(fs); - fs.Close(); - return er; - } - - - private void AnalysisNextSenseSelfMeasureCSV() - { - try - { - lbCSVFiles.Items.Clear(); - FileInfo[] fileInfos = null; - if (Directory.Exists(ConfigDfn.strNextSenseSelfMeasurePath)) - { - DirectoryInfo di = new DirectoryInfo(ConfigDfn.strNextSenseSelfMeasurePath); - fileInfos = di.GetFiles("*.CSV"); - if (fileInfos.Count() >= 1) - { - MyBase.TraceWriteLine("存在EHY CSV文件,开始解析:"); - List listCSVTitleInfo = new List(); - string strCarID = "SelfMeasure" + DateTime.Now.ToString("yyyyMMddHHmmss"); - foreach (FileInfo fi in fileInfos) - { - listCSVTitleInfo.Clear(); - ListPostIOTData.Clear(); - dtCSVContent.Clear(); - dgvMeasureContent.Rows.Clear(); - string strCSVName = fi.FullName; - File.Copy(fi.FullName, ConfigDfn.strFileFolder + "\\NextSenseCSVBackup\\" + fi.Name, true); - MyBase.TraceWriteLine("Copy " + fi.FullName + " TO " + ConfigDfn.strFileFolder + "\\NextSenseCSVBackup\\" + fi.Name + " Done. 备份完成"); - lbCSVFiles.Items.Add(fi.Name); - - #region 解析NextSense自检CSV报告 - - MyBase.TraceWriteLine("开始解析NextSense EHY CSV 报告:" + strCSVName); - Encoding encoding = GetType(strCSVName); - FileStream fs = new FileStream(strCSVName, FileMode.Open, FileAccess.Read); - StreamReader sr = new StreamReader(fs, encoding); - //记录每次读取的一行记录 - string strLine = ""; - //记录每行记录中的各字段内容 - string[] aryLineContent = null; - - //逐行读取CSV中的数据 - int LineNum = 0; - //表格行数 - int dtRowCount = 0; - - while ((strLine = sr.ReadLine()) != null) - { - LineNum++; - if (LineNum >= 1 & LineNum <= 17) - { - listCSVTitleInfo.Add(strLine); - } - if (LineNum >= 19) - { - aryLineContent = strLine.Split(','); - ConfigDfn.strMeasureTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); - - - if (aryLineContent[2].ToLower().Contains("inv")) - { - aryLineContent[2] = ""; //当为inv ,内容为空 - aryLineContent[10] = "NG"; - } - string strMeasPointName = ""; - if (aryLineContent[0].ToUpper().Contains("L")) - { - strMeasPointName = "L-ZJ1"; - } - else - { - strMeasPointName = "R-ZJ1"; - } - //测量数据存储到table里 - dtCSVContent.Rows.Add(strCarID, "SelfMeasure", strMeasPointName, aryLineContent[1], aryLineContent[4], aryLineContent[8], aryLineContent[9], aryLineContent[2], aryLineContent[10], DateTime.Now, ""); - - - dgvMeasureContent.Rows.Add(strMeasPointName, aryLineContent[1], aryLineContent[4], aryLineContent[8], aryLineContent[9], aryLineContent[2], ConfigDfn.strMeasureTime, aryLineContent[10]); - - dtRowCount++; - dgvMeasureContent.Rows[dtRowCount - 1].HeaderCell.Value = dtRowCount.ToString(); - } - }//End While - sr.Close(); - fs.Close(); - - MyBase.TraceWriteLine("解析NextSense 自检报告完毕!检查数量=" + dtRowCount.ToString()); - labCarType.Text = "自检报告"; - - fi.Delete(); - #endregion 解析EHY CSV报告 - - if (ConfigDfn.iCreateReportFlag == 1) - { - #region 解析完报告后,重新生成客户模板报告 - - MyBase.TraceWriteLine("开始生成客户所需要的CSV格式文件:"); - string filePath = strSaveReprotPath + DateTime.Now.ToString("yyyyMMddHHmmss") + "_" + strCarID + ".csv"; //wsp 后期还要再改 - StringBuilder sb = new StringBuilder(); - //添加表头 - sb.Append("Measurement Info Name"); - sb.Append(","); - sb.Append("Measurement Info"); - sb.AppendLine(); - sb.Append("Date_Time"); - sb.Append(","); - sb.Append(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")); - sb.AppendLine(); - for (int i = 2; i < listCSVTitleInfo.Count-1; i++) - { - if (listCSVTitleInfo[i].Contains("prodnum")) - { - listCSVTitleInfo[i] = listCSVTitleInfo[i].Replace("prodnum,", "Part_ident,"+ DateTime.Now.ToString("yyyyMMdd")); - } - - sb.Append(listCSVTitleInfo[i]); - sb.AppendLine(); - } - sb.AppendLine(); - sb.AppendLine(); - sb.AppendLine(); - sb.AppendLine(); - sb.AppendLine(); - //添加测量数据 - sb.Append("Characteristic"); - sb.Append(","); - sb.Append("Extension"); - sb.Append(","); - sb.Append("Measured_Value"); - sb.AppendLine(); - foreach (DataRow row in dtCSVContent.Rows) - { - sb.Append(row.ItemArray[2]); - sb.Append(","); - sb.Append(row.ItemArray[3]); - sb.Append(","); - sb.Append(row.ItemArray[7]); - sb.AppendLine(); - } - sb.AppendLine(); - // 将数据写入CSV文件 - File.WriteAllText(filePath, sb.ToString()); - MyBase.TraceWriteLine("客户自检报告生成完毕,路径为:" + filePath); - - #endregion 解析完报告后,重新生成客户模板报告 - } - else - { - MyBase.TraceWriteLine("iCreateReportFlag=0 : 数据生成报告功能未启用!"); - } - } - } - } - } - catch (Exception ex) - { - MyBase.TraceWriteLine("AnalysisNextSenseSelfMeasureCSV 函数分析异常:" + ex.ToString()); - } - } - #endregion 解析Nextsense CSV文件功能 - - #region Home Page - - /// - /// 设置DataGridView各行变色 - /// - /// DataGridView - public void SetdgvRowBgColor(DataGridView dgv) - { - if (dgv.Rows.Count > 0) - { - foreach (DataGridViewRow item in dgv.Rows) - { - if (item.Index % 2 == 0) - { - item.DefaultCellStyle.BackColor = Color.FromArgb(19, 46, 53); - } - else - { - item.DefaultCellStyle.BackColor = Color.FromArgb(27, 60, 68); - } - } - } - } - - //TODO: - - #endregion Home Page - - #region Search Data - - #region datagridview分页功能 - - /// - /// LoadPage方法 - /// - private void LoadPage() - { - if (currentPage < 1) currentPage = 1; - if (currentPage > pageCount) currentPage = pageCount; - - int beginRecord; //开始指针 - int endRecord; //结束指针 - DataTable dtTemp; - dtTemp = PageTable.Clone();//Clone方法只会复制DataTable的结构(列定义),而不会复制数据行的引用。 - - beginRecord = pageSize * (currentPage - 1); - if (currentPage == 1) beginRecord = 0; - endRecord = pageSize * currentPage; - - if (currentPage == pageCount) endRecord = recordCount; - for (int i = beginRecord; i < endRecord; i++) - { - // 使用ImportRow方法将源PageTable的行导入到目标dtTemp - dtTemp.ImportRow(PageTable.Rows[i]); - } - - dgvSelectMeasureData.Rows.Clear(); - - for (int i = 0; i < dtTemp.Rows.Count; i++) - { - dgvSelectMeasureData.Rows.Add(new object[] { dtTemp.Rows[i][0], dtTemp.Rows[i][1], dtTemp.Rows[i][2], dtTemp.Rows[i][3], dtTemp.Rows[i][4], dtTemp.Rows[i][5], dtTemp.Rows[i][6], dtTemp.Rows[i][7], dtTemp.Rows[i][8] }); - } - SetdgvRowBgColor(dgvSelectMeasureData); - for (int i = 0; i < dgvSelectMeasureData.Rows.Count; i++) - { - string strResult = dgvSelectMeasureData.Rows[i].Cells["MeasureItemResult"].Value.ToString(); - if (strResult.ToLower().Contains("ng")) - { - //dgvSelectMeasureData.Rows[i].Cells["MeasureItemResult"].Style.ForeColor = Color.Orange; - dgvSelectMeasureData.Rows[i].DefaultCellStyle.BackColor = Color.Orange; - } - if (strResult.ToLower().Contains("rej")) - { - dgvSelectMeasureData.Rows[i].Cells["MeasureItemResult"].Style.ForeColor = Color.Red; - } - } - labCurrentPage.Text = "当前页:" + currentPage.ToString(); //当前页 - labSumPages.Text = "共 " + pageCount.ToString() + " 页";//总页数 - labSumRecorders.Text = "总共 " + recordCount.ToString() + " 条记录";//总记录数 - } - - private void rbtnFirtstPage_Click(object sender, EventArgs e) - { - if (currentPage == 1) - { return; } - currentPage = 1; - LoadPage(); - } - - private void rbtnPrevPage_Click(object sender, EventArgs e) - { - if (currentPage == 1) - { return; } - currentPage--; - LoadPage(); - } - - private void rbtnNextPage_Click(object sender, EventArgs e) - { - if (currentPage == pageCount) - { return; } - currentPage++; - LoadPage(); - } - - private void rbtnLastPage_Click(object sender, EventArgs e) - { - if (currentPage == pageCount) - { return; } - currentPage = pageCount; - LoadPage(); - } - - private void rddlPageRecorderCount_SelectedIndexChanged(object sender, Telerik.WinControls.UI.Data.PositionChangedEventArgs e) - { - pageSize = int.Parse(rddlPageRecorderCount.Text.Trim()); - //PageSorter(); - } - - #endregion datagridview分页功能 - - private void rbtnSearchMeaserData_Click(object sender, EventArgs e) - { - dgvFPYResult.Visible = false; - chartFPYLine.Visible = false; - rbtnExportCSVReport.Visible = false; - string strStartTime = rdtpStartTime.Value.ToString("yyyy-MM-dd") + " 00:00:00"; - string strEndTime = rdtpEndTime.Value.ToString("yyyy-MM-dd") + " 23:59:59"; - string strCarID = rtbPartID.Text.Trim(); - PageTable.Clear(); - PageTable = tmdal.SelectTMeasureDataByCarIDAndTime(strCarID, strStartTime, strEndTime); - if (PageTable.Rows.Count > 0) - { - recordCount = PageTable.Rows.Count; //记录总行数 - pageCount = (recordCount / pageSize); - if ((recordCount % pageSize) > 0) - { - pageCount++; - } - - //默认第一页 - currentPage = 1; - - LoadPage();//调用加载数据的方法 - dgvSelectMeasureData.Visible = true; - rbtnExportCSVReport.Visible = true; - pnlPage.Visible = true; - labSearchResult.Visible = false; - pnlPage.Visible = true; - } - else - { - dgvSelectMeasureData.Visible = false; - labSearchResult.Visible = true; - rbtnExportCSVReport.Visible = false; - pnlPage.Visible = false; - } - } - - private void rbtSelectFPY_Click(object sender, EventArgs e) - { - dgvSelectMeasureData.Visible = false; - rbtnExportCSVReport.Visible = false; - pnlPage.Visible = false; - string strStartTime = rdtpStartTime.Value.ToString("yyyy-MM-dd") + " 00:00:00"; - string strEndTime = rdtpEndTime.Value.ToString("yyyy-MM-dd") + " 23:59:59"; - string strCarID = rtbPartID.Text.Trim(); - DataTable dtFPY = new DataTable(); - dtFPY = tmdal.SelectTMeasureResultByTime(strCarID, strStartTime, strEndTime); - if (dtFPY.Rows.Count > 0) - { - dgvFPYResult.Visible = true; - labSearchResult.Visible = false; - rbtnExportCSVReport.Visible = true; - chartFPYLine.Visible = true; - dgvFPYResult.DataSource = dtFPY; - SetdgvRowBgColor(dgvFPYResult); - for (int i = 0; i < dgvFPYResult.Rows.Count; i++) - { - if (dgvFPYResult.Rows[i].Cells["SMResult"].Value.ToString().ToLower().Contains("不合格")) - { - dgvFPYResult.Rows[i].Cells["SMResult"].Style.ForeColor = Color.Red; - } - } - - #region 合格率折线图 - - //合格率折线图 - string[] strXDate = new string[dtFPY.Rows.Count]; - double[] dFPYResult = new double[dtFPY.Rows.Count]; - for (int i = 0; i < dtFPY.Rows.Count; i++) - { - strXDate[i] = dtFPY.Rows[i]["CarID"].ToString(); - } - for (int i = 0; i < dtFPY.Rows.Count; i++) - { - double dResult = double.Parse(dtFPY.Rows[i]["FPY"].ToString()); - dFPYResult[i] = dResult * 100.00; - } - chartFPYLine.ChartAreas[0].AxisX.LabelStyle.Angle = -50; //X轴标签倾斜角度设置 - chartFPYLine.ChartAreas[0].AxisY.LabelStyle.Format = "{0:F2}" + "%"; //设置Y轴值的格式化 带% - chartFPYLine.Series[0].Label = "#VAL%"; //设置显示Y的值 - chartFPYLine.Series[0].LabelForeColor = Color.White; - chartFPYLine.Series[0].ToolTip = "车身编号 : #VALX \r\n合格率 : #VAL%"; //鼠标移动到对应点显示数值 - chartFPYLine.Series[0].Points.DataBindXY(strXDate, dFPYResult); - - #endregion 合格率折线图 - } - else - { - dgvFPYResult.Visible = false; - labSearchResult.Visible = true; - rbtnExportCSVReport.Visible = false; - chartFPYLine.Visible = false; - } - } - - public static void ExportdgvDataToCsv(DataGridView dataGridView, string filePath) - { - StringBuilder sb = new StringBuilder(); - - // 添加列标题 - foreach (DataGridViewColumn column in dataGridView.Columns) - { - sb.Append(column.HeaderText); - sb.Append(","); - } - sb.Remove(sb.Length - 1, 1); - sb.AppendLine(); - - // 添加行数据 - foreach (DataGridViewRow row in dataGridView.Rows) - { - foreach (DataGridViewCell cell in row.Cells) - { - sb.Append(cell.Value); - sb.Append(","); - } - sb.Remove(sb.Length - 1, 1); - sb.AppendLine(); - } - - // 将数据写入CSV文件 - File.WriteAllText(filePath, sb.ToString()); - } - - public static void ExportDataTableDataToCsv(DataTable dt, string filePath) - { - StringBuilder sb = new StringBuilder(); - - // 添加列标题 - foreach (DataColumn column in dt.Columns) - { - sb.Append(column.ColumnName); - sb.Append(","); - } - sb.Remove(sb.Length - 1, 1); - sb.AppendLine(); - - // 添加行数据 - foreach (DataRow row in dt.Rows) - { - foreach (object item in row.ItemArray) - { - sb.Append(item); - sb.Append(","); - } - sb.Remove(sb.Length - 1, 1); - sb.AppendLine(); - } - - // 将数据写入CSV文件 - File.WriteAllText(filePath, sb.ToString()); - } - - private void rbtnExportCSVReport_Click(object sender, EventArgs e) - { - string strCSVExportPath = ""; - string strExportTime = DateTime.Now.ToString("yyyyMMddHHmmssfff"); - FolderBrowserDialog m_Folder = new FolderBrowserDialog(); - m_Folder.Description = "请选择要导出的CSV文件的路径"; - m_Folder.RootFolder = Environment.SpecialFolder.Desktop; - if (dgvFPYResult.Visible == true && dgvFPYResult.Rows.Count > 0) - { - m_Folder.ShowDialog(); - if (Directory.Exists(m_Folder.SelectedPath)) - { - strCSVExportPath = m_Folder.SelectedPath + "\\合格率" + strExportTime + ".CSV"; - ExportdgvDataToCsv(dgvFPYResult, strCSVExportPath); - } - } - if (dgvSelectMeasureData.Visible == true && dgvSelectMeasureData.Rows.Count > 0) - { - m_Folder.ShowDialog(); - if (Directory.Exists(m_Folder.SelectedPath)) - { - strCSVExportPath = m_Folder.SelectedPath + "\\车身尺寸数据" + strExportTime + ".CSV"; - ExportDataTableDataToCsv(PageTable, strCSVExportPath); - } - } - } - - private void dgvFPYResult_RowStateChanged(object sender, DataGridViewRowStateChangedEventArgs e) - { - e.Row.HeaderCell.Value = string.Format("{0}", e.Row.Index + 1); - } - - private void dgvSelectMeasureData_RowStateChanged(object sender, DataGridViewRowStateChangedEventArgs e) - { - e.Row.HeaderCell.Value = string.Format("{0}", e.Row.Index + 1); - } - - #endregion Search Data - - #region CP CPK - - private void rbtnSearchCPCPK_Click(object sender, EventArgs e) - { - DataTable dtCPCPK = new DataTable(); - string strMeasureName = rddlMeasurePoint.Text; - string strSizeName = rddlSizeName.Text.Trim().Substring(0, 1); - int iLimitCount = (int)nudMeasureCount.Value; - dtCPCPK = tmdal.SelectMeasureValuebyMeasureNameAndSize(strMeasureName, strSizeName, iLimitCount); - int iSelectRows = dtCPCPK.Rows.Count; - if (iSelectRows < 5) - { - chartCPCPK.Visible = false; - labSearchCPCPKResult.Visible = true; - pnlCPCPK.Visible = false; - } - else - { - double dNormalValue = double.Parse(dtCPCPK.Rows[0]["NormalValue"].ToString()); - double dLowerTolValue = double.Parse(dtCPCPK.Rows[0]["LowerTolVal"].ToString()); - double dUpperTolValue = double.Parse(dtCPCPK.Rows[0]["UpperTolVal"].ToString()); - double dLSL = dNormalValue + dLowerTolValue; - double dUSL = dNormalValue + dUpperTolValue; - - List listMDoubleData = new List(); - List listMStrData = new List(); - listMStrData.Clear(); - listMDoubleData.Clear(); - for (int i = 0; i < iSelectRows; i++) - { - listMDoubleData.Add(double.Parse(dtCPCPK.Rows[i]["MeasureValue"].ToString())); - listMStrData.Add(dtCPCPK.Rows[i]["MeasureValue"].ToString()); - } - - #region 数据赋值 - - labLSL.Text = dLSL.ToString("F2"); - labUSL.Text = dUSL.ToString("F2"); - labTarget.Text = dNormalValue.ToString("F2"); - labSampleSize.Text = iSelectRows.ToString(); - labAverage.Text = CpCpkHelper.GetAverage(listMStrData).ToString("F4"); - labStdDev.Text = CpCpkHelper.GetSigma(listMStrData).ToString("F4"); - List listCpCpk = CpCpkHelper.GetCpList(listMStrData, dUSL, dLSL); - labCp.Text = listCpCpk[0].ToString("F4"); - labCpl.Text = listCpCpk[1].ToString("F4"); - labCpu.Text = listCpCpk[2].ToString("F4"); - labCpk.Text = listCpCpk[3].ToString("F4"); - List listPpPpk = CpCpkHelper.GetPpList(listMStrData, dUSL, dLSL); - labPp.Text = listPpPpk[0].ToString("F4"); - labPpl.Text = listPpPpk[1].ToString("F4"); - labPpu.Text = listPpPpk[2].ToString("F4"); - labPpk.Text = listPpPpk[3].ToString("F4"); - - #endregion 数据赋值 - - #region 画柱状图 - - Dictionary histogramDataDic = new Dictionary(); - histogramDataDic = CpCpkHelper.GetHistogramData(listMDoubleData); - string[] strXValue = new string[histogramDataDic.Count]; - int[] dYValue = new int[histogramDataDic.Count]; - for (int i = 0; i <= histogramDataDic.Count - 1; i++) - { - strXValue[i] = (histogramDataDic.ElementAt(i).Key); - dYValue[i] = int.Parse(histogramDataDic.ElementAt(i).Value); - } - chartCPCPK.Series[0].Label = "#VAL"; //设置显示Y的值 - chartCPCPK.Series[0].LabelForeColor = Color.White; - chartCPCPK.Series[0].ToolTip = "区间范围 : #VALX \r\n数量 : #VAL"; //鼠标移动到对应点显示数值 - chartCPCPK.Series[0].Points.DataBindXY(strXValue, dYValue); - - #endregion 画柱状图 - - chartCPCPK.Visible = true; - labSearchCPCPKResult.Visible = false; - pnlCPCPK.Visible = true; - } - } - - #endregion CP CPK - - #region 软件设置 - - private void lpcSoftwareSetup_Click(object sender, EventArgs e) - { - string strInputPwd = MyBase.InputBox("密码", "请输入密码 : ", "", "确定", "取消"); - if (strInputPwd.Contains("-999.999")) - { - return; - } - else if (strInputPwd == ConfigDfn.strPwd) - { - FSoftwareSetup fss = new FSoftwareSetup(); - fss.ShowDialog(this); - } - else - { - MessageBox.Show("密码错误! ", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); - } - } - - private void lpcToleranceSetup_Click(object sender, EventArgs e) - { - string strInputPwd = MyBase.InputBox("密码", "请输入密码 : ", "", "确定", "取消"); - if (strInputPwd.Contains("-999.999")) - { - return; - } - else if (strInputPwd == ConfigDfn.strPwd) - { - FToleranceSetup fts = new FToleranceSetup(); - fts.ShowDialog(this); - } - else - { - MessageBox.Show("密码错误! ", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); - } - } - - private void lpcRange_Click(object sender, EventArgs e) - { - string strInputPwd = MyBase.InputBox("密码", "请输入密码 : ", "", "确定", "取消"); - if (strInputPwd.Contains("-999.999")) - { - return; - } - else if (strInputPwd == ConfigDfn.strPwd) - { - FRangeSetup frs = new FRangeSetup(); - frs.ShowDialog(this); - } - else - { - MessageBox.Show("密码错误! ", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); - } - } - - private void lpcPLCAddress_Click(object sender, EventArgs e) - { - string strInputPwd = MyBase.InputBox("密码", "请输入密码 : ", "", "确定", "取消"); - if (strInputPwd.Contains("-999.999")) - { - return; - } - else if (strInputPwd == ConfigDfn.strPwd) - { - PlcAddrSetup PLCAS = new PlcAddrSetup(3, ConfigDfn.strConfigFile); - PLCAS.Show(); - } - else - { - MessageBox.Show("密码错误! ", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); - } - } - - private void lpcPLCTest_Click(object sender, EventArgs e) - { - FormDebugSiemensS7 FDS7 = new FormDebugSiemensS7(SiemensPLCS.S1200); - FDS7.Show(); - } - - private void lpcAboutSoftware_Click(object sender, EventArgs e) - { - AboutSoftwareInfo asi = new AboutSoftwareInfo(); - asi.ShowDialog(); - } - - private void lpcShowLog_Click(object sender, EventArgs e) - { - System.Diagnostics.Process.Start("notepad.exe", LogDebugDfn.strDebugFile); - } - - #endregion 软件设置 - - #region RadButton鼠标事件 - - private void btn_MouseHover(object sender, EventArgs e) - { - RadButton btn = sender as RadButton; - btn.BackColor = Color.FromArgb(0, 151, 186); - } - - private void btn_MouseLeave(object sender, EventArgs e) - { - RadButton btn = sender as RadButton; - btn.BackColor = Color.FromArgb(19, 46, 53); - } - - #endregion RadButton鼠标事件 - - #region PLC相关函数 - - #region PLC重连操作 - - private void tmrReadPLCData_Tick(object sender, EventArgs e) - { - tmrReadPLCData.Stop(); - - #region 判断PLC是否正常运行 - - if (ConfigPlc.PlcType == 3 && ConfigPlc.bReConnect && !HslSiemensS7Obj.bConnected) - { - MyBase.TraceWriteLine("PLC断开,重连!"); - tmrHeartBeatConnect.Stop(); - ReConnectPLC(); - return; - } - - byte[] m_Datas = null; - if (!HslSiemensS7Obj.ReadDatas(PlcAddrSetup.S7ReadStartAddr, (ushort)PlcAddrSetup.S7ReadByteCount, ref m_Datas)) - { - tmrReadPLCData.Start(); - return; - } - if (m_Datas == null) - { - tmrReadPLCData.Start(); - MyBase.TraceWriteLine("PLC读取数据对象为空,退出!"); - return; - } - - #endregion 判断PLC是否正常运行 - - try - { - #region 循环读取PLC数据块中的信息 - - if (m_Datas.Length >= PlcAddrSetup.S7ReadByteCount) - { - PLCDfn.bPlcLiveTick = PlcObject.GetS7ByteData(PlcSignalDfn.PlcLive) == 1; - PLCDfn.ReadVINFinishFlag = PlcObject.GetS7ByteData(PlcSignalDfn.ReadVINFinishFlag); - //从PLC获取VIN码后,通过访问IOT接口 获取汽车类型,再反馈给PLC - if (iLastReadVINFinishFlag == 0 && PLCDfn.ReadVINFinishFlag == 10) - { - string strCarID = PlcObject.GetS7StringData(PlcSignalDfn.PartID); - //PLCDfn.CarType = PlcObject.GetS7ByteData(PlcSignalDfn.CarType); - MyBase.TraceWriteLine("PLC读码完成信号:0->10;Read PLC VIN is: " + strCarID); - if (strCarID.Length > 10) - { - string strCarColor = ""; - string strCarType = GetCarTypeByIOTAPI(strCarID, out strCarColor); - if (!strCarType.ToUpper().Contains("ERR")) - { - if (strCarType.ToUpper().Contains("EH3")) - { - PlcObject.InsertWriteQueue(PlcSignalDfn.WCarType, (byte)1); - } - else - { - PlcObject.InsertWriteQueue(PlcSignalDfn.WCarType, (byte)2); - } - PlcObject.InsertWriteQueue(PlcSignalDfn.WCarColor, strCarColor); - MyBase.TraceWriteLine("往PLC写入车型: " + strCarType + " ;车身颜色:" + strCarColor); - tmdal.InsertVIN(strCarID); - MyBase.TraceWriteLine(strCarID + " 插入到数据库表TTempSaveVIN中完成。"); - } - else - { - MyBase.TraceWriteLine("报错:根据VIN从IOT上获取车型信息失败,不发送给PLC车型信息和颜色信息。 "); - } - } - } - PLCDfn.CarPassFlag = PlcObject.GetS7ByteData(PlcSignalDfn.CarPassFlag); - if (iLastCarPassFlag == 0 && PLCDfn.CarPassFlag == 10) - { - string strCarID = PlcObject.GetS7StringData(PlcSignalDfn.PartID); - MyBase.TraceWriteLine("读取PLC CarPassFlag 完成信号:0->10;Read PLC VIN is: " + strCarID); - string strSecondPosCarID = tmdal.SelectMaintenanceStationVINbyStationNo(2); - if (strSecondPosCarID.Length == 21) - { - string strTempCarID = strSecondPosCarID.Substring(0, 17); - string strTempCarType = strSecondPosCarID.Substring(18, 3); - if (tmdal.CheckMRVINExistOrNotByVIN(strTempCarID) == 0) - { - string strTargetRate = Math.Round(ConfigDfn.dFPY2 * 100.00d, 2).ToString("F2") + "%"; - - MyBase.TraceWriteLine(strSecondPosCarID + " ;该VIN码只扫码没有测量,没有测量结果,上传IOT NG消息。"); - string strPostData = "{\"serno\":\"" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + "\",\"requestData\":[{\"vin\":\"" + strTempCarID + "\",\"model\":\"" + strTempCarType + "\",\"equipmentNo\":\"" + ConfigDfn.strEquipNo + "\",\"equipmentName\":\"" + ConfigDfn.strEquipName + "\",\"calibrationResult\":\"NG\",\"detectionTime\":\"" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\",\"targetRate\":\"" + strTargetRate + "\",\"rate\":\"0.00%\",\"GapList\":[]}]}"; - MyBase.TraceWriteLine("Update NG To IOT Data Content: " + strPostData); - string strPostResult = PostJsonToIOT(ConfigDfn.strIOTAddress, strPostData, 10000); - MyBase.TraceWriteLine("NG数据上传IOT完成,结果返回为:" + strPostResult); - } - } - - if (!string.IsNullOrEmpty(strCarID) && strCarID.Length > 10) - { - tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(6), 7); - Thread.Sleep(20); - tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(5), 6); - Thread.Sleep(20); - tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(4), 5); - Thread.Sleep(20); - tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(3), 4); - Thread.Sleep(20); - tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(2), 3); - Thread.Sleep(20); - tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(1), 2); - Thread.Sleep(20); - string strCarColor = ""; - string strCarType = GetCarTypeByIOTAPI(strCarID, out strCarColor); - if (!strCarType.ToUpper().Contains("ERR")) - { - if (strCarType.ToUpper().Contains("EH3")) - { - strCarID = strCarID + "_EH3"; - } - else - { - strCarID = strCarID + "_EHY"; - } - } - tmdal.updateMaintenceInfo(strCarID, 1); - MyBase.TraceWriteLine("CarPassFlag 0->10 更新到MaintenceInfo数据库位置1中的VIN为: " + strCarID); - } - else - { - tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(6), 7); - Thread.Sleep(20); - tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(5), 6); - Thread.Sleep(20); - tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(4), 5); - Thread.Sleep(20); - tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(3), 4); - Thread.Sleep(20); - tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(2), 3); - Thread.Sleep(20); - tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(1), 2); - Thread.Sleep(20); - tmdal.updateMaintenceInfo("empty", 1); - MyBase.TraceWriteLine("CarPassFlag 0->10 更新到MaintenceInfo数据库位置1中的VIN为:empty "); - } - - } - if (ConfigDfn.iRecordEncoderFlag == 1) - { - double dSpeed1 = PlcObject.GetS7Double(PlcSignalDfn.Speed1); - double dSpeed2 = PlcObject.GetS7Double(PlcSignalDfn.Speed2); - double dR01 = PlcObject.GetS7Double(PlcSignalDfn.R01_Pules); - double dR02 = PlcObject.GetS7Double(PlcSignalDfn.R02_Pules); - NLogger.Fatal(dSpeed1 + "," + dSpeed2 + "," + dR01 + "," + dR02); - } - } - iLastCarPassFlag = PLCDfn.CarPassFlag; - iLastReadVINFinishFlag = PLCDfn.ReadVINFinishFlag; - #endregion 循环读取PLC数据块中的信息 - } - catch (Exception ex) - { - MyBase.TraceWriteLine("tmrReadPLCData_Tick exception: " + ex.ToString()); - } - - - tmrReadPLCData.Start(); - } - - private void tmrRefreshPLCStatus_Tick(object sender, EventArgs e) - { - if (labelTimeStatus_Tip.Text == "─") { labelTimeStatus_Tip.Text = "╲"; } - else if (labelTimeStatus_Tip.Text == "╲") { labelTimeStatus_Tip.Text = "│"; } - else if (labelTimeStatus_Tip.Text == "│") { labelTimeStatus_Tip.Text = "╱"; } - else if (labelTimeStatus_Tip.Text == "╱") { labelTimeStatus_Tip.Text = "─"; } - - lampPLCHeart.State = PLCDfn.bPlcLiveTick ? LampColor.Green : LampColor.Silver; - rlePLCHeart.ForeColor = PLCDfn.bPlcLiveTick ? Color.Lime : Color.White; - } - - private void tmrHeartBeatConnect_Tick(object sender, EventArgs e) - { - if (bPlcLiveTickLast != PLCDfn.bPlcLiveTick) - { - HeartBeatCount = 0; - } - else - { - HeartBeatCount++; - } - - if (HeartBeatCount >= 600) - { - HeartBeatCount = 0; - if (!bStopPlcNormal) - { - MyBase.TraceWriteLine("PLC心跳检测10分钟内未变化,断开PLC,进行PLC重连!"); - PlcObject.ClosePlc(); - } - } - bPlcLiveTickLast = PLCDfn.bPlcLiveTick; - } - - private void tmrWritePLCLive_Tick(object sender, EventArgs e) - { - bTickt = !bTickt; - PlcObject.InsertWriteQueue(PlcSignalDfn.SoftLive, Convert.ToByte(bTickt ? 1 : 0)); - } - - private void ReConnectPLC() - { - m_ThreadReconnectPLC = null; - m_ThreadReconnectPLC = new Thread(new ThreadStart(ReConnectPlcProcess)); - if (!m_ThreadReconnectPLC.IsAlive) - { - m_ThreadReconnectPLC.Start(); - } - } - - private void ReConnectPlcProcess() - { - while (!PlcObject.IsPlcConnected()) - { - bool bConnectResult = PlcObject.ConnectPlc(); - if (!bConnectResult) - { - m_ReConnectNum++; - MyBase.TraceWriteLine("重连PLC,第" + m_ReConnectNum + "次!"); - } - Thread.Sleep(1000); - } - MyBase.TraceWriteLine("重新连接PLC成功!"); - lampConnectPLCStatus.State = LampColor.Green; - rlePLCStatus.ForeColor = Color.Lime; - this.BeginInvoke((EventHandler)delegate - { - tmrHeartBeatConnect.Start(); - }); - bStopPlcNormal = false; - m_ReConnectNum = 0; - this.Invoke((EventHandler)(delegate - { - tmrReadPLCData.Start(); - tmrWritePLCLive.Start();//启动给PLC写入心跳 1s写一次 0 1 - tmrRefreshPLCStatus.Start();//刷新PLC等的状态 - })); - m_ThreadReconnectPLC.Abort(); - } - - #endregion PLC重连操作 - - private void ConnectThread() - { - MyBase.TraceWriteLine("连接PLC...."); - - bool bConnectResult = PlcObject.ConnectPlc(); - this.Invoke((EventHandler)(delegate - { - if (bConnectResult) - { - lampConnectPLCStatus.State = LampColor.Green; - rlePLCStatus.ForeColor = Color.Lime; - MyBase.TraceWriteLine("连接PLC成功"); - } - else - { - lampConnectPLCStatus.State = LampColor.Red; - rlePLCStatus.ForeColor = Color.Red; - tmrReadPLCData.Stop(); - MyBase.TraceWriteLine("连接PLC失败"); - return; - } - - tmrReadPLCData.Start(); //读取PLC数据信息 - tmrWritePLCLive.Start();//启动给PLC写入心跳 1s写一次 0 1 - tmrRefreshPLCStatus.Start();//刷新PLC等的状态 - if (ConfigPlc.bReConnect) - tmrHeartBeatConnect.Start(); //监测来自plc的心跳5分钟内没有变化,重新连接PLC - })); - } - - private void btnConnectPlc_Click(object sender, EventArgs e) - { - try - { - PlcObject.InitWritePlcThread(); - bStopPlcNormal = false; - Thread m_Thread = new Thread(ConnectThread); - m_Thread.Start(); - return; - } - catch (Exception ex) - { - MessageBox.Show(ex.Message, "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning); - } - } - - private void btnClosePlc_Click(object sender, EventArgs e) - { - try - { - MyBase.TraceWriteLine("点击了断开PLC按钮,断开PLC!"); - tmrReadPLCData.Stop(); - tmrHeartBeatConnect.Stop(); - tmrWritePLCLive.Stop(); - tmrRefreshPLCStatus.Stop(); - lampConnectPLCStatus.State = LampColor.White; - rlePLCStatus.ForeColor = Color.White; - rlePLCHeart.ForeColor = Color.White; - lampPLCHeart.State = LampColor.White; - bStopPlcNormal = true; - PlcObject.ClosePlc(); - } - catch (Exception ex) - { - MessageBox.Show(ex.Message, "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning); - } - } - - #endregion PLC相关函数 - - private void lpcUploadIOTTest_Click(object sender, EventArgs e) - { - string strPostData = "{\"serno\":\"" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + "\",\"requestData\":[{\"vin\":\"test001\",\"model\":\"EHY\",\"equipmentNo\":\"" + ConfigDfn.strEquipNo + "\",\"equipmentName\":\"" + ConfigDfn.strEquipName + "\",\"calibrationResult\":\"OK\",\"detectionTime\":\"" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\",\"GapList\":[{\"vin\":\"test001\",\"gfNo\":\"F\",\"pointNumber\":\"L-01\",\"actualValue\":\"-0.30\",\"controlLine\":\"-1.00/1.00\",\"measurementResult\":\"OK\"}]}]}"; - MyBase.TraceWriteLine("Test Post Data: " + strPostData); - string strPostResult = PostJsonToIOT(ConfigDfn.strIOTAddress, strPostData, 10000); - MessageBox.Show("测试上传数据完成,获取到的返回值为: " + strPostResult, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); - MyBase.TraceWriteLine("测试上传数据完成,获取到的返回值为: " + strPostResult); - } - private void lpcTestGetCarTye_Click(object sender, EventArgs e) - { - string strPostData = "{\"serno\":\"312314141\",\"vin\":\"LNNAJDDU9RDA00213\"}"; - MyBase.TraceWriteLine("Test Post Data: " + strPostData); - string strPostResult = PostJsonToIOT(ConfigDfn.strIOTCarTypeAddress, strPostData, 10000); - MessageBox.Show("测试从IOT获取车型信息完成,获取到的返回值为: " + strPostResult, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); - MyBase.TraceWriteLine("测试从IOT获取车型信息完成,获取到的原返回值为: " + strPostResult); - string strNewResult = strPostResult.Substring(1, strPostResult.Length - 2).Replace("]", ""); - MessageBox.Show("测试从IOT获取车型信息完成,处理后 获取到的返回值为: " + strNewResult, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); - MyBase.TraceWriteLine("测试从IOT获取车型信息完成,处理后 获取到的返回值为: " + strNewResult); - CheryCarTypeInfo ccti = new CheryCarTypeInfo(); - ccti = JsonConvert.DeserializeObject(strNewResult); - MessageBox.Show("测试从IOT获取车型信息完成,获取到的返回值为: " + strNewResult + "; 解析出的车型:" + ccti.data.model + " ;解析出的物料号为" + ccti.data.material + " ;解析出颜色编号:" + ccti.data.material.Substring(7, 2), "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); - } - private string GetCarTypeByIOTAPI(string strVIN, out string strMaterialNo) - { - string strPostData = "{\"serno\":\"" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + "\",\"vin\":\"" + strVIN + "\"}"; - MyBase.TraceWriteLine(" Post VIN Data: " + strPostData); - string strPostResult = PostJsonToIOT(ConfigDfn.strIOTCarTypeAddress, strPostData, 5000); - MyBase.TraceWriteLine("GetCarTypeByIOTAPI IOT Return CarType Infomation : " + strPostResult); - string strNewResult = strPostResult.Substring(1, strPostResult.Length - 2).Replace("]", ""); - MyBase.TraceWriteLine("GetCarTypeByIOTAPI IOT Return New CarType Infomation : " + strNewResult); - CheryCarTypeInfo ccti = new CheryCarTypeInfo(); - ccti = JsonConvert.DeserializeObject(strNewResult); - if (ccti.message.Contains("成功")) - { - - if (ccti.data.material != null && ccti.data.material.Length > 9) - { - strMaterialNo = ccti.data.material.Substring(7, 2); - MyBase.TraceWriteLine(" IOT Return CarType Infomation : " + strNewResult + "; 解析出的车型:" + ccti.data.model + "解析出车颜色编号:" + strMaterialNo); - } - else - { - strMaterialNo = "TE"; - MyBase.TraceWriteLine(" IOT Return CarType Infomation : " + strNewResult + "; 解析出的车型:" + ccti.data.model + ";未解析出车颜色编号"); - } - return ccti.data.model; - } - else - { - MyBase.TraceWriteLine(" IOT Return CarType Infomation ERROR : " + strPostResult); - strMaterialNo = "ER"; - return "ERR"; - } - } - - private void lpcShowCarData_Click(object sender, EventArgs e) - { - if (ConfigDfn.strShowCarLR == "L") - { - if (ConfigDfn.strCarModel.ToUpper().Contains("EH3")) - { - fLEH3.Show(); - fLEHY.Show(); - fLEHY.Hide(); - } - else - { - fLEH3.Show(); - fLEH3.Hide(); - fLEHY.Show(); - } - } - else - { - if (ConfigDfn.strCarModel.ToUpper().Contains("EH3")) - { - fREH3.Show(); - fREHY.Show(); - fREHY.Hide(); - } - else - { - fREH3.Show(); - fREH3.Hide(); - fREHY.Show(); - } - } - } - public void ShowCarMeasureDataByCarType(int iCarType) - { - if (ConfigDfn.strShowCarLR == "L") - { - if (iCarType == 1) - { - fLEH3.Show(); - fLEHY.Show(); - fLEHY.Hide(); - MyBase.TraceWriteLine("显示左侧EH3车身数据界面。"); - } - else - { - fLEH3.Show(); - fLEH3.Hide(); - fLEHY.Show(); - MyBase.TraceWriteLine("显示左侧EHY车身数据界面。"); - } - } - else - { - if (iCarType == 1) - { - fREH3.Show(); - fREHY.Show(); - fREHY.Hide(); - MyBase.TraceWriteLine("显示右侧EH3车身数据界面。"); - } - else - { - fREH3.Show(); - fREH3.Hide(); - fREHY.Show(); - MyBase.TraceWriteLine("显示右侧EHY车身数据界面。"); - } - } - } - private void rbtnTestCOM_Click(object sender, EventArgs e) - { - if (rbtnTestCOM.Text == "打开串口") - { - serialTestPort = new SerialPort(rtbPort.Text.Trim(), 115200, Parity.None, 8, StopBits.One); // 设置串口参数 - serialTestPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); // 注册数据接收事件处理方法 - serialTestPort.Open(); // 打开串口 - if (serialTestPort.IsOpen) - { - rbtnTestCOM.Text = "关闭串口"; - } - } - else - { - serialTestPort.DataReceived -= new SerialDataReceivedEventHandler(DataReceivedHandler); - serialTestPort.Close(); - serialTestPort.Dispose(); - rbtnTestCOM.Text = "打开串口"; - } - } - - private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) - { - SerialPort sp = (SerialPort)sender; - string indata = sp.ReadExisting(); - MyBase.TraceWriteLine(indata); - rtbCOMContent.Text = indata; - } - - private void tmrMonitorDBToCreateReport_Tick(object sender, EventArgs e) - { - tmrMonitorDBToCreateReport.Stop(); - int iCurrentMeasureCount = tmdal.SelectTMeasureResultCount(); - if (iCurrentMeasureCount > iLastMesureCount && (iCurrentMeasureCount == (iLastMesureCount + 1))) - { - MyBase.TraceWriteLine("监控数据库,开始生成ipn文件:"); - DataTable dtMeaResult = tmdal.SelectNewestTMeasureResult(); - string strVIN = dtMeaResult.Rows[0]["CarID"].ToString(); - DateTime dateMeaDate = Convert.ToDateTime(dtMeaResult.Rows[0]["Remark"].ToString()); - DataTable dtMeaContent = tmdal.SelectTMeasureDataByVIN(strVIN); - string strCarType = dtMeaContent.Rows[0][2].ToString(); - int iMeaCount = dtMeaContent.Rows.Count; - - #region 解析完报告后,重新生成客户模板报告 - - string filePath = ""; - if (strCarType.ToLower().Contains("tava")) - { - filePath = ConfigDfn.strReportPath + "\\" + strCarType + "_" + strVIN + "_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".ipn"; - } - else - { - filePath = ConfigDfn.strReportPath2 + "\\" + strCarType + "_" + strVIN + "_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".ipn"; - } - - StringBuilder sb = new StringBuilder(); - - #region 添加表头 - - sb.Append("GAUGE ID"); - sb.Append("\t"); - sb.Append("JSN"); - sb.Append("\t"); - sb.Append("MO"); - sb.Append("\t"); - sb.Append("DAY"); - sb.Append("\t"); - sb.Append("YR"); - sb.Append("\t"); - sb.Append("HR"); - sb.Append("\t"); - sb.Append("MIN"); - sb.Append("\t"); - sb.Append("SEC"); - sb.Append("\t"); - sb.Append("MODEL"); - sb.Append("\t"); - sb.Append("AuxID1"); - sb.Append("\t"); - sb.Append("AuxID2"); - sb.Append("\t"); - sb.Append("QUAL"); - sb.Append("\t"); - sb.Append("SHIFT"); - sb.Append("\t"); - sb.Append("DATA TYPE"); - sb.Append("\t"); - sb.Append("FIXTURE"); - sb.Append("\t"); - for (int i = 0; i < iMeaCount / 2; i++) - { - string strMeaPointName = dtMeaContent.Rows[i * 2]["MeasPointName"].ToString(); - string strMPF = strMeaPointName + " Flush"; - string strMPG = strMeaPointName + " Gap"; - sb.Append("D " + strMPF); - sb.Append("\t"); - sb.Append("D " + strMPG); - sb.Append("\t"); - - sb.Append("B " + strMPF); - sb.Append("\t"); - sb.Append("B " + strMPG); - sb.Append("\t"); - - sb.Append("A " + strMPF); - sb.Append("\t"); - sb.Append("A " + strMPG); - sb.Append("\t"); - - sb.Append("US " + strMPF); - sb.Append("\t"); - sb.Append("LS " + strMPF); - sb.Append("\t"); - sb.Append("US " + strMPG); - sb.Append("\t"); - sb.Append("LS " + strMPG); - sb.Append("\t"); - - sb.Append("UR " + strMPF); - sb.Append("\t"); - sb.Append("LR " + strMPF); - sb.Append("\t"); - sb.Append("UR " + strMPG); - sb.Append("\t"); - sb.Append("LR " + strMPG); - sb.Append("\t"); - - sb.Append("UT " + strMPF); - sb.Append("\t"); - sb.Append("LT " + strMPF); - sb.Append("\t"); - sb.Append("UT " + strMPG); - sb.Append("\t"); - sb.Append("LT " + strMPG); - sb.Append("\t"); - } - - #endregion 添加表头 - - sb.AppendLine(); - - #region 添加内容 - - sb.Append(ConfigDfn.strStationName); - sb.Append("\t"); - sb.Append(strVIN); - sb.Append("\t"); - sb.Append(dateMeaDate.Month.ToString()); - sb.Append("\t"); - sb.Append(dateMeaDate.Day.ToString()); - sb.Append("\t"); - sb.Append(dateMeaDate.Year.ToString().Substring(2)); - sb.Append("\t"); - sb.Append(dateMeaDate.Hour.ToString()); - sb.Append("\t"); - sb.Append(dateMeaDate.Minute.ToString()); - sb.Append("\t"); - sb.Append(dateMeaDate.Second.ToString()); - sb.Append("\t"); - if (strCarType.ToLower().Contains("tava")) - sb.Append(ConfigDfn.strUploadPath); - else - { - sb.Append(ConfigDfn.strUploadPath2); - } - sb.Append("\t"); - sb.Append("Unknow"); - sb.Append("\t"); - sb.Append("Unknow"); - sb.Append("\t"); - sb.Append("2"); - sb.Append("\t"); - sb.Append(""); - sb.Append("\t"); - sb.Append("AUTO"); - sb.Append("\t"); - sb.Append("NONE"); - sb.Append("\t"); - - double dDevFVal = 0; - double dDevGVal = 0; - - double dMeaFVal = 0; - double dMeaGVal = 0; - - double dNorFVal = 0; - double dNorGVal = 0; - - double dFUpper = 0; - double dFLower = 0; - double dGUpper = 0; - double dGLower = 0; - - double dFUpper2 = 0; - double dFLower2 = 0; - double dGUpper2 = 0; - double dGLower2 = 0; - - double dFUpper3 = 0; - double dFLower3 = 0; - double dGUpper3 = 0; - double dGLower3 = 0; - for (int i = 0; i < iMeaCount / 2; i++) - { - string strMeasureFValue = dtMeaContent.Rows[i * 2]["MeasureValue"].ToString(); - string strMeasureGValue = dtMeaContent.Rows[i * 2 + 1]["MeasureValue"].ToString(); - string strNormalFValue = dtMeaContent.Rows[i * 2]["NormalValue"].ToString(); - string strNormalGValue = dtMeaContent.Rows[i * 2 + 1]["NormalValue"].ToString(); - - dNorFVal = double.Parse(strNormalFValue); - dNorGVal = double.Parse(strNormalGValue); - dFUpper = double.Parse(dtMeaContent.Rows[i * 2]["UpperTolVal"].ToString()); - dFLower = double.Parse(dtMeaContent.Rows[i * 2]["LowerTolVal"].ToString()); - dGUpper = double.Parse(dtMeaContent.Rows[i * 2 + 1]["UpperTolVal"].ToString()); - dGLower = double.Parse(dtMeaContent.Rows[i * 2 + 1]["LowerTolVal"].ToString()); - - dFUpper2 = dFUpper * ConfigDfn.dLevel2; - dFLower2 = dFLower * ConfigDfn.dLevel2; - dGUpper2 = dGUpper * ConfigDfn.dLevel2; - dGLower2 = dGLower * ConfigDfn.dLevel2; - - dFUpper3 = dFUpper * ConfigDfn.dLevel3; - dFLower3 = dFLower * ConfigDfn.dLevel3; - dGUpper3 = dGUpper * ConfigDfn.dLevel3; - dGLower3 = dGLower * ConfigDfn.dLevel3; - - if (strMeasureFValue.Contains("inv")) - { - sb.Append("inv"); - sb.Append("\t"); - } - else - { - dMeaFVal = double.Parse(strMeasureFValue); - dDevFVal = dMeaFVal - dNorFVal; - sb.Append(dDevFVal.ToString("F3")); - sb.Append("\t"); - } - if (strMeasureGValue.Contains("inv")) - { - sb.Append("inv"); - sb.Append("\t"); - } - else - { - dMeaGVal = double.Parse(strMeasureGValue); - dDevGVal = dMeaGVal - dNorGVal; - sb.Append(dDevGVal.ToString("F3")); - sb.Append("\t"); - } - - sb.Append(strNormalFValue); - sb.Append("\t"); - sb.Append(strNormalGValue); - sb.Append("\t"); - - sb.Append(strMeasureFValue); - sb.Append("\t"); - sb.Append(strMeasureGValue); - sb.Append("\t"); - - sb.Append(dFUpper.ToString("F3")); - sb.Append("\t"); - sb.Append(dFLower.ToString("F3")); - sb.Append("\t"); - sb.Append(dGUpper.ToString("F3")); - sb.Append("\t"); - sb.Append(dGLower.ToString("F3")); - sb.Append("\t"); - - sb.Append(dFUpper2.ToString("F3")); - sb.Append("\t"); - sb.Append(dFLower2.ToString("F3")); - sb.Append("\t"); - sb.Append(dGUpper2.ToString("F3")); - sb.Append("\t"); - sb.Append(dGLower2.ToString("F3")); - sb.Append("\t"); - - sb.Append(dFUpper3.ToString("F3")); - sb.Append("\t"); - sb.Append(dFLower3.ToString("F3")); - sb.Append("\t"); - sb.Append(dGUpper3.ToString("F3")); - sb.Append("\t"); - sb.Append(dGLower3.ToString("F3")); - sb.Append("\t"); - } - - #endregion 添加内容 - - // 将数据写入CSV文件 - File.WriteAllText(filePath, sb.ToString()); - MyBase.TraceWriteLine("客户定制ipn报告生成完毕,路径为:" + filePath); - - #endregion 解析完报告后,重新生成客户模板报告 - } - iLastMesureCount = iCurrentMeasureCount; - tmrMonitorDBToCreateReport.Start(); - } - - - } - - public class CheryIOTData - { - /// VIN号 - public string vin { get; set; } - - /// FG - public string gfNo { get; set; } - - /// 测点编号 - public string pointNumber { get; set; } - - /// 实测值 - public string actualValue { get; set; } - - /// 控制线 - public string controlLine { get; set; } - - /// 测量结果 - public string measurementResult { get; set; } - } - public class CarInfoData - { - public string material { get; set; } - public string model { get; set; } - } - public class CheryCarTypeInfo - { - /// data - public CarInfoData data { get; set; } - - /// message - public string message { get; set; } - - /// serno - public string serno { get; set; } - - /// success - public string success { get; set; } - - } - - public static class JsonHelper - { - /// - /// 对象转成JSON 格式字符串 - /// - /// 对象 - /// JSON格式的字符串 - public static string ObjectToJson(object obj) - { - return JsonConvert.SerializeObject(obj); - } - - /// - /// 解析JSON字符串生成对象实体 - /// - /// 对象类型 - /// json字符串 - /// 对象实体 - public static T DeserializeJsonToObject(string json) where T : class - { - Newtonsoft.Json.JsonSerializer serializer = new Newtonsoft.Json.JsonSerializer(); - StringReader sr = new StringReader(json); - object o = serializer.Deserialize(new JsonTextReader(sr), typeof(T)); - T t = o as T; - return t; - } - - /// - /// 解析JSON数组生成对象实体集合 - /// - /// 对象类型 - /// json数组字符串(eg.[{"ID":"112","Name":"石子儿"}]) - /// 对象实体集合 - public static List DeserializeJsonToList(string json) where T : class - { - Newtonsoft.Json.JsonSerializer serializer = new JsonSerializer(); - StringReader sr = new StringReader(json); - object o = serializer.Deserialize(new JsonTextReader(sr), typeof(List)); - List list = o as List; - return list; - } - - /// - /// 数据表转键值对集合 - /// 把DataTable转成 List集合, 存每一行 - /// 集合中放的是键值对字典,存每一列 - /// - /// 数据表 - /// 哈希表数组 - public static List> DataTableToList(DataTable dt) - { - List> list = new List>(); - - foreach (DataRow dr in dt.Rows) - { - Dictionary dic = new Dictionary(); - foreach (DataColumn dc in dt.Columns) - { - dic.Add(dc.ColumnName, dr[dc.ColumnName]); - } - list.Add(dic); - } - return list; - } - - /// - /// 数据集转键值对数组字典 - /// - /// 键值对数组字典 - public static Dictionary>> DataSetToDic(DataSet ds) - { - Dictionary>> result = new Dictionary>>(); - - foreach (DataTable dt in ds.Tables) - result.Add(dt.TableName, DataTableToList(dt)); - - return result; - } - - /// - /// 数据表转JSON - /// - /// 数据表 - /// JSON字符串 - public static string DataTableToJson(DataTable dt) - { - return ObjectToJson(DataTableToList(dt)); - } - - /// - /// JSON文本转对象,泛型方法 常用 - /// - /// 类型 - /// JSON文本 - /// 指定类型的对象 - public static T JsonToObject(string jsonText) - { - return JsonConvert.DeserializeObject(jsonText); - } - - /// - /// 将JSON文本转换为数据表数据 - /// - /// JSON文本 - /// 数据表字典 - public static Dictionary>> TablesDataFromJson(string jsonText) - { - return JsonToObject>>>(jsonText); - } - - /// - /// 将JSON文本转换成数据行 - /// - /// JSON文本 - /// 数据行的字典 - public static Dictionary DataRowFromJson(string jsonText) - { - return JsonToObject>(jsonText); - } - } + { + double dMax = dMeasureData.Max(); + double dMin = dMeasureData.Min(); + double dRangeData = dMax - dMin; + strRangeValue = dRangeData.ToString("F1"); + if (dRangeData >= Convert.ToDouble(dtRange.Rows[i]["RangeLower"]) && dRangeData <= Convert.ToDouble(dtRange.Rows[i]["RangeUpper"])) + { + strRangeResult = "OK"; + } + else + { + strRangeResult = "NG"; + } + } + strRangeLowUpp = dtRange.Rows[i]["RangeLower"].ToString() + @"/" + dtRange.Rows[i]["RangeUpper"].ToString(); + dtRangeData.Rows.Add(strVIN, dtRange.Rows[i]["RangeName"].ToString(), strRangeValue, strRangeLowUpp, strRangeResult, dtTime, strRemark); + } + tmdal.InsertTRangeDatabyDataTable(dtRangeData); + MyBase.TraceWriteLine(strVIN + " " + strCarType + "计算极差完成,并插入数据库:============"); + } + } + + public string PostJsonToIOT(string url, string jsonData, int? timeout = null) + { + try + { + HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url); + + if (null != timeout && 0 != timeout) + { + req.Timeout = timeout.Value; + } + Encoding encoding = Encoding.UTF8; + byte[] bs = Encoding.UTF8.GetBytes(jsonData); + string responseData; + req.Method = "POST"; + req.ContentType = "application/json"; + req.ContentLength = bs.Length; + using (Stream reqStream = req.GetRequestStream()) + { + reqStream.Write(bs, 0, bs.Length); + reqStream.Close(); + } + using (HttpWebResponse response = (HttpWebResponse)req.GetResponse()) + { + using (StreamReader reader = new StreamReader(response.GetResponseStream(), encoding)) + { + responseData = reader.ReadToEnd(); + } + } + return responseData; + } + catch (Exception ex) + { + return "Error: " + ex.ToString(); + } + } + + /// 通过给定的文件流,判断文件的编码类型 + /// 文件流 + /// 文件的编码类型 + public static Encoding GetType(FileStream fs) + { + byte[] Unicode = new byte[] { 0xFF, 0xFE, 0x41 }; + byte[] UnicodeBIG = new byte[] { 0xFE, 0xFF, 0x00 }; + byte[] UTF8 = new byte[] { 0xEF, 0xBB, 0xBF }; //带BOM + System.Text.Encoding reVal = System.Text.Encoding.Default; + + System.IO.BinaryReader r = new System.IO.BinaryReader(fs, System.Text.Encoding.Default); + int i; + int.TryParse(fs.Length.ToString(), out i); + byte[] ss = r.ReadBytes(i); + if (IsUTF8Bytes(ss) || (ss[0] == 0xEF && ss[1] == 0xBB && ss[2] == 0xBF)) + { + reVal = System.Text.Encoding.UTF8; + } + else if (ss[0] == 0xFE && ss[1] == 0xFF && ss[2] == 0x00) + { + reVal = System.Text.Encoding.BigEndianUnicode; + } + else if (ss[0] == 0xFF && ss[1] == 0xFE && ss[2] == 0x41) + { + reVal = System.Text.Encoding.Unicode; + } + r.Close(); + return reVal; + } + + /// 判断是否是不带 BOM 的 UTF8 格式 + /// + /// + private static bool IsUTF8Bytes(byte[] data) + { + int charByteCounter = 1; //计算当前正分析的字符应还有的字节数 + byte curByte; //当前分析的字节. + for (int i = 0; i < data.Length; i++) + { + curByte = data[i]; + if (charByteCounter == 1) + { + if (curByte >= 0x80) + { + //判断当前 + while (((curByte <<= 1) & 0x80) != 0) + { + charByteCounter++; + } + //标记位首位若为非0 则至少以2个1开始 如:110XXXXX...........1111110X  + if (charByteCounter == 1 || charByteCounter > 6) + { + return false; + } + } + } + else + { + //若是UTF-8 此时第一位必须为1 + if ((curByte & 0xC0) != 0x80) + { + return false; + } + charByteCounter--; + } + } + if (charByteCounter > 1) + { + throw new Exception("非预期的byte格式"); + } + return true; + } + + public Encoding GetType(string FileName) + { + FileStream fs = new FileStream(FileName, FileMode.Open, FileAccess.Read); + Encoding er = GetType(fs); + fs.Close(); + return er; + } + + private void testIotUpload() + { + // 修复极差 计算问题 + //LNNBBDEC7SDF49695 + //string strVIN = "LNNBBDEC5SDF49694"; + // string strCarType = "EHY"; + //CalculateRange(strVIN, strCarType); + + //修复IOt上传问题 + string strCarID = "LNNBDDEF4SDF49707"; + DataTable dtAllRangeDate = tmdal.SelectRangeDatabyCarID(strCarID); + string strTargetRate = "97.00%"; + UploadIOTData(strCarID, dtAllRangeDate, strTargetRate); + } + + #endregion 解析Nextsense CSV文件功能 + + #region Home Page + + /// + /// 设置DataGridView各行变色 + /// + /// DataGridView + public void SetdgvRowBgColor(DataGridView dgv) + { + if (dgv.Rows.Count > 0) + { + foreach (DataGridViewRow item in dgv.Rows) + { + if (item.Index % 2 == 0) + { + item.DefaultCellStyle.BackColor = Color.FromArgb(19, 46, 53); + } + else + { + item.DefaultCellStyle.BackColor = Color.FromArgb(27, 60, 68); + } + } + } + } + + //TODO: + + #endregion Home Page + + #region Search Data + + #region datagridview分页功能 + + /// + /// LoadPage方法 + /// + private void LoadPage() + { + if (currentPage < 1) currentPage = 1; + if (currentPage > pageCount) currentPage = pageCount; + + int beginRecord; //开始指针 + int endRecord; //结束指针 + DataTable dtTemp; + dtTemp = PageTable.Clone();//Clone方法只会复制DataTable的结构(列定义),而不会复制数据行的引用。 + + beginRecord = pageSize * (currentPage - 1); + if (currentPage == 1) beginRecord = 0; + endRecord = pageSize * currentPage; + + if (currentPage == pageCount) endRecord = recordCount; + for (int i = beginRecord; i < endRecord; i++) + { + // 使用ImportRow方法将源PageTable的行导入到目标dtTemp + dtTemp.ImportRow(PageTable.Rows[i]); + } + + dgvSelectMeasureData.Rows.Clear(); + + for (int i = 0; i < dtTemp.Rows.Count; i++) + { + dgvSelectMeasureData.Rows.Add(new object[] { dtTemp.Rows[i][0], dtTemp.Rows[i][1], dtTemp.Rows[i][2], dtTemp.Rows[i][3], dtTemp.Rows[i][4], dtTemp.Rows[i][5], dtTemp.Rows[i][6], dtTemp.Rows[i][7], dtTemp.Rows[i][8] }); + } + SetdgvRowBgColor(dgvSelectMeasureData); + for (int i = 0; i < dgvSelectMeasureData.Rows.Count; i++) + { + string strResult = dgvSelectMeasureData.Rows[i].Cells["MeasureItemResult"].Value.ToString(); + if (strResult.ToLower().Contains("ng")) + { + //dgvSelectMeasureData.Rows[i].Cells["MeasureItemResult"].Style.ForeColor = Color.Orange; + dgvSelectMeasureData.Rows[i].DefaultCellStyle.BackColor = Color.Orange; + } + if (strResult.ToLower().Contains("rej")) + { + dgvSelectMeasureData.Rows[i].Cells["MeasureItemResult"].Style.ForeColor = Color.Red; + } + } + labCurrentPage.Text = "当前页:" + currentPage.ToString(); //当前页 + labSumPages.Text = "共 " + pageCount.ToString() + " 页";//总页数 + labSumRecorders.Text = "总共 " + recordCount.ToString() + " 条记录";//总记录数 + } + + private void rbtnFirtstPage_Click(object sender, EventArgs e) + { + if (currentPage == 1) + { return; } + currentPage = 1; + LoadPage(); + } + + private void rbtnPrevPage_Click(object sender, EventArgs e) + { + if (currentPage == 1) + { return; } + currentPage--; + LoadPage(); + } + + private void rbtnNextPage_Click(object sender, EventArgs e) + { + if (currentPage == pageCount) + { return; } + currentPage++; + LoadPage(); + } + + private void rbtnLastPage_Click(object sender, EventArgs e) + { + if (currentPage == pageCount) + { return; } + currentPage = pageCount; + LoadPage(); + } + + private void rddlPageRecorderCount_SelectedIndexChanged(object sender, Telerik.WinControls.UI.Data.PositionChangedEventArgs e) + { + pageSize = int.Parse(rddlPageRecorderCount.Text.Trim()); + //PageSorter(); + } + + #endregion datagridview分页功能 + + private void rbtnSearchMeaserData_Click(object sender, EventArgs e) + { + dgvFPYResult.Visible = false; + chartFPYLine.Visible = false; + rbtnExportCSVReport.Visible = false; + string strStartTime = rdtpStartTime.Value.ToString("yyyy-MM-dd") + " 00:00:00"; + string strEndTime = rdtpEndTime.Value.ToString("yyyy-MM-dd") + " 23:59:59"; + string strCarID = rtbPartID.Text.Trim(); + PageTable.Clear(); + PageTable = tmdal.SelectTMeasureDataByCarIDAndTime(strCarID, strStartTime, strEndTime); + if (PageTable.Rows.Count > 0) + { + recordCount = PageTable.Rows.Count; //记录总行数 + pageCount = (recordCount / pageSize); + if ((recordCount % pageSize) > 0) + { + pageCount++; + } + + //默认第一页 + currentPage = 1; + + LoadPage();//调用加载数据的方法 + dgvSelectMeasureData.Visible = true; + rbtnExportCSVReport.Visible = true; + pnlPage.Visible = true; + labSearchResult.Visible = false; + pnlPage.Visible = true; + } + else + { + dgvSelectMeasureData.Visible = false; + labSearchResult.Visible = true; + rbtnExportCSVReport.Visible = false; + pnlPage.Visible = false; + } + } + + private void rbtSelectFPY_Click(object sender, EventArgs e) + { + dgvSelectMeasureData.Visible = false; + rbtnExportCSVReport.Visible = false; + pnlPage.Visible = false; + string strStartTime = rdtpStartTime.Value.ToString("yyyy-MM-dd") + " 00:00:00"; + string strEndTime = rdtpEndTime.Value.ToString("yyyy-MM-dd") + " 23:59:59"; + string strCarID = rtbPartID.Text.Trim(); + DataTable dtFPY = new DataTable(); + dtFPY = tmdal.SelectTMeasureResultByTime(strCarID, strStartTime, strEndTime); + if (dtFPY.Rows.Count > 0) + { + dgvFPYResult.Visible = true; + labSearchResult.Visible = false; + rbtnExportCSVReport.Visible = true; + chartFPYLine.Visible = true; + dgvFPYResult.DataSource = dtFPY; + SetdgvRowBgColor(dgvFPYResult); + for (int i = 0; i < dgvFPYResult.Rows.Count; i++) + { + if (dgvFPYResult.Rows[i].Cells["SMResult"].Value.ToString().ToLower().Contains("不合格")) + { + dgvFPYResult.Rows[i].Cells["SMResult"].Style.ForeColor = Color.Red; + } + } + + #region 合格率折线图 + + //合格率折线图 + string[] strXDate = new string[dtFPY.Rows.Count]; + double[] dFPYResult = new double[dtFPY.Rows.Count]; + for (int i = 0; i < dtFPY.Rows.Count; i++) + { + strXDate[i] = dtFPY.Rows[i]["CarID"].ToString(); + } + for (int i = 0; i < dtFPY.Rows.Count; i++) + { + double dResult = double.Parse(dtFPY.Rows[i]["FPY"].ToString()); + dFPYResult[i] = dResult * 100.00; + } + chartFPYLine.ChartAreas[0].AxisX.LabelStyle.Angle = -50; //X轴标签倾斜角度设置 + chartFPYLine.ChartAreas[0].AxisY.LabelStyle.Format = "{0:F2}" + "%"; //设置Y轴值的格式化 带% + chartFPYLine.Series[0].Label = "#VAL%"; //设置显示Y的值 + chartFPYLine.Series[0].LabelForeColor = Color.White; + chartFPYLine.Series[0].ToolTip = "车身编号 : #VALX \r\n合格率 : #VAL%"; //鼠标移动到对应点显示数值 + chartFPYLine.Series[0].Points.DataBindXY(strXDate, dFPYResult); + + #endregion 合格率折线图 + } + else + { + dgvFPYResult.Visible = false; + labSearchResult.Visible = true; + rbtnExportCSVReport.Visible = false; + chartFPYLine.Visible = false; + } + } + + public static void ExportdgvDataToCsv(DataGridView dataGridView, string filePath) + { + StringBuilder sb = new StringBuilder(); + + // 添加列标题 + foreach (DataGridViewColumn column in dataGridView.Columns) + { + sb.Append(column.HeaderText); + sb.Append(","); + } + sb.Remove(sb.Length - 1, 1); + sb.AppendLine(); + + // 添加行数据 + foreach (DataGridViewRow row in dataGridView.Rows) + { + foreach (DataGridViewCell cell in row.Cells) + { + sb.Append(cell.Value); + sb.Append(","); + } + sb.Remove(sb.Length - 1, 1); + sb.AppendLine(); + } + + // 将数据写入CSV文件 + File.WriteAllText(filePath, sb.ToString()); + } + + public static void ExportDataTableDataToCsv(DataTable dt, string filePath) + { + StringBuilder sb = new StringBuilder(); + + // 添加列标题 + foreach (DataColumn column in dt.Columns) + { + sb.Append(column.ColumnName); + sb.Append(","); + } + sb.Remove(sb.Length - 1, 1); + sb.AppendLine(); + + // 添加行数据 + foreach (DataRow row in dt.Rows) + { + foreach (object item in row.ItemArray) + { + sb.Append(item); + sb.Append(","); + } + sb.Remove(sb.Length - 1, 1); + sb.AppendLine(); + } + + // 将数据写入CSV文件 + File.WriteAllText(filePath, sb.ToString()); + } + + private void rbtnExportCSVReport_Click(object sender, EventArgs e) + { + string strCSVExportPath = ""; + string strExportTime = DateTime.Now.ToString("yyyyMMddHHmmssfff"); + FolderBrowserDialog m_Folder = new FolderBrowserDialog(); + m_Folder.Description = "请选择要导出的CSV文件的路径"; + m_Folder.RootFolder = Environment.SpecialFolder.Desktop; + if (dgvFPYResult.Visible == true && dgvFPYResult.Rows.Count > 0) + { + m_Folder.ShowDialog(); + if (Directory.Exists(m_Folder.SelectedPath)) + { + strCSVExportPath = m_Folder.SelectedPath + "\\合格率" + strExportTime + ".CSV"; + ExportdgvDataToCsv(dgvFPYResult, strCSVExportPath); + } + } + if (dgvSelectMeasureData.Visible == true && dgvSelectMeasureData.Rows.Count > 0) + { + m_Folder.ShowDialog(); + if (Directory.Exists(m_Folder.SelectedPath)) + { + strCSVExportPath = m_Folder.SelectedPath + "\\车身尺寸数据" + strExportTime + ".CSV"; + ExportDataTableDataToCsv(PageTable, strCSVExportPath); + } + } + } + + private void dgvFPYResult_RowStateChanged(object sender, DataGridViewRowStateChangedEventArgs e) + { + e.Row.HeaderCell.Value = string.Format("{0}", e.Row.Index + 1); + } + + private void dgvSelectMeasureData_RowStateChanged(object sender, DataGridViewRowStateChangedEventArgs e) + { + e.Row.HeaderCell.Value = string.Format("{0}", e.Row.Index + 1); + } + + #endregion Search Data + + #region CP CPK + + private void rbtnSearchCPCPK_Click(object sender, EventArgs e) + { + DataTable dtCPCPK = new DataTable(); + string strMeasureName = rddlMeasurePoint.Text; + string strSizeName = rddlSizeName.Text.Trim().Substring(0, 1); + int iLimitCount = (int)nudMeasureCount.Value; + dtCPCPK = tmdal.SelectMeasureValuebyMeasureNameAndSize(strMeasureName, strSizeName, iLimitCount); + int iSelectRows = dtCPCPK.Rows.Count; + if (iSelectRows < 5) + { + chartCPCPK.Visible = false; + labSearchCPCPKResult.Visible = true; + pnlCPCPK.Visible = false; + } + else + { + double dNormalValue = double.Parse(dtCPCPK.Rows[0]["NormalValue"].ToString()); + double dLowerTolValue = double.Parse(dtCPCPK.Rows[0]["LowerTolVal"].ToString()); + double dUpperTolValue = double.Parse(dtCPCPK.Rows[0]["UpperTolVal"].ToString()); + double dLSL = dNormalValue + dLowerTolValue; + double dUSL = dNormalValue + dUpperTolValue; + + List listMDoubleData = new List(); + List listMStrData = new List(); + listMStrData.Clear(); + listMDoubleData.Clear(); + for (int i = 0; i < iSelectRows; i++) + { + listMDoubleData.Add(double.Parse(dtCPCPK.Rows[i]["MeasureValue"].ToString())); + listMStrData.Add(dtCPCPK.Rows[i]["MeasureValue"].ToString()); + } + + #region 数据赋值 + + labLSL.Text = dLSL.ToString("F2"); + labUSL.Text = dUSL.ToString("F2"); + labTarget.Text = dNormalValue.ToString("F2"); + labSampleSize.Text = iSelectRows.ToString(); + labAverage.Text = CpCpkHelper.GetAverage(listMStrData).ToString("F4"); + labStdDev.Text = CpCpkHelper.GetSigma(listMStrData).ToString("F4"); + List listCpCpk = CpCpkHelper.GetCpList(listMStrData, dUSL, dLSL); + labCp.Text = listCpCpk[0].ToString("F4"); + labCpl.Text = listCpCpk[1].ToString("F4"); + labCpu.Text = listCpCpk[2].ToString("F4"); + labCpk.Text = listCpCpk[3].ToString("F4"); + List listPpPpk = CpCpkHelper.GetPpList(listMStrData, dUSL, dLSL); + labPp.Text = listPpPpk[0].ToString("F4"); + labPpl.Text = listPpPpk[1].ToString("F4"); + labPpu.Text = listPpPpk[2].ToString("F4"); + labPpk.Text = listPpPpk[3].ToString("F4"); + + #endregion 数据赋值 + + #region 画柱状图 + + Dictionary histogramDataDic = new Dictionary(); + histogramDataDic = CpCpkHelper.GetHistogramData(listMDoubleData); + string[] strXValue = new string[histogramDataDic.Count]; + int[] dYValue = new int[histogramDataDic.Count]; + for (int i = 0; i <= histogramDataDic.Count - 1; i++) + { + strXValue[i] = (histogramDataDic.ElementAt(i).Key); + dYValue[i] = int.Parse(histogramDataDic.ElementAt(i).Value); + } + chartCPCPK.Series[0].Label = "#VAL"; //设置显示Y的值 + chartCPCPK.Series[0].LabelForeColor = Color.White; + chartCPCPK.Series[0].ToolTip = "区间范围 : #VALX \r\n数量 : #VAL"; //鼠标移动到对应点显示数值 + chartCPCPK.Series[0].Points.DataBindXY(strXValue, dYValue); + + #endregion 画柱状图 + + chartCPCPK.Visible = true; + labSearchCPCPKResult.Visible = false; + pnlCPCPK.Visible = true; + } + } + + #endregion CP CPK + + #region 软件设置 + + private void lpcSoftwareSetup_Click(object sender, EventArgs e) + { + string strInputPwd = MyBase.InputBox("密码", "请输入密码 : ", "", "确定", "取消"); + if (strInputPwd.Contains("-999.999")) + { + return; + } + else if (strInputPwd == ConfigDfn.strPwd) + { + FSoftwareSetup fss = new FSoftwareSetup(); + fss.ShowDialog(this); + } + else + { + MessageBox.Show("密码错误! ", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + + private void lpcToleranceSetup_Click(object sender, EventArgs e) + { + string strInputPwd = MyBase.InputBox("密码", "请输入密码 : ", "", "确定", "取消"); + if (strInputPwd.Contains("-999.999")) + { + return; + } + else if (strInputPwd == ConfigDfn.strPwd) + { + FToleranceSetup fts = new FToleranceSetup(); + fts.ShowDialog(this); + } + else + { + MessageBox.Show("密码错误! ", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + + private void lpcRange_Click(object sender, EventArgs e) + { + string strInputPwd = MyBase.InputBox("密码", "请输入密码 : ", "", "确定", "取消"); + if (strInputPwd.Contains("-999.999")) + { + return; + } + else if (strInputPwd == ConfigDfn.strPwd) + { + FRangeSetup frs = new FRangeSetup(); + frs.ShowDialog(this); + } + else + { + MessageBox.Show("密码错误! ", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + + private void lpcPLCAddress_Click(object sender, EventArgs e) + { + string strInputPwd = MyBase.InputBox("密码", "请输入密码 : ", "", "确定", "取消"); + if (strInputPwd.Contains("-999.999")) + { + return; + } + else if (strInputPwd == ConfigDfn.strPwd) + { + PlcAddrSetup PLCAS = new PlcAddrSetup(3, ConfigDfn.strConfigFile); + PLCAS.Show(); + } + else + { + MessageBox.Show("密码错误! ", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + + private void lpcPLCTest_Click(object sender, EventArgs e) + { + FormDebugSiemensS7 FDS7 = new FormDebugSiemensS7(SiemensPLCS.S1200); + FDS7.Show(); + } + + private void lpcAboutSoftware_Click(object sender, EventArgs e) + { + AboutSoftwareInfo asi = new AboutSoftwareInfo(); + asi.ShowDialog(); + } + + private void lpcShowLog_Click(object sender, EventArgs e) + { + System.Diagnostics.Process.Start("notepad.exe", LogDebugDfn.strDebugFile); + } + + #endregion 软件设置 + + #region RadButton鼠标事件 + + private void btn_MouseHover(object sender, EventArgs e) + { + RadButton btn = sender as RadButton; + btn.BackColor = Color.FromArgb(0, 151, 186); + } + + private void btn_MouseLeave(object sender, EventArgs e) + { + RadButton btn = sender as RadButton; + btn.BackColor = Color.FromArgb(19, 46, 53); + } + + #endregion RadButton鼠标事件 + + #region PLC相关函数 + + #region PLC重连操作 + + private void tmrReadPLCData_Tick(object sender, EventArgs e) + { + tmrReadPLCData.Stop(); + + #region 判断PLC是否正常运行 + + if (ConfigPlc.PlcType == 3 && ConfigPlc.bReConnect && !HslSiemensS7Obj.bConnected) + { + MyBase.TraceWriteLine("PLC断开,重连!"); + tmrHeartBeatConnect.Stop(); + ReConnectPLC(); + return; + } + + byte[] m_Datas = null; + if (!HslSiemensS7Obj.ReadDatas(PlcAddrSetup.S7ReadStartAddr, (ushort)PlcAddrSetup.S7ReadByteCount, ref m_Datas)) + { + tmrReadPLCData.Start(); + return; + } + if (m_Datas == null) + { + tmrReadPLCData.Start(); + MyBase.TraceWriteLine("PLC读取数据对象为空,退出!"); + return; + } + + #endregion 判断PLC是否正常运行 + + try + { + #region 循环读取PLC数据块中的信息 + + if (m_Datas.Length >= PlcAddrSetup.S7ReadByteCount) + { + PLCDfn.bPlcLiveTick = PlcObject.GetS7ByteData(PlcSignalDfn.PlcLive) == 1; + PLCDfn.ReadVINFinishFlag = PlcObject.GetS7ByteData(PlcSignalDfn.ReadVINFinishFlag); + //从PLC获取VIN码后,通过访问IOT接口 获取汽车类型,再反馈给PLC + if (iLastReadVINFinishFlag == 0 && PLCDfn.ReadVINFinishFlag == 10) + { + string strCarID = PlcObject.GetS7StringData(PlcSignalDfn.PartID); + //PLCDfn.CarType = PlcObject.GetS7ByteData(PlcSignalDfn.CarType); + MyBase.TraceWriteLine("PLC读码完成信号:0->10;Read PLC VIN is: " + strCarID); + if (strCarID.Length > 10) + { + string strCarColor = ""; + string strCarType = GetCarTypeByIOTAPI(strCarID, out strCarColor); + if (!strCarType.ToUpper().Contains("ERR")) + { + if (strCarType.ToUpper().Contains("EH3")) + { + PlcObject.InsertWriteQueue(PlcSignalDfn.WCarType, (byte)1); + } + else + { + PlcObject.InsertWriteQueue(PlcSignalDfn.WCarType, (byte)2); + } + PlcObject.InsertWriteQueue(PlcSignalDfn.WCarColor, strCarColor); + MyBase.TraceWriteLine("往PLC写入车型: " + strCarType + " ;车身颜色:" + strCarColor); + tmdal.InsertVIN(strCarID); + MyBase.TraceWriteLine(strCarID + " 插入到数据库表TTempSaveVIN中完成。"); + } + else + { + MyBase.TraceWriteLine("报错:根据VIN从IOT上获取车型信息失败,不发送给PLC车型信息和颜色信息。 "); + } + } + } + PLCDfn.CarPassFlag = PlcObject.GetS7ByteData(PlcSignalDfn.CarPassFlag); + if (iLastCarPassFlag == 0 && PLCDfn.CarPassFlag == 10) + { + string strCarID = PlcObject.GetS7StringData(PlcSignalDfn.PartID); + MyBase.TraceWriteLine("读取PLC CarPassFlag 完成信号:0->10;Read PLC VIN is: " + strCarID); + string strSecondPosCarID = tmdal.SelectMaintenanceStationVINbyStationNo(2); + if (strSecondPosCarID.Length == 21) + { + string strTempCarID = strSecondPosCarID.Substring(0, 17); + string strTempCarType = strSecondPosCarID.Substring(18, 3); + if (tmdal.CheckMRVINExistOrNotByVIN(strTempCarID) == 0) + { + string strTargetRate = Math.Round(ConfigDfn.dFPY2 * 100.00d, 2).ToString("F2") + "%"; + + MyBase.TraceWriteLine(strSecondPosCarID + " ;该VIN码只扫码没有测量,没有测量结果,上传IOT NG消息。"); + string strPostData = "{\"serno\":\"" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + "\",\"requestData\":[{\"vin\":\"" + strTempCarID + "\",\"model\":\"" + strTempCarType + "\",\"equipmentNo\":\"" + ConfigDfn.strEquipNo + "\",\"equipmentName\":\"" + ConfigDfn.strEquipName + "\",\"calibrationResult\":\"NG\",\"detectionTime\":\"" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\",\"targetRate\":\"" + strTargetRate + "\",\"rate\":\"0.00%\",\"GapList\":[]}]}"; + MyBase.TraceWriteLine("Update NG To IOT Data Content: " + strPostData); + string strPostResult = PostJsonToIOT(ConfigDfn.strIOTAddress, strPostData, 10000); + MyBase.TraceWriteLine("NG数据上传IOT完成,结果返回为:" + strPostResult); + } + } + + if (!string.IsNullOrEmpty(strCarID) && strCarID.Length > 10) + { + tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(6), 7); + Thread.Sleep(20); + tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(5), 6); + Thread.Sleep(20); + tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(4), 5); + Thread.Sleep(20); + tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(3), 4); + Thread.Sleep(20); + tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(2), 3); + Thread.Sleep(20); + tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(1), 2); + Thread.Sleep(20); + string strCarColor = ""; + string strCarType = GetCarTypeByIOTAPI(strCarID, out strCarColor); + if (!strCarType.ToUpper().Contains("ERR")) + { + if (strCarType.ToUpper().Contains("EH3")) + { + strCarID = strCarID + "_EH3"; + } + else + { + strCarID = strCarID + "_EHY"; + } + } + tmdal.updateMaintenceInfo(strCarID, 1); + MyBase.TraceWriteLine("CarPassFlag 0->10 更新到MaintenceInfo数据库位置1中的VIN为: " + strCarID); + } + else + { + tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(6), 7); + Thread.Sleep(20); + tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(5), 6); + Thread.Sleep(20); + tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(4), 5); + Thread.Sleep(20); + tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(3), 4); + Thread.Sleep(20); + tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(2), 3); + Thread.Sleep(20); + tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(1), 2); + Thread.Sleep(20); + tmdal.updateMaintenceInfo("empty", 1); + MyBase.TraceWriteLine("CarPassFlag 0->10 更新到MaintenceInfo数据库位置1中的VIN为:empty "); + } + } + if (ConfigDfn.iRecordEncoderFlag == 1) + { + double dSpeed1 = PlcObject.GetS7Double(PlcSignalDfn.Speed1); + double dSpeed2 = PlcObject.GetS7Double(PlcSignalDfn.Speed2); + double dR01 = PlcObject.GetS7Double(PlcSignalDfn.R01_Pules); + double dR02 = PlcObject.GetS7Double(PlcSignalDfn.R02_Pules); + NLogger.Fatal(dSpeed1 + "," + dSpeed2 + "," + dR01 + "," + dR02); + } + } + iLastCarPassFlag = PLCDfn.CarPassFlag; + iLastReadVINFinishFlag = PLCDfn.ReadVINFinishFlag; + #endregion 循环读取PLC数据块中的信息 + } + catch (Exception ex) + { + MyBase.TraceWriteLine("tmrReadPLCData_Tick exception: " + ex.ToString()); + } + + tmrReadPLCData.Start(); + } + + private void tmrRefreshPLCStatus_Tick(object sender, EventArgs e) + { + if (labelTimeStatus_Tip.Text == "─") { labelTimeStatus_Tip.Text = "╲"; } + else if (labelTimeStatus_Tip.Text == "╲") { labelTimeStatus_Tip.Text = "│"; } + else if (labelTimeStatus_Tip.Text == "│") { labelTimeStatus_Tip.Text = "╱"; } + else if (labelTimeStatus_Tip.Text == "╱") { labelTimeStatus_Tip.Text = "─"; } + + lampPLCHeart.State = PLCDfn.bPlcLiveTick ? LampColor.Green : LampColor.Silver; + rlePLCHeart.ForeColor = PLCDfn.bPlcLiveTick ? Color.Lime : Color.White; + } + + private void tmrHeartBeatConnect_Tick(object sender, EventArgs e) + { + if (bPlcLiveTickLast != PLCDfn.bPlcLiveTick) + { + HeartBeatCount = 0; + } + else + { + HeartBeatCount++; + } + + if (HeartBeatCount >= 600) + { + HeartBeatCount = 0; + if (!bStopPlcNormal) + { + MyBase.TraceWriteLine("PLC心跳检测10分钟内未变化,断开PLC,进行PLC重连!"); + PlcObject.ClosePlc(); + } + } + bPlcLiveTickLast = PLCDfn.bPlcLiveTick; + } + + private void tmrWritePLCLive_Tick(object sender, EventArgs e) + { + bTickt = !bTickt; + PlcObject.InsertWriteQueue(PlcSignalDfn.SoftLive, Convert.ToByte(bTickt ? 1 : 0)); + } + + private void ReConnectPLC() + { + m_ThreadReconnectPLC = null; + m_ThreadReconnectPLC = new Thread(new ThreadStart(ReConnectPlcProcess)); + if (!m_ThreadReconnectPLC.IsAlive) + { + m_ThreadReconnectPLC.Start(); + } + } + + private void ReConnectPlcProcess() + { + while (!PlcObject.IsPlcConnected()) + { + bool bConnectResult = PlcObject.ConnectPlc(); + if (!bConnectResult) + { + m_ReConnectNum++; + MyBase.TraceWriteLine("重连PLC,第" + m_ReConnectNum + "次!"); + } + Thread.Sleep(1000); + } + MyBase.TraceWriteLine("重新连接PLC成功!"); + lampConnectPLCStatus.State = LampColor.Green; + rlePLCStatus.ForeColor = Color.Lime; + this.BeginInvoke((EventHandler)delegate + { + tmrHeartBeatConnect.Start(); + }); + bStopPlcNormal = false; + m_ReConnectNum = 0; + this.Invoke((EventHandler)(delegate + { + tmrReadPLCData.Start(); + tmrWritePLCLive.Start();//启动给PLC写入心跳 1s写一次 0 1 + tmrRefreshPLCStatus.Start();//刷新PLC等的状态 + })); + m_ThreadReconnectPLC.Abort(); + } + + #endregion PLC重连操作 + + private void ConnectThread() + { + MyBase.TraceWriteLine("连接PLC...."); + + bool bConnectResult = PlcObject.ConnectPlc(); + this.Invoke((EventHandler)(delegate + { + if (bConnectResult) + { + lampConnectPLCStatus.State = LampColor.Green; + rlePLCStatus.ForeColor = Color.Lime; + MyBase.TraceWriteLine("连接PLC成功"); + } + else + { + lampConnectPLCStatus.State = LampColor.Red; + rlePLCStatus.ForeColor = Color.Red; + tmrReadPLCData.Stop(); + MyBase.TraceWriteLine("连接PLC失败"); + return; + } + + tmrReadPLCData.Start(); //读取PLC数据信息 + tmrWritePLCLive.Start();//启动给PLC写入心跳 1s写一次 0 1 + tmrRefreshPLCStatus.Start();//刷新PLC等的状态 + if (ConfigPlc.bReConnect) + tmrHeartBeatConnect.Start(); //监测来自plc的心跳5分钟内没有变化,重新连接PLC + })); + } + + private void btnConnectPlc_Click(object sender, EventArgs e) + { + try + { + PlcObject.InitWritePlcThread(); + bStopPlcNormal = false; + Thread m_Thread = new Thread(ConnectThread); + m_Thread.Start(); + return; + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + } + + private void btnClosePlc_Click(object sender, EventArgs e) + { + try + { + MyBase.TraceWriteLine("点击了断开PLC按钮,断开PLC!"); + tmrReadPLCData.Stop(); + tmrHeartBeatConnect.Stop(); + tmrWritePLCLive.Stop(); + tmrRefreshPLCStatus.Stop(); + lampConnectPLCStatus.State = LampColor.White; + rlePLCStatus.ForeColor = Color.White; + rlePLCHeart.ForeColor = Color.White; + lampPLCHeart.State = LampColor.White; + bStopPlcNormal = true; + PlcObject.ClosePlc(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + } + + #endregion PLC相关函数 + + private void lpcUploadIOTTest_Click(object sender, EventArgs e) + { + string strPostData = "{\"serno\":\"" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + "\",\"requestData\":[{\"vin\":\"test001\",\"model\":\"EHY\",\"equipmentNo\":\"" + ConfigDfn.strEquipNo + "\",\"equipmentName\":\"" + ConfigDfn.strEquipName + "\",\"calibrationResult\":\"OK\",\"detectionTime\":\"" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\",\"GapList\":[{\"vin\":\"test001\",\"gfNo\":\"F\",\"pointNumber\":\"L-01\",\"actualValue\":\"-0.30\",\"controlLine\":\"-1.00/1.00\",\"measurementResult\":\"OK\"}]}]}"; + MyBase.TraceWriteLine("Test Post Data: " + strPostData); + string strPostResult = PostJsonToIOT(ConfigDfn.strIOTAddress, strPostData, 10000); + MessageBox.Show("测试上传数据完成,获取到的返回值为: " + strPostResult, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); + MyBase.TraceWriteLine("测试上传数据完成,获取到的返回值为: " + strPostResult); + } + + private void lpcTestGetCarTye_Click(object sender, EventArgs e) + { + string strPostData = "{\"serno\":\"312314141\",\"vin\":\"LNNAJDDU9RDA00213\"}"; + MyBase.TraceWriteLine("Test Post Data: " + strPostData); + string strPostResult = PostJsonToIOT(ConfigDfn.strIOTCarTypeAddress, strPostData, 10000); + MessageBox.Show("测试从IOT获取车型信息完成,获取到的返回值为: " + strPostResult, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); + MyBase.TraceWriteLine("测试从IOT获取车型信息完成,获取到的原返回值为: " + strPostResult); + string strNewResult = strPostResult.Substring(1, strPostResult.Length - 2).Replace("]", ""); + MessageBox.Show("测试从IOT获取车型信息完成,处理后 获取到的返回值为: " + strNewResult, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); + MyBase.TraceWriteLine("测试从IOT获取车型信息完成,处理后 获取到的返回值为: " + strNewResult); + CheryCarTypeInfo ccti = new CheryCarTypeInfo(); + ccti = JsonConvert.DeserializeObject(strNewResult); + MessageBox.Show("测试从IOT获取车型信息完成,获取到的返回值为: " + strNewResult + "; 解析出的车型:" + ccti.data.model + " ;解析出的物料号为" + ccti.data.material + " ;解析出颜色编号:" + ccti.data.material.Substring(7, 2), "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + + private string GetCarTypeByIOTAPI(string strVIN, out string strMaterialNo) + { + string strPostData = "{\"serno\":\"" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + "\",\"vin\":\"" + strVIN + "\"}"; + MyBase.TraceWriteLine(" Post VIN Data: " + strPostData); + string strPostResult = PostJsonToIOT(ConfigDfn.strIOTCarTypeAddress, strPostData, 5000); + MyBase.TraceWriteLine("GetCarTypeByIOTAPI IOT Return CarType Infomation : " + strPostResult); + string strNewResult = strPostResult.Substring(1, strPostResult.Length - 2).Replace("]", ""); + MyBase.TraceWriteLine("GetCarTypeByIOTAPI IOT Return New CarType Infomation : " + strNewResult); + CheryCarTypeInfo ccti = new CheryCarTypeInfo(); + ccti = JsonConvert.DeserializeObject(strNewResult); + if (ccti.message.Contains("成功")) + { + if (ccti.data.material != null && ccti.data.material.Length > 9) + { + strMaterialNo = ccti.data.material.Substring(7, 2); + MyBase.TraceWriteLine(" IOT Return CarType Infomation : " + strNewResult + "; 解析出的车型:" + ccti.data.model + "解析出车颜色编号:" + strMaterialNo); + } + else + { + strMaterialNo = "TE"; + MyBase.TraceWriteLine(" IOT Return CarType Infomation : " + strNewResult + "; 解析出的车型:" + ccti.data.model + ";未解析出车颜色编号"); + } + return ccti.data.model; + } + else + { + MyBase.TraceWriteLine(" IOT Return CarType Infomation ERROR : " + strPostResult); + strMaterialNo = "ER"; + return "ERR"; + } + } + + private void lpcShowCarData_Click(object sender, EventArgs e) + { + if (ConfigDfn.strShowCarLR == "L") + { + if (ConfigDfn.strCarModel.ToUpper().Contains("EH3")) + { + fLEH3.Show(); + fLEHY.Show(); + fLEHY.Hide(); + } + else + { + fLEH3.Show(); + fLEH3.Hide(); + fLEHY.Show(); + } + } + else + { + if (ConfigDfn.strCarModel.ToUpper().Contains("EH3")) + { + fREH3.Show(); + fREHY.Show(); + fREHY.Hide(); + } + else + { + fREH3.Show(); + fREH3.Hide(); + fREHY.Show(); + } + } + } + + public void ShowCarMeasureDataByCarType(int iCarType) + { + if (ConfigDfn.strShowCarLR == "L") + { + if (iCarType == 1) + { + fLEH3.Show(); + fLEHY.Show(); + fLEHY.Hide(); + MyBase.TraceWriteLine("显示左侧EH3车身数据界面。"); + } + else + { + fLEH3.Show(); + fLEH3.Hide(); + fLEHY.Show(); + MyBase.TraceWriteLine("显示左侧EHY车身数据界面。"); + } + } + else + { + if (iCarType == 1) + { + fREH3.Show(); + fREHY.Show(); + fREHY.Hide(); + MyBase.TraceWriteLine("显示右侧EH3车身数据界面。"); + } + else + { + fREH3.Show(); + fREH3.Hide(); + fREHY.Show(); + MyBase.TraceWriteLine("显示右侧EHY车身数据界面。"); + } + } + } + + private void rbtnTestCOM_Click(object sender, EventArgs e) + { + if (rbtnTestCOM.Text == "打开串口") + { + serialTestPort = new SerialPort(rtbPort.Text.Trim(), 115200, Parity.None, 8, StopBits.One); // 设置串口参数 + serialTestPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); // 注册数据接收事件处理方法 + serialTestPort.Open(); // 打开串口 + if (serialTestPort.IsOpen) + { + rbtnTestCOM.Text = "关闭串口"; + } + } + else + { + serialTestPort.DataReceived -= new SerialDataReceivedEventHandler(DataReceivedHandler); + serialTestPort.Close(); + serialTestPort.Dispose(); + rbtnTestCOM.Text = "打开串口"; + } + } + + private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) + { + SerialPort sp = (SerialPort)sender; + string indata = sp.ReadExisting(); + MyBase.TraceWriteLine(indata); + rtbCOMContent.Text = indata; + } + + private void tmrMonitorDBToCreateReport_Tick(object sender, EventArgs e) + { + tmrMonitorDBToCreateReport.Stop(); + int iCurrentMeasureCount = tmdal.SelectTMeasureResultCount(); + if (iCurrentMeasureCount > iLastMesureCount && (iCurrentMeasureCount == (iLastMesureCount + 1))) + { + MyBase.TraceWriteLine("监控数据库,开始生成ipn文件:"); + DataTable dtMeaResult = tmdal.SelectNewestTMeasureResult(); + string strVIN = dtMeaResult.Rows[0]["CarID"].ToString(); + DateTime dateMeaDate = Convert.ToDateTime(dtMeaResult.Rows[0]["Remark"].ToString()); + DataTable dtMeaContent = tmdal.SelectTMeasureDataByVIN(strVIN); + string strCarType = dtMeaContent.Rows[0][2].ToString(); + int iMeaCount = dtMeaContent.Rows.Count; + + #region 解析完报告后,重新生成客户模板报告 + + string filePath = ""; + if (strCarType.ToLower().Contains("tava")) + { + filePath = ConfigDfn.strReportPath + "\\" + strCarType + "_" + strVIN + "_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".ipn"; + } + else + { + filePath = ConfigDfn.strReportPath2 + "\\" + strCarType + "_" + strVIN + "_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".ipn"; + } + + StringBuilder sb = new StringBuilder(); + + #region 添加表头 + + sb.Append("GAUGE ID"); + sb.Append("\t"); + sb.Append("JSN"); + sb.Append("\t"); + sb.Append("MO"); + sb.Append("\t"); + sb.Append("DAY"); + sb.Append("\t"); + sb.Append("YR"); + sb.Append("\t"); + sb.Append("HR"); + sb.Append("\t"); + sb.Append("MIN"); + sb.Append("\t"); + sb.Append("SEC"); + sb.Append("\t"); + sb.Append("MODEL"); + sb.Append("\t"); + sb.Append("AuxID1"); + sb.Append("\t"); + sb.Append("AuxID2"); + sb.Append("\t"); + sb.Append("QUAL"); + sb.Append("\t"); + sb.Append("SHIFT"); + sb.Append("\t"); + sb.Append("DATA TYPE"); + sb.Append("\t"); + sb.Append("FIXTURE"); + sb.Append("\t"); + for (int i = 0; i < iMeaCount / 2; i++) + { + string strMeaPointName = dtMeaContent.Rows[i * 2]["MeasPointName"].ToString(); + string strMPF = strMeaPointName + " Flush"; + string strMPG = strMeaPointName + " Gap"; + sb.Append("D " + strMPF); + sb.Append("\t"); + sb.Append("D " + strMPG); + sb.Append("\t"); + + sb.Append("B " + strMPF); + sb.Append("\t"); + sb.Append("B " + strMPG); + sb.Append("\t"); + + sb.Append("A " + strMPF); + sb.Append("\t"); + sb.Append("A " + strMPG); + sb.Append("\t"); + + sb.Append("US " + strMPF); + sb.Append("\t"); + sb.Append("LS " + strMPF); + sb.Append("\t"); + sb.Append("US " + strMPG); + sb.Append("\t"); + sb.Append("LS " + strMPG); + sb.Append("\t"); + + sb.Append("UR " + strMPF); + sb.Append("\t"); + sb.Append("LR " + strMPF); + sb.Append("\t"); + sb.Append("UR " + strMPG); + sb.Append("\t"); + sb.Append("LR " + strMPG); + sb.Append("\t"); + + sb.Append("UT " + strMPF); + sb.Append("\t"); + sb.Append("LT " + strMPF); + sb.Append("\t"); + sb.Append("UT " + strMPG); + sb.Append("\t"); + sb.Append("LT " + strMPG); + sb.Append("\t"); + } + + #endregion 添加表头 + + sb.AppendLine(); + + #region 添加内容 + + sb.Append(ConfigDfn.strStationName); + sb.Append("\t"); + sb.Append(strVIN); + sb.Append("\t"); + sb.Append(dateMeaDate.Month.ToString()); + sb.Append("\t"); + sb.Append(dateMeaDate.Day.ToString()); + sb.Append("\t"); + sb.Append(dateMeaDate.Year.ToString().Substring(2)); + sb.Append("\t"); + sb.Append(dateMeaDate.Hour.ToString()); + sb.Append("\t"); + sb.Append(dateMeaDate.Minute.ToString()); + sb.Append("\t"); + sb.Append(dateMeaDate.Second.ToString()); + sb.Append("\t"); + if (strCarType.ToLower().Contains("tava")) + sb.Append(ConfigDfn.strUploadPath); + else + { + sb.Append(ConfigDfn.strUploadPath2); + } + sb.Append("\t"); + sb.Append("Unknow"); + sb.Append("\t"); + sb.Append("Unknow"); + sb.Append("\t"); + sb.Append("2"); + sb.Append("\t"); + sb.Append(""); + sb.Append("\t"); + sb.Append("AUTO"); + sb.Append("\t"); + sb.Append("NONE"); + sb.Append("\t"); + + double dDevFVal = 0; + double dDevGVal = 0; + + double dMeaFVal = 0; + double dMeaGVal = 0; + + double dNorFVal = 0; + double dNorGVal = 0; + + double dFUpper = 0; + double dFLower = 0; + double dGUpper = 0; + double dGLower = 0; + + double dFUpper2 = 0; + double dFLower2 = 0; + double dGUpper2 = 0; + double dGLower2 = 0; + + double dFUpper3 = 0; + double dFLower3 = 0; + double dGUpper3 = 0; + double dGLower3 = 0; + for (int i = 0; i < iMeaCount / 2; i++) + { + string strMeasureFValue = dtMeaContent.Rows[i * 2]["MeasureValue"].ToString(); + string strMeasureGValue = dtMeaContent.Rows[i * 2 + 1]["MeasureValue"].ToString(); + string strNormalFValue = dtMeaContent.Rows[i * 2]["NormalValue"].ToString(); + string strNormalGValue = dtMeaContent.Rows[i * 2 + 1]["NormalValue"].ToString(); + + dNorFVal = double.Parse(strNormalFValue); + dNorGVal = double.Parse(strNormalGValue); + dFUpper = double.Parse(dtMeaContent.Rows[i * 2]["UpperTolVal"].ToString()); + dFLower = double.Parse(dtMeaContent.Rows[i * 2]["LowerTolVal"].ToString()); + dGUpper = double.Parse(dtMeaContent.Rows[i * 2 + 1]["UpperTolVal"].ToString()); + dGLower = double.Parse(dtMeaContent.Rows[i * 2 + 1]["LowerTolVal"].ToString()); + + dFUpper2 = dFUpper * ConfigDfn.dLevel2; + dFLower2 = dFLower * ConfigDfn.dLevel2; + dGUpper2 = dGUpper * ConfigDfn.dLevel2; + dGLower2 = dGLower * ConfigDfn.dLevel2; + + dFUpper3 = dFUpper * ConfigDfn.dLevel3; + dFLower3 = dFLower * ConfigDfn.dLevel3; + dGUpper3 = dGUpper * ConfigDfn.dLevel3; + dGLower3 = dGLower * ConfigDfn.dLevel3; + + if (strMeasureFValue.Contains("inv")) + { + sb.Append("inv"); + sb.Append("\t"); + } + else + { + dMeaFVal = double.Parse(strMeasureFValue); + dDevFVal = dMeaFVal - dNorFVal; + sb.Append(dDevFVal.ToString("F3")); + sb.Append("\t"); + } + if (strMeasureGValue.Contains("inv")) + { + sb.Append("inv"); + sb.Append("\t"); + } + else + { + dMeaGVal = double.Parse(strMeasureGValue); + dDevGVal = dMeaGVal - dNorGVal; + sb.Append(dDevGVal.ToString("F3")); + sb.Append("\t"); + } + + sb.Append(strNormalFValue); + sb.Append("\t"); + sb.Append(strNormalGValue); + sb.Append("\t"); + + sb.Append(strMeasureFValue); + sb.Append("\t"); + sb.Append(strMeasureGValue); + sb.Append("\t"); + + sb.Append(dFUpper.ToString("F3")); + sb.Append("\t"); + sb.Append(dFLower.ToString("F3")); + sb.Append("\t"); + sb.Append(dGUpper.ToString("F3")); + sb.Append("\t"); + sb.Append(dGLower.ToString("F3")); + sb.Append("\t"); + + sb.Append(dFUpper2.ToString("F3")); + sb.Append("\t"); + sb.Append(dFLower2.ToString("F3")); + sb.Append("\t"); + sb.Append(dGUpper2.ToString("F3")); + sb.Append("\t"); + sb.Append(dGLower2.ToString("F3")); + sb.Append("\t"); + + sb.Append(dFUpper3.ToString("F3")); + sb.Append("\t"); + sb.Append(dFLower3.ToString("F3")); + sb.Append("\t"); + sb.Append(dGUpper3.ToString("F3")); + sb.Append("\t"); + sb.Append(dGLower3.ToString("F3")); + sb.Append("\t"); + } + + #endregion 添加内容 + + // 将数据写入CSV文件 + File.WriteAllText(filePath, sb.ToString()); + MyBase.TraceWriteLine("客户定制ipn报告生成完毕,路径为:" + filePath); + + #endregion 解析完报告后,重新生成客户模板报告 + } + iLastMesureCount = iCurrentMeasureCount; + tmrMonitorDBToCreateReport.Start(); + } + + private void CenterControl_Shown(object sender, EventArgs e) + { + rddlSizeName.SelectedIndex = 0; + DataTable dtMPName = tmdal.SelectAllMeasPointName(); + if (dtMPName.Rows.Count > 0) + { + for (int i = 0; i < dtMPName.Rows.Count; i++) + { + rddlMeasurePoint.Items.Add(dtMPName.Rows[i][0].ToString()); + } + rddlMeasurePoint.SelectedIndex = 0; + } + } + + public static void AppendRecord(string id, string filePath) + { + try + { + // 如果文件不存在则创建并写入标题行 + if (!File.Exists(filePath)) + { + File.WriteAllText(filePath, "ID,RecordTime\n"); + } + + // 追加新记录(ID + 当前时间戳) + string record = $"{id},{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}\n"; + File.AppendAllText(filePath, record); + } + catch (Exception ex) + { + Console.WriteLine($"写入CSV失败: {ex.Message}"); + } + } + } + + public class CheryIOTData + { + /// + /// VIN号 + /// + public string vin { get; set; } + + /// + /// FG + /// + public string gfNo { get; set; } + + /// + /// 测点编号 + /// + public string pointNumber { get; set; } + + /// + /// 实测值 + /// + public string actualValue { get; set; } + + /// + /// 控制线 + /// + public string controlLine { get; set; } + + /// + /// 测量结果 + /// + public string measurementResult { get; set; } + } + + public class CarInfoData + { + public string material { get; set; } + public string model { get; set; } + } + + public class CheryCarTypeInfo + { + /// + /// data + /// + public CarInfoData data { get; set; } + + /// + /// message + /// + public string message { get; set; } + + /// + /// serno + /// + public string serno { get; set; } + + /// + /// success + /// + public string success { get; set; } + } + + public static class JsonHelper + { + /// + /// 对象转成JSON 格式字符串 + /// + /// 对象 + /// JSON格式的字符串 + public static string ObjectToJson(object obj) + { + return JsonConvert.SerializeObject(obj); + } + + /// + /// 解析JSON字符串生成对象实体 + /// + /// 对象类型 + /// json字符串 + /// 对象实体 + public static T DeserializeJsonToObject(string json) where T : class + { + Newtonsoft.Json.JsonSerializer serializer = new Newtonsoft.Json.JsonSerializer(); + StringReader sr = new StringReader(json); + object o = serializer.Deserialize(new JsonTextReader(sr), typeof(T)); + T t = o as T; + return t; + } + + /// + /// 解析JSON数组生成对象实体集合 + /// + /// 对象类型 + /// json数组字符串(eg.[{"ID":"112","Name":"石子儿"}]) + /// 对象实体集合 + public static List DeserializeJsonToList(string json) where T : class + { + Newtonsoft.Json.JsonSerializer serializer = new JsonSerializer(); + StringReader sr = new StringReader(json); + object o = serializer.Deserialize(new JsonTextReader(sr), typeof(List)); + List list = o as List; + return list; + } + + /// + /// 数据表转键值对集合 把DataTable转成 List集合, 存每一行 集合中放的是键值对字典,存每一列 + /// + /// 数据表 + /// 哈希表数组 + public static List> DataTableToList(DataTable dt) + { + List> list = new List>(); + + foreach (DataRow dr in dt.Rows) + { + Dictionary dic = new Dictionary(); + foreach (DataColumn dc in dt.Columns) + { + dic.Add(dc.ColumnName, dr[dc.ColumnName]); + } + list.Add(dic); + } + return list; + } + + /// + /// 数据集转键值对数组字典 + /// + /// 键值对数组字典 + public static Dictionary>> DataSetToDic(DataSet ds) + { + Dictionary>> result = new Dictionary>>(); + + foreach (DataTable dt in ds.Tables) + result.Add(dt.TableName, DataTableToList(dt)); + + return result; + } + + /// + /// 数据表转JSON + /// + /// 数据表 + /// JSON字符串 + public static string DataTableToJson(DataTable dt) + { + return ObjectToJson(DataTableToList(dt)); + } + + /// + /// JSON文本转对象,泛型方法 常用 + /// + /// 类型 + /// JSON文本 + /// 指定类型的对象 + public static T JsonToObject(string jsonText) + { + return JsonConvert.DeserializeObject(jsonText); + } + + /// + /// 将JSON文本转换为数据表数据 + /// + /// JSON文本 + /// 数据表字典 + public static Dictionary>> TablesDataFromJson(string jsonText) + { + return JsonToObject>>>(jsonText); + } + + /// + /// 将JSON文本转换成数据行 + /// + /// JSON文本 + /// 数据行的字典 + public static Dictionary DataRowFromJson(string jsonText) + { + return JsonToObject>(jsonText); + } + } } \ No newline at end of file diff --git a/Analysis/CenterControl.designer.cs b/Analysis/CenterControl.designer.cs index 926e503..ba683a4 100644 --- a/Analysis/CenterControl.designer.cs +++ b/Analysis/CenterControl.designer.cs @@ -582,7 +582,7 @@ this.RPV.ItemSizeMode = ((Telerik.WinControls.UI.PageViewItemSizeMode)((Telerik.WinControls.UI.PageViewItemSizeMode.EqualWidth | Telerik.WinControls.UI.PageViewItemSizeMode.EqualHeight))); this.RPV.Location = new System.Drawing.Point(1, 42); this.RPV.Name = "RPV"; - this.RPV.SelectedPage = this.rpvpSetup; + this.RPV.SelectedPage = this.rpvpAnalysis; this.RPV.Size = new System.Drawing.Size(1918, 1008); this.RPV.TabIndex = 127; this.RPV.ViewMode = Telerik.WinControls.UI.PageViewMode.NavigationView; @@ -665,7 +665,7 @@ ((Telerik.WinControls.UI.NavigationViewHeaderElement)(this.RPV.GetChildAt(0).GetChildAt(2))).BackColor3 = System.Drawing.Color.FromArgb(((int)(((byte)(45)))), ((int)(((byte)(135)))), ((int)(((byte)(161))))); ((Telerik.WinControls.UI.NavigationViewHeaderElement)(this.RPV.GetChildAt(0).GetChildAt(2))).BackColor4 = System.Drawing.Color.FromArgb(((int)(((byte)(45)))), ((int)(((byte)(135)))), ((int)(((byte)(161))))); ((Telerik.WinControls.UI.NavigationViewHeaderElement)(this.RPV.GetChildAt(0).GetChildAt(2))).HorizontalLineColor = System.Drawing.Color.FromArgb(((int)(((byte)(19)))), ((int)(((byte)(46)))), ((int)(((byte)(53))))); - ((Telerik.WinControls.UI.NavigationViewHeaderElement)(this.RPV.GetChildAt(0).GetChildAt(2))).Text = " 软件设置"; + ((Telerik.WinControls.UI.NavigationViewHeaderElement)(this.RPV.GetChildAt(0).GetChildAt(2))).Text = " 分析主界面"; ((Telerik.WinControls.UI.NavigationViewHeaderElement)(this.RPV.GetChildAt(0).GetChildAt(2))).FocusBorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(45)))), ((int)(((byte)(135)))), ((int)(((byte)(161))))); ((Telerik.WinControls.UI.NavigationViewHeaderElement)(this.RPV.GetChildAt(0).GetChildAt(2))).ForeColor = System.Drawing.Color.White; ((Telerik.WinControls.UI.NavigationViewHeaderElement)(this.RPV.GetChildAt(0).GetChildAt(2))).BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(27)))), ((int)(((byte)(60)))), ((int)(((byte)(68))))); @@ -3301,6 +3301,7 @@ this.Text = "海克斯康间隙面差分析系统"; this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.CenterControl_FormClosed); this.Load += new System.EventHandler(this.CenterControl_Load); + this.Shown += new System.EventHandler(this.CenterControl_Shown); ((System.ComponentModel.ISupportInitialize)(this.radTitleBar1)).EndInit(); this.radTitleBar1.ResumeLayout(false); this.radTitleBar1.PerformLayout(); diff --git a/Analysis/Program.cs b/Analysis/Program.cs index 60be98a..2bd635e 100644 --- a/Analysis/Program.cs +++ b/Analysis/Program.cs @@ -91,7 +91,7 @@ namespace NSAnalysis gAuthorizationMode = FileIni.ReadInt(ConfigDfn.strConfigFile, "Chery", "AuthorizationMode", 1); #endregion 创建Log文件 - //Application.Run(new CenterControl()); + if (gAuthorizationMode == 1) { MyBase.TraceWriteLine("Log in using the CLMS authorization."); diff --git a/Analysis/bin/x64/Debug/DAL.dll b/Analysis/bin/x64/Debug/DAL.dll index afd633c..95759f1 100644 Binary files a/Analysis/bin/x64/Debug/DAL.dll and b/Analysis/bin/x64/Debug/DAL.dll differ diff --git a/Analysis/bin/x64/Debug/DAL.pdb b/Analysis/bin/x64/Debug/DAL.pdb index 1eb3788..157f6cf 100644 Binary files a/Analysis/bin/x64/Debug/DAL.pdb and b/Analysis/bin/x64/Debug/DAL.pdb differ diff --git a/Analysis/bin/x64/Debug/Debug.txt b/Analysis/bin/x64/Debug/Debug.txt index 31836fb..d2687c9 100644 --- a/Analysis/bin/x64/Debug/Debug.txt +++ b/Analysis/bin/x64/Debug/Debug.txt @@ -1,24 +1,34 @@ -2025-08-28 00:01:33.190----软件Program Main函数开始执行-- -2025-08-28 00:01:33.191--加载配置文件——>开始 -2025-08-28 00:01:33.206--数据库连接 SqlServerName:127.0.0.1 -2025-08-28 00:01:33.207--数据库连接 SqlUserName:sa -2025-08-28 00:01:33.207--数据库连接 SqlPassword:Hexagon123 -2025-08-28 00:01:33.207--数据库连接 SqlDbName:NextSenseStandardDB -2025-08-28 00:01:33.210--加载配置文件——>完成 -2025-08-28 00:01:34.614--数据库连接 SqlServerName:127.0.0.1 -2025-08-28 00:01:34.615--数据库连接 SqlUserName:sa -2025-08-28 00:01:34.616--数据库连接 SqlPassword:Hexagon123 -2025-08-28 00:01:34.617--数据库连接 SqlDbName:NextSenseStandardDB -2025-08-28 00:01:34.618--数据库连接字符串:Data Source=127.0.0.1;initial Catalog=NextSenseStandardDB;User ID=sa;password=Hexagon123; -2025-08-28 00:01:35.112-- 进入显示车身模式!显示车身界面。 -2025-08-28 00:01:35.624--启动PLC写线程! -2025-08-28 00:01:35.627-- 进入解析CSV文件模式,开始解析扫码CSV文件! -2025-08-28 00:01:35.650--连接PLC.... -2025-08-28 00:01:35.652--软件首次启动, Nextsense EH3 CSV读取路径存在;不清空,读取NextSense生成 CSV报告路径下的所有文件,路径为:D:\cherytestEH3 -2025-08-28 00:01:35.653--软件首次启动, Nextsense EHY CSV读取路径存在;不清空,读取NextSense生成 CSV报告路径下的所有文件,路径为:D:\cherytestEHY -2025-08-28 00:01:37.708--PLC S7连接失败。 -2025-08-28 00:01:40.645--连接PLC失败 -2025-08-28 00:01:41.053--Right EH3 UI Refresh tmrRefreshData (strVIN.Length==21):CarType:EHY ;VIN: LNNBBDEC8RDA23997 -2025-08-28 00:01:41.063--Right EHY UI Refresh tmrRefreshData (strVIN.Length==21):CarType:EHY ;VIN: LNNBBDEC8RDA23997 -2025-08-28 00:01:50.246--显示右侧EHY车身数据界面。 -2025-08-28 00:02:31.399---------------海克斯康面隙分析软件程序关闭--------------------- +2025-08-29 22:53:21.911----软件Program Main函数开始执行-- +2025-08-29 22:53:22.122--加载配置文件——>开始 +2025-08-29 22:53:22.436--数据库连接 SqlServerName:127.0.0.1 +2025-08-29 22:53:22.545--数据库连接 SqlUserName:sa +2025-08-29 22:53:22.573--数据库连接 SqlPassword:Hexagon123 +2025-08-29 22:53:22.576--数据库连接 SqlDbName:NextSenseStandardDB +2025-08-29 22:53:22.625--加载配置文件——>完成 +2025-08-29 22:53:22.666--Log in using the original authorization mode. +2025-08-29 22:53:24.548--软件授权成功 +2025-08-29 22:53:27.359--数据库连接 SqlServerName:127.0.0.1 +2025-08-29 22:53:27.361--数据库连接 SqlUserName:sa +2025-08-29 22:53:27.362--数据库连接 SqlPassword:Hexagon123 +2025-08-29 22:53:27.363--数据库连接 SqlDbName:NextSenseStandardDB +2025-08-29 22:53:27.364--数据库连接字符串:Data Source=127.0.0.1;initial Catalog=NextSenseStandardDB;User ID=sa;password=Hexagon123; +2025-08-29 22:53:28.309-- 进入显示车身模式!显示车身界面。 +2025-08-29 22:53:29.581--启动PLC写线程! +2025-08-29 22:53:29.583-- 进入解析CSV文件模式,开始解析扫码CSV文件! +2025-08-29 22:53:29.585--连接PLC.... +2025-08-29 22:53:29.586--软件首次启动, Nextsense EH3 CSV读取路径存在;不清空,读取NextSense生成 CSV报告路径下的所有文件,路径为:D:\cherytestEH3 +2025-08-29 22:53:29.588--软件首次启动, Nextsense EHY CSV读取路径存在;不清空,读取NextSense生成 CSV报告路径下的所有文件,路径为:D:\cherytestEHY +2025-08-29 22:53:31.222--Right EH3 UI Refresh tmrRefreshData (strVIN.Length==21):CarType:EHY ;VIN: LNNBBDEC8RDA23997 +2025-08-29 22:53:31.257--Right EHY UI Refresh tmrRefreshData (strVIN.Length==21):CarType:EHY ;VIN: LNNBBDEC8RDA23997 +2025-08-29 22:53:31.753--PLC S7连接失败。 +2025-08-29 22:53:32.612--显示右侧EHY车身数据界面。 +2025-08-29 22:53:32.619--连接PLC失败 +2025-08-29 22:55:12.952--Test Post Data: {"serno":"312314141","vin":"LNNAJDDU9RDA00213"} +2025-08-29 22:55:24.984--测试从IOT获取车型信息完成,获取到的原返回值为: Error: System.Net.WebException: 操作超时 + 在 System.Net.HttpWebRequest.GetRequestStream(TransportContext& context) + 在 System.Net.HttpWebRequest.GetRequestStream() + 在 NSAnalysis.CenterControl.PostJsonToIOT(String url, String jsonData, Nullable`1 timeout) 位置 D:\HexagonProjects\2024-20-奇瑞间隙面差\奇瑞间隙面差总装代码资料\Code\Analysis\CenterControl.cs:行号 1598 +2025-08-29 22:55:25.831--测试从IOT获取车型信息完成,处理后 获取到的返回值为: rror: System.Net.WebException: 操作超时 + 在 System.Net.HttpWebRequest.GetRequestStream(TransportContext& context) + 在 System.Net.HttpWebRequest.GetRequestStream() + 在 NSAnalysis.CenterControl.PostJsonToIOT(String url, String jsonData, Nullable`1 timeout) 位置 D:\HexagonProjects\2024-20-奇瑞间隙面差\奇瑞间隙面差总装代码资料\Code\Analysis\CenterControl.cs:行号 159 diff --git a/Analysis/bin/x64/Debug/File/AnalysisConfig.ini b/Analysis/bin/x64/Debug/File/AnalysisConfig.ini index 7a676df..24669cf 100644 --- a/Analysis/bin/x64/Debug/File/AnalysisConfig.ini +++ b/Analysis/bin/x64/Debug/File/AnalysisConfig.ini @@ -16,14 +16,14 @@ ReportCSVPath=D:\QMLTest CLMSModeID=10 ;1:CLMS授权 -AuthorizationMode=1 +AuthorizationMode=2 ;CarModel 初始化车型 CarModel=EHY EquipmentNo=NS002 EquipmentName=Hexagon ;1:上传IOT;0:不上传IOT -StartIOTFlag=0 +StartIOTFlag=1 IOTAddress=http://10.188.2.56:9337/web/httpServlet/api/saveGfResult IOTCarTypeAddr=http://10.188.2.56:9337/web/httpServlet/api/queryGFModelAndMaterial ;显示车身数据:1:显示;0:不显示 diff --git a/Analysis/bin/x64/Debug/File/PlcAddrDfn_S7.xml b/Analysis/bin/x64/Debug/File/PlcAddrDfn_S7.xml index 3dd0985..ad91ca3 100644 --- a/Analysis/bin/x64/Debug/File/PlcAddrDfn_S7.xml +++ b/Analysis/bin/x64/Debug/File/PlcAddrDfn_S7.xml @@ -13,7 +13,7 @@ - + diff --git a/Analysis/bin/x64/Debug/Key/reg.key b/Analysis/bin/x64/Debug/Key/reg.key index 0b1662f..6b1b574 100644 --- a/Analysis/bin/x64/Debug/Key/reg.key +++ b/Analysis/bin/x64/Debug/Key/reg.key @@ -1 +1 @@ -E0257D210D71798C7D342413B6AE6E827FF7CDF4D9B987590FAE35D6DCCAFB886AA76997CF2A0EB6CE1262B84EAA89847CE6CDC5A6F8D2EED117805EA3C58FC41BAE98458ABC8F6E2F7D3BC1F235ECAA82954257F761B6EDE6B01E9FFEE276B41AAB0B16C34FF9D2865DF53073BE883F9187EB6EB61E90DDAAA99D8CEBD45D79C7B258FDE9888FDC6ACCD540C3DB33F837A1CD9E7A11BB9D832E332CAE39B9F387EB6710AB221145D9A6E1F2A1FA298D40262129F295BA060BED16C420C03178782B354A00BAD77335C105D312852C3ACEA15E3CA3F54D6B16970431D3E78069F9EAD8D82F39E953F2D6B51CAEE05D904F400BAFC3F41FF2152E610D26B4CDCF27B257D642BF1F30BD8A177925C11CCA10126D0A2870F62CEE7FBD251DCC6A5C68D62B656F9ADA143E07B02516F84636148A81409E1D928DFB346CD8050354C82CA074EDB89ADCBE6E31AD2D142B58B04F2577A03F4CE43586150CE1C69370F28D58DAEABCB2C5920A9759C3D210DF7422DFAA2D1CB0D95564D2A07A82B2F4B4A497C47C57CE23CB1294C515FACF9EEF0C4A6CB8300317D90ECBC6B30D2ABA0EBE5698648EB59A1B33F770C4EB0F928970D13FD27DA4B9521F223210E3B43345B22C2583B76CFAF265F453C3835D7ADAF002206BD6F4C338D19D0DCCFC21F76526CAFDDEC710742816AFD59794DA9653452A9EF92504C1D44B9ED41133C75E185B80E331B531F0535705493788E09E4B04CF0AF947157D7C9E1D6F7F55ADFF4CA2786E83F4315A170E4C7F461B43515DA399766454E68E89428308D085AF0CC75182F5F21077D3A1A42E53784A13DA35D174311F41CB0C111672D7AF1E3EA0E62530BFD5AED3055D783C8020517B9BDB734E885A536BE72FC79A53B301F6994EE89E1EC3D195C4A95C8E880A1F058A9C745242797396C1505ADE70F66B51C0028466F38DDBFBDB66351B696404DC767D0886B7E903EA892C6D667723939B66376CBABF1035635CB9 +E0257D210D71798C7D342413B6AE6E827FF7CDF4D9B987590FAE35D6DCCAFB886AA76997CF2A0EB6183A1A07A6254010415BCA8EF7EB824B6AC227D17C067A53EC3C074338CE4489D1526A6745F8326A3CCC88BA268537C2982273D504D3FBD0570E4C172917E3829DA2C9683B7D6556C8F161F85B4111525371DC60C71086CCC0DED32D5E81E9A83608FB23D8A98F0CE9A56F4559B73159E51D63588E1D1B1995354C2A43825755B0D8869373E58D59AF678076388BCAD83C36867FE0FCFB50D6200CA3AF3E09CB8A154F46BDBE1651F20EAB4AE02E0D16267C192E4B8AEB473DBD8EA87CFD59933062F5FC46B4C360507E9ABEA928539EDCA1FDE38757CB5D50CD286312A907C8659BB2CD95C1C5EB5FB3FF894808137E7F01C767C4AFF501FE74A18570277994AC542D7CF811A0AAB4B53BF5083C4EC10DE7EC55E72BCEAE80B364DDBA2515CEA190D585F349A2A704ADFD6F7EA8D23C429EEE440239844CEC4ACA624A34933816E72E71BFF1669EC74486B70E0C7DD1418C983FCBC9D35043CB2523A685435B541C7B59F511B00347D7E16E1044B337CDD4A819E499EDE975FE7A553DE2604235916CAE6FC2C906625DAE32A7C2441969B842242AAE869F95C22AE889BC2388CBECD6BD0B3074A656940CAB067C850C554E112A104F445F4F7AAA5A879F2C476B088120CEFA03CB3597CC695AF681C6A54B61DEC63E8F39B25446DAAB73608AF105A1F1C2631780E4A7A202FB03323B82115B2BFE71A26FA516FDAAA00A1D4887BEBE6DF4C8D9130C57E0DA55DAC33220C891A46CB8B73D8EFA47314D8015A7F3267D2C726ACAB59DAC92E8CD24F4D08F3B030A96489379642E982F8E4A8B25FA3979A230A6A7C6B38EEB71B0B3E65305D38AB9AD3C3433BC7A5555AAA21F3807ED4BFE97093359CB1E80BBC539B97F616E017218773297294742D0EAB299DD2FD178FAD7D01FD2FA200E6974BA95123B01367C62EF6F0ECDF715ECA67BFE83 diff --git a/Analysis/bin/x64/Debug/NSAnalysis.exe b/Analysis/bin/x64/Debug/NSAnalysis.exe index 314bd97..b4ab58d 100644 Binary files a/Analysis/bin/x64/Debug/NSAnalysis.exe and b/Analysis/bin/x64/Debug/NSAnalysis.exe differ diff --git a/Analysis/bin/x64/Debug/NSAnalysis.pdb b/Analysis/bin/x64/Debug/NSAnalysis.pdb index b410c1d..950fcf1 100644 Binary files a/Analysis/bin/x64/Debug/NSAnalysis.pdb and b/Analysis/bin/x64/Debug/NSAnalysis.pdb differ diff --git a/DAL/SQLHelper.cs b/DAL/SQLHelper.cs index 7575c7b..0297432 100644 --- a/DAL/SQLHelper.cs +++ b/DAL/SQLHelper.cs @@ -112,9 +112,9 @@ namespace DAL DataTable dt = new DataTable(); cmd = new SqlCommand(cmdText, GetConn()); cmd.CommandType = ct; - cmd.CommandTimeout = 60; + //cmd.CommandTimeout = 60; - using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection)) + using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection)) { dt.Load(sdr); } diff --git a/DAL/bin/Debug/DAL.dll b/DAL/bin/Debug/DAL.dll index afd633c..95759f1 100644 Binary files a/DAL/bin/Debug/DAL.dll and b/DAL/bin/Debug/DAL.dll differ diff --git a/DAL/bin/Debug/DAL.pdb b/DAL/bin/Debug/DAL.pdb index 1eb3788..157f6cf 100644 Binary files a/DAL/bin/Debug/DAL.pdb and b/DAL/bin/Debug/DAL.pdb differ