我使用 NuGet 库
OPCFoundation.NetStandard.Opc.Ua.Server
,但找不到任何有关如何创建枚举等自定义类型的简单示例。
源自
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
客户端软件会在其值旁边显示枚举名称: