From 974b68b8d6d77b99f32bba00f9d1f2af24615fe1 Mon Sep 17 00:00:00 2001 From: "HM-CN\\zhengxuan.zhang" Date: Thu, 16 Oct 2025 11:48:30 +0800 Subject: [PATCH] =?UTF-8?q?#250926=20=E6=9C=AF=E9=B9=8F=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E5=B0=86=E8=80=97=E6=97=B6=E6=93=8D=E4=BD=9C=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E5=90=8E=E5=8F=B0=E7=BA=BF=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Analysis/BaseUnit/Base.cs | 8 +- Analysis/BaseUnit/PlcSignalDfn.cs | 2 + .../CarDataDisplayForm/FEH3LeftCarData.cs | 286 +- .../CarDataDisplayForm/FEH3RightCarData.cs | 168 +- .../CarDataDisplayForm/FEHYLeftCarData.cs | 158 +- .../CarDataDisplayForm/FEHYRightCarData.cs | 159 +- Analysis/CenterControl.cs | 6672 ++++++++--------- Analysis/CenterControl.designer.cs | 35 +- Analysis/CenterControl.resx | 16 +- Analysis/Define/Define.cs | 29 +- Analysis/Program.cs | 5 +- Analysis/Properties/AssemblyInfo.cs | 9 +- Analysis/bin/x64/Debug/DAL.dll | Bin 53248 -> 53248 bytes Analysis/bin/x64/Debug/DAL.pdb | Bin 132608 -> 132608 bytes Analysis/bin/x64/Debug/Debug.txt | 193 +- .../bin/x64/Debug/File/AnalysisConfig.ini | 2 +- Analysis/bin/x64/Debug/File/PlcAddrDfn_S7.xml | 1 + Analysis/bin/x64/Debug/NSAnalysis.exe | Bin 2484736 -> 2498048 bytes Analysis/bin/x64/Debug/NSAnalysis.pdb | Bin 499200 -> 521728 bytes Analysis/bin/x64/Debug/PLCModule.dll | Bin 179712 -> 179712 bytes Analysis/bin/x64/Debug/PLCModule.pdb | Bin 226816 -> 226816 bytes Analysis/bin/x64/Debug/UserControlClass.dll | Bin 99328 -> 99328 bytes Analysis/bin/x64/Debug/UserControlClass.pdb | Bin 122368 -> 124416 bytes .../9.Analysis.csproj.CoreCompileInputs.cache | 2 +- .../9.Analysis.csproj.FileListAbsolute.txt | 91 + ...gnTimeResolveAssemblyReferencesInput.cache | Bin 9941 -> 7598 bytes DAL/TMeasureMSSQLDAL.cs | 14 +- DAL/bin/Debug/DAL.dll | Bin 53248 -> 53248 bytes DAL/bin/Debug/DAL.pdb | Bin 132608 -> 132608 bytes PLCModule/PLCModule/bin/Debug/PLCModule.dll | Bin 179712 -> 179712 bytes PLCModule/PLCModule/bin/Debug/PLCModule.pdb | Bin 226816 -> 226816 bytes ...4.PLCModule.csproj.CoreCompileInputs.cache | 2 +- .../4.PLCModule.csproj.FileListAbsolute.txt | 19 + .../DesignTimeResolveAssemblyReferences.cache | Bin 132 -> 139 bytes ...gnTimeResolveAssemblyReferencesInput.cache | Bin 2867 -> 2623 bytes .../bin/Debug/UserControlClass.dll | Bin 99328 -> 99328 bytes .../bin/Debug/UserControlClass.pdb | Bin 122368 -> 124416 bytes 37 files changed, 4130 insertions(+), 3741 deletions(-) diff --git a/Analysis/BaseUnit/Base.cs b/Analysis/BaseUnit/Base.cs index 2204fd9..f2cf3a2 100644 --- a/Analysis/BaseUnit/Base.cs +++ b/Analysis/BaseUnit/Base.cs @@ -246,10 +246,10 @@ namespace BaseFunction { try { - if (rleMessage != null) - { - rleMessage.Text = str; - } + //if (rleMessage != null) + //{ + // rleMessage.Text = str; + //} if (str.Contains("警告") || str.ToUpper().Contains("WARN")) { diff --git a/Analysis/BaseUnit/PlcSignalDfn.cs b/Analysis/BaseUnit/PlcSignalDfn.cs index cecce79..8023ea3 100644 --- a/Analysis/BaseUnit/PlcSignalDfn.cs +++ b/Analysis/BaseUnit/PlcSignalDfn.cs @@ -66,5 +66,7 @@ namespace NSAnalysis public const string Speed2 = "Speed2"; public const string R01_Pules = "R01_Pules"; public const string R02_Pules = "R02_Pules"; + + public const string NoCarTypeFlag = "NoCarTypeFlag"; } } \ No newline at end of file diff --git a/Analysis/CarDataDisplayForm/FEH3LeftCarData.cs b/Analysis/CarDataDisplayForm/FEH3LeftCarData.cs index ab3ef40..1290a1b 100644 --- a/Analysis/CarDataDisplayForm/FEH3LeftCarData.cs +++ b/Analysis/CarDataDisplayForm/FEH3LeftCarData.cs @@ -24,6 +24,7 @@ namespace NSAnalysis private TMeasureMSSQLDAL tmdal = new TMeasureMSSQLDAL(); private DataTable dtVINData = new DataTable(); private string strLastVIN = ""; + private BackgroundWorker m_bgwRefreshCar = new BackgroundWorker(); CenterControl gCC = null; #endregion 全局变量 @@ -64,14 +65,14 @@ namespace NSAnalysis for (int i = 1; i <= 30; i++) { strNSName = "";//L0" + i.ToString(); - if(i<=9) + if (i <= 9) strNSName = "L0" + i.ToString(); else { strNSName = "L" + i.ToString(); } ucns = ((UCVWNextSense)MyBase.GetChildControl(this, strNSName)); - if(ucns != null) + if (ucns != null) { ucns.tlpBackColor = Color.White; ucns.tlpFBackColor = Color.White; @@ -92,10 +93,92 @@ namespace NSAnalysis InitNextSenseControl(); labVIN.Text = ""; tmrRefreshData.Interval = 1000; - tmrRefreshData.Start(); + //tmrRefreshData.Start(); + m_bgwRefreshCar.DoWork += new DoWorkEventHandler(m_bgwRefreshCar_DoWork); + m_bgwRefreshCar.RunWorkerAsync(); SpecifyScreenDisplay1(); } + private void m_bgwRefreshCar_DoWork(object sender, DoWorkEventArgs e) + { + while (true) + { + try + { + string strVIN = tmdal.SelectMaintenanceStation7VIN(); + if (strLastVIN != strVIN) + { + if (strVIN.ToLower().Contains("empty")) + { + labVIN.Text = "VIN码为空"; + //InitNextSenseOneItemControl(); + InitNextSenseControl(); + } + else + { + if (strVIN.Length == 17) + { + string strSubVIN = strVIN; + dtVINData.Clear(); + Invoke((MethodInvoker)(() => + { + labVIN.Text = strSubVIN; + })); + string strCarType = tmdal.SelectCarTypeByVIN(strSubVIN); + if (strCarType.ToUpper().Contains("EH3")) + { + MyBase.TraceWriteLine("Left EH3 UI Refresh m_bgwRefreshCar_DoWork (strVIN.Length==17):strLastVIN:" + strLastVIN + " ;VIN: " + strSubVIN); + SpecifyScreenDisplay1(); + dtVINData = tmdal.SelectTMeasureDataByCarIDAndMPN(strSubVIN, "L"); + if (dtVINData.Rows.Count > 0) + { + refreshCarUIData(dtVINData); + analysisTitleColor(); + } + else + { + InitNextSenseControl(); + } + gCC.ShowCarMeasureDataByCarType(1); + } + } + if (strVIN.Length == 21) + { + string strSubVIN = strVIN.Substring(0, 17); + dtVINData.Clear(); + Invoke((MethodInvoker)(() => + { + labVIN.Text = strSubVIN; + })); + string strCarType = strVIN.Substring(18, 3); + + if (strCarType.ToUpper().Contains("EH3")) + { + MyBase.TraceWriteLine("Left EH3 UI Refresh m_bgwRefreshCar_DoWork (strVIN.Length==21):strLastVIN:" + strLastVIN + " ;VIN: " + strSubVIN); + SpecifyScreenDisplay1(); + dtVINData = tmdal.SelectTMeasureDataByCarIDAndMPN(strSubVIN, "L"); + if (dtVINData.Rows.Count > 0) + { + refreshCarUIData(dtVINData); + analysisTitleColor(); + } + else + { + InitNextSenseControl(); + } + gCC.ShowCarMeasureDataByCarType(1); + } + } + } + } + strLastVIN = strVIN; + } + catch (Exception ex) + { + MyBase.TraceWriteLine("Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:" + ex.Message); + } + } + } private void btnRefresh_Click(object sender, EventArgs e) { SpecifyScreenDisplay1(); @@ -107,7 +190,7 @@ namespace NSAnalysis } else { - if (strVIN.Length==17) + if (strVIN.Length == 17) { string strSubVIN = strVIN;// strVIN.Substring(0, strVIN.Length - 2); dtVINData.Clear(); @@ -155,80 +238,77 @@ namespace NSAnalysis private void tmrRefreshData_Tick(object sender, EventArgs e) { try - { - tmrRefreshData.Stop(); - string strVIN = tmdal.SelectMaintenanceStation7VIN(); - if (strLastVIN != strVIN) { - if (strVIN.ToLower().Contains("empty")) + tmrRefreshData.Stop(); + string strVIN = tmdal.SelectMaintenanceStation7VIN(); + if (strLastVIN != strVIN) { - labVIN.Text = "VIN码为空"; - //InitNextSenseOneItemControl(); - InitNextSenseControl(); - } - else - { - if (strVIN.Length==17) + if (strVIN.ToLower().Contains("empty")) { - string strSubVIN = strVIN; - dtVINData.Clear(); - labVIN.Text = strSubVIN; - string strCarType = tmdal.SelectCarTypeByVIN(strSubVIN); - MyBase.TraceWriteLine("Left EH3 UI Refresh tmrRefreshData (strVIN.Length==17):CarType:" + strCarType + " ;VIN: " + strSubVIN); - if (strCarType.ToUpper().Contains("EH3")) - { - SpecifyScreenDisplay1(); - dtVINData = tmdal.SelectTMeasureDataByCarIDAndMPN(strSubVIN, "L"); - if (dtVINData.Rows.Count>0) - { - refreshCarUIData(dtVINData); - analysisTitleColor(); - } - else - { - InitNextSenseControl(); - } - gCC.ShowCarMeasureDataByCarType(1); - } + labVIN.Text = "VIN码为空"; + //InitNextSenseOneItemControl(); + InitNextSenseControl(); } - if (strVIN.Length == 21) + else { - string strSubVIN = strVIN.Substring(0,17); - dtVINData.Clear(); - labVIN.Text = strSubVIN; - string strCarType = strVIN.Substring(18, 3); - MyBase.TraceWriteLine("Left EH3 UI Refresh tmrRefreshData (strVIN.Length==21):CarType:" + strCarType + " ;VIN: " + strSubVIN); - if (strCarType.ToUpper().Contains("EH3")) + if (strVIN.Length == 17) { - SpecifyScreenDisplay1(); - dtVINData = tmdal.SelectTMeasureDataByCarIDAndMPN(strSubVIN, "L"); - if (dtVINData.Rows.Count > 0) - { - refreshCarUIData(dtVINData); - analysisTitleColor(); - } - else - { - InitNextSenseControl(); - } - gCC.ShowCarMeasureDataByCarType(1); - } - } - } - } - strLastVIN = strVIN; - tmrRefreshData.Start(); - } - catch (Exception ex) - { - MyBase.TraceWriteLine("Left EHY UI Refresh tmrRefreshData Error:" + ex.Message); - } + string strSubVIN = strVIN; + dtVINData.Clear(); + labVIN.Text = strSubVIN; + string strCarType = tmdal.SelectCarTypeByVIN(strSubVIN); - finally - { - tmrRefreshData.Start(); - } - } + if (strCarType.ToUpper().Contains("EH3")) + { + MyBase.TraceWriteLine("Left EH3 UI Refresh tmrRefreshData (strVIN.Length==17):strLastVIN:" + strLastVIN + " ;VIN: " + strSubVIN); + SpecifyScreenDisplay1(); + dtVINData = tmdal.SelectTMeasureDataByCarIDAndMPN(strSubVIN, "L"); + if (dtVINData.Rows.Count > 0) + { + refreshCarUIData(dtVINData); + analysisTitleColor(); + } + else + { + InitNextSenseControl(); + } + gCC.ShowCarMeasureDataByCarType(1); + } + } + if (strVIN.Length == 21) + { + string strSubVIN = strVIN.Substring(0, 17); + dtVINData.Clear(); + labVIN.Text = strSubVIN; + string strCarType = strVIN.Substring(18, 3); + + if (strCarType.ToUpper().Contains("EH3")) + { + MyBase.TraceWriteLine("Left EH3 UI Refresh tmrRefreshData (strVIN.Length==21):strLastVIN:" + strLastVIN + " ;VIN: " + strSubVIN); + SpecifyScreenDisplay1(); + dtVINData = tmdal.SelectTMeasureDataByCarIDAndMPN(strSubVIN, "L"); + if (dtVINData.Rows.Count > 0) + { + refreshCarUIData(dtVINData); + analysisTitleColor(); + } + else + { + InitNextSenseControl(); + } + gCC.ShowCarMeasureDataByCarType(1); + } + } + } + } + strLastVIN = strVIN; + tmrRefreshData.Start(); + } + catch (Exception ex) + { + MyBase.TraceWriteLine("Left EHY UI Refresh tmrRefreshData Error:" + ex.Message); + } + } private Color analysisColorbyStatus(string strStatus) { @@ -272,25 +352,29 @@ namespace NSAnalysis strNSName = "L" + i.ToString(); } ucns = ((UCVWNextSense)MyBase.GetChildControl(this, strNSName)); - if (ucns != null) + Invoke((MethodInvoker)(() => { - if (ucns.tlpFBackColor == Color.Red || ucns.tlpGBackColor == Color.Red) + if (ucns != null) { - ucns.tlpBackColor = Color.Red; + if (ucns.tlpFBackColor == Color.Red || ucns.tlpGBackColor == Color.Red) + { + ucns.tlpBackColor = Color.Red; + } + else if (ucns.tlpFBackColor == Color.LightGray && ucns.tlpGBackColor == Color.LightGray) + { + ucns.tlpBackColor = Color.LightGray; + } + else if (ucns.tlpFBackColor == Color.Yellow && ucns.tlpGBackColor == Color.Yellow) + { + ucns.tlpBackColor = Color.Yellow; + } + else + { + ucns.tlpBackColor = Color.Lime; + } } - else if (ucns.tlpFBackColor == Color.LightGray && ucns.tlpGBackColor == Color.LightGray) - { - ucns.tlpBackColor = Color.LightGray; - } - else if (ucns.tlpFBackColor == Color.Yellow && ucns.tlpGBackColor == Color.Yellow) - { - ucns.tlpBackColor = Color.Yellow; - } - else - { - ucns.tlpBackColor = Color.Lime; - } - } + })); + } } @@ -304,21 +388,25 @@ namespace NSAnalysis strNSName = dtData.Rows[i]["MeasPointName"].ToString().Replace("-", ""); strFGName = dtData.Rows[i]["DimensionName"].ToString(); ucns = ((UCVWNextSense)MyBase.GetChildControl(this, strNSName)); - if (ucns != null) + Invoke((MethodInvoker)(() => { - if (strFGName == "F") + if (ucns != null) { - ucns.labFVal = dtData.Rows[i]["MeasureValue"].ToString() ; - ucns.labFLowerUpper = dtData.Rows[i]["LowerTolVal"].ToString() + "/" + dtData.Rows[i]["UpperTolVal"].ToString(); - ucns.tlpFBackColor = analysisColorbyStatus(dtData.Rows[i]["MeasureItemResult"].ToString()); + if (strFGName == "F") + { + ucns.labFVal = dtData.Rows[i]["MeasureValue"].ToString(); + ucns.labFLowerUpper = dtData.Rows[i]["LowerTolVal"].ToString() + "/" + dtData.Rows[i]["UpperTolVal"].ToString(); + ucns.tlpFBackColor = analysisColorbyStatus(dtData.Rows[i]["MeasureItemResult"].ToString()); + } + else + { + ucns.labGVal = dtData.Rows[i]["MeasureValue"].ToString(); + ucns.labGLowerUpper = dtData.Rows[i]["LowerTolVal"].ToString() + "/" + dtData.Rows[i]["UpperTolVal"].ToString(); + ucns.tlpGBackColor = analysisColorbyStatus(dtData.Rows[i]["MeasureItemResult"].ToString()); + } } - else - { - ucns.labGVal = dtData.Rows[i]["MeasureValue"].ToString(); - ucns.labGLowerUpper = dtData.Rows[i]["LowerTolVal"].ToString() + "/" + dtData.Rows[i]["UpperTolVal"].ToString(); - ucns.tlpGBackColor = analysisColorbyStatus(dtData.Rows[i]["MeasureItemResult"].ToString()); - } - } + })); + } } diff --git a/Analysis/CarDataDisplayForm/FEH3RightCarData.cs b/Analysis/CarDataDisplayForm/FEH3RightCarData.cs index be0c79d..ab191c9 100644 --- a/Analysis/CarDataDisplayForm/FEH3RightCarData.cs +++ b/Analysis/CarDataDisplayForm/FEH3RightCarData.cs @@ -25,6 +25,7 @@ namespace NSAnalysis private DataTable dtVINData = new DataTable(); private string strLastVIN = ""; CenterControl gCC = null; + private BackgroundWorker m_bgwRefreshCar = new BackgroundWorker(); #endregion 全局变量 #region 初始化控件 @@ -96,10 +97,95 @@ namespace NSAnalysis InitNextSenseControl(); labVIN.Text = ""; tmrRefreshData.Interval = 1100; - tmrRefreshData.Start(); + //tmrRefreshData.Start(); + m_bgwRefreshCar.DoWork += new DoWorkEventHandler(m_bgwRefreshCar_DoWork); + m_bgwRefreshCar.RunWorkerAsync(); SpecifyScreenDisplay1(); } + private void m_bgwRefreshCar_DoWork(object sender, DoWorkEventArgs e) + { + while (true) + { + try + { + string strVIN = tmdal.SelectMaintenanceStation7VIN(); + if (strLastVIN != strVIN) + { + if (strVIN.ToLower().Contains("empty")) + { + labVIN.Text = "VIN码为空"; + Invoke((MethodInvoker)(() => + { + labVIN.Text = "VIN码为空"; + })); + InitNextSenseControl(); + } + else + { + if (strVIN.Length == 17) + { + string strSubVIN = strVIN;//.Substring(0, strVIN.Length - 2); + dtVINData.Clear(); + Invoke((MethodInvoker)(() => + { + labVIN.Text = strSubVIN; + })); + string strCarType = tmdal.SelectCarTypeByVIN(strSubVIN); + if (strCarType.ToUpper().Contains("EH3")) + { + MyBase.TraceWriteLine("Right EH3 UI Refresh m_bgwRefreshCar_DoWork (strVIN.Length==17):strLastVIN:" + strLastVIN + " ;VIN: " + strSubVIN); + SpecifyScreenDisplay1(); + dtVINData = tmdal.SelectTMeasureDataByCarIDAndMPN(strSubVIN, "R"); + if (dtVINData.Rows.Count > 0) + { + refreshCarUIData(dtVINData); + analysisTitleColor(); + } + else + { + InitNextSenseControl(); + } + gCC.ShowCarMeasureDataByCarType(1); + } + } + if (strVIN.Length == 21) + { + string strSubVIN = strVIN.Substring(0, 17); + dtVINData.Clear(); + Invoke((MethodInvoker)(() => + { + labVIN.Text = strSubVIN; + })); + string strCarType = strVIN.Substring(18, 3); + + if (strCarType.ToUpper().Contains("EH3")) + { + MyBase.TraceWriteLine("Right EH3 UI Refresh m_bgwRefreshCar_DoWork (strVIN.Length==21):strLastVIN:" + strLastVIN + " ;VIN: " + strSubVIN); + SpecifyScreenDisplay1(); + dtVINData = tmdal.SelectTMeasureDataByCarIDAndMPN(strSubVIN, "R"); + if (dtVINData.Rows.Count > 0) + { + refreshCarUIData(dtVINData); + analysisTitleColor(); + } + else + { + InitNextSenseControl(); + } + gCC.ShowCarMeasureDataByCarType(1); + } + } + } + } + strLastVIN = strVIN; + } + catch (Exception ex) + { + MyBase.TraceWriteLine("Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:" + ex.Message); + } + } + } private void btnRefresh_Click(object sender, EventArgs e) { SpecifyScreenDisplay1(); @@ -117,9 +203,10 @@ namespace NSAnalysis dtVINData.Clear(); labVIN.Text = strSubVIN; string strCarType = tmdal.SelectCarTypeByVIN(strSubVIN); - MyBase.TraceWriteLine("Right EH3 UI Refresh Button (strVIN.Length==17):CarType:" + strCarType + " ;VIN: " + strSubVIN); + if (strCarType.ToUpper().Contains("EH3")) { + MyBase.TraceWriteLine("Right EH3 UI Refresh Button (strVIN.Length==17):CarType:" + strCarType + " ;VIN: " + strSubVIN); dtVINData = tmdal.SelectTMeasureDataByCarIDAndMPN(strSubVIN, "R"); if (dtVINData.Rows.Count > 0) { @@ -138,9 +225,10 @@ namespace NSAnalysis dtVINData.Clear(); labVIN.Text = strSubVIN; string strCarType = strVIN.Substring(strVIN.Length - 3, 3); - MyBase.TraceWriteLine("Right EH3 UI Refresh Button (strVIN.Length==21):CarType:" + strCarType + " ;VIN: " + strSubVIN); + if (strCarType.ToUpper().Contains("EH3")) { + MyBase.TraceWriteLine("Right EH3 UI Refresh Button (strVIN.Length==21):CarType:" + strCarType + " ;VIN: " + strSubVIN); dtVINData = tmdal.SelectTMeasureDataByCarIDAndMPN(strSubVIN, "R"); if (dtVINData.Rows.Count > 0) { @@ -179,9 +267,10 @@ namespace NSAnalysis dtVINData.Clear(); labVIN.Text = strSubVIN; string strCarType = tmdal.SelectCarTypeByVIN(strSubVIN); - MyBase.TraceWriteLine("Right EH3 UI Refresh tmrRefreshData (strVIN.Length==17):CarType:" + strCarType + " ;VIN: " + strSubVIN); + if (strCarType.ToUpper().Contains("EH3")) { + MyBase.TraceWriteLine("Right EH3 UI Refresh tmrRefreshData (strVIN.Length==17):strLastVIN:" + strLastVIN + " ;VIN: " + strSubVIN); SpecifyScreenDisplay1(); dtVINData = tmdal.SelectTMeasureDataByCarIDAndMPN(strSubVIN, "R"); if (dtVINData.Rows.Count > 0) @@ -202,9 +291,10 @@ namespace NSAnalysis dtVINData.Clear(); labVIN.Text = strSubVIN; string strCarType = strVIN.Substring(18, 3); - MyBase.TraceWriteLine("Right EH3 UI Refresh tmrRefreshData (strVIN.Length==21):CarType:" + strCarType + " ;VIN: " + strSubVIN); + if (strCarType.ToUpper().Contains("EH3")) { + MyBase.TraceWriteLine("Right EH3 UI Refresh tmrRefreshData (strVIN.Length==21):strLastVIN:" + strLastVIN + " ;VIN: " + strSubVIN); SpecifyScreenDisplay1(); dtVINData = tmdal.SelectTMeasureDataByCarIDAndMPN(strSubVIN, "R"); if (dtVINData.Rows.Count > 0) @@ -228,11 +318,6 @@ namespace NSAnalysis { MyBase.TraceWriteLine("Left EHY UI Refresh tmrRefreshData Error:" + ex.Message); } - - finally - { - tmrRefreshData.Start(); - } } private Color analysisColorbyStatus(string strStatus) @@ -276,25 +361,28 @@ namespace NSAnalysis strNSName = "R" + i.ToString(); } ucns = ((UCVWNextSense)MyBase.GetChildControl(this, strNSName)); - if (ucns != null) + Invoke((MethodInvoker)(() => { - if (ucns.tlpFBackColor == Color.Red || ucns.tlpGBackColor == Color.Red) + if (ucns != null) { - ucns.tlpBackColor = Color.Red; + if (ucns.tlpFBackColor == Color.Red || ucns.tlpGBackColor == Color.Red) + { + ucns.tlpBackColor = Color.Red; + } + else if (ucns.tlpFBackColor == Color.LightGray && ucns.tlpGBackColor == Color.LightGray) + { + ucns.tlpBackColor = Color.LightGray; + } + else if (ucns.tlpFBackColor == Color.Yellow && ucns.tlpGBackColor == Color.Yellow) + { + ucns.tlpBackColor = Color.Yellow; + } + else + { + ucns.tlpBackColor = Color.Lime; + } } - else if (ucns.tlpFBackColor == Color.LightGray && ucns.tlpGBackColor == Color.LightGray) - { - ucns.tlpBackColor = Color.LightGray; - } - else if (ucns.tlpFBackColor == Color.Yellow && ucns.tlpGBackColor == Color.Yellow) - { - ucns.tlpBackColor = Color.Yellow; - } - else - { - ucns.tlpBackColor = Color.Lime; - } - } + })); } } @@ -308,21 +396,25 @@ namespace NSAnalysis strNSName = dtData.Rows[i]["MeasPointName"].ToString().Replace("-", ""); strFGName = dtData.Rows[i]["DimensionName"].ToString(); ucns = ((UCVWNextSense)MyBase.GetChildControl(this, strNSName)); - if (ucns != null) + Invoke((MethodInvoker)(() => { - if (strFGName == "F") + if (ucns != null) { - ucns.labFVal = dtData.Rows[i]["MeasureValue"].ToString(); - ucns.labFLowerUpper = dtData.Rows[i]["LowerTolVal"].ToString() + "/" + dtData.Rows[i]["UpperTolVal"].ToString(); - ucns.tlpFBackColor = analysisColorbyStatus(dtData.Rows[i]["MeasureItemResult"].ToString()); + if (strFGName == "F") + { + ucns.labFVal = dtData.Rows[i]["MeasureValue"].ToString(); + ucns.labFLowerUpper = dtData.Rows[i]["LowerTolVal"].ToString() + "/" + dtData.Rows[i]["UpperTolVal"].ToString(); + ucns.tlpFBackColor = analysisColorbyStatus(dtData.Rows[i]["MeasureItemResult"].ToString()); + } + else + { + ucns.labGVal = dtData.Rows[i]["MeasureValue"].ToString(); + ucns.labGLowerUpper = dtData.Rows[i]["LowerTolVal"].ToString() + "/" + dtData.Rows[i]["UpperTolVal"].ToString(); + ucns.tlpGBackColor = analysisColorbyStatus(dtData.Rows[i]["MeasureItemResult"].ToString()); + } } - else - { - ucns.labGVal = dtData.Rows[i]["MeasureValue"].ToString(); - ucns.labGLowerUpper = dtData.Rows[i]["LowerTolVal"].ToString() + "/" + dtData.Rows[i]["UpperTolVal"].ToString(); - ucns.tlpGBackColor = analysisColorbyStatus(dtData.Rows[i]["MeasureItemResult"].ToString()); - } - } + })); + } } diff --git a/Analysis/CarDataDisplayForm/FEHYLeftCarData.cs b/Analysis/CarDataDisplayForm/FEHYLeftCarData.cs index 4dc67c8..bd164db 100644 --- a/Analysis/CarDataDisplayForm/FEHYLeftCarData.cs +++ b/Analysis/CarDataDisplayForm/FEHYLeftCarData.cs @@ -25,6 +25,7 @@ namespace NSAnalysis private DataTable dtVINData = new DataTable(); private string strLastVIN = ""; CenterControl gCC = null; + private BackgroundWorker m_bgwRefreshCar = new BackgroundWorker(); #endregion 全局变量 public FEHYLeftCarData(CenterControl cc) @@ -92,7 +93,9 @@ namespace NSAnalysis InitNextSenseControl(); labVIN.Text = ""; tmrRefreshData.Interval = 1000; - tmrRefreshData.Start(); + //tmrRefreshData.Start(); + m_bgwRefreshCar.DoWork += new DoWorkEventHandler(m_bgwRefreshCar_DoWork); + m_bgwRefreshCar.RunWorkerAsync(); SpecifyScreenDisplay1(); } @@ -151,7 +154,83 @@ namespace NSAnalysis } } } + private void m_bgwRefreshCar_DoWork(object sender, DoWorkEventArgs e) + { + while (true) + { + try + { + string strVIN = tmdal.SelectMaintenanceStation7VIN(); + if (strLastVIN != strVIN) + { + if (strVIN.ToLower().Contains("empty")) + { + Invoke((MethodInvoker)(() => + { + labVIN.Text = "VIN码为空"; + })); + InitNextSenseControl(); + } + else + { + if (strVIN.Length == 17) + { + string strSubVIN = strVIN;//.Substring(0, strVIN.Length - 2); + dtVINData.Clear(); + Invoke((MethodInvoker)(() => { labVIN.Text = strSubVIN; })); + string strCarType = tmdal.SelectCarTypeByVIN(strSubVIN); + if (strCarType.ToUpper().Contains("EHY")) + { + MyBase.TraceWriteLine("Left EHY UI Refresh m_bgwRefreshCar_DoWork (strVIN.Length==17):strLastVIN:" + strLastVIN + " ;VIN: " + strSubVIN); + SpecifyScreenDisplay1(); + dtVINData = tmdal.SelectTMeasureDataByCarIDAndMPN(strSubVIN, "L"); + if (dtVINData.Rows.Count > 0) + { + refreshCarUIData(dtVINData); + analysisTitleColor(); + } + else + { + InitNextSenseControl(); + } + gCC.ShowCarMeasureDataByCarType(2); + } + } + if (strVIN.Length == 21) + { + string strSubVIN = strVIN.Substring(0, 17); + dtVINData.Clear(); + Invoke((MethodInvoker)(() => { labVIN.Text = strSubVIN; })); + string strCarType = strVIN.Substring(18, 3); + + if (strCarType.ToUpper().Contains("EHY")) + { + MyBase.TraceWriteLine("Left EHY UI Refresh m_bgwRefreshCar_DoWork (strVIN.Length==21):strLastVIN:" + strLastVIN + " ;VIN: " + strSubVIN); + SpecifyScreenDisplay1(); + dtVINData = tmdal.SelectTMeasureDataByCarIDAndMPN(strSubVIN, "L"); + if (dtVINData.Rows.Count > 0) + { + refreshCarUIData(dtVINData); + analysisTitleColor(); + } + else + { + InitNextSenseControl(); + } + gCC.ShowCarMeasureDataByCarType(2); + } + } + } + } + strLastVIN = strVIN; + } + catch (Exception ex) + { + MyBase.TraceWriteLine("Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:" + ex.Message); + } + } + } private void tmrRefreshData_Tick(object sender, EventArgs e) { tmrRefreshData.Stop(); @@ -174,9 +253,10 @@ namespace NSAnalysis dtVINData.Clear(); labVIN.Text = strSubVIN; string strCarType = tmdal.SelectCarTypeByVIN(strSubVIN); - MyBase.TraceWriteLine("Left EHY UI Refresh tmrRefreshData (strVIN.Length==17):CarType:" + strCarType + " ;VIN: " + strSubVIN); + if (strCarType.ToUpper().Contains("EHY")) { + MyBase.TraceWriteLine("Left EHY UI Refresh tmrRefreshData (strVIN.Length==17):strLastVIN:" + strLastVIN + " ;VIN: " + strSubVIN); SpecifyScreenDisplay1(); dtVINData = tmdal.SelectTMeasureDataByCarIDAndMPN(strSubVIN, "L"); if (dtVINData.Rows.Count > 0) @@ -197,9 +277,10 @@ namespace NSAnalysis dtVINData.Clear(); labVIN.Text = strSubVIN; string strCarType = strVIN.Substring(18, 3); - MyBase.TraceWriteLine("Left EHY UI Refresh tmrRefreshData (strVIN.Length==21):CarType:" + strCarType + " ;VIN: " + strSubVIN); + if (strCarType.ToUpper().Contains("EHY")) { + MyBase.TraceWriteLine("Left EHY UI Refresh tmrRefreshData (strVIN.Length==21):strLastVIN:" + strLastVIN + " ;VIN: " + strSubVIN); SpecifyScreenDisplay1(); dtVINData = tmdal.SelectTMeasureDataByCarIDAndMPN(strSubVIN, "L"); if (dtVINData.Rows.Count > 0) @@ -224,10 +305,10 @@ namespace NSAnalysis MyBase.TraceWriteLine("Left EHY UI Refresh tmrRefreshData Error:" + ex.Message); } - finally - { - tmrRefreshData.Start(); - } + // finally + //{ + // tmrRefreshData.Start(); + //} } @@ -272,25 +353,28 @@ namespace NSAnalysis strNSName = "L" + i.ToString(); } ucns = ((UCVWNextSense)MyBase.GetChildControl(this, strNSName)); - if (ucns != null) + Invoke((MethodInvoker)(() => { - if (ucns.tlpFBackColor == Color.Red || ucns.tlpGBackColor == Color.Red) + if (ucns != null) { - ucns.tlpBackColor = Color.Red; + if (ucns.tlpFBackColor == Color.Red || ucns.tlpGBackColor == Color.Red) + { + ucns.tlpBackColor = Color.Red; + } + else if (ucns.tlpFBackColor == Color.LightGray && ucns.tlpGBackColor == Color.LightGray) + { + ucns.tlpBackColor = Color.LightGray; + } + else if (ucns.tlpFBackColor == Color.Yellow && ucns.tlpGBackColor == Color.Yellow) + { + ucns.tlpBackColor = Color.Yellow; + } + else + { + ucns.tlpBackColor = Color.Lime; + } } - else if (ucns.tlpFBackColor == Color.LightGray && ucns.tlpGBackColor == Color.LightGray) - { - ucns.tlpBackColor = Color.LightGray; - } - else if (ucns.tlpFBackColor == Color.Yellow && ucns.tlpGBackColor == Color.Yellow) - { - ucns.tlpBackColor = Color.Yellow; - } - else - { - ucns.tlpBackColor = Color.Lime; - } - } + })); } } @@ -304,21 +388,25 @@ namespace NSAnalysis strNSName = dtData.Rows[i]["MeasPointName"].ToString().Replace("-", ""); strFGName = dtData.Rows[i]["DimensionName"].ToString(); ucns = ((UCVWNextSense)MyBase.GetChildControl(this, strNSName)); - if (ucns != null) + Invoke((MethodInvoker)(() => { - if (strFGName == "F") + if (ucns != null) { - ucns.labFVal = dtData.Rows[i]["MeasureValue"].ToString(); - ucns.labFLowerUpper = dtData.Rows[i]["LowerTolVal"].ToString() + "/" + dtData.Rows[i]["UpperTolVal"].ToString(); - ucns.tlpFBackColor = analysisColorbyStatus(dtData.Rows[i]["MeasureItemResult"].ToString()); + if (strFGName == "F") + { + ucns.labFVal = dtData.Rows[i]["MeasureValue"].ToString(); + ucns.labFLowerUpper = dtData.Rows[i]["LowerTolVal"].ToString() + "/" + dtData.Rows[i]["UpperTolVal"].ToString(); + ucns.tlpFBackColor = analysisColorbyStatus(dtData.Rows[i]["MeasureItemResult"].ToString()); + } + else + { + ucns.labGVal = dtData.Rows[i]["MeasureValue"].ToString(); + ucns.labGLowerUpper = dtData.Rows[i]["LowerTolVal"].ToString() + "/" + dtData.Rows[i]["UpperTolVal"].ToString(); + ucns.tlpGBackColor = analysisColorbyStatus(dtData.Rows[i]["MeasureItemResult"].ToString()); + } } - else - { - ucns.labGVal = dtData.Rows[i]["MeasureValue"].ToString(); - ucns.labGLowerUpper = dtData.Rows[i]["LowerTolVal"].ToString() + "/" + dtData.Rows[i]["UpperTolVal"].ToString(); - ucns.tlpGBackColor = analysisColorbyStatus(dtData.Rows[i]["MeasureItemResult"].ToString()); - } - } + })); + } } diff --git a/Analysis/CarDataDisplayForm/FEHYRightCarData.cs b/Analysis/CarDataDisplayForm/FEHYRightCarData.cs index 91a301e..8c9e4f8 100644 --- a/Analysis/CarDataDisplayForm/FEHYRightCarData.cs +++ b/Analysis/CarDataDisplayForm/FEHYRightCarData.cs @@ -25,6 +25,7 @@ namespace NSAnalysis private DataTable dtVINData = new DataTable(); private string strLastVIN = ""; CenterControl gCC = null; + private BackgroundWorker m_bgwRefreshCar = new BackgroundWorker(); #endregion 全局变量 #region 初始化控件 @@ -96,7 +97,9 @@ namespace NSAnalysis InitNextSenseControl(); labVIN.Text = ""; tmrRefreshData.Interval = 1100; - tmrRefreshData.Start(); + //tmrRefreshData.Start(); + m_bgwRefreshCar.DoWork += new DoWorkEventHandler(m_bgwRefreshCar_DoWork); + m_bgwRefreshCar.RunWorkerAsync(); SpecifyScreenDisplay1(); } @@ -155,6 +158,83 @@ namespace NSAnalysis } } } + private void m_bgwRefreshCar_DoWork(object sender, DoWorkEventArgs e) + { + while (true) + { + try + { + string strVIN = tmdal.SelectMaintenanceStation7VIN(); + if (strLastVIN != strVIN) + { + if (strVIN.ToLower().Contains("empty")) + { + Invoke((MethodInvoker)(() => + { + labVIN.Text = "VIN码为空"; + })); + InitNextSenseControl(); + } + else + { + if (strVIN.Length == 17) + { + string strSubVIN = strVIN;//.Substring(0, strVIN.Length - 2); + dtVINData.Clear(); + Invoke((MethodInvoker)(() => { labVIN.Text = strSubVIN; })) ; + string strCarType = tmdal.SelectCarTypeByVIN(strSubVIN); + + if (strCarType.ToUpper().Contains("EHY")) + { + MyBase.TraceWriteLine("Right EHY UI Refresh m_bgwRefreshCar_DoWork (strVIN.Length==17):strLastVIN:" + strLastVIN + " ;VIN: " + strSubVIN); + SpecifyScreenDisplay1(); + dtVINData = tmdal.SelectTMeasureDataByCarIDAndMPN(strSubVIN, "R"); + if (dtVINData.Rows.Count > 0) + { + refreshCarUIData(dtVINData); + analysisTitleColor(); + } + else + { + InitNextSenseControl(); + } + gCC.ShowCarMeasureDataByCarType(2); + } + } + if (strVIN.Length == 21) + { + string strSubVIN = strVIN.Substring(0, 17); + dtVINData.Clear(); + Invoke((MethodInvoker)(() => { labVIN.Text = strSubVIN; })); + string strCarType = strVIN.Substring(18, 3); + + if (strCarType.ToUpper().Contains("EHY")) + { + MyBase.TraceWriteLine("Right EHY UI Refresh m_bgwRefreshCar_DoWork (strVIN.Length==21):strLastVIN:" + strLastVIN + " ;VIN: " + strSubVIN); + SpecifyScreenDisplay1(); + dtVINData = tmdal.SelectTMeasureDataByCarIDAndMPN(strSubVIN, "R"); + if (dtVINData.Rows.Count > 0) + { + refreshCarUIData(dtVINData); + analysisTitleColor(); + } + else + { + InitNextSenseControl(); + } + gCC.ShowCarMeasureDataByCarType(2); + } + } + } + } + strLastVIN = strVIN; + } + catch (Exception ex) + { + MyBase.TraceWriteLine("Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:" + ex.Message); + } + } + } private void tmrRefreshData_Tick(object sender, EventArgs e) { @@ -179,9 +259,10 @@ namespace NSAnalysis dtVINData.Clear(); labVIN.Text = strSubVIN; string strCarType = tmdal.SelectCarTypeByVIN(strSubVIN); - MyBase.TraceWriteLine("Right EHY UI Refresh tmrRefreshData (strVIN.Length==17):CarType:" + strCarType + " ;VIN: " + strSubVIN); + if (strCarType.ToUpper().Contains("EHY")) { + MyBase.TraceWriteLine("Right EHY UI Refresh tmrRefreshData (strVIN.Length==17):strLastVIN:" + strLastVIN + " ;VIN: " + strSubVIN); SpecifyScreenDisplay1(); dtVINData = tmdal.SelectTMeasureDataByCarIDAndMPN(strSubVIN, "R"); if (dtVINData.Rows.Count > 0) @@ -202,9 +283,10 @@ namespace NSAnalysis dtVINData.Clear(); labVIN.Text = strSubVIN; string strCarType = strVIN.Substring(18, 3); - MyBase.TraceWriteLine("Right EHY UI Refresh tmrRefreshData (strVIN.Length==21):CarType:" + strCarType + " ;VIN: " + strSubVIN); + if (strCarType.ToUpper().Contains("EHY")) { + MyBase.TraceWriteLine("Right EHY UI Refresh tmrRefreshData (strVIN.Length==21):strLastVIN:" + strLastVIN + " ;VIN: " + strSubVIN); SpecifyScreenDisplay1(); dtVINData = tmdal.SelectTMeasureDataByCarIDAndMPN(strSubVIN, "R"); if (dtVINData.Rows.Count > 0) @@ -229,10 +311,10 @@ namespace NSAnalysis MyBase.TraceWriteLine("Left EHY UI Refresh tmrRefreshData Error:" + ex.Message); } - finally - { - tmrRefreshData.Start(); - } + //finally + //{ + // tmrRefreshData.Start(); + //} } private Color analysisColorbyStatus(string strStatus) @@ -276,25 +358,28 @@ namespace NSAnalysis strNSName = "R" + i.ToString(); } ucns = ((UCVWNextSense)MyBase.GetChildControl(this, strNSName)); - if (ucns != null) + Invoke((MethodInvoker)(() => { - if (ucns.tlpFBackColor == Color.Red || ucns.tlpGBackColor == Color.Red) + if (ucns != null) { - ucns.tlpBackColor = Color.Red; + if (ucns.tlpFBackColor == Color.Red || ucns.tlpGBackColor == Color.Red) + { + ucns.tlpBackColor = Color.Red; + } + else if (ucns.tlpFBackColor == Color.LightGray && ucns.tlpGBackColor == Color.LightGray) + { + ucns.tlpBackColor = Color.LightGray; + } + else if (ucns.tlpFBackColor == Color.Yellow && ucns.tlpGBackColor == Color.Yellow) + { + ucns.tlpBackColor = Color.Yellow; + } + else + { + ucns.tlpBackColor = Color.Lime; + } } - else if (ucns.tlpFBackColor == Color.LightGray && ucns.tlpGBackColor == Color.LightGray) - { - ucns.tlpBackColor = Color.LightGray; - } - else if (ucns.tlpFBackColor == Color.Yellow && ucns.tlpGBackColor == Color.Yellow) - { - ucns.tlpBackColor = Color.Yellow; - } - else - { - ucns.tlpBackColor = Color.Lime; - } - } + })); } } @@ -308,21 +393,25 @@ namespace NSAnalysis strNSName = dtData.Rows[i]["MeasPointName"].ToString().Replace("-", ""); strFGName = dtData.Rows[i]["DimensionName"].ToString(); ucns = ((UCVWNextSense)MyBase.GetChildControl(this, strNSName)); - if (ucns != null) + Invoke((MethodInvoker)(() => { - if (strFGName == "F") + if (ucns != null) { - ucns.labFVal = dtData.Rows[i]["MeasureValue"].ToString(); - ucns.labFLowerUpper = dtData.Rows[i]["LowerTolVal"].ToString() + "/" + dtData.Rows[i]["UpperTolVal"].ToString(); - ucns.tlpFBackColor = analysisColorbyStatus(dtData.Rows[i]["MeasureItemResult"].ToString()); + if (strFGName == "F") + { + ucns.labFVal = dtData.Rows[i]["MeasureValue"].ToString(); + ucns.labFLowerUpper = dtData.Rows[i]["LowerTolVal"].ToString() + "/" + dtData.Rows[i]["UpperTolVal"].ToString(); + ucns.tlpFBackColor = analysisColorbyStatus(dtData.Rows[i]["MeasureItemResult"].ToString()); + } + else + { + ucns.labGVal = dtData.Rows[i]["MeasureValue"].ToString(); + ucns.labGLowerUpper = dtData.Rows[i]["LowerTolVal"].ToString() + "/" + dtData.Rows[i]["UpperTolVal"].ToString(); + ucns.tlpGBackColor = analysisColorbyStatus(dtData.Rows[i]["MeasureItemResult"].ToString()); + } } - else - { - ucns.labGVal = dtData.Rows[i]["MeasureValue"].ToString(); - ucns.labGLowerUpper = dtData.Rows[i]["LowerTolVal"].ToString() + "/" + dtData.Rows[i]["UpperTolVal"].ToString(); - ucns.tlpGBackColor = analysisColorbyStatus(dtData.Rows[i]["MeasureItemResult"].ToString()); - } - } + })); + } } diff --git a/Analysis/CenterControl.cs b/Analysis/CenterControl.cs index f829518..f51c9dc 100644 --- a/Analysis/CenterControl.cs +++ b/Analysis/CenterControl.cs @@ -7,6 +7,7 @@ using NSAnalysis.Properties; using PLCModule; using System; using System.Collections.Generic; +using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; @@ -23,3437 +24,3242 @@ using UserControlClass; namespace NSAnalysis { - /// - /// 2025.08.29 -------------------------------------------------------------- 1、增加对 生成报告数据的备份 - /// 、上传情况的记录√ 2、增加对IOT json报文 上传情况的记录√ 3、增加对 PLC 传输过点信号的 记录 (抵达,测量,离开) √ 4、PLC通讯阻塞问题 √ - /// - /// - /// - /// - /// 2025.8.31 -------------------------------------------------------------- 1、增加对IOT 上传失败的重传功能 √ - /// - - public partial class CenterControl : Telerik.WinControls.UI.ShapedForm - { - #region 全局变量 - - 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 FEH3LeftCarData fLEH3 = null; - private FEH3RightCarData fREH3 = null; - - private int iCurrentMeasureItemsFailedCount = 0; - #region PLC相关变量 - - private bool bStopPlcNormal = false; - private static int HeartBeatCount = 0; - private bool bPlcLiveTickLast = false; - - 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 serialTestPort = null; - - private SerialPort serialPort = null; - private int iLastMesureCount = 0; - - #endregion PLC相关变量 - - #region 分页全局变量 - - private DataTable PageTable = new DataTable(); - - /// - /// 每页记录数 - /// - public int pageSize = 20; - - /// - /// 总记录数 - /// - public int recordCount = 0; - - /// - /// 总页数 - /// - public int pageCount = 0; - - /// - /// 当前页 - /// - public int currentPage = 0; - - #endregion 分页全局变量 - - #endregion 全局变量 - - #region 主窗口事件 - - public CenterControl() - { - InitializeComponent(); - SQLHelper.connStr = DatabaseDfn.SqlConnectStr(); - - #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); - - #endregion 加载皮肤 - } - - 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() // 解析EH3 车型 - { - 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) - { - GenUserReportCSV(strCarID, listCSVTitleInfo, dtAllRangeDate, FPYPercent); - } - 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 (!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成功 ^_^"); - tmdal.InsertIOTUploadLog(strCarID, strPostData, true, labResultPercent.Text); - } - else - { - MyBase.TraceWriteLine("EH3数据上传IOT失败!"); - tmdal.InsertIOTUploadLog(strCarID, strPostData, false, labResultPercent.Text); - } - - #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() //解析EHY 车型 - { - 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")) - { - 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) - { - MyBase.TraceWriteLine("VIN:" + strCarID + " 该VIN码已经在数据库中存在了,说明已经测量过了,不再进行IOT数据上传操作。"); - } - else - { - // 上传 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\":\"EHY\",\"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("EHY数据上传IOT完成,结果返回为:" + strPostResult); - if (strPostResult.Contains("成功")) - { - MyBase.TraceWriteLine("EHY数据上传IOT成功 ^_^"); - - tmdal.InsertIOTUploadLog(strCarID, strPostData, true, labResultPercent.Text); - } - else - { - MyBase.TraceWriteLine("EHY数据上传IOT失败!"); - - tmdal.InsertIOTUploadLog(strCarID, strPostData, false, labResultPercent.Text); - } - } - } - 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 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 backupDirectoryPath = Application.StartupPath + "\\ReportBackup"; - - if (!Directory.Exists(backupDirectoryPath)) - { - Directory.CreateDirectory(backupDirectoryPath); - //日志 - MyBase.TraceWriteLine("创建ReportBackup文件夹完毕,路径为:" + backupDirectoryPath); - } - - // 构造备份文件路径,\\" + DateTime.Now.ToString("yyyyMMddHHmmss") + "_" + - // strCarID + ".csv" - string backupFilePath = backupDirectoryPath + "\\" + DateTime.Now.ToString("yyyyMMddHHmmss") + "_" + strCarID + ".csv"; - - // 记录备份文件路径 - MyBase.TraceWriteLine("客户自检报告备份路径为:" + backupFilePath); - - 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(backupFilePath, sb.ToString()); - MyBase.TraceWriteLine("客户自检报告生成完毕,备份路径为:" + targetFilePath); - - // 尝试进行复制到 目标路径 往目标路径copy该文件,并记录是否成功 - try - { - File.Copy(backupFilePath, targetFilePath, true); - - // 记录上传情况 - bool isUploaded = true; - // 记录输入情况 strCarID、目标路径、备份路径、是否上传成功 - MyBase.TraceWriteLine($"车号: {strCarID} | 目标路径: {targetFilePath} | 备份路径: {backupDirectoryPath} | 上传成功: {isUploaded}"); - tmdal.InsertCsvReportUploadLog(strCarID, targetFilePath, backupDirectoryPath, isUploaded); - } - catch (Exception ex) - { - MyBase.TraceWriteLine("客户自检报告复制异常:" + ex.Message); - - // 记录上传情况 - bool isUploaded = false; - MyBase.TraceWriteLine($"车号: {strCarID} | 目标路径: {targetFilePath} | 备份路径: {backupDirectoryPath} | 上传成功: {isUploaded}"); - tmdal.InsertCsvReportUploadLog(strCarID, targetFilePath, backupDirectoryPath, isUploaded); - } - - #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 backupFolderPath = Application.StartupPath + "\\ReportBackup"; - if (!Directory.Exists(backupFolderPath)) - { - Directory.CreateDirectory(backupFolderPath); - //日志 - MyBase.TraceWriteLine("创建ReportBackup文件夹完毕,路径为:" + backupFolderPath); - } - - // 构造备份文件路径,\\" + DateTime.Now.ToString("yyyyMMddHHmmss") + "_" + strCarID + ".csv" - string backupFilePath = backupFolderPath + "\\" + DateTime.Now.ToString("yyyyMMddHHmmss") + "_" + strCarID + ".csv"; - - // 记录备份文件路径 - MyBase.TraceWriteLine("客户自检报告备份路径为:" + backupFilePath); - - 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(backupFilePath, sb.ToString()); - // 记录日志,说明备份成功 - MyBase.TraceWriteLine("客户 csv报告备份完毕,路径为:" + backupFilePath); - - // 往目标路径copy该文件,并记录是否成功 - try - { - File.Copy(backupFilePath, targetFilePath, true); - - // 记录上传情况 - bool isUploaded = true; - - // 记录输入情况 strCarID、目标路径、备份路径、是否上传成功 - MyBase.TraceWriteLine($"车号: {strCarID} | 目标路径: {targetFilePath} | 备份路径: {backupFilePath} | 上传成功: {isUploaded}"); - - tmdal.InsertCsvReportUploadLog(strCarID, targetFilePath, backupFolderPath, isUploaded); - } - catch (Exception ex) - { - MyBase.TraceWriteLine("客户csv报告复制异常:" + ex.Message); - - // 记录上传情况 - bool isUploaded = false; - MyBase.TraceWriteLine($"车号: {strCarID} | 目标路径: {targetFilePath} | 备份路径: {backupFilePath} | 上传成功: {isUploaded}"); - tmdal.InsertCsvReportUploadLog(strCarID, targetFilePath, backupFolderPath, isUploaded); - } - - #endregion 解析完报告后,重新生成客户模板报告 - } - - private void UploadIOTData(string strCarID, DataTable dtAllRangeDate, string strTargetRate) - { - double dStrictTLower = 0; - double dStrictTUpper = 0; - double dLowerValue = 0; - double dUpperValue = 0; - bool bVINMeasuedFlag = tmdal.CheckVINExistInDB(strCarID); - if (bVINMeasuedFlag) - { - MyBase.TraceWriteLine("VIN:" + strCarID + " 该VIN码已经在数据库中存在了,说明已经测量过了,不再进行IOT数据上传操作。"); - } - else - { - // 上传 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")) // 2025.08.27 修复NG数据实际值为空时,上传IOT报错问题 - { - 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\":\"EHY\",\"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("EHY数据上传IOT完成,结果返回为:" + strPostResult); - if (strPostResult.Contains("成功")) - { - MyBase.TraceWriteLine("EHY数据上传IOT成功 ^_^"); - } - else - { - 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++; - } - } - - //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 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 IOT数据的重传 - - private void ReSendIotData() - { - DataTable dtUnuploaded = tmdal.SelectUnuploadedIOTLogs(); - foreach (DataRow row in dtUnuploaded.Rows) - { - string carId = row["CarID"].ToString(); - string content = row["Content"].ToString(); - string fpy = row["FPY"]?.ToString(); - int id = Convert.ToInt32(row["Id"]); - - // 调用上传接口 - string result = PostJsonToIOT(ConfigDfn.strIOTAddress, content, 10000); - bool isSuccess = result.Contains("成功"); - - // 更新上传状态 - if (isSuccess) - { - tmdal.UpdateIOTUploadStatus(id, true); - } - } - } - - #endregion - - #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(); - // 使用 Task.Run 在后台线程处理PLC数据 - Task.Run(() => - { - try - { - // 这里是原有的PLC数据读取和处理逻辑 - ReadAndProcessPlcData(); - } - catch (Exception ex) - { - MyBase.TraceWriteLine("tmrReadPLCData_Tick exception: " + ex.ToString()); - } - finally - { - // 回到UI线程,安全启动定时器 - this.BeginInvoke((Action)(() => tmrReadPLCData.Start())); - } - }); - } - - private void ReadAndProcessPlcData() - { - #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); - PLCDfn.NSStartMeasure = PlcObject.GetS7ByteData(PlcSignalDfn.NSStartMeasure); - PLCDfn.CarPassFlag = PlcObject.GetS7ByteData(PlcSignalDfn.CarPassFlag); - - //从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中完成。"); - - #region 记录PLC过点信息 - try - { - DateTime arriveTime = DateTime.Now; - if (tmdal.ExistsArriveLog(strCarID) == 0) - { - tmdal.InsertArriveLog(strCarID, arriveTime); - } - else - { - MyBase.TraceWriteLine($"车辆 {strCarID} 当天已存在抵达记录,未重复插入。"); - } - } - catch (Exception ex) - { - MyBase.TraceWriteLine("记录PLC过点信息异常,异常信息: " + ex.ToString()); - } - - #endregion - } - else - { - MyBase.TraceWriteLine("报错:根据VIN从IOT上获取车型信息失败,不发送给PLC车型信息和颜色信息。 "); - } - } - } - - if (iLastNSStartMeasure == 0 && PLCDfn.NSStartMeasure == 10) //启动测量信号 - { - string strCarID = PlcObject.GetS7StringData(PlcSignalDfn.PartID); - if (strCarID.Length > 10) - { - // 记录日志,此时该车开始测量 - MyBase.TraceWriteLine($" {strCarID} 机器人安全判断合格,启动NXS测量"); - - #region 记录PLC过点信息 - // 记录启动测量时间 - try - { - DateTime measureStartTime = DateTime.Now; - tmdal.UpdateStartMeasureTime(strCarID, measureStartTime); - } - catch (Exception ex) - { - MyBase.TraceWriteLine("记录测量开始时间异常,异常信息: " + ex.ToString()); - } - #endregion - } - else - { - //记录日志,获取到启动测量信号,但没有获取 车号 - MyBase.TraceWriteLine("报错:获取到启动NXS测量信号,但没有获取 车号 "); - } - } - - 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 (strPostResult.Contains("成功")) - { - MyBase.TraceWriteLine("NG数据上传IOT成功 ^_^"); - - tmdal.InsertIOTUploadLog(strCarID, strPostData, true, "0.00"); - } - else - { - MyBase.TraceWriteLine("NG数据上传IOT失败!"); - - tmdal.InsertIOTUploadLog(strCarID, strPostData, false, "0.00"); - } - } - - #region 记录PLC过点信息 - - try - { - DateTime leaveTime = DateTime.Now; - tmdal.UpdateLeaveTime(strTempCarID, leaveTime); - } - catch (Exception ex) - { - MyBase.TraceWriteLine("记录PLC过点信息异常,异常信息: " + ex.ToString()); - } - - #endregion - } - - 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; - iLastNSStartMeasure = PLCDfn.NSStartMeasure; - #endregion 循环读取PLC数据块中的信息 - } - catch (Exception ex) - { - MyBase.TraceWriteLine("tmrReadPLCData_Tick exception: " + ex.ToString()); - } - } - - 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) - { - // 停止定时器,防止重入 - tmrWritePLCLive.Stop(); - - // 在后台线程写入PLC心跳信号 - Task.Run(() => - { - try - { - bTickt = !bTickt; - PlcObject.InsertWriteQueue(PlcSignalDfn.SoftLive, Convert.ToByte(bTickt ? 1 : 0)); - } - catch (Exception ex) - { - MyBase.TraceWriteLine("tmrWritePLCLive_Tick exception: " + ex.ToString()); - } - finally - { - // 回到UI线程,安全启动定时器 - this.BeginInvoke((Action)(() => tmrWritePLCLive.Start())); - } - }); - } - - 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); - - //插入记录测试 - tmdal.InsertIOTUploadLog("test001", strPostData, true, labResultPercent.Text); - - 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 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); - } - } + /// + /// + /// 2025.08.29 + /// -------------------------------------------------------------- + /// 1、增加对 生成报告数据的备份、上传情况的记录√ + /// 2、增加对IOT json报文 上传情况的记录√ + /// 3、增加对 PLC 传输过点信号的 记录 (抵达,测量,离开) √ + /// 4、PLC通讯阻塞问题 √ + /// + /// + /// + /// + /// 2025.8.31 + /// -------------------------------------------------------------- + /// + /// 1、增加对IOT 上传失败的重传功能 √ + /// + /// + /// + /// + /// + + public partial class CenterControl : Telerik.WinControls.UI.ShapedForm + { + #region 全局变量 + + 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 FEH3LeftCarData fLEH3 = null; + private FEH3RightCarData fREH3 = null; + + private int iCurrentMeasureItemsFailedCount = 0; + private BackgroundWorker m_bgwAnalysisCSVReport = new BackgroundWorker(); + #region PLC相关变量 + + private bool bStopPlcNormal = false; + private static int HeartBeatCount = 0; + private bool bPlcLiveTickLast = false; + + 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 int iLastNoCarTypeFlag = 0; + private SerialPort serialTestPort = null; + + private SerialPort serialPort = null; + private int iLastMesureCount = 0; + private System.Timers.Timer ttmrReadPLCData = new System.Timers.Timer(); + private System.Timers.Timer ttmrWritePLCLive = new System.Timers.Timer(); + private System.Timers.Timer ttmrReadNSCSV = new System.Timers.Timer(); + #endregion PLC相关变量 + + #region 分页全局变量 + + private DataTable PageTable = new DataTable(); + + /// + /// 每页记录数 + /// + public int pageSize = 20; + + /// + /// 总记录数 + /// + public int recordCount = 0; + + /// + /// 总页数 + /// + public int pageCount = 0; + + /// + /// 当前页 + /// + public int currentPage = 0; + + #endregion 分页全局变量 + + #endregion 全局变量 + + #region 主窗口事件 + + public CenterControl() + { + InitializeComponent(); + SQLHelper.connStr = DatabaseDfn.SqlConnectStr(); + + #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); + + #endregion 加载皮肤 + } + + private void CenterControl_Load(object sender, EventArgs e) + { + ttmrReadPLCData.Interval = 300; + ttmrReadPLCData.SynchronizingObject = this; + ttmrReadPLCData.Elapsed += ttmrReadPLCData_Elapsed; + + ttmrWritePLCLive.Interval = 1000; + ttmrWritePLCLive.SynchronizingObject = this; + ttmrWritePLCLive.Elapsed += ttmrWritePLCLive_Elapsed; + + ttmrReadNSCSV.Interval = 500; + ttmrReadNSCSV.SynchronizingObject = this; + ttmrReadNSCSV.Elapsed += ttmrReadNSCSV_Elapsed; + + #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文件!"); + //ttmrReadNSCSV.Start(); + //tmdal.updateMaintenceInfoEmpty(); + m_bgwAnalysisCSVReport.DoWork += new DoWorkEventHandler(m_bgwAnalysisCSVReport_DoWork); + m_bgwAnalysisCSVReport.RunWorkerAsync(); + } + else + { + MyBase.TraceWriteLine(" 进入不解析CSV文件模式!"); + ttmrReadNSCSV.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 主窗口事件 + + + #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() // 解析EH3 车型 + { + try + { + Invoke((MethodInvoker)(() => { 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(); + + 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. 备份完成"); + Invoke((MethodInvoker)(() => + { + dgvMeasureContent.Rows.Clear(); + 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, FileShare.ReadWrite); + 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] = ""; + } + Invoke((MethodInvoker)(() => + { + 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++; + Invoke((MethodInvoker)(() => + { + 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++; + } + } + + Invoke((MethodInvoker)(() => { 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++) + { + Invoke((MethodInvoker)(() => { dgvMeasureContent.Rows[i - 1].HeaderCell.Value = i.ToString(); })); + } + + MyBase.TraceWriteLine("计算合格率的时:包含极差计算项!"); + } + #endregion 计算极差 + string strTargetRate = ""; + Invoke((MethodInvoker)(() => + { + #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); + + 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) + { + GenUserReportCSV(strCarID, listCSVTitleInfo, dtAllRangeDate, FPYPercent); + } + 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 (!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成功 ^_^"); + tmdal.InsertIOTUploadLog(strCarID, strPostData, true, labResultPercent.Text); + } + else + { + MyBase.TraceWriteLine("EH3数据上传IOT失败!"); + tmdal.InsertIOTUploadLog(strCarID, strPostData, false, labResultPercent.Text); + } + + #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() //解析EHY 车型 + { + try + { + Invoke((MethodInvoker)(() => { 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(); + + 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. 备份完成"); + Invoke((MethodInvoker)(() => + { + dgvMeasureContent.Rows.Clear(); + 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, FileShare.ReadWrite); + 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")) + { + 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] = ""; + } + Invoke((MethodInvoker)(() => + { + 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++; + Invoke((MethodInvoker)(() => + { + 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++; + } + } + Invoke((MethodInvoker)(() => + { + 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++) + { + Invoke((MethodInvoker)(() => + { + dgvMeasureContent.Rows[i - 1].HeaderCell.Value = i.ToString(); + })); + } + MyBase.TraceWriteLine("计算合格率的时:包含极差计算项!"); + } + + #endregion 计算极差 + string strTargetRate = ""; + Invoke((MethodInvoker)(() => + { + #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); + + 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) + { + MyBase.TraceWriteLine("VIN:" + strCarID + " 该VIN码已经在数据库中存在了,说明已经测量过了,不再进行IOT数据上传操作。"); + } + else + { + // 上传 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\":\"EHY\",\"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("EHY数据上传IOT完成,结果返回为:" + strPostResult); + if (strPostResult.Contains("成功")) + { + MyBase.TraceWriteLine("EHY数据上传IOT成功 ^_^"); + + tmdal.InsertIOTUploadLog(strCarID, strPostData, true, labResultPercent.Text); + } + else + { + MyBase.TraceWriteLine("EHY数据上传IOT失败!"); + + tmdal.InsertIOTUploadLog(strCarID, strPostData, false, labResultPercent.Text); + } + } + } + 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 AnalysisNextSenseSelfMeasureCSV() + { + try + { + Invoke((MethodInvoker)(() => + { + 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("存在NS 自检报告 CSV文件,开始解析:"); + List listCSVTitleInfo = new List(); + string strCarID = "SelfMeasure" + DateTime.Now.ToString("yyyyMMddHHmmss"); + foreach (FileInfo fi in fileInfos) + { + listCSVTitleInfo.Clear(); + ListPostIOTData.Clear(); + dtCSVContent.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. 备份完成"); + + Invoke((MethodInvoker)(() => + { + dgvMeasureContent.Rows.Clear(); + lbCSVFiles.Items.Add(fi.Name); + })); + #region 解析NextSense自检CSV报告 + + MyBase.TraceWriteLine("开始解析NextSense 自检报告 CSV 报告:" + strCSVName); + Encoding encoding = GetType(strCSVName); + FileStream fs = new FileStream(strCSVName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + 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, ""); + + Invoke((MethodInvoker)(() => + { + 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()); + + Invoke((MethodInvoker)(() => + { + 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 backupDirectoryPath = Application.StartupPath + "\\ReportBackup"; + + if (!Directory.Exists(backupDirectoryPath)) + { + Directory.CreateDirectory(backupDirectoryPath); + //日志 + MyBase.TraceWriteLine("创建ReportBackup文件夹完毕,路径为:" + backupDirectoryPath); + } + + // 构造备份文件路径,\\" + DateTime.Now.ToString("yyyyMMddHHmmss") + "_" + + // strCarID + ".csv" + string backupFilePath = backupDirectoryPath + "\\" + DateTime.Now.ToString("yyyyMMddHHmmss") + "_" + strCarID + ".csv"; + + // 记录备份文件路径 + MyBase.TraceWriteLine("客户自检报告备份路径为:" + backupFilePath); + + 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(backupFilePath, sb.ToString()); + MyBase.TraceWriteLine("客户自检报告生成完毕,备份路径为:" + targetFilePath); + + // 尝试进行复制到 目标路径 往目标路径copy该文件,并记录是否成功 + try + { + File.Copy(backupFilePath, targetFilePath, true); + + // 记录上传情况 + bool isUploaded = true; + // 记录输入情况 strCarID、目标路径、备份路径、是否上传成功 + MyBase.TraceWriteLine($"车号: {strCarID} | 目标路径: {targetFilePath} | 备份路径: {backupDirectoryPath} | 上传成功: {isUploaded}"); + tmdal.InsertCsvReportUploadLog(strCarID, targetFilePath, backupDirectoryPath, isUploaded); + } + catch (Exception ex) + { + MyBase.TraceWriteLine("客户自检报告复制异常:" + ex.Message); + + // 记录上传情况 + bool isUploaded = false; + MyBase.TraceWriteLine($"车号: {strCarID} | 目标路径: {targetFilePath} | 备份路径: {backupDirectoryPath} | 上传成功: {isUploaded}"); + tmdal.InsertCsvReportUploadLog(strCarID, targetFilePath, backupDirectoryPath, isUploaded); + } + + #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 backupFolderPath = Application.StartupPath + "\\ReportBackup"; + if (!Directory.Exists(backupFolderPath)) + { + Directory.CreateDirectory(backupFolderPath); + //日志 + MyBase.TraceWriteLine("创建ReportBackup文件夹完毕,路径为:" + backupFolderPath); + } + + // 构造备份文件路径,\\" + DateTime.Now.ToString("yyyyMMddHHmmss") + "_" + strCarID + ".csv" + string backupFilePath = backupFolderPath + "\\" + DateTime.Now.ToString("yyyyMMddHHmmss") + "_" + strCarID + ".csv"; + + // 记录备份文件路径 + MyBase.TraceWriteLine("客户自检报告备份路径为:" + backupFilePath); + + 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(backupFilePath, sb.ToString()); + // 记录日志,说明备份成功 + MyBase.TraceWriteLine("客户 csv报告备份完毕,路径为:" + backupFilePath); + + // 往目标路径copy该文件,并记录是否成功 + try + { + File.Copy(backupFilePath, targetFilePath, true); + + // 记录上传情况 + bool isUploaded = true; + + // 记录输入情况 strCarID、目标路径、备份路径、是否上传成功 + MyBase.TraceWriteLine($"车号: {strCarID} | 目标路径: {targetFilePath} | 备份路径: {backupFilePath} | 上传成功: {isUploaded}"); + + tmdal.InsertCsvReportUploadLog(strCarID, targetFilePath, backupFolderPath, isUploaded); + } + catch (Exception ex) + { + MyBase.TraceWriteLine("客户csv报告复制异常:" + ex.Message); + + // 记录上传情况 + bool isUploaded = false; + MyBase.TraceWriteLine($"车号: {strCarID} | 目标路径: {targetFilePath} | 备份路径: {backupFilePath} | 上传成功: {isUploaded}"); + tmdal.InsertCsvReportUploadLog(strCarID, targetFilePath, backupFolderPath, isUploaded); + } + + #endregion 解析完报告后,重新生成客户模板报告 + } + + private void UploadIOTData(string strCarID, DataTable dtAllRangeDate, string strTargetRate) + { + double dStrictTLower = 0; + double dStrictTUpper = 0; + double dLowerValue = 0; + double dUpperValue = 0; + bool bVINMeasuedFlag = tmdal.CheckVINExistInDB(strCarID); + if (bVINMeasuedFlag) + { + MyBase.TraceWriteLine("VIN:" + strCarID + " 该VIN码已经在数据库中存在了,说明已经测量过了,不再进行IOT数据上传操作。"); + } + else + { + // 上传 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")) // 2025.08.27 修复NG数据实际值为空时,上传IOT报错问题 + { + 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\":\"EHY\",\"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("EHY数据上传IOT完成,结果返回为:" + strPostResult); + if (strPostResult.Contains("成功")) + { + MyBase.TraceWriteLine("EHY数据上传IOT成功 ^_^"); + } + else + { + 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++; + } + } + + //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, FileShare.ReadWrite); + 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 IOT数据的重传 + + private void ReSendIotData() + { + DataTable dtUnuploaded = tmdal.SelectUnuploadedIOTLogs(); + foreach (DataRow row in dtUnuploaded.Rows) + { + string carId = row["CarID"].ToString(); + string content = row["Content"].ToString(); + string fpy = row["FPY"]?.ToString(); + int id = Convert.ToInt32(row["Id"]); + + // 调用上传接口 + string result = PostJsonToIOT(ConfigDfn.strIOTAddress, content, 10000); + bool isSuccess = result.Contains("成功"); + + // 更新上传状态 + if (isSuccess) + { + tmdal.UpdateIOTUploadStatus(id, true); + } + } + } + + #endregion + + #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 ttmrReadPLCData_Elapsed(object sender, System.Timers.ElapsedEventArgs e) + { + ttmrReadPLCData.Stop(); + ReadAndProcessPlcData(); + ttmrReadPLCData.Start(); + } + + private void ttmrWritePLCLive_Elapsed(object sender, System.Timers.ElapsedEventArgs e) + { + ttmrWritePLCLive.Stop(); + bTickt = !bTickt; + PlcObject.InsertWriteQueue(PlcSignalDfn.SoftLive, Convert.ToByte(bTickt ? 1 : 0)); + ttmrWritePLCLive.Start(); + + } + private void m_bgwAnalysisCSVReport_DoWork(object sender, DoWorkEventArgs e) + { + while (true) + { + AnalysisNextSenseSelfMeasureCSV(); + AnalysisNextSenseEH3CSV(); + AnalysisNextSenseEHYCSV(); + } + } + + private void ttmrReadNSCSV_Elapsed(object sender, System.Timers.ElapsedEventArgs e) + { + ttmrReadNSCSV.Stop(); + //AnalysisNextSenseSelfMeasureCSV(); + //AnalysisNextSenseEH3CSV(); + //AnalysisNextSenseEHYCSV(); + ttmrReadNSCSV.Start(); + } + private void ReadAndProcessPlcData() + { + #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(); + ttmrReadPLCData.Start(); + ttmrReadPLCData.Start(); + return; + } + if (m_Datas == null) + { + //tmrReadPLCData.Start(); + ttmrReadPLCData.Start(); + ttmrReadPLCData.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); + PLCDfn.NSStartMeasure = PlcObject.GetS7ByteData(PlcSignalDfn.NSStartMeasure); + PLCDfn.CarPassFlag = PlcObject.GetS7ByteData(PlcSignalDfn.CarPassFlag); + PLCDfn.NoCarTypeFlag = PlcObject.GetS7ByteData(PlcSignalDfn.NoCarTypeFlag); + //从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中完成。"); + + #region 记录PLC过点信息 + try + { + DateTime arriveTime = DateTime.Now; + if (tmdal.ExistsArriveLog(strCarID) == 0) + { + tmdal.InsertArriveLog(strCarID, arriveTime); + } + else + { + MyBase.TraceWriteLine($"车辆 {strCarID} 当天已存在抵达记录,未重复插入。"); + } + } + catch (Exception ex) + { + MyBase.TraceWriteLine("记录PLC过点信息异常,异常信息: " + ex.ToString()); + } + + #endregion + } + else + { + MyBase.TraceWriteLine("报错:根据VIN从IOT上获取车型信息失败,不发送给PLC车型信息和颜色信息。 "); + } + } + } + + if (iLastNoCarTypeFlag == 0 && PLCDfn.NoCarTypeFlag == 10) + { + string strCarID = PlcObject.GetS7StringData(PlcSignalDfn.PartID); + MyBase.TraceWriteLine("NoCarTypeFlag:0->10; PLC 反馈未收到软件发送的车类型码信息; VIN="+ strCarID); + } + + if (iLastNSStartMeasure == 0 && PLCDfn.NSStartMeasure == 10) //启动测量信号 + { + string strCarID = PlcObject.GetS7StringData(PlcSignalDfn.PartID); + if (strCarID.Length > 10) + { + // 记录日志,此时该车开始测量 + MyBase.TraceWriteLine($"检测开始测量0->10: {strCarID} 机器人安全判断合格,启动NXS测量"); + + #region 记录PLC过点信息 + // 记录启动测量时间 + try + { + DateTime measureStartTime = DateTime.Now; + tmdal.UpdateStartMeasureTime(strCarID, measureStartTime); + } + catch (Exception ex) + { + MyBase.TraceWriteLine("记录测量开始时间异常,异常信息: " + ex.ToString()); + } + #endregion + } + else + { + //记录日志,获取到启动测量信号,但没有获取 车号 + MyBase.TraceWriteLine("报错:获取到启动NXS测量信号,但没有获取 车号 "); + } + } + + 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 (strPostResult.Contains("成功")) + { + MyBase.TraceWriteLine("NG数据上传IOT成功 ^_^"); + + tmdal.InsertIOTUploadLog(strCarID, strPostData, true, "0.00"); + } + else + { + MyBase.TraceWriteLine("NG数据上传IOT失败!"); + + tmdal.InsertIOTUploadLog(strCarID, strPostData, false, "0.00"); + } + } + + #region 记录PLC过点信息 + + try + { + DateTime leaveTime = DateTime.Now; + tmdal.UpdateLeaveTime(strTempCarID, leaveTime); + } + catch (Exception ex) + { + MyBase.TraceWriteLine("记录PLC过点信息异常,异常信息: " + ex.ToString()); + } + + #endregion + } + + if (!string.IsNullOrEmpty(strCarID) && strCarID.Length > 10) + { + MyBase.TraceWriteLine("CarPassFlag 0->10 开始更新MaintenceInfo数据库位置7-2中的VIN码 "); + string strTempCarID = tmdal.SelectMaintenanceStationVINbyStationNo(6); + Thread.Sleep(10); + tmdal.updateMaintenceInfo(strTempCarID, 7); + MyBase.TraceWriteLine($"CarPassFlag 0->10 更新VIN={strTempCarID} 到MaintenceInfo数据库位置7完成。"); + Thread.Sleep(15); + 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 + { + MyBase.TraceWriteLine("CarPassFlag 0->10 strCarID Error = " + strCarID); + string strTempCarID = tmdal.SelectMaintenanceStationVINbyStationNo(6); + Thread.Sleep(10); + tmdal.updateMaintenceInfo(strTempCarID, 7); + MyBase.TraceWriteLine($"CarPassFlag 0->10 更新VIN={strTempCarID} 到MaintenceInfo数据库位置7完成。"); + Thread.Sleep(15); + 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; + iLastNSStartMeasure = PLCDfn.NSStartMeasure; + iLastNoCarTypeFlag = PLCDfn.NoCarTypeFlag; + #endregion 循环读取PLC数据块中的信息 + } + catch (Exception ex) + { + MyBase.TraceWriteLine("tmrReadPLCData_Tick exception: " + ex.ToString()); + } + } + + 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 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(); + ttmrWritePLCLive.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; + ttmrReadPLCData.Stop(); + MyBase.TraceWriteLine("连接PLC失败"); + return; + } + + //tmrReadPLCData.Start(); //读取PLC数据信息 + ttmrReadPLCData.Start(); + ttmrWritePLCLive.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!"); + ttmrReadPLCData.Stop(); + tmrHeartBeatConnect.Stop(); + ttmrWritePLCLive.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); + + //插入记录测试 + tmdal.InsertIOTUploadLog("test001", strPostData, true, labResultPercent.Text); + + 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) + { + Invoke((MethodInvoker)(() => + { + 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 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 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 ba683a4..b898bcb 100644 --- a/Analysis/CenterControl.designer.cs +++ b/Analysis/CenterControl.designer.cs @@ -228,12 +228,8 @@ this.lpcPLCTest = new UserControlClass.LabPictureControl(); this.lpcPLCAddress = new UserControlClass.LabPictureControl(); this.tmSystem = new System.Windows.Forms.Timer(this.components); - this.tmReadNextsenseCSV = new System.Windows.Forms.Timer(this.components); - this.tmrReadPLCData = new System.Windows.Forms.Timer(this.components); this.tmrRefreshPLCStatus = new System.Windows.Forms.Timer(this.components); this.tmrHeartBeatConnect = new System.Windows.Forms.Timer(this.components); - this.tmrWritePLCLive = new System.Windows.Forms.Timer(this.components); - this.tmrMonitorDBToCreateReport = new System.Windows.Forms.Timer(this.components); ((System.ComponentModel.ISupportInitialize)(this.radTitleBar1)).BeginInit(); this.radTitleBar1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.radStatusStrip1)).BeginInit(); @@ -531,6 +527,7 @@ this.radStatusStrip1.SetSpring(this.commandBarSeparator3, false); this.commandBarSeparator3.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SystemDefault; this.commandBarSeparator3.UseCompatibleTextRendering = false; + this.commandBarSeparator3.Visibility = Telerik.WinControls.ElementVisibility.Collapsed; this.commandBarSeparator3.VisibleInOverflowMenu = false; // // radLabelElement3 @@ -539,6 +536,7 @@ this.radStatusStrip1.SetSpring(this.radLabelElement3, false); this.radLabelElement3.Text = "读取数据库状态:"; this.radLabelElement3.TextWrap = true; + this.radLabelElement3.Visibility = Telerik.WinControls.ElementVisibility.Collapsed; // // rleReadDBStatus // @@ -547,6 +545,7 @@ this.radStatusStrip1.SetSpring(this.rleReadDBStatus, false); this.rleReadDBStatus.Text = "●"; this.rleReadDBStatus.TextWrap = true; + this.rleReadDBStatus.Visibility = Telerik.WinControls.ElementVisibility.Collapsed; // // commandBarSeparator5 // @@ -582,7 +581,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.rpvpAnalysis; + this.RPV.SelectedPage = this.rpvpSetup; this.RPV.Size = new System.Drawing.Size(1918, 1008); this.RPV.TabIndex = 127; this.RPV.ViewMode = Telerik.WinControls.UI.PageViewMode.NavigationView; @@ -665,7 +664,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))))); @@ -3252,16 +3251,6 @@ this.tmSystem.Interval = 1000; this.tmSystem.Tick += new System.EventHandler(this.tmSystem_Tick); // - // tmReadNextsenseCSV - // - this.tmReadNextsenseCSV.Interval = 300; - this.tmReadNextsenseCSV.Tick += new System.EventHandler(this.tmReadNextsenseCSV_Tick); - // - // tmrReadPLCData - // - this.tmrReadPLCData.Interval = 300; - this.tmrReadPLCData.Tick += new System.EventHandler(this.tmrReadPLCData_Tick); - // // tmrRefreshPLCStatus // this.tmrRefreshPLCStatus.Interval = 500; @@ -3272,16 +3261,6 @@ this.tmrHeartBeatConnect.Interval = 1000; this.tmrHeartBeatConnect.Tick += new System.EventHandler(this.tmrHeartBeatConnect_Tick); // - // tmrWritePLCLive - // - this.tmrWritePLCLive.Interval = 1000; - this.tmrWritePLCLive.Tick += new System.EventHandler(this.tmrWritePLCLive_Tick); - // - // tmrMonitorDBToCreateReport - // - this.tmrMonitorDBToCreateReport.Interval = 1000; - this.tmrMonitorDBToCreateReport.Tick += new System.EventHandler(this.tmrMonitorDBToCreateReport_Tick); - // // CenterControl // this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 13F); @@ -3478,7 +3457,6 @@ private Telerik.WinControls.UI.RadLabel radLabel5; private System.Windows.Forms.DataVisualization.Charting.Chart chartCPCPK; private System.Windows.Forms.Timer tmSystem; - private System.Windows.Forms.Timer tmReadNextsenseCSV; private System.Windows.Forms.PictureBox pbResult; private System.Windows.Forms.Label labRejectCount; private System.Windows.Forms.Label label7; @@ -3505,10 +3483,8 @@ private Telerik.WinControls.UI.RadLabel radLabel2; private Telerik.WinControls.UI.RadDropDownList rddlSizeName; private Telerik.WinControls.UI.RadDropDownList rddlMeasurePoint; - private System.Windows.Forms.Timer tmrReadPLCData; private System.Windows.Forms.Timer tmrRefreshPLCStatus; private System.Windows.Forms.Timer tmrHeartBeatConnect; - private System.Windows.Forms.Timer tmrWritePLCLive; private System.Windows.Forms.Label labSumMeasureCount; private System.Windows.Forms.Label label13; private System.Windows.Forms.Panel pnlPage; @@ -3586,7 +3562,6 @@ private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn6; private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn7; private System.Windows.Forms.DataGridViewTextBoxColumn MeasureItemResult; - private System.Windows.Forms.Timer tmrMonitorDBToCreateReport; private Telerik.WinControls.UI.RadLabelElement radLabelElement3; private Telerik.WinControls.UI.RadLabelElement rleReadDBStatus; private Telerik.WinControls.UI.CommandBarSeparator commandBarSeparator5; diff --git a/Analysis/CenterControl.resx b/Analysis/CenterControl.resx index 74e3740..94cf852 100644 --- a/Analysis/CenterControl.resx +++ b/Analysis/CenterControl.resx @@ -314,23 +314,11 @@ 17, 17 - - 127, 14 - - - 298, 20 - - 443, 20 + 113, 17 - 640, 18 - - - 821, 18 - - - 980, 16 + 310, 15 61 diff --git a/Analysis/Define/Define.cs b/Analysis/Define/Define.cs index cc90385..2dce7cd 100644 --- a/Analysis/Define/Define.cs +++ b/Analysis/Define/Define.cs @@ -89,7 +89,7 @@ namespace NSAnalysis public static string strIOTCarTypeAddress = ""; public static int iStartIOTFlag = 1; public static int iShowCarDataFlag = 0; - public static string strShowCarLR=""; + public static string strShowCarLR = ""; public static string strCOMPort = ""; public static int iCreateReportFlag = 0; @@ -107,7 +107,7 @@ namespace NSAnalysis public static double dTolerancePer = 0.0; public static double dExceptionTolerancePer = 0.0; public static string strPwd = ""; - public static int iAnalysisCSVFlag=1; + public static int iAnalysisCSVFlag = 1; public static int iRecordEncoderFlag = 0; public static int iIncludeRangeFlag = 0; public static int iMeasureItemsCount = 0; @@ -154,9 +154,9 @@ namespace NSAnalysis dLevel3 = double.Parse(FileIni.ReadString(ConfigDfn.strConfigFile, strSection, "Level3Times")); strReportPath = FileIni.ReadString(ConfigDfn.strConfigFile, strSection, "ReportCSVPath"); strReportPath2 = FileIni.ReadString(ConfigDfn.strConfigFile, strSection, "ReportCSVPath2"); - iAnalysisCSVFlag= FileIni.ReadInt(ConfigDfn.strConfigFile, strSection, "AnalysisCSVFlag"); + iAnalysisCSVFlag = FileIni.ReadInt(ConfigDfn.strConfigFile, strSection, "AnalysisCSVFlag"); iRecordEncoderFlag = FileIni.ReadInt(strConfigFile, strSection, "RecordEncoderFlag"); - iIncludeRangeFlag = FileIni.ReadInt(strConfigFile, strSection, "IncludeRangeFlag"); + iIncludeRangeFlag = FileIni.ReadInt(strConfigFile, strSection, "IncludeRangeFlag"); iMeasureItemsCount = FileIni.ReadInt(strConfigFile, strSection, "MeasureCarItemsCount"); iFailedCarCount = FileIni.ReadInt(strConfigFile, strSection, "ContinuousCarCount"); #endregion 读取系统配置参数 @@ -258,6 +258,7 @@ namespace NSAnalysis public static int NSStartMeasure; public static int CarPassFlag; + public static int NoCarTypeFlag; /// 读码完成:10:默认为;0 :默认 public static int ReadVINFinishFlag; @@ -294,14 +295,14 @@ namespace NSAnalysis string strConnectString = ""; LoadConfig(); - strConnectString = @"Data Source=" + SqlServerName + strConnectString = @"Data Source=" + SqlServerName + ";initial Catalog=" + SqlDbName + ";User ID=" + SqlUserName + ";password=" + SqlPassword + ";"; - MyBase.TraceWriteLine("数据库连接字符串:" + strConnectString); + MyBase.TraceWriteLine("数据库连接字符串:" + strConnectString); - return strConnectString; + return strConnectString; } public static void LoadConfig() @@ -313,12 +314,12 @@ namespace NSAnalysis SqlDbName = FileIni.ReadString(ConfigDfn.strConfigFile, strSection, "SqlDbName"); - //写入日志的 - MyBase.TraceWriteLine("数据库连接 SqlServerName:" + SqlServerName); - MyBase.TraceWriteLine("数据库连接 SqlUserName:" + SqlUserName); - MyBase.TraceWriteLine("数据库连接 SqlPassword:" + SqlPassword); - MyBase.TraceWriteLine("数据库连接 SqlDbName:" + SqlDbName); + //写入日志的 + MyBase.TraceWriteLine("数据库连接 SqlServerName:" + SqlServerName); + MyBase.TraceWriteLine("数据库连接 SqlUserName:" + SqlUserName); + MyBase.TraceWriteLine("数据库连接 SqlPassword:" + SqlPassword); + MyBase.TraceWriteLine("数据库连接 SqlDbName:" + SqlDbName); - } - } + } + } } \ No newline at end of file diff --git a/Analysis/Program.cs b/Analysis/Program.cs index 2bd635e..08697c7 100644 --- a/Analysis/Program.cs +++ b/Analysis/Program.cs @@ -154,8 +154,9 @@ namespace NSAnalysis else { MyBase.TraceWriteLine("Log in using the original authorization mode."); - Licence.GetRegisterInfo(); - Licence.Encryption_DLL(); + //Licence.GetRegisterInfo(); + //Licence.Encryption_DLL(); + Application.Run(new CenterControl()); } } } diff --git a/Analysis/Properties/AssemblyInfo.cs b/Analysis/Properties/AssemblyInfo.cs index af41c14..8878d48 100644 --- a/Analysis/Properties/AssemblyInfo.cs +++ b/Analysis/Properties/AssemblyInfo.cs @@ -10,7 +10,7 @@ using System.Runtime.InteropServices; [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("Hexagon NSAnalysis")] -[assembly: AssemblyCopyright("Copyright © Hexagon 2024")] +[assembly: AssemblyCopyright("Copyright © Hexagon 2025")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -33,7 +33,7 @@ using System.Runtime.InteropServices; // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("2025.08.31.0")] -[assembly: AssemblyFileVersion("2025.08.31.0")] +[assembly: AssemblyFileVersion("2025.09.26.3")] //奇瑞总装软件 //2024.09.27.1 该版本增加读取编码器数值功能 //2024.10.08.1 该版本修改了EHY和EH3的测点图片 以及增加了上传IOT时,在1.5倍公差内,都是OK的结果,传给IOT @@ -48,4 +48,7 @@ using System.Runtime.InteropServices; //2024.10.28.1 合格率计算的时候 添加上极差 //2024.10.31.1 极差上传IOT时,在1.5倍公差内,都是OK的结果,传给IOT //2024.12.24 .1 添加判断连续多少辆车检测项数量不足,则报警 -//2025.03.03.1 添加自检报告 \ No newline at end of file +//2025.03.03.1 添加自检报告 +//2025.9.20 更新打印LOG 排查 维修工位不刷新问题 +//2025.9.24 更新Timer,解决刷新问题 +//2025.9.26 更新,解决刷新问题 \ No newline at end of file diff --git a/Analysis/bin/x64/Debug/DAL.dll b/Analysis/bin/x64/Debug/DAL.dll index 48bfbea7ee72ee6df403f02f64fae720f8e0eb92..f72b99e194b067539d83d3276a3edffb6051ffe9 100644 GIT binary patch delta 2448 zcma*pdr(wW90&04S=PPFg6mCXm&FG-22!B%QWq5!QBy<1SB6kNkWvQ`ukNJdV^K$9 z(o8$}7}F#zA0hZa8qv&GC76ouC%#2cL7m2$w5-nA`%@e2k9KC4^SQs@z31HTxy;<` ze6Q?$uf@4WSBr|mB@3sraL!np24imnPTtB8&Xd^&$Ea#}K7GZn0Sz#7Bv6wBFutU` zQ*n}^vMnp+Z6oZ4%VE4v#OnbAMPCf?3bd*)WLX@aG!wnSHtpMR-Y&w%j_}?QVLqLn zH=X4NBNEt$T!{>1=XjgQ5H_3-j0|TZ`HaXAWq3Pec}-f*7f0Fo-pF-IWqWBGpA#7* z`aX_2lM)+=thK>*Wo@v(w$w9rh;e|n-!pC|#?7@l&$xvcx6~X_vOmyUAkd=q*5xDR zt4-F`P|B*U=DVVYyXE!0v{F$CZ3kE^&iP{L+9~0G9}UyA_R;kYjno#@Ka{9d*FO}i zCB)P_F+^MQ{E({88rDRkh4B2C5W^oa{9#N$LjxRQG0~o|zU+70-sr!Y7B?`SQ3R zMJBCirTlv_mb1ulRa|%9R&oE)Ecf79^Rp9|c55s0D*mBcjlnT34ro1W2zJf_R1sb4 zH-`1=CH|Hb{}>yh0W%n0JlixP5x2}aAdGvJE24y3-O2)V2(Bxp}BjAUOaAyHf}**l38dg zG+q8r{7l$}nN+)G$Te=mS0oc#DO5{xTfb1Yqw7%pn(ZyQ#uB8G`dHR0CD=jAG88F0 zfnjdFb+#kdxC^1fbln%NyO2%V&RlE{z9U^|yk6OZrf=(=yM^{4gVe=Qq8vmeX`jgH zC*%#+J68wH!y)9oqidPtm~sf&$&mBsAkTbSDMNm;UX%fsBX@)@8R=o%BFRV(V_b?} zn+>D+2>erZ6$u?h8A--{47IvE8CKv|UFJ?+PE!S*3W@o1%-y_t2%6sYT*e&j<6_5Q zC3W{vaU6Eib#E6tfk4u4-YQNYlr%xqP9lOdQ`Al(mbB5YpXn6hNhN**g!)Ul#q|4| z_A{NvU@9JKIzT9ebg_|(ok1F@s*#E_$ROoeTdk zdAsMZ+#`36xu@9Q^H@X0M5f|AHj-o(7qFEiv$%j#(jdFjbP@YW>GmE%he?lZPSYiv zBw0o65-yQii}NaRQRB zLa)L`viPdFia^pJhtqToZAht(9zqc$w+#3?oJ1M$b;RrPgm?q}sU}0bfx#ph;tiyb zWQI49Mv@ucLifVhgc{Raiul57cceBgqHqHr9|rtu9uL z4WwABifU{nopQKX4R(_5I8@YNKdHYs?+(gIBdl%}cW{y@L%fTNBpKpe+$5>0i`~OL zQjn_R9v+b%iVSPAxCB-i}^lAyeQ%U z(u$`Kew=K`uH!3rsenF+i<~|vApNL;>5kLdizxu<#D+*gZM5M-&NwxXBD4c*1A`-Ov+5sCQV3Bn>r;mDk3T-HDO%3HoedI%+VR~ zQ>LU(9Fs9UaeQVvzf%^hw7p%pu4d0BZY^)#cqqL}iEANKj)Ru8vawNoNcn5Uv&-k2 F{sARVb4vgK delta 2538 zcma*pdr(wW90&04xh#8^U4pBKvZ8|G8igotR}n;IRLUohd}C%#+K}SSt#s6-Oro?& zI!;Z#GT(|o2B_7TRx=5W0V)bAC8&t&TmNvxKbp?j`Y zDkdw<(d<5tj_JXI`8P39{f3KS2|yRA4~-2I4@-_6z?SgWVh6Hi{4;O+Q0#H`kiQ!z`?toOotYJj{Oyh&>UKwn zUhZw%MZ2ed(c2Cc?OwVXC&%;_?LKuU`?Cl#O{=C$!t-SYW9 z`WaD)90XXc&Nbpy_1nV#?Tym)jQCDnbM#%EyT;>9+eoy+Ql`L>xq3>GA~YCVs|BZ!|{>fq z#zT{;SV6_9q$b6GtrPi+O8_(UO}uL8ZMKQ;7M!a(WKT9~CQG%tAH$~@ zDh*wY64aAwg8o)Za3s^Hol@gXrD!4bw8WdrU~y*|#d;;)RE`9aMd(}P8VY$FY{o$> zpjwMkWIBlTBs1G6)I@RzY*oKQWVZ3l!PX*E6~>XqSa+*c*hb1%%G4vcmF+f$uCf=I zen7VzLwCf`ACO1-j=9)T>?NJ=x?4R8ykd;}QRq0Pk&^9I>aVCK9Tz$MhJvZa$Splr z;{*z(8T!IrtDZpKbjbA!vBA=yR%6|CqbLKe!O|IqWTd~No+Kmv9oaLD+A5eVCt;dp zs7&Y&RFY)ewP-Tr&9DxwhAcyToaQ=sgv9!VmQG&ErYNoH{#n@KW@^Vmh2(!*)KfKt-@9%({{NFCjs=8O1=6d-CBae@>f z<~5_vklQj$6r0gR#bu)SCt67BMeR>`NIMi4`wRC;C5nc>@R;;iyyzt;xyCVB{WV;I zjWosXG`Ap#G|QeQ)QjYn0k@(*Q3l+KXhYr*FC&R+GQ`VBCCLykV=PH#cmKZ;E$q&>utR+PTxL7+lX=s3kc5Eh{ zvAfuH>?C>Y8m^<1^pcq8K^196fLntHKM`e!H}D%thIj*YBu#U%n`k73YZ`8%g>+A3 zcnjA_5Vc#lPm=lGMh8jedmD=Qt|9*KWWM3J1Ai|$76n=@cQEEj5qB}E;?vBI>B{>K zUUcA=??_BUIzM{A(Io>}2p7u1c=3yfG=A(rUmMg1vj=DI&13~Xit$cmwuQ`-UoismqMAC)iV*?i6QYLb5X{HN~Ce zOmpPA)6zY8`7aJka!(&L-IMg9J2xdIHz_IIlbWACDA(h54@^%>Npm-4G|-;lr~T}` zvLoL}X_(sNiKzLcU)!7sr*~v$|6$UV@2Ay0ET)eC`(K(e*3llj$=~nKeu|=u8l2TxiiGrDBR&Rx?-YN z4TTvSMLaAh{2qOY)9+Cs@qhG*8UZa|+AJ%3bui|f}w3(&`K*q=l{ z^Ax3zQh;r86NFJP?mR*&GYYB(W|>R3%RLlE>>dF#i;l|FkXjJEDt>3^qocH!2gQme0rcWt_B%f{|vx%izO zPyG18b5bjBiqy)s?%F8dAGJ?SE*>bg^5#peZ0oL-H+?{7$B$geIV#2SX^>*s*j@Y@ zPZ<0+FtB_g1wBV0%&%E!8n?|`%u(}WNpSZ3WR&Iee`(seV%u#?lSGRO&!!UeHLVxoJTR$_uDBa{24YDEGa-ja=+m=t5b!aJlLi&*6*W z$d5f`1-yHaouc^Mq8OBtPg`uKpWzoS4riONU1xexYkG>e@>{x%7YJfJ&QLTQ^dklCz1# zUG>i9imv?{{SJoqJMdA!4$iNPFyHX5H7Q?sZLaG!H-L6%Zj$nLJMa$p1>jviS{Z>A zzg%gHBvtEQ1xoEhs;2D)F15Y+v8o8%kzrM~*hh425Kyj6Ffai4C~zUL5AZEu2$xqy zCAb{&Il-K8MIIqI?Q&spgh45*HlXaOFQ2OlDT@G;KG}iK0Hc7DfsX^H0AqlKzyZKl zfDT|eFdq0zpbNMfmA(+x1AzyDLx63-p};eW;-?HpMLPWi&*cKM zU%ci(C||A!3Vjl7a>`EurPEIXrAxoyfYmm0)IVsmbZxe-9j$A}@RZdyb!a?KT@e=g z@4Dz&;3Md0Jg_ft0`Gumk|ugy7fsYflXTH!zO&j!dz(Yo+*1AImLiXD&8?Qr)InA6 zK2A?^^t;KF%@a{h;Fa&DQw|?Tna6kD9YQmC(E1^!Vmz4AC9z{7-q7E#58%4>R$9RO z*JsijdIC-e9G5d}>1`)p0;|CZ3ORD0lIi>U3)1w(4~C zaH_Z)OZ_>%#;P7q6~p5wobzhz)W&btq|q3AGWJb9SwRvIWJH zgC>Xs2|0WY*D!08GeuK8Mex&g{%Ucm_+vc9VY20Q4or3j%4Lw+#MlJ#;lDvrnJQK# zPT^Lix?jL&(lYQ4YY`rmL=04*xEk$8WJxI?vuRgog8$Em3NF z3XiUh!=U4~+W72uK2;t5>ZKI!)e(om$8B}cHC}}BmbZOLhYz3J>aYHg!iPJ;17Z|M zm&2-blCN*|Vf!|JIT`1+II?&zCSLX7`M4OG%7s_M1NtfbyR7Wow9SDDUP9^eiob+7 z@S4Axj_F>D!z4Z19aPi2a=ReYeD9luhqP@P)**AJMV%kdqZ^WV#q&!!a915wanmjb z%1gUWnA$tVm7_60;tM|f`EGwKadlGxXEoW?zyvOAa!ROadQ0t>z>6o_#Nshz62r$( z4<56}LjBmYr(P}WYU;(VW(yT^MsvMsXM%oDJk!a>J@;B@C$2B&hP_rg$%pnPqr9=V zUJZ6~O@4&9I~{!<*k_?&ZrfK+BYAF1x;oOyho`;F*ITVTw#CFLtyZew?ACO(qO)P3 z>7r8~rzsac|LJ94&icR~57xvF8fgU6eh12g{f%meiwj?|@s0f<)WPNtPe5|+Ll;Uq z&}cg7);rmlhnMEe0Sg`E%LkUz8J>O6f$}#88}W&paVQyO$)Rm@nwsioQn7o z>O~yzA2Zbx$=rTqEe9U4!w>fn7fR2OnKXmjjPc*k0}>F6Aq z&ygP$;I1tDs2=N|aBPfR^u@6_^XXD@n=-cK<4f$Nn}8D_Q;90<2%#F&o>D zXJM4t#|z|YwI2)P>$p(C!#*xBYfD2)9#_5{#790}s*Z5+&J|&tcVYw<;k^^Za6k0q zWc8q%|4{7XS^$+e>(D)Cr7~J$WsOIb=j%kQBm`hPi&+Hr|{HI!s=IlO6C^t zt4E4eZv4FabP8>5{^s;M5p=D&j~g;%6{Wk6>p%4)iOVN}i2E|e)jTehzp_?oYNyrs6tv_7hyS3o~c5I=Y z8)=|dA?o6>AD)dTf4Fx^Zr2f-L@Tjfy)G4VT~JntY6-$?Aij1{AZ=>>Z-kxC(C4ku3#g}sMvKZ{BXuIf z-gIwOs+W_^R|aZNX^k@e`a-Loj_s^cqc|sZG7!=mWk?aK>14#9RcWZmSV1fU8Qk1P)wFA|gn*5@mRnW;@BuHzNuhAD;b!!s7Cuq9cVy@H`CF6^m z))^b^4^(2wQ{{ha^nUSdPZ>G&WOX#Tr|nu{SifOk)TSNbrT7|Efgzu;F zSO_czzJ>3>J#qF%+f7`Pn(uLa6{1XIITUZU(wK=iDQL)qWje@^g_hefWYU#KGiLRI z;XJZ8EqG6Z++!m1p8D#_FnZJ2hD^N4VnY@paXs}H&#$MUYd26|HKd0K-#`P6X7rGv z4|Ek5<+@&+F)P2=m2W7)FH`SvMn^;*{b!7b1i9gS;+r)TYjBpxL>qNXrj?xrhY_6# z;-9f1=pxbJuriPPGe$&y)?N0})ax=?q3ptT)(eP$SCJRC;q=EDhSP-eIJQ9fjeZEw z0{j!U!eAis5=w92a$n?3fbu{Ui3bJwH${0CI@zZi{RaT|K_3W2{GdFnb*(5D$0akV zp-p2SqqPlWivARq10lE-sUfP~V*@OZ=uq;&@FCei4l$yEd|GoF=$h|6{nxBzJDL2= zEr>tm(b8)9fQG0Ka===e7Xcp<-2cou;P;cL&)Nm_xD0g9Q_r9Wf$oDqR|`=e1iGDp z?hP8_F2S3A9cM0f8AhOxtj6NDYl6lO1>$vW^MP` md_MU0*xU!P@Bj4^9PuFb{ppXA{sm*-)vDppcVCX$;QPNkoz>w0 delta 9097 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 x9o_=1开始 -2025-08-31 13:37:28.692--数据库连接 SqlServerName:127.0.0.1 -2025-08-31 13:37:28.693--数据库连接 SqlUserName:sa -2025-08-31 13:37:28.694--数据库连接 SqlPassword:Hexagon123 -2025-08-31 13:37:28.695--数据库连接 SqlDbName:NextSenseStandardDB -2025-08-31 13:37:28.696--加载配置文件——>完成 -2025-08-31 13:37:28.698--Log in using the original authorization mode. -2025-08-31 13:37:29.816--软件授权成功 -2025-08-31 13:37:30.943--数据库连接 SqlServerName:127.0.0.1 -2025-08-31 13:37:30.945--数据库连接 SqlUserName:sa -2025-08-31 13:37:30.946--数据库连接 SqlPassword:Hexagon123 -2025-08-31 13:37:30.947--数据库连接 SqlDbName:NextSenseStandardDB -2025-08-31 13:37:30.947--数据库连接字符串:Data Source=127.0.0.1;initial Catalog=NextSenseStandardDB;User ID=sa;password=Hexagon123; -2025-08-31 13:37:31.262-- 进入显示车身模式!显示车身界面。 -2025-08-31 13:37:31.734--启动PLC写线程! -2025-08-31 13:37:31.757-- 进入解析CSV文件模式,开始解析扫码CSV文件! -2025-08-31 13:37:31.759--连接PLC.... -2025-08-31 13:37:31.760--软件首次启动, Nextsense EH3 CSV读取路径存在;不清空,读取NextSense生成 CSV报告路径下的所有文件,路径为:D:\cherytestEH3 -2025-08-31 13:37:31.761--软件首次启动, Nextsense EHY CSV读取路径存在;不清空,读取NextSense生成 CSV报告路径下的所有文件,路径为:D:\cherytestEHY -2025-08-31 13:37:32.541--Right EH3 UI Refresh tmrRefreshData (strVIN.Length==21):CarType:EHY ;VIN: LNNBBDEC8RDA23997 -2025-08-31 13:37:32.692--Right EHY UI Refresh tmrRefreshData (strVIN.Length==21):CarType:EHY ;VIN: LNNBBDEC8RDA23997 -2025-08-31 13:37:33.435--显示右侧EHY车身数据界面。 -2025-08-31 13:37:33.823--PLC S7连接失败。 -2025-08-31 13:37:33.825--连接PLC失败 -2025-08-31 13:37:35.687---------------海克斯康面隙分析软件程序关闭--------------------- +2025-10-16 11:16:30.678----软件Program Main函数开始执行-- +2025-10-16 11:16:30.681--加载配置文件——>开始 +2025-10-16 11:16:30.703--数据库连接 SqlServerName:127.0.0.1 +2025-10-16 11:16:30.704--数据库连接 SqlUserName:sa +2025-10-16 11:16:30.704--数据库连接 SqlPassword:HexagonPai=3.1415 +2025-10-16 11:16:30.705--数据库连接 SqlDbName:NextSenseStandardDB +2025-10-16 11:16:30.706--加载配置文件——>完成 +2025-10-16 11:16:30.706--Log in using the original authorization mode. +2025-10-16 11:16:32.220--数据库连接 SqlServerName:127.0.0.1 +2025-10-16 11:16:32.220--数据库连接 SqlUserName:sa +2025-10-16 11:16:32.222--数据库连接 SqlPassword:HexagonPai=3.1415 +2025-10-16 11:16:32.223--数据库连接 SqlDbName:NextSenseStandardDB +2025-10-16 11:16:32.224--数据库连接字符串:Data Source=127.0.0.1;initial Catalog=NextSenseStandardDB;User ID=sa;password=HexagonPai=3.1415; +2025-10-16 11:16:32.651-- 进入显示车身模式!显示车身界面。 +2025-10-16 11:16:33.200--启动PLC写线程! +2025-10-16 11:16:33.205-- 进入解析CSV文件模式,开始解析扫码CSV文件! +2025-10-16 11:16:33.239--连接PLC.... +2025-10-16 11:16:33.240--软件首次启动, Nextsense EH3 CSV读取路径存在;不清空,读取NextSense生成 CSV报告路径下的所有文件,路径为:D:\cherytestEH3 +2025-10-16 11:16:33.240--软件首次启动, Nextsense EHY CSV读取路径存在;不清空,读取NextSense生成 CSV报告路径下的所有文件,路径为:D:\cherytestEHY +2025-10-16 11:16:33.322-- 数据库打开连接失败System.Data.SqlClient.SqlException (0x80131904): 用户 'sa' 登录失败。 + 在 System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection) + 在 System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection) + 在 System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection) + 在 System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) + 在 System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry) + 在 System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry) + 在 System.Data.SqlClient.SqlConnection.Open() + 在 DAL.SQLHelper.GetConn() 位置 E:\1AHexagonProjects\2024\CheryFinalAssemblyLine\奇瑞间隙面差总装代码资料-正轩\Code\DAL\SQLHelper.cs:行号 29 +ClientConnectionId:de40ac78-3ce5-4ca0-bbad-3b7196f8d455 +Error Number:18456,State:1,Class:14 +2025-10-16 11:16:33.336--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:33.351--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:33.367--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:33.385--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:33.403--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:33.420--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:33.436--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:33.450--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:33.466--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:33.481--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:33.496--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:33.509--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:33.523--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:33.536--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:33.550--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:33.564--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:33.579--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:33.594--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:33.610--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:33.623--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:33.636--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:33.649--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:33.663--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:33.676--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:33.689--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:33.702--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:33.715--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:33.729--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:33.743--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:33.759--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:33.773--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:33.788--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:33.800--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:33.813--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:33.827--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:33.839--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:33.852--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:33.866--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:33.925--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:33.940--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:33.954--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:33.967--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:33.983--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:33.997--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.013--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.027--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.039--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.053--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.068--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.082--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.097--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.111--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.125--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.138--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.151--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.164--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.178--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.192--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.206--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.220--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.234--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.247--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.260--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.273--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.287--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.300--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.314--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.329--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.342--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.356--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.371--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.385--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.400--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.417--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.432--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.447--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.461--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.474--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.490--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.506--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.520--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.533--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.546--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.559--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.572--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.585--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.599--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.612--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.625--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.641--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.654--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.668--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.680--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.694--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.706--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.720--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.733--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.746--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.760--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.773--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.786--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.801--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.814--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.830--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.845--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.862--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.877--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.892--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.908--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.924--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.938--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.955--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.972--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:34.989--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:35.007--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:35.022--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:35.036--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:35.051--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:35.067--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:35.080--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:35.095--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:35.111--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:35.162--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:35.178--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:35.195--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:35.219--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:35.232--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:35.247--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:35.261--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:35.278--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:35.822--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:35.947--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:36.001--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:36.065--PLC S7连接失败。 +2025-10-16 11:16:36.813--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:37.093--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 +2025-10-16 11:16:38.909--Left EHY UI Refresh m_bgwRefreshCar_DoWork Error:ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。 diff --git a/Analysis/bin/x64/Debug/File/AnalysisConfig.ini b/Analysis/bin/x64/Debug/File/AnalysisConfig.ini index 24669cf..04991d1 100644 --- a/Analysis/bin/x64/Debug/File/AnalysisConfig.ini +++ b/Analysis/bin/x64/Debug/File/AnalysisConfig.ini @@ -72,7 +72,7 @@ TimerRefreshCMMStatus=3 SqlServerName=127.0.0.1 SqlDbName=NextSenseStandardDB SqlUserName=sa -SqlPassword=Hexagon123 +SqlPassword=HexagonPai=3.1415 [TCP] diff --git a/Analysis/bin/x64/Debug/File/PlcAddrDfn_S7.xml b/Analysis/bin/x64/Debug/File/PlcAddrDfn_S7.xml index ad91ca3..ee9f729 100644 --- a/Analysis/bin/x64/Debug/File/PlcAddrDfn_S7.xml +++ b/Analysis/bin/x64/Debug/File/PlcAddrDfn_S7.xml @@ -23,5 +23,6 @@ + \ No newline at end of file diff --git a/Analysis/bin/x64/Debug/NSAnalysis.exe b/Analysis/bin/x64/Debug/NSAnalysis.exe index 7e5858d7a5bf21ca45f0ca46eacd89f5dd582b23..ded0ee0679521f77a1f838a950bb89948a741858 100644 GIT binary patch delta 281528 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 diff --git a/Analysis/bin/x64/Debug/NSAnalysis.pdb b/Analysis/bin/x64/Debug/NSAnalysis.pdb index eefb2ab5b26af7062b8cf08e2824458ca10af92f..808c0efc1f36d56d26f1473187dd89b8ef26d274 100644 GIT binary patch delta 166701 zcmd?ScYGDa_s6|6H@Qh5luJTM0wD!Lkrq0LbP=U1A|PF=(m^Srx%95U1qKxrMJz}! z2I);~R8a&(1Vu$f1x2OvywC34aPbS@Vt&u-`QzCaC!d`&XJ*b$IcH{e?&9B==s#0* zM#)^4J(hLGXW7?<%;b3yAFEk<#LSl7)hcYXS``-S%@MG!Uk^jz`gMu_TFr`#%`xY1 zyj8gydy~Sx)hT=Dw64ByUFy5<9q3acb<>2Qo-qqcE^P7eZx?@@`Sr?r^VF&WjiZz1 zoLjT`&#fOVFVSV>HybuC3wz<=67R(p?7jQ_;rFCBnS1vrTd-JTowWJl!>=?6OCIy} z+Rcr+J(uVGqCZ@Ss(o$W)VV)LEh<-G$ZA`#B!csFff3IH}zD>W;JHseOd%(#WqfQani=KHLpIi_42dtpI^|W+M=k$@CvPVJy87p_a?Q! zzwdjS>4-e3hOr+5gz~i|^ElD!1uR z@8lOo^K|Gtap%4*pJonE{-RL5gSBUe%|25y(BQ7iUtZX{vfcuf^P3#f z$d(1JR(XF`vj#@iem)sSgPI*49MWU(kPahz_vqhi_~TvsmmAr;YyVyy8ul3S*w6t3 zJAAun;`cLO`p&=M^uqDq&G&ydcg1(>XMDe4bYRfDnELg*4(USo&A$?Kkd}?7?=(6amfCdc6OoX;$8R|%@t@belwTqn58rZ3LZH*w=zp$2VB6TD z*(krv_-sxUwv8{Fo3_-ss;%%JWO`2$yPD(* z+&3{B)sdx5+&}LVqDnSKq^OXZ?Yce}ex3w_W&1=K5QwnCUO-?=%Q8s&)GVins*=P~UuaS)w$vdrVU^nyO zf9$3V3M8AWeX_NzTresk{r^CPT!DTgvtuMsqg>z`S^VSL2<)2?m#yAl_B|C*I9ufx z|L46y3Xcmk9-oa0aP0N5nfbDzg?NrY=Rlt94NTjG9h;daaC$~|`b1Ef?Cks;2xMcf zZ+^{)_&=HKw|}5f!@HZc_+Ra%Z7w6-y)-kxACdo`cTbbIBgy}{|F}LU8-)jEzK}oQ zpIaas<)1bA1KJe$=M^A2n5TMYs}jzd(%Dd8(7fzSY`-V<>1DqrEKY#w2FJ!|w2k3mJ*0_kgiBs7PuO(aJf4lNUS=NB4nf1zL ze8cOMDbTnG%lZp)ucU&O6@aeATh@aKmbE+FvTA!RYgul~^5(Iu#)U0wE_4cNT*OJW znAb8<`7G;bQOg>c!?N~5DLE}`6r>Po19eDpWaaOY1S`Y3MCMD#U@?pbp>QPgBuey+ z>kt`~iMFf}+Oj%Pcy9{X4{hPT5WF%dIR}!AOr=h;6{0q5{;c-twM|r%8v`=&D{VZiP zK=s|o98cmgX`&u4m6)|4GV-H}7wa{teM|+Et`MlZAUfmn%kSs8koat_I(Df}8Ez#shC9*V0hMloQ zh6+n1xWW_9_>)9fDoK=(xKLSXLs$0nm!`bPO52L8#D&UA1-r6&I!+(foAT|N7h#DE z6_#3cg@-;|Wv65;wJov|7b+{Y?aE#+`E$I;N-K!0#D&Vr=y7GcX6(&TOoU}viLgY5 z3QH$)h3~!doi{{QI+vX>aiOv@yj3BPXA+iz|D%*zgvxL_V{Nx7_ma!qi zMBXGUy2wggMyRmZVOO|(7-Y_%b>x3s^QZV{HqP~k_yZwNPD zw8}`v;)Fz2;zDH&9oEfw`A7ZgimW&vk(IbmS@E2%Y{tCVuh^Y!F@hp2k)guk0$t&L z<15gh!Wz0MONZMWo3?lY=-SL4+kTR9GCL zn{my9uh^DN9HYoeT&S!#OINmfp)b=VUvZ`)D{-N+c@n9AS2(_X`auzvNrni^JiKHC|$X``Q?uA_`qu`+7f+rMFv?swQ>kqoLf00>YMIj%a!Fb zuY4936Y#GptZRj>ereSh<&D>tH{wtrZB3d6ny)F~D{#nzsAUzflBgxdm}zyFjtNX! z6YYx+MkNv@A|C}7t!bg+0)MQj<}FM{tq++_qgBm(aoqFI`VE=g5IH}+_LHdAc5-D^ zvDH}J_nkE=qMx$7ucvC$d9*lYnZod9?6>*S={zMGeq~h`%M&-JUZ%nu) z%%3)@X6lo`ppE4tK1FUaENLECCpV@>e+FySt4>vz19QCv10^<BUb5%VFMcUH!tJCcne%A7kgs@1MysZf(_uJOM`voQMT@)zyOQ%5W_E_&Rf)@#H zFXy`$l8Qvu7IR>;Drl}W^F*pG0pE_Kz|!qG)fSW9+;fM+h^}N=rGv_e!~^P!K#v_I zXw$$mJDThMuLh0-lV1&#+c`zAdNr_qXHQLIq`dcuN9y~FH$8Ey^X@99JomijF)zPM zk7)URN&UoYfsyYw*Arh`{n7i^lxOcEkJhc91r~JaVDp*0pM*sQPJI*W z?TBo{guu0+Y>X4rZ5+3?sd!Bm|=88Z^bO<7&R;$Sy09ef0=3U&vbTsx6-Rp@>w z9x8BCDNfH&R^`CV6*2AmkxF#y4@xNmKq+M)D5VSn%YcJHDQyVol+rv{N?WiL6qi*> zLo%eBSqR$U6flGMRL~EW0!M?TgIEm|`5M9S zJs=A?e`9bg_y{--#9`U#7&?K4-}y4e!rJN%?F@DaI4t-c&h~Ad{%y|j*TTTLGIz1%j73v~Ols!1xX!t{fbyy)NsUn!SU!1DM$rOYIH zmh|hpf|BB5q_gcbUHhw;K+?s^>P+ClitTA-zQEv1X}(dx+{87JnYAm>>T(^#>Rm|)gk6sHo+Isx`vQrVQ+zMpMs()o z@^c1Kx109`c3m#*+k6|bdRNMOedmU-E6_<*B+~i}n7AX#M?xr>~{>>fc86 z+_m!FzYu$5e<1C8itmxzh)IrXuE%;WAUbY;U@xNMZY?^ep2CBM^H7WS&v`HkhTEDC8^;obj@^~t3+WmM&0dkN@$aO&e;es@x#_HV5Pb5WNy|fvKY1I$SMng37s2@l%^?w-e;dJ8c@bps;N5i4 zOvp>qZMu!1-Th;ID4GxH;|EPSABrBowY1$Uwu*2J!q*R)qdu~}ej8yKD_!!bNKc7< z9<$}3jx*!(sgk*JnxgycGr#2X#+%kLFo*6lPsgbGQI3C6R&pSHd5k$0qbf%^ ze#B*!iG}6(43{-ZSdM=X*68<(n!~ZGWR&9tT&cqOk#Y>Z%jzpE$Dq5cjlyz_x66ty z0LwAbE~|sE9DD4tmI%wSx-RRAupIm9vYHlzteVR@CM?HvxvVmAupHauvPKEZu|O_sx3C;DWqJv)j?R!7p1n9_&K+f+rAvxB8)b)?50{d8zv-Jwj~|)C%uQ8OyaP%0 zb*f1#rqVRnyqM~wdYPrg7{7yvdbpVRx|mAQ;C;Ko+7R{1uCN$0u(&E5F@*S>#hsnI ze4#scvJ57#1)=zL6!DEPQK2 z4WQy#%ZB;LJzUIL%B(Oecj}l{>^GPYy+}n)A-Q!GJX;snNocqV(OeeW-!TpdpGq<#=>TSvW$T;(f+_&O>Oq|Jm z2Qv3_KRM1clKTg^pBZPKz5|)o+|P?M>+hhEyF2TI8mt6TSq{7FgvV}LCrE5bt4vnx z5GPS>*vYh!n`q=si6l0S6}1~X#!1uwcIb*^@=b{(R#qf#qM1&j#(yhm-c5-lR!X|D zj4`##s;?s^@|-XA&{;dg9s;XdtY4%eCK0oln19(K7N)&LJW;lYy_1nU(!(@A7*ExtOjhMNC7AHDlH$ zv4=pQ^XB}X{Jkjrrd{HRvP&E>odgqm=|Ijc&Co)&iJyV z!IsL158B91S7qkD&ywbSH;ubd>~lHpcIL9c2zG`W_jd9YuIv{tv-gXq1-UX!4j1mf z?ic?Wl2FFvGJC&xqUl#fHHesj2D$s_K>1%fn%Jti^qDYf^fBeCs&c*>eQp#%uhp0Uj^;nh?nHN(`Xrc$M81JCYg=Ai)tU+rk7X|-$B)D#bG71*$|ho)J6 ztFAtgx(?YbrdDt47QfTW+;^vHuHWyK`TU*gn$o%Zn7!Ytk>1LzJ8SgGjIXU~`f|t{ zC%HQ1F`ZhdUFt4VyrnAYxl7*j1P68(n5q?nxmK8YqLo^vMw{aIs}ex7`_;2*wfXXX z^_W^~?tMTtiDIM7HYpX&IiHR(D;{8Dc(p0pT2<3)qs`t2b$q73wOXLOcT!nr3YoMv zjOJS0|6a&+lKZ>3zg)=7m3vH_mr2iF?xQht-W>Kgp{M%Z_Qsf^52<8tUD!U1!b7TN zG?vdB=ZcILk(WiJKJ278vr9x8a9`3DIcMk677=y|z2(WJt*RMF`ZFxDnk&+EiMOCx zC?bszsU2rNYO6}?GllHkhDApC}K{XEeweb-Qc+FBq|6yk$nZ%Bxt)R zH<84K8m=6U!6*#7IJ=u}BHvAkB(}6wE-N<9NtFDzL`gR#lGxBhC7ncRe@j&UrbH4O zny8wS=nmL-u#4xaSNo4qWPWT(s+oPk+2c1={`p|sYSq&pPvrQMZ*Q3Up;@#C9 zK&$Smpqgp=bf>3&Y6kUC51E!dRFe8e?uSKQDl6TU9<^;L-Nn;W`Shi-ra({iy6R{) z^(2dq=7*kYqI%j4>ZO{H;ig{deb1+5E%VhkD$XqEtxA&DhrLw;NtnA2!-Ir<)DTjn zKT7(=nH?WhZ>Xq7R%v^`XOuZmDQh$U@Bg!Q>9^L-N$P4hH>jNnYR8`U zf7EUs+U>Npo7-0wG2*&SIcXx7JnS*DJ5P4^ ztGWGEu}F4iomQW@j8?DHU-@`@*Q&p&q)$hi3H? za{6qf`YP&c_PWK;v^A}Awd`)ErDcOtYHXY7__S)EzB8{pttxp>Bl+=ebM$Fdy41%(Nq1*yd&nES z=8yNY-y%v!+-}Nds1m*}g5s{<-EMja`$R}C;&`{47c8xM z{cs5=&YX8G7-;AHL~(E#;WUuRvpwNn0p3k`CDw$IPP*C1~Jb{(7*29nm!Uk|AxDlKWZUSEfH=7<~RObw*l9km7mR#~)N}fZm9f->9 zPLK_G>phTTSJp02`n#ZbbSX1$Fq|KJAHL-C0Vr1XL$D$!a#g{P2v-9?wyZ|}JGt2n zLk!Ix@GejU>w!|hJ>XujS&-if+()<#cmRAD{KQNis~)i%a4dEI6>QP_1SnSj6qp2l z2PT83L1~L0K;E5OKY|UxpTGyfGoWNEYRH=FXTpz280-_|%VOwP!h^uG;OHQKyc`P> z#)M!5hR6klwL z_$OFiWni(nVTEX209hg08C3=^5@zXVW4$0UW3ev5XSQO?-3?wQ%pAlCVkH7%Tv61~YrHApTcC1-=Pta5?A!-vPtGcR@~Y`PYM9 za03_t?gAsh1E3sdISA%6Ka5w`qpt21W1_6m_L}lAg-X9X0>*+z!36LNQ)Hq_C?%)% zAKOoOOwZ-1Cj=vfST#x9&5vZ;u88 z`VJUuJ5!|P?M@iDg0zx;&o}l z1v-L{5uP3l&j9-po(XdH$p0$XA6yuWUj)+h{?CG88o?S!m`1P$fzn?GgVJ9`F$R-0 zlrV$IdK|n?`PLKM(2UkFkS<~k2c5UeX^2_8WiG(0_Ad5)9J?GvtUC$gXSotB8H2oh zxB2x#_>YC~YiIEtxmtEu^7R$rH8vy3_T8bAmecfwyhUc#8#DKiimoxv&WrF z8wan$TD{XWpP~jwyutnPovf0#C!5n#RJ2C|k8O=J$2O~IQ+H`tBe7y%t2^Zh15JKSH$$hhKgq)_p03(^R>KUw4)3my@64R=jH;SkQGSFWmmJTR zD+%gN)s2E?Lu;Vj&?)E&l$2S&+P@^P}xKcIGw^(xH ziiE1;Gn*z#zh9+_vA0%y6>Idj%D8LvRjRRCVSZS}`J`>8-D-8G`qs=5h%g6MtJSPX z#;;*T@}#-Ah6(6fnfI<$PpYVn^iZ+XiE_lioOnld*H4zUm*}QTrYf1@Do_Xox}(5w zXa@8qv=usxLT%=*Lm@T|*2$(px<$WG$~1mgZH#Q4F4@yXlUI2QnPTfz>&Ou10N5MvrOz%*`B5+hVqDRzpNVyIFg0 zQI%C|^Wqk2V}wcH%8S~_tt{jMa^FBL&3t^Ts-q}m?KWE?e7kC)XIBhdTM=&tZdcuz zpMSPpy^*t>{0K;{qd~-kSZAr4u%eb#7-|T0fMm`!584VHhNPDif~rF;p@GmOXaTei zI%cncXSO^xcfX3Q_OXIbcC9;7JO{4wnCzU%H-)h<&P(|amhD_mEev(;|&r7CT%}gipTL)A^kx;32J-QA?0NbAA zi?St8B0@1&52&f}7SmEkL1il=lC`1pI`h>})N$o|nd+E_mJ7h=z*o$3pQ>}kUpV(KN1NPs6C~-%atK{t${|uL`#$7``k_YL6#`j@8)W@{cs^xHb zWOv2AhN_if1!eRK)<*NXR$Hr`)jmsmIe0IZXx|s@=b`;7(f(hmSRA5zJ&N}AZmwdl zIMzy5;QG?CH&t?L(m0~Zx?)Z)(lPfx6RhQD!RLvd38J4h3uKOK1;FB*3o2!O1674a zu#b_JrE_SFuR!Nh=&WzGhcOs68~zuS%uc23ut=NmFKdUzN$S?9EQh2<1*Jv>|5J@# zLA#PE_KLfcioSCi$>egUi*i4d5<6z;c-u*9V8GjDGep7vG$nQNQdwn$PDy1dDvuyj z(9kKVOhsi%DpSz3CsWeUaZ@*i zs!QQ#62Gb2PD+Q-be+T9@&4~7rNKtN?WEMn<^Nxk($LzLO@cR5WKzlkAi;G2pVLd+ zt1oqZmnY1WIHZc0*_AzIGQ{dU>R^bD2luXmL+@$EC)J=f{PInpDqW1>q8xC@TaQHxDino zUUjI99hcuKOnfP*G*s3`kn9*CPi}u742Nv_H7m2351&s%QE{qEwvN89w3`WH)m7E&8DK`&;5wX z>Q0imqB5J39FCi0<%vm_Io$^Y%OJ+UHH$^LN!&tHoIETJ_}5{oDD|VkC0z0I0>i^U%twBQFy&MrxOy7TZ4J*0Fw#t1WSPLfz7~O;1KYA@Hy}U@Lljj ze!=bkikpvMTm(M`bMW}m-SdLG3H!i3Ain~!_JX(pYajR=xF38MJOCa6KLMFCTL(c- zj9Q<97eUGI8u%GuPMX-^6!4JF-~}8vpA+#Ico>`t9s%D5nd$pc%K8HQ2|NZ~0KWut zF!enS<^*kp!4rgi;7PC@_%%2J{04juJO#cBehVG}zsul;_d?e9;05qBcoF;oEKc?Q z2(|(#-2W7K29)0{{tUhg{sMju{t8y1ru_?i)ui?9dG4ORy8fK@<=uLkBNJUkd41ycR~ zr@(yRGB5^Q9*kcJ<|n)gEC8;K%&@G2+^m5i8m$lFSD+N|9asqd_h15;WF=e0n1UB$ zVqMI-54sn60BQlXhFU^*Q!R3ky*Otw_A<5 zKJk__35R;iSz)+q@s{l@s{gA z@s<>3d&~8pc*_l-c*{+oc+1V8c*`xIc+0I|sJGlkSiI$SP`u?15N~N^NZW|F+zCUx z<%eLXxBQ5(c*~DL@s_*6P;a@1aHzN3OIW<+K2W^nelXNqenMEh-0|VX$x(8|mwS<~Nt)OO5eY!F$B})#lJOSMa-48W^8bDQ` zZg#x9DZ_&Gx5#JQL`(NaeDa=tul)4kD1=WK(K?9&_P*p2A1C5-g zxEE|5ysrp4PvSh~1BA;$wV|ERB&bn{()Y6Ps$_>9+cCzzF9o+OuhInNDrb!g;rF-s zb}k|yB#9rwUskcd-{3syt#&KLTed95)E=4*ZN<{x+FNe43v~WGgcbbmHjb#uzwZ5s zBXY!*wNV^VjpaBVtcWGJA&B*()^82wv^b?bVxR z8aJGH)mzt{Bd)B5cHOND)}3GjG8J^{Zj3dSesQb1>wGxIN0@Gv38|e;e)L|DAs^%k3G^l{E;6`OeTdEynu*I5@dEsyh_bcJbmT%`g}9p`1( z3bW|AD(bsul9RxFOS8h9E95O2mlW>2MwlNGEgM=+v?=qIiu9SuPEy%x$Zf}UeLJiH zx=;Q}Jru#KX7BmQ+AQB6emA_bCsb+#lL_zD$<9&eH79uH=V6qbV)mZkD0ImwH>es$+!4bMeCwZAjjdKDz&YU=@DofpR3_8wK_?q{z)Md}F)$yorCrG}^ zsvy4@HeJ5q-6<7#{2NtY7n_)wa!U2|=<}1!=7T!ky!Jgm7`ZxG4nRMxOHRpbep(&R z(_X&eC6{~wO|HgJnKWLtLfxTp(0phev>!SJU4aUfVE+bc3U!CZLGz(C&~E5#iIw$6 z-s+viy>#UVesm|x|K`Py^G>26;{3~+dOAtncM>=W+hmOe3!(Wq@K&cj<=a1Ui8+ld zX<3y^2IuvEKlRy!viklP+6CX3{9QXIsjJCZ*)+JkBlj!Y{1SAwsh#PLFT>uamP&Px z6s7T+)1`WBLCbdh?c-#hTP|n6`+v`;bR4rf_ZW<5b}NT4gMPV{epyk?y~J6VBJ_{R zhfLZfem*+c{vOng@6UW}x?WPLdfFj#&8yQ)1+Ol{G4UgpR5foR$@cJ(zss2OJ;7v& z!Cl|orrBjxBG;!uwpd^jc66xG`2 zb6IYa9W?c{PEZHUXpb%kJg#-B?~4!x#BdYaT}z|=taTl433ASH)Kv87v{E^a-gsIB ztxrQvats+d*scXp@KY!MPt9{4O8eBT^-xU7ki;|?LfZzYf^);Dg0>-15us6Gab0rA zq5@|ZA|kVgPfe>ZTgf?LxL!4dj+lrw^r)yQ;hCfz?$@7IjY+EMzrW>_WW z(7QB4<+~inI{jN&FPoL4Rm>YFIN7i1%wI(G-J8FLP>A6u(9Vx4cqtyI-D0R;lrhkmy z)&DR?>;jax6q6jNA=CvL4$XsBK%YWqplBAH#h`{z2WU7n16l!n0G)xt?mz~r1$BUi zLbIVI(C#}{*6XC^7SKuFDm1_n&bbxPX&U65+jmh*f*-f3Xg^=eg1U0PF49xEBB4{{ zV3nC!@6ox1$eHuu&#W1zb=XZs6)M9%Cq=EAn@CYLC~E50CM{8yE;aRQH#3i~E}2b&>Z0Vd zEWV?{myV68Vm9%489nvu%qOs-kj_R4 z*5~HI6kXJ}EQBqO^11O9!$y2=4iwh~<30}=>COQ#=cVB1W>1POC0{!<7gFfVUQDu7 zt@wZ_JEKj-^gRrJnjKU^SMpXMhos|XaS5GR zDk<1&UCA#(ny(Kz318ai3v;dn)%1mlDrskQZ%Li1XMB;_zoh<6>4wKLyOq}bj`K1% zWw?oQG*DK5$E=JhhgqS_r_1ZXX_M%4^Px4+2ha)VJQU4~mn5h<)U+&p@<%ndqAsT1 zGsP?FJAhUd^#lB(ZBa%20zbT|S4o!#233Mt-Mm)`<^a>Rvd&Or%t?VcrfU`5OTQOs z_Eu$`b*hR!t>QEHRMj4Z*ztg^Uie^2A4B@}< zku;K`CBvr-U4_q)Sigsx=lQ{3+*#>5TtTq!nXh`4S=x{q>tNK~G-yr_x4tLW5?GaC zrNXLj@;B1ubBR=6SW=O5GFvs$6C-mqq?q|khGeC@Ea3YNyU<+c&0rGmmy|N0mn8|4 zdHbCMQhw@PPLTP_2jkO0`Bg~gV7MC?M)(mh9DEe?f{z8``+@T7kp5s4_&CUG3HcF} zl@ojpr(s2N!6yX7>#Ho8HSQ+vuY7BLOhMV+Ny2RY}I<`_P)ORn= z9(m7q4>o?eM}`g<>@+;x)S6FIi7fG1M?7ao-pxW#x{68O!bGxQ2knb(jj-55gqlT=9^(*alSULO5kC%nr3o!(hu~h z9UMR1W%9}OB6+*l5yZak8C3q(yBAI`=4nnbj3liqFS;&(zXX1N_&=DXopgyJydSX| z!}^mlT3}`6NmH+R|?#{Rgpad*6^2&t^-<`1hKfeY>|2!IYrYr#*=KO=l15zkmg}GKvgDE4b=WM+J8-t zXlf`z2NA((2)={hJcg%~D1wo;Aipy8b=9e6T4!Ca-c&W_ zPCYia9=lVIzgLZ)sV0=v6Moeb7dgti-QloQF<1ML?tmZjwtURw?xItwoTs#b$Vhxk z41rV29$#e)U3K_Ot*ll-zPtVzU^aEq1&cIA~{o3L|N$q1I)QjIw73q*LAT*EI9G>Rb;!qWufC z|64sKS&bQ?#un6Ld+YHrdSVqdak`pROHUfDr<76C_LGfx8Mj*INk`)n)8<~ssFuaS zqRh!--hwH1gC0YR)`*L!8!eA1$p)G#-E^-c_Jiz;J+rLqOL9x0dbtlzi*p-8s%2<#_9b{A?Pj!13 zv&s7hZ0q)M$=6NmaPr`vQ(fu0m2~@H&q2n_cC%ZS}@D zRk0Hl<|8hmZnUfX;G2~nd_#GQ6!V}T$^55arjkmOw^PNbbaQ>RDs4Z*{q9h9pP{JV zZ)r$|s_^*Yxbpi)|LP7?_e|f=T#oW~RXVrUS3Jj|0VX%y)#TXb&27r}(08db=9S+# z%y@#x?*~}&9gu`Kb2}-TB?eOhCyCEDkofJ%xzCb$Z)7As-#}B24{sKi^kQ?Q{uH0` zkxG?Ac55KVRVb^KeR$q%?5PX)CQ{LlKK~0Bs*;Met(qJ zkULy8)EKG>6@_09OakkJ$>6(%8Ou1V<~dcJQ_ih#|7-+8J0>(2cY1(r(}H1*L*_ z6GmA(jFP;ec76gvwPpD4gFzknn}FQgXW_Z`cM2xx1~w)92-pmiCv6Ts3AO+yg4C@) z0JZ{O2JZ*o2B{_cwPR~=9pMMTcR_i8O*ZDS{O@xkn(hVLnDnt>V{;AXcAD*xmDNUm z$CdFgDWt7Bg3?B4=Z^zBgQdZ)Al1MNbjy!+7TVeelDmUWofl({l?auA+Cb%?8(*$s z+b!tRRo2`o7r{*qvSkPcw; zYk^dw{R{MgpeRhou@xQywh7Ad(AMLGJIHwe46MCrE*X=lozWou?yNWK|<&OckP!)Oh@0X_`A33dSA0{eiA!AC*5zI|?J z3CO{Hnb`RIfy+R7f3qAM2Ce`{fGfd~;3{w?xEh=dt^wzOy=Z^C7t=iSTKPt{9D~0P zDkm&^r$5fBYu`J+I$$ctbA{jB_rgvg~?OO zyN>**CN<+j(y5_-HcE}jN5Ow1kMmR~^UiXQ>iCRIs+aCzf6+pQFr&mC!t24}grz^p z(A_{-?Egkkyv!!B9=I8#Zfv=Gz^#NEgWJFdg8X*icEat!9bgA=C)iu+^gV7E-}cuh z7=HHWEa=Sk=Pc+ecEe+t|Ko&)!S7r=esMNl5( zGI)US74Q?#BVTVg$PG(g*<<&!EH>dVSR6b8rh`X8d4u=` zcprESlp*~k=nmzPgpU(`5=3b~hYPF|;G5mKkph;0Ct)lFzXsQXJe57Pc`E;Q!Xmd5 z{EqN@;P>Ee@HDsw`~lnx{s`^^e**V|XH2O^-e%^BzIs{48jm}NS6TD@X4J-;@a6iI zG$gUVkwGt!?&8l4{tm{2=fM)7=u#H^gK#+z<7xjmM)=Yl{vzA}qy_w~!As!7(%dwG z-Torjl?be@zZ-ZB><0>e2zZ_FP|#v;0PAika4e`njHTrP7l5>wU%G{)TMx=+#Rf0} zq^0c53h5@YS@D;+5ZSF@gThWAKRb|J3z6F;LTnJd8gI|f00jq#*z^clM@VDcpnliiQgm=i*h<1_XoBaOvRa1US*u($Iy32ezB`mghE<_xo z-_=H$&WI_K5$~+Hl=X!DW+bB~#qs#oonREmyXveDIpiZOk1rOg4*cdIjb+b^8-Q&H zHw4>)_kf*1+`GREh+DV61w^CTGv1b9fB3CHCNLI_EIn3RtHVZw1>2QVeb7jxW^aJ68#21rM;&2bm7DdDc5 zjOT7(XYdha&6y~(`jIdu!H|NOl-M{IlmeL}SWm(SEGpKtc$~G+tRXr{z&fG7uv#$iTESW`J2Q5QZ&JK{rVak{B%3Wc+s%ayi|o z9bU09)C$UP^D47;DI)6}F1LG0KRGmj29qsTpZ!Yf^n*G!H81>ED9b6Q2J$36n7iH2o$L-rgsV3+Bb_-Gv=KT1U4ROsL}jQgG!U8xt$_AJ zr_Jd1bVB^bN;oWt`HfWwssJ^H`c|GZ(r<@$p;LFpYnka@5_A2<-KALQQ+ z4k9eQWia@V^ok+e$Vioh9l@c5rw79`z{d&C1o6WDSHWT6!eIO&a5!PSy`BCrID#-< z-5x7AQF~0_MD6&W!KaA-1(a@X|7uzKIUU39=L(d5?o7I**Sk~FF7~}MCH;TtLpq`7 zz{b%Hme38x%$>%|pX#RgG*iFu<1HY$MAKG>C<%yGk=RD;>AIWAIbEmo zebT$8BRWGw%c~_KRY~m=fq*`p-?Vu~r^KCRcuSkfmTzxNIX}v?k_qQDGoR6`Rb_Mc zvpO}dGN#OxYU^QA2+1JqX+}Sb)ErY~h90KYn58rHlWLDCHB+Yo&1UL1^tXk~vKhL7 ziJqnN@~M*|v*2AVWOmKs9W(gLEL}h~G~ogLmD+E<4e+vPzsWTlMf00_v-Lyl5IrX$ zWA+GqY}6cGNneRKRp;o6s-o#LNAHUqf*}y~O!7`P(O;g&0fr89sf;0}&s;r#3OF*C zv>%#WhIe8)%;8H&@^K>ayO!(yiSZ}Brj?}2 z{dwNKH8&lfC+Ek^p6AK=HKSf2=WivhsM+{}j@I86HZRTBPnmn>ll65cV#a(TuG z^L_t8^L5c&#TXzfAhEKrUZm(!c8sb15=C?WB1P|hNk`J;=U&zcZ=8LJ*C#VF<(`uX z`AzOu^q;D7X85aAotl$bb|I+O6f~Xsg~w+Oe2q+Kil-LohtUs6Fy|NPx>S8;)z|e= zrS@m~-qZ&@dPstKW|@wEXNexJsF&mwNX}lW>rx@<%eX%)_ci4HVbwfy`Z66*WQf?q z@^~UKZv_&u<|#>eUhYdd_bpfIrWrfw#K)lXP;?b0Gf-WqEi@FG2E7JtgpNVyq3Ei} zK@Fh}&~Ru5v;^7-orYw8su)xY>H-ai=0j_s!_ZkMwz^f&DpQ?_GSnNI2E7J-Pm8?^ch^>}fA=i_F~sZ(@^%3Ody5ZLIl0{WTL3dKGSYizf|6dWUjc9y z;eucQEF0vDhnP*6TC~3}H2|FJexQm;rahyb2Qv4wGm^~?ak3Raai))f^TDIwi=fQ^ zn3UQdsCpUX(2}(P3|hVHe4r}ShMl0cBWuXF0M=l`YMSC}7(_Kqt2KHopYHigLhX!N ztKabS&&!vRl+JIquGO)szxiw}1MFE7^^Tqzxs~ccZ_D)C#W-L64lm2Ln)lv8;45~=$Zx{e5!cn!SjWKbY5E8ZFwd>iZ$$pgn6tC`c^Cf`OZRtmUj4Jr zJn^n>q%Zl*=65kJcbRkVlHhKWydG$7TCFEtBL3e_m;S!I;oE=;iKf&Bim6~aZa~ML zHwi>+M4+dM+lat$(`+L;E;C0q>hf{Rf^uSb<>hu=rnad(+Xj=o3CmK`%-qD#YG-~H z=x^@btT#kC&#x?W+05&sq%C@Z%AL7w3u6)OGuv$A>;dZByF)Lh(2D}g%v(G4@M`a*k3e%{BNi1@!Q_T#hp|3k2|OAaoyf-Y0fG8$4$Qvb*dNd z?VXk8oU(u191+$?ShLfN{s`v*cB;yGhr*rtu&{l$ezASF-mI(2$I2!hSB2GL=XiZ7 z4!KF2#q$C}<|T`7K3@NHNOZ2OXy?L5u@N8FXf!EU$ASH~lgX=dl0NS~JxWta&+OAxsgcZG`}Ch4{aGnF zNnc+dFJ+dcc%Rl$r8CETs{7|{FaJxkTw|ggl<9C?nzjox9GVBMfObQtpbJpmS}Zr9 zhENx1I5ZDh0et|SfWq#YS?`@$7jnsJQ7$Y@)^(OOeB-swsImU`7QHRfCp| z?-_cf#R|%s7Weg)ySb6TG{n8mQOv1#%=4#pVinnDlxd2@pL)kBTE>}7ZVJP@gG4*l zIeh69GBtj}{Crv`6cLfuL6L&*-VmY991+ex{-7(!3d(*FR9MQ_V^8UcKk6xs)YLxu znMLZ^4{lO-KaDNd`%+Hu`i=D0gZXpbrO(jTUAx&|zkIx3{~^eTx=YZbA!#L@D=X>} zt*v3^=O35>3^P$bGRGTcO8toT!$M9gJu;v#c~!Q1y%apmbVUToryO|h)(NURFQ4rM z2b`?WISF$8WG64>z}-LD#rF7#xm4tJhT!aycVYSIKX>1#E) zv6}jnntE7GyHibjNlm-1rgu@(x2b1R)idLyzq#KqU1GNVtYe~or_FY;KPsKubp6Pi z;JhLIlqTwp1#bb{jTU=Bkdq}ve&JNna8ug%O<(iKrXR{{d1L zH!|>7T{rnA)%-gwJ-Yi%srHuK}Jx_%KiiET@Cdt2OnG27T|JB#>V zh*#Tgj-J(}b9cyroxuLc;Dh&PF3xcj{9XG@$=se?=IRBV$8 zmWOt;u5MPIqcJX!b+_%o=REMSx2XB`oDR?3loHMdOX(IYCFlA7z7+R|EM@HX#omjQ zGJU&Q_B;QzLCM|jd5>B=@@YsOh1lCYire1*@+fX0Nx8{@OY(8AOO&|IF0owh3b>Vj1blGAkQ#aPKMChAf#oDVv z_>u6RgMTW>Pc+-|dSXoEA3AR{*-j24eh~3FcQ_3q-Cz3flOgt~dmqQDt&@jF{%+)} z2IW(NM)*nlK!Hj#U43MK;i`_ck3yU#$ra{H7a3CnLy|D)EIUbDYP#Lao94l1A^0VN z(?SGgoH&9k8O!JMPfJxW)d2lCi_D;sHpdy+Lyu;>`Xb66&F#7 zS6oTH!sf+%o;XwbqRt&&#Ewk9jD0?)Jds5tlaeTeZL?bJyOBxxtV~K&w#T6K2NCX# za5o}5@4q2j`G#`UY!7B69kH%0ckYsoDbkqe z(-2E5Ykx>t^=uI;B%#P~qEA6@!FuZxM`Lli4Q-K=9#5Sjaww!0Jy@zyPN9*RJwcS& z)RXoEQMXrt+KY=i=hR#~DRRpHjP|coql@a%i;9juq{cLe7_%yB%&MaD?-#`z;0cS= zgrC*Kern=LHR%mCWr~`zO-=2lrp{MW52cvp!OlaGu7cKo#9{qB%e)Y1YUu&-yXQX03r`6QU8|oF`=rv8fYnB&Xvs|w&rq^;z zXx)*b@6OTu+iE@d7=IqBt@yJ@?k;oJ?F;@qBD@~q{OL86h<1;A`E#0}{ipp%cpVP& zr{f@aT^e!MWjTKy8Nr|4joZTP*Fui+s4`Sgy7G=bG-lP9UuJ!@X8F5wT3O@o_H0-i z_WH^2CHulM{oeIS5q9r!ZC8@iGFPbWx`OR`@iVbqX=PtyoNT4HOZ4(0Vz%DPO6QoZQMWK#)sdGya4}nFgYvG~;{OTZ@S{DfWhZ!) z`T43Y8fP0%Qpx}BAeO82pG{!u|9UHT&}{8SYB*A2wi>xo^f@tGcHVKGidLc- zB+0~ZnU=Ah!nWBO<(REdg+tBOP5i%^tqz)@roGiEWhAZmp8ySh=aw;ywaEb6~gvD^heRD%t3|CP2hT#(7q39!q>r#lY7%tXoVz|zb z*FZ$Xa5X>W5YgO zt|=j9)w9*H4c7%kx+5Zn>yd9AbzH+W%GicW#>7TMWJuLG?TAQ0Vz@?S+i)#Z6Mj+? zA5#;*Qj->`DU;NcEoy2PHT8Kl^;0!1uUd77p0-y{e?dR{=>Nmoc>q>Xv~7F$90`ZSpnGyEo5qZ!hXZuDv*N{g09DFGY5|7rEh7D-pS8Rph?Rg!?{EzVGwM{Uajxzv@ID&P+bgHp2fy&Y;2k8Pb-1 zX2@uU_ur zPQ$RARx!KdYMkA1J%8Wl2ilsB>(Q6<+zD(kvzT z{Yl3)%-^3k+OSzQ3gO;V>pU#GETSc5W4{3VPMkJ8uve{82#ftce~MHrvkEWs@lp{l zvG7!XPT6Rw>ft2o5ME~E<-2_7ECMf@1>`ZI&^^`kpD)X8)K+G2NoVmq9nUx6`DEZ( zU7Na}#p>FUl6j?~GBprS%kUKaI;Zt8tGAxQ<=jlZu~_^UCdJC)xQ^lC zd3May`cFsJIZ%_Mnw056lVD)wED7m|S&Hxjj8&f;YdR!;<8R0paWFJlTsllv%? z3{IJdRVii|E>u&lCNFW^<&snf z@4~ZEeM4N}dI+}I^b@?DkX9_AZm0%{(&sa`c`o98<7SSDWS(@Fu5p*X?&QmAP#~*8 zvi?tXmo;`*)^u0Sa#w!muA1nst{qvE9$8x?d2NTtx+;B=ZSwo1zW{Y7hh%r8(Vnp{-Raasn^GuR6KpCJtqLAQN?Q_lfy0tNNC*#5K)VP&LeCWz2fJams`7DOhU29dRv-UlLs3aGFTsnc917)myo|xB-p@G^sSU)Z zJ**s~@p}X_0`~@ie+8*=-2`bWN7JcP1u4CpbnM+BZe}re=@B<;kDGM{eZeSq`RvH@ z1CbSrBg-#ISY4X}b|PzLB&@mDU30JFZn(s~`jESkbt4H*sPD*Ai-7oD6}8mg^Te^{ zXTCQbt&r52LR(kUx~~b+rH)DdVs?t6%WMucMJb#&B5_L^cLxeGwq-yxu|POWi)q+S z(MCY42(vOCzKqMO6nrr|YOBa%cGS*q4$bX`dc#=UsGUx0SVlmXl7y1KPy>i>qwvW&>G*WHypA}eonBCFRqk@Ztdrx#v% zy#%aZ>9{LTl}*U|o6U&RY5eqwmrWl(fAYYQyiqyXbZ**^CNXLL z!0dCT#pj&NxTfk%OhC59C%U2RQ#ULl(l9ng>n=x ztFYSlyG@<0moAtWf4%yQr5>9wMZ%z9TpaUq&F_EcPQeWcQa{wnQkUu z_x#XZTG(CM++E76LEpPs?cA*CZr0Jrvc8e!A4RezMpn&oSH148F6^%E7Fqp7WNCe? zOAD)kd9FyfC3N9}AL||x%AX6WLH}9)kENm|`eaaFs&TSBhK?$Lt=ONcXJ7KF5S*j} zP*_xHLmkhZJjdvj6;GyS1j&4obWZ7LB5-wEv!ishaMHbmHlNTM;On{|G_@DC%}oCp z&N5z3;-xEAN8-Gw#7$7#!Q=cnhPvUr5qQyMSBYo(t;+D8nUbACb~Mfx`!lEB6f|DU zBcA*ZxYakWzbjvO{i6!b?ZmCSn>oPE+!$f?mAka3n^nopT3Ob0mtBp!I=Aqp)|1Kw zzm&LZ8{yj43F33QO`bn^;cN{CrYa{_+_jh;*%viv&|8DF#fmlK))=snN7FxTPICkRrtiYAOtUVZ8mrrcrFa`>ib zfA`9W_kJWZDU!J~vh=dDZX|1KWKLw+g!mFU8l;-3Q}!I(eD@VY#>~T3qMQhL`{C%Dt9mqh=J!{^cbNDPbD8V)J{*&(!qH;C-kRgp#YZ0)d6}(e|!083BG)KcX_Vna{u-6(O&J&+ELrQNabec zb2HnynQJ*!mnQp(T4M#qgFOrLH-ThzIq#3G5UpJE7}00oNA6vMq^eMhV>cQz0Q+g@ zo!sA$j+}Kizw$(d)UZWt)txrK`f-B}%X$+&^wTOv6U*F1IQ8%%=MRH8(Adn=O{`mBn(+2!LOT`D_2= z=ZY1iu_ZlrBAjh%fJJgMe$= zFwI|9R43F40`~X6%G-+vlcM#S|8Kz*Z*I@0x6S^s9y?(`)URAQ+Vy`ucU^EU17!A( zwc81cqy9F|ZFZq}2L=zyO1H45BxRpz)_W)1?w3i9j;pOxmD^BhmC0eQLd& zCR5>8+vr#O^_7a%exFqO#z~x5ixX$l8Rn%T>%?%3TaU zq@o-Xc&gyPE>DZ9L_3cU%aE{W2e-JIy9{?TH*vvAy35PE%SXFeS4EhxWX*M#-yB)K z)m_oUU9l~)B0YC?J$DfS@N29@2ESrl&3%4qRc?lNkc7MNBIkXyk1#9pxhAf=2=CR7 z{UiRR{!zzuI5eAvpcriLTEu7emQ3W0lcu^?oaMt)g zSB>`S66D{lgq2%4VT?P*Nywb|b&6c*0*^En2e= z+b}rg@FM3EaS4)NdUG=v=s3)ymTT<6D38CyrA~QVYx5{Cr3rEZRv9$g_&lz)cQAM1 zr8r(H<7G+UC7esG^~YC__UaLqaSC3t^EkoHoRBYbSAoo3ZssmqmSH|uwZkJns!R5d zX=TD0|L5w_nn|;XttDRMd?tvo23J*n*ZHk#FkfHikFUY-242rw(cf7kS}(lNMisz4 zQb(F5lb3#x%;S-zKSZ+Ds%eG~kn^;+@iM{4{*@#FKl>$WMhDeVe&jv;a@nd2crS(b zYK8p`HKQX(g#N=hb?*)~)Q_?Q=PKiW5HF;dEDxMKX!6WSjPd%)r5(H05ywyI=9MBR z^jF2tY(zU6Tq{~S=?Ly;ao<6hbAxcyR#lkmO-Z$Ka6X0Eh}Dw7i%LrU&-%FfF>(Cd z9?UDUmxZiH!N<&Uy??qE^Tl|dQ}7nn=k}VmzlC`$^|uU{C9R16cI{}DR{gnbqwyp6G&*NpD#b2; z8{*PGX?~~vo%;7Oou&M2@YCv088-Ms>d;AU@Gk?c;!l_|X!7*Q6Xy?{b%j2d$9_pf zG@OW7Ht#$gM5LZq)8Y;O_rFFe8jXQkF`^B-OkER2tGe_I@nKIIGN?EHOky-c*x=8x zKDSsrQrD#EU5nr9Qh7J{sr8IyhkEqp-8(u?3W>RxlZVi>l_M2wNfVgS7s|_Eyr?7I zM~4u4DPz2hf0Wg>?1@n?d(NQ*xfR?V%spLRAIn@2$-LcNdNW^Obh9S9SA;Vualcj=7oKpu`X8uXV+dUwnEJNl)35{@4c58fA_v8vMw;ENxq9BpJ=ZWK_a! z8Aiz%8MueZV6}LIf0hhx=#`AHsUPab`TXLOQI2FRE$NSJi2mvrQ7piZ+!^p}GJ-n2 z$-lV)wW%=9^D#=vvwus;CjW(o(N1lH)|UH%RL@;N2fHgBPVg;Xdt9EBobh`!;(qst zV!_KCT+aM0A=lW1niK~D0U{*hLZX9izYf|b~$({UbgYebq{H^DgJ9O=Pg(96b|}Tv@m}w6ZpL(Z`R{( z`68Y1a2G}%*yNeB2kUGtEH8|eTfrta97!kjwgIJDn7_${_fl{%ocZ%-pf4LgsekWI z8f(UNnLd8@yvdXNvjg2mX55Z%Qy&DO1y{g?mO^N!;zJuYcgp<91lN1Y<&(36(>ECh zgjXgUWheEqsnX0L{G}3HbH+l|EywIh)M4iM=?mvgna4NA22P$mYwrAUoo5Z3CH-D& zefZg4yo@K@axIPr;c*SJe^m%?a2Q^g*}j7aEKHl(u04B554*F$gKZG~3S5Z2ptlkN{s4pvOyck_p|K=?6Q35yOF9rJ)I?FJD#f?AR;qWd%f*B&^wR3+I z&^V2Z^Qu-6|W9*8opI8w)m@C@W@Wh zhcs}Qv5op^*3mA}vENyDo} zf5eG1S_WbNiWi0TSKvkYt7g2I{3)@E$RF>OIc?|$!^F~Q+Qe2gJO9))qAEb%TISH~ zo}`lxax&+!!X@YAy4feQIGwH`uF!f@X|r%XMW3a(RB7uQ?;To26Z1AOhhsP#(NKqR zRe93DMrl}?GaCI*x5jddk4bw0DC0LJ*_f1Z1+c|F9(>V!w*9Q_yrP=6x|u_HaVvA4 z^oh$FMON&0S2m8U>fo;0=B|1z!o$GT*ShPwMb@u$uf8&}X|22I&&V}zx|{n)Ht%+~ z)OWXh8}UDNw+?r&Pl;T=#J&C#cU#NIwl(hd0`B%7-5cpNBR7?EZz=BH@_1y|^X~3_ z?j0@qxOdEm-0^JW&NTP#?veYRcki#^-oMDb{|)znTJA$C1LY{}O-}@!!uQyRziM;} zj|VyQGv7+6=zrTfTEBCUFEb*e)tMIYo{eOt<__-CAvTctVOX#_!R@2RSJC)SDYz>x ziq;R8Z<;ZY;LsFhc2vs3X~u~lsPwp?Y7kVFWPd`NXvc8CG@BAdyp1MTVOMud(?)*J zSeU;xId=jBg-OPow-XZUnpXcg(JaEdyoSyiNvmPE0HZ!=amPA2^xx8z*4UySr_OCWUX9U6cpODMOCYL*j;ZnTI zYv`<8p1{5l_O-DeADqULt1iU;Yddbi^bqH$$cU5{_#I1hjuX#F!<;bO=x_evP zO#CX9;oNA!2pstBvM_(^kjmXD{%!4}m7Cp5@GbEp_ubi1pgG6BDfR^C)MpG;l!{sb zTyNT&UpzfWQ)lXdyL5c6D>Qnfd^^r37UnPe0wi=x_2;HXt0XNV{Brn_d$%AC^^Eek zP0N;&-EDgK*(-N06Wyg>;3K{)mW|Rm41P*x@T*5mwW|0-I}lR_v9!UD+-os{%Uc-J zb{o_7;4y25XnuFQ|7S;TzP9_RouY}GJAYg+oQAp@YPi>DYmLlb+^o*IF7>^mZOjMa z5>cN-bgk+y>Buy66$!||kKDU5^v5S+hfTzeoJ4Fc_i>RBhuG5dIwv*V**>AX&ib*yuKTRSa$RGCrTBW$JrXJ6vvJJrYos%^tJ_WS1K|8V{rireF3@P3e9pN$PX)jITK1ew z>Bl_OSR|Wetp$xY<9@Z=XJ@-t@UQL{ErQ=0`kB}s?`MK~*MQ_zEl`JYEpE=3JX;bYal585^{-6C#xJd&{xUDQqN@fi(5u0OwK(v|L#D94}bX@kw zNK!5(R(_={%-?2Q6DUnvjca5+AJbUrQYhgQj#^Wcz}#tXfu9?5LU|-_G}(mG ztkFLU<=zW~(vnd2UpN%|v6wnxTEcFp-c*~Gq88?FD?&L^&i`g;G&xVJ#zFl5jB40<}sD^+#}!51NOXYX~$jMF;~hjORo zear!K4DU-g9DWZOl+E5&44Ga&a!;RRwy+}AX6q`7*JH3Y`|vT9a^@iyU~`xPtU@S2 z{tGafvRh9!gmp3fFby!0L*ge!#Vg>{4;-38?NeDTu&V<@(}?3R0tF!Z0T`XHz_rI^ z6^zcc)a@;4Gmp&lIy$l!?sF-(>6jQTL~py856~=v?T{D4E^rC#2baQ;Fbgh#6phC_ z?aoSAfT#31o5Zwb1DEcYiI@q-UiC^_Yk&Tb662azL$NZe=r%^povwLS;~_H-J$&TgbyIIt&v0J^M*n)>kWes z!we{Y6X5~mN$?Rk13nt#K$rA!xDh@9^Vc`BTd#GSp0&;O85`B z75)nEfWJX4V*4HHGpT>T58yd?8vY6Yg09Q1b5yhltN`;uTQRjqXG=^vM*DQO!gR#c z!Ni*LrwyhdrcoSqQddl8Od3@s-0rB2Q-U_Gt&ei-6oxhhjQ5v@zs{ITF^VwWe=F>2 z*mGj)>-gEdls5m(<3>C-#PqSA|0BQJom8euU=*QpEV&j&+ko*NZ4oDhgY@jSdXh_d z{t>^zm}rFZ?7U^Xoqv$rx5e24qH!_+$ z(+!t_)GM>2+jkJ%jYqLb(cS#_A&&%xNo0cxRvizrfoJ>qp6#%H<=Q8 zi}=dD*>UY^JkU#ew?I8^}1LTwJPDhvoJHaNfGwcEBRlRYr zE7acS^d;U}NMGXJ4CzBW?JU?EJ{RMl4+nha$LR}CL%L(n$-@W-OThuK1{?@m!9lP$ z90F%RIwNm0q%$(#@*NJJMIHrh>li`tkHKg=IGJ(ThIa=t5H1cJMnbicw17JPy9ry6 z>=m#A)L1YXGb)a1hH6DkFikP?uVYd1OpwtZB_K2kEKE>+j{lYEgddsSm}c1(oW4JJ zTikW}`TLJVO2x)p=B^_2ES129TcIYXc|4KJa4L7hVGG z#ntstzS?7I;^IJUxY`<{-leFLRmg0>N1b+f-+W&N4R0y|C_&R;WjGyP1ZP5~D9$XX z@ox^)yl5`exHlitp_~1>zJ^yIClC-Lj8_$23De z$bx6!GFXWEy#m&PD`6M73fi2ibcbV9l~jVgFq#Pr!3@Oo!>Axae}CsN+y)2!V!g9V zYZ+=#poZh{`X2HFfL z0fR8NJ4LE#X3MXHsXm&J**y}cWA{Ojm{FTI-CJt>7EV|6bV6P-=z0*99WP2S`&8E)#*%@*7EjwO*WLWoky8HAiP3sh>}l2Us^LVJIW^ZQ zymVh-QnYLBf8}p|uAp~Jiq`wvDQfSzgFX;{O6*bcqC7ta3qd+uuRMGlR)VhP zQ}{AWhp#|2Px<2xz;FV575jMe;Z3VzHBr9(WDR3vUZN+zAtq_riQo<7IyM5M*ZQJpmQa zGmsf3Dtz`YfFDB=?fnXiK#iY#N62dji@^-Yc`Ur z8Auh;L&!{Fy@z2UJO;TB_r8baVM)eArnY80Woqk{M&_z{$x!EOd=;C+BxVI(3l1vd zVF*lt8fa7DVptXKh1K9es1pyv>c~f64fs7|zb~(HUNo^#-*(}Vl6NU&TH>vOb)mlE zLa}+z!}{=&@a3pL7M?uQpyAmp4 zOJGan7;FWvfoLYZTj53UHYk64VO!+8V5}VnPjSGGwBFZ&htn_}`3&p;-F(b}U<4|F ze6SO8#XwGmosm;u7uW=Lg-rwZ=CB)b&p_@AyCe6@NBir+!2~RN!pmSUczNJ)0qldk z5cY-oz)L^49`=VDAe*my+Baq}TnvZ6JE0P~4-Q4X2M&X8!Qt>E909-1AGH57Sd7Ht z9Mp;Q#m*>X7mkKCA@@68Yd98O1m&+S%s_4j$HPgGrsrJ&C&D#w5?l)>N1Uvi;1uNB z;8b`d#=$fW-hL7x$m$3=mMtKltp+z5BU zZGroZa5wTz@K*RlVE;6{4f!y<9exe>z;6QgQ}9mY({L{=RfJ_Ky5yxfxEq#%_rTil zURVbzr7fWn)+b)^x4K8zjUU@r%c zz`LM49t!v#RKy>_$FTnz9)#b(C*Uve$%yko!J_n_Q8EJMzZ^_PE)P>+8<+~)2JY=) zRpj)dwEt=x^unS#>FYxejAfJZKu|ES_z@K4DSd<%zR-kuxB-rrr$L6V8Oa;4Ii1&W3&964)2UVjL*v>!AX=CEzaD5BuG)Kim%ozyoj~ zd=<+7n{W{FF*q2$4~IZ~U|#MY!C}ZBLpGE1zJw#-S8ya6L+}0)bg@`G1INIR;8=JT za&ztd1r<=FBwa0X6pn{Q;RM(UPK2$Y{I!A1CA_xqV%QyC0_VX?;e0p^UIwQ}Y5$jV zpc5CsnK&$jv*0qwWW-}Nr!x<(fbzEvYBK4=`PgrTmqBfjawXgWc@@{Y5iWu^!Nu?) zxCA}|Q3lxAbj;j9_T}cJKBha9G~KA^3m&5}%`uIPo&M-M7UiAJnBJHMm=tb0T4%dg zAq@TOmdedpSkesB7}FNB0J9sDiW!6Hf?4dul2ErN5lj+#vm^pYB0?*R3ZzLu9otWb zByrPXO-q<&BDLGq*CqIlMz)^{>4aPb(McYpOMN>RTCdY-_~+INey=hl_}C)=SuWgDIp?^!vh z&KuqKlA#^vXLHpA{~favQYY7yY?{l>`d6lucwHfdN&c(zc*TCsr5o%U7+t>jhKa3<1p>x{M4ebY{0UtL#?;$roG$xGn~wI!F0f6#F>jZo^1Ta>T^lc zg0fEI)Mj)Fxy>wOTeF*SU0Ts@Mfuga^-Z&^!&AU?6QKUsD>(snz*u{m$iIIbsNJN% zb0kvTnZmJ}qfWGy$euKa++1$_g@M6z zj1-MYO=0)9apcY((TpO;2(o(E} z=@2#Wg|rkgXB`d`@vt7wgd5;xklS6Orr;@>w-i}i1r^cyfYMUP{*FMFmSPjKv=rCC zr{QM!3cMCdOK}}M4SiVMrMYe8Kx&HXqs}s^DQ-rVn&K8HHN`F{HN|d-?!>tbqUzA6 zaEz8>FO-(zZYV9qJy2ST{g4}e=YGijw(}t5cGuy4-DoMeU-vpP-E|IdFc3ZhC%{J` zw>-{ckXsYyAmq-%c^q;FVXgo-2+otp+#qPze50j!3Nqg|?#!#5r;(XgJBK0DUu`I5 zv=q-kW~;_u>=_Q8#o}4`9Q+tQ4}XO(z$CN?FG415&P$LPhdFT)Jc`WB!g(1oF>qdi z6r1xZB-hSs@ByeIla}HQWOA)-ag3JYn5H}5WAPRiQd7JQrS^XZN=U;v*<6#m6vSOK}2OT8dAgv=pCex+68kXIONHpTkSx7jPB)67GRt z!RO&gXw($sNLq?-kfo*g7D`KT3Q9|H8cIuX21-lu9h8>hER>ew2WYeuQg=vA@go*e zQ~U&_ruZ33P4NqiS5y3oEH%Y%@G1B^jMq~9fh;Y>IVdf~pDSELsE{s=GM3Cdv6j5Z<6iyx}Ek#}^Eky#1*HYw1mX@Lbl$N3(l$N3pl$N3>L`xBK zig6${MR6FfreIGgqo$x<7&Qg;!l)^z7pN(0rIMDS4061dqAaqD(jXB^OHmF=OHm%i zYbh!sw_|~VQ;7qqDUzVn6qTXW6jVH;rbx+S)fDK-jGCe*Jc4^IC@n>8C@n=DC@n=@ zC@n=j7_X(Mk1Q=k1DFLH!eucI)I6l7NW(&EipEfCiY8EMil%TEYzCi#DC)ALrD%;T zEyYDpT8bwq%6KhB8|%crC>@$Y?2I z&bJ&$O>qjwt0~SPOHFYW#;Ymlw^38jg+gg5#CR=*WN9gWgwj&{1f`|;8A?m>3zU}P zA26*L?f+K}q^9@{N=@-Ql$zoX7_X){hb%S4pYTbjW-BelU&zu@oQKj!iCaO zM4+@3Q7A1%9+<7AkhUQ&7E)6rK&dJ6L8&S7L#ZhWK&dGTLa8YVL7k_ZUPwz(78ib82Aiotj-MRDYq)D$H+keZ?-j8{{XMwXhQ43wIpER>oe5lTx@9!g750ZL0z z5lTx@3C3$Fl8~jPV5Bu#iWDdBN=p&b&ARG9QgDa) zZ>lLw+1tAF|D~l+{_XESQ&aq1OJVgb|GAce@0#lh{Bt#hw1XW@3Tney9xZQblG zaPKCNTG;E?o*tT;Z>Iy~7S`#Q*U6H;q8qaG72RPKsL{I??15Yx_Jq<`^n&TIH|zt= z18FU*=!1pSNqyls*biO|`@`jM09+Ap9aIFH0`3g#?+WCDa3KC4hlAiVa4>uw4uK!S zVel-B4d1EsWtbv_oQvA7IYhL^)+cm=EzcuWh}0WQG4 zBU}hG;FVB%j789g3V1tQjLd^dX9?snpA&H`q?4;&#uu37NYr=N8CKkvWl@9A_6YH#yF2kb4m4cDN1hg?r)M z@L{L~KL+<9AB6Y7BXB=_8{P+F?{M%C2h6IRM_>c^7;FX~htzQA2}p%>o`j>}AxM32 zo`RIG^EBi#JBJ~eaE`#6;WKbIR6>$;1}>?_zOG%qv$0*fu-T6uoC=C zwK9nVMWD}XDd4sN+riJV?+U+!L*Q5N68J5=6rO_f;CE08lJDWI@CWz^{1G06Kfx#9 z&+tk33w#^Ke&gU>4t|IE>E*cmUM0xo_mbgxm;#lsD$q^fb{|Gy0~m!3VIJ5B%3pIh zfb%-Qyx4by39u8)2fM=ju)8!g1vuz|MM0PW3&Dx7FwB_@mkA!(snZM}*^STj$j&~l z>mEF=oA_@&u8UphdEHn>UHiQ5LK9&nz>d!U`@B~E?8Az13VMO*V$94VJ37_%dJR82 zm+Wl#cey&>Qvctd{aixAG^MDG>1e{U3GIXJ)tD)m-p1Z0Y_J|k&A?I*4Yy*3W4dEH zV;W)FW704!19^mzb3ck1U;?xW4B#hBUVoSfM?p0l zjr`@1Ghlgm39JaUV3+>REWS;Kk0Dn;@aco=^$u2OA-?V%|xElLGroVT>Nvo5Dd8sHsC!xCS^OblQP>Y2gZ<%KP!XJf3i#)MzrX?5CouBMz6fND z@`}PiuvoxKfqUgZt_KI>USCs(Asn=WLt!sC3=W6Gp`M+LfR{rCJ#Psd1$CYx;Mtjp z_@;n6;b`o6LgkEs``}o}gCb`fuVKq1vR)^DI z12_|+fp+FV)S%8hh&Iw;@b%C(I+wwD@NzgGUIEv_E8zxs6?_yff-k|v2`G17;lRVf z4ii_=9JN@!8FfBbb&0c_6j(NbsRU4zzDp}S>{@smfg*`FwSx%5h$YLtG+j}16L#4kEW2DK zg|M}3C7`-7MO1~9hd;dpqMz(b@a|&mU{yv1g0!hmW6-P?XCzy<8g#hfPv_e=pmc>o zqt_CYKwZHePDdL_2Li5z$;4cWgHE&wv+r=#&gG_}`hi#uQFqudf9iH#*vO&?Y1Ym% zh~C~=4s}zt0w%+iP&ZMlpswd?s24iaYTCm!$mwt`917RLVNmX)Arm@p4BQB31ordc zCgjWL$DC_8xEu>HEAX%?kgtQAvG?J%@J6@=-VU#W4?rKj2)Du$@Ot=Huw>|9exb=z!UHe_zAod>LzV3JR9RcIsXePAnwWxbyId1_GRGRunODlGd>F>m;~n521wH~>!AGGww8!8G zsEEeEgUDmy<8TUm0!|Iwr^7?YGvHHj0el)Rgoojk@CdZsMGfkyOtqN)V7g*bDYdZm zT!M^dKU=nos%$H&L_rdhf~LH$X11>lgrbeD6%@d%pCrdpd4kfwYQ0^gFRYhe(`b%=Zsr|`A`XGqCGFh z(vloc?f-U?UfC>Zu0+^$by@9)6x{4DF?1&YU4H$Z;}TPqoabRV_yVjBUxaD!B`AH? zQK(68Ol3QQgO{-w315L3@Kty*d=0AIz7ExH-+))aH{lYf^RwVFT~4o@C(=%ehG)bui#X85>AKT!WnA+r#M)M#c8PKcn0bkeg`w5Qob_aCb<(4Z$~*l zU@v8jz^%K9sax_1kS4lIQ->^u6zr$+q4_H0$z{?iS zpUAvy;rs;~!t<~Zbn;QAki`Jre8^$|??uSHu6f^BMf5td_$gF`U&B1O{{i#DSV<~Q z0tcla?>YqSQ}197awjZ@{v%iF)iGa#m zzk*yz9TtXMX{QKOcUBBGg(?cIx+@;Tq7?^h0qu2zC864LDcBdHuQ1KBEL3w$gmYmz zxEPj)%V7n$03l&Ot9ux&h(%qnHo)v;i#3u7a4{gbYl2ZpgEHw zZE|5JL6?#^`_T+nZ)KaGRMw+|<1`Yk!^W@_6YMk~hd$3-cB0IGEY_0#lkerC|kv@~wEhZt=}aP26gpS7DJD#b<3 zY%a-3H;#7i3%mb?a`ywa3o!N*HjLJrzyGe(j8DirW#W7a2SVYtB@R-@y17zeQGzqGCJ+71L>`CVmE9 zIL3;^nmfh;QK_(9r=E%Nd(KphKfth4(Ol$5WOZ1gI+>rKI+dScUHA*MG1_v@$>aZw zad8l19TVekoT(Uphw(A~fvgxs#dr?t`uz!2-~NIZj#0C(oIGmgbbAnE(&hmtOVxJs z+ZZFT60Uim4XKMGs`NFjKH?|cLvK|e@LmwAmnsA`ycLGEU=i307KJlmF&Klz;abQy z-OLDD5 z`&6Fac{L!<@61MAsW2V63S@5_hv#@^YqDx^6tW^118X3Ug*D+c$m$2P&sJ@?T)kBt z4z9tWF5C?3!SK@Cjgqv_&1j5vHBoy`#!SNGRE83?Z9CJp?bo))RJBKpSP9b%BY)B` zYNpP#Q19^Rry6Ag&@G@mN`ad5K&BkMll@4MYd%<{bJ8(|vDc5MmZqNZ)Y24V8dNbh zhAPG;P!G#k6JiFBW-t>u#^X(IB?m3wb+9G84eIjU4O=1agRP;;^&D>qZ)lfXE+~+F7Ptg6k_iey);b`SVcz%J0C{zS_;XvdBI0$NV z8VuPI!5IQCg7V)Xpx#N*c|+k)?0G%j83u2H!=aw1jDYXJkx)xBM!`x__l@O1?~W*d zWXOYKqdpuD>myHqtsxJRy>4(491JJJA@E{oE3Eo{RaW&8@fFr=rsSXh)J=@3{z>ny z`qzkVS{-XReoQmR_6AU|ke05*oTn1#-L3MjB~&1~o$YVxy<)R%q5*bco6u%aIc?$;rMS;`ABa{QFojEi21S;69 zK;8te!2KGy0B#O=GnBtwfxI6s#Qi>aB|HSLf=A&ZsF|0}Kd$$#9*mYK&l?}=DV-%y zEhq-*@tw>4`VW%ErHE;WSoP{@SJu%Dn#K;b6I;5qf`LiywsbEEpTt>> zdd`zLJydHhf86lc2WNVK78bAU^&l<2WOF~D%PCoP-Dms{A7)Cii?kv+yP*p4R;b&+ z+h7X39V#JvU{iPplomjF*Dctc$lQWCd*Nhw7n~coUk>j^)}7cssKUAjZin|m3MuC7 z=imk`?t@%?6Y#U}e&pxi1Mn62AbdY?{}?`md;&fUHAguB^N^EAU|#qrOn{F;TNv6# zQTMTW+#(%K7tF*yoT@9YQjwxf^)T#WwalkGcJ?WRcJI>f!hR>=w^z2`unDPl|LouJ zNVH;|CrAg$ah`+?;GyhvL;6_$d4cs+B21%|&#=2LV5XA7gLJN9A&%C(s&j^e{*hEt%mM z*(n=gQC)lE-BmV`y4gUdu zg}=h{@HeR1{0CGQa}Jh)h03&1yEL8zHoA*cygVW{UcMPO5{sx8WaW>&@E0$3dCe!m1f2us2j zU@7=5EDf~+r3`Ec%fbP$5*!Yb;CNUW&VtEsF-(C{lq$hXVJdP~G{!v!2ivfy3iWnw zHK@09b;9ETUxhkRt7WTW{~fFW3+3V71J;DKV1HN-YT-zI$a`*119$~&2p7Oc&{kk( zb1{_hb{ECga3)66yj02|>^SuFNVQnKks4-bKMuR`fzjd-nNFB=Obtx!zs=(&(%}rm zz9cbdJ(&hn%HKXt2p=gZkYSj?n2{K5V5z1OnhV)w;I4o*-|O(VNV^lM=6xlN&LWk> z>1Q*f#P+GepWYZfC(|r4_l?o#c)rume3Ege1y_w~m!UKdNx>*GsnqLIVyMfu`edNU893++L;%2-dRjP-)?8S9PQ1p7Wv8RMf_ zxiZ!tSs5Dum9c?P85;!SGd2WS85;_fv0>0;Y&Zx1UdB{A{&mLqI-kkdD8g07Mnh$6 z42;j%SY%~v98|`}!}t=LfUJy7gvuE2CYy{+hVdD@1X&ro6e?p=AQ>C!Oy%I;%b42N zzs{KbvY+eB@yGXJJJ}foul&t~%HJ#)pTF72%HJHQ{LO>$`J0cd{9OhIz{{b=2;RNU zo-vI=UWhyzUI}Nxt02?d!OkKM{=NJSB7fQ>`k&WG4Q_ld&`;j)mT$}6b0%kmZYJoN zuoxbeW=A-Hz;Yf(=w$naK-Vd@IqjZOZI=fjtbiIHS3*U;Dm#R>gizTD8-&KnC8ex3 zucS0xb=ertq+uN_f$RG0GlylLrFb`%ayMUnxO|0c1OHoKe(bM<8u0xB{+YM(R*3Qu zz|9}yZ(HDRd*E*e)I8^g0)D%<^Oh~5nq@!m=Q^qWC$~mQ^|(DaWe?O8=?+*L-U(CS zUTDjq8ky4VdG+ihX5enW@aH-`&6Apa_*S*K2P(9CVI{a9YC?4%>;WHuHdKYE($kjB zHL^oqfFJv@Ki8>j)R7NyhC)_X7KI0p8E>3NU?KP@ED0ZjdM0!bD(eqJ#iXC@!89DG zN7kwat&%Hm6pOmt_H%%)Q$fWXJH(la@hPahJOdT-vq6Y<8}h2zX+A+D_JeiAP_!sg%cpg3psSmj{ZV_Z@ z+@er7^m$@F`@=2lLugK3ITxT7Fm&7KW8z5m*%#h0UNM)>7wU$kMzOhdp5l z*eh_?!n{(*ePL-h8J2+;!?Fc=o~;K&iC9d7<=}K!9%jJ`a0N_)E1@D>4U>`Az!bOz zro!uB6{y#;s=}?XI@FSBop&FsfqXx#3H6+*RzaR;YspY;EZ%^1;Yp|yPQiM}r(u2g z8*Bi>HPi)Zpbe1=!8BL}HiuPV3s?uXgi;N*f^A`I*dAU4(_tGn&G3eC&=!t_?cpe> z1dM?lkhKJ{6Vwt!cH=Nh5WB!>$lYKjl>b$*J2LwfIX&PO*c09kd%*``Z}>EnfA++2 zVtuf9k%PXFJ!_nP@Ke|yvV)89sQ1MNAhQ#TGZ5CLOBxK@!Xc227M!8*3>*gYUqHO^^*dAuW;czL; zfLU;1jDuwyWWwc;RlLp$cnf3$6^|vU&MJ5qu7<2@bk;zY8#-$ti}_4K&%$-c-^2AV z4@0&xkRNV9EFiEtw<7r4hNaBvM472#%B8?s}IR|m3Vi&qz32U|lQ_J&(wAE*de zx#4U>9t5|;$#4gp2XBB^!5blK44j+b&2T5Y1KzCm&(m+`7A$yr?d*a)$8>f>o-R7K z!aPg`Zi9v4?XWuB1M9;(U{`o2>ux*0~}q&-2IffnwhJA4(X*F`Ar)3BTM)jXAT4;EbC}S){U=q~9jAllYwX$;t;?NZ15T!QVvf5vpw$wXNRe7#&ahH~FvX zLdU-)+RFCIb|#Lwx`MX+ZHgvisj~cU6QoTir^gk`Mdr%bdN2h0cr(%z7ms`O{I>;0 zstny6OP3S>R!Qzx_O)2@@g%>_E8O)zN0UW#o`;E0or>n-k}C$3npJZBz+F}D1?295 ztePXacfc_LHQ`lw8Sq8iFAwB}fqbQEt{m0|7NLT11M*AQ?+#A5J&^YVl$uuVkHVMX z>+ltL7QPB?AC!i~vuURZkHZI1Wrr9!RFSkm70a%i!<`Yd6#a5L{O|VmyCQ?>Ozlz! z>9hA$_BXuB6@7yQ=!(7xb(fCI#-v@Hlb`d>879zXx^2KY(qa z!byi8B6olvLG@rCLv;#rr(MRJ6Idv(pTG?GDZChd1}}l1!%N{8a31^;+AG!yDeSd% z3mJc#UL~kfHFNpVI$iy2Z`_BY`|}h(=iXnu_*r*T|B`gf_LT}-9re9Ad%>3Bvr4kP z&rau9KL(KO@2q@HnsgDrfs9c9_$#vR!GDA5+6s-LcMxFlP$Efp>8>}!ro@I=*?gjKrQ=lD|i>Un-~OjUVE!IZ${{zi=b zRI}@}^5@ic6aBMqMDz4v?|n~|q%_q1c3G$jkyyy_Tf&COz!bY(!luYd82Jb6)u1y{ zY&GcY4>*iAt1+jj0Gh%GWP?0Y1DeBP$Sq(hYzb?@R9wU{6!pl^Y8rEv+2_vp0>b61(PxfDD_lI1@Ri|F z5S5?9CWS^#F%BvnP`!U(za#CMZ%Pv`i>|mJN-@9730#L)K=nfl zV1Kv}s_(rLDzR5VweH362Dk+7hOt7-<#i?1KRgcUbc`M+6Mi1ppM*=1zlK@xPq+-W zCFbQYT=|rayb`$sTm`$s)i4XLfy>}psP$-U7wKIKua0qWD+e3lU2qfB`rFOW7Nstg zF56_xRLm4ic%?L8h5e8QrLYgu^OqZ_avBgrJFQ9IVC>8yHPd%Z(1Rd7HOf)R9wc)6 z4QaF z6ROPj!h7Le@SsM3yE#zVE1)OgJ;;aPz3?d950At9pz6f^@C*0={1QG0ZBePcgvHUt z9NQtG3YXrR+(m-jq&Nq4ga2^=e>-0ZQCF`f`$cuz)z_BNwz;yWf;vEQRZx!XIl=QDn8J zJW%ya_GvILa$}ePHM7nKHQ34DxPb9RkRN+BmjaN=KiDbAL3ruxn@)<>Uc%f<{`zyJ zO7d)2+n=;Fezf#8e(+v^Egxg|U;WBmSiZPNV`Pni{^^VCx^O66oIDSI|8;a?LQKk* zZ|HKRT=^De!Bg;Rcp9>t%6vzbrA5wn$gK2n2*zWji}O8v3sTj+PvDP`MHbFakTnqI zv$F*YFpos82>$_V!e60uD!{o)?;^;{YF;rSOSiNCE+y4Q#9`iNVD~_U>S(=&U}p( z9h<|3DjupZhnL(uG*?b}o+5Zpa!>(scV|A&`VM57h{wH)`8q4}d-HWxrq|}{toaH# zP73a&U@A<8RbX9M6*60Ns=-c>&c|bB<Me{jV zMiuipS2}yAKJN6zP6PNDYzUu&jo_P*=OiATm&0=skB-D?0%@pDQ%GwuUw17Antzj>C5!6?q+Q5mB0p6Ph8Q{IEV0*X{ro+vUf!=JV+!5|Y z?gSr(o#A2F1-=Tq!uMe}_!VSg;Qd&b#@B;`^H}tRg^Dmyg^92?tP1-DEAnvoG#mlnf+OLVa4h^4j)SFH0%bmhS`UuLq7|F~yTXZZ z7@P#>!O3ttyciyam%wk~rLX`U;S{J(9!-TK;53*Cr^7qo4EQ>n34epLU@WybiggZp zz&UUZoC~jpEE4y2K$akRcR(I#dC$Ow@I!bdJOkN-!pp}rWD%?c7sJ{x6E=rSVJDac z$HHZB7F^CMb#Da+E3ok4N_Y=k1rNg2@MX9jehxRl@8Q+3a7pHCFbQsQolS4UUC5{5 zZul3x6_(Uw5{%P#!&Yz~yae6@x4?Vh z;Rus`|r!aAvg*ifz#nL5JiIX zEL;a)gg3yK;JxrDdZs3?+u(c{xi4}yYtGk59CGzJzHMtessf3SPpH_5BZr?Z`-+IEtx+ zuE-C*dI{tQU%d)eM^g}q8YH@-pUgmijK`X|25aG7tc`cD4!*)Z3U-W^L94liB z3_>nl)O%nnjKtQs6x-l&Y>RKP9Xh*k#)`F2zBIBIc2Ft*aU?>?*ok3y55qA_0jgpw zhn=tmcE%yt1?M2Yh3h-98{Wh2n57_9F_y!g*be!LTpxn`M6S=lKDZD2nn=7N(GOi* zsfw{74!}Mbf%9-6?n9oQp+CewFkd06Xl#r_Fbap_Rvd;;aX1!mql(609Esy_6z)J1 z4=&SR$^^P`^sHk8jKm0x!as2g?#F0+ieoW{2URy#!SUD;V{jr)z>Ua{{rXj$gsLY$ zbz*6pg2D13ds9gaCu15e!B{+l)A0w+z~WwH+;e3d~WMQ(*MN zIoKEf#CV*G+i)H}#QA9BZL++Uva~n9agxy*7oq%?Z80vuC3pgt;ulOn?;LVp z5U#)_n22X^C2B=!Td*Xq!cbg|akvIgnMkZ9@fp`)iDEP^7>*lo7H-4?xCuYvW-L~m zMh8Q2D^9^=+=<)p6>dlO68zMOt#Bt!!dQ_ysn#6A+2a6i7p187&0#t6Of5Z1!O z*cy*u4?K#|cnoLZNnC=ba2=k;{dfk?;dy+87cfgHehrZ2zc7ibWYofI*a5F&KfHk> z@eWSFyO@CYa0}kYzwiNG!-x15AE8#7GhfVw&s9UDJHDj53ckX+_*$0#jwI5^7>I9B z-tF=hr{X(YitlkVe!vs>5pUpEe2U-jBYsy6QN}U`&P1s5QNbdpVgmm-&}=o^r`6JxTMpRO){!5cMK}H$8fo1U}mcy^;gEl^#NT3t)*e|^(a&eAc z6{}((`eGa8VjaCJR>whD6USmLjK|uz0_)&rAIg6KiG5^n1E78i8{#bt#MjsemGZP! zm=&9#Gd9EG$PI&fHEe;6u_d-cE)LSWV>=v%Avh7aI7k=B#X)+4i9|;dTd)%z#?E*S zyWoB7f$y;=T34VkK}Y0%2;BqwV;LNP)iDBta3FTXLD&zuuR@=MJm^ecfy2>sfW!zA zw{RqW#Zj22B45yAIg~qT6V$O6M&fvk!lgI{_hK|&!?E}g$Dv~-+6F9zT;`-V#0l69 zC(2iEjUh3WjDo{PE6&1fxE|%Z#`c*=IFPu4Iq)g+fK>e}@{o5uw;y#m z7DoBTo1!yz$NV@9U2q~6z}e`A%g`ND&;wJ^6Q83On!c0Z1{ytwKXo>`V-fVh z64(SwVi=afp;#IxAWv%57h_r6h~@AA%6EmOVkNwZmGLuH!OS(Ove6BBYQ0G>M}o@{ z^?Fzx+h7gsiM4Pn*2Z|OgGm^GJFzaF!+Llh>*ITDfL67rvN1b0!D7fALb@*oVRH=D zDF0nZG$Uga%6ETFMfvWpg~)UB^&Qw2k7GN$jUkwZ+-juT)}}7Ud>D$wFbpeWXUz~* z7rW8j0lVV>?17`Pr-{UL620(G?2T(szKUxr_QjLf53gc>yoWptSAUHW_#Fpg_Bzz{ z=#KK0Ts|mYz2%SG12tv{j-WdlN8(g8jUus(#Aw_oGjK2JcmgBw7DnM09D|txsOvE= zj>QT%4r}3fY>F}19w%UboPy(VDlWijxFvw{A4}o{8Po9|&cH7ihq>!=ypLsY76xEE zwnBjsI2*^{Jp2>q;|5%SM{yzE!bSK27o&YW+5q&ZXQB}xQI(7Y48~>H6PM!%T!C?z zhzYnFH{cpPifi!#uEW>39+mpE0hkpxqBCwnZ`_RKaSPTnk=RP29VTO6+=h|39p@kq zG}e=F52oN=Jc}v#8290K+>cos&^DkK9>nT+2*dC&#^4cLk4MpTlf*F+b`ANG3H|Um z_QVsIfG6=Lp2EC=9M@xOJcF|_6;I(=e1qpOUn7q9u_j)?o_G;w<0U+Smu30qG7ZBO zGJNnVcE@Wt53l24yn$cvCYEi&uVvU3Z{weM2T$Q$RGZSsU~#;UZSes{<3rqtkMJ2j zmgV0mh(?ACFMNU3@Flj!SJ(qz<8VyFDfkAL;9J~;@9-$T$BXy@AK^!QkDt&!n8pV^ z@e5YNuOTFanXEPcl^hGP|j2ezZ8;nC+OhWm(wnLZ& zFQOejLVJ9VrmQ67eK*lm>ZX29^8$2@d|PUx&8+8 zVU`v&R_KmA|6Z?wF4(&T<-Y)lnPe2iUFeGUu@G9fq_sjv^unUZCFyz{^v0H01iN8T z9D!V_uE!#ms_Tof1a8HWco0kB1uTvCT2lVYkoZbQS#)egD~83;2kT;a48saI47v7Q zpN^Gq4OYghSOwMAv~E}weK8oT;UM(KNUVvou@-JJk*H1LAlAVP7=ZV%E`Gs!n5_-1 z8@i%=OHg@ih_x^fn`0yFh>dYLHo+O#6q7Ir4`VRi!e(gtM4~x~>}_fFusF8FHrNUy zu{Ey5HkgWS@hx^hLpxeMw8t>?#&E2R9We+yVMpwYL$C{u#jf(zd+{WClCczf;d<y0QANPtc-&(0Eb{R9EyE$7@BZ63LJrnI8wgYWjBdYWE{uQ zcpang368-J7>y3?Y3EjFdmDcKwq4V^>H4y!udu+WEWgW_eflXakvrl%7 zauO~iR-g|iVnbYsT`>uV;3|y4)i@v5;96XZhjAUA$MyICH(-`9T0bm>o3IsbMiXwq z6=9VBtt3v9k&GX48x{&RLtFpRt^i}Ijn@|u_<1_aJ-1a@Dh&0 z%P8;)uEVQ%1h3&O6N&32zTyqc)0tKdYvV2Kjkj?o-oagX7oXrm{D6Ud7zQrH-4)b-TmBR}70XyMGoP?in z6Mn{P_yujc(U@T_{E4N}V9h}(D)Q|NZAhqO{DD?D4mDhWMqG{7xE(X$Uuc65(H3pG z)5>8{%!0vahr`hxmta=>3$x)H%#Qhb(8yU+{%exRK}Jt>#2J_qcVI5Oi`*TgXYNTW zhh;G@wnZn5!hD#7&UhB{;}>*6w_co*VFN6P5$KA4Vj=D#()W{a!>8zud3$rNhQa8G zGtdjqVqwhDht^Mijz#3>SX6$F#pLIGY5gz&OW<%UiA%5)p25J zhx5?~Q?WdL#R^!eKdm2j!b&KxGNxh`%rb!159^>Wny?zK!|HesYha!TgZU*a4I?Q3 z{<23hYT_oWg^#c{IuE2(#3mSkW3VnJV?BI^^|9a}T0bm~jjg==&XUmrZ(~b*fvxZdw#Iya(E6b-w#5$E4#!~#uEq9v5j)@y3`MWOw2Igm z!*MWn#0A(151UAICh-!xVD2F_i&!1IVOQ*qQ?Unb#h!Q*d!hAET1za6eXu3=#nIRg zmt%iCg#+*dMqq(qoHL>+ki;MoVj>O?O z3fJOjyohq=)2UF!s)mPXW%1@ljYx8r`aW=3C_YX7>~&)@EOj=f{}dD zh|O?5hT#Gnf(vm5F2bd_7&qe*Jb_E`1}5NpT!v~C=a_O8Ig(g`#V`?T;Yw_WNjL;o zVH~c;6kLOkaV=&aL-UK3a6NXx%@~1Oa0+h41(=LmaT^{%({>WqN$kLqW)>YW z6+Q5RwIQl3UZ%S~UcoTDiV=7XC*XCQhc|E&-o(G~7T&?z_!jSA=5e&1m>=(9xpC|S z_elhh@c`T7LmY&Ua1uVo`S=9a<5S#?&+rUB$H({rKjTYO$J44}HhhhFF%3QO4VJ>U zSjj}<9f>;l9$VuF9Ecw=5%We!$H^v|G=&|7>D3+j6v=$*5^#2{EsA&M8+sg#?g2P zqwp+_!CM&3-unW_)2&UVO+W{nfCX?OdgCOlij%PoPQk7?6$j!pln=Ly#R*d>|IdhCZAa3pR-ftxT9H{%xEf+ul1-ozdF z3U{K(Fr8B>685+o3*bI1h5OMD4`2`;#141}d*NXmiGSe~JdO+S1g^uAxC>9=F+7V` z@f<$G^RoPZBXNNY+ZmiXVQ!RcoRG0EgXRNFbeNu96rDVe25$H z5$?ffcp9JMZG0iie;SFGWcqM02<<{!!ZxKVo5B7 zbj1r2aZN=`q$&p3s+!K+>XWYd_3j9IEe>jl)w*I60-{GYV^U<7=mRm8p~oL zmctY1gI};bde7!W1p}}m_Qgs#4=ZB|R>7B874y!a{QHs!n8TS04#4U-3v1#MtcAO= zHlD&d_yl=;f&K;SVzxgyAwd_ck0r4YRz)6fptr;(*bSRv6b50Oi9|4oL~Mpzu{j>W z)_5M<;45s4hPl-3=!_v)9NVKmcEBbWiecCZ`(S5`!7exlyW(c-hNeR#x|6tyJ@7I1 z#Lw6lt>E9ETlnJPyVf9FG%l9!|t0oP;}Z8Xm=1yob~A9nL_z1yuDm zlz$fzGs!56v(OLYF$n*}4mcNw;XIs(^Klt2z^%9tkK-b|f{XDfF2j$w9CIwB?nie_ z#HzSbE^#1Zoov`h}&@!p2yAj0Jq>5+=@1fIL=2W+=*Ve3;l67 z2IC&=iKe|IMvzFsSlovTa6hiY!?+8N;3YhYkMS597E|}510F{&Jb^xV66;_p2IE=m zgXeHGp2xVwl>ZAP63DoS+wl?}!OM6Vuj2!}frcg2{pf(Vun6A9DtHH*;9YEw_pmQM z!V&lwUif;I%3V168qF1P>-;VN{)!{}~H`M*TMgN!%miB^d;7MK?cqZfK( zMJ$fBu>^)94{Fi-V=0`3rEwne;1+!Ymc_lu%|`ketcW+T5`MzUwv>O{l{5-ucwkj5 zkG|Ldt6^)D53uZkHE}T3!s%EWmtY;-jRANH>*77EhiOKj-5u4*&Y>kQ71`l9cJdf@06^5W;6>S3MLiwCWcML@z?1cW<8AH(2 zg+w0`T`>l`;T-IaYq1CJ!k%~%`{GsXhwrgJTCb)}zycV7rEnnD#X;Bt|G=&|34lj8gHOnL(h=gi1vn8G z;u2hh>v1ve!)161m*W!?i4`QiU?S#NN27r5n1q#(JKOXCT#c=8J$A+oXu^#ci<>YJ zH{*8Pf~hDUO?V5rGfsbvJMla2LR04TGzugN;U4tGz1Rp-usiO!XJcpz3JWj(4xEwFyHoSzV z@iN}UEBG0&V)l)kFJNK3j+OBS2I5U@gSW6Z-o|LWBg_9R5_id1g7b92?;aY>R2w9pBg*A_wC;x~JfKxpya!_<%d{Bc8=i z_yj+rVKa>g=E1L662D;`{ElJx0|($wj6!Ze)&(kSg;6Y z!XUK4VQ7nsF*6=R?vm8g&<>rp(zsw9%!=JG8_vS)xE&qv4(7s7m>X@AX+zK>nev~P zM0qltuo33N4(N=7F+WD53(ms=cn}NXb96=5Z8R>}96hlYdf`wkjB)6V30MR-U{Tz& zjq+cNL@F7@@jjNoZ&(uTx6`>|!EOoy2ggfidWZbFen9$2xc%1MoW5#dlaQvmx4XCyff0#9;DkAUCG!&9OOl z#1?!$8r#!72|M5tYt(n|*xQgavUKR>0-h2v=ZdOvDkm5@%o%u0+!+5=Tg^#(TI1f8bhl+|QRy z=z;6825!KnxCOi6R*b@AjKgiX0=MHf+=0h%C*Hwb_yKogrUR7!JtXoUpwYn+n1Xfi zAco)}9D;{229Mx8Jc?`Z81BKp@FE_^XLtg?;YoBjNF#)9cp9tVISe{zqOl>-n~V!M z3NPYxyo5{eGH${vcpR_dZM=qQcpa?|(b!-fyosgoE>^>P*c|U;FMNPe_z>rqNIW8u zjF0gkKEVt46kp&o{DH49`(b`iz+#w&zW4?k;ahBr?=S-2<81tZDfkf|<0rH`Lfe9- z(j>l+=zw2wGJeA({Elbw2O5sjxS$6bvT#m^3XVh-lh6t;poX8(2D2Zd4Z&iV8GSJe z2BBRR%6|tE_GI)!2aLoVI0qdu33K9M%!Mz}3BO`K%>5T_1s2Bq=!-7c2n%3GEQkZq z6{FDu=c1?i$ulIp$T)(9@j80r3oL@_aT*JB#A4`y#nBH-V0SE&g?1gw(LDuyFcHh+ zcC3J@$gTPMU95y(u(F9nmJ>7*m>;X65Bg$LtcKlDKG8`&2c-tiMn7DS{&*H^;ydJ? ze?9j}+77IQb+9c4;83iK@mLQJps7BI*CZNX-c$S#fqoc>-LVnQ!XR9V!MFpPVJbGq zSJ(o-VN0|>&9CR^jjgdVhG0W%k6p0?4mnNv4w`(y7cZw${`--zI?I_17REtr%knsw z?m!%Z-Eb%l#bFqW!*MZ=z^ynEkKic0jHB^2%1vx@jz$SxF%o?-3Y(iqj3Ln*qcIxC z;yfIOdvHA7#u!x3(Cjp5YzAw+Fqsc z!hHA_7RTdQ7f;BYqcw?>*aJ^tB%a0k|+6dzzXKE%QJ2*=}NoQY3x zB|gQi_zaKWD|~{l@e8J5wwsjyHzZtd(t2Tee1`$}9-H9@?2aGt5B!AV@Ea!LcifIY zFcp8|U6haV`H1pSJ~p>#q%ap+VNsNi=Bap#@-Ls=Q;!V!ES{byAH_2QvtTUR;bOGM zt(X;$AWt>X&trCcf)4lrb6}?1oatar%!3s$FV;mT48?rd-$cTh#8}La@#umpun-R+tAXV{xp4)vziyMjqdy_eMV)h5k4LYvNL@h1;+;9>Y3#73=f-7d?$c12XLH z(fFVX24Wd(gf+1-Hp3>^3!9>jK{y?QaXB`_WNeP7u{A!#HmKa^+cM07?a&KDc>arC zkwkkk>R|_LkD(ZWVK@fEaW;0umDmaQVK=;t-SI8LkN9DoZj0=ME|Jc&c_F%HGgI1KF{(gs@24is%&ctM#g=aAy z@1ektk0}4MN!UE5(LpEt6U*RS48VEV3g=^QT!5o+A&m;9{<8bJdTI(1g7Fie2k~?9iGN-cm{2r(N>@{ zp2d=Q4*l^wHo^Ug0zQd3B9<5%`w#f3Ijl@SXobeMD#?M#|zhDjgiVg7_w!-h&34dTe z{D~uw=dkH9sNhUgaWPuq8q{zH8u2h%n@F4`kqK|24L(I%{D7HJeMw`4SC^aX99}acIg-Vg?DGc%?7IytoRTFd6gV0d&UGm>;j9 z3qHaE_!bM|PjtmBuV}n554xc{@+2+26nbD)^u)TaDF0q0nvqc$L(v<1VG$gPMKKzS zVJsHMc~}Ayu_SIr9?_+zU}-#oW$-eV#rs$e)6fUMV|mQ{n(|+PMDEwLcIbwcuq0N- zDp&;ruqrk~Ukt@+*bA%U5UhdG=!dcBkMpo5CSonzjI}WZ>)=s45&W)Z z0<}j4?d4!0L&v9zJSp@E^H z;SG6ms7e1AYOIxID5)Gu`fo!m_{UJSxEDZ9t2WA^>Y(L0oh1#@jA?E7eW;@Hwih|n z{Pdv~pyf&bRSeRMp$_I1)%$Dt%BUO+%Koj;9yPP_VaO#Ys#(qb*CYRI`cy1$RMuYNF-8-#{`?+;7#}u{fQVNkw_t~6Yq$e{*)P_ z9wBeymN#(6603=W#C75wk-aA4BI?yN(IbhWL@cqHI6=H7Y-%wwqBhZ;(1~5ddBRYe znI(LQ=EP7Ume@v|AwCh=>+m_zoQNS75xa=<#3v$q0Oilbzox`cB9>TB93`F;T3xCT z!k6ewj3nj}n~C$pbHa`->Olk&or%dr0&#|TOxV@ubD|y*M#K<{h@-@9!t{-QIU6u1 zL{p+S5lti#Da38!6XDvBeuyw)C^3)NOk5^j6Zr$#wnTHHHxWxD5+{iJ#5W>mBgR2A zC3J%OW8Do$N!%v#HfGxs@}5|oSWO%xUN@fZUpBt2nzL*W>pkNyQ88FwGFTZDnNhOS zpnegYgcz(GG&<*zDf_)-*wlDO0Y!9fr^ec?WB_l)GJq(w*E)~L6QVjeXJpA?DHrmQ zPKJIATST!EwL;WkYN8_cgs5fhcxs;YqKx6&%i$f{s}5FViNfvGAgh%mMvzbv#mOOB zsT?gCNygtQhV7?{tV6X1a(rz&sBU&VbghC(CGj?L zgvLk;SXufjU~qM?5@}&-K`}E-brc0dRTul4zkO(9{!pjAWXLhy^)2f^3C0OV@}l1H0D>j|i>ZuT{T@UgmYmy;O$&3@?Yx z=wGg{;?`_V^81rNKYcv;m_<2(%{0py6B;-uLLBd)+Pc(cfb+x$J~0|C6Lw<&xzRR@ zRBy%ERxTowqthW&EodIXhe^CAE35UdA#5{-aLQ7Ks?gOTvpGYlY~}7EXR9~ExR8}C zlVzCP^kQ%B#eWyiwy)=CRY*+9YMsR-_an{Pp!o2i(qGj#tNIT$YHq=(RAtO_HQHYt zXQRfnEf^E4OqioixT{WDsZ8yxW;bX|ATPsYQPil^nAphKhA|21gdi)`V9lf0i<+06 zUvABRZGT(mYnfj8^qDdY>Lc=msZQm&@={(~ARpmo$oNpMU>_S+F!?3OubDnj#tQBy zc6U(oxCGJ*R}UFZGNr`yUgY|atF)g;>!3Ot+GGgf0}%M6P@8RGaXgUWgcVfPVchUjF091Cx_YcYyXpV z$`+BAR94C;0^xC6CfY)&Df8 zA?zxOY&EkgiV}HKHLsE?>AMKW;O4))=6cMM-oVT+&6xRpDb|jbRl?V7^88RfPM2T8 zEX$TL^IQKp^ILz-yn!KR6HgiUncs$zGjATsNhu?KZc>VxmmxT#IAknCL0vbf1j}G0 z^Rg+bqU(`7kH)fT1JajckStvMnOCJHY1qhe?93u-y*wiGKI^QaR2Q{`gPelgDaxh~ z`CKf1qdHn|BKt&^xRNhBVehMSlD-i*7hN*R}qL!6t@cs9?uX@MO&@!b%OUnV|ez2N} zhA}QVo{V8L8$29ZG#j?5-3|wHJ2S{Z9+hn-ERB<52r|FgQ|#)h=I`Q7etudvTZ6yB zmiPJC8oUWNqM?DJW^T-6rBaTdTep>m8T`o-T#u+i6eQmtU9lz>!usfjP0?MH>82Jm zS=u$lFqAC$myJk~3I2-ED?5>)7|Q*iILgVFM7aXXpxoGHk$&aun4h)ogU#qJkKM5X z%C@p1()`LNberEdgIV=K=@~vAXK7|i@!cvg_^n*O;v)}fpEGxyJY8S2u_{K(a3(i@OqUFi*x zwB8y?n_t{1C(x1ZK)O3&Ba{o*7)M|e9FMGH^Xuk=a3S5nxC&V@dNMZ0ZP)_0qg;U9 zX0!2~4GB4+Q`l0J8KaG{A4;;H`8Yr^w3KgG?bePVK+{L%lEhzCt4EnZ8*Q)6#Gu)dl?QhO7&EoOx+krPK@noo>&i* z+rB4yqMTcA>_xZS7kZ=I4f`OAX6TD@W@LY?Yu*#amy0+6<-Q{G+aUXg`C;(`F@$b* z54jJS41bUyWKFM+LG~AYF0x+qwJ1lh5r@&e35Vlf$Trb$rGI`8N78*CM`0R{#!qO% z&nU<96(i~XhEZt6BasbERM%Jq(P+f6XpQ4A2g(7Rkd3eB!x;3$30MXvBG2hIOu_~@ z89U(=9E@`K;W(A<5jYLwFcuR#r}x0opu9Q7{DRaOxP$IE+=nx9e|mohF`n*2D3C`Z z8)hSqMmEgBQ}`#IM%JQ!2Iq+)G{66g6?XV$SP(!Cc|nnT9L5^Tc`KPK5ke? zH~Y9@J+k|mM=VR8oB&(Vuz`HGlYza!Tmsn(%q4I$G7-ZT+=-MvbHS3sU7&j#-4}5? zevl z@@-G@U4WkHYp9P|xyCZyoxPdjY&nNe%;ytwDH;)`L_Uyz&sf#$JBH_IkFPK*zDBt+ zsXWc)TJAh0=zc@D+z4;62FiT7zTVMY3*TdN{DAH7BZi>tFC3|SWy5MRzxbk0`UeB? zD<2HPZ#V?M;~4yb)P;thxCj-#p`*;3M@SJisB}|=4OYkwY|xM$(m>^{GjRizw{FK0 z${EOxndo+qHN6dq0%X{ttidy*S9*`$$Uu4#w8zqz6=nU94XYy~GuQME=tnoLgC2-- zLe0>T?&g>iLopZj!rVAamj65?qLJoA7bpi@fHW)mLUhJmNabWM_bzyiZf074jk5oD zSdi}b=!z<(rx4nr8)in?pB;M8ZI3LhZpul5rPXs`VRS>5+We|)mfBo#6h%++i=h`5 zM|tvD0%e6#5`D20%KC)0q}M>!lDXa}i*4wxjFv+Y`7T&loCCzA30gz@0Jcv?>0Ba8 zP1M@`*Q{#d{6x(omz6;?e`QG>!gcKOP+c($w!Fc{m(jEM=GSG|A{)nia445M2i?+o z=uduQtcf&1=GSAi!~nWw3sfIFAeFoxhE(o)SEO<`AK(UIU%G>_KeBP<9;+H!hz$eO zhSqFo&Lc%qq>|4hr)f<;t?4Hdwn16E+G0*@hq+Pqmls3mcEa}PmY(m49q6u@-YuKc zFuJQ?I0j-zY=ks4dMI{Q470||V|b1+^cXVageIpOk8*U9MsNfNPQzux^KFq)=MuP3{;Owu&{eQNDMcW=7o?%4-x zqAbgGurJ-R4EMuUvaI$e(K@|{_BepQ^h_l5NC%Q%?s zD>ww7B8SL2M=9nRc!9EJdx^3J`za6PN0MOS%a6l z^5BNHRGymhXUX^fEx*@q`PKi?%i_ zM@Jj0rYC@}Tda55WR#tVzrSs7QNMQhpm57Zt{yjFRk4hXtY&8@HOg9zqN2*!z#K4f zud8JPXN;X%NFKqN|E91yOIXi8wbEt2a zNrpTinuQ!1m`6m@Z{XO)e1OC`i}?U&4qhc+R^IaPK~~c8@L?Vn#`&1OeMGi#N}hW1 zHRDr=q5rX(|Cw)I-T%$nwrfUp)@-_e+xV-BYbGXWy?3c93YN2S5`I?|J9Y2U$?de{)V})D>7>lSy9V{nxuI-L@k%UFUvj5RTd}1 zM){q49?|rsVxw#nZEh;=Fe*ta<*;;xrO$lyDXXuIA}z0VL2*4vvvK(J+h_88$nu$! zuhH@yZhhXgAt#cXLG8^Smsq8_JCslQm7UF;ZT@zCu2{B8Yn6$H%sMJb73##8O zS8MK>mXJ3oNsTM@vb{L7TFaSfDH&U3#{NRWZjEN=K*v9pXM;%H!*3^kYcv~WgBY+z z%O`3~QtU11Cdv}AZ;e*aip>x=?SPZ`wnp=jD?IKN9f4~#AC(mxwN|@nyD>qIS22{1 z3wq@!UXL(Zi>~+h0($j2El_3sep#oDR-=|D4_~jXwNj&!#GZ3%K2dwK=B-Xj5~m(1 zqt&fR$uBo+H?y@(GOuZxOj&X9M=3D`vTO7vqKO1z7jc<*O=!(&PKioHQ=&H!O(YPz zi1WmAB72MJ{#WAm-8ziEx;u-2 zR4qUW6;o0*ce`-12FL-JhA4A~Un@_iY9*A=xS)HEBKuh_zja6Y809R=o;43N>@0!Z~)+ zE@TzSpT5TA>}RYo*)+2#Kh9}2Rc6+_kA$3O9~s~rck_Neu}G$wA@c|KWe2m8^@280 zWeR^@&??w6TJwHbM!s-UJinj?*5qbR^Is+YA7s@%Cin)`;6eBjA;chJCb610O57&i z5q7kV9<4U`k5l3=YaU8t;dxnew`yF^Ae!V>+lWO?mHZ;*vesW2Ey`Tcnkl!$Sjk{< z1=P>=Maiq$U8SpVxTY0@YS*+p$_UZonzl~4AdJ^Fch3tAEI$#*qpG|dR_TO4Gx#(; zUsflISbSY`j=!yGqW5*pTk#jOu4_A$r6TACqg^US-C(ra#H<_ICY$V>Pnb8Ta*qw# z>89r3l#wMT(V1h6^+Z-CQBX{|sZCQV3zu7(N$D)+-_qP+-z~;AQe3&EHBlCdBDdi$ zG3>ThRmm#0+-4UoES}tE@)O0fJ6d5ld4~a(hzED*^N=WiS8JlaZY0LtrIIZt_T6QO zK=J;rmdq@!xu+F&+Q#XdrMk0nkUxNBw=;jkZnz^}+|w#5RfOk#O(^}v?)&sCkBu{W z=K4Q*`Ih1~PEUX9HId%rk4hz3&Qc=v0ljt+(;v{Q{!p_c zJ>{X6M_tiW41c6`6gH2v(#kdS=k|H2YUdGy8SQbAt%kdQXvqRa6q> z5M9K}Cz_XX+%mP&PZ`s3QSB-7al$fkU1r^qy-rfBh0`-Og0=8}Mh^u|3?#gjMmx<*uf%Tx}FK5w-Z?8>>`(Mx4f?H#=Yi5BnZWsq3*j$WpS zEAQyVMnt}6QEXcOnvvNq6nLT#Gr|u0o-)x^1bv{dw!ih&y#S{zggg_D5Ys=fi0j44 z59}B0B_B0+r)$6UJg6W|41)+*eLd#m(r%W%4hn}a+9dT^8?oSvR@CX)Z@q1! z7tXHDBQuIS^hPVu=PS!9pPQ}lp{ymM>Ei^!-fHM0)_i654~lBvv=QouwqnOOZ8()q z`S02g_K!8+se(?6E8iK@2iaB7zBUK!+Xz|qKFCjciElqNSH(lP{M1T8qn~V@%A(6p zHcN<@^HbZYE)5ZDziS2TeY|O22|1ffXGIz(QKQ%^#==gALVnGjM-k4wigGN>@zVp* zNHLaEoJ6EzY{p10D8{Pn`3|aah;md+P>nU%RgS5~1Ihw1#mYEBP3tH!YsSIsRgs!; zjFoFAgSq7venw+#JE7NpJPRhJ8e(5vrMtDxg}my%owPCXeVA4Ge#&L$>GI~&a%%@ zC5+vaL&*M027)5kn*pyNJugYr>BG(}VCMS`$NwSYkbKlz2?YUw>VRN^rhVizHwWBxpJgMSVszJk$% z>v=pYuyZAfMiq?HlzZYv1qw$V(W0WUm*Ot=RW!OonaW0!{dv}IEQhU>eVVcXmDt7R z3fsyIJXiKGi6a3rhX|i4MpwmAw5YeDRZ zFJEJX`Zc)o5U$q*>rOe-*8kDF!BHWM7 z&;0otomZszQAp+{%e106Cf}&ZEZNTB;6d)xtxWPZ45?_xse@l4QV>xe$`t^)Em0QWi`o>3!b!mF4M^9Om z_&|E9E<6K`Ba{@eIFO}E5yt{qCl^IfBdWcNE^@{#wK8WdhV_IzMXV~OH!{X4O@(J; zhG{AqH8$o^#)&SC*}w_nz06DyE=|bXB+56TcwQ|a7QCi{JxDp4NxhlCh^`8Urj+}9 zqE1s|E5%#PmtAopRdPfagN)_WPX$GlAY)mjr05f5JjY?Ke=u`3+V$65wdQE@J~4v1 zN)eI4##>5V5#Efx>K6Ld*HF%zG#m2|%7$5DaWndAC?cC1-JKdz)iW>Vc4sDi@N_A@ zMBtk&vAel(lM*Wiv|wDZzxBlfa^w?O%BCXj#okgS8#ue&FPq8*u%`NQO&=!moE^Uk}l$qjC z8`kDb@uCfD^Rh6uW!}TZgSKRb3;TAgtEIxfow1d=#Y-$`YV;B*?Wnxn#7X&4OQD3Y z8pjuwtI;f;^8=EK>ldE-L z6l~oAp;XHWqJ5b0i0#z^a(yX=1W{-JHMw87@r;!+I@zI%tnTY3zvybrqOx?KyBj|$ zvB_yYWPv%GY~PF7Rg1fel1tTm$xVC9=A~hB`#$8d@OS!B-!JNG^kbn(w^L>&SL-Lo z7oO}i!1&S16viGql9)-XCyo;LiEl*SPSm1AAkmqKCgu^li1Wld!mcwF8sSHT5km?2 zMu64CLE<{`jmX)BnwzLibS6d;Jm5c*VLgcxU8ei@+&b83XInniwvg$}>m# zx1OnH{5_QR3XZW>qGQzP8|t`aYRt!i z6G|u(=c^MRs*~3$(|Yi|FPB`JztYL9sAH@rl!!cO81qG)n9WMA=#0xpGp_2sA(u1# z?-A4co<38Cj)R2HTkGtO=2hFB%@WI4W#8Xth?Zfhms0|HrO8{v&@JOEiz2_k{Ey4b z9n3vWrpNvCn0w~09{=kl=PlEhSS?PkN;R&bkF2FcPEevMt5H$vm}BbL#>&`uWt^`% zE=C=H+VZ`2#;)^k*GxZViLTBRS;JJfe_SekHGMYZ?vZh+bY*srYw7vvy9Y<+|K(EY zMzek`f!sI#=S!ta#Q*AB?ic@;OQmxQOYa%GMEa%Dcg39XMwfswlhv`6)bVYV@f($x za5ZMRIx$$8e4o+&UWESbTInaO2l!juC|6i{l$-niwD<1uHC<`^@IEIw`y?bJ2uTPDi6kWC zeo>c%B*Zl#t`%}fQfX0_xWv#TEiH$ z`+lFbo}F`&s_8U+-}m>&?|giHpS9Mr?$28LvR2lP1BZg+!Ck=#;6dO-@HlWM@T1@d zz*E4T!BZ8hjnU*W10G$}#%Og3zW2sxR7IAl2N=^Y?Fh%F1hvtb?kQ+-kNPbQ{xmv! zf}4SRf&IZ0j;4|Oo>6}3M!Ds_XOx@vJFAV+{ScuKJo?k9Q0izA&#^_8i zRc;`dZsbvMxh*pbTn_hO@blmy;8(#z!Ifa7DK|#rL0WE%P6h9Se=7E-*Vq_6!oD&3 z-+v~{M?EfX9N{f%Cv{!|1sgtUlB-~iSO22X}N1dQIVu_+c-AUDMp zf~knpug|+niBkS`{x@2`<6E4d7BF zyc;|Z?qlGmz@LIC;V;1R;rFvVZM zjCEzXn|W0+gl7?PGx$01PVj2f>?n90-1H9O1@M<(O5hvti*WxFj8-V2xqBm+{<7~S za4h&`aBnc__Xlr+djNPdcqI50@K`Wxx1=~10x9N$af?*)5O^DyHog7@Oq*V}gK2MT z1sMA{0~GPDex}vLNEqJ$s#bisbn#D4;V|Ma+@+1foYp^amgkK zk05~dA<<9mZEA!aP50Xz8-rWZ|7C-05VULWkNpc~(Bl6$Hpo(DwKvF8X7|WzIA(|6 zvKyB+Y5dj=vh?Q10#nzAfZv8Y6#Q2(CU?2x zI~jZ!?(SgH>k0lF+`Yg@z?c`MKju5R(R&2=UHFd#{~bJz1}%oB{OgC~;3p999vC;9 zG9nCL?(~M?%bnh^C%MxbiO8Ma#&G@|?$d~O8GHtO6Z|3gd+?$!;j#8(>WF za__V!_$=J$VtHAht;_$Wi%1g)NJK`U>wy>CP?md`TY{Ux9R&6Uw*^ze*hMV2Fo%Mh z!#@Jt0vrkU19t@@uG~A_3Y-MDKe#WL;tv7`z@0_YeQOA#!EL~gfCIrrU}Rb{7aR=6 z{v#Q2Ef|?ggF@zV?=6}fl18<_s)0^u=X0`5s*+z_aZ(%EvOv=vsR;VDwQT59sC-YJ~}B`cI|V0Z8sFipPLHd4|Q zOoj9Y=fdp+&I7k*f0~^0;f`l_A{g(y<>Xud#$B!UFt{HWRwQ>yk2iKo<90*tl%|Xp zL4nwqbl1TB1l%Cn?|bi^((0M={yU|gL?T{D1e2cJDLo(D7VZULni{Bfoxls>PG)x+ z_-VN5QnCnK3SJD}1zrL^PE*96d8hOX@TfunB|uX?F^yPC7^75s5pH->EpXTH$Ly5O zS%nUx8*;f*I{qbOft<9L!DL>Ws0iTA(oNa^a^p0fT-C`DY+yC8 z12_xZ0Gbrw)p7wgPG>+E2h0c70mp#Lz>h$ahwyZ+>_Pkpk+%o&BgEo8Sh~v+k#C^FSt9!ltmlmto8Q24)N+ydCOnsm zyf@+bny7daO;aUO_gbc!|I=Q)u@@`CULt&-WvZ#OSWh%ocVhIs*k62oW%aBma z%%fN-2{{V6Gs!(%$A+mK+R#3Cv7JJm6z7gw1{AM^4ebDq0apRK<@W~?fMLKSU>UFl zI1AhW+{VL@fxbX4Py(z3b^|AY8-U9Mqyr=XS-^N;F0dNd4V(n7PQaQ8J-+Ble?E*5Lct7niSVBN%W&dNAZ6@ns1SKQr(S2ArZE?cl=0q;JtM-uGRlDef zrG@?uv_@u%Z6_>gFvQy@EIq7$gIAj@Co$jy=S12F@SdfOeguB0S>lEFEWP1%9bRrn z;nhEj{@e#fRdEOBtVEx*gd@~;($Z6Z7ojJxso4G0%uTJk~QT0AnlMji4_bt)-aYPz4 z0-G2u9Xtndn8eE?0|rRrrP#HbG}{SkTV2bPZdd+>UDg!t?OM1K3%BIlh(MKs4vBa2@Gs`bR4*U@E z$jr(SA6mY0az!(v{Y+YGxx+T+V@s}6Dq8-n56nK|(#Kfq?w?gz?-R=`XQvax*?Zlm z@J2Jf`>ADxt7;LG)>Z8ynSIGJ+l)5&;gV&AQ`rb7@#-NYw57^2-&IwrS~KG_XrdY? zKC?V#ZvS9q|IaOLLyC2}isQGPnWpC$7+e-G9#{ly01g4?fg6C!qnLt$6kr@cFG1D; zyMfEVk3b+2>I~!nGl6x$Zs0s{3vinZoynS$)@!o(uD;#@o85xk^fpe(5pqxFMsdRp zTTbVS!R~q+P?0-!cpniy4d6N=x-`(AH{XpA7aQoUiOmhMB|J*3Z>aY{I@cTO#fUP& zLmvR$eIU|l;HmeAPPV7sJ}QR{7(YxrS`G>_6Icpt0uBJ@fm?vb6zBj+Q_7OlRy5N6 zb=+*~{-;ITM*4KUDdhI2#i&wKr$*#YuYTNIC+kG4B9===r z5RRV*Fbs(o0*inR$Yi11G5;8BEG@-x$9!4}@0iD3xSpS)cFgBPMUL&qYVDXWfl_IT z+A;r_+A&`Wuf$Zfd-pN5V;*-}dO@n%G5?r2*GzAtC{*(_13-JSNBr8jcKga6Q{6y-pkpd{)*_PLy(&c5*|Lfi~GOQRTNrxX(-lT z#CDU;uR6PVjYqsdw8W=)?L)mn;hrM-Q&V$M=%a^Wr^0$4eYABhN*30Kcga5{`uXZ@ ztn=U(+eht^KkchG(Q#X+=kyWZ`05>;a-dA7kC^7kap{Eiv~PV!%h|WSqow55_rz2x z!7sPIkMz^~n$b|N`004tr(KV`RU*R69KpUU-Q4i1y)3<{9iO(fi%;9a8v(sl zd!DMR7p9%yrB2%lfgn%Y+V#uRw(u4~{{|Q31iiNz>B-Z!-hf|97^i1HZ3|w%JZ)(ND|)-tG{dv>@=gaUuL^ohN&dlL0~pSJZTis02j#s00QZ5jI1UXG`2wcvD&3sI%R z$vgKvZEG$^ppk|J!MuDv#N;8*dZYPxw|x!PaRGTH zr$}vp_ajiVFCeoaX-(i?mj&dvQ1aF>+#dH{KsJJDARsqwkA3J+;rG}J@3??GfD<(? zZ8BEP1!Q9|7`urAiVp;);McxWpk>U`n`?d=?Hc> zYm0)X$Ev%~Vv0_K*bVB&67v1d+WIT>8)T|BzTXn^ubs7J#I>Kb)ym-yheBT8 z+mf=ns{Nm}q^vHU|944Qowen#r2LJ%t1!;m8jbrM8pSrS3wR8e-ZhQ|w*%*ayMytv z^LH&N(_$0dWXQ9&@X#(Z!-KiZ3=iM(g(n_&YOFTl(MGN|;Sol@BE(ZdNiqt7o4OjS zO?0zHcYV{qgTVCWZ#bAV_l$n@%VGNOYrY9xDbm0AnN zL%uw}2#@gEIuV+ttFyM$z1zLd+Ij)epe?hZcb6OB#!DEvMonh;GTd}o*aQv$Q@w)0 zo8b-tzXGOL-sImI{3_gCz+2D<8Ps3f;V~2*72sj4m<>j+$`|>VHSc-W)=v1Nx8)i& zI!mrmqY>pAH3}uysNVzwHO|`F3-^cc-v^dwZS9BfGd$h`V=YKK0Hz+K5@Q8LI|z3i z_-$|x@L$2yqldtKz@&#&2zi!PfAHVnk5vb`vN{BO6mIHym}f~Y`0wC6@Gv{CXj+!w)Tz_`7VE2~!UM{oy%&w^=r zhxF;Jt#fe8v$j5l&<7r$fa$EQ^WZ_ONM~(bgqzlVJ_XZRTbICe)>ajm&f5A6JRXbz zC(qi#fRoz}u7GLV!584^;4i^N;HzL9bwMku>a4A=;86~be}GqjzXsD;TQ7qDx9tS~ z%T|I>+C9$N`jzGV-?+N(M;ovBr(XZx@2oB4_5bBrTj~j-=5lfMSz9;I)UX}7D2){9MW7ec`do&k0OKLN&MEZ2)M8JDbs+X}`UArpK9>;gB9cULehU9LC7VC8x< z3MEv0h9I&!O%~5BXMu5*kjuri?u>;#x$Z2_+Mi)p=?){AMqnI@DNFs&D3wv_9|m@VacaXgsjjRf#; zFj`9vXSFjZSd(XMEw|J>YfCN`*F0-WdSU&zw;pI;KUNQa)$7N}NE>Y+572T2_ki02 zOpVisxfeJM{{6u{!5Lu8L?0XGFx8NI3-?3de&BK7(cl7O`M4M!^Wi}mEn>!fgv@Xa7%f%;qJ`IcFCVKX%KI-L zKY>KNkO)jzE+5YWw}tyjFwGQHyH4Pz;7(?D8W@*2xqQ3;TnhI>@GkJv;NvtiEaK&3 zjDeCW1W*EW4@ZnaDig+_)7HTaZ>q%~wtU>lIG9i^AHRq!kQ4oV87vq(^{5Eom!$jN z%g2526e`c%qUGc1v6U}m=nl)r>QT{HKHe((LT%V1YyAt{_gX$SPLlF(1||H+0$0NP zwg88Ks{q|(2Lhde9AGA}64(x$1#SRMrsGX2kO7RFj^*P;5Hc<;YGMgklTi05>JazydYKasfLn^HNRHMW3s>E34;`SPEp(sMo0-9gb@<2>8ZE? z4=pkS_z?%?C{9mTyegFaV-*i)cF$GrBFVUL4Ynx{TOY-@Co9gz7^H+vO%>n87$tW< zE=V%QFu50V_{NFKogJrmPM+e(;fjY3P@Ea4cq8Tn+V84eBLRFJ!;9F0Nrbr6SMkv{ zikEXlKi0QlE+)P7#)>oj73Xn_6+NKb*SW>!am!BNg5E|8V`{-L;HD|!7Vzn&B6`6t zDEx|t;?Tj0w+>Mp6tDO&Y@PH%xuEX4a_<|f_$ce!xZugGcPc$DHZPKr~FzQv`0!k0gyIMP$`ssP3FCMZ7IS@F4Xir2SL9O{SmrvyqlqpAeu zcIT!tal)DT%D*UC@j)IPYj|`d^XRxRRfWfL{Gg7?UC={uSp&rtJUW7krzwxST;hHq z%DrHq;*C6Px}++%g}WlrpTjw$3v9IWxbICoEc3YUD^N?SXc-%41-E$db++fBRtGTxC--& z9RCxzX0B{}scd`}HoiNYP$CMEgYJP4Axfb(LM|8XwhQSS0CY@>VFMhn0tNer5 z22KU>#VwEf@(MRCK1eBBU^q|J!`ViTb5jnUAU+_1OkYT*EHymH#y6 z1xd;s&NfuaqoH4>@;}8BX*gFfIam3w;g+r7(YJ4q^e@)JxoJ0dRf@LyiajG07o{nl zHbrqFcS&k1<@RBlxWl7xeJbmdal!-+a)S)d;rKi{i=-*QdY6w;0Y}*e&NStS+*KRd zJ)8@W*Ib4B^jCZ>O0g|N@y>CIZ%$JjX_&%bb~`H$vVv*!_;6Dn=ZUP0C$59c3;b1t zHC$649yJwgq*wZ?@G|a#ecVD<_|kKGk_r#!t_qmJ`p8?3o~@i<5gXw_Zc1CaQrzjJ zcuf<uRW}IqdSkD;XI*~j#mN4*+>ew?`{uN z{-r#BT$rxh>1?!%*=W1)e3Q-d$T@Do$i_;49}oMY6y>%xMEjGGxU$uzv(Y88(G4D| z!YyoU{kRMI^-})fp^DQv;l(-1eV1FPg6A7Q?xNdlV`ZHF(PCDhzpSN#9Oe1L#EKPc z8=h>{K|G&ivaMVnrQ%)SF5D@v3HVFEMqCh2#p&#xzy-% zJ9{eserm$dVkav1zA1{Uj27czw`aWaU&ZnFurYe^Jd?-aJ}IP!{x3^b5$5D8_GF_v z$VN4ft$s5blUJeA%VwMDA``;%4$pYUxeGRCE4_0Oitlh2ZsdYrpb8^@?Ht!EnFID1 zEx@C~osG@L#um$c80w-DKFY>sY@)u#1=(Zc0`yTF5U%)+RdFd=PLBTyzD8Wh7b;y_vi20(a$2?mBlix_#V*Mcjp{+=Z(;qWx*unYa&=-IRMD z_tkppBZOPB6kp-4Ddny?!!31~n>4bU(ko;48XgS`xQl}LDtd+aS~2(08l#W6E0P zN^x+2;+;Iv&?X)#Oi(+;Wy}}2#ZK9je_pWSBECw_<1Q>^o4GCL1N47nf2G)u3sAr{ z+uU0D`%P4AVXF`2jPk;j|EUp*V>1_ZQ zzF6fB;=aDXU6Puo{Fjebe2^2q9i!Y8s0?*YI@`bmE}#z^?>TO<@MNX8wLOpjNKU|g zmYV|bi3rJ z@Uj%en^}KNv~qj#*eNJb?v2wW7i*d9VR=Xe-0ZISdRN6kYykyq(|)XXxW5YT!WOfc zGYDXl^immU$2q;CNKQ9R@j+=Z#W?vOSb3~r)7i(S6EsQr@8g2Zp_i+&$)nIO+bKG~4Y%{4`&`ciA2dAp^ zD%i+MTX6wc{|wvMG`6vM#oV;3yp-Y*to_!4rL6H1O%32tR0>cYl1%}x1lWcL*|t_n7;&?FT;hi&I5 z+fFQ3@D$Gr$LlG*u&r<=ZgB7Q<@!)SYWDRZHhv_tIP}p>~nE;-E?mVFU z7x2uzm2JW_QTZQd+c?!ixjplV(f?<-MjN@$!v`vb#oXtMc{ncMaM#fs&I$W*%dO}6 z!re!O+qj_TczA|$0SY+1n-S1M{#q!{Op$ym>BZwZop}y(1@jeVAMV3`%z51BJ5eHP zp|V89u^c{+3zF%f{4MQy{JU}&`0>77j zmyVoKC&lx)Mcmo8<_zQU?-{BTu5q8;<)*s8%7c2zvgz4|HtgPh-W9$j7!EB~O$ zinBSNOfF9k6uEX6>GLh%A<%IqKu8bg59YNRrqr5;yGO4D?Dfhr>gLq zJleW&dIj9|>D=|#eUx5mQ^m3J8U-Vq#va*h0zTZu*EoTrV^oB@%$wOXuJCZ*7ooy! z-11%I=)x%VRQ?;;e=D2D87}ZXG6@<4=X9kQ&Iu;+RWyh%iaX;~_)X?;o?i->H!`nb zn@r>`*~}(X$^|*YHh7TzZ-eDU(0!!J;2QT`1xL8awwBslh0o!>yvco8r20^sHbjMY zVXg>J?f_;_o_DVGQvQ?O6_8_-e(4E9#M#^?eb&aQk7NoL;3T-H_T@8qt# zz+E&sNBO670bIF-4t7)ix0BHRutKeh`v`vn;mX`k85p?{dps;Zbpr ztv!;B)t0RE4l|$OmYT;cRqSe03fVl-tzq{@?khhzOt1{YE#u04cZQp`3r}cOY%^6{ zpf1x?x?YVGui=(*4N&flDt@t6%6&|KL1jW$cv)Pv2KAg>0!uX)m$oMD-`(eHtxGg5 zX`g?|`M#Jjo-;rNrOtvDoTbQomk3 zEiF^C%-22O?e7v%qM4GKIBQG&#oD=gb7$-VS|Ik#)mvCfOxiM=xHwmDR$QX_CwZ8< zm-^FZ_S~GXfxVH7=B#-*n_ZH$jP0nK=C8#h`IiKk8lf7c&ffLiwIqLM-R$D;oZ=Co zVX1t6L{g5k|GNvHaSp(N@@5xw`(;x-7gVp22V$Spnj|0aXjjtc8D}Si>+O)fv(~nk zzc$1}6wcE-4h_iB<~K@mMj5ns+L<+56UtV5ywN3Oz9>NM8FVqDWfnSnn_V^k6c5eh zjCSxm=&$+XX4Tn*{ZVFr&DjN8%UtFoTZ&%dFMgP(w=3QO`2cVhxB<98y9wYAqyU8g zHcx3QfepYB;1cjP;Ed_71rP$n07*bDFbTjPM9brM=}!SP7#bQ+3j}%reSJqcU| z@P|N}H-K*|JcS zYF}U&FdtY4Yyoxyhk)~d8^%Bc&>84OU%k(PFdmo*ECp5rn}B1$W#ERWpmO%bl_M9J z1k4830b79Gz#-r&a0_t5Aom7316e>0FdkS6tOhm#JAebgW#C7^1p~ebkOE`?g#c|P zTm)1X5eS!nuL0)<=v*Kdm;}rRmI3PkI{I=qa2~h{+ydweF%dv#pcjw>j0ffd zOMxB00pKif8Tb)!@jxd4VZca_4DBybDBF>RWg7g{wCLIltY$O3YJnZRmb6L1!|4A7@% z{DA~u1F#*~3tR%e2EGTJo1q{;43Gp21LgzEfZf1J;40vTORqN&=#5KbX9&H3@xV-A zF0dNd1ndBg0cU~Bzzv`YE^}c(0+0e^03(4yfHs(}1U3LifJ?ylfQK(y2M7U@fWAO3 zFsT^-%?9QJ%YZGwZr~(v9=HnJ0yNy61OgF24lom#3+w<60B3>AzzyI>zy;UpFdzlU z01AOczy@GD@IBy+%V}{4{!0S-0>gkwz-(YXup2l8oCmG~w*Y+APICjifk2=$&(Ko&q(zooz?-~ez8I15|`ZU8?5O+?uuy-o4T z)@T>tYv6mpqYXL?2mxY%B%m*l3(N-Q1M7g@z)9dda0}1^(L6vP5CP->OM%tE4&VTA z7PtYp1fdCl44kj1je}4K&>w&;0yY5Kfg`{r;CsNMEeZt007*b!U>GnPm=7!iwgB`Y zokPHR;1&=VjKToDfbqawU@5Q~*Z~{}7H=%pn`VcFpg=$dFcKIC6atHY4ZvRD2yhy> z1bhuRhoYf?5FiN{2IK;hfZ4z@U>&eUn3m{`L%rLfYk={<> zUZOXPS_E+eupQV7oCYodUjyF*9%0BCNCJid^TWi6C3;KOP2s2&a7^4>qBk!N>wt;@ z89*Vh64(H22lfJ|flI*mfOAJw2p9(B0<(c-z&cMz}J9t z6xso30fYcCKoT$v$OR@vrJ!LTtOK?HyMaT%N#H7Q3&0oaH8;Q;2m~U4&OjEB1B{QZ zNZw`IwNyWh4?Ku>%Jh!NK}QIT9swAHlLpHdVt&8rWMQdFy}Kf@F#cccm1=n z)pA{@k43ayp~snXqr@o5(PG64y`4EXM!da3?_|!66+cP;I1wlGcvHNXDD)nt1o0ZV z62({KvWX5W^^T@7V$@3g0i5>q>`Fb_6emus)Vm=Eqm`&^=*BJ2) zxyFjt&q5_vjCvNHd1A%0C_r?yc>7tsJ$%1;7CL#N^>fG~UkrQ>rOJyCOP+&of_R%K zQG7>%HqmyqEXI)4h&Wa}zFMZbf3=MNEm6K`yGD;P=SPSUk|V{EHF}%~d0uxDC)eNv zkNjxygA9og9o8bJ{8;huTD^lgKTbTm7Kz7;cZm|j4@8Ng-SbG*CPopB5zi2f74Hz` ziXWaw+vJI^>)^^4Q`YI>PEipN;)Qj3B!o!uq4J3m`g$1@E#lVevEri_baydxy&epu zSn}B**qIl(H{Qy^|Oz z9^b706H%tTg2IdyFA(L5_d#Owt4Pu9Riv0NI=zZs_TGYCp8YCXASP100v~fsl=$pb zq#iANw}4{Az%4MDSh0jCPQ1GX2Ao(~Z>!$hgay$cPmD#)8F=8={zP6J+@m+{|9}<| z7ZDK=6@%HsFqwlqfoE z*E zZ=)P&vTwJekny5J1r6b-$`KX%8|KD&adbSpy?lMO&SH+P6R&BFCIa;nuw zeK<-B>Z6*u^f98uih(;Y^Cm`#g*z~D;3~gEUKzgIf!QQhwB89=Qttqt|mm#KBO_T1IMy+ApJjqA|6KDsAF_w(F_dlyQmvyJl zY}lvrWFtzh=&%bF$`$#$P`y0yEJzIBjmy;8UAQVmMF_o8?}S4+ah>X0Nj_0xRwb@n z347qPw-Wa!Q8D5R_?V+&Ma$i|0!GD&5xbFQym*EvLA(nRd)}Z+-yU50Y@*X1T$rO{ z#l$^Q?Iof_adD5lMXL7(C|AT0<%uyw`C`c%dONXUkM2=<cAt@6((4_`A>_ zdrGs6h(yo(a_uvO-+sNhPll^QFeb2;96TQ%^V3_I=8MVu^=779(&cljo`W(>95<`- z%9kS!l2(p5w_pD!{)~-%F(MlO+HqVMOGaboNIg};Ty(Ng1p1~@V}TRJnw!VzqQe24 z*muh+>K)Kq``xlq(i{a{YD}BwQJcne_);rBDH z*ndE8=|``?s&jFeJLvTmKFytHZY8!~&|Unb+eil!hS4lD@m32JcusHZCq-7t!;EZ{ zhCU+GSlFJ^TSZFIP{9~5nvv#}F10T|)mNW-T~w5)n3&3E59%$QyE?|}`Wr7nU5!NI zD|a2%hng{@8ytZ}o;w1I%s7I3)Oa!L2+S-&ymSPEAW?iwWD^aJ!Y;>%w4)g6W5x8N zxQ)mauN~FfdFDIRa+w(~r^LFe<|cs-{VsjE!uhDM(eGPC(7SpopDj-GMoaZ^zQg7C zw8(x}5B8yVrPaZ(Ya{k{v4&!AhuK#LJ6xDsh%<tb(zRRNJWv;{xH{$e681!lJyyr5iAZEq~Wte5BhbxWk2@uQ>j9y}b{;bgj-h z!9E>z7M{oSjy|1XT-CuC4aRI0A%;_M1PrD+7_+L;+ks;JF+JEXuz^Fc!_DFbyzcW7 z5qHhaR~(1MN~cjo3=SicK)jCf61y!xJ-Y=yS!mQ!Keau^^+U%7;c50R#?3*LHgr6TEJ-$*kDM-86P zea+w{C-kPibMgMcOY50em{l|hSy!h&H(cyTc=6YG+2Ez6PaT|5mqw>Kf%}si{DY1hXPw|wi&joyVwKSA z`%1T=2U9Xeg?GHzby9EV>y0v3mj{!qkzWWN#!sTWAs7PH;i$I}zPgi$JB9MD?&J^- z+c6BD&S~`$ivpdRi>0Sv($dZ4h(sS5dXu`4-j6}hJ4t%dZRnv}jPfq(N_yVGPOU`F z`?`y-bQ^l;8{?70rJIO*UythV(#>8j$Ls1M=|3=UP~OB`SV)a=pu$vN()LcHt{KT< z*ZZhzMzTYi=qIBNmr|%~t3QWhBzPR&{ymM6W8TpX^;2YQJwKES9w(95B;4pUKK zx@dV?Z|hr_?hp7`I;e;sz^Dvqt|(nj z0~Tp?$+&(-A*d4l2O)v#5~u>;y}eT6$S_kQ@_CB9BGw6C<2{3Gl5}!IMq&0d8fuuB zb4CyL9hPNp$0&!Z<>f4~{|vhFvST<5)0hm$4;Gz1)O~%&4|a$TgEUHUd9axHAqM$n z$8bytM*Oow#48m4>=1|e4pzBtsJKY+*9~;m<<{s(h z-imgxh@8=)_c_cHIiu~#Mx)b>Ysj!1N=M#sO3_FH9d7iCORFu_4!yb&Nf#a&9HjAXk$r$>0VRbYW%+X*baePhLz|rXK zl8hD`;TTN?b2M0w5e?swkOie^9Vs_NldYj1;#4q4gHaisvxB0E8$+CY+9yUi<|6}) z27#3s5h5NoBD6pR^oKD+$^avRO+5CAyhDEF6Wj$SiZ6(4qV;(Y-m#z8<1;YH83XTY z3(h6#(bak>**B#;vH_5Doj+o zg9%U~gMU4d(T;YfbY(%J;vFU%@*nbx2RSF>J!1M0Bi~%RnNXaezwse%D929_kr(v@ z*xbVx@o>lg8;mMcEIDBl*CKZPq_#C?kQ3$_UH@TYh!VT%+me2N$JwkYxbr!d!O z(clua5=8e)^0mXPOL)8+BVM_Luzc~wCA`6iix91=5H&7RjF229o~c5dXz@-J@`(}O zRv}JoW$VxMZyK5g(C58_>kZ%%#^s6b-|Fqf=5O(MIrCdR6474y7K!6E38)`>&lo54 za-hj?7$-_kHhKiTxHc@9-W>c3HyiXap^3^qA`f$jF$iezG?C*-zEr4IakvQ4_-P_v zD)>s#NCoC$q_Vo6xcD!+S;dg5P6F2wrI!dzgvZmCRzZeE zOD`ig%pJxwPvfYG{k=kUYOoulKs2bD$niBqibg7!9*nt~#!Hj?nY5g`?US9-=N8Vd z{O*?izLR-ujCl8Zn8DasVZK8gCpz6h|Hq5`JLt~@@d6QET-|{o*+kPHuo^T*jQ9a7 zG+1!_0bwvqa^;Dp|A7lDh5vye=0=Fe{{t(_jjY`NAHAK)92q0N`Vj$l(86lRPh^bZjh~Q3ocQi1z5ViZYkd*+ zGfXdDjQSbg3F29zMDgLzdVGk(Jp|3bA-`sU%OkDc9_U4*-N~Fn?B*1r+C6d%de2ZH z8w#<%qpDVM=shwcsNfxyw5Vzo^q!+dh1e~sS_SjFqeX=Xk8XNRi!xNl$_ul4RYw*T zVz;Pj6^DBdGNTY_Q8p=Z&BkJ?ceJRG`&raIX6)*$aF5bbYv76bPWwXaG+EoU{TaU* zu8}4ayq0P$my~HYW;_G=>maPo~EO_lha76BHkzgTRx#@3&z z9l@xg-#T&JY#m&Gigv(Bd0Z9&Zq~*k$;sLq9~*hv$@&&1sXoruhw9JN=A(z`cT7}y zS=)=N&ejh24n;GIb+l=^m_hWU_=sqsh}W%SO@qaAy7fKNBJqe7t|8(*tMwt%6P58U z);1=$Lb-X3lJjmW`g>SgiFvNpM7ITU%NcpE3sm0MT&-Oi&eFEvW`ll5G?Qi)>)oxs zl>_SG3qPjEMKd>)vQ&KJW_`1MfBM*#{NZa&F4mTnZ@OEtwX;aP)c^%sB3d6Fyq(1U z#%STTjja);3^BAZ3b(kjRTJv~lWBr@)C+Z=EI#tGK2kqRZt|p9IaJ2RBB!bK{rVHN zFzQjeZ$>lg2-BnD)n?Wi^(WC;uJRYA`mvw4wO{>AdhINKh2)EbJgn|vy`uZ(9X&dwVCtmtwxS;6ZBwU4M&sTtE+!#1EiO7<+;p}E)gMTwBg8q7+I$5&uJEW!lm%`9o8kH6sk&uwkLsN6a?h&HG3k@>kUJW9nx4K7kYKY|I*wonMv?$TlY;EgW zvl+yfu2zqG`psgdzY+g7dp%UUL)mWj!!vC#?L<3uYDYmh5#v%Ys76LBBg zJ+enaT=)1`m2zHn%D=2*;^=5CIUyxFHaR**X+Lyd?HDaJJ`vSS(gjeJUsO^!>6PL5I~aUKP2vDVv~ z;+{yeM)$X-kr0y_-$SL7UEN|e zCddDh4$TP>@sV*cX$i3^o!PY-MhH)<$GxT#YL2wj)acacSnP~4TLbIQsns6$i5dx8 zN=rzIicC~dAG=p82wcJ%+$(FUeSAWEd}3r;oQhw3uiF1=e5!SPkGRCdh={bxi9Xh6 z%%*K3pt-e~-rJeJ(J8t%w>H)Pg*(RvW+|IYBD00Hxuw1f&ef5cmL?D@lz158U{Te= z+RWrD4nhx?!wW=@D_X8-lZf<#=jWmy$kGfqiEbj(50To4^%U@&BuisFY!u4?%QFy% zDe)_a4V8EY;%Frf!~Kz;66w!XReF|Ei1;2`OCRTK zG14T~wz4+0v}}z18A>DHE^dPusS^BDB>N-51d&a&RFdVY7q;*Un?Ev)5fv1$TpR~k zb~MA0QsNW^92Wrr2)H82a@QN@(#sf@lRh}WUFuk-V!yXg>C_WtP!~%Btj_rGBqeQ0 zY(ejXq}U%KD_)U`D_Yz2n#k2OsTW!;n!1X~t&#r$u^43e5COA9S!*Plf&JWBQZ#K4 zRiyK=xJx>Z`Qr>ErPDJ2TiJxE4eHTHWVS)z($+XbS_QrjafA}X+EB~0-a*pK#a*+v z3Y={hmq9!(eerY_8Hhabc~y`lI0PqLip)Tii$3s)k9$JIcRklr;OFqEQh|p;tHq7& zsLNy&I(4Uq5+mAU`>PVOASNr34w2|9MSO#_Gzbk`5@hwqCq-rS&SCU+Nai?J+(amD zxFu~Cp>2_Wb~qjuM0i`2=ug51AKaeLp@7o}Xede%VEG(kGbR22ajX)vu|gOiMg1{| ze}%QRg|#I|PmO8l*+ls1OeC6p<2<&X3m`obG`(p>P(wH=W%tUX^6|$8a(XS?Vynkzc9ALlC2s_#MQpN_-Ko zD$iRGGli`KVx)@f4v4WYkJ^%aEQ|0!KSYV2L0ltF!B;OXz*jZ!)vykz zQN|-Q>dD*k$^;zTt(5&IYT8;U>iZ#jv+{?JQnoVXFCn&98jU95u;-R4xzS6gG!-4K z&CJ`Eh;1FMzLt*5^mr z%T(lccWGuo>AjtQqR;oq0+@cLY1)%KAq6SVRER63Xu2RuqhSyAoJ@!-W3+=9ti()+ zVM?3>v7HiMhUllnLlBp#1{-FX|gF)G^%_r^qJ|ce@=` z0)rr4RAMAPKT#y>X?jH@$3m}ZBa=2>1wL*UzkxVe`HpUkzp_>0qYxV^@iB;vq=<`l zKpYa<4xi>K@b3@<#Hm=c2c+K0GY)?$+ER&G5PhYnPlPzYRrZZ#AHGO&Q)z5#Y0?Tw z^mcA#(vpI|J80>G-5|x+(F-3_RAik)?o&hFY+hkjZw5E)u!KJk^VTzUFPk|=w zOQmon$b{i6bsOMMj{mO2a}WcSco$-c66XY)*zEL85KrDvMW5+yhJDK`LLJ2-7AE>I@-PB z*{iGFE6qo&?SvfrNw4*tkmF$X8fo{+^$`sofYu|@%ku$fO=YiHcCW|TYk}RXjJ;M? zds)^&bQ3p`hGh%HL@AoD_=s;P2OnRvwo`?kfH+)T4bCAh#Wn|E@s%pky1R> z8D$)Yd8acHoox4-!(LCqYmp!=OC$V6ax*1{LX4DR>k$xfJ0yR;%tUm(cmiSXIEfQo ztWC}7{$g7fMYC49mpmZRaevie8SKS3B?Ez2M77^{C2_E{Uz zvMZ8%FwjgBa#xhEeh^9`#g;J;A7K4f)$vrJ9t{#pDCVD`(_EBM%vT`pR^php*f*-g zXCRuTs4s(<>?F2z#aw>|2UfZ&jf)W5OVRAwPE72ERPoJT%vx35kSe~|iwvY#3URj- z&G@46MJVDk#%6pILoDfrY1Xx;S!?4gWedI-jO1l3d?*;nOA((2#@DkCdg3N%T{o+< zWo;g1b1(_n?1zZU0z~tXnT&K7Vtb_#ve2vvAEoiuiKY2w zKZA(IYtRFY_xMX@dORT6^7t#1g-qaSi0zg3E{H2Jz(}M2A!)=t&{}zi#EBkA_jP#T zMipNAMTmDE5Z{pIN17Av36fKw8G>iq6lkt9IpMlTUY1AAPPn#^s2_%i`;t*9h_u4l zNqb&YkOqC51fQEB@z1VKxF?YDa9P7WfsFSeMBJjtcyHEsLN7>-V-VXbjekSz+fr%t zz}Jr(D-HTQWu_=gMaf=nCzhn5Wb}E)_oSDFK1eu3it-D^DA~4Dl#D(f_q;Hrp*Zx3 zsS!$~@AFJo@#u@HYgIh@pbSbT<8_Lql2K+Bd@BVdBN5;8bkbHfR~qz@l*URU03xg( zncze6;$oWB7ax%qKY%Ut4f)nG$bxUjlZlg7|18nJCqnVvc=ob<1hK19r0>SFILI#I zi}9FzD7u9{7tadXgH$+~X!{36hh9ju{|i)_^}V1t5n^*CE`S&+Me}Pfh_$5X{h|{d zXr}L{BN|PeH^W>E8=&dSWBxNgDbch@1 zFoBe&BmYSd+e=Y@4&wI~u{IqElpl4{o)tGqBOFIG;NG=2#J@uvB}F~-xRZ7ohTa=9 z=-m@yRBt33{2sN{DbkF9n5e`8i1nptE__d%AjR46!i@zfuCa^z?c%3)Q9D_!8(-8$NSakM%u-Jc5$j* zTxJ({+Qkp;;=k>p_XpMKCfdajcJWVkakX9CXBRKp#hyGe4eJ;#G)amDuMTB`Ot4Ao?kB4a5mbtoN~#_NEdKLyTAAj}ZGP zvF9gFTDla?OFt3cWS{^k=bdnae=`HQ{>Lu9cEL%TsC@k|I^oWp6wG}uidmUf-%cap zmBBTSsnr5o5QaAh@@L#2kb_$1;ze-+@y$Dq{}lG`FPt0B=3M}h6H+B5881b``Q&{y_E zyVeRD?-16lR@gj*b)y9EOOpSq|H$jmKZ>2S9_*Q1E71BiBC=oiT48AjyXvAmYln5X z?L^<`ls_YFa!`g}AZ)J;!5^3t8}+Ba7ruj)a$qVmk&K8iBeAqvVWI!F7qn-suyF`8 z3R*iX1ApXNY?QQDt%xor=jxKC*9tp?Fr%P&3swE2g1VTUt8JxEb%?4&GQ#kHD}Q)1 zML$)4irB@;nLgwxfBl$=D6EOIv(}9L@b0SmM`7&|W*Fjt>JSw##UacXETls5vJqxB zHCHk4YODH3fuk+X*t}4-6Mxi7&Zn&QJO))Os&v*lgyE%E^^fB1L6~9egR4VSyf<-< z5S>v(zab)gptY6L=k=V$fPq#or{UVe;-P`o84vW<`e=Q%ep-KR07iSJHc%Ucy=jB7 zEo`VZOdGC^&>qxAYT4Q-ZM2r7*|ag*SR6o=hi@e3i>iTmOZvk=>j-gUAeKCT`CmOW zzB3}Cy1x;DC@eo@nyXAT~umRyd4X`MRMkuJSm}CP5i1Rvi zKK`qL`A#?v0}0eaq!$|E%uV1k_;qr|D-et~FC_ee8yXM^d_kF^0R7?r4)hb?KimUH zWgz1!z={kX0*X=K4}q1?Cj=tBZb)}D8J}a#9cxE5Bv6eUK{a!PQKSErsiOVIq2yG0 z15^V?JcnBU3m9O*+dH5~r;&rF=1rM8a@M%Ki4V=3W}Dby);R3cADNOj^^w9yCyl(a z@u@G%)_zg)=G7PHeX+Xaixu0ycw_08>q^TfuWVfIJH2sYol+?7Zkw9dVeHi3UyhN+ z-gcBYzhGh>({D_(>Afo_Cg)nc%FmZI`u(*tl4w|db*bC$Po~`Vr{;BtjZP9LhFTle zA&FDvEsKA5AKQCp#Gtg4)P4hgW53kw7ME(HD|^nXyktewI#kECIG_%(4?fYVPO)2* zADvqlYnZ&UF8R}towUlM4mHSpHoXq9%bp9WLu}KGh~FPucw}3>>JWW)wzbV4F$}Ws zM|&CgR^v*l07ib zy}b8Rbs1Ks83E-PMRh0$T@A&g9BW;YFwF=r?>w_E)u<}*ty7PbSCzD_gGt%`iB#1fV>NMStDzG-MQxybK2>$&|SZ&JgU45H~>k4*mY^5-ef7AA!M`SDI`zQ8K+cxyu9*iIv--Sd_{_rKiIi>>2f z`@cVWy9w6tIz-<#!P?>XM=#$tHAHlsZLMFYBwC1b6Ri#Eki^ny{$kXlbt#27@TfJi z4kb7_E1>+qOt+r6xObd7Wo*a%g7JA%JO1uoEm!Gz*R^d=&gvje%&t@0o}AUGj-?O* zQ?1@&@07X}gVN|&hyK|;pur8yuytFvr4=G3as8ZiQ%-BYiwyk3qmuEcQ zQuLi(ml230nwO7y!mX|)37gkKT%A)FTPqKn7a}grs7qx;Rgu+8T%2ij|D!soI>o@> zKME*~Hez;BT^fhd==A%GP#(UpOaoV&c%3d4sM@*_eDz}x=(qpd2WBi;3*$n-ms42SPmJa)4ZbcH=CkR4Oj)RDJI}SYC=LmG;H~h!UqpX4qG$CID_-?$u~?z#0LB&{4T~DuWvq$> zg0rz+fPMekoJMr61^#vfD<5sa@rcwE+z=}xq2On+mJk9ShlK{HV&^*kwgh|t@mqm! zApHnhg6V?;vsjq$0=Gp0k(PE4 zsfU9nL#Yk;ItoH@79d?(pr*K3Owop-APCav8yudr1hX6&1i)hi5^Ms-pKQpjYeSG= z7-ae`bvyDy3a!D-ZTidRnh7>0q1&ahP1W+eUpi~{fZBc+|upe3^7`znm zXuI5Dl*X45%z;2Fh&KS}XePM5!Sp+y8U6bDT?0&^<#14YzJ?;wI{DP;iXqD1$EdS6 z+AUW^K56}nNP5!hA}&2?%__cxV8V7{R4EtLEkThtp&f3ZJSAZIG{{->-X`!Z=w+a7 zXp!;~$OAIz9s|CHdp1f(OkpGw*T#HU2>Ur{C!NKJr>wqF^a+6o^e|;k$JbM$^eKwI zFo%;9us1heWlRxOreeuc*0v+IAkKDJ#rNHCQacJb6Y=N^02|=nw*wZ{QNUX>RG(qP zfb0)!4$!dBuVFo3y9QtlUi$}tWpnL1@C|@{L$A%Zb`qDKvc{}fX${QA)*TIdcC-@! zcGu9h8V$QvH0&_Zup30fo)7H|fE^qf_G!qEvS8zdhP@RUHdScYI-z0DgofP@+NZ!J zpbDS`#LvaG`PQ)_cY$@U=)1t`UFpBjdZ@l@F9f9ny~XwA)?(N35FY^^7SmQ(2MO=_ n*3}|#rL{@GKjC=;xCwj<{0q1RU^!pI%DndP%7B&DPc8os@;KTx delta 158546 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≻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 diff --git a/Analysis/bin/x64/Debug/PLCModule.dll b/Analysis/bin/x64/Debug/PLCModule.dll index 1a500022e3532daa3c080140e558eb881fcb7ec9..ac4d69f9120240347119c18698739b12317aa5fb 100644 GIT binary patch delta 147 zcmV;E0Brw&{0e~l3Xq5chkw?Ai-n5;wTlAjOAr#hg#K5dp+~Xv1TQRjY#6tMOaeq^ z1BZXsm&>vO8AS5+Cc@Ex0Ya+G{?swU5@G=W002cgTrojNWq4s{Z*EX>Z)#;@baPxX zFfue;Luh4kc}8h&VQfKjb7gH}YvO89^srK=5j>xIuvMe0d~)Wn%#V002ZfTu5bjVP|h{P;zf-Wn*-6Trw~+ tG%YePE#;+$=aHW2m$d1cndzOP<+rYvD6;}3msGO?sF5%VxBRmL1Pc8rJ=p*N diff --git a/Analysis/bin/x64/Debug/PLCModule.pdb b/Analysis/bin/x64/Debug/PLCModule.pdb index 1fce5fb0c40834b8f864760176361246c9c64783..9cd72ea0ef42bb68f9508cd1bffd8d1ed1b9a4bb 100644 GIT binary patch delta 4723 zcmbtYZ){Ul6u|er!J(f|9ad7$Fo&{lE3=zp2|^^WjmV=lU>if*7PO6IY`gwvD;L*0lqVw0ZUWQX zSY5`P7+uEP=*-H@W@f=~bD}lNuDXJ|p)Sd7xyWlNj!TL5)*h+Xlhba?NBnkfcBkwO z6y>mB`TYPtnVX-el5<7LP?_S4GaEnC3VA$e&5g~f9E~$8Cnep+obvc86E~%^ptU#B z&3{IKa5Xnsh4P8SO8A#nq3mmBi}>l}N7pRkWP|TpnS6GQg`2F*))k9J5)%JbYM<1m zEiBB*37=EBb#0h)fsnWg*%d0{Buj>Z!omEZa7lloK*%`|eb|hI3>paWS_zqi3bx)v z$a#=WWX0Qg)EfA0mGW=6Li%;f#K=cIrq#rh{doGi@IzqhNEMXXU}|xSPT=fpzHq+_#lL;gI9lUn?W#! zk6_egJH~y{vCXfxzJyrZFT|oQ8;g6XW8dm2_aGK?uow8Xjm`#Rl63IR{yp0ej7dYs zsLRG;;&kk$vHRXcEG87OsLRG;a&_#tH*a(!c6Kp<5RA%f@VG2C*w^MqK`Wn<6DLyh(*oB6Abz4Hlwi7O$XJ(KH(pRh%vu#`9ftBwD+qV9HUGusHml_P^udRAzAp1I-L9>CW_qW5r-{4^d)}gX zr>5|c-mVUOX8KxlZ0)uFkB<=po$m_x>@ZTTx8*m(YY*p5LWM9BbYwd-EP1(qwhewt z%92cg6O-7b2|%iR%87pWryCrI?)@eZfWn564g>J*D>CvIK!=7 zZj>7lmY-Yf+9gHV6J@2`_S!W=DU0Pm?JmlByE2yn2WPk$Gp(!VU1~DqRQwX-y&EM% zTBE(3JJJeln3W#>oZ=#XYT<6tGac;RTg1 z3I|lRg*bzlK&n8nll&CQRT0crprkE;xeqEI+WZASRV>9%!uw*F-GIY?mf!%0W{Xwd z49-dkDIrlXfaZ%l3~VJZp9Jk9sYB`NSX0g?te2J#^YBg(Z7)txFEmxAAtU;abWE+g;ouKan*`+Mm d!FJIR{1?(tQ?OtX-l-tRK~CVywAXTq{tG<@#dQDx delta 4105 zcmb7{e@s(X6vyv8%X8dpK@!cDOpPd1DbsDql9`ch;{MnlCK`<ph?Qz4zUBxc9K(k_F%Bu>kG6kZmsbKLm|IEf$&1&N-`2}vD*FFB#!9P;{6Y|2u7oSfYKRKQmQ1{l& z>#23gTP>o%#A3kS3H%qUu4-_p4u63l%R1F_eyboWJM&`k#D#X=KXz2mUw&%Y0|9?V#mO|2Yxa{HXEgjvhU6@QX@e+BoLzrpmaz%^CRipI$5Qyn8sKdtUiaaQLqX;HK7H}jGX~n zYGv#J7`7A$2ThFmvKSixy9m!`1Y`XQW5r+}F(z0RSKnLubx)JoJl?%))`8I*T;+;a zZD_J4k9?}ah^cWegD<-4<&(+%k@fJ5x-eeTjDy!3&ZD!%L%pNO;{3>B%*f(<=A8Ix41EY=%qWbTsk8Q*w=W}$n~N;QjBHB1v&@;yf~~?R zZkaKP+p8uYcT`m%`z*~M<PplCY^ASfw9L?A!VfZOQEr+y2l6FpOw<8&S{<T qOtWkUVjI{FIXfY?%VP=AnF^b17olqyECV*8ttstrJmiDnWBgw@YPwqh diff --git a/Analysis/bin/x64/Debug/UserControlClass.dll b/Analysis/bin/x64/Debug/UserControlClass.dll index 0c40b99c2d7955fb0e0398ef0acd664929ba4506..681f3ff3c3524b12a7461468847c4192609cd46d 100644 GIT binary patch delta 224 zcmZqZU~A}Lo6x~BXVI#U6MJMBe@$E&&bVwcBV#=iL(SwS#yZAZn;Dt*R|#lc+qb0Z z`5MP*bH6O!)cJGc<_k4H{_}p>>->iS2$+C))%2@1jM^^2zrD9eOYq%>enl8 zGXkYttzrxvJyI(Y)AREJit@8klS_(Yj0}uSVw^Kliz?kR^Ad9$i;GiplX5D3GV@ZW zJJvF)vg)D~#`la94cGy0=vBf1 delta 215 zcmZqZU~A}Lo6x~hJ%jzh#2y*OcN15JGtQaJ$XL(xrFwD`V;$p#&5TU@s{{E%jsKQ&YJmh?xLsL*G+e+ zWmKJBP|Ij0bYwP2Hw4@Ru@xpNiZNc8e!iAblkLAMg93xVL`A9Xe07Y!n3+CUZx?K0 Ke9t)1fE@r|fl=N7 diff --git a/Analysis/bin/x64/Debug/UserControlClass.pdb b/Analysis/bin/x64/Debug/UserControlClass.pdb index f4230617e3572c15d82861c9f12cb4a31cb11429..66f4adfffd30c976397579d6672d5b0bfeeb1d2e 100644 GIT binary patch delta 9555 zcmeHNeQZ=!7Qc6xX{XZ;blTcC4{8D1DwOnN#-XjOk(MHK`Pza86pM5^Ol@_F*!t1# zqGh9ri652n2-h`!th;U#SwY)T2NgmUMG;M4rMQY!qJmXXG@8bUQGe&Pk9`{d@ZLW( zuD!{x_q{p4bI(2Z>z(snH|$K_@JjN=Y2GgwW9!G^56WlpsagB^CWpqqicfXC!;Ml$ z$|k4AljA1_D#)p=8jri6+Eq2kh_bBlvBLxEs%*^Ee_tUSCX+E@_` zG@REE4mJiNp-?0kEDz6&mY)|12Lcu4WudY_Z`DJ*FUvj6vo#AwFPv2us4_mEou$=P zH$_`J<~6Sk$Ew=eqAd-vjz!IDqsD`?3zCbDZ~N!au7|}nFK|t4yNu^1u_zS7M)zVU zMo6)d6vLy6u^%ZK&(6`r?s}fP?q@>_k z*K<5g^w;q;Y4>#DiegmMY)+6jmv#LOYoqPgwnf*rMU}RNE;jDrKBI1)w6F6E#q>rD zk%F%G>ni55GURlR#@|0F-zSzA|-mN*h@#+Fi-nDaNy)q4@ zDtV?EvlmU3wx=1B|CA~&Z|2$Z-f80Yz5EYyCdI*KzD&hb$%}lFoGE&^!@J2>=1@Q} zT0B0+?gv5+#vTP;b1}9Au$Lh(WBsX&{V|QPE5|do3Bo_S8B0!KY%}2ZFy>5W>;z=( z6By%=8^EpU-BsDy`M7-qC`9^4n%1yc#dc~>WoE3C3)|$-NFmOo{tl|C` z>R<+AM}e+PqqO$oP0JQ_t}ahHhHjdL>`uegq<2gC3p1ZS(u8a35A}~^QIj?DXBB*~ zxGN6q?IbSsgt#QLbIH2J-E~h+E^(=c;C7l_vy*AiEb@sPZ=6SD8cb@KWOgnMp2h9> z*GCJ8OM^>XlG(ZBw#B`4?;FdB8_eh&A(PNfrct-ZH=U{*M`W4}YM5kpF3qsTE&Te@ zmx)U=PF#}NxioJU_sj!>z9!gbG@(Q$p`BceC1R1+9sT4oYM7>&xFoZ4Z^d%4xbB;t zsU$8fA>xwE&ZUK5agCkJ+?}*Sh)4oEk=C_EY&r5k5;fYDIl?8Gol7gt;uiP%oW!LS zNbQo$&ZYffanD{D>s(1>+Bifep`A>d#3FAU&Oc0C+C0Q1nVn19!Q$ThUSAGzX`2w2 zWOgoXwh?Y#DWCV?y8DPsyO78vw37|Pcd_Os3GG7>xPY(gTV6B4L#vp|5?6d#G&|En z3zbUYxOi*(Jv@c>8C4f`Tp9H0tK69bg!Ui=96lAX^u#nSh$)$(OWy0Z>i@wj@nd_ zThA-x11)-sGF?qABNORnNn2~Aq_H^`Z7YdNzrlGk%roU}(<=%wSkF_XRdq4g!1LwR z=&gb1i16{!ssXi*7Kl66C|EPo@jU5H>cWWfiLz=V39%-vRwQ;e%FkU*iPA{cWRenguFsH3F?ksJ}&>gL*d% zXNu0N_+NW#=kP5t?k=c7I~5R>PZ_CkX_h`1z8B4|!QC_wi1CG@GRB=^eT-M=z4);Y zhy#xUPXJE>39&E6=kv#eZ-AehsBGao9IhSs{i%fSzx)*cM{aI+tvlh~$mcr7vOhE0 zAIttIvl+|&B(lGrG@ibtlIK&Z)x+m&i@Py`I!=PkfFDOk4=@8;cL#7jcKkkIF^+?G zfF>MGUjWzP7~wc}ZUOu_9rgm!f!41O{QlBu*63Fo>7g<8)H2D@&nOBet&buKs=u3* z;{QAyRm;*x-*!u{8%@y51hHr}e|$8}a!&kmSM@hIh}cD^7Cu=x++UOEiQNA0j~_lV zmVW)5PxfQ!SFGbF{*z%W{rcg5h2Z;-`PptP{lZD}+fBcm)7ufFDWqVb>1J95=RW|3 zfDeI>fRBL_z$XCOW&>jI5HC-8AD72~<7R5+-H*#x07QN4WwCUCXNuSW54m2#{l3I~ k1N>?(vR>!@l-KaXA>gnmdY$igeTvJIl+2xUb=RhS5A<>l=l}o! delta 8316 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 W@i$52SITeUN6fqPrNaAjzyAvq@sbJv diff --git a/DAL/TMeasureMSSQLDAL.cs b/DAL/TMeasureMSSQLDAL.cs index 0d527da..4938a86 100644 --- a/DAL/TMeasureMSSQLDAL.cs +++ b/DAL/TMeasureMSSQLDAL.cs @@ -431,7 +431,8 @@ namespace DAL // 更新启动测量时间 public int UpdateStartMeasureTime(string carId, DateTime startTime) { - string sql = "UPDATE PlcCarStationLog SET StartMeasureTime = @StartMeasureTime, MeasureStatus = @MeasureStatus WHERE CarID = @CarID AND StartMeasureTime IS NULL"; + string sql = "UPDATE PlcCarStationLog SET StartMeasureTime = @StartMeasureTime, MeasureStatus = @MeasureStatus WHERE CarID = @CarID "; + var parameters = new[] { new SqlParameter("@StartMeasureTime", startTime), @@ -442,17 +443,20 @@ namespace DAL } // 更新离开时间 + public int UpdateLeaveTime(string carId, DateTime leaveTime) { - string sql = "UPDATE PlcCarStationLog SET LeaveTime = @LeaveTime WHERE CarID = @CarID AND LeaveTime IS NULL"; + string sql = "UPDATE PlcCarStationLog SET LeaveTime = @LeaveTime, MeasureStatus = @MeasureStatus WHERE CarID = @CarID"; var parameters = new[] { - new SqlParameter("@LeaveTime", leaveTime), - new SqlParameter("@CarID", carId) - }; + new SqlParameter("@LeaveTime", leaveTime), + new SqlParameter("@MeasureStatus", "测量完成"), + new SqlParameter("@CarID", carId) + }; return SQLHelper.ExecuteNonQuery(sql, parameters, CommandType.Text); } + // 更新测量状态 public int UpdateMeasureStatus(string carId, string measureStatus) { diff --git a/DAL/bin/Debug/DAL.dll b/DAL/bin/Debug/DAL.dll index 48bfbea7ee72ee6df403f02f64fae720f8e0eb92..f72b99e194b067539d83d3276a3edffb6051ffe9 100644 GIT binary patch delta 2448 zcma*pdr(wW90&04S=PPFg6mCXm&FG-22!B%QWq5!QBy<1SB6kNkWvQ`ukNJdV^K$9 z(o8$}7}F#zA0hZa8qv&GC76ouC%#2cL7m2$w5-nA`%@e2k9KC4^SQs@z31HTxy;<` ze6Q?$uf@4WSBr|mB@3sraL!np24imnPTtB8&Xd^&$Ea#}K7GZn0Sz#7Bv6wBFutU` zQ*n}^vMnp+Z6oZ4%VE4v#OnbAMPCf?3bd*)WLX@aG!wnSHtpMR-Y&w%j_}?QVLqLn zH=X4NBNEt$T!{>1=XjgQ5H_3-j0|TZ`HaXAWq3Pec}-f*7f0Fo-pF-IWqWBGpA#7* z`aX_2lM)+=thK>*Wo@v(w$w9rh;e|n-!pC|#?7@l&$xvcx6~X_vOmyUAkd=q*5xDR zt4-F`P|B*U=DVVYyXE!0v{F$CZ3kE^&iP{L+9~0G9}UyA_R;kYjno#@Ka{9d*FO}i zCB)P_F+^MQ{E({88rDRkh4B2C5W^oa{9#N$LjxRQG0~o|zU+70-sr!Y7B?`SQ3R zMJBCirTlv_mb1ulRa|%9R&oE)Ecf79^Rp9|c55s0D*mBcjlnT34ro1W2zJf_R1sb4 zH-`1=CH|Hb{}>yh0W%n0JlixP5x2}aAdGvJE24y3-O2)V2(Bxp}BjAUOaAyHf}**l38dg zG+q8r{7l$}nN+)G$Te=mS0oc#DO5{xTfb1Yqw7%pn(ZyQ#uB8G`dHR0CD=jAG88F0 zfnjdFb+#kdxC^1fbln%NyO2%V&RlE{z9U^|yk6OZrf=(=yM^{4gVe=Qq8vmeX`jgH zC*%#+J68wH!y)9oqidPtm~sf&$&mBsAkTbSDMNm;UX%fsBX@)@8R=o%BFRV(V_b?} zn+>D+2>erZ6$u?h8A--{47IvE8CKv|UFJ?+PE!S*3W@o1%-y_t2%6sYT*e&j<6_5Q zC3W{vaU6Eib#E6tfk4u4-YQNYlr%xqP9lOdQ`Al(mbB5YpXn6hNhN**g!)Ul#q|4| z_A{NvU@9JKIzT9ebg_|(ok1F@s*#E_$ROoeTdk zdAsMZ+#`36xu@9Q^H@X0M5f|AHj-o(7qFEiv$%j#(jdFjbP@YW>GmE%he?lZPSYiv zBw0o65-yQii}NaRQRB zLa)L`viPdFia^pJhtqToZAht(9zqc$w+#3?oJ1M$b;RrPgm?q}sU}0bfx#ph;tiyb zWQI49Mv@ucLifVhgc{Raiul57cceBgqHqHr9|rtu9uL z4WwABifU{nopQKX4R(_5I8@YNKdHYs?+(gIBdl%}cW{y@L%fTNBpKpe+$5>0i`~OL zQjn_R9v+b%iVSPAxCB-i}^lAyeQ%U z(u$`Kew=K`uH!3rsenF+i<~|vApNL;>5kLdizxu<#D+*gZM5M-&NwxXBD4c*1A`-Ov+5sCQV3Bn>r;mDk3T-HDO%3HoedI%+VR~ zQ>LU(9Fs9UaeQVvzf%^hw7p%pu4d0BZY^)#cqqL}iEANKj)Ru8vawNoNcn5Uv&-k2 F{sARVb4vgK delta 2538 zcma*pdr(wW90&04xh#8^U4pBKvZ8|G8igotR}n;IRLUohd}C%#+K}SSt#s6-Oro?& zI!;Z#GT(|o2B_7TRx=5W0V)bAC8&t&TmNvxKbp?j`Y zDkdw<(d<5tj_JXI`8P39{f3KS2|yRA4~-2I4@-_6z?SgWVh6Hi{4;O+Q0#H`kiQ!z`?toOotYJj{Oyh&>UKwn zUhZw%MZ2ed(c2Cc?OwVXC&%;_?LKuU`?Cl#O{=C$!t-SYW9 z`WaD)90XXc&Nbpy_1nV#?Tym)jQCDnbM#%EyT;>9+eoy+Ql`L>xq3>GA~YCVs|BZ!|{>fq z#zT{;SV6_9q$b6GtrPi+O8_(UO}uL8ZMKQ;7M!a(WKT9~CQG%tAH$~@ zDh*wY64aAwg8o)Za3s^Hol@gXrD!4bw8WdrU~y*|#d;;)RE`9aMd(}P8VY$FY{o$> zpjwMkWIBlTBs1G6)I@RzY*oKQWVZ3l!PX*E6~>XqSa+*c*hb1%%G4vcmF+f$uCf=I zen7VzLwCf`ACO1-j=9)T>?NJ=x?4R8ykd;}QRq0Pk&^9I>aVCK9Tz$MhJvZa$Splr z;{*z(8T!IrtDZpKbjbA!vBA=yR%6|CqbLKe!O|IqWTd~No+Kmv9oaLD+A5eVCt;dp zs7&Y&RFY)ewP-Tr&9DxwhAcyToaQ=sgv9!VmQG&ErYNoH{#n@KW@^Vmh2(!*)KfKt-@9%({{NFCjs=8O1=6d-CBae@>f z<~5_vklQj$6r0gR#bu)SCt67BMeR>`NIMi4`wRC;C5nc>@R;;iyyzt;xyCVB{WV;I zjWosXG`Ap#G|QeQ)QjYn0k@(*Q3l+KXhYr*FC&R+GQ`VBCCLykV=PH#cmKZ;E$q&>utR+PTxL7+lX=s3kc5Eh{ zvAfuH>?C>Y8m^<1^pcq8K^196fLntHKM`e!H}D%thIj*YBu#U%n`k73YZ`8%g>+A3 zcnjA_5Vc#lPm=lGMh8jedmD=Qt|9*KWWM3J1Ai|$76n=@cQEEj5qB}E;?vBI>B{>K zUUcA=??_BUIzM{A(Io>}2p7u1c=3yfG=A(rUmMg1vj=DI&13~Xit$cmwuQ`-UoismqMAC)iV*?i6QYLb5X{HN~Ce zOmpPA)6zY8`7aJka!(&L-IMg9J2xdIHz_IIlbWACDA(h54@^%>Npm-4G|-;lr~T}` zvLoL}X_(sNiKzLcU)!7sr*~v$|6$UV@2Ay0ET)eC`(K(e*3llj$=~nKeu|=u8l2TxiiGrDBR&Rx?-YN z4TTvSMLaAh{2qOY)9+Cs@qhG*8UZa|+AJ%3bui|f}w3(&`K*q=l{ z^Ax3zQh;r86NFJP?mR*&GYYB(W|>R3%RLlE>>dF#i;l|FkXjJEDt>3^qocH!2gQme0rcWt_B%f{|vx%izO zPyG18b5bjBiqy)s?%F8dAGJ?SE*>bg^5#peZ0oL-H+?{7$B$geIV#2SX^>*s*j@Y@ zPZ<0+FtB_g1wBV0%&%E!8n?|`%u(}WNpSZ3WR&Iee`(seV%u#?lSGRO&!!UeHLVxoJTR$_uDBa{24YDEGa-ja=+m=t5b!aJlLi&*6*W z$d5f`1-yHaouc^Mq8OBtPg`uKpWzoS4riONU1xexYkG>e@>{x%7YJfJ&QLTQ^dklCz1# zUG>i9imv?{{SJoqJMdA!4$iNPFyHX5H7Q?sZLaG!H-L6%Zj$nLJMa$p1>jviS{Z>A zzg%gHBvtEQ1xoEhs;2D)F15Y+v8o8%kzrM~*hh425Kyj6Ffai4C~zUL5AZEu2$xqy zCAb{&Il-K8MIIqI?Q&spgh45*HlXaOFQ2OlDT@G;KG}iK0Hc7DfsX^H0AqlKzyZKl zfDT|eFdq0zpbNMfmA(+x1AzyDLx63-p};eW;-?HpMLPWi&*cKM zU%ci(C||A!3Vjl7a>`EurPEIXrAxoyfYmm0)IVsmbZxe-9j$A}@RZdyb!a?KT@e=g z@4Dz&;3Md0Jg_ft0`Gumk|ugy7fsYflXTH!zO&j!dz(Yo+*1AImLiXD&8?Qr)InA6 zK2A?^^t;KF%@a{h;Fa&DQw|?Tna6kD9YQmC(E1^!Vmz4AC9z{7-q7E#58%4>R$9RO z*JsijdIC-e9G5d}>1`)p0;|CZ3ORD0lIi>U3)1w(4~C zaH_Z)OZ_>%#;P7q6~p5wobzhz)W&btq|q3AGWJb9SwRvIWJH zgC>Xs2|0WY*D!08GeuK8Mex&g{%Ucm_+vc9VY20Q4or3j%4Lw+#MlJ#;lDvrnJQK# zPT^Lix?jL&(lYQ4YY`rmL=04*xEk$8WJxI?vuRgog8$Em3NF z3XiUh!=U4~+W72uK2;t5>ZKI!)e(om$8B}cHC}}BmbZOLhYz3J>aYHg!iPJ;17Z|M zm&2-blCN*|Vf!|JIT`1+II?&zCSLX7`M4OG%7s_M1NtfbyR7Wow9SDDUP9^eiob+7 z@S4Axj_F>D!z4Z19aPi2a=ReYeD9luhqP@P)**AJMV%kdqZ^WV#q&!!a915wanmjb z%1gUWnA$tVm7_60;tM|f`EGwKadlGxXEoW?zyvOAa!ROadQ0t>z>6o_#Nshz62r$( z4<56}LjBmYr(P}WYU;(VW(yT^MsvMsXM%oDJk!a>J@;B@C$2B&hP_rg$%pnPqr9=V zUJZ6~O@4&9I~{!<*k_?&ZrfK+BYAF1x;oOyho`;F*ITVTw#CFLtyZew?ACO(qO)P3 z>7r8~rzsac|LJ94&icR~57xvF8fgU6eh12g{f%meiwj?|@s0f<)WPNtPe5|+Ll;Uq z&}cg7);rmlhnMEe0Sg`E%LkUz8J>O6f$}#88}W&paVQyO$)Rm@nwsioQn7o z>O~yzA2Zbx$=rTqEe9U4!w>fn7fR2OnKXmjjPc*k0}>F6Aq z&ygP$;I1tDs2=N|aBPfR^u@6_^XXD@n=-cK<4f$Nn}8D_Q;90<2%#F&o>D zXJM4t#|z|YwI2)P>$p(C!#*xBYfD2)9#_5{#790}s*Z5+&J|&tcVYw<;k^^Za6k0q zWc8q%|4{7XS^$+e>(D)Cr7~J$WsOIb=j%kQBm`hPi&+Hr|{HI!s=IlO6C^t zt4E4eZv4FabP8>5{^s;M5p=D&j~g;%6{Wk6>p%4)iOVN}i2E|e)jTehzp_?oYNyrs6tv_7hyS3o~c5I=Y z8)=|dA?o6>AD)dTf4Fx^Zr2f-L@Tjfy)G4VT~JntY6-$?Aij1{AZ=>>Z-kxC(C4ku3#g}sMvKZ{BXuIf z-gIwOs+W_^R|aZNX^k@e`a-Loj_s^cqc|sZG7!=mWk?aK>14#9RcWZmSV1fU8Qk1P)wFA|gn*5@mRnW;@BuHzNuhAD;b!!s7Cuq9cVy@H`CF6^m z))^b^4^(2wQ{{ha^nUSdPZ>G&WOX#Tr|nu{SifOk)TSNbrT7|Efgzu;F zSO_czzJ>3>J#qF%+f7`Pn(uLa6{1XIITUZU(wK=iDQL)qWje@^g_hefWYU#KGiLRI z;XJZ8EqG6Z++!m1p8D#_FnZJ2hD^N4VnY@paXs}H&#$MUYd26|HKd0K-#`P6X7rGv z4|Ek5<+@&+F)P2=m2W7)FH`SvMn^;*{b!7b1i9gS;+r)TYjBpxL>qNXrj?xrhY_6# z;-9f1=pxbJuriPPGe$&y)?N0})ax=?q3ptT)(eP$SCJRC;q=EDhSP-eIJQ9fjeZEw z0{j!U!eAis5=w92a$n?3fbu{Ui3bJwH${0CI@zZi{RaT|K_3W2{GdFnb*(5D$0akV zp-p2SqqPlWivARq10lE-sUfP~V*@OZ=uq;&@FCei4l$yEd|GoF=$h|6{nxBzJDL2= zEr>tm(b8)9fQG0Ka===e7Xcp<-2cou;P;cL&)Nm_xD0g9Q_r9Wf$oDqR|`=e1iGDp z?hP8_F2S3A9cM0f8AhOxtj6NDYl6lO1>$vW^MP` md_MU0*xU!P@Bj4^9PuFb{ppXA{sm*-)vDppcVCX$;QPNkoz>w0 delta 9097 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 diff --git a/PLCModule/PLCModule/bin/Debug/PLCModule.pdb b/PLCModule/PLCModule/bin/Debug/PLCModule.pdb index 1fce5fb0c40834b8f864760176361246c9c64783..9cd72ea0ef42bb68f9508cd1bffd8d1ed1b9a4bb 100644 GIT binary patch delta 4723 zcmbtYZ){Ul6u|er!J(f|9ad7$Fo&{lE3=zp2|^^WjmV=lU>if*7PO6IY`gwvD;L*0lqVw0ZUWQX zSY5`P7+uEP=*-H@W@f=~bD}lNuDXJ|p)Sd7xyWlNj!TL5)*h+Xlhba?NBnkfcBkwO z6y>mB`TYPtnVX-el5<7LP?_S4GaEnC3VA$e&5g~f9E~$8Cnep+obvc86E~%^ptU#B z&3{IKa5Xnsh4P8SO8A#nq3mmBi}>l}N7pRkWP|TpnS6GQg`2F*))k9J5)%JbYM<1m zEiBB*37=EBb#0h)fsnWg*%d0{Buj>Z!omEZa7lloK*%`|eb|hI3>paWS_zqi3bx)v z$a#=WWX0Qg)EfA0mGW=6Li%;f#K=cIrq#rh{doGi@IzqhNEMXXU}|xSPT=fpzHq+_#lL;gI9lUn?W#! zk6_egJH~y{vCXfxzJyrZFT|oQ8;g6XW8dm2_aGK?uow8Xjm`#Rl63IR{yp0ej7dYs zsLRG;;&kk$vHRXcEG87OsLRG;a&_#tH*a(!c6Kp<5RA%f@VG2C*w^MqK`Wn<6DLyh(*oB6Abz4Hlwi7O$XJ(KH(pRh%vu#`9ftBwD+qV9HUGusHml_P^udRAzAp1I-L9>CW_qW5r-{4^d)}gX zr>5|c-mVUOX8KxlZ0)uFkB<=po$m_x>@ZTTx8*m(YY*p5LWM9BbYwd-EP1(qwhewt z%92cg6O-7b2|%iR%87pWryCrI?)@eZfWn564g>J*D>CvIK!=7 zZj>7lmY-Yf+9gHV6J@2`_S!W=DU0Pm?JmlByE2yn2WPk$Gp(!VU1~DqRQwX-y&EM% zTBE(3JJJeln3W#>oZ=#XYT<6tGac;RTg1 z3I|lRg*bzlK&n8nll&CQRT0crprkE;xeqEI+WZASRV>9%!uw*F-GIY?mf!%0W{Xwd z49-dkDIrlXfaZ%l3~VJZp9Jk9sYB`NSX0g?te2J#^YBg(Z7)txFEmxAAtU;abWE+g;ouKan*`+Mm d!FJIR{1?(tQ?OtX-l-tRK~CVywAXTq{tG<@#dQDx delta 4105 zcmb7{e@s(X6vyv8%X8dpK@!cDOpPd1DbsDql9`ch;{MnlCK`<ph?Qz4zUBxc9K(k_F%Bu>kG6kZmsbKLm|IEf$&1&N-`2}vD*FFB#!9P;{6Y|2u7oSfYKRKQmQ1{l& z>#23gTP>o%#A3kS3H%qUu4-_p4u63l%R1F_eyboWJM&`k#D#X=KXz2mUw&%Y0|9?V#mO|2Yxa{HXEgjvhU6@QX@e+BoLzrpmaz%^CRipI$5Qyn8sKdtUiaaQLqX;HK7H}jGX~n zYGv#J7`7A$2ThFmvKSixy9m!`1Y`XQW5r+}F(z0RSKnLubx)JoJl?%))`8I*T;+;a zZD_J4k9?}ah^cWegD<-4<&(+%k@fJ5x-eeTjDy!3&ZD!%L%pNO;{3>B%*f(<=A8Ix41EY=%qWbTsk8Q*w=W}$n~N;QjBHB1v&@;yf~~?R zZkaKP+p8uYcT`m%`z*~M<PplCY^ASfw9L?A!VfZOQEr+y2l6FpOw<8&S{<T qOtWkUVjI{FIXfY?%VP=AnF^b17olqyECV*8ttstrJmiDnWBgw@YPwqh diff --git a/PLCModule/PLCModule/obj/x86/Debug/4.PLCModule.csproj.CoreCompileInputs.cache b/PLCModule/PLCModule/obj/x86/Debug/4.PLCModule.csproj.CoreCompileInputs.cache index 048f375..17eb20d 100644 --- a/PLCModule/PLCModule/obj/x86/Debug/4.PLCModule.csproj.CoreCompileInputs.cache +++ b/PLCModule/PLCModule/obj/x86/Debug/4.PLCModule.csproj.CoreCompileInputs.cache @@ -1 +1 @@ -63991492e601c4145f3f34cf4ebca770038ae1a59793dc4a6713b882acac15c2 +201621fb1d1b6a13dd02957bdd55788b78a518f1920c9fcaaa4e5d45a95d76b2 diff --git a/PLCModule/PLCModule/obj/x86/Debug/4.PLCModule.csproj.FileListAbsolute.txt b/PLCModule/PLCModule/obj/x86/Debug/4.PLCModule.csproj.FileListAbsolute.txt index 729f538..51cbf29 100644 --- a/PLCModule/PLCModule/obj/x86/Debug/4.PLCModule.csproj.FileListAbsolute.txt +++ b/PLCModule/PLCModule/obj/x86/Debug/4.PLCModule.csproj.FileListAbsolute.txt @@ -55,3 +55,22 @@ D:\HexagonProjects\2024-20-奇瑞间隙面差\奇瑞间隙面差总装代码资 D:\HexagonProjects\2024-20-奇瑞间隙面差\奇瑞间隙面差总装代码资料\Code\PLCModule\PLCModule\obj\x86\Debug\4.PLCMod.738FDF59.Up2Date D:\HexagonProjects\2024-20-奇瑞间隙面差\奇瑞间隙面差总装代码资料\Code\PLCModule\PLCModule\obj\x86\Debug\PLCModule.dll D:\HexagonProjects\2024-20-奇瑞间隙面差\奇瑞间隙面差总装代码资料\Code\PLCModule\PLCModule\obj\x86\Debug\PLCModule.pdb +E:\1AHexagonProjects\2024\CheryFinalAssemblyLine\奇瑞间隙面差总装代码资料-正轩\Code\PLCModule\PLCModule\bin\Debug\PLCModule.dll.config +E:\1AHexagonProjects\2024\CheryFinalAssemblyLine\奇瑞间隙面差总装代码资料-正轩\Code\PLCModule\PLCModule\bin\Debug\PLCModule.dll +E:\1AHexagonProjects\2024\CheryFinalAssemblyLine\奇瑞间隙面差总装代码资料-正轩\Code\PLCModule\PLCModule\bin\Debug\PLCModule.pdb +E:\1AHexagonProjects\2024\CheryFinalAssemblyLine\奇瑞间隙面差总装代码资料-正轩\Code\PLCModule\PLCModule\bin\Debug\Telerik.WinControls.dll +E:\1AHexagonProjects\2024\CheryFinalAssemblyLine\奇瑞间隙面差总装代码资料-正轩\Code\PLCModule\PLCModule\bin\Debug\Telerik.WinControls.UI.dll +E:\1AHexagonProjects\2024\CheryFinalAssemblyLine\奇瑞间隙面差总装代码资料-正轩\Code\PLCModule\PLCModule\bin\Debug\TelerikCommon.dll +E:\1AHexagonProjects\2024\CheryFinalAssemblyLine\奇瑞间隙面差总装代码资料-正轩\Code\PLCModule\PLCModule\bin\Debug\Telerik.WinControls.xml +E:\1AHexagonProjects\2024\CheryFinalAssemblyLine\奇瑞间隙面差总装代码资料-正轩\Code\PLCModule\PLCModule\bin\Debug\Telerik.WinControls.UI.xml +E:\1AHexagonProjects\2024\CheryFinalAssemblyLine\奇瑞间隙面差总装代码资料-正轩\Code\PLCModule\PLCModule\obj\x86\Debug\4.PLCModule.csproj.AssemblyReference.cache +E:\1AHexagonProjects\2024\CheryFinalAssemblyLine\奇瑞间隙面差总装代码资料-正轩\Code\PLCModule\PLCModule\obj\x86\Debug\PLCModule.FormModbus.resources +E:\1AHexagonProjects\2024\CheryFinalAssemblyLine\奇瑞间隙面差总装代码资料-正轩\Code\PLCModule\PLCModule\obj\x86\Debug\PLCModule.FormDebugSiemensS7.resources +E:\1AHexagonProjects\2024\CheryFinalAssemblyLine\奇瑞间隙面差总装代码资料-正轩\Code\PLCModule\PLCModule\obj\x86\Debug\PLCModule.PlcAddrSetup.resources +E:\1AHexagonProjects\2024\CheryFinalAssemblyLine\奇瑞间隙面差总装代码资料-正轩\Code\PLCModule\PLCModule\obj\x86\Debug\PLCModule.Properties.Resources.resources +E:\1AHexagonProjects\2024\CheryFinalAssemblyLine\奇瑞间隙面差总装代码资料-正轩\Code\PLCModule\PLCModule\obj\x86\Debug\4.PLCModule.csproj.GenerateResource.cache +E:\1AHexagonProjects\2024\CheryFinalAssemblyLine\奇瑞间隙面差总装代码资料-正轩\Code\PLCModule\PLCModule\obj\x86\Debug\PLCModule.dll.licenses +E:\1AHexagonProjects\2024\CheryFinalAssemblyLine\奇瑞间隙面差总装代码资料-正轩\Code\PLCModule\PLCModule\obj\x86\Debug\4.PLCModule.csproj.CoreCompileInputs.cache +E:\1AHexagonProjects\2024\CheryFinalAssemblyLine\奇瑞间隙面差总装代码资料-正轩\Code\PLCModule\PLCModule\obj\x86\Debug\4.PLCMod.738FDF59.Up2Date +E:\1AHexagonProjects\2024\CheryFinalAssemblyLine\奇瑞间隙面差总装代码资料-正轩\Code\PLCModule\PLCModule\obj\x86\Debug\PLCModule.dll +E:\1AHexagonProjects\2024\CheryFinalAssemblyLine\奇瑞间隙面差总装代码资料-正轩\Code\PLCModule\PLCModule\obj\x86\Debug\PLCModule.pdb diff --git a/PLCModule/PLCModule/obj/x86/Debug/DesignTimeResolveAssemblyReferences.cache b/PLCModule/PLCModule/obj/x86/Debug/DesignTimeResolveAssemblyReferences.cache index 35febce6d6b8b4b0359a26d63e812ce979fd1886..74b4b18a63d2f391c79edb699f3b64f7be1276a2 100644 GIT binary patch delta 33 ocmZo+>}KR(V`OAtU|>v}$Pvoxn4FwiT%4JdnUh&kIWbug0Ce#P;Q#;t delta 26 hcmeBXY+>YJV`OAtU|@`&$PvmGTv=R_nmaK|5dc5q1{VMT diff --git a/PLCModule/PLCModule/obj/x86/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/PLCModule/PLCModule/obj/x86/Debug/DesignTimeResolveAssemblyReferencesInput.cache index 331ce01cabe128c3b150630f77900eedd02f6388..cad941ab32bdf78dfd622dd6e67cb2e55718f424 100644 GIT binary patch delta 560 zcmdliwqIm|bbXk!RZM7cYEf}aRYq!FdPQkso?cZ(VqSWTOKNd;Nq#}h)1~dtC(e7; zu=~a0)@O4Xo=w~EY}bV63mRhrit-Cmi%K$6i(`UQOG+~H(u?(qp$r!yjSa_Qu46%g zUUGh3T4s6$;m0B)D&T>T(XVWT*L0pXca-W Y{>eU!@{_GNy{uaq$u?v2UCuB@0M-K$ng9R* literal 2867 zcmd6p&1(}u7{*f#JqR8YK@kr*DzrnA)=~=|%5Iky+ES9#dKi((?%U0@^ATqzUxa{y zBIv0gN(DtMUOg!u`tR7U|H7H1Bowbs>%uOxAIxu`cb}c-y?Hs4$&8~G6+FqJgt07w zHe{~Zt0tVoi_j*i6l+RuL2NWG=8Myl#r)*Kx7SBIpHDvgIQh7H^6BfrukZNpONY<* zkM~~v-rqa=^5XdC%ft7(IFJcoJ6j!;p`dXYjG-dcNS_X>zM%87{Q%IK^)jqao3=s^^eYedx@iFhG#9ZSV%)e#ae zgmOn4;3$v^9Hi+J5)wm@J6KyTv<(PtKa=*Zt&g?Zw!CVCI+Gm^!Z7Fwls>Q;(ZsyK536RbBb!d8Ou~WbD*7bSO)FNfJ?zfWOJi1i>6Q^ zUzkDDd0YVoif$uY;Xn$bBr1XsZ!i9>Ty6{k!{%~k%4WG$j#6jx`{Y+{gR6GNP22`IhL?p^JcNXyYzZ4CCB7Zd0G^86Dyd*@)V zQ9~lDTiEs(r%g!+nx>*cIg~(4)*OD^VF#j7OyU|`vU>fP?ui#GM5wKK oSqIrre>m{g4R>->iS2$+C))%2@1jM^^2zrD9eOYq%>enl8 zGXkYttzrxvJyI(Y)AREJit@8klS_(Yj0}uSVw^Kliz?kR^Ad9$i;GiplX5D3GV@ZW zJJvF)vg)D~#`la94cGy0=vBf1 delta 215 zcmZqZU~A}Lo6x~hJ%jzh#2y*OcN15JGtQaJ$XL(xrFwD`V;$p#&5TU@s{{E%jsKQ&YJmh?xLsL*G+e+ zWmKJBP|Ij0bYwP2Hw4@Ru@xpNiZNc8e!iAblkLAMg93xVL`A9Xe07Y!n3+CUZx?K0 Ke9t)1fE@r|fl=N7 diff --git a/UserControlClass/bin/Debug/UserControlClass.pdb b/UserControlClass/bin/Debug/UserControlClass.pdb index f4230617e3572c15d82861c9f12cb4a31cb11429..66f4adfffd30c976397579d6672d5b0bfeeb1d2e 100644 GIT binary patch delta 9555 zcmeHNeQZ=!7Qc6xX{XZ;blTcC4{8D1DwOnN#-XjOk(MHK`Pza86pM5^Ol@_F*!t1# zqGh9ri652n2-h`!th;U#SwY)T2NgmUMG;M4rMQY!qJmXXG@8bUQGe&Pk9`{d@ZLW( zuD!{x_q{p4bI(2Z>z(snH|$K_@JjN=Y2GgwW9!G^56WlpsagB^CWpqqicfXC!;Ml$ z$|k4AljA1_D#)p=8jri6+Eq2kh_bBlvBLxEs%*^Ee_tUSCX+E@_` zG@REE4mJiNp-?0kEDz6&mY)|12Lcu4WudY_Z`DJ*FUvj6vo#AwFPv2us4_mEou$=P zH$_`J<~6Sk$Ew=eqAd-vjz!IDqsD`?3zCbDZ~N!au7|}nFK|t4yNu^1u_zS7M)zVU zMo6)d6vLy6u^%ZK&(6`r?s}fP?q@>_k z*K<5g^w;q;Y4>#DiegmMY)+6jmv#LOYoqPgwnf*rMU}RNE;jDrKBI1)w6F6E#q>rD zk%F%G>ni55GURlR#@|0F-zSzA|-mN*h@#+Fi-nDaNy)q4@ zDtV?EvlmU3wx=1B|CA~&Z|2$Z-f80Yz5EYyCdI*KzD&hb$%}lFoGE&^!@J2>=1@Q} zT0B0+?gv5+#vTP;b1}9Au$Lh(WBsX&{V|QPE5|do3Bo_S8B0!KY%}2ZFy>5W>;z=( z6By%=8^EpU-BsDy`M7-qC`9^4n%1yc#dc~>WoE3C3)|$-NFmOo{tl|C` z>R<+AM}e+PqqO$oP0JQ_t}ahHhHjdL>`uegq<2gC3p1ZS(u8a35A}~^QIj?DXBB*~ zxGN6q?IbSsgt#QLbIH2J-E~h+E^(=c;C7l_vy*AiEb@sPZ=6SD8cb@KWOgnMp2h9> z*GCJ8OM^>XlG(ZBw#B`4?;FdB8_eh&A(PNfrct-ZH=U{*M`W4}YM5kpF3qsTE&Te@ zmx)U=PF#}NxioJU_sj!>z9!gbG@(Q$p`BceC1R1+9sT4oYM7>&xFoZ4Z^d%4xbB;t zsU$8fA>xwE&ZUK5agCkJ+?}*Sh)4oEk=C_EY&r5k5;fYDIl?8Gol7gt;uiP%oW!LS zNbQo$&ZYffanD{D>s(1>+Bifep`A>d#3FAU&Oc0C+C0Q1nVn19!Q$ThUSAGzX`2w2 zWOgoXwh?Y#DWCV?y8DPsyO78vw37|Pcd_Os3GG7>xPY(gTV6B4L#vp|5?6d#G&|En z3zbUYxOi*(Jv@c>8C4f`Tp9H0tK69bg!Ui=96lAX^u#nSh$)$(OWy0Z>i@wj@nd_ zThA-x11)-sGF?qABNORnNn2~Aq_H^`Z7YdNzrlGk%roU}(<=%wSkF_XRdq4g!1LwR z=&gb1i16{!ssXi*7Kl66C|EPo@jU5H>cWWfiLz=V39%-vRwQ;e%FkU*iPA{cWRenguFsH3F?ksJ}&>gL*d% zXNu0N_+NW#=kP5t?k=c7I~5R>PZ_CkX_h`1z8B4|!QC_wi1CG@GRB=^eT-M=z4);Y zhy#xUPXJE>39&E6=kv#eZ-AehsBGao9IhSs{i%fSzx)*cM{aI+tvlh~$mcr7vOhE0 zAIttIvl+|&B(lGrG@ibtlIK&Z)x+m&i@Py`I!=PkfFDOk4=@8;cL#7jcKkkIF^+?G zfF>MGUjWzP7~wc}ZUOu_9rgm!f!41O{QlBu*63Fo>7g<8)H2D@&nOBet&buKs=u3* z;{QAyRm;*x-*!u{8%@y51hHr}e|$8}a!&kmSM@hIh}cD^7Cu=x++UOEiQNA0j~_lV zmVW)5PxfQ!SFGbF{*z%W{rcg5h2Z;-`PptP{lZD}+fBcm)7ufFDWqVb>1J95=RW|3 zfDeI>fRBL_z$XCOW&>jI5HC-8AD72~<7R5+-H*#x07QN4WwCUCXNuSW54m2#{l3I~ k1N>?(vR>!@l-KaXA>gnmdY$igeTvJIl+2xUb=RhS5A<>l=l}o! delta 8316 zcmeI1Yitx%6vyw~Zrkm$ZFl?HK6$oK9xdAkEl9xf2(4hW5G{f=g>JVLD7dA>_@ETg zMBoF`u5g8j1|t}WX{4*JB1D8pq^Lkdf+AA2pj{F8M2v{~KeIb9pX4lG^g|~(d#7`L zbLPx_%sJfQbw+xvIEelgJH8#W_P?K&(+t4W8Y%`6&-uJ~8_2e-`d6->3ObM?{|#WO!H zif=fXX)_~kg}2b%%5-@M*Qz>rL?$xb%}#9av@Tt;(zA*jVRVI~2Yq*9TD>t#9z0L~h@xipTgb zP`3mub3n;(Bu>M&hBM9kaw>Cp{XWKbsFJlJwW*R*>0tMC0k<#UY@Dz5zIdL)!_}ds zGCmU9vAh+J$uV3*d3~I#-a3YF*_|hy`ed1OG5sCIw3o|Vg!oE3eeumHoUwF{rKxMp)67^D`hkoNW|h+L=Rgs8P@F;e^KNfhEz zj1Y@rh3K^iu@L%)>><4y*L$OHvvl?&!f&Hlhz*9zeKy#Phi;G%Zk&%y5@IjpTiARI zHp9notqtO44~*IosIQoWXoA7bI6s>p#9W{BJ7Z46R82z1w6r`M^lgwnIP8XTitQUA z-^0Q6j*!_=$OFERo%8N*e{s>#HdpAP=1xA&vwn2Rr*;QtH{qPzB)7>`Pne^IURP&F z&S_pqEOiU9q%*SAB|2O8`&<3QQWt@37o;@8)R#K^>4g2~G}sa{OgbYw7Z21~%i51B zh@~#sfR=Pdmby=8$NaINhuEOGJp_}|2-5)Q@T^_lodnasY(PsoBTIv)v-3|LZ6}rn zl~~dlSsF8)%{h7A(NqP929;n^8sQqei4L#5Q5)3+hK89~(iz!}zLtlbsidKyHfkDu z`{pIL(+ngn%|fG=W^g{P(~uYLbC{cOPBWWW(ivHrOgg*wdhQuwX_663IwMOnS!Y+A zd#yc&V4C6tlhO#&Y}Mh*ZEdrNrCCfY>5MEbL!I^Z{`M%bv^7}*M4I*fNhGI8w{yi5)z#a4(D_a@=*Anx0Ym*R!2+i4`9w=+N4 zdS=bAjKGl*%9wd@ILa_#Ep+hNaA;)Q5Ke$XsY(QVwv(aJ`(!$WD~8>UBnNL$Z3> zEeA1g7{lbU)pHG!4W>4$*hC6NvXm?V{r!FqzyM-Gv zxo)9k8W90&Q}dU}1l|o=(WC}9vjz!oT96QF-)L11vveM=YL@Y~A5e*KvURFha@CsU z-0pCyo699OCeGbBGYhw5Q6+oJcO{BjTYI3 zfJ)p%s7yh71|gC{{l^HSS!gpMI2Dz+j^tC!LKvm!PJ3Sz&d1^>omvQG0h0mKJ;5k3 zT_7bAkHav*QFu}g+FHb7O4wh+Q=MoJ!yxiL?Lep&T`-t|c0K+`RZ~{VXSaE!C2tdq zPsHVChJ;#;$4?oYrf}bY^L$n0m2*^uSDMutube2~QTx28yiR)MOqG3Jx&l=#@&i*x zwI%v};DLanSKg4X4<3vw0n1BrrfHyZ&{D&J%3+{#;8YHKY|_51LgrGUzE@T{=e&Sr z6^#Y`1mqfIHNF~GA*--LFGJ{K&<|_#fUt z^4`EHQwEav(7${Kl6PbBZXWGL=)a2uzO+C~)A4cYgIt7Mg8U5m1=0_JUGWv