为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
Cats萌萌 2023-05-14 16:14:40
我从 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 时,会打印错误“可为空的对象必须有一个值”。请告诉我我做错了什么。
查看完整描述

2 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

在我的例子中,问题是 nodeId。我变了


ps.NodeId = new NodeId();

// to

ps.NodeId = new NodeId(Guid.NewGuid(), NamespaceIndex);

然后它确实出现在节点树中。


查看完整回答
反对 回复 2023-05-14
?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

OPC-UA 的例子有更新变量的代码位,所以我不确定它有什么问题。假设我设置了良好的价值,代码可能如下所示:


variable.Value = value;

variable.Timestamp = DateTime.UtcNow;

variable.StatusCode = StatusCodes.Good;

variable.ClearChangeMasks(SystemContext, false);


查看完整回答
反对 回复 2023-05-14
  • 2 回答
  • 0 关注
  • 114 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信