using System; using System.Collections.Generic; using System.Linq; using System.Text; using QMAPP.FJC.Entity.Basic; using QMAPP.FJC.DAL.Basic; using QMAPP.FJC.Entity; using OPCPLC; using System.Configuration; using OPCAutomation; using System.Threading; namespace EQUIPINTERFACETEST { public class GetGroupTest { //用来存储生产设备信息 public List machineList; //用来存储设备加工参数信息 //key值样式为:设备号+模具号+读写状态+操作类别+数据库字段 public Dictionary parameterValueDict; private Dictionary clientHandleDict = new Dictionary(); private Dictionary colunmConDict = new Dictionary(); private int clientHandleValue = 0; //加工参数列表静态变量 public List paraConfigList; //设备参数信息 public List moldList; OPCPLCAutomation gtxConnection; public void InitParameter() { parameterValueDict = new Dictionary(); moldList = new List(); paraConfigList = new List(); machineList = new List(); //获取数据库中所有的生产设备信息 try { #region 获取数据库中所有的生产设备信息 MachineInfoDAL machineDal = new MachineInfoDAL(); machineList = machineDal.GetList(new MachineInfo() { PROCESSTYPE = EnumGeter.ProcessType.tangsu.GetHashCode().ToString() }); #endregion #region 获取所有的配置信息 ParameterConfigDAL paraConDal = new QMAPP.FJC.DAL.Basic.ParameterConfigDAL(); paraConfigList = paraConDal.GetList(new ParameterConfig() { MACHINECODDE = machineList[0].MACHINECODDE }); #endregion #region 获取设备模块信息 //对加工参数配置信息按照设备及模具信息进行分组 var objlist = from pc in paraConfigList group pc by new { pc.MACHINECODDE, pc.MOLDNUMBER } into g select new ParameterConfig { MACHINECODDE = g.Key.MACHINECODDE, MOLDNUMBER = g.Key.MOLDNUMBER }; //添加到静态变量中 foreach (var ob in objlist) { moldList.Add(new ParameterConfig() { MACHINECODDE = ob.MACHINECODDE, MOLDNUMBER = ob.MOLDNUMBER }); } //按照设备进行排序 moldList = moldList.OrderBy(o => o.MACHINECODDE).OrderBy(o => o.MOLDNUMBER).ToList(); #endregion gtxConnection = new OPCPLC.OPCPLCAutomation(); //opcServer服务器IP string opcServerIP = ConfigurationManager.AppSettings.Get("OPCServerIP"); //opcServer服务名称 string opcServerName = ConfigurationManager.AppSettings.Get("OPCServerName"); gtxConnection.GetListOPCServers("127.0.0.1"); //连接Opc服务 gtxConnection.ConnectRemoteServer(opcServerName, "127.0.0.1"); #region 加载模块下的加工参数配置信息 //变量所有的模具信息 foreach (var m in moldList) { MachineInfo machineEntity = machineList.First(o => o.MACHINECODDE == m.MACHINECODDE); #region 获取加工参数组 List paraList = paraConfigList .Where(o => o.MACHINECODDE == m.MACHINECODDE && o.MOLDNUMBER == m.MOLDNUMBER && o.COLUMNTYPE == "0") .ToList(); if (paraList.Count > 0) { gtxConnection.CreateGroup(m.MACHINECODDE + "-" + m.MOLDNUMBER + "-GetData"); //变该模块下的所有参数信息 foreach (var pc in paraList) { try { //初始化字典名称: 设备名称+模块编号+字段名称 string dicKeyStr = machineEntity.MACHINECODDE + "-" + m.MOLDNUMBER + "-" + pc.COLUMNCODE; //初始化字段信息值为0 parameterValueDict.Add(dicKeyStr, 0); //获取opc中tagName string itemName = pc.CONNECTIONSTRING; clientHandleValue++; clientHandleDict.Add(clientHandleValue, dicKeyStr); //将字典中的与PLC内存地址向绑定 parameterValueDict[dicKeyStr] = gtxConnection.AddKepItem(itemName, clientHandleValue); colunmConDict.Add(dicKeyStr, m.MACHINECODDE + "-" + m.MOLDNUMBER + "-GetData"); } catch (Exception ex) { throw; } } } #endregion #region 写入组 List writeList = paraConfigList .Where(o => o.MACHINECODDE == m.MACHINECODDE && o.MOLDNUMBER == m.MOLDNUMBER && o.COLUMNTYPE == "2") .ToList(); if (writeList.Count > 0) { gtxConnection.CreateGroup(m.MACHINECODDE + "-" + m.MOLDNUMBER + "-WriteData"); //变该模块下的所有参数信息 foreach (var pc in writeList) { //初始化字典名称: 设备名称+模块编号+字段名称 string dicKeyStr = machineEntity.MACHINECODDE + "-" + m.MOLDNUMBER + "-" + pc.COLUMNCODE; //初始化字段信息值为0 parameterValueDict.Add(dicKeyStr, 0); //获取opc中tagName string itemName = pc.CONNECTIONSTRING; clientHandleValue++; clientHandleDict.Add(clientHandleValue, dicKeyStr); //将字典中的与PLC内存地址向绑定 parameterValueDict[dicKeyStr] = gtxConnection.AddKepItem(itemName, clientHandleValue); colunmConDict.Add(dicKeyStr, m.MACHINECODDE + "-" + m.MOLDNUMBER + "-WriteData"); } } #endregion #region 监控组 //获取设备扫描条码完成标记和设备加工完成标记 List monitorList = paraConfigList .Where(o => o.MACHINECODDE == m.MACHINECODDE && o.MOLDNUMBER == m.MOLDNUMBER && (o.COLUMNTYPE == EQUIPINTERFACETESTCommon.COLUMNTYPE.EQUIPSCANFLAG.GetHashCode().ToString() || o.COLUMNTYPE == EQUIPINTERFACETESTCommon.COLUMNTYPE.COMPLETEFLAG.GetHashCode().ToString())) .ToList(); if (monitorList.Count > 0) { gtxConnection.CreateGroup(m.MACHINECODDE + "-" + m.MOLDNUMBER + "-Monitor"); //变该模块下的所有参数信息 foreach (var pc in monitorList) { //初始化字典名称: 设备名称+模块编号+字段名称 string dicKeyStr = machineEntity.MACHINECODDE + "-" + m.MOLDNUMBER + "-" + pc.COLUMNCODE; //初始化字段信息值为0 parameterValueDict.Add(dicKeyStr, 0); //获取opc中tagName string itemName = pc.CONNECTIONSTRING; clientHandleValue++; clientHandleDict.Add(clientHandleValue, dicKeyStr); //将字典中的与PLC内存地址向绑定 parameterValueDict[dicKeyStr] = gtxConnection.AddKepItem(itemName, clientHandleValue); colunmConDict.Add(dicKeyStr, m.MACHINECODDE + "-" + m.MOLDNUMBER + "-Monitor"); } gtxConnection.KepGroups.DefaultGroupIsActive = true;//激活组。 gtxConnection.KepGroups.DefaultGroupDeadband = 0;// 死区值,设为0时,服务器端该组内任何数据变化都通知组。 gtxConnection.KepGroups.DefaultGroupUpdateRate = 200;//默认组群的刷新频率为200ms gtxConnection.KepGroup.UpdateRate = 200;//刷新频率为1秒。 gtxConnection.KepGroup.IsSubscribed = true;//使用订阅功能,即可以异步,默认false gtxConnection.KepGroup.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(KepGroup_DataChange); } #endregion #region 公共参数组 List commonPara = paraConfigList .Where(o => o.MACHINECODDE == m.MACHINECODDE && o.MOLDNUMBER == m.MOLDNUMBER && o.COLUMNTYPE == "5") .ToList(); if (commonPara.Count > 0) { gtxConnection.CreateGroup(m.MACHINECODDE + "-" + m.MOLDNUMBER + "-CommonPara"); //变该模块下的所有参数信息 foreach (var pc in commonPara) { try { //初始化字典名称: 设备名称+模块编号+字段名称 string dicKeyStr = machineEntity.MACHINECODDE + "-" + m.MOLDNUMBER + "-" + pc.COLUMNCODE; //初始化字段信息值为0 parameterValueDict.Add(dicKeyStr, 0); //获取opc中tagName string itemName = pc.CONNECTIONSTRING; clientHandleValue++; clientHandleDict.Add(clientHandleValue, dicKeyStr); //将字典中的与PLC内存地址向绑定 parameterValueDict[dicKeyStr] = gtxConnection.AddKepItem(itemName, clientHandleValue); colunmConDict.Add(dicKeyStr, m.MACHINECODDE + "-" + m.MOLDNUMBER + "-CommonPara"); } catch (Exception ex) { Console.WriteLine(ex.Message); throw; } } } #endregion } #endregion } catch (Exception ex) { } } private void KepGroup_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps) { try { //延迟一秒 Thread.Sleep(500); //为了测试,所以加了控制台的输出,来查看事物ID号 //Console.WriteLine("********"+TransactionID.ToString()+"*********"); for (int i = 1; i <= NumItems; i++) { //获取写入的值 var itemValue = ItemValues.GetValue(i); //获取客户端句柄 int chvalue = Convert.ToInt32(ClientHandles.GetValue(i)); //获取服务端字典key值 string dicKeyStr = clientHandleDict[chvalue]; //获取设备信息 string machCode = dicKeyStr.Substring(0, dicKeyStr.IndexOf('-')); string moldAndColumn = dicKeyStr.Substring(dicKeyStr.IndexOf('-') + 1); //获取模块信息 string moldNumber = moldAndColumn.Substring(0, moldAndColumn.IndexOf('-')); //获取字段名称 string columnCode = dicKeyStr.Substring(dicKeyStr.LastIndexOf('-') + 1); ParameterConfig currentPC = paraConfigList.First(o => o.MACHINECODDE == machCode && o.MOLDNUMBER == moldNumber && o.COLUMNCODE == columnCode); //完成标记 if (currentPC.COLUMNTYPE == OpcHostEnumGeter.COLUMNTYPE.COMPLETEFLAG.GetHashCode().ToString()) { if (itemValue == null) { Console.WriteLine(currentPC.COLUMNCODE.ToString() + "值为null"); WriteLog.Write(currentPC.COLUMNCODE.ToString() + "值为null"); continue; } //如果完成标记表示更新了加工参数 //获取所有的加工参数 if ((Boolean)itemValue == true) { string year = ""; string month = ""; string day = ""; string hour = ""; string minute = ""; string second = ""; string machineno = ""; string producttype = ""; string hudorbasic = ""; string color = ""; string cavitytype = ""; string mouldcarrier = ""; Console.WriteLine(System.DateTime.Now.ToLongTimeString() + " " + dicKeyStr + "完成标记修改为true"); List paraList = paraConfigList .Where(o => o.MACHINECODDE == machCode && o.MOLDNUMBER == moldNumber && ( o.COLUMNTYPE == OpcHostEnumGeter.COLUMNTYPE.PARAMETER.GetHashCode().ToString() || o.COLUMNTYPE == "5" ) ) .ToList(); Console.WriteLine(System.DateTime.Now.ToLongTimeString() + " " + "开始读取加工参数"); WriteLog.Write(System.DateTime.Now.ToLongTimeString() + " " + "开始读取加工参数"); foreach (var parameter in paraList) { try { string item = parameter.MACHINECODDE + "-" + parameter.MOLDNUMBER + "-" + parameter.COLUMNCODE; string conListKey = colunmConDict[item]; gtxConnection.KepGroup = gtxConnection.KepGroups.GetOPCGroup(parameter.MACHINECODDE + "-" + parameter.MOLDNUMBER + "-Monitor"); var result = gtxConnection.ReadtagValue(parameterValueDict[item]); if (result != null) { if (item.IndexOf("YEAR") > 0 || item.IndexOf("MONTH") > 0 || item.IndexOf("DAY") > 0 || item.IndexOf("HOUR") > 0 || item.IndexOf("MINUTE") > 0 || item.IndexOf("SECOND") > 0 || item.IndexOf("SECOND") > 0) { Console.WriteLine(item.ToString() + "值为" + ConvertClass.DecToHex(result.ToString())); WriteLog.Write(item.ToString() + "值为" + ConvertClass.DecToHex(result.ToString())); #region 拼接表皮号 if (item.IndexOf("YEAR") > 0) { year = ConvertClass.DecToHex(result.ToString()); } if (item.IndexOf("MONTH") > 0) { month = ConvertClass.DecToHex(result.ToString()); } if (item.IndexOf("DAY") > 0) { day = ConvertClass.DecToHex(result.ToString()); } if (item.IndexOf("HOUR") > 0) { hour = ConvertClass.DecToHex(result.ToString()); } if (item.IndexOf("MINUTE") > 0) { minute = ConvertClass.DecToHex(result.ToString()); } if (item.IndexOf("SECOND") > 0 && item.IndexOf("MILLISECOND") == 0) { second = ConvertClass.DecToHex(result.ToString()); } #endregion } else { Console.WriteLine(item.ToString() + "值为" + result.ToString()); WriteLog.Write(item.ToString() + "值为" + result.ToString()); #region 拼接表皮号 if (item.IndexOf("MACHINENO") > 0) { machineno = result.ToString(); } if (item.IndexOf("PRODUCT") > 0) { producttype = result.ToString(); } if (item.IndexOf("HUDORBASIC") > 0) { hudorbasic = result.ToString(); } if (item.IndexOf("COLOR") > 0) { color = result.ToString(); } if (item.IndexOf("CAVITYTYPE") > 0) { cavitytype = result.ToString(); } if (item.IndexOf("MOULDCARRIER") > 0) { mouldcarrier = result.ToString(); } #endregion } } else { Console.WriteLine(parameter.COLUMNCODE + ":"); WriteLog.Write(item.ToString() + ":"); } } catch (Exception) { Console.WriteLine("获取" + parameter.COLUMNCODE + "值异常"); WriteLog.Write("获取" + parameter.COLUMNCODE + "值异常"); continue; } } StringBuilder slushCode1 = new StringBuilder(); StringBuilder slushCode2 = new StringBuilder(); slushCode1.Append(year.PadLeft(2, '0')); slushCode2.Append(year.PadLeft(2, '0')); slushCode1.Append(month.PadLeft(2, '0')); slushCode2.Append(month.PadLeft(2, '0')); slushCode1.Append(day.PadLeft(2, '0')); slushCode2.Append(day.PadLeft(2, '0')); slushCode1.Append(hour.PadLeft(2, '0')); slushCode2.Append(hour.PadLeft(2, '0')); slushCode1.Append(minute.PadLeft(2, '0')); slushCode2.Append(minute.PadLeft(2, '0')); slushCode1.Append(machineno); slushCode2.Append(machineno); slushCode1.Append(producttype); slushCode2.Append(producttype); List hbList = hudorbasic.Split('/').ToList(); slushCode1.Append(hbList[0]); slushCode2.Append(hbList[1]); slushCode1.Append(color); slushCode2.Append(color); List ctList = cavitytype.Split('/').ToList(); slushCode1.Append(ctList[0]); slushCode2.Append(ctList[1]); List mcList = mouldcarrier.Split('/').ToList(); slushCode1.Append(mcList[0].PadLeft(2, '0')); slushCode2.Append(mcList[1].PadLeft(2, '0')); Console.WriteLine("表皮条码1:" + slushCode1.ToString()); Console.WriteLine("表皮条码2:" + slushCode2.ToString()); WriteLog.Write("表皮条码1:" + slushCode1.ToString()); WriteLog.Write("表皮条码2:" + slushCode2.ToString()); #region slushparameter List commonParaList = paraConfigList .Where(o => o.MACHINECODDE == machCode && o.COLUMNTYPE == "5") .OrderBy(o => o.COLUMNCODE) .ToList(); if (commonParaList.Count > 0) { foreach (var parameter in commonParaList) { try { string item = parameter.MACHINECODDE + "-" + "0" + "-" + parameter.COLUMNCODE; string conListKey = colunmConDict[item]; ///OPCPLCAutomation con = opcplcConnectionList[conListKey]; gtxConnection.KepGroup = gtxConnection.KepGroups.GetOPCGroup(parameter.MACHINECODDE + "-" + parameter.MOLDNUMBER + "-CommonPara"); var result = gtxConnection.ReadtagValue(parameterValueDict[item]); if (result != null) { Console.WriteLine(item.ToString() + "值为" + result.ToString()); WriteLog.Write(item.ToString() + "值为" + result.ToString()); } else { Console.WriteLine(parameter.COLUMNCODE + ":"); WriteLog.Write(item.ToString() + ":"); } } catch (Exception ex) { Console.WriteLine("获取" + parameter.COLUMNCODE + "值异常"); WriteLog.Write("获取" + parameter.COLUMNCODE + "值异常"); continue; } } } #endregion Console.WriteLine("-------读取加工参数完成-------"); WriteLog.Write("-------读取加工参数完成-------"); Print.CreateBarCodeFile(slushCode1.ToString()); Print.CreateBarCodeFile(slushCode2.ToString()); } else { Console.WriteLine(System.DateTime.Now.ToLongTimeString() + " " + dicKeyStr + "完成标记修改为false"); WriteLog.Write(System.DateTime.Now.ToLongTimeString() + " " + dicKeyStr + "完成标记修改为false"); } } } } catch (Exception ex) { Console.WriteLine("系统出现异常:" + ex.Message); } } public void GetGroupData() { Console.WriteLine("获取组1加工参数"); gtxConnection.KepGroup = gtxConnection.KepGroups.GetOPCGroup(machineList[0].MACHINECODDE + "-" + "1" + "-GetData"); List paraList = paraConfigList .Where(o => o.MACHINECODDE == machineList[0].MACHINECODDE && o.MOLDNUMBER == "1" && o.COLUMNTYPE == "0") .ToList(); foreach (var parameter in paraList) { string item = parameter.MACHINECODDE + "-" + parameter.MOLDNUMBER + "-" + parameter.COLUMNCODE; string conListKey = colunmConDict[item]; var result = gtxConnection.ReadtagValue(parameterValueDict[item]); if (result == null) { Console.WriteLine(item + "值为null"); } else { Console.WriteLine(item + "值为" + result.ToString()); } } Console.WriteLine("获取组2加工参数"); gtxConnection.KepGroup = gtxConnection.KepGroups.GetOPCGroup(machineList[0].MACHINECODDE + "-" + "2" + "-GetData"); List paraList2 = paraConfigList .Where(o => o.MACHINECODDE == machineList[0].MACHINECODDE && o.MOLDNUMBER == "2" && o.COLUMNTYPE == "0") .ToList(); foreach (var parameter in paraList2) { string item = parameter.MACHINECODDE + "-" + parameter.MOLDNUMBER + "-" + parameter.COLUMNCODE; string conListKey = colunmConDict[item]; var result = gtxConnection.ReadtagValue(parameterValueDict[item]); if (result == null) { Console.WriteLine(item + "值为null"); } else { Console.WriteLine(item + "值为" + result.ToString()); } } } } }