如何在C#开发的OPC-UA服务器中使用EUInformation?
OPC-UA模型配置与属性赋值问题解答
模型XML文件配置方案
- 启用EngineeringUnits属性
AnalogItemType的可选子节点默认不会被ModelCompiler自动生成到代码中,你需要在定义变量的位置显式声明需要保留EngineeringUnits子节点,修改后的XML示例如下:
<opc:ObjectType SymbolicName="Motor" BaseType="ua:BaseObjectType"> <opc:Description>A motor.</opc:Description> <opc:Children> <opc:Variable SymbolicName="Speed" DataType="ua:Double" ValueRank="Scalar" TypeDefinition="ua:AnalogItemType" AccessLevel="ReadWrite"> <opc:Children> <!-- 显式声明启用EngineeringUnits属性 --> <opc:Variable SymbolicName="EngineeringUnits" ModellingRule="Mandatory" TypeDefinition="ua:PropertyType" DataType="ua:EUInformation" AccessLevel="Read" /> <!-- 需要禁用EURange就添加下面这行,将建模规则改为可选 --> <opc:Variable SymbolicName="EURange" ModellingRule="Optional" TypeDefinition="ua:PropertyType" DataType="ua:Range" AccessLevel="Read" /> </opc:Children> </opc:Variable> <opc:Method SymbolicName="Start" ModellingRule="Mandatory"></opc:Method> <opc:Method SymbolicName="Stop" ModellingRule="Mandatory"></opc:Method> </opc:Children> </opc:ObjectType>
- 禁用EURange可行性
可以禁用,OPC UA规范中AnalogItemType的EURange本身属于可选属性,按照上述方法将EURange的ModellingRule覆写为Optional后,不赋值的情况下客户端不会显示该属性;如果需要完全移除,也可以在ModelCompiler配置中关闭可选父节点属性继承。
C#代码操作方案
- 设置EngineeringUnits属性
首先要完成上述XML修改后重新编译生成服务器代码,此时EngineeringUnits节点就会被初始化,不再为空,直接赋值即可。如果仍然出现空引用的问题,可以手动补全节点初始化逻辑:
// 节点初始化兜底逻辑 if (Server.Motor.Speed.EngineeringUnits == null) { Server.Motor.Speed.EngineeringUnits = new PropertyState<EUInformation>(Server.Motor.Speed); Server.Motor.Speed.EngineeringUnits.NodeId = new NodeId($"{Server.Motor.Speed.NamespaceIndex}.Speed.EngineeringUnits", Server.Motor.Speed.NamespaceIndex); Server.Motor.Speed.EngineeringUnits.BrowseName = new QualifiedName("EngineeringUnits", Server.Motor.Speed.NamespaceIndex); Server.Motor.Speed.EngineeringUnits.DisplayName = "EngineeringUnits"; Server.Motor.Speed.EngineeringUnits.AccessLevel = AccessLevels.CurrentRead; Server.Motor.Speed.AddChild(Server.Motor.Speed.EngineeringUnits); } // 赋值 Server.Motor.Speed.EngineeringUnits.Value = new EUInformation("rad", "radiants", "http://www.opcfoundation.org/UA/units/un/cefact");
- 禁用EURange操作
已经在XML中设置为可选的情况下,不对EURange赋值即可实现隐藏;如果需要完全移除节点,可以调用以下代码:
Server.Motor.Speed.RemoveChild(Server.Motor.Speed.EURange); Server.Motor.Speed.EURange = null;
内容的提问来源于stack exchange,提问作者matf4
相关产品推荐
相关产品推荐

