使用 OPCAutomation 实现对 opc 数据的访问,腾讯数据分析面试春招 2021
//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+
"_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);
评论