猿问

如何添加具有子属性的节点并为其设置值?

我从 OPCFoundation 示例构建了一个 OPC UA 服务器 - https://github.com/OPCFoundation/UA-.NETStandard

还编译了我自己的模型 - https://github.com/Pro/UA-ModelCompiler/tree/eebf9988940a789a4f36cbef8c5bd6340f1b2f42

在示例中,他们将生成的文件放在文件夹中,然后为 NodeManger、State 等定制类。

我已成功加载生成的 .uanodes 文件,其中包含一些示例节点。但是我无法通过服务器端的代码创建这些节点。测试时,我在函数中进行 - LoadPredefinedNodes(ISystemContext context)。

我的结构应该是对象下面的一个节点,称为“标签”,在该节点中,我想在服务器运行时动态添加节点并设置它们的属性。

我在测试时使用 Integration Object 的 OPC UA 客户端。

结构看起来正确,例如:Objects => Tags => MyTestTag (Properties: Name, Description, Value)

前两个属性是从模型文件定义中正确添加的

   <!-- ### Object Types ###-->


    <!-- BaseType -->

    <ObjectType SymbolicName="TAG:TagType" BaseType="ua:BaseObjectType" IsAbstract="true" SupportsEvents="true" AccessLevel="ReadWrite">

        <Description>Base type for all tags</Description>

        <Children>

            <Property SymbolicName="TAG:Name" DataType="ua:String" ValueRank="Scalar" ModellingRule="Mandatory" AccessLevel="ReadWrite">

                <Description>Name of the tag</Description>

            </Property>

            <Property SymbolicName="TAG:Description" DataType="ua:String" ValueRank="Scalar" ModellingRule="Optional" AccessLevel="ReadWrite">

                <Description>Description of the tag</Description>

            </Property>

        </Children>

    </ObjectType>


    <!-- ### Objects ###-->

    <Object SymbolicName="TAG:Tags" TypeDefinition="ua:BaseObjectType">

        <Description>Contains all instances of tags</Description>

        <References>

            <Reference IsInverse="true">

                <ReferenceType>ua:Organizes</ReferenceType>

                <TargetId>ua:ObjectsFolder</TargetId>

            </Reference>

        </References>

    </Object>

第三个是我尝试从服务器端代码定义的属性。我添加了 Value 属性,但我不知道如何写它的值。

从这段代码中,一个名为 MyTestTag 的节点被添加到 Tags 节点中。从模型中添加属性“名称”和“描述”。并且“Value”属性是通过代码添加的。但是,我无法为这些属性中的任何一个设置值。

在客户端中单击属性 MyTestTag.Value 时,会打印错误“可为空的对象必须有一个值”。

请告诉我我做错了什么。


Cats萌萌
浏览 115回答 2
2回答

慕少森

在我的例子中,问题是 nodeId。我变了ps.NodeId = new NodeId();// tops.NodeId = new NodeId(Guid.NewGuid(), NamespaceIndex);然后它确实出现在节点树中。

凤凰求蛊

OPC-UA 的例子有更新变量的代码位,所以我不确定它有什么问题。假设我设置了良好的价值,代码可能如下所示:variable.Value = value;variable.Timestamp = DateTime.UtcNow;variable.StatusCode = StatusCodes.Good;variable.ClearChangeMasks(SystemContext, false);
随时随地看视频慕课网APP
我要回答