using BaseLibRWFile; using Sunny.UI; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace HRT_Measure { public class ClsWeightHelp { public static Ini newIni; public static List listWeight = new List(); public static ClsWeight clsWeight = new ClsWeight(); public static Thread thWeight = new Thread(new ThreadStart(ThWeight)); public static Thread thWeightStart = new Thread(new ThreadStart(ThWeightStart)); public static Thread thDetect = new Thread(new ThreadStart(ThDetect)); private static void ThDetect() { while(true) { if (!ProgramHelp.Instance.commPLC_M04M05.isPLCConnected) { Thread.Sleep(100); continue; } GetDetectionData(); Thread.Sleep(10); } } public static void LoadWeight() { thWeight.IsBackground = true; thWeight.Start(); thWeightStart.IsBackground = true; thWeightStart.Start(); thDetect.IsBackground = true; thDetect.Start(); } private static void ThWeight() { while (true) { if(!ProgramHelp.Instance.comm称重.isPLCConnected) { Thread.Sleep(100); continue; } GetWeightValue(); Thread.Sleep(1); } } private static void ThWeightStart() { while (true) { if (!ProgramHelp.Instance.comm称重.isPLCConnected) { Thread.Sleep(100); continue; } GetWeightFullTime(); Thread.Sleep(1); } } public static bool is主界面Show = false; public static bool is配方Show = false; public static bool is设备Show = false; public static bool is称重Show = false; public static void GetWeightAdd() { newIni = new Ini(Application.StartupPath + "\\Config\\PLCAddressWeight.ini"); for (int i = 0; i < 4; i++) { string str = newIni.ReadIni("主界面", (i + 1).ToString(), "20"); listWeight.Add(str); string [] arrStr = str.Split(','); for (int j = 0; j < 10; j++) { switch(arrStr[0]) { case "净重": clsWeight.Add净重[j] = arrStr[j + 1]; break; case "完成": clsWeight.Add完成[j] = arrStr[j + 1]; break; case "实时": clsWeight.Add实时[j] = arrStr[j + 1]; break; case "数量": clsWeight.Add数量[j] = arrStr[j + 1]; break; } } } for (int i = 0; i < 6; i++) { string str = newIni.ReadIni("配方", (i + 1).ToString(), "20"); listWeight.Add(str); string[] arrStr = str.Split(','); for (int j = 0; j < 10; j++) { switch (arrStr[0]) { case "目标重量": clsWeight.Add目标重量[j] = arrStr[j + 1]; break; case "正偏差": clsWeight.Add正偏差[j] = arrStr[j + 1]; break; case "负偏差": clsWeight.Add负偏差[j] = arrStr[j + 1]; break; case "快加提前量": clsWeight.Add快加提前量[j] = arrStr[j + 1]; break; case "慢加提前量": clsWeight.Add慢加提前量[j] = arrStr[j + 1]; break; case "阈值": clsWeight.Add阈值[j] = arrStr[j + 1]; break; } } } for (int i = 0; i < 8; i++) { string str = newIni.ReadIni("设备", (i + 1).ToString(), "20"); listWeight.Add(str); string[] arrStr = str.Split(','); for (int j = 0; j < 10; j++) { switch (arrStr[0]) { case "快加速度": clsWeight.Add快加速度[j] = arrStr[j + 1]; break; case "慢加速度": clsWeight.Add慢加速度[j] = arrStr[j + 1]; break; case "补料速度": clsWeight.Add补料速度[j] = arrStr[j + 1]; break; case "稳定检测时间": clsWeight.Add稳定检测时间[j] = arrStr[j + 1]; break; case "快加禁止比较时间": clsWeight.Add快加禁止比较时间[j] = arrStr[j + 1]; break; case "慢加禁止比较时间": clsWeight.Add慢加禁止比较时间[j] = arrStr[j + 1]; break; case "补加禁止比较时间": clsWeight.Add补加禁止比较时间[j] = arrStr[j + 1]; break; case "完成动作执行时间": clsWeight.Add完成动作执行时间[j] = arrStr[j + 1]; break; } } } for (int i = 0; i < 10; i++) { string str = newIni.ReadIni("称重", (i + 1).ToString(), "20"); listWeight.Add(str); string[] arrStr = str.Split(','); switch (arrStr[0]) { case "零点跟踪范围": clsWeight.Add零点跟踪范围 = arrStr[1]; break; case "零点跟踪速率": clsWeight.Add零点跟踪速率 = arrStr[1]; break; case "稳定检测范围": clsWeight.Add稳定检测范围 = arrStr[1]; break; case "稳定检测时间": clsWeight.Add稳定检测时间总 = arrStr[1]; break; case "预处理滤波强度": clsWeight.Add预处理滤波强度 = arrStr[1]; break; case "预处理滤波系数": clsWeight.Add预处理滤波系数 = arrStr[1]; break; case "静态滤波防抖动": clsWeight.Add静态滤波防抖动 = arrStr[1]; break; case "静态采样频率": clsWeight.Add静态采样频率 = arrStr[1]; break; case "静态滤波强度": clsWeight.Add静态滤波强度 = arrStr[1]; break; case "静态滤波收敛": clsWeight.Add静态滤波收敛 = arrStr[1]; break; } } LoadWeight(); } public static void Judge称重状态(short s加料, short s卸料) { if (s加料 != 0) { UIMessageBox.ShowError($"通道{s加料}加料超时!"); } if (s卸料 != 0) { UIMessageBox.ShowError($"通道{s卸料}卸料异常!"); } } public static short s当前配方号 = 0; public static void GetWeightValue() { ProgramHelp.Instance.comm称重.ReadShort("6023", out s当前配方号, out string strr); ProgramHelp.Instance.comm称重.ReadShort("6021", out short s加料超时, out strr); ProgramHelp.Instance.comm称重.ReadShort("6022", out short s卸料异常, out strr); Judge称重状态(s加料超时, s卸料异常); for (int i = 0; i < 10; i++) { ProgramHelp.Instance.comm称重.ReadInt(clsWeight.Add净重[i], out int ivalue, out string str1); clsWeight.f净重[i] = Convert.ToSingle(ivalue) / 100; clsWeight.f实时[i] = clsWeight.f净重[i]; ProgramHelp.Instance.comm称重.ReadShort(arrWeightStartAdd[i], out short svalue, out str1); arr称重启动信号[i] = svalue; } if (ReadPLCHelp.EnumWindowDisplay != WindowDisplay.称重) { return; } try { for (int i = 0; i < 10; i++) { if(is主界面Show) { //ProgramHelp.Instance.comm称重.ReadFloat(clsWeight.Add净重[i], out clsWeight.f净重[i], out string str);// clsWeight.f净重[i] = ProgramHelp.Instance.comm称重.ReadInt(clsWeight.Add完成[i], out int ivalue1 , out string str); clsWeight.f完成[i] = Convert.ToSingle(ivalue1) / 100; //ProgramHelp.Instance.comm称重.ReadFloat(clsWeight.Add实时[i], out clsWeight.f实时[i] , out str); ProgramHelp.Instance.comm称重.ReadInt(clsWeight.Add数量[i], out clsWeight.i数量[i] , out str); } if(is配方Show) { ProgramHelp.Instance.comm称重.ReadInt(clsWeight.Add目标重量[i], out int ivalue , out string str配方); clsWeight.f目标重量[i] = Convert.ToSingle(ivalue) / 100; ProgramHelp.Instance.comm称重.ReadInt(clsWeight.Add正偏差[i], out ivalue, out str配方); clsWeight.f正偏差[i] = Convert.ToSingle(ivalue) / 100; ProgramHelp.Instance.comm称重.ReadInt(clsWeight.Add负偏差[i], out ivalue, out str配方); clsWeight.f负偏差[i] = Convert.ToSingle(ivalue) / 100; ProgramHelp.Instance.comm称重.ReadInt(clsWeight.Add快加提前量[i], out ivalue, out str配方); clsWeight.f快加提前量[i] = Convert.ToSingle(ivalue) / 100; ProgramHelp.Instance.comm称重.ReadInt(clsWeight.Add慢加提前量[i], out ivalue, out str配方); clsWeight.f慢加提前量[i] = Convert.ToSingle(ivalue) / 100; ProgramHelp.Instance.comm称重.ReadInt(clsWeight.Add阈值[i], out ivalue, out str配方); clsWeight.f阈值[i] = Convert.ToSingle(ivalue) / 100; } if(is设备Show) { ProgramHelp.Instance.comm称重.ReadShort(clsWeight.Add快加速度[i], out clsWeight.i快加速度[i],out string str设备); ProgramHelp.Instance.comm称重.ReadShort(clsWeight.Add慢加速度[i], out clsWeight.i慢加速度[i] ,out str设备); ProgramHelp.Instance.comm称重.ReadShort(clsWeight.Add补料速度[i], out clsWeight.i补料速度[i], out str设备); ProgramHelp.Instance.comm称重.ReadShort(clsWeight.Add稳定检测时间[i], out clsWeight.i稳定检测时间[i], out str设备); ProgramHelp.Instance.comm称重.ReadShort(clsWeight.Add快加禁止比较时间[i],out clsWeight.i快加禁止比较时间[i], out str设备); ProgramHelp.Instance.comm称重.ReadShort(clsWeight.Add慢加禁止比较时间[i], out clsWeight.i慢加禁止比较时间[i], out str设备); ProgramHelp.Instance.comm称重.ReadShort(clsWeight.Add补加禁止比较时间[i], out clsWeight.i补加禁止比较时间[i], out str设备); ProgramHelp.Instance.comm称重.ReadShort(clsWeight.Add完成动作执行时间[i], out clsWeight.i完成动作执行时间[i], out str设备); } } if(is称重Show) { ProgramHelp.Instance.comm称重1.ReadInt(clsWeight.Add静态采样频率, out clsWeight.i静态采样频率, out string str3); ProgramHelp.Instance.comm称重1.ReadShort(clsWeight.Add预处理滤波强度, out clsWeight.i预处理滤波强度, out str3); ProgramHelp.Instance.comm称重1.ReadShort(clsWeight.Add预处理滤波系数, out clsWeight.i预处理滤波系数, out str3); ProgramHelp.Instance.comm称重1.ReadShort(clsWeight.Add静态滤波防抖动, out clsWeight.i静态滤波防抖动, out str3); ProgramHelp.Instance.comm称重1.ReadShort(clsWeight.Add静态滤波强度, out clsWeight.i静态滤波强度, out str3); ProgramHelp.Instance.comm称重1.ReadShort(clsWeight.Add静态滤波收敛, out clsWeight.i静态滤波收敛, out str3); ProgramHelp.Instance.comm称重1.ReadShort(clsWeight.Add稳定检测范围, out clsWeight.i稳定检测范围, out str3); ProgramHelp.Instance.comm称重1.ReadShort(clsWeight.Add零点跟踪速率, out clsWeight.i零点跟踪速率, out str3); ProgramHelp.Instance.comm称重1.ReadShort(clsWeight.Add零点跟踪范围, out short s零点跟踪范围, out str3); clsWeight.f零点跟踪范围 = s零点跟踪范围 / 10; ProgramHelp.Instance.comm称重1.ReadShort(clsWeight.Add稳定检测时间总,out short s稳定检测时间总, out str3); clsWeight.f稳定检测时间总 = Convert.ToSingle(s稳定检测时间总) / 10; } } catch (Exception) { } } public static string[] arrWeightStartAdd = new string[10] { "6030", "6031", "6032", "6033", "6034", "6035", "6036", "6037", "6038", "6039" }; public static short[] arr称重启动信号 = new short[10] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; public static bool[] arrIsWeightStart = new bool[10] { false, false, false, false, false, false, false, false, false, false }; public static string[] arr称重结果状态地址 = new string[10] { "6060", "6061", "6062", "6063", "6064", "6065", "6066", "6067", "6068", "6069" }; public static short[] arr称重结果状态 = new short[10] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; public static int i称重Count = 0; public static void GetWeightFullTime() { //GetDetectionData(); for (int i = 0; i < 10; i++) { arrIsWeightStart[i] = false; ProgramHelp.Instance.comm称重.WriteShort(arrWeightStartAdd[i], 0, out string str); //arr称重启动信号[i] = 0; } if (!PLCResultHelp.isM01_称重开始) return; for (int i = 0; i < 10; i++) { ReadPLCHelp.arrShortWeightStart[i] = ReadPLCHelp.GetM01M02Int16Value(ReadPLCHelp.arrWeightStartSignalsAdd[i], ProgramHelp.Instance.commPLC_M01M02); } Thread.Sleep(200); ProgramHelp.Instance.SaveMsg("称重", $"------------------称重开始------------------------", true); for (int i = 0; i < 10; i++) { if (ReadPLCHelp.arrShortWeightStart[i] == 1) { arrIsWeightStart[i] = true; ProgramHelp.Instance.comm称重.WriteShort(arrWeightStartAdd[i], 1, out string str); ProgramHelp.Instance.SaveMsg("称重", $"开启第{i}个穴称重", true); } } i称重Count = 0; while (true) { bool isDone = false; for (int i = 0; i < 10; i++) { if (arrIsWeightStart[i]) { ProgramHelp.Instance.SaveMsg("称重", $"第{i}个穴结果{arr称重启动信号[i]}", true); if (arr称重启动信号[i] == 2) { arrIsWeightStart[i] = false; } } isDone = isDone || arrIsWeightStart[i]; } if (!isDone) { break; } Thread.Sleep(500); //i称重Count++; //if (i称重Count > 500) //{ // i称重Count = 0; // break; //} } ProgramHelp.Instance.SaveMsg("称重", $"------------------称重结束------------------------", true); for (int i = 0; i < 10; i++) { ProgramHelp.Instance.comm称重.ReadShort(arr称重结果状态地址[i], out arr称重结果状态[i], out string str);// 0-无 1-OK, 2-NG ProgramHelp.Instance.SaveMsg("称重", $"第{i}个穴称重结果状态{arr称重结果状态[i]}", true); ProgramHelp.Instance.commPLC_M01M02.WriteInt(ReadPLCHelp.arrWeightDoneStatus[i], (int)arr称重结果状态[i], out str); ProgramHelp.Instance.SaveMsg("称重", $"第{i}个穴称重结果状态写入地址{ReadPLCHelp.arrWeightDoneStatus[i]},数据{arr称重结果状态[i]}", true); ProgramHelp.Instance.comm称重.ReadInt(clsWeight.Add净重[i], out int ivalue, out string str4); clsWeight.f净重[i] = Convert.ToSingle(ivalue) / 100; clsWeight.f实时[i] = clsWeight.f净重[i]; ProgramHelp.Instance.SaveMsg("称重", $"第{i}个穴称重重量{clsWeight.f净重[i]}", true); ProgramHelp.Instance.commPLC_M01M02.WriteInt(ReadPLCHelp.arrWeightDoneAdd[i], Convert.ToInt32(clsWeight.f净重[i] * 100), out str); if (ReadPLCHelp.arrShortWeightStart[i] == 1) { ProgramHelp.Instance.SaveMsg("称重", $"第{i}穴,向称重启动信号{ReadPLCHelp.arrWeightStartSignalsAdd[i]}写2", true); ProgramHelp.Instance.commPLC_M01M02.WriteShort(ReadPLCHelp.arrWeightStartSignalsAdd[i], 2, out str); } } ClsResultData.GetWeightData(); ProgramHelp.Instance.SaveMsg("称重", $"向称重开始信号{ReadPLCHelp.strWeightStartAdd}写off", true); ProgramHelp.Instance.commPLC_M01M02.WriteCoin(ReadPLCHelp.strWeightStartAdd, false, out string str1); i称重Count = 0; ProgramHelp.Instance.SaveMsg("称重", $"等待称重开始信号为off", true); while (PLCResultHelp.isM01_称重开始) { Thread.Sleep(10); i称重Count++; if (i称重Count > 600) { ProgramHelp.Instance.SaveMsg("称重", $"等待称重开始信号为off超时", true); i称重Count = 0; break; } } //Thread.Sleep(2000); } public static int i检测Count = 0; public static void GetDetectionData() { if(PLCResultHelp.isM04_产品信息打包上传) { Thread.Sleep(500); foreach (var itemM04 in ReadPLCHelp.dictM04) { switch (itemM04.Key) { //case "允许下料": // PLCResultHelp.isM04_允许下料 = ReadPLCHelp.GetM04M05BoolValue(itemM04.Value, ProgramHelp.Instance.commPLC_M04M05); // break; //case "当前检测高度": // PLCResultHelp.fM04_当前检测高度 = ReadPLCHelp.GetM04M05RealValue(itemM04.Value, ProgramHelp.Instance.commPLC_M04M05); // break; //case "当前重量": // PLCResultHelp.fM04_当前重量 = Convert.ToSingle(ReadPLCHelp.GetM04M05IntValue(itemM04.Value, ProgramHelp.Instance.commPLC_M04M05)) / 100; // break; case "产品高度": PLCResultHelp.fM04_产品高度 = ReadPLCHelp.GetM04M05RealValue(itemM04.Value, ProgramHelp.Instance.commPLC_M04M05); break; case "产品重量": PLCResultHelp.fM04_产品重量 = ReadPLCHelp.GetM04M05IntValue(itemM04.Value, ProgramHelp.Instance.commPLC_M04M05); break; case "废料数量": PLCResultHelp.fM04_废料数量 = ReadPLCHelp.GetM04M05IntValue(itemM04.Value, ProgramHelp.Instance.commPLC_M04M05); break; case "合格数量": PLCResultHelp.fM04_合格数量 = ReadPLCHelp.GetM04M05IntValue(itemM04.Value, ProgramHelp.Instance.commPLC_M04M05); break; case "相机结果": ProgramHelp.Instance.commPLC_M04M05.ReadString(itemM04.Value, out PLCResultHelp.fM04_相机结果, out string str); break; case "盘数": PLCResultHelp.fM04_盘数 = ReadPLCHelp.GetM04M05Int16Value(itemM04.Value, ProgramHelp.Instance.commPLC_M04M05); break; case "NG数量": PLCResultHelp.fM04_NG数量 = ReadPLCHelp.GetM04M05IntValue(itemM04.Value, ProgramHelp.Instance.commPLC_M04M05); break; case "本次完成箱子数量": PLCResultHelp.fM04_本次完成箱子数量 = ReadPLCHelp.GetM04M05IntValue(itemM04.Value, ProgramHelp.Instance.commPLC_M04M05); break; //case "产品信息打包上传": // PLCResultHelp.isM04_产品信息打包上传 = ReadPLCHelp.GetM04M05BoolValue(itemM04.Value, ProgramHelp.Instance.commPLC_M04M05); // break; } } Thread.Sleep(100); ClsResultData.GetDetectionData(); ProgramHelp.Instance.commPLC_M04M05.WriteCoin("DB80.40.0", false, out string str1);//ReadPLCHelp.dictM04["产品信息打包上传"] i检测Count = 0; while (PLCResultHelp.isM04_产品信息打包上传) { Thread.Sleep(10); i检测Count++; if(i检测Count > 600) { i检测Count = 0; break; } } } if(ReadPLCHelp.queuePressureSignals.Count > 0) { ReadPLCHelp.queuePressureSignals.TryDequeue(out short sresult); ClsResultData.GetPressureData(); } } } }