RMVL  2.2.0-dev
Robotic Manipulation and Vision Library
载入中...
搜索中...
未找到
samples/opcua/opcua_server.cpp

OPC UA 服务器例程

OPC UA 服务器例程

#include <csignal>
using namespace rm;
Server server(4840);
static void onHandle(int) { server.shutdown(); }
static void clearSreen()
{
#ifdef _WIN32
int ch = system("cls");
#else
int ch = system("clear");
#endif
if (ch == -1)
{
printf("\033[2J");
printf("\033[0;0H");
}
}
static void resetCursor()
{
printf("\033[10;0H");
fflush(stdout);
}
static void show()
{
constexpr const char *data = " ┌────────────────┬────────────────┬────────────────┬────────────────┐\n"
" │ NodeId │ DisplayName │ BrowseName │ Value │\n"
" ├────────────────┼────────────────┼────────────────┼────────────────┤\n"
" │ │ │ │ │\n"
" ├────────────────┼────────────────┼────────────────┼────────────────┤\n"
" │ │ │ │ │\n"
" ├────────────────┼────────────────┼────────────────┼────────────────┤\n"
" │ │ │ │ │\n"
" └────────────────┴────────────────┴────────────────┴────────────────┘\n";
printf("%s", data);
}
static std::string nodestr(const NodeId &node) { return "ns=" + std::to_string(node.ns) + "," + "s=" + std::to_string(node.id); }
static void update(int row, int col, std::string_view msg)
{
if (row < 1 || row > 3 || col < 1 || col > 4)
return;
constexpr int width = 14;
int size = msg.size();
if (size > width)
{
msg = msg.substr(0, width);
size = width;
}
int real_row = 2 * row + 2;
int real_col = 17 * col - 12;
int padding = (width - size) / 2;
printf("\033[%d;%dH", real_row, real_col);
printf("%*s%s%*s", padding, "", msg.data(), padding + (width - size) % 2, "");
resetCursor();
}
int main()
{
signal(SIGINT, onHandle);
clearSreen();
show();
Variable value_1 = 42;
value_1.display_name = "Value 1";
value_1.browse_name = "value_1";
Variable value_2 = 3.14;
value_2.display_name = "Value 2";
value_2.browse_name = "value_2";
std::string last_call = "-- None --";
Method add = [&](ServerView, const Variables &iargs) -> std::pair<bool, Variables> {
int num1 = iargs[0], num2 = iargs[1];
int res = num1 + num2;
last_call = "Result: " + std::to_string(res);
return {true, {res}};
};
add.display_name = "Add";
add.browse_name = "add";
add.iargs = {{"num1", tpInt32}, {"num2", tpInt32}};
add.oargs = {{"result", tpInt32}};
auto nd_value_1 = server.addVariableNode(value_1);
auto nd_value_2 = server.addVariableNode(value_2);
auto nd_add = server.addMethodNode(add);
update(1, 1, nodestr(nd_value_1));
update(1, 2, value_1.display_name);
update(1, 3, value_1.browse_name);
update(2, 1, nodestr(nd_value_2));
update(2, 2, value_2.display_name);
update(2, 3, value_2.browse_name);
update(3, 1, nodestr(nd_add));
update(3, 2, add.display_name);
update(3, 3, add.browse_name);
rm::ServerTimer timer(server, 50, [&](ServerView sv) {
auto value_1 = sv.read(sv.find("value_1"));
update(1, 4, std::to_string(value_1.cast<int>()));
auto value_2 = sv.read(sv.find("value_2"));
update(2, 4, std::to_string(value_2.cast<double>()));
update(3, 4, last_call);
});
server.spin();
resetCursor();
return 0;
}
OPC UA 方法
定义 method.hpp:48
std::vector< Argument > iargs
传入参数列表
定义 method.hpp:81
std::string browse_name
浏览名称 BrowseName
定义 method.hpp:66
std::string display_name
展示名称 DisplayName
定义 method.hpp:75
std::vector< Argument > oargs
传出参数列表
定义 method.hpp:84
OPC UA 节点 ID
定义 utilities.hpp:42
uint32_t id
节点号
定义 utilities.hpp:88
uint16_t ns
命名空间
定义 utilities.hpp:87
OPC UA 服务器定时器
定义 server.hpp:349
OPC UA 服务器视图
定义 server.hpp:31
Variable read(const NodeId &nd) const
从指定的变量节点读数据
NodeId find(std::string_view browse_path, const NodeId &src_nd=nodeObjectsFolder) const noexcept
通过 BrowseName 的路径搜索命名空间 ns 为 1 的节点
OPC UA 服务器
定义 server.hpp:128
OPC UA 变量
定义 variable.hpp:132
static Tp cast(const rm::Variable &val)
将变量节点转化为指定类型的数据
定义 variable.hpp:200
std::string browse_name
浏览名称 BrowseName
定义 variable.hpp:255
std::string display_name
展示名称 DisplayName
定义 variable.hpp:264
consteval std::size_t size(auto &&...args)
获取指定类型的成员个数
定义 util.hpp:320
constexpr DataType tpInt32
数据类型:Int32
定义 utilities.hpp:148
std::vector< Variable > Variables
变量列表别名
定义 variable.hpp:302
定义 datastruct.hpp:20
OPC UA 服务器