Создание экземпляра пользовательского узла типа объекта opcua

Нуби-пользователь OPCUA здесь. Я создал пользовательский тип объекта с помощью UA Modeler, который, насколько я понимаю, создает класс пользовательского объекта x со свойствами y. Моя проблема связана с созданием экземпляра узла на моем сервере. Я ищу что-то, что позволило бы мне сделать: Тест узла = новый узел объекта типа x настраиваемый объект. Я знаю, что мог бы воссоздать свой пользовательский объект в коде, но это было бы не очень умно... Я думаю, что это очень простая проблема, но я не могу найти, как это исправить в документации или на серверах. Разве это не путь?

      CreateObjectSettings settings = new CreateObjectSettings()
                {
                    // All the settings
                    TypeDefinitionId = ObjectTypeIds.MyCustomObject,
                };
                CreateObject(Server.DefaultRequestContext, settings);

Спасибо за помощь :)

1 ответ

Ты на правильном пути.

Вот функция, которую я написал для создания пользовательских объектов на основе переданного типа. Обратите внимание, что вы должны заблокировать узлы и убедиться, что узел еще не существует.

      private ObjectNode CreateOpcObject(NodeId parentNodeId, string nodeName, string identifier, uint type,
        bool inRootFolder, bool isParentAsOwner, string description = "")
    {
        ObjectNode newNode = null;

        lock (InMemoryNodeLock)
        {
            if (FindInMemoryNode(new NodeId(identifier, DefaultNamespaceIndex)) == null)
            {
                if (!inRootFolder && FindInMemoryNode(parentNodeId) == null)
                {
                    log.Warn("Cannot create OPC object because parent node is not found for nodeName {nodeName}, identifier {identifier}.", nodeName, identifier);
                    return null;
                }

                var settings = new CreateObjectSettings
                {
                    ParentNodeId = parentNodeId,
                    ParentAsOwner = isParentAsOwner, // cannot set this to true since it makes deleting much slower
                    ReferenceTypeId = ReferenceTypeIds.Organizes,
                    RequestedNodeId = new NodeId(identifier, DefaultNamespaceIndex),
                    BrowseName = new QualifiedName(nodeName, DefaultNamespaceIndex),
                    TypeDefinitionId = new NodeId(type, DefaultNamespaceIndex),
                    DisplayName = nodeName,
                    Description = description
                };

                newNode = CreateObject(Server.DefaultRequestContext, settings);
            }
            else
            {
                log.Warn("Cannot create OPC object because identifier is not found for nodeName {nodeName}, identifier {identifier}.", nodeName, identifier);
            }
        }
        return newNode;
    }

Обратите внимание, что вы можете сделать это вместо того, чтобы просто присвоить типTypeDefinitionId:

      TypeDefinitionId = new NodeId(type, DefaultNamespaceIndex),

Вы вызываете это, делая что-то вроде этого:

      var newNode = CreateOpcObject(parentNodeId, newNodeName, newNodeId, Model.ObjectTypes.MyGeneratedType, false, true, "This is a description of the new node object.");
Другие вопросы по тегам