From 1e9f1052d57e4e8e2f87f7f14e927e1fcb196718 Mon Sep 17 00:00:00 2001 From: ldw <11622064+ldw888@user.noreply.gitee.com> Date: Tue, 12 Aug 2025 14:03:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=86=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- JinYuan.ControlCenter/ControlCenter_Plc.cs | 106 +++-- JinYuan.MES/MesDataProcess.cs | 18 +- JinYuan.Models/FDConfig.cs | 52 +++ JinYuan.Models/JinYuan.Models.csproj | 1 + JinYuan.VirtualDataLibrary/MesConfig.cs | 4 + LargeSquareOne/App.config | 2 +- LargeSquareOne/Config/Configure.ini | 2 + LargeSquareOne/Config/Device.xlsx | Bin 0 -> 9494 bytes LargeSquareOne/Config/FdConfig.xlsx | Bin 0 -> 4355 bytes LargeSquareOne/FrmMain.cs | 1 + LargeSquareOne/FrmParamSet.Designer.cs | 70 ++++ LargeSquareOne/FrmParamSet.cs | 448 ++++++++++++++++++++- LargeSquareOne/FrmParamSet.resx | 26 ++ 13 files changed, 682 insertions(+), 48 deletions(-) create mode 100644 JinYuan.Models/FDConfig.cs create mode 100644 LargeSquareOne/Config/Device.xlsx create mode 100644 LargeSquareOne/Config/FdConfig.xlsx diff --git a/JinYuan.ControlCenter/ControlCenter_Plc.cs b/JinYuan.ControlCenter/ControlCenter_Plc.cs index 352097d..f945b48 100644 --- a/JinYuan.ControlCenter/ControlCenter_Plc.cs +++ b/JinYuan.ControlCenter/ControlCenter_Plc.cs @@ -256,6 +256,23 @@ namespace JinYuan.ControlCenters } return Result; } + private int JudgmentWGJResult(int A, int[,] B, int C) + { + int Result = 1; + OK_NG = "OK"; + for (int i = 0; i < 28; i++) + { + if (B[C,i] ==1) + { + //1OK,2扫码NG,3MES反馈NG,4其他NG + Result = 4; + OK_NG = "NG"; + NG_Type += $"外观检测NG{i + 1}"; + } + } + + return Result; + } #region 上料工位(数据处理) /// /// 上料工位 @@ -1801,38 +1818,39 @@ namespace JinYuan.ControlCenters //不良代码判定 List NGcodeList = new List(); - NGcodeList = NGcode(m.list_Data1[i, 10], m.list_Data1[i, 11], m.list_Data1[i, 12], m.list_Data1[i, 15], m.list_Data1[i, 26], m.list_Data1[i, 16] - , m.list_Data1[i, 17], m.list_Data1[i, 18], m.list_Data1[i, 19], m.list_Data1[i, 23], m.list_Data1[i, 24], m.list_Data1[i, 25], m.list_Data1[i, 27]); + //NGcodeList = NGcode(m.list_Data1[i, 10], m.list_Data1[i, 11], m.list_Data1[i, 12], m.list_Data1[i, 15], m.list_Data1[i, 26], m.list_Data1[i, 16] + // , m.list_Data1[i, 17], m.list_Data1[i, 18], m.list_Data1[i, 19], m.list_Data1[i, 23], m.list_Data1[i, 24], m.list_Data1[i, 25], m.list_Data1[i, 27]); + NGcodeList = NGWGJcode(m.list_Data1,i); //电芯CCD判定结果 - #region //电芯CCD判定结果 - m.CCDResult1 = m.CCD_Data[i, 0] == 0 ? "OK" : (m.CCD_Data[i, 0] == 1 ? "NG" : "缺图"); - m.CCDResult2 = m.CCD_Data[i, 1] == 0 ? "OK" : (m.CCD_Data[i, 1] == 1 ? "NG" : "缺图"); - m.CCDResult3 = m.CCD_Data[i, 2] == 0 ? "OK" : (m.CCD_Data[i, 2] == 1 ? "NG" : "缺图"); - m.CCDResult4 = m.CCD_Data[i, 3] == 0 ? "OK" : (m.CCD_Data[i, 3] == 1 ? "NG" : "缺图"); - m.CCDResult5 = m.CCD_Data[i, 4] == 0 ? "OK" : (m.CCD_Data[i, 4] == 1 ? "NG" : "缺图"); - m.CCDResult6 = m.CCD_Data[i, 5] == 0 ? "OK" : (m.CCD_Data[i, 5] == 1 ? "NG" : "缺图"); - m.CCDResult7 = m.CCD_Data[i, 6] == 0 ? "OK" : (m.CCD_Data[i, 6] == 1 ? "NG" : "缺图"); - m.CCDResult8 = m.CCD_Data[i, 7] == 0 ? "OK" : (m.CCD_Data[i, 7] == 1 ? "NG" : "缺图"); - m.CCDResult9 = m.CCD_Data[i, 8] == 0 ? "OK" : (m.CCD_Data[i, 8] == 1 ? "NG" : "缺图"); - m.CCDResult10 = m.CCD_Data[i, 9] == 0 ? "OK" : (m.CCD_Data[i, 9] == 1 ? "NG" : "缺图"); - m.CCDResult11 = m.CCD_Data[i, 10] == 0 ? "OK" : (m.CCD_Data[i, 10] == 1 ? "NG" : "缺图"); - m.CCDResult12 = m.CCD_Data[i, 11] == 0 ? "OK" : (m.CCD_Data[i, 11] == 1 ? "NG" : "缺图"); - m.CCDResult13 = m.CCD_Data[i, 12] == 0 ? "OK" : (m.CCD_Data[i, 12] == 1 ? "NG" : "缺图"); - m.CCDResult14 = m.CCD_Data[i, 13] == 0 ? "OK" : (m.CCD_Data[i, 13] == 1 ? "NG" : "缺图"); - m.CCDResult15 = m.CCD_Data[i, 14] == 0 ? "OK" : (m.CCD_Data[i, 14] == 1 ? "NG" : "缺图"); - m.CCDResult16 = m.CCD_Data[i, 15] == 0 ? "OK" : (m.CCD_Data[i, 15] == 1 ? "NG" : "缺图"); - m.CCDResult17 = m.CCD_Data[i, 16] == 0 ? "OK" : (m.CCD_Data[i, 16] == 1 ? "NG" : "缺图"); - m.CCDResult18 = m.CCD_Data[i, 17] == 0 ? "OK" : (m.CCD_Data[i, 17] == 1 ? "NG" : "缺图"); - m.CCDResult19 = m.CCD_Data[i, 18] == 0 ? "OK" : (m.CCD_Data[i, 18] == 1 ? "NG" : "缺图"); - m.CCDResult20 = m.CCD_Data[i, 19] == 0 ? "OK" : (m.CCD_Data[i, 19] == 1 ? "NG" : "缺图"); - m.CCDResult21 = m.CCD_Data[i, 20] == 0 ? "OK" : (m.CCD_Data[i, 20] == 1 ? "NG" : "缺图"); - m.CCDResult22 = m.CCD_Data[i, 21] == 0 ? "OK" : (m.CCD_Data[i, 21] == 1 ? "NG" : "缺图"); - m.CCDResult23 = m.CCD_Data[i, 22] == 0 ? "OK" : (m.CCD_Data[i, 22] == 1 ? "NG" : "缺图"); - m.CCDResult24 = m.CCD_Data[i, 23] == 0 ? "OK" : (m.CCD_Data[i, 23] == 1 ? "NG" : "缺图"); - m.CCDResult25 = m.CCD_Data[i, 24] == 0 ? "OK" : (m.CCD_Data[i, 24] == 1 ? "NG" : "缺图"); - m.CCDResult26 = m.CCD_Data[i, 25] == 0 ? "OK" : (m.CCD_Data[i, 25] == 1 ? "NG" : "缺图"); - m.CCDResult27 = m.CCD_Data[i, 26] == 0 ? "OK" : (m.CCD_Data[i, 26] == 1 ? "NG" : "缺图"); + #region //电芯CCD判定结果 1 0K 0NG 2缺图 + m.CCDResult1 = m.CCD_Data[i, 0] == 1 ? "OK" : (m.CCD_Data[i, 0] == 0 ? "NG" : "缺图"); + m.CCDResult2 = m.CCD_Data[i, 1] == 1 ? "OK" : (m.CCD_Data[i, 1] == 0 ? "NG" : "缺图"); + m.CCDResult3 = m.CCD_Data[i, 2] == 1 ? "OK" : (m.CCD_Data[i, 2] == 0 ? "NG" : "缺图"); + m.CCDResult4 = m.CCD_Data[i, 3] == 1 ? "OK" : (m.CCD_Data[i, 3] == 0 ? "NG" : "缺图"); + m.CCDResult5 = m.CCD_Data[i, 4] == 1 ? "OK" : (m.CCD_Data[i, 4] == 0 ? "NG" : "缺图"); + m.CCDResult6 = m.CCD_Data[i, 5] == 1 ? "OK" : (m.CCD_Data[i, 5] == 0 ? "NG" : "缺图"); + m.CCDResult7 = m.CCD_Data[i, 6] == 1 ? "OK" : (m.CCD_Data[i, 6] == 0 ? "NG" : "缺图"); + m.CCDResult8 = m.CCD_Data[i, 7] == 1 ? "OK" : (m.CCD_Data[i, 7] == 0 ? "NG" : "缺图"); + m.CCDResult9 = m.CCD_Data[i, 8] == 1 ? "OK" : (m.CCD_Data[i, 8] == 0 ? "NG" : "缺图"); + m.CCDResult10 = m.CCD_Data[i, 9] == 1 ? "OK" : (m.CCD_Data[i, 9] == 0 ? "NG" : "缺图"); + m.CCDResult11 = m.CCD_Data[i, 10] == 1 ? "OK" : (m.CCD_Data[i, 10] == 0 ? "NG" : "缺图"); + m.CCDResult12 = m.CCD_Data[i, 11] == 1 ? "OK" : (m.CCD_Data[i, 11] == 0 ? "NG" : "缺图"); + m.CCDResult13 = m.CCD_Data[i, 12] == 1 ? "OK" : (m.CCD_Data[i, 12] == 0 ? "NG" : "缺图"); + m.CCDResult14 = m.CCD_Data[i, 13] == 1 ? "OK" : (m.CCD_Data[i, 13] == 0 ? "NG" : "缺图"); + m.CCDResult15 = m.CCD_Data[i, 14] == 1 ? "OK" : (m.CCD_Data[i, 14] == 0 ? "NG" : "缺图"); + m.CCDResult16 = m.CCD_Data[i, 15] == 1 ? "OK" : (m.CCD_Data[i, 15] == 0 ? "NG" : "缺图"); + m.CCDResult17 = m.CCD_Data[i, 16] == 1 ? "OK" : (m.CCD_Data[i, 16] == 0 ? "NG" : "缺图"); + m.CCDResult18 = m.CCD_Data[i, 17] == 1 ? "OK" : (m.CCD_Data[i, 17] == 0 ? "NG" : "缺图"); + m.CCDResult19 = m.CCD_Data[i, 18] == 1 ? "OK" : (m.CCD_Data[i, 18] == 0 ? "NG" : "缺图"); + m.CCDResult20 = m.CCD_Data[i, 19] == 1 ? "OK" : (m.CCD_Data[i, 19] == 0 ? "NG" : "缺图"); + m.CCDResult21 = m.CCD_Data[i, 20] == 1 ? "OK" : (m.CCD_Data[i, 20] == 0 ? "NG" : "缺图"); + m.CCDResult22 = m.CCD_Data[i, 21] == 1 ? "OK" : (m.CCD_Data[i, 21] == 0 ? "NG" : "缺图"); + m.CCDResult23 = m.CCD_Data[i, 22] == 1 ? "OK" : (m.CCD_Data[i, 22] == 0 ? "NG" : "缺图"); + m.CCDResult24 = m.CCD_Data[i, 23] == 1 ? "OK" : (m.CCD_Data[i, 23] == 0 ? "NG" : "缺图"); + m.CCDResult25 = m.CCD_Data[i, 24] == 1 ? "OK" : (m.CCD_Data[i, 24] == 0 ? "NG" : "缺图"); + m.CCDResult26 = m.CCD_Data[i, 25] == 1 ? "OK" : (m.CCD_Data[i, 25] == 0 ? "NG" : "缺图"); + m.CCDResult27 = m.CCD_Data[i, 26] == 1 ? "OK" : (m.CCD_Data[i, 26] == 0 ? "NG" : "缺图"); #endregion m.CSBYHASCANNINGTIME = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); @@ -1851,9 +1869,10 @@ namespace JinYuan.ControlCenters { for (int ii = 0; ii < 27; ii++) { - if (m.CCD_Data[i, ii] != 0) + if (m.CCD_Data[i, ii] != 1) { - MyRes[i] = m.CCD_Data[i, ii]; + //1OK,2扫码NG,3MES反馈NG,4其他NG + MyRes[i] = 4; break; } @@ -1861,7 +1880,7 @@ namespace JinYuan.ControlCenters } else MyRes[i] = 1; - //MyRes[i] = JudgmentResult(Code_NG, m.CCD_Data); + MyRes[i] = JudgmentWGJResult(Code_NG, m.CCD_Data,i); m.Result = MyRes[i]; @@ -2008,11 +2027,12 @@ namespace JinYuan.ControlCenters #endregion JYResult result1 = null; JYResult result2 = null; + JYResult result3 = null; if (pf.IsFeedbackPlc) { //result1 = CommonMethods.PlcLink.WriteValue(pf.VarList[2].VarAddress, MyRes[0], Data_Type.Short);//判断结果写入PLC //result2 = CommonMethods.PlcLink.WriteValue(pf.VarList[3].VarAddress, MyRes[1], Data_Type.Short);//判断结果写入PLC - //if (CommonMethods.sysConfig.OKSwitching) + // if (CommonMethods.sysConfig.OKSwitching) { //调试发OK //MyRes[0] = 1; @@ -2020,7 +2040,7 @@ namespace JinYuan.ControlCenters Thread.Sleep(500); result1 = CommonMethods.PlcLink.WriteValue(pf.VarList[2].VarAddress, MyRes[0], Data_Type.Short);//判断结果写入PLC result2 = CommonMethods.PlcLink.WriteValue(pf.VarList[3].VarAddress, MyRes[1], Data_Type.Short);//判断结果写入PLC - result2 = CommonMethods.PlcLink.WriteValue(pf.VarList[4].VarAddress, MyRes[2], Data_Type.Short);//判断结果写入PLC + result3 = CommonMethods.PlcLink.WriteValue(pf.VarList[4].VarAddress, MyRes[2], Data_Type.Short);//判断结果写入PLC } //else //{ @@ -2030,7 +2050,7 @@ namespace JinYuan.ControlCenters // result2 = CommonMethods.PlcLink.WriteValue(pf.VarList[3].VarAddress, MyRes[1], Data_Type.Short);//判断结果写入PLC //} } - JYResult result3 = CommonMethods.PlcLink.WriteValue(pf.VarList[0].VarAddress, 0);//置位0 + JYResult result4 = CommonMethods.PlcLink.WriteValue(pf.VarList[0].VarAddress, 0);//置位0 CommonMethods.AddDataMonitorLog(0, $"发送信息给PLC:{result1.IsSuccess},{MyRes[0]},{MyRes[1]},{MyRes[2]}"); LoggerHelp.WriteLog($"发送信息给PLC:{result1.IsSuccess},{MyRes[0]},{MyRes[1]},{MyRes[2]}"); @@ -2212,6 +2232,20 @@ namespace JinYuan.ControlCenters return NGcodelist; } + //下料不良代码 外观检 + public List NGWGJcode(short[ ,] lstResult,int index) + { + List NGcodelist = new List(); + for (int i = 0; i < 28; i++) + { + if(lstResult[index,i] == 2) + { + NGcodelist.Add("WGJA00"+(i+1)); + } + } + + return NGcodelist; + } #endregion #region NG下料不良代码 diff --git a/JinYuan.MES/MesDataProcess.cs b/JinYuan.MES/MesDataProcess.cs index b09aaf2..7c5de03 100644 --- a/JinYuan.MES/MesDataProcess.cs +++ b/JinYuan.MES/MesDataProcess.cs @@ -783,14 +783,14 @@ namespace JinYuan.MES long outTime = sw.ElapsedMilliseconds; if (outTime > 1000) { - LoggerHelp.WriteLog($"预焊出站PC<=>MES上传耗时:{outTime}ms,电芯码:{listBar.CSBYHCODEA}", "MESTime"); + LoggerHelp.WriteLog($"外观检出站PC<=>MES上传耗时:{outTime}ms,电芯码:{listBar.CSBYHCODEA}", "MESTime"); } if (string.IsNullOrEmpty(result)) { string resData = result == "" ? "" : result; - resJson = $"{nowDate.ToString("yyyy-MM-dd HH:mm:ss.fff")}:调用产品出站信息(组装)接口:{url},请求数据为:{postcontent},\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{resData}"; - TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate.ToString("yyyyMMdd")}\产品出站信息(组装)\{nowDate.ToString("HH")}.txt", resJson); + resJson = $"{nowDate.ToString("yyyy-MM-dd HH:mm:ss.fff")}:调用产品出站信息(包装)接口:{url},请求数据为:{postcontent},\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{resData}"; + TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate.ToString("yyyyMMdd")}\产品出站信息(包装)\{nowDate.ToString("HH")}.txt", resJson); return res; } @@ -799,22 +799,22 @@ namespace JinYuan.MES { res = true; GetOutMesResType(res1, listBar.CSBYHCODEA, ref MesMessage, ref mesResType); - resJson = $"{nowDate.ToString("yyyy-MM-dd HH:mm:ss.fff")}:调用产品出站信息(组装)接口:{url},请求数据为:{postcontent},\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{result}"; - TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate.ToString("yyyyMMdd")}\产品出站信息(组装)\{nowDate.ToString("HH")}.txt", resJson); + resJson = $"{nowDate.ToString("yyyy-MM-dd HH:mm:ss.fff")}:调用产品出站信息(包装)接口:{url},请求数据为:{postcontent},\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{result}"; + TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate.ToString("yyyyMMdd")}\产品出站信息(包装)\{nowDate.ToString("HH")}.txt", resJson); } else { GetOutMesResType(res1, listBar.CSBYHCODEA, ref MesMessage, ref mesResType); var resData = res1 == null ? "" : result; - resJson = $"{nowDate.ToString("yyyy-MM-dd HH:mm:ss.fff")}:调用产品出站信息(组装)接口:{url},请求数据为:{postcontent},\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{resData}"; - TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate.ToString("yyyyMMdd")}\产品出站信息(组装)\{nowDate.ToString("HH")}.txt", resJson); + resJson = $"{nowDate.ToString("yyyy-MM-dd HH:mm:ss.fff")}:调用产品出站信息(包装)接口:{url},请求数据为:{postcontent},\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{resData}"; + TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate.ToString("yyyyMMdd")}\产品出站信息(包装)\{nowDate.ToString("HH")}.txt", resJson); } } catch (Exception ex) { - resJson = $"产品出站信息(组装)接口发生异常:{ex.Message}"; - LoggerHelp.WriteEX("产品出站信息(组装)接口", ex); + resJson = $"产品出站信息(包装)接口发生异常:{ex.Message}"; + LoggerHelp.WriteEX("产品出站信息(包装)接口", ex); } return res; diff --git a/JinYuan.Models/FDConfig.cs b/JinYuan.Models/FDConfig.cs new file mode 100644 index 0000000..a340e8d --- /dev/null +++ b/JinYuan.Models/FDConfig.cs @@ -0,0 +1,52 @@ +using SqlSugar; + +namespace JinYuan.Models +{ + public class FDConfig + { + /// + /// 编号 + /// + + public int FdNum { get; set; } + /// + /// OK拉带类型1 + /// + public string OKLD1Type { get; set; } + /// + /// OK拉带类型2 + /// + public string OKLD2Type { get; set; } + /// + /// OK拉带类型3 + /// + public string OKLD3Type { get; set; } + /// + /// OK拉带类型4 + /// + public string OKLD4Type { get; set; } + /// + /// NG拉带类型5 + /// + public string NGLD5Type { get; set; } + /// + /// NG拉带类型6 + /// + public string NGLD6Type { get; set; } + /// + /// NG拉带类型7 + /// + public string NGLD7Type { get; set; } + /// + /// 是否开启分档 + /// + public bool IsFDActive { get; set; } + /// + ///是否激活NG电池不分类排出 + /// + + public bool IsNGActive { get; set; } + + + } +} diff --git a/JinYuan.Models/JinYuan.Models.csproj b/JinYuan.Models/JinYuan.Models.csproj index 2e2a31e..89adaba 100644 --- a/JinYuan.Models/JinYuan.Models.csproj +++ b/JinYuan.Models/JinYuan.Models.csproj @@ -84,6 +84,7 @@ + diff --git a/JinYuan.VirtualDataLibrary/MesConfig.cs b/JinYuan.VirtualDataLibrary/MesConfig.cs index 2294e38..50553f4 100644 --- a/JinYuan.VirtualDataLibrary/MesConfig.cs +++ b/JinYuan.VirtualDataLibrary/MesConfig.cs @@ -184,6 +184,10 @@ namespace JinYuan.VirtualDataLibrary /// 设备风速接口 /// public string CollectData = "http://10.1.3.66:3000/mock/15/eve_api/ems/iot/upload_device_collect_data"; + /// + /// 设备风速接口 + /// + public string OkNgParamMesUrl = "http://10.17.128.206/core/api/public/eve/pm/eqm/new/grading"; } } diff --git a/LargeSquareOne/App.config b/LargeSquareOne/App.config index 71dfbd6..04900ab 100644 --- a/LargeSquareOne/App.config +++ b/LargeSquareOne/App.config @@ -5,7 +5,7 @@ - + diff --git a/LargeSquareOne/Config/Configure.ini b/LargeSquareOne/Config/Configure.ini index b982b35..e6ff45d 100644 --- a/LargeSquareOne/Config/Configure.ini +++ b/LargeSquareOne/Config/Configure.ini @@ -34,6 +34,8 @@ MES É豸״̬=http://10.22.160.141/core/api/public/eve/pm/eqm/run/status/operation ÄܺÄ=http://10.22.160.141/core/api/public/eve/pm/energy/consumption/collection/submit ·çËÙÒÇ=https://iot.eveportal.com:9470/eve_api/ems/iot/upload_device_collect_data +·çËÙÒÇ=https://iot.eveportal.com:9470/eve_api/ems/iot/upload_device_collect_data +·ֵµ²ÎÊý=http://10.22.160.141/core/api/public/eve/pm/eqm/new/grading guid=a270c7d2-9cbd-4739-9a0b-0709b5813332 DeviceState=1 run_AlarmMark=0 diff --git a/LargeSquareOne/Config/Device.xlsx b/LargeSquareOne/Config/Device.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..c5d26eb9c746a0cbf2e111a6a58b071cc958b5d8 GIT binary patch literal 9494 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 U;2<0X0FWUc8VHT&$bX*w52dv|G5`Po literal 0 HcmV?d00001 diff --git a/LargeSquareOne/Config/FdConfig.xlsx b/LargeSquareOne/Config/FdConfig.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..17a456979ca6b81e8a200a1c87ee7775df3656eb GIT binary patch literal 4355 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 literal 0 HcmV?d00001 diff --git a/LargeSquareOne/FrmMain.cs b/LargeSquareOne/FrmMain.cs index cecac8b..5f95ae1 100644 --- a/LargeSquareOne/FrmMain.cs +++ b/LargeSquareOne/FrmMain.cs @@ -198,6 +198,7 @@ namespace LargeSquareOne CommonMethods.mesConfig.InPutStationMesUrl = IniConfigHelper.ReadIniData("MES配置", "产品进站", "0"); CommonMethods.mesConfig.EquProcessProcessParamMesUrl = IniConfigHelper.ReadIniData("MES配置", "产品过程加工参数", "0"); CommonMethods.mesConfig.ResultProcessParamMesUrl = IniConfigHelper.ReadIniData("MES配置", "产品结果加工参数", "0"); + CommonMethods.mesConfig.OkNgParamMesUrl = IniConfigHelper.ReadIniData("MES配置", "分档参数", "0"); CommonMethods.mesConfig.OutStationMesUrl = IniConfigHelper.ReadIniData("MES配置", "产品出站", "0"); CommonMethods.mesConfig.AlarmCurrencyMesUrl = IniConfigHelper.ReadIniData("MES配置", "设备报警", "0"); CommonMethods.mesConfig.StatusMesUrl = IniConfigHelper.ReadIniData("MES配置", "设备状态", "0"); diff --git a/LargeSquareOne/FrmParamSet.Designer.cs b/LargeSquareOne/FrmParamSet.Designer.cs index b83aa9c..de3ef9c 100644 --- a/LargeSquareOne/FrmParamSet.Designer.cs +++ b/LargeSquareOne/FrmParamSet.Designer.cs @@ -29,6 +29,9 @@ private void InitializeComponent() { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmSystemSet)); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle3 = new System.Windows.Forms.DataGridViewCellStyle(); this.up_QieHuanPeriod = new JinYuan.ControlLib.UpDownLabel(); this.tog_AutoQieHuanM = new JinYuan.ControlLib.Toggle(); this.label16 = new System.Windows.Forms.Label(); @@ -73,6 +76,9 @@ this.title1 = new JinYuan.ControlLib.Title(); this.label18 = new System.Windows.Forms.Label(); this.tog_OKSwitching = new JinYuan.ControlLib.Toggle(); + this.title5 = new JinYuan.ControlLib.Title(); + this.dgvFdConfigs = new System.Windows.Forms.DataGridView(); + ((System.ComponentModel.ISupportInitialize)(this.dgvFdConfigs)).BeginInit(); this.SuspendLayout(); // // up_QieHuanPeriod @@ -647,12 +653,73 @@ this.tog_OKSwitching.TrueText = ""; this.tog_OKSwitching.CheckedChanged += new System.EventHandler(this.tog_OKSwitching_CheckedChanged); // + // title5 + // + this.title5.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(5)))), ((int)(((byte)(28)))), ((int)(((byte)(68))))); + this.title5.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("title5.BackgroundImage"))); + this.title5.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.title5.Font = new System.Drawing.Font("微软雅黑", 14.25F, System.Drawing.FontStyle.Bold); + this.title5.Location = new System.Drawing.Point(22, 424); + this.title5.Margin = new System.Windows.Forms.Padding(5, 8, 5, 8); + this.title5.Name = "title5"; + this.title5.Size = new System.Drawing.Size(117, 37); + this.title5.TabIndex = 49; + this.title5.TitleName = "分档设置"; + // + // dgvFdConfigs + // + this.dgvFdConfigs.AllowUserToAddRows = false; + this.dgvFdConfigs.AllowUserToDeleteRows = false; + this.dgvFdConfigs.AllowUserToResizeRows = false; + this.dgvFdConfigs.BackgroundColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.dgvFdConfigs.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.dgvFdConfigs.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + dataGridViewCellStyle1.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle1.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle1.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgvFdConfigs.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1; + this.dgvFdConfigs.ColumnHeadersHeight = 40; + this.dgvFdConfigs.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing; + dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle2.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle2.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle2.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle2.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dgvFdConfigs.DefaultCellStyle = dataGridViewCellStyle2; + this.dgvFdConfigs.EnableHeadersVisualStyles = false; + this.dgvFdConfigs.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(21)))), ((int)(((byte)(77)))), ((int)(((byte)(147))))); + this.dgvFdConfigs.Location = new System.Drawing.Point(44, 486); + this.dgvFdConfigs.Name = "dgvFdConfigs"; + this.dgvFdConfigs.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle3.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle3.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle3.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle3.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle3.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle3.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgvFdConfigs.RowHeadersDefaultCellStyle = dataGridViewCellStyle3; + this.dgvFdConfigs.RowHeadersWidth = 55; + this.dgvFdConfigs.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.DisableResizing; + this.dgvFdConfigs.RowTemplate.Height = 40; + this.dgvFdConfigs.RowTemplate.Resizable = System.Windows.Forms.DataGridViewTriState.False; + this.dgvFdConfigs.Size = new System.Drawing.Size(1757, 69); + this.dgvFdConfigs.TabIndex = 78; + // // FrmSystemSet // this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); this.ClientSize = new System.Drawing.Size(1370, 651); + this.Controls.Add(this.dgvFdConfigs); + this.Controls.Add(this.title5); this.Controls.Add(this.tog_OKSwitching); this.Controls.Add(this.label18); this.Controls.Add(this.up_QieHuanPeriod); @@ -702,6 +769,7 @@ this.Margin = new System.Windows.Forms.Padding(5); this.Name = "FrmSystemSet"; this.Text = "系统设置"; + ((System.ComponentModel.ISupportInitialize)(this.dgvFdConfigs)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); @@ -752,5 +820,7 @@ private System.Windows.Forms.Label label17; private System.Windows.Forms.Label label18; private JinYuan.ControlLib.Toggle tog_OKSwitching; + private JinYuan.ControlLib.Title title5; + private System.Windows.Forms.DataGridView dgvFdConfigs; } } \ No newline at end of file diff --git a/LargeSquareOne/FrmParamSet.cs b/LargeSquareOne/FrmParamSet.cs index 8d2e651..ab3756d 100644 --- a/LargeSquareOne/FrmParamSet.cs +++ b/LargeSquareOne/FrmParamSet.cs @@ -1,15 +1,32 @@ -using JinYuan.ControlLib; +using JinYuan.CommunicationLib.Enum; +using JinYuan.ControlLib; using JinYuan.Helper; +using JinYuan.Models; using JinYuan.VirtualDataLibrary; using Microsoft.Win32; +using MiniExcelLibs; using System; +using System.Collections.Generic; +using System.ComponentModel; using System.IO; using System.Windows.Forms; +using System.Linq; +using static Org.BouncyCastle.Math.EC.ECCurve; +using System.Drawing; namespace LargeSquareOne { public partial class FrmSystemSet : Form { + private string FdConfigFilePath = "fd_config.xlsx"; + private List fdConfigs; + private List PLCTypes = new List(); + private List NGLDTypes1 = new List();//NG拉带类型 + private List NGLDTypes2 = new List();//NG拉带类型 + private List NGLDTypes3 = new List();//NG拉带类型 + private bool isFDEditing = false; + private int editingFDRowIndex = -1; + private readonly string configFolderPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Config"); /// /// 打印日志方法 /// @@ -49,6 +66,14 @@ namespace LargeSquareOne this.cmb_PLCType.Items.Add("Mitsubishi"); this.cmb_PLCType.Items.Add("Inovance"); + FdConfigFilePath = Path.Combine(configFolderPath, "FdConfig.xlsx"); + PLCTypes.AddRange(new string[] { "OmronFinsTCP", "OmronCipNet" }); + NGLDTypes1.AddRange(new string[] { "面1", "面2", "面3" }); + NGLDTypes2.AddRange(new string[] { "面1", "面2", "面3" }); + NGLDTypes3.AddRange(new string[] { "面1", "面2", "面3" }); + SetupFDDataGridView(); + LoadFDConfig(); + this.tog_AutoStart.IsChecked = CommonMethods.sysConfig.AutoStart; this.tog_AutoLogin.IsChecked = CommonMethods.sysConfig.AutoLogin; this.tog_AutoLock.IsChecked = CommonMethods.sysConfig.AutoLock; @@ -73,7 +98,7 @@ namespace LargeSquareOne this.up_ShowSeriesCount.ValueChanged += new System.EventHandler(this.up_ShowSeriesCount_ValueChanged); this.devPath = devPath; - + InitParam(); } @@ -417,5 +442,424 @@ namespace LargeSquareOne LogMessage(OKMessage, "强制结果OK日志"); } } + + #region 分档设置 + private void LoadFDConfig() + { + + try + { + if (File.Exists(FdConfigFilePath)) + { + using (var stream = File.OpenRead(FdConfigFilePath)) + { + var devices = MiniExcel.Query(stream).ToList(); + fdConfigs = devices.Select(device => new FDConfig + { + FdNum = device.FdNum, + OKLD1Type = device.OKLD1Type, + OKLD2Type = device.OKLD2Type, + OKLD3Type = device.OKLD3Type, + OKLD4Type = device.OKLD4Type, + NGLD5Type = device.NGLD5Type, + NGLD6Type = device.NGLD6Type, + NGLD7Type = device.NGLD7Type, + IsFDActive = device.IsFDActive, + IsNGActive = device.IsNGActive + }).ToList(); + } + + } + else + { + fdConfigs = new List(); + } + + RefreshFDDataGridView(); + } + catch (Exception ex) + { + MessageBox.Show($"加载配置文件失败:{ex.Message}", "错误", + MessageBoxButtons.OK, MessageBoxIcon.Error); + fdConfigs = new List(); + } + + + } + private void SetColumnsFDReadOnly(bool readOnly) + { + foreach (DataGridViewColumn col in dgvFdConfigs.Columns) + { + // PlcNum 列始终保持只读 + if (col.Name == "FdNum") + { + col.ReadOnly = true; + continue; + } + + // 按钮列不需要设置 ReadOnly 属性 + if (col is DataGridViewButtonColumn) + continue; + + // 其他列根据参数设置 + col.ReadOnly = readOnly; + } + } + + /// + /// 初始化分档DataGrid + /// + private void SetupFDDataGridView() + { + // 设置基本属性 + dgvFdConfigs.AutoGenerateColumns = false; + dgvFdConfigs.MultiSelect = false; + + // 添加数据列 + dgvFdConfigs.Columns.AddRange(new DataGridViewColumn[] + { + new DataGridViewTextBoxColumn + { + Name = "FdNum", + HeaderText = "分档编号", + DataPropertyName = "FdNum", + ReadOnly = true, + Width = 80, + ValueType = typeof(int) + }, + #region 分档类型 + new DataGridViewTextBoxColumn + { + Name = "OKLD1Type", + HeaderText = "OK拉带类型1", + DataPropertyName = "OKLD1Type", + Width = 120, + ValueType = typeof(string) + }, + new DataGridViewTextBoxColumn + { + Name = "OKLD2Type", + HeaderText = "OK拉带类型2", + DataPropertyName = "OKLD2Type", + Width = 120, + ValueType = typeof(string) + }, + new DataGridViewTextBoxColumn + { + Name = "OKLD3Type", + HeaderText = "OK拉带类型3", + DataPropertyName = "OKLD3Type", + Width = 120, + ValueType = typeof(string) + }, + new DataGridViewTextBoxColumn + { + Name = "OKLD4Type", + HeaderText = "OK拉带类型4", + DataPropertyName = "OKLD4Type", + Width = 120, + ValueType = typeof(string) + }, + #endregion + #region NG拉带类型 + new DataGridViewComboBoxColumn + { + Name = "NGLD5Type", + HeaderText = "NG拉带类型5", + DataPropertyName = "NGLD5Type",//NG拉带 + DataSource = new List(NGLDTypes1), // 使用新列表避免引用问题 + Width = 160, + ValueType = typeof(string), + FlatStyle = FlatStyle.Flat, + DefaultCellStyle = new DataGridViewCellStyle + { + BackColor = Color.FromArgb(14, 23, 38), // 深色背景 + ForeColor = Color.White, // 白色文字 + SelectionBackColor = Color.FromArgb(0, 122, 204), // 选中时的背景色 + SelectionForeColor = Color.White, // 选中时的文字颜色 + Font = new Font("微软雅黑", 9F) // 字体设置 + } + }, + new DataGridViewComboBoxColumn + { + Name = "NGLD6Type", + HeaderText = "NG拉带类型6", + DataPropertyName = "NGLD6Type",//NG拉带 + DataSource = new List(NGLDTypes2), // 使用新列表避免引用问题 + Width = 160, + ValueType = typeof(string), + FlatStyle = FlatStyle.Flat, + DefaultCellStyle = new DataGridViewCellStyle + { + BackColor = Color.FromArgb(14, 23, 38), // 深色背景 + ForeColor = Color.White, // 白色文字 + SelectionBackColor = Color.FromArgb(0, 122, 204), // 选中时的背景色 + SelectionForeColor = Color.White, // 选中时的文字颜色 + Font = new Font("微软雅黑", 9F) // 字体设置 + } + }, + new DataGridViewComboBoxColumn + { + Name = "NGLD7Type", + HeaderText = "NG拉带类型7", + DataPropertyName = "NGLD7Type",//NG拉带 + DataSource = new List(NGLDTypes3), // 使用新列表避免引用问题 + Width = 160, + ValueType = typeof(string), + FlatStyle = FlatStyle.Flat, + DefaultCellStyle = new DataGridViewCellStyle + { + BackColor = Color.FromArgb(14, 23, 38), // 深色背景 + ForeColor = Color.White, // 白色文字 + SelectionBackColor = Color.FromArgb(0, 122, 204), // 选中时的背景色 + SelectionForeColor = Color.White, // 选中时的文字颜色 + Font = new Font("微软雅黑", 9F) // 字体设置 + } + }, + #endregion + #region 开启分档 + new DataGridViewCheckBoxColumn + { + Name = "IsFDActive", + HeaderText = "开启分档", + DataPropertyName = "IsFDActive", + Width = 80, + ValueType = typeof(bool), + TrueValue = true, + FalseValue = false + }, + new DataGridViewCheckBoxColumn + { + Name = "IsNGActive", + HeaderText = "NG电池不分类排出", + DataPropertyName = "IsNGActive", + Width = 80, + ValueType = typeof(bool), + TrueValue = true, + FalseValue = false + }, + #endregion + + new DataGridViewButtonColumn + { + Name = "Edit", + HeaderText = "操作", + Text = "修改", + UseColumnTextForButtonValue = true, + Width = 80 + } + + + }); + + + // 设置列为只读 + SetColumnsFDReadOnly(false); + + // 绑定事件 + dgvFdConfigs.CellClick += DgvFdConfigs_CellClick; + dgvFdConfigs.CellValidating += DgvFdConfigs_CellValidating; + dgvFdConfigs.CellValueChanged += DgvFdConfigs_CellValueChanged; + dgvFdConfigs.DataError += DgvFdConfigs_DataError; + + // 设置自动调整行高 + dgvFdConfigs.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells; + dgvFdConfigs.RowHeadersVisible = false; + } + private void DgvFdConfigs_CellClick(object sender, DataGridViewCellEventArgs e) + { + if (e.RowIndex < 0) return; + + var columnName = dgvFdConfigs.Columns[e.ColumnIndex].Name; + + // 如果正在编辑其他行,阻止操作 + if (isFDEditing && editingFDRowIndex != e.RowIndex) + { + MessageBox.Show("请先完成当前编辑操作", "提示", + MessageBoxButtons.OK, MessageBoxIcon.Warning); + return; + } + + var fdConfig = fdConfigs[e.RowIndex]; + + switch (columnName) + { + case "Edit": + HandleFDEdit(e.RowIndex); + break; + case "CommConfig": + HandleCommFdConfig(fdConfig); + break; + case "VariableConfig": + HandleVariableFdConfig(fdConfig); + break; + case "Delete": + HandleFdDelete(e.RowIndex, fdConfig); + break; + } + } + private void HandleFDEdit(int rowIndex) + { + if (!isFDEditing) + { + // 开始编辑 + isFDEditing = true; + editingFDRowIndex = rowIndex; + SetColumnsFDReadOnly(false); // 设置其他列为可编辑 + + // 更改编辑按钮文本为"保存" + dgvFdConfigs.Rows[rowIndex].Cells["Edit"].Value = "保存"; + + // 禁用其他行的按钮 + foreach (DataGridViewRow row in dgvFdConfigs.Rows) + { + if (row.Index != rowIndex) + { + if (row.Cells["Edit"] is DataGridViewButtonCell editCell) + editCell.Value = ""; + if (row.Cells["CommConfig"] is DataGridViewButtonCell configCell) + configCell.Value = ""; + if (row.Cells["Delete"] is DataGridViewButtonCell deleteCell) + deleteCell.Value = ""; + } + } + + // 禁用添加按钮 + //btAddPLC.Enabled = false; + } + else if (rowIndex == editingFDRowIndex) + { + // 保存更改 + //if (ValidateRow(rowIndex)) + { + SaveFDChanges(rowIndex); + EndFDEditing(); + } + } + } + private void EndFDEditing() + { + isFDEditing = false; + editingFDRowIndex = -1; + SetColumnsFDReadOnly(true); + + // 恢复所有按钮文本和状态 + foreach (DataGridViewRow row in dgvFdConfigs.Rows) + { + row.Cells["Edit"].Value = "编辑"; + // row.Cells["CommConfig"].Value = "通信组"; + // row.Cells["Delete"].Value = "删除"; + } + + // 启用添加按钮 + //btAddPLC.Enabled = true; + } + private void HandleCommFdConfig(FDConfig fdconfig) + { + } + private void HandleVariableFdConfig(FDConfig fdconfig) + { + + } + private void HandleFdDelete(int rowIndex, FDConfig fdconfig) + { + if (MessageBox.Show($"确定要删除 分档 {fdconfig.FdNum} 吗?", "确认删除", + MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) + { + fdConfigs.RemoveAt(rowIndex); + SaveFDConfig(); + RefreshFDDataGridView(); + } + } + private void SaveFDChanges(int rowIndex) + { + try + { + var row = dgvFdConfigs.Rows[rowIndex]; + var config = fdConfigs[rowIndex]; + + // 更新配置对象 + config.OKLD1Type = row.Cells["OKLD1Type"].Value?.ToString() ?? ""; + config.OKLD2Type = row.Cells["OKLD2Type"].Value?.ToString() ?? ""; + config.OKLD3Type = row.Cells["OKLD3Type"].Value?.ToString() ?? ""; + config.OKLD4Type = row.Cells["OKLD4Type"].Value?.ToString() ?? ""; + config.NGLD5Type = row.Cells["NGLD5Type"].Value?.ToString() ?? ""; + config.NGLD6Type = row.Cells["NGLD6Type"].Value?.ToString() ?? ""; + config.NGLD7Type = row.Cells["NGLD7Type"].Value?.ToString() ?? ""; + + config.IsFDActive = row.Cells["IsFDActive"].Value != null && + Convert.ToBoolean(row.Cells["IsFDActive"].Value); + config.IsNGActive = row.Cells["IsNGActive"].Value != null && + Convert.ToBoolean(row.Cells["IsNGActive"].Value); + + // 保存更改 + SaveFDConfig(); + MessageBox.Show("保存成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + catch (Exception ex) + { + // 这里只显示错误信息,不再抛出异常 + MessageBox.Show($"保存失败:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void DgvFdConfigs_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) + { + if (e.RowIndex < 0 || !isFDEditing || e.RowIndex != editingFDRowIndex) return; + + string newValue = e.FormattedValue.ToString(); + var column = dgvFdConfigs.Columns[e.ColumnIndex]; + + } + private void DgvFdConfigs_CellValueChanged(object sender, DataGridViewCellEventArgs e) + { + if (e.RowIndex < 0) return; + dgvFdConfigs.Rows[e.RowIndex].ErrorText = string.Empty; + } + private void DgvFdConfigs_DataError(object sender, DataGridViewDataErrorEventArgs e) + { + e.ThrowException = false; + string columnName = dgvFdConfigs.Columns[e.ColumnIndex].HeaderText; + MessageBox.Show($"'{columnName}'列的输入数据格式不正确", "数据错误", + MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + private void SaveFDConfig() + { + try + { + // 创建备份 + if (File.Exists(FdConfigFilePath)) + { + string backupFile = $"{FdConfigFilePath}.bak"; + File.Copy(FdConfigFilePath, backupFile, true); + } + + // 直接保存到目标文件 + MiniExcel.SaveAs(FdConfigFilePath, fdConfigs, overwriteFile: true); + } + catch (IOException ex) + { + MessageBox.Show($"保存文件时发生IO错误:{ex.Message}\n请确保文件未被其他程序占用。", + "保存错误", MessageBoxButtons.OK, MessageBoxIcon.Error); + throw; + } + catch (UnauthorizedAccessException ex) + { + MessageBox.Show($"没有足够的权限保存文件:{ex.Message}\n请确保有写入权限。", + "权限错误", MessageBoxButtons.OK, MessageBoxIcon.Error); + throw; + } + catch (Exception ex) + { + MessageBox.Show($"保存配置时发生错误:{ex.Message}", + "保存错误", MessageBoxButtons.OK, MessageBoxIcon.Error); + throw; + } + } + private void RefreshFDDataGridView() + { + dgvFdConfigs.DataSource = null; + dgvFdConfigs.DataSource = new BindingList(fdConfigs); + } + #endregion } } diff --git a/LargeSquareOne/FrmParamSet.resx b/LargeSquareOne/FrmParamSet.resx index 0f15feb..656bea1 100644 --- a/LargeSquareOne/FrmParamSet.resx +++ b/LargeSquareOne/FrmParamSet.resx @@ -220,6 +220,32 @@ D/IFrNx4XAIJeg4uhvxzLF+6XoRizMQMyNK5LBrK/1nTIc/hTYMc0VMt+SZd7jjliSP5JkTkIGS5PkdC Wk9ezgnHkQ+8EVvwKl6CPOUjT/s8B1m0ewpPogzr8SjkMa0HsAb34V7IzcdduAO3YwVuxnLI3aAEL6FL 4FdBQpaAJVgJVQKVMCVICdEPT0LzA5OgXJ8jIVdhJget/gHCnYJyKYtzSwAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAAGgAAAAbCAYAAACQqsrOAAAABGdBTUEAALGPC/xhBQAABNpJREFUaEPt + 2ltsVEUcx/HZUktF2iKVIHjDijYooFy8khhiNMRogg+gYoxGHopKjDFqgzTGSyRpUkLRtCa2iVpFq32g + GAHvb0Uu0RSN3ShVoSFIbEJLbVpp6Z7x+5+ds55uZ3VLtpfd7MMnc2a6Zzv7//VcunOUOqNHo8AxlvaW + bTo8aTknnMB8vIcLTH9IV6ApJqKbcnuHPisK95wuPnSqZ2nFD7/zC37LOmf7UegKwuVCNOBW0x/UG9SA + 1rTatP42Qv2eLn2zXfPmWefOwyokdQTl4nU8ZPr9eqXq9wbU3wTSLzzbRuWdHHiaNy7JGrXl6IIEVImk + T3GbUIGQ6tUl6IRWf0FafzuqOrBf2vCLMYFC2AUJZx9yYX7mnHDAg6jDVNXlFahu70fVTRCiiyOnS1qr + W3+BKYF904ZfjAkkZx0JR46gK+yY4ZywJdebXZilOjl6OvUn0AkcUZ1eUWDftBIsyARYhgHIdWe1HYtx + ThhX4nNcZ/on9BZ1giPGIJBYa5xWf3jX2P3SUnxRxlEhfoUcPW/YsWFcEy5EM+4x/WN6nTrmedBGB6GY + bdMO0V9l90tbrsKMk0ZION8jz44NEz9ZuYa8hWdMv927UbXrPlodRSjSHvH7XvR1ac5VmHFQBgmnB/Pt + 2Ajxk30BtchRbd5cFfaOqzZCaSOMMKQ124yF9duB/dKaqzBjbBH6IAGts2NOwYnej08xXbXqfHXYOwBt + tAZEx/axnRfYN625CjOGpiEMCafOjiXkT/Im7Mflpn/Iex86iqPFYPugGTuOWXa/jOAqzBh6BxLOT5Cw + XK+JkQleigO4zUy4xStXLQTSQhgj9eEG87oM4irMGHkYEo6c3hbYsf8kE3wMcmqbor7xcnEUOoG9/ofK + JK7CjIFS9EICWm/H/pdMUO7cduAJM+E93gqchVZ7sScSbf+1wbwug7gKk2L5aIWEs8OOJcWf5Gx8i6Wm + 38xprpkwxE5BSKY1+pFRpzlXYVKsFhLOLyiwY0kJTnQlvkKRavRCqjGym1YbH9m2kaAM72dkzOKdqzAp + tAYSzhkssWNJi59sObaZ7QavWL0b6YA2GvyWoKLbHwb2S2uuwqTIPHRDAtpox0YlfrLnoRFrTb+e61G9 + N6jqCKSOYES9tH4/khHXI1dhUkC+ujkICWenHRs114Qvw9e42vRrIuWqlkBqCETaYbge1UbS/nrkKkwK + VEHCOYoZdmzUnBPG3fgY+Wp7JITd0Go7IUlbLdtROdVnOxZWhB/hzdZmxTwLWT4YxC1wFj8ZrnB8L2Kz + 2d4aKVZVXI+qCEVsta0187VT8peSNdLzcBY+Wa5gfOfjA9xp+pWRhSgLClUOPT77lT+/nPPyye8Wb26T + JdumrJhtkKVsZ+GT5QomSB61krWhuYGxjOMqzGThnHCc1ajBElyPxVgEWW29FgtQCllVlRsLCbUEsio7 + D/IFrNx4XAIJeg4uhvxzLF+6XoRizMQMyNK5LBrK/1nTIc/hTYMc0VMt+SZd7jjliSP5JkTkIGS5PkdC + Wk9ezgnHkQ+8EVvwKl6CPOUjT/s8B1m0ewpPogzr8SjkMa0HsAb34V7IzcdduAO3YwVuxnLI3aAEL6FL + 4FdBQpaAJVgJVQKVMCVICdEPT0LzA5OgXJ8jIVdhJget/gHCnYJyKYtzSwAAAABJRU5ErkJggg== \ No newline at end of file