Как реализовать службу AddNodes в OPCUA с помощью .NET Standard SDK

Я новичок в OPCUA и могу использовать пример того, как реализовать службу AddNodes на C #, используя официальный .NET Standard SDK. По сути, я хочу реализовать свой собственный сервер и иметь возможность вызывать службу AddNodes от клиента, чтобы добавить некоторые узлы в папку (и установить их начальные значения).

Я видел, что существуют различные классы, от которых можно наследовать, поэтому я подумал, что было бы лучше наследовать от StandardServer и переопределить метод AddNodes. После этого я мог создать свой собственный диспетчер узлов и вызывать его из этого метода. Однако ни один из примеров менеджеров узлов не реализует метод AddNodes (даже интерфейс INodeManager не поддерживает), поэтому мне интересно, на правильном ли я пути.

Кто-нибудь уже реализовал службу AddNodes с помощью этого SDK и готов дать мне несколько советов, как это сделать? Вы только что создали свой собственный метод AddNodes в своем настраиваемом диспетчере узлов и добавили туда узлы? Некоторые фрагменты кода были бы очень полезны. Спасибо!


person Tobias von Falkenhayn    schedule 10.10.2020    source источник


Ответы (1)


Я думаю, вы на правильном пути. SessionServerBase автоматически создается Opc.Ua.Services.wsdl. StandardServer наследуется от SessionServerBase только с заменой подмножества виртуальных методов.

Таким образом, вам нужно переопределить AddNodes в StandardServer, а ниже приведен пример добавления узлов.

public override ResponseHeader AddNodes(
    RequestHeader requestHeader,
    AddNodesItemCollection nodesToAdd,
    out AddNodesResultCollection results,
    out DiagnosticInfoCollection diagnosticInfos)
{
    results = null;
    diagnosticInfos = null;

    ValidateRequest(requestHeader);

    foreach (var item in nodesToAdd)
    {
        if (item.NodeClass == NodeClass.Variable)
        {
            var node = new VariableNode
            {
                // TODO: Initialization
            };
            m_serverInternal.CoreNodeManager.AttachNode(node);
        }
        else if (item.NodeClass == NodeClass.VariableType)
        {
            var node = new VariableTypeNode
            {
                // TODO: Initialization
            };
            m_serverInternal.CoreNodeManager.AttachNode(node);
        }
        else
        {
            // TODO
        }
    }

    return CreateResponse(requestHeader, StatusCodes.Good);
}
person Han Zhao    schedule 15.10.2020
comment
Отлично, я сделал это именно так, и это сработало как шарм. - person Tobias von Falkenhayn; 22.10.2020