Как я могу определить тип enum на сервере OPC-UA?

Вопрос или проблема

Я использую библиотеку 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>();

            // ... добавьте другие узлы и используйте myNodeId для свойства `DataType` 
        } 
    }
}

Часто используемое клиентское программное обеспечение UaExpert затем показывает имя перечисления рядом с его значением:

Определение и использование типа перечисления

.

Ответ или решение

Определение типов перечислений (enum) в OPC-UA сервере с использованием библиотеки OPCFoundation.NetStandard.Opc.Ua.Server

В данной статье мы рассмотрим, как создать пользовательский тип перечисления (enum) в сервере OPC-UA, используя библиотеку OPCFoundation.NetStandard.Opc.Ua.Server. Эта задача может показаться сложной, особенно если у вас нет богатого опыта работы с этой библиотекой. Ниже приведено детальное пошаговое руководство.

1. Создание производного класса от CustomNodeManager2

Первым шагом является создание класса, производного от CustomNodeManager2. В нашем примере мы назовем его DataAccessNodeManager. Этот класс будет служить основным узлом управления для нашего сервера OPC-UA, и здесь мы реализуем метод для добавления пользовательского типа перечисления.

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

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

            // Здесь вы можете добавить другие узлы и использовать myNodeId для свойства `DataType`.
        } 
    }
}

2. Метод для добавления перечисления

Мы добавим метод AddDataType<T>(), который позволит определять и регистрировать перечисления в адресном пространстве сервера. Метод будет использовать ограничения для типов, чтобы обеспечить сохранение только тех типов, которые являются перечислениями.

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;
}

3. Регистрация перечисления в адресном пространстве

После реализации методов, мы можем зарегистрировать перечисление в адресном пространстве при вызове метода CreateAddressSpace. В данном случае, мы используем перечисление HlbCompressor, которое нужно предварительно определить в вашем коде.

public enum HlbCompressor
{
    Stopped = 0,
    Running = 1,
    Faulted = 2,
    Maintenance = 3
}

4. Проверка результатов

После успешной настройки сервера вы можете использовать клиентское ПО UaExpert для проверки вашей реализации. При подключении к серверу перечисленные значения будут отображаться по имени, что облегчает их понимание и дальнейшую работу с ними.

Enum type definition and usage

Заключение

Создание пользовательских типов перечислений в сервере OPC-UA с использованием библиотеки OPCFoundation.NetStandard.Opc.Ua.Server требует понимания процесса создания узлов и определения пользовательских типов данных. Пошаговые инструкции, приведенные в этой статье, помогут вам успешно реализовать эту задачу.

Если у вас возникнут какие-либо вопросы или потребуется дополнительная информация, не стесняйтесь обращаться за помощью к документации библиотеки или сообществу разработчиков.

Оцените материал
Добавить комментарий

Капча загружается...