| RMVL 2.4.0 Robotic Manipulation and Vision Library

载入中...
搜索中...
未找到
Public 成员函数 | 所有成员列表
rm::OpcuaClient类 参考
OPC UA 模块

OPC UA 客户端 更多...

`#include <rmvl/opcua/client.hpp>`

rm::OpcuaClient 的协作图:

## Public 成员函数
| OpcuaClient (std::string_view address, const UserConfig &user={})
| 创建新的客户端对象，并建立连接
| ~OpcuaClient ()
| 断开与服务器的连接，并释放资源
| operator OpcuaClientView () const
bool | ok () const
| 是否成功创建客户端并成功连接到服务器
void | spin () const
| 在网络上监听并处理到达的异步响应，同时进行内部维护、安全通道的更新和订阅管理
void | spinOnce () const
| 在网络上监听并处理到达的异步响应，同时进行内部维护、安全通道的更新和订阅管理
bool | shutdown ()
| 断开与服务器的连接
FindNodeInClient | node (std::string_view browse_name, uint16_t ns=1U) const
| 获取路径搜索必要信息
NodeId | find (std::string_view browse_path, const NodeId &src_nd=nodeObjectsFolder) const noexcept
| 通过 BrowseName 的路径搜索命名空间 ns 为 1 的节点
Variable | read (const NodeId &node) const
| 从指定的变量节点读数据
bool | write (const NodeId &node, const Variable &val) const
| 给指定的变量节点写数据
std::pair< bool, Variables > | call (const NodeId &obj_nd, std::string_view name, const Variables &inputs) const
| 在客户端调用指定对象节点中的方法
template<typename... Args>
std::pair< bool, Variables > | callx (const NodeId &obj_nd, std::string_view name, Args &&...args) const
| 直接以底层数据调用指定对象节点中的方法
std::pair< bool, Variables > | call (std::string_view name, const Variables &inputs) const
| 在客户端调用 ObjectsFolder 中的方法
template<typename... Args>
std::pair< bool, Variables > | callx (std::string_view name, Args &&...args) const
| 直接以底层数据调用 ObjectsFolder 中的方法
std::pair< bool, Variables > | findcall (std::string_view name, const Variables &inputs) const
| 支持路径搜索的调用方法
template<typename... Args>
std::pair< bool, Variables > | findcallx (std::string_view name, Args &&...args) const
| 支持路径搜索的调用方法
NodeId | addViewNode (const View &view) const
| 添加 OPC UA 视图节点 ViewNode 至 ViewsFolder 中
bool | monitor (NodeId nd, DataChangeNotificationCallback on_change, uint32_t q_size=10)
| 创建变量节点监视项，以实现订阅节点的功能
bool | monitor (const std::vector< std::string > &names, EventNotificationCallback on_event)
| 创建事件监视项，以实现事件的订阅功能
bool | remove (NodeId nd)
| 移除监视项

## 详细描述

OPC UA 客户端

示例
  samples/opcua/opcua_client.cpp.

## 构造及析构函数说明

## ◆ OpcuaClient()

rm::OpcuaClient::OpcuaClient | ( | std::string_view | address,
|  | const UserConfig & | user = {} )

Python:
| rm.OpcuaClient( | address[, user] | ) -> | <OpcuaClient object>

创建新的客户端对象，并建立连接

参数

  [in] | address | 连接地址，形如 opc.tcp://127.0.0.1:4840
  [in] | user | 用户信息

## ◆ ~OpcuaClient()

rm::OpcuaClient::~OpcuaClient | ( |  | ) |

断开与服务器的连接，并释放资源

## 成员函数说明

## ◆ addViewNode()

NodeId rm::OpcuaClient::addViewNode | ( | const View & | view | ) | const

Python:
| rm.OpcuaClient.addViewNode( | view | ) -> | nd

添加 OPC UA 视图节点 ViewNode 至 ViewsFolder 中

参数

  [in] | view | rm::View 表示的视图

返回
  添加至服务器后，对应视图节点的唯一标识 NodeId

## ◆ call() [1/2]

std::pair< bool, Variables > rm::OpcuaClient::call | ( | const NodeId & | obj_nd,
|  | std::string_view | name,
|  | const Variables & | inputs ) const

Python:
| rm.OpcuaClient.call( | obj_nd, name, inputs | ) -> | res, outputs
| rm.OpcuaClient.call( | name, inputs | ) -> | res, outputs

在客户端调用指定对象节点中的方法

参数

  [in] | obj_nd | 对象节点
  [in] | name | 方法名
  [in] | inputs | 输入参数列表

返回值

  res | 调用是否成功
  oargs | 输出参数列表

返回
  是否成功完成当前操作，以及输出参数列表

示例
  samples/opcua/opcua_client.cpp.

## ◆ call() [2/2]

std::pair< bool, Variables > rm::OpcuaClient::call | ( | std::string_view | name,
|  | const Variables & | inputs ) const
| inline

Python:
| rm.OpcuaClient.call( | obj_nd, name, inputs | ) -> | res, outputs
| rm.OpcuaClient.call( | name, inputs | ) -> | res, outputs

在客户端调用 ObjectsFolder 中的方法

参数

  [in] | name | 方法名 browse_name
  [in] | inputs | 输入参数列表

返回值

  res | 调用是否成功
  oargs | 输出参数列表

返回
  是否成功完成当前操作，以及输出参数列表

函数调用图:

## ◆ callx() [1/2]

template<typename... Args>

std::pair< bool, Variables > rm::OpcuaClient::callx | ( | const NodeId & | obj_nd,
|  | std::string_view | name,
|  | Args &&... | args ) const
| inline

直接以底层数据调用指定对象节点中的方法

参数

  [in] | obj_nd | 对象节点
  [in] | name | 方法名
  [in] | args | 方法的所有传入参数

返回值

  res | 调用是否成功
  oargs | 输出参数列表

返回
  是否成功完成当前操作，以及输出参数列表

函数调用图:

## ◆ callx() [2/2]

template<typename... Args>

std::pair< bool, Variables > rm::OpcuaClient::callx | ( | std::string_view | name,
|  | Args &&... | args ) const
| inline

直接以底层数据调用 ObjectsFolder 中的方法

参数

  [in] | name | 方法名 browse_name
  [in] | args | 方法的所有传入参数

返回值

  res | 调用是否成功
  oargs | 输出参数列表

返回
  是否成功完成当前操作，以及输出参数列表

函数调用图:

## ◆ find()

NodeId rm::OpcuaClient::find | ( | std::string_view | browse_path,
|  | const NodeId & | src_nd = nodeObjectsFolder ) const
| noexcept

Python:
| rm.OpcuaClient.find( | browse_path[, src_nd] | ) -> | nd

通过 BrowseName 的路径搜索命名空间 ns 为 1 的节点

参数

  [in] | browse_path | BrowseName 路径，使用 / 分隔
  [in] | src_nd | 源节点 ID，默认为 rm::nodeObjectsFolder

返回
  节点 ID

auto node = cli.find("person/name", src_nd);
// 等效于 auto node = src_nd | cli.node("person") | cli.node("name");
rm::OpcuaClient::node
FindNodeInClient node(std::string_view browse_name, uint16_t ns=1U) const
获取路径搜索必要信息
定义 client.hpp:174

示例
  samples/opcua/opcua_client.cpp.

## ◆ findcall()

std::pair< bool, Variables > rm::OpcuaClient::findcall | ( | std::string_view | name,
|  | const Variables & | inputs ) const

Python:
| rm.OpcuaClient.findcall( | name, inputs | ) -> | res, outputs

支持路径搜索的调用方法

参数

  [in] | name | 方法名 browse_name 的完整路径，使用 / 分隔，例如 person/set_age
  [in] | inputs | 输入参数列表

返回值

  res | 调用是否成功
  oargs | 输出参数列表

返回
  是否成功完成当前操作，以及输出参数列表
  // 例如调用 ObjectsFolder 下 person 节点的 set_age 方法，注意这里的 person 是 BrowseName
  auto [res, outputs] = cli.findcall("person/set_age", {18});

## ◆ findcallx()

template<typename... Args>

std::pair< bool, Variables > rm::OpcuaClient::findcallx | ( | std::string_view | name,
|  | Args &&... | args ) const
| inline

支持路径搜索的调用方法

参数

  [in] | name | 方法名 browse_name 的完整路径，使用 / 分隔，例如 person/set_age
  [in] | args | 方法的所有传入参数

返回值

  res | 调用是否成功
  oargs | 输出参数列表

返回
  是否成功完成当前操作，以及输出参数列表
  // 例如调用 ObjectsFolder 下 person 节点的 set_age 方法，注意这里的 person 是 BrowseName
  auto [res, outputs] = cli.findcallx("person/set_age", 18);

函数调用图:

## ◆ monitor() [1/2]

bool rm::OpcuaClient::monitor | ( | const std::vector< std::string > & | names,
|  | EventNotificationCallback | on_event )

Python:
| rm.OpcuaClient.monitor( | nd, on_change[, q_size] | ) -> | <success ?>
| rm.OpcuaClient.monitor( | names, on_event | ) -> | <success ?>

创建事件监视项，以实现事件的订阅功能

参数

  [in] | names | 关注的事件属性名列表，参考 Event::data()
  [in] | on_event | 事件回调函数

返回
  事件监视创建成功？

## ◆ monitor() [2/2]

bool rm::OpcuaClient::monitor | ( | NodeId | nd,
|  | DataChangeNotificationCallback | on_change,
|  | uint32_t | q_size = 10 )

Python:
| rm.OpcuaClient.monitor( | nd, on_change[, q_size] | ) -> | <success ?>
| rm.OpcuaClient.monitor( | names, on_event | ) -> | <success ?>

创建变量节点监视项，以实现订阅节点的功能

- 服务器在设定的采样频率 opcua_param.SAMPLING_INTERVAL 下监视变量，若发生更改会尝试发出通知，通知的发送频率受到 opcua_param.PUBLISHING_INTERVAL 控制。当客户端收到通知时，执行 on_change 回调函数
- 类似于 ROS 中的订阅话题，这里是订阅变量节点

参数

  [in] | nd | 待监视节点的 NodeId
  [in] | on_change | 数据变更可调用对象
  [in] | q_size | 通知存放的队列大小，若队列已满，新的通知会覆盖旧的通知，默认为 10

返回
  变量节点监视创建成功？

## ◆ node()

FindNodeInClient rm::OpcuaClient::node | ( | std::string_view | browse_name,
|  | uint16_t | ns = 1U ) const
| inline

获取路径搜索必要信息

需要配合管道运算符 | 完成路径搜索

auto dst_mode = src_node | cli.node("person") | cli.node("name");

参数

  [in] | browse_name | 浏览名
  [in] | ns | 命名空间索引，默认为 1

返回
  目标节点信息

返回值

  fnic | [_client, browse_name] 元组

## ◆ ok()

bool rm::OpcuaClient::ok | ( |  | ) | const
| inline

Python:
| rm.OpcuaClient.ok( |  | ) -> | <Is Connected ?>

是否成功创建客户端并成功连接到服务器

示例
  samples/opcua/opcua_client.cpp.

## ◆ operator OpcuaClientView()

rm::OpcuaClient::operator OpcuaClientView | ( |  | ) | const
| inline

## ◆ read()

Variable rm::OpcuaClient::read | ( | const NodeId & | node | ) | const

Python:
| rm.OpcuaClient.read( | node | ) -> | val

从指定的变量节点读数据

参数

  [in] | node | 既存的变量节点的 NodeId

返回
  读出的用 rm::Variable 表示的数据，未成功读取则返回空

示例
  samples/opcua/opcua_client.cpp.

函数调用图:

## ◆ remove()

bool rm::OpcuaClient::remove | ( | NodeId | nd | ) |

Python:
| rm.OpcuaClient.remove( | nd | ) -> | <success ?>

移除监视项

参数

  [in] | nd | 待移除监视项的节点号

返回
  是否成功移除监视项

## ◆ shutdown()

bool rm::OpcuaClient::shutdown | ( |  | ) |

Python:
| rm.OpcuaClient.shutdown( |  | ) -> | <success ?>

断开与服务器的连接

## ◆ spin()

void rm::OpcuaClient::spin | ( |  | ) | const

在网络上监听并处理到达的异步响应，同时进行内部维护、安全通道的更新和订阅管理

- 执行事件循环，等效于 ROS/ROS2 工具包中的 ros::spin() 以及 rclcpp::spin()

## ◆ spinOnce()

void rm::OpcuaClient::spinOnce | ( |  | ) | const

Python:
| rm.OpcuaClient.spinOnce( |  | ) -> | None

在网络上监听并处理到达的异步响应，同时进行内部维护、安全通道的更新和订阅管理

- 处理当前已到来的事件，等效于 ROS/ROS2 工具包中的 ros::spinOnce() 以及 rclcpp::spin_some()

## ◆ write()

bool rm::OpcuaClient::write | ( | const NodeId & | node,
|  | const Variable & | val ) const

Python:
| rm.OpcuaClient.write( | node, val | ) -> | <success ?>

给指定的变量节点写数据

参数

  [in] | node | 既存的变量节点的 NodeId
  [in] | val | 待写入的数据

返回
  是否写入成功

示例
  samples/opcua/opcua_client.cpp.

函数调用图: