首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpcNetApi DataChange事件不触发

OpcNetApi DataChange事件不触发
EN

Stack Overflow用户
提问于 2013-07-31 21:06:21
回答 1查看 4.1K关注 0票数 1

我使用OpcNetApi连接到OPC服务器。我能够在没有任何问题的情况下连接和读取数据,但是,当数据更改需要再次读取才能看到更改时,虽然我向订阅的DataChanged事件添加了一个Handler,但没有收到任何更改事件的通知。

有什么特别的事情我需要做才能让它起作用吗?

代码语言:javascript
运行
复制
Opc.URL url = new Opc.URL("opcda://localhost/ArchestrA.FSGateway.3");
        OpcCom.Factory factory = new OpcCom.Factory();

        using (Opc.Da.Server server = new Opc.Da.Server(factory, url)) {
            server.Connect();
            Console.WriteLine("Server LocalID = {0}", server.Locale);
            Opc.Da.SubscriptionState state = new Opc.Da.SubscriptionState();
            using (Opc.Da.Subscription group = server.CreateSubscription(new Opc.Da.SubscriptionState {
                    Name = "GROUP1",
                    UpdateRate = 40,
                    Deadband = 0,
                    Active = true
                }) as Opc.Da.Subscription) {
                // Create the itesm
                Opc.Da.Item[] items = new Opc.Da.Item[2];
                items[0] = new Opc.Da.Item { ItemName = "value1", Active = true, ClientHandle = "6S1", ActiveSpecified = true };
                items[1] = new Opc.Da.Item { ItemName = "value2", Active = true, ClientHandle = "6S2", ActiveSpecified = true };
                Opc.Da.ItemResult[] results = group.AddItems(items);
                for (int i = 0; i < results.Length; i++) {
                    items[i].ServerHandle = results[i].ServerHandle;
                }
                group.DataChanged += new Opc.Da.DataChangedEventHandler(group_DataChanged);
                group.State.Active = true;
                Opc.IRequest request;
                group.Read(group.Items, 1234, new Opc.Da.ReadCompleteEventHandler(group_ReadComplete), out request);

                // Stop when 'q' is pressed
                ConsoleKeyInfo key = new ConsoleKeyInfo();
                while (key.Key != ConsoleKey.Q) {
                    key = Console.ReadKey();
                    if (key.Key == ConsoleKey.R) {
                        group.Read(group.Items, 1234, new Opc.Da.ReadCompleteEventHandler(group_ReadComplete), out request);
                    }
                }
                group.DataChanged -= group_DataChanged;
                group.RemoveItems(items);
            }
            server.Disconnect();
        }

        static void group_DataChanged(object subscriptionHandle, object requestHandle, Opc.Da.ItemValueResult[] values) {
            Console.WriteLine("Data Changed");
            foreach (Opc.Da.ItemValueResult readResult in values) {
                Console.WriteLine("\t{0}\tvalue:{1}", readResult.ItemName, readResult.Value);
            }
            Console.WriteLine();
        }

谢谢,

JFercan

EN

回答 1

Stack Overflow用户

发布于 2013-08-01 07:36:39

您编写的所有内容似乎都很好,但您是否可以在订阅的至少一个数据被更新时向我们展示调用的group_DataChanged方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17980996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档