C# OPC AE client 实现备忘
使用C# 实现OPC AE 的客户端时需要注意以下一些问题:
1、不是全部的OPC Server 都实现了OPC AE的全部特性。 很多Server的实现并不支持area browser/filter或者子条件过滤(subcondition),也不能基于位置过滤事件。OPC AE 规定了一些接口可以查询具体实现支持哪些特性。这些接口有:queryAvailableFilters、queryEventCategories、queryEventAttributes等。这些查询接口分为两个部分,必须实现的和可选实现的。比如EnableConditionByArea2 就是可选的。
2、OPC AE规范把报警类别(Event Category)和每个类别的特征(Attributes)划分成两个部分,一个部分是标准的通用的,另一部分是实现OPC AE 服务器的厂商来定义。标准报警分为三类,条件事件(condition event), 跟踪事件(tracking event)和简单事件(simple event)。条件事件一般用于监测传感器的信号是否超出某个范围。跟踪事件一般用于记录设定值的变更。简单事件一般由控制器主动发出。 OPC AE 把简单事件当成最基本的类型,其他两种都是简单事件的特例。就算是这三个标准类型的报警也可以包含一些厂商自定义的特征。厂商自定义的类别和属性通过queryEventCategories、queryEventAttributes 这两个接口来查询。
3、最简实现代码
using System;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Opc.URL uRL = new Opc.URL("opcae://localhost/demo_OpcAeServer");
Opc.Factory factory = new OpcCom.Factory(true);
Opc.Ae.Server AeSever = new Opc.Ae.Server(factory, uRL);
AeSever.Connect();
Opc.Ae.SubscriptionState subState = new Opc.Ae.SubscriptionState();
subState.Active = true;
subState.ClientHandle = Guid.NewGuid().ToString();
subState.Name = "MyOpcAEClient";
Opc.Ae.Subscription aeSub = (Opc.Ae.Subscription)AeSever.CreateSubscription(subState);
aeSub.EventChanged += new Opc.Ae.EventChangedEventHandler(AeSub_EventChanged);
Opc.Ae.SubscriptionFilters filters = new Opc.Ae.SubscriptionFilters();
filters.EventTypes = 7;
aeSub.SetFilters(filters);
while (true)
{
System.Threading.Thread.Sleep(2000);
aeSub.Refresh();
Console.ReadKey();
}
}
public static void AeSub_EventChanged(Opc.Ae.EventNotification[] notifications, bool refresh, bool lastRefresh)
{
foreach(Opc.Ae.EventNotification n in notifications)
Console.WriteLine(n.Message);
}
}
}
上面的最简代码不能在.net core 上运行,只能用.net framework 运行。在.net core 上不能触发eventChanged 事件,不能收到事件通知。
OPC AE 已经是二十多年前的技术了,现在新的标准是opc ua。不过工控行业还是老技术更成熟。