【问题标题】:OPC Client - how to read from Remote OPC ServerOPC 客户端 - 如何从远程 OPC 服务器读取
【发布时间】:2011-02-07 13:40:20
【问题描述】:

我使用了OPCDotNetLib,但无法从那里的远程 OPC Server 读取数据。

我可以连接,比如

Type typeofOPCserver = Type.GetTypeFromProgID(clsidOPCserver, ip);

但是查看 DataChanged 或 ReadCompleted 方法不起作用或工作错误。

我用本地 OPC Server 进行了相同的测试,效果很好,我可以连接远程 OPC Server,我可以添加项目并读取数据。远程机器上的 OPC Server 显示我已读取它们,但我看不到任何数据。似乎我需要在 OPCDotNetLib 上为远程 OPC Server 提供另一种解决方法。

我什至在那里找到了评论

这个库/dll不能在远程服务器上工作,只能在本地使用。

还有其他可用的 OPC 客户端 .NET 库吗?

【问题讨论】:

    标签: .net opc


    【解决方案1】:

    您有几个 OPC 兼容性选项。您可以使用 OPC Foundation 提供的经典 COM 包装器,也可以使用为 .Net 设计的较新的 OPC 库。

    我还没有亲自切换到较新的库,但这是对如何使用 OpcNetApi.dll、OpcNetApi.Com.dll 和 OpcRcw.Da.dll 来初始化连接并订阅 DataChanged 事件的分解:

    Opc.Da.Server scadaServer = null;
    List<Opc.Da.Item> scadaItems = null;
    Opc.Da.Subscription scadaSubscription = null;
    
    string scadaUrl = string.Format("opcda://{0}/{1}", hostname,
                                                       opcServerVendor);
    
    scadaServer = new Opc.Da.Server(new OpcCom.Factory(), new Opc.URL(scadaUrl));
    scadaServer.Connect();
    
    var scadaItems = new List<Opc.Da.Item>(); // I'm using a List<T>, but cast back to a simple array using ToArray();
    
    // Repeat this next part for all the items you need to subscribe
    Opc.Da.Item item = new Opc.Da.Item();
    item.ItemName = TagPath; // Where TagPath is something like device.channel.tag001;
    item.ClientHandle = handle; // handle is up to you, but i use a logical name for it
    item.Active = true;
    item.ActiveSpecified = true;
    
    scadaItems.Add(item);
    
    Opc.Da.SubscriptionState subscriptionState = new Opc.Da.SubscriptionState();
    subscriptionState.Active = true;
    subscriptionState.UpdateRate = 40;
    subscriptionState.Deadband = 0;
    
    scadaSubscription = scadaSubscription ?? (Opc.Da.Subscription)scadaServer.CreateSubscription(subscriptionState);
    
    Opc.Da.ItemResult[] result = scadaSubscription.AddItems(scadaItems.ToArray());
    for (int i = 0; i < result.Length; i++)
        scadaItems[i].ServerHandle = result[i].ServerHandle;
    
    scadaSubscription.DataChanged += new Opc.Da.DataChangedEventHandler(OnDataChange);
    scadaSubscription.State.Active = true;
    

    【讨论】:

    • 那么,我在哪里可以获得 OpcNetApi.dll、OpcNetApi.Com.dll 和 OpcRcw.Da.dll ? :( 我不是 OPC 基金会的付费会员。
    • @nCdy 您需要来自信誉良好的来源的OPC Redistributable 2.00。否则,您可以从 Kepware 或 Matrikon 等公司购买充实的组件。
    • @GregBuehler 我正在断开连接,但客户端在 opc 服务器端仍然处于活动状态。你知道为什么吗?
    【解决方案2】:

    我知道这已经有一段时间了,但要帮助那些需要图书馆的人。 与 Greg Buehlers 一起回答。 它们是免费的,并且是核心 OPC 基金会的一部分,如果您需要以前的版本,可以在 here 单击存档选项卡上找到它们。我花了很长时间才找到它们,所以我希望这可以帮助某人。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多