首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用open62541方法浏览节点

使用open62541方法浏览节点
EN

Stack Overflow用户
提问于 2019-10-10 05:56:21
回答 2查看 2.7K关注 0票数 1

我想浏览OPC UA服务器上的特定节点,并使用它的方法。我使用open62541堆栈,我想使用一个自定义客户端。我的客户端连接到服务器,然后使用给定的示例浏览某些对象。它向我展示了根文件夹之后的第一层节点--如何找到特定的节点?还是让我浏览到这一点?在open62541项目中是否有一个我看不到的示例文件会打开我的眼睛?

我也找到了"Service_TranslateBrowsePathsToNodeIds“方法,但是我不太确定如何正确地使用它,哪一部分对我来说是有趣的。

举个例子:我想浏览节点"FileSystem",它位于一个比根文件夹更深的层,并且希望使用它的方法createFile。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-10 07:03:10

要调用方法,需要两个节点ids:

  • 包含方法的对象节点id
  • 方法节点id

如果已经具有这些节点ids,则可以立即调用该方法。如果没有,OPC UA通常支持两个获取这些节点ids的选项:

票数 2
EN

Stack Overflow用户

发布于 2022-03-31 15:23:46

经过一些尝试和错误之后,我发现了“魔术”位,可以让它处理服务器命名空间中的节点,例如真实设备,而不是像所有示例中所示的预定义UA节点,如时间戳或服务器状态。下面的代码来自于corpus_generator.c和check_services_view.c文件的Open62541,有两个关键区别:

  • 您不必指定referenceTypeId。
  • 在创建字符串时,将它们放在服务器名称空间中,而不是UA名称空间中(请参见下面的UA_QUALIFIEDNAME_ALLOC )。

下面的函数将接受指向UA_Client的指针和形成节点路径的浏览器名向量,从OPC中的Objects文件夹开始。

代码语言:javascript
复制
Node::Node (UA_Client *client, const std::vector<std::string> &browse_path)
  : m_client (client)
{
  m_id = UA_NODEID_NULL;
  // Search for ID in client
  UA_BrowsePath browsePath;
  UA_BrowsePath_init (&browsePath);

  browsePath.startingNode = UA_NODEID_NUMERIC (0, UA_NS0ID_OBJECTSFOLDER);
  browsePath.relativePath.elements = (UA_RelativePathElement *)UA_Array_new (browse_path.size (), &UA_TYPES[UA_TYPES_RELATIVEPATHELEMENT]);
  browsePath.relativePath.elementsSize = browse_path.size ();

  for (int i = 0; i < browse_path.size (); i++)
  {
    UA_RelativePathElement *elem = &browsePath.relativePath.elements[i];
    elem->targetName = UA_QUALIFIEDNAME_ALLOC (1, browse_path.at (i).c_str ()); // Create in server namespace (1), not UA namespace (0)!
  }

  UA_TranslateBrowsePathsToNodeIdsRequest request;
  UA_TranslateBrowsePathsToNodeIdsRequest_init (&request);
  request.browsePaths = &browsePath;
  request.browsePathsSize = 1;

  UA_TranslateBrowsePathsToNodeIdsResponse response;
  response = UA_Client_Service_translateBrowsePathsToNodeIds (m_client, request);
  if (UA_STATUSCODE_GOOD == response.responseHeader.serviceResult && response.resultsSize > 0)
  {
    UA_BrowsePathResult *first = response.results;
    if (first->targetsSize >= 1)
    {
      m_id = first->targets[0].targetId.nodeId;
      std::cout << "Found ID";
    }
    else
    {
      std::cout << "OK response but no results";
    }
  }
  else
  {
    std::cout << "Error in translate browsename";
  }

  UA_BrowsePath_deleteMembers (&browsePath); // Marked as deprecated, but UA_BrowsePath_delete() expects a heap-allocated pointer.
  UA_TranslateBrowsePathsToNodeIdsResponse_deleteMembers (&response); // Idem
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58316274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档