抱歉,对于 UA_NodeId_parse
的使用方式有误。以下是修正后的代码示例:
#include <iostream>
#include "open62541/client_config_default.h"
#include "open62541/client_highlevel.h"
class OPCUAClient {
public:
OPCUAClient(const std::string& serverUrl) : serverUrl(serverUrl) {
client = UA_Client_new();
UA_ClientConfig_setDefault(UA_Client_getConfig(client));
}
~OPCUAClient() {
UA_Client_disconnect(client);
UA_Client_delete(client);
}
bool connect() {
UA_StatusCode status = UA_Client_connect(client, serverUrl.c_str());
if (status != UA_STATUSCODE_GOOD) {
std::cout << "连接到服务器失败" << std::endl;
return false;
}
return true;
}
void disconnect() {
UA_Client_disconnect(client);
}
bool addNode(const std::string& nodeName, const std::string& parentNodeId) {
// 创建节点配置对象
UA_NodeId parentNodeIdParsed = UA_NODEID_STRING_ALLOC(1, parentNodeId.c_str());
// 设置新节点的属性
UA_VariableAttributes attr;
UA_VariableAttributes_init(&attr);
attr.displayName = UA_LOCALIZEDTEXT("en-US", nodeName.c_str());
attr.description = UA_LOCALIZEDTEXT("en-US", "This is a new node");
// TODO: 根据需求设置其他属性
// 添加新节点
UA_NodeId newNodeId;
if (UA_Client_addVariableNode(
client,
parentNodeIdParsed,
UA_NODEID_NUMERIC(0, 0),
UA_QUALIFIEDNAME(1, nodeName.c_str()),
UA_NODEID_NUMERIC(0, 0),
attr,
NULL,
&newNodeId) == UA_STATUSCODE_GOOD) {
std::cout << "添加节点成功" << std::endl;
UA_NodeId_deleteMembers(&newNodeId);
return true;
} else {
std::cout << "添加节点失败" << std::endl;
return false;
}
}
private:
std::string serverUrl; // OPC UA 服务器地址
UA_Client* client; // OPC UA 客户端对象
};
int main() {
std::string serverUrl = "opc.tcp://localhost:4840"; // OPC UA 服务器地址
OPCUAClient opcuaClient(serverUrl);
if (opcuaClient.connect()) {
if (opcuaClient.addNode("MyNode", "ns=2;i=1234")) {
// 添加节点成功,进行其他操作...
}
opcuaClient.disconnect();
}
return 0;
}
在代码中使用 UA_NODEID_STRING_ALLOC
函数将字符串格式的父节点 ID 解析为 UA_NodeId
类型。这样可以正确地解析和使用节点 ID。同样,请确保编译时链接了 open62541
库,并根据需要进行修改和扩展。
内容由零声教学AI助手提供,问题来源于学员提问