OPC dll - Как получить массовое значение тегов

Я использую DLL OPCSiemensDAAutomation с C # .NET для получения значения тега с сервера OPC. Мне удалось получить значения с помощью QueryAvailableProperties () и GetItemProperties (), но цель состоит в том, чтобы получить значение тегов 500 тыс. За запрос.

Я тестировал со 100 тегами, и код завершил его за 45 секунд, а многопоточность привела к небольшому улучшению на 30 секунд для 100 тегов. Для достижения заданного объема тегов с текущей скоростью потребуется более 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
        { }
    }
});

person user3424002    schedule 11.09.2019    source источник
comment
Получение свойств в OPC DA не предназначено для быстрого получения. Было бы очень необычно, если бы вам действительно потребовались все свойства тысяч предметов. Для чего? OPC DA предназначен для быстрой работы с фактическими значениями / качествами / временными метками элемента, для которых вы не должны не использовать свойства. Скорее вам подписки, или, если они не подходят, разовые чтения.   -  person ZbynekZ    schedule 12.09.2019
comment
@ZbynekZ, спасибо за ваше предложение, теперь я закодировал с помощью SyncRead, но я столкнулся с этим 1073479672- OpcInvalidItemID: идентификатор элемента не соответствует синтаксису сервера. ошибка возвращается, когда я добавляю элемент OPC. Я проверил, что идентификаторы тегов такие же, как в OPC Scout или других инструментах. Не могли бы вы помочь.   -  person user3424002    schedule 17.09.2019


Ответы (1)


Вы можете создавать группы 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.

person Cleber Machado    schedule 29.11.2019