我正在利用OPC基金会的.NET库来构建OPC客户端。客户端正在与Kepware OPC Server (KEPServerExV5)通信。我的OPC客户端正在读取的标记使用内置的Modbus TCP/IP驱动程序,它是OPC Server的一部分。我遇到的问题是,我无法对OPC服务器上的任何OPC标记进行缓存读取,OPC客户端请求的每个标记值都会导致OPC Server执行设备读取。我需要进行缓存读取,因为在这种情况下,我需要快速读取数据,而不是等到检索到最新的数据。
我目前的理解是,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基金会.Net库来完成。
发布于 2013-10-11 04:15:32
您应该使用OpcCom.Da20中的服务器,有一个方法名为
ReadValues(Item[] items, ItemValueResult[] results, bool cache)https://stackoverflow.com/questions/19302339
复制相似问题