使用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 事件,不能收到事件通知。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据