You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 14:54:03