using System; using System.Collections.Generic; using System.Linq; using System.Text; using QMAPP.FJC.Entity.Basic; using OPCPLC; using QMAPP.FJC.DAL.Basic; using QMAPP.FJC.Entity; using System.Configuration; using System.Threading; using OPCAutomation; using QMAPP.FJC.BLL.Process; namespace EQUIPINTERFACETEST { public class SlushTest { //用来存储生产设备信息 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; //OPC零件信息列表静态变量 public Dictionary opcplcConnectionList; public void InitParameter() { parameterValueDict = new Dictionary(); moldList = new List(); paraConfigList = new List(); machineList = new List(); //获取数据库中所有的生产设备信息 opcplcConnectionList = new Dictionary(); 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[1].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 #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) { OPCPLCAutomation 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"); 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; } } //添加PLC连接信息 opcplcConnectionList.Add(m.MACHINECODDE + ":" + m.MOLDNUMBER + ":GetData", gtxConnection); } #endregion #region 写入组 List writeList = paraConfigList .Where(o => o.MACHINECODDE == m.MACHINECODDE && o.MOLDNUMBER == m.MOLDNUMBER && o.COLUMNTYPE == "2") .ToList(); if (writeList.Count > 0) { OPCPLCAutomation 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"); 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"); } //添加PLC连接信息 opcplcConnectionList.Add(m.MACHINECODDE + ":" + m.MOLDNUMBER + ":WriteData", gtxConnection); } #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) { OPCPLCAutomation 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"); 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); //添加PLC连接信息 opcplcConnectionList.Add(m.MACHINECODDE + ":" + m.MOLDNUMBER + ":Monitor", gtxConnection); } #endregion #region 公共参数组 List commonPara = paraConfigList .Where(o => o.MACHINECODDE == m.MACHINECODDE && o.MOLDNUMBER == m.MOLDNUMBER && o.COLUMNTYPE=="5" ) .ToList(); if (commonPara.Count > 0) { OPCPLCAutomation 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"); 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; } } //添加PLC连接信息 opcplcConnectionList.Add(m.MACHINECODDE + ":" + m.MOLDNUMBER + ":CommonPara", gtxConnection); } #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(1000); //为了测试,所以加了控制台的输出,来查看事物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()) { List lastList = new List(); 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() ) ) .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]; OPCPLCAutomation con = opcplcConnectionList[conListKey]; var result = con.ReadtagValue(parameterValueDict[item]); ParameterConfig paraConfig = new ParameterConfig(); #region 属性复制 paraConfig.COLUMNCODE = parameter.COLUMNCODE; paraConfig.COLUMNTYPE = parameter.COLUMNTYPE; paraConfig.DATATYPE = parameter.DATATYPE; paraConfig.DBNUMBER = parameter.DBNUMBER; paraConfig.DEALTYPE = parameter.DEALTYPE; paraConfig.MACHINECODDE = parameter.MACHINECODDE; paraConfig.MOLDNUMBER = parameter.MOLDNUMBER; paraConfig.OPERATETYPE = parameter.OPERATETYPE; paraConfig.PROCESSTYPE = parameter.PROCESSTYPE; #endregion paraConfig.PARAVALUE = result; lastList.Add(paraConfig); 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("SLUSHCOLOR") > 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]); mouldcarrier = "2/2"; 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]; var result = con.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() + ":"); } ParameterConfig paraConfig = new ParameterConfig(); #region 属性复制 paraConfig.COLUMNCODE = parameter.COLUMNCODE; paraConfig.COLUMNTYPE = parameter.COLUMNTYPE; paraConfig.DATATYPE = parameter.DATATYPE; paraConfig.DBNUMBER = parameter.DBNUMBER; paraConfig.DEALTYPE = parameter.DEALTYPE; paraConfig.MACHINECODDE = parameter.MACHINECODDE; paraConfig.MOLDNUMBER = parameter.MOLDNUMBER; paraConfig.OPERATETYPE = parameter.OPERATETYPE; paraConfig.PROCESSTYPE = parameter.PROCESSTYPE; #endregion paraConfig.PARAVALUE = result; lastList.Add(paraConfig); } catch (Exception ex) { Console.WriteLine("获取" + parameter.COLUMNCODE + "值异常"); WriteLog.Write("获取" + parameter.COLUMNCODE + "值异常"); continue; } } } #endregion Console.WriteLine("---------读取加工参数完成---------"); WriteLog.Write("---------读取加工参数完成---------"); SlushProcess process = new SlushProcess(); List barCodeList = process.Process(machineList[0], lastList); //BarCodePrintClient client = new BarCodePrintClient(); //foreach (var barcode in barCodeList) //{ // client.Print(barcode + ",*" + barcode + "*", "TS"); //} } 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 string change(string code) { string a = ""; switch (code) { case "TS1:1:T1": a = "DB700.8.0 "; break; case "TS1:1:T2": a = "DB700.11.0 "; break; case "TS1:1:T3": a = "DB700.0.0"; break; case "TS1:1:T4": a = "DB700.12.0 "; break; case "TS1:1:T5": a = "DB700.14.0 "; break; case "TS1:1:T6": a = "DB700.18.0 "; break; } return a; } public void test2() { string item = "TS1:0:PorductOK"; string conListKey = colunmConDict[item]; OPCPLCAutomation con = opcplcConnectionList[conListKey]; var result = con.ReadtagValue(parameterValueDict[item]); if (result != null) { Console.WriteLine(item.ToString() + "值为" + result.ToString()); } else { Console.WriteLine(item.ToString() + ":"); } } public void Test() { List paraList = paraConfigList .Where(o=>o.COLUMNCODE.Contains("MOULDCARRIER")).ToList(); while (true) { Thread.Sleep(5000); Console.WriteLine(System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); foreach (var parameter in paraList) { string item = parameter.MACHINECODDE + ":" + parameter.MOLDNUMBER + ":" + parameter.COLUMNCODE; string conListKey = colunmConDict[item]; OPCPLCAutomation con = opcplcConnectionList[conListKey]; int fff = parameterValueDict[item]; var result = con.ReadtagValue(fff); if (result != null) { string a = result.ToString().Trim(); Console.WriteLine(item.ToString() + "值为" + result.ToString().Trim()); } else { Console.WriteLine(item.ToString() + ":"); } } } } } }