using System; using System.Collections.Generic; using System.Linq; using System.Text; using QMAPP.FJC.Entity.Basic; using System.Configuration; using OpcSlushWinService.WebServiceForOpc; using OPCPLC; using OPCAutomation; using System.Threading; using QMFrameWork.Common.Serialization; using QMAPP.FJC.DAL.Basic; namespace OpcSlushWinService { public static class ParaInit { //暂时使用,因为新搪塑机的时间错误问题 public static int loadValue = 0; //用来存储生产设备信息 public static List slushMachineList; //用来存储OPC配置参数与服务端句柄的对应关系 //key:OPC配置参数,样式为 设备号+":"+模具号+":"+数据库字段 //value:服务端句柄 public static Dictionary parameterSlushValueDict = new Dictionary(); /// /// 用来存储客户端句柄与设备参数对应关系 /// key:客户端句柄值 /// value:OPC配置参数,样式为设备号+":"+模具号+":"+数据库字段 /// public static Dictionary clientSlushHandleDict = new Dictionary(); //OPC配置参数列表静态变量 public static List paraSlushConfigList; //设备模具参数信息静态变量 public static List moldSlushList; private static OpcServiceClient client; private static int clientSlushHandleValue = 0; //OPC连接字典静态变量 public static OPCPLCAutomation opcplcSlushConnection; public static OPCPLCAutomation MonitorSlushConnection; public static void InitParameter() { moldSlushList = new List(); slushMachineList = new List(); //opcServer服务器IP string opcServerIP = ConfigurationManager.AppSettings.Get("OPCServerIP"); //opcServer服务名称 string opcServerName = ConfigurationManager.AppSettings.Get("OPCServerName"); try { client = new OpcServiceClient(); #region 获取搪塑设备 string maincheStr = client.GetMachineList(); //获取所有的设备信息 slushMachineList = JsonConvertHelper.GetDeserialize>(maincheStr); slushMachineList = slushMachineList .Where(o => o.PROCESSTYPE == EnumGeter.ProcessType.tangsu.GetHashCode().ToString()) .ToList(); #endregion #region 获取plc配置项 string paraConfigStr = client.GetParaConfigList(); paraSlushConfigList = JsonConvertHelper.GetDeserialize>(paraConfigStr); paraSlushConfigList = paraSlushConfigList .Where(o => o.PROCESSTYPE == EnumGeter.ProcessType.tangsu.GetHashCode().ToString()) .ToList(); #endregion #region 获取设备模块信息 //对加工参数配置信息按照设备及模具信息进行分组 var objlist = from pc in paraSlushConfigList 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) { moldSlushList.Add(new ParameterConfig() { MACHINECODDE = ob.MACHINECODDE, MOLDNUMBER = ob.MOLDNUMBER }); } //按照设备进行排序 moldSlushList = moldSlushList.OrderBy(o => o.MACHINECODDE).ToList(); #endregion #region 建立获取数量连接 opcplcSlushConnection = new OPCPLC.OPCPLCAutomation(); opcplcSlushConnection.GetListOPCServers(opcServerIP); opcplcSlushConnection.ConnectRemoteServer(opcServerName, opcServerIP); #endregion #region 建立监控连接 MonitorSlushConnection = new OPCPLC.OPCPLCAutomation(); MonitorSlushConnection.GetListOPCServers(opcServerIP); MonitorSlushConnection.ConnectRemoteServer(opcServerName, opcServerIP); MonitorSlushConnection.CreateGroup("Monitor"); MonitorSlushConnection.KepGroups.DefaultGroupIsActive = true;//激活组。 MonitorSlushConnection.KepGroups.DefaultGroupDeadband = 0;// 死区值,设为0时,服务器端该组内任何数据变化都通知组。 MonitorSlushConnection.KepGroups.DefaultGroupUpdateRate = 50;//默认组群的刷新频率为200ms MonitorSlushConnection.KepGroup.UpdateRate = 50;//刷新频率为1秒。 MonitorSlushConnection.KepGroup.IsSubscribed = true;//使用订阅功能,即可以异步,默认false //绑定监控事件 MonitorSlushConnection.KepGroup.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(KepGroup_DataChange); #endregion #region 加载模块下的加工参数配置信息 //变量所有的模具信息 foreach (var m in moldSlushList) { MachineInfo machineEntity = slushMachineList.First(o => o.MACHINECODDE == m.MACHINECODDE); #region 获取加工参数组 //获取该模块下所有的加工参数信息 List paraList = paraSlushConfigList .Where(o => o.MACHINECODDE == m.MACHINECODDE && o.MOLDNUMBER == m.MOLDNUMBER && o.COLUMNTYPE == EnumGeter.COLUMNTYPE.PARAMETER.GetHashCode().ToString() ) .ToList(); if (paraList.Count > 0) { //为该模块创建参数组 opcplcSlushConnection.CreateGroup(m.MACHINECODDE + ":" + m.MOLDNUMBER + ":GetData"); if (opcplcSlushConnection.KepGroups.DefaultGroupUpdateRate == 1000) { opcplcSlushConnection.KepGroups.DefaultGroupUpdateRate = 200; } //变该模块下的所有参数信息 foreach (var pc in paraList) { //初始化字典名称: 设备名称+模块编号+字段名称 string dicKeyStr = machineEntity.MACHINECODDE + ":" + m.MOLDNUMBER + ":" + pc.COLUMNCODE; try { //初始化字段信息值为0 parameterSlushValueDict.Add(dicKeyStr, 0); //获取opc中tagName string itemName = pc.CONNECTIONSTRING; clientSlushHandleValue++; clientSlushHandleDict.Add(clientSlushHandleValue, dicKeyStr); //将字典中的与PLC内存地址向绑定 parameterSlushValueDict[dicKeyStr] = opcplcSlushConnection.AddKepItem(itemName, clientSlushHandleValue); } catch (Exception ex) { //Console.WriteLine(ex.Message); //Console.WriteLine(dicKeyStr); continue; } } } #endregion #region 公共参数组 List commonPara = paraSlushConfigList .Where(o => o.MACHINECODDE == m.MACHINECODDE && o.MOLDNUMBER == m.MOLDNUMBER && o.COLUMNTYPE == EnumGeter.COLUMNTYPE.PUBLICDATA.GetHashCode().ToString() ) .ToList(); if (commonPara.Count > 0) { opcplcSlushConnection.CreateGroup(m.MACHINECODDE + ":" + m.MOLDNUMBER + ":CommonPara"); //变该模块下的所有参数信息 foreach (var pc in commonPara) { //初始化字典名称: 设备名称+模块编号+字段名称 string dicKeyStr = machineEntity.MACHINECODDE + ":" + m.MOLDNUMBER + ":" + pc.COLUMNCODE; try { //初始化字段信息值为0 parameterSlushValueDict.Add(dicKeyStr, 0); //获取opc中tagName string itemName = pc.CONNECTIONSTRING; clientSlushHandleValue++; clientSlushHandleDict.Add(clientSlushHandleValue, dicKeyStr); //将字典中的与PLC内存地址向绑定 parameterSlushValueDict[dicKeyStr] = opcplcSlushConnection.AddKepItem(itemName, clientSlushHandleValue); } catch (Exception ex) { //Console.WriteLine(ex.Message); //Console.WriteLine(dicKeyStr); continue; } } } #endregion #region 监控组 //获取设备扫描条码完成标记和设备加工完成标记 List monitorList = paraSlushConfigList .Where(o => o.MACHINECODDE == m.MACHINECODDE && o.MOLDNUMBER == m.MOLDNUMBER && ( o.COLUMNTYPE == EnumGeter.COLUMNTYPE.EQUIPSCANFLAG.GetHashCode().ToString() || o.COLUMNTYPE == EnumGeter.COLUMNTYPE.COMPLETEFLAG.GetHashCode().ToString() ) ) .ToList(); if (monitorList.Count > 0) { //变该模块下的所有参数信息 foreach (var pc in monitorList) { //初始化字典名称: 设备名称+模块编号+字段名称 string dicKeyStr = machineEntity.MACHINECODDE + ":" + m.MOLDNUMBER + ":" + pc.COLUMNCODE; //Console.WriteLine(dicKeyStr); try { //初始化字段信息值为0 parameterSlushValueDict.Add(dicKeyStr, 0); //获取opc中tagName string itemName = pc.CONNECTIONSTRING; clientSlushHandleValue++; clientSlushHandleDict.Add(clientSlushHandleValue, dicKeyStr); //将字典中的与PLC内存地址向绑定 parameterSlushValueDict[dicKeyStr] = MonitorSlushConnection.AddKepItem(itemName, clientSlushHandleValue); } catch (Exception ex) { //Console.WriteLine(ex.Message); //Console.WriteLine(dicKeyStr); continue; } } //MonitorList.Add(mouldConnection); } #endregion } #endregion } catch (Exception ex) { WriteLog.Write(ex.Message); throw ex; } } private static void KepGroup_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps) { try { for (int i = 1; i <= NumItems; i++) { try { #region 获取被获取的获取数据类型 //获取写入的值 var itemValue = ItemValues.GetValue(i); //获取客户端句柄 int chvalue = Convert.ToInt32(ClientHandles.GetValue(i)); //获取服务端字典key值 string dicKeyStr = clientSlushHandleDict[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 = paraSlushConfigList.First(o => o.MACHINECODDE == machCode && o.MOLDNUMBER == moldNumber && o.COLUMNCODE == columnCode); //Console.WriteLine(currentPC.MACHINECODDE + ":" + currentPC.MOLDNUMBER + ":" + currentPC.COLUMNCODE.ToString()); #endregion #region 捕获完成标记 if (currentPC.COLUMNTYPE == EnumGeter.COLUMNTYPE.COMPLETEFLAG.GetHashCode().ToString()) { if (itemValue == null) { continue; } //如果完成标记表示更新了加工参数 //获取所有的加工参数 if ((Boolean)itemValue == true) { //设置延迟2秒 //因为plc刷新频率 //个别情况获取不到值可以适当的延长等待时间 Thread.Sleep(2000); //Console.WriteLine("Catch " + currentPC.MACHINECODDE + ":" + currentPC.MOLDNUMBER + ":" + currentPC.COLUMNCODE + " Finish"); List resultList = new List(); #region 获取该模块下的加工参数 List getParaList = new List(); //获取加工参数和公用参数 List paraList = paraSlushConfigList .Where(o => o.MACHINECODDE == machCode && o.MOLDNUMBER == moldNumber && ( o.COLUMNTYPE == EnumGeter.COLUMNTYPE.PARAMETER.GetHashCode().ToString() ) ) .ToList(); //确定组信息 if (paraList.Count > 0) { opcplcSlushConnection.KepGroup = opcplcSlushConnection.KepGroups.GetOPCGroup(currentPC.MACHINECODDE + ":" + currentPC.MOLDNUMBER.ToString() + ":GetData"); opcplcSlushConnection.KepItems = opcplcSlushConnection.KepGroup.OPCItems; } //获取所有的加工参数 foreach (var parameter in paraList) { #region 获取参数 ParameterConfig paraConfig = GetResultParameterConfig(parameter); string item = parameter.MACHINECODDE + ":" + parameter.MOLDNUMBER + ":" + parameter.COLUMNCODE; var result = opcplcSlushConnection.ReadtagValue(parameterSlushValueDict[item]); if (result != null) { paraConfig.PARAVALUE = result; } resultList.Add(paraConfig); #endregion //Console.WriteLine(paraConfig.MACHINECODDE + ":" + paraConfig.MOLDNUMBER + ":" + paraConfig.COLUMNCODE + " " + ((result == null) ? " " : result.ToString())); WriteLog.Write(paraConfig.MACHINECODDE + ":" + paraConfig.MOLDNUMBER + ":" + paraConfig.COLUMNCODE + " " + ((result == null) ? " " : result.ToString())); } #endregion #region 获取该模块下的公共参数 List publicDataList = paraSlushConfigList .Where(o => o.MACHINECODDE == machCode && ( o.COLUMNTYPE == EnumGeter.COLUMNTYPE.PUBLICDATA.GetHashCode().ToString() ) ) .ToList(); if (publicDataList.Count > 0) { opcplcSlushConnection.KepGroup = opcplcSlushConnection.KepGroups.GetOPCGroup(publicDataList[0].MACHINECODDE + ":" + publicDataList[0].MOLDNUMBER.ToString() + ":CommonPara"); opcplcSlushConnection.KepItems = opcplcSlushConnection.KepGroup.OPCItems; foreach (var parameter in publicDataList) { #region 获取参数 ParameterConfig paraConfig = GetResultParameterConfig(parameter); string item = parameter.MACHINECODDE + ":" + parameter.MOLDNUMBER + ":" + parameter.COLUMNCODE; var result = opcplcSlushConnection.ReadtagValue(parameterSlushValueDict[item]); if (result != null) { paraConfig.PARAVALUE = result; } resultList.Add(paraConfig); #endregion //Console.WriteLine(paraConfig.MACHINECODDE + ":" + paraConfig.MOLDNUMBER + ":" + paraConfig.COLUMNCODE + " " + ((result == null) ? " " : result.ToString())); WriteLog.Write(paraConfig.MACHINECODDE + ":" + paraConfig.MOLDNUMBER + ":" + paraConfig.COLUMNCODE + " " + ((result == null) ? " " : result.ToString())); } } #endregion #region 将参数信息传递到web服务中 //如果第一次加载, if (loadValue == 1) { client.SubmitParameters(JsonConvertHelper.GetSerializes(resultList)); } //第一次加载之后设置loadValue loadValue = 1; #endregion } else { if (currentPC.PROCESSTYPE == EnumGeter.ProcessType.tangsu.GetHashCode().ToString()) { //第一次加载时是false值,设置loadValue=1 loadValue = 1; } } } #endregion } catch (Exception ex) { WriteLog.Write(ex.Message); continue; } } } catch (Exception ex) { //Console.WriteLine("系统出现异常:" + ex.Message); } } /// /// 获取参数信息 /// /// /// private static ParameterConfig GetResultParameterConfig(ParameterConfig parameter) { 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 return paraConfig; } } }