写点什么

使用 OPCAutomation 实现对 opc 数据的访问,腾讯数据分析面试春招 2021

用户头像
极客good
关注
发布于: 刚刚

//C# Dictionary 字典


Dictionary<string, string> tagValueMap = new Dictionary<string, string>();


for (int i = 1; i <= NumItems; i++)


{


string clientHandle = ClientHandles.GetValue(i).ToString();


string tag = MAP_CLIENTHANDLE_TAG[clientHandle];


string val = ItemValues.GetValue(i).ToString();


//C# Dictionary 字典 添加数据


tagValueMap.Add(tag, val);


}


//构建 json


string json = ParseOPCData(tagValueMap);


}


catch (Exception ex)


{


}


}


为全局变量 OPCGroup 添加 items,在 OPC 中,每个 opcltem 会被分配一个客户端句柄值,同时会被配置上服务器句柄。几乎所有有关获取指定 Opcltem 对象的方法均要求指定客户端句柄值。


上图中有一 C# Dictionary 字典,暂不做赘述,待下回分解。


[关于 C# dictionary 字典](


)


//goup 添加 items


string[] sensorIdArray;


void AddGroupItems()


{


List<string> l_str = new List<string>();


//读取配置文件,获取需要的传感器 ID


string sensorIdList = getSensorId();


sensorIdArray = sensorIdList.Replace("\r\n","").Split(',');


foreach (string sensorId in sensorIdArray){


l_str.Add(sensorId+


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


"_COS");


l_str.Add(sensorId+"_DL1");


l_str.Add(sensorId+"_DL2");


l_str.Add(sensorId+"_DL3");


l_str.Add(sensorId+"_DL4");


l_str.Add(sensorId+"_IA");


l_str.Add(sensorId+"_IB");


l_str.Add(sensorId+"_IC");


l_str.Add(sensorId+"_P");


l_str.Add(sensorId+"_Q");


l_str.Add(sensorId+"_UAB");


l_str.Add(sensorId+"_UBC");


l_str.Add(sensorId+"_UCA");


}


List<OPCItem> ItemsAdded = new List<OPCItem>();


int n = 0;


MAP_CLIENTHANDLE_TAG = new Dictionary<string, string>();


foreach (string tag in l_str){


ItemsAdded.Add(KepItems.AddItem(tag + ".PV", n));


//clientHandle tag 关系


MAP_CLIENTHANDLE_TAG.Add(n + "", tag);


n++;


}


OPC_ITEMS_ADDED = ItemsAdded.ToArray();


}


OPCServer 服务端数据源 item



这段代码设计为了获取到全部的 OPCltem 所添加到所创建的 OPCGroup 对象的 opcitem 集合中,得到添加到 goup 中的 item(OPC_ITEMS_ADDED)。


通过 OPC_ITEMS_ADDED 采集 opc 数据


//采集 opc 数据


private void GetOPCData()


{


try


{


//异步读 opc 数据


int[] temp = new int[OPC_ITEMS_ADDED.Length + 1];


temp[0] = 0;


for (int i = 1; i <= OPC_ITEMS_ADDED.Length; i++)


{


temp[i] = OPC_ITEMS_ADDED[i - 1].ServerHandle;


}


Array serverHandles = (Array)temp;


Array Errors;


int cancelID;


Random rd = new Random();


int TransactionID = rd.Next(1, 10);


KepGroup.AsyncRead(serverHandles.Length - 1, ref serverHandles, out Errors, TransactionID, out cancelID);//第一参数为 item 数量


}


catch (Exception ex)


{


MessageBox.Show(ex.Message);


}


}


解析 OPC 数据并以 json 格式存储在本地


//解析 opc 数据


private string ParseOPCData(Dictionary<string, string> tagValueMap)


{


string filename = "E:\mine\下峪口\data\electric_data.txt";


StringBuilder builder = new StringBuilder();


string rowStr = "";


string time = ConvertDateTimeToInt(DateTime.Now).ToString();


rowStr += "[";


foreach (string sensorId in sensorIdArray){


rowStr += "{\r\n"id":"+ """ + sensorId + "",\r\n";


rowStr += ""substation":"+""假变电所""+",\r\n";


rowStr += ""timestamp":"+time+",\r\n";


foreach (var item in tagValueMap)


{


string key = item.Key;


string[] data = item.Key.Split('_');


string title = data[0];


string word = data[1];


if(title.Equals(sensorId)){


rowStr += """+ word + """+ ":" + item.Value + ",\r\n";


}


}


rowStr += "},";


}


rowStr += "]";


rowStr = rowStr.Replace(",\r\n}","\r\n}").Replace(",]","]");


builder.Append(rowStr);

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
使用OPCAutomation实现对opc数据的访问,腾讯数据分析面试春招2021