强制OPC客户端读取OPC服务器缓存

时间:2013-10-10 17:27:25

标签: .net caching opc

我正在讨论构建OPC客户端的OPC Foundations .NET库。客户端正在与Kepware OPC服务器(KEPServerExV5)进行通信。我的OPC客户端正在读取的标签使用内置的Modbus TCP / IP驱动程序,该驱动程序是OPC服务器的一部分。我遇到的问题是我无法对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库来完成。

1 个答案:

答案 0 :(得分:1)

您应该使用OpcCom.Da20中的服务器,有一个名为

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