2013-10-10 214 views
0

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

,则应该使用OpcCom.Da20服务器,有一个叫

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

我会看看这个方法。 –

+0

看起来创建一个OpcComDa20.Server需要一个'对象服务器'作为一个ctor parmater来传递,这个''object'与我想要避免的事物的COM端有关。我坚持.NET,因为我不熟悉COM,并且如果完全可以避免的话,也不想深入研究它。我认为我发现了自己的问题,并在验证它可行时发布。 –