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);
}
}
}
}

浙公网安备 33010602011771号