Создание экземпляра пользовательского узла типа объекта opcua
Нуби-пользователь OPCUA здесь. Я создал пользовательский тип объекта с помощью UA Modeler, который, насколько я понимаю, создает класс пользовательского объекта x со свойствами y. Моя проблема связана с созданием экземпляра узла на моем сервере. Я ищу что-то, что позволило бы мне сделать: Тест узла = новый узел объекта типа x настраиваемый объект. Я знаю, что мог бы воссоздать свой пользовательский объект в коде, но это было бы не очень умно... Я думаю, что это очень простая проблема, но я не могу найти, как это исправить в документации или на серверах. Разве это не путь?
CreateObjectSettings settings = new CreateObjectSettings()
{
// All the settings
TypeDefinitionId = ObjectTypeIds.MyCustomObject,
};
CreateObject(Server.DefaultRequestContext, settings);
Спасибо за помощь :)
1 ответ
Ты на правильном пути.
Вот функция, которую я написал для создания пользовательских объектов на основе переданного типа. Обратите внимание, что вы должны заблокировать узлы и убедиться, что узел еще не существует.
private ObjectNode CreateOpcObject(NodeId parentNodeId, string nodeName, string identifier, uint type,
bool inRootFolder, bool isParentAsOwner, string description = "")
{
ObjectNode newNode = null;
lock (InMemoryNodeLock)
{
if (FindInMemoryNode(new NodeId(identifier, DefaultNamespaceIndex)) == null)
{
if (!inRootFolder && FindInMemoryNode(parentNodeId) == null)
{
log.Warn("Cannot create OPC object because parent node is not found for nodeName {nodeName}, identifier {identifier}.", nodeName, identifier);
return null;
}
var settings = new CreateObjectSettings
{
ParentNodeId = parentNodeId,
ParentAsOwner = isParentAsOwner, // cannot set this to true since it makes deleting much slower
ReferenceTypeId = ReferenceTypeIds.Organizes,
RequestedNodeId = new NodeId(identifier, DefaultNamespaceIndex),
BrowseName = new QualifiedName(nodeName, DefaultNamespaceIndex),
TypeDefinitionId = new NodeId(type, DefaultNamespaceIndex),
DisplayName = nodeName,
Description = description
};
newNode = CreateObject(Server.DefaultRequestContext, settings);
}
else
{
log.Warn("Cannot create OPC object because identifier is not found for nodeName {nodeName}, identifier {identifier}.", nodeName, identifier);
}
}
return newNode;
}
Обратите внимание, что вы можете сделать это вместо того, чтобы просто присвоить типTypeDefinitionId
:
TypeDefinitionId = new NodeId(type, DefaultNamespaceIndex),
Вы вызываете это, делая что-то вроде этого:
var newNode = CreateOpcObject(parentNodeId, newNodeName, newNodeId, Model.ObjectTypes.MyGeneratedType, false, true, "This is a description of the new node object.");