- Вопрос или проблема
- Ответ или решение
- Определение типов перечислений (enum) в OPC-UA сервере с использованием библиотеки OPCFoundation.NetStandard.Opc.Ua.Server
- 1. Создание производного класса от CustomNodeManager2
- 2. Метод для добавления перечисления
- 3. Регистрация перечисления в адресном пространстве
- 4. Проверка результатов
- Заключение
Вопрос или проблема
Я использую библиотеку 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
для проверки вашей реализации. При подключении к серверу перечисленные значения будут отображаться по имени, что облегчает их понимание и дальнейшую работу с ними.
Заключение
Создание пользовательских типов перечислений в сервере OPC-UA с использованием библиотеки OPCFoundation.NetStandard.Opc.Ua.Server
требует понимания процесса создания узлов и определения пользовательских типов данных. Пошаговые инструкции, приведенные в этой статье, помогут вам успешно реализовать эту задачу.
Если у вас возникнут какие-либо вопросы или потребуется дополнительная информация, не стесняйтесь обращаться за помощью к документации библиотеки или сообществу разработчиков.