我正在使用 OPC Foundations .NET 库来构建一个 OPC 客户端。客户端正在与 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 库来完成。