如何在 OPC-UA 服务器中定义枚举类型?

问题描述 投票:0回答:1

我使用 NuGet 库

OPCFoundation.NetStandard.Opc.Ua.Server
,但找不到任何有关如何创建枚举等自定义类型的简单示例。

.net .net-core opc-ua
1个回答
0
投票

源自

CustomNodeManager2
(我将其命名为
DataAccessNodeManager
)并向其添加以下方法:

private NodeId AddDataType<T>() where T : struct, Enum
{
    var enumFields = Enum
        .GetNames<T>()
        .Zip(Enum.GetValues<T>())
        .Select(item =>
        {
            return new EnumField
            {
                Name = item.First,
                Value = Convert.ToInt32(item.Second)
            };
        })
        .ToArray();

    var enumDefinition = new EnumDefinition { Fields = enumFields };
    var nodeId = new NodeId(++_nodeId, NamespaceIndex);

    var enumType = new DataTypeState()
    {
        NodeId = nodeId,
        BrowseName = typeof(T).Name,
        DisplayName = typeof(T).Name,
        SuperTypeId = DataTypeIds.Enumeration,
        DataTypeDefinition = new ExtensionObject(enumDefinition)
    };
    
    AddPredefinedNode(SystemContext, enumType);

    return nodeId;
}

然后,在您的派生类中,按如下方式使用它:

class DataAccessNodeManager : CustomNodeManager2
{
    public DataAccessNodeManager(IServerInternal server)
        : base(server, ...)
    {
        //
    }

    public override void CreateAddressSpace(IDictionary<NodeId, IList<IReference>> externalReferences)
    {
        lock (Lock)
        {
            var myNodeId = AddDataType<HlbCompressor>();

            // ... add other nodes and use myNodeId for the `DataType` property 
        } 
    }
}

常用的

UaExpert
客户端软件会在其值旁边显示枚举名称:

Enum type definition and usage

© www.soinside.com 2019 - 2024. All rights reserved.