【问题标题】:Forcing an OPC Client to read the OPC Servers cache强制 OPC 客户端读取 OPC 服务器缓存
【发布时间】:2013-10-10 17:27:24
【问题描述】:

我正在研究构建 OPC 客户端的 OPC Foundations .NET 库。客户端正在与 Kepware OPC 服务器 (KEPServerExV5) 进行通信。我的 OPC 客户端正在读取的标签使用作为 OPC 服务器一部分的内置 Modbus TCP/IP 驱动程序。我遇到的问题是我无法对 OPC 服务器上的任何 OPC 标签进行缓存读取,OPC 客户端请求的每个标签值都会导致 OPC 服务器执行设备读取。我需要进行缓存读取,因为在这种情况下,我需要快速读取数据,而不是等到检索到最新数据。

我目前的理解是,MaxAge 属性用于根据缓存中数据的陈旧程度来确定应该执行设备读取还是缓存读取。下面是我目前用来执行缓存读取的代码。

Server = new Server(new Factory(), new URL("MyOpcServerConnectionString"));

Server.Connect();

var readValue = new Item[1];

readValue[0] = new Item
{
    ItemName = "Channel1.Device1.Tag1",
    // set max age high so the OPC servers always reads from the cache not the device
    MaxAge = int.MaxValue,
    // we specify that the max age property is in effect
    MaxAgeSpecified = true
};

ItemValueResult[] result = null;

result = Server.Read(readValue);

使用上面的代码,Server.Read() 方法会导致 OPC 服务器执行设备读取,即使我已将 MaxAge 属性设置为大约 60 年,这样如果有缓存值,它就不应该从任何内容中读取。我不明白它为什么这样做。使用订阅方式读取也会导致同样的问题,MaxAge 属性仍然会被忽略。

所以我的问题真的归结为:关于强制缓存读取,我缺少什么?

编辑

好吧,我找到了一种进行缓存读取的方法,尽管它并不是我想要的。如果我创建订阅并执行设备读取,那么在device read timestamp + MaxAge property 之前完成的任何后续读取都将是缓存读取。这确实意味着就我的目的而言,一切都必须根据订阅来完成。理想情况下,我希望能够执行一次访问缓存的读取,而不是设置许多订阅,然后我必须管理或显式销毁这些订阅。

如果有人在订阅方法之外找到一种方法来读取设备,我很想听听。但就目前而言,我认为就我对缓存读取工作原理的理解而言,我发现的内容就足够了。我将不回答这个问题,因为我不相信我想做的事情不能使用 OPC Foundation .Net 库来完成。

【问题讨论】:

    标签: .net caching opc


    【解决方案1】:

    你应该使用 OpcCom.Da20 的 Server,有一个方法叫

    ReadValues(Item[] items, ItemValueResult[] results, bool cache)
    

    【讨论】:

    • 看来创建 OpcComDa20.Server 需要一个 object server 作为 ctor 参数传递,而这个 object 与我想避免的事情的 COM 方面有关。我只坚持使用 .NET,因为我不熟悉 COM,如果可以避免的话,我也不想深入研究它。我想我发现了我的问题,并会在我验证它有效时发布它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 2020-12-23
    • 2020-03-08
    • 2022-08-17
    相关资源
    最近更新 更多