OPC DA的Client对象模型
OPC DA的Client对象模型可以如下图表示
一个OPC Server对象可以包含一个OPC Groups对象
一个OPC Groups对象可以包含多个OPC Group对象
一个OPC Group对象可以包含一个OPC Items对象
一个OPC Items对象可以包含多个OPC Item对象
一个OPC Item对象就是OPC Server端的一个变量
以下只是我的个人理解,如果有不对,还请指正
代码
using OPCAutomation; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace shangchaiDataAnalyz { internal class OPC_operation { public OPCServer oPCServer; public OPCGroups oPCGroups; public OPCGroup oPCGroup; public OPCItem oPCItem; public OPCItems oOPCItems; public void Connect() { try { oPCServer = new OPCServer(); oPCServer.Connect("");//链接地址 if (oPCServer.ServerState == Convert.ToInt32(OPCServerState.OPCRunning)) { Console.WriteLine("OPCServer is Running"); oPCGroups = oPCServer.OPCGroups;//获取Groups对象 /* 给Groups设置的属性 同样也可以给Group设置 */ oPCGroups.DefaultGroupDeadband = 0;//死区设置 用来过滤一些细微的数据波动,避免造成服务器网络压力过大 oPCGroups.DefaultGroupIsActive = true;//激活OPCGroups oPCGroups.DefaultGroupUpdateRate = 250;//设置OPCGroups的数据更新速率 OPCGroup oPCGroup1 = oPCGroups.Add("gourp1");//添加组 oPCGroup1.IsSubscribed = true;//订阅 发生dataChange时发出通知 OPCItems oPCItems = oPCGroup1.OPCItems; OPCItem oPCItem1 = oPCItems.AddItem("test.tag1",1);//第一个参数时标签名称,第二个参数是客户端句柄用来代表这个item对象(ClientHandle不要重复,触发数据修改事件后,需要根据ClientHandle区分数据项) oPCGroup1.DataChange += Group_DataChange; } else { Console.WriteLine(" OPC Server is not Connected"); } } catch (Exception e) { Console.WriteLine(e.Message); } } /// <summary> /// group的数据改变事件 /// </summary> /// <param name="TransactionID">OPC 事物标识符</param> /// <param name="NumItems">本次检测到OPC数据项值改动个数</param> /// <param name="ClientHandles">检测到改动数据项ClientHandle数组</param> /// <param name="ItemValues">检测到改动数据项值数据</param> /// <param name="Qualities">检测到改动数据项质量值数据</param> /// <param name="TimeStamps">检测到改动数据项时间戳数据</param> private void Group_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps) { Console.ForegroundColor = ConsoleColor.Green; for (int i = 1; i <= NumItems; i++) { int tmpClientHandle = Convert.ToInt32(ClientHandles.GetValue(i)); string tmpValue = ItemValues.GetValue(i).ToString(); string tmpTime = ((DateTime)(TimeStamps.GetValue(i))).ToString(); Console.WriteLine("Time:" + tmpTime); Console.WriteLine("ClientHandle : " + tmpClientHandle.ToString()); Console.WriteLine("tag value " + tmpValue); } } } }