【计算机网络 14,刚面试了阿里,滴滴,网易


//异步读完成 运行时,Array数组从下标1开始而非0!

void GroupAsyncReadComplete(int TransactionID, int NumItems, ref System.Array ClientHandles, ref System.Array ItemValues, ref System.Array Qualities, ref System.Array TimeStamps, ref System.Array Errors)

{

	try

	{

		//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

5d779ca4750f9a8f1971203f48bd4819bff.jpg

这段代码设计为了获取到全部的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);

	File.WriteAllText(@filename, builder.ToString(), Encoding.GetEncoding("gb2312"));



# **Java高频面试专题合集解析:**

![阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等](https://img-blog.csdnimg.cn/img_convert/622f5c57cda58627218db5aab7059d42.png)

当然在这还有更多整理总结的Java进阶学习笔记和面试题未展示,在这也是免费分享给那些有需要的朋友,其中囊括了**Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构资料和完整的Java架构学习进阶导图!**

**[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](https://codechina.csdn.net/m0_60958482/java-p7)**![阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等](https://img-blog.csdnimg.cn/img_convert/00b17269e8c4a31507b4ef7b54e2f2f7.png)

**更多Java架构进阶资料展示**

![阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等](https://img-blog.csdnimg.cn/img_convert/17e3b6d9ebdf53818f7a22417ea27391.png)

![阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等](https://img-blog.csdnimg.cn/img_convert/b475b62fd215abeb349563996312e253.png)

d、分布式、高并发等架构资料和完整的Java架构学习进阶导图!**

**[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](https://codechina.csdn.net/m0_60958482/java-p7)**[外链图片转存中...(img-7OeChKCZ-1630931682611)]

**更多Java架构进阶资料展示**

[外链图片转存中...(img-YGmftmhf-1630931682612)]

[外链图片转存中...(img-7FPKryBC-1630931682614)]

![阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等](https://img-blog.csdnimg.cn/img_convert/19acd31c6a08f52c746af8e16641d2de.png)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值