| RMVL 2.3.0 Robotic Manipulation and Vision Library

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

OPC UA 服务器 更多...

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

类 rm::Server 继承关系图:
rm::Server 的协作图:

## Public 类型
using | ValueCallbackWrapper = std::pair<ValueCallbackBeforeRead, ValueCallbackAfterWrite>
using | DataSourceCallbackWrapper = std::pair<DataSourceRead, DataSourceWrite>

## Public 成员函数
| Server (uint16_t port, std::string_view name={}, const std::vector< UserConfig > &users={})
| 创建 OPC UA 服务器
| Server (UA_StatusCode(*on_config)(UA_Server *), uint16_t port, std::string_view name={}, const std::vector< UserConfig > &users={})
| 从服务器配置函数指针创建 OPC UA 服务器
| operator ServerView () const
void | spin ()
| 启动服务器并阻塞
void | spinOnce ()
| 单次处理网络层中的重复回调和事件（单次启动服务器）
void | shutdown ()
| 停止服务器
| ~Server ()
FindNodeInServer | 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` 的节点
NodeId | addVariableTypeNode (const VariableType &vtype)
| 添加变量类型节点 VariableTypeNode 至 `BaseDataVariableType` 中
NodeId | addVariableNode (const Variable &val, const NodeId &parent_nd=nodeObjectsFolder) noexcept
| 添加变量节点 VariableNode 至指定父节点中，并指定引用类型
bool | addVariableNodeValueCallback (NodeId nd, ValueCallbackBeforeRead before_read, ValueCallbackAfterWrite after_write) noexcept
| 为既有的变量节点 VariableNode 添加值回调
NodeId | addDataSourceVariableNode (const DataSourceVariable &val, NodeId parent_nd=nodeObjectsFolder) noexcept
| 添加数据源变量节点 VariableNode 至指定父节点中
Variable | read (const NodeId &node) const
| 从指定的变量节点读数据
bool | write (const NodeId &node, const Variable &val)
| 给指定的变量节点写数据
NodeId | addMethodNode (const Method &method, const NodeId &parent_nd=nodeObjectsFolder)
| 添加方法节点 MethodNode 至指定父节点中
bool | setMethodNodeCallBack (const NodeId &nd, MethodCallback on_method)
| 为既有的方法节点 MethodNode 设置方法的回调函数
NodeId | addObjectTypeNode (const ObjectType &otype)
| 添加对象类型节点 ObjectTypeNode 至 `rm::nodeBaseObjectType` 中
NodeId | addObjectNode (const Object &obj, NodeId parent_nd=nodeObjectsFolder)
| 添加对象节点 ObjectNode 至指定的父节点中
NodeId | addViewNode (const View &view)
| 添加视图节点 ViewNode 至 `rm::nodeViewsFolder` 中
NodeId | addEventTypeNode (const EventType &etype)
| 添加事件类型至 `BaseEventType` 中
bool | triggerEvent (const Event &event) const
| 创建并触发事件

## Protected 属性
UA_Server * | _server
| OPC UA 服务器指针
std::atomic_bool | _running {}
| 服务器运行状态

## 详细描述

OPC UA 服务器

示例
  samples/opcua/opcua_server.cpp.

## 成员类型定义说明

## ◆ DataSourceCallbackWrapper

using rm::Server::DataSourceCallbackWrapper = std::pair<DataSourceRead, DataSourceWrite>

## ◆ ValueCallbackWrapper

using rm::Server::ValueCallbackWrapper = std::pair<ValueCallbackBeforeRead, ValueCallbackAfterWrite>

## 构造及析构函数说明

## ◆ Server() [1/2]

rm::Server::Server | ( | uint16_t | port,
|  | std::string_view | name = {},
|  | const std::vector< UserConfig > & | users = {} )

Python:
| rm.Server( | port[, name[, users]] | ) -> | <Server object>

创建 OPC UA 服务器

参数

  [in] | port | OPC UA 服务器端口号，一般设置为 `4840U`
  [in] | name | OPC UA 服务器名称，为空则采用默认值 `open62541-based OPC UA Application`
  [in] | users | 用户列表

参见
  UserConfig

## ◆ Server() [2/2]

rm::Server::Server | ( | UA_StatusCode(* | on_config )(UA_Server *),
|  | uint16_t | port,
|  | std::string_view | name = {},
|  | const std::vector< UserConfig > & | users = {} )

Python:
| rm.Server( | port[, name[, users]] | ) -> | <Server object>

从服务器配置函数指针创建 OPC UA 服务器

- 服务器配置函数指针需提供 `*.xml` 文件，并由 `nodeset_compiler` 生成
- 关于 `*.xml` 文件的编写，参考 4.2 从 XML 配置 OPC UA

参数

  [in] | on_config | 由 `nodeset_compiler` 生成的服务器配置函数指针
  [in] | port | OPC UA 服务器端口号，一般设置为 `4840U`
  [in] | name | OPC UA 服务器名称，为空则采用默认值 `open62541-based OPC UA Application`
  [in] | users | 用户列表

参见
  UserConfig

## ◆ ~Server()

rm::Server::~Server | ( |  | ) |

## 成员函数说明

## ◆ addDataSourceVariableNode()

NodeId rm::Server::addDataSourceVariableNode | ( | const DataSourceVariable & | val,
|  | NodeId | parent_nd = nodeObjectsFolder )
| noexcept

Python:
| rm.Server.addDataSourceVariableNode( | val[, parent_nd] | ) -> | nd

添加数据源变量节点 VariableNode 至指定父节点中

参见
  DataSourceVariable

参数

  [in] | val | `rm::DataSourceVariable` 表示的数据源变量
  [in] | parent_nd | 指定父节点的 `NodeId`，默认为 `rm::nodeObjectsFolder`

返回
  添加至服务器后，对应数据源变量节点的唯一标识 `NodeId`

## ◆ addEventTypeNode()

NodeId rm::Server::addEventTypeNode | ( | const EventType & | etype | ) |

Python:
| rm.Server.addEventTypeNode( | etype | ) -> | nd

添加事件类型至 `BaseEventType` 中

参数

  [in] | etype | `rm::EventType` 表示的事件类型

返回
  添加至服务器后，对应事件类型的唯一标识 `NodeId`

## ◆ addMethodNode()

NodeId rm::Server::addMethodNode | ( | const Method & | method,
|  | const NodeId & | parent_nd = nodeObjectsFolder )

Python:
| rm.Server.addMethodNode( | method[, parent_nd] | ) -> | nd

添加方法节点 MethodNode 至指定父节点中

参数

  [in] | method | `rm::Method` 表示的方法
  [in] | parent_nd | 指定父节点的 `NodeId`，默认为 `rm::nodeObjectsFolder`

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

## ◆ addObjectNode()

NodeId rm::Server::addObjectNode | ( | const Object & | obj,
|  | NodeId | parent_nd = nodeObjectsFolder )

Python:
| rm.Server.addObjectNode( | obj[, parent_nd] | ) -> | nd

添加对象节点 ObjectNode 至指定的父节点中

参数

  [in] | obj | `rm::Object` 表示的对象
  [in] | parent_nd | 指定的父节点 `NodeId`，默认为 `rm::nodeObjectsFolder`

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

## ◆ addObjectTypeNode()

NodeId rm::Server::addObjectTypeNode | ( | const ObjectType & | otype | ) |

Python:
| rm.Server.addObjectTypeNode( | otype | ) -> | nd

添加对象类型节点 ObjectTypeNode 至 `rm::nodeBaseObjectType` 中

参数

  [in] | otype | `rm::ObjectType` 表示的对象类型

返回
  添加至服务器后，对应对象类型节点的唯一标识 `NodeId`

## ◆ addVariableNode()

NodeId rm::Server::addVariableNode | ( | const Variable & | val,
|  | const NodeId & | parent_nd = nodeObjectsFolder )
| noexcept

Python:
| rm.Server.addVariableNode( | val[, parent_nd] | ) -> | nd

添加变量节点 VariableNode 至指定父节点中，并指定引用类型

参数

  [in] | val | `rm::Variable` 表示的变量
  [in] | parent_nd | 指定父节点的 `NodeId`，默认为 `rm::nodeObjectsFolder`

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

## ◆ addVariableNodeValueCallback()

bool rm::Server::addVariableNodeValueCallback | ( | NodeId | nd,
|  | ValueCallbackBeforeRead | before_read,
|  | ValueCallbackAfterWrite | after_write )
| noexcept

Python:
| rm.Server.addVariableNodeValueCallback( | nd, before_read, after_write | ) -> | <success ?>

为既有的变量节点 VariableNode 添加值回调

值回调表示在对 服务器中的 变量节点进行读写的时候，会在读之前执行 `beforeRead`，在写之后执行 `afterWrite`

参数

  [in] | nd | 既有的变量节点的 `NodeId`，因变量节点可能位于任意一个父节点下，因此可以使用 路径搜索 进行查找
  [in] | before_read | `ValueCallBackBeforeRead` 可调用对象
  [in] | after_write | `ValueCallBackAfterWrite` 可调用对象

返回
  是否添加成功

## ◆ addVariableTypeNode()

NodeId rm::Server::addVariableTypeNode | ( | const VariableType & | vtype | ) |

Python:
| rm.Server.addVariableTypeNode( | vtype | ) -> | nd

添加变量类型节点 VariableTypeNode 至 `BaseDataVariableType` 中

参数

  [in] | vtype | `rm::VariableType` 表示的变量

返回
  添加至服务器后，对应变量类型节点的唯一标识 `NodeId`

## ◆ addViewNode()

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

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

添加视图节点 ViewNode 至 `rm::nodeViewsFolder` 中

参数

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

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

## ◆ find()

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

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

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

参数

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

返回
  节点 ID

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

## ◆ node()

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

获取路径搜索必要信息

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

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

参数

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

返回
  目标节点信息

返回值

  fnis | `[_client, browse_name]` 元组

## ◆ operator ServerView()

rm::Server::operator ServerView | ( |  | ) | const
| inline

## ◆ read()

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

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

从指定的变量节点读数据

参数

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

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

函数调用图:

## ◆ setMethodNodeCallBack()

bool rm::Server::setMethodNodeCallBack | ( | const NodeId & | nd,
|  | MethodCallback | on_method )

Python:
| rm.Server.setMethodNodeCallBack( | nd, on_method | ) -> | <success ?>

为既有的方法节点 MethodNode 设置方法的回调函数

参数

  [in] | nd | 既有的方法节点的 `NodeId`，因方法节点可能位于任意一个父节点下，因此可以使用 路径搜索 进行查找
  [in] | on_method | `MethodCallback` 可调用对象

返回
  是否设置成功

## ◆ shutdown()

void rm::Server::shutdown | ( |  | ) |
| inline

Python:
| rm.Server.shutdown( |  | ) -> | None

停止服务器

## ◆ spin()

void rm::Server::spin | ( |  | ) |

启动服务器并阻塞

注解
  - 当 `rm::para::opcua_param.SERVER_WAIT` 为 `false` 时，该函数会立即返回，因此可在多线程环境下使用
  - 创建单线程事件循环，并在此事件循环中不断处理网络事件

## ◆ spinOnce()

void rm::Server::spinOnce | ( |  | ) |

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

单次处理网络层中的重复回调和事件（单次启动服务器）

注解
  - 当 `rm::para::opcua_param.SERVER_WAIT` 为 `false` 时，该函数会立即返回，因此可在多线程环境下使用
  - 这一部分可以在事件驱动的单线程架构中由外部主循环驱动

## ◆ triggerEvent()

bool rm::Server::triggerEvent | ( | const Event & | event | ) | const

Python:
| rm.Server.triggerEvent( | event | ) -> | <success ?>

创建并触发事件

参数

  [in] | event | `rm::Event` 表示的事件

返回
  是否创建并触发成功？

## ◆ write()

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

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

给指定的变量节点写数据

参数

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

返回
  是否写入成功

函数调用图:

## 类成员变量说明

## ◆ _running

std::atomic_bool rm::Server::_running {}
| protected

服务器运行状态

## ◆ _server

UA_Server* rm::Server::_server
| protected

OPC UA 服务器指针

该类的文档由以下文件生成:

- rmvl/opcua/server.hpp