OPC dll-如何批量检索标签值

问题描述 投票:4回答:1

我正在使用OPCSiemensDAAutomation带有C#.NET的dll从OPC服务器检索标签的值。我设法使用QueryAvailableProperties()GetItemProperties()检索值,但目标是每个请求检索500k标签值。

我已经测试了100个标签,并且代码在45秒内完成了测试,并且多线程处理使100个标签的30秒略有改善。以当前速度达到目标标签数量需要4个小时以上。有什么方法可以批量检索具有更好性能的标签值?谢谢。

var opcServer = new OPCSiemensDAAutomation.OPCServer();
opcServer.Connect("PCS7.OPCDAServer.1");
ConcurrentBag<DataRow> myBag = new ConcurrentBag<DataRow>(dt.AsEnumerable().ToList());
Parallel.ForEach(myBag, data =>
{
    if (count <= num)
    {
        int cnt;
        Array propertyIds, descriptions, dataTypes, errors, vals;
        try
        {
            opcServer.QueryAvailableProperties(data[0].ToString(), out cnt, out propertyIds, out descriptions, out dataTypes);
            opcServer.GetItemProperties(data[0].ToString(), cnt, propertyIds, out vals, out errors);
            Tags tag = new Tags();
            tag.Id = data[0].ToString();
            tag.Value = vals.GetValue(2).ToString();
            tags.Add(tag);
            Interlocked.Increment(ref count);
        }
        catch
        { }
    }
});
c# .net opc siemens opc-da
1个回答
0
投票

您可以创建OPC组:

OPCGroup myGroup = myServer.addGroup(groupName, isActive, isSubscribed, updateRate);

然后您可以将标签添加到您的组:

myGroup.OPCItems.AddItem("FullAddress", ClientHandle) //a unique number inside the group

FullAddress由OPCChannel名称,连接名称和完整地址组成,即:S7:[MyPLCName]DB1.dbx4

当组完全填充后,您可以一次读取所有变量。

int itemCount = myGroup.OPCItems.Count;
object qualities = null;
object timeStamps = null;
object errors = null;
int serverHandles[itemCount];
Array values = Array.CreateInstance(TypeOf(object), {itemCount },{1})
for (int i = 0; i < itemCount; i++){
   serverHandles[i] = myGroup.OPCItems.Item(i + 1).ServerHandle;
   values.SetValue("", i);
}

myGroup.SyncRead(OPCSiemensDAAutomation.OPCDataSource.OPCDevice, itemCount + 1, ServerHandles, values, errors, qualities, timeStamps);

然后您将拥有与第一个serverHandles相关的四个新数组。

在使用qualities中的数据之前,最好先检查values数组。

© www.soinside.com 2019 - 2024. All rights reserved.