1#include <open62541/client_config_default.h>
2#include <open62541/client_highlevel.h>
3#include <open62541/plugin/log_stdout.h>
6static UA_Client* client =
nullptr;
8static bool opcuaCreateClient(
const std::string& addr )
10 if( client !=
nullptr )
13 client = UA_Client_new();
15 if( client ==
nullptr )
18 UA_StatusCode retval = UA_ClientConfig_setDefault(UA_Client_getConfig(client));
20 if( retval != UA_STATUSCODE_GOOD )
22 UA_Client_delete(client);
27 retval = UA_Client_connect(client, addr.c_str());
29 if( retval != UA_STATUSCODE_GOOD )
31 UA_Client_delete(client);
39static bool opcuaReconnectClient(
const std::string& addr )
41 if( client ==
nullptr )
44 UA_StatusCode retval = UA_Client_disconnect(client);
46 if( retval != UA_STATUSCODE_GOOD )
49 retval = UA_Client_connect(client, addr.c_str());
51 if( retval != UA_STATUSCODE_GOOD )
69static long opcuaRead( uint16_t nodeId,
const std::string& attrName )
71 if( client ==
nullptr )
75 UA_Variant* val = UA_Variant_new();
76 UA_StatusCode retval = UA_Client_readValueAttribute(client, UA_NODEID_STRING((UA_UInt16)nodeId, (
char*)attrName.c_str()), val);
78 if(retval == UA_STATUSCODE_GOOD && UA_Variant_isScalar(val) &&
79 val->type == &UA_TYPES[UA_TYPES_INT32])
81 value = *(UA_Int32*)val->data;
84 UA_Variant_delete(val);
88static bool opcuaWrite( uint16_t nodeId,
const std::string& attrName,
long value )
90 if( client ==
nullptr )
93 UA_Variant* myVariant = UA_Variant_new();
94 UA_Variant_setScalarCopy(myVariant, &value, &UA_TYPES[UA_TYPES_INT32]);
95 UA_StatusCode retval = UA_Client_writeValueAttribute(client, UA_NODEID_STRING((UA_UInt16)nodeId, (
char*)attrName.c_str()), myVariant);
96 UA_Variant_delete(myVariant);
97 return retval == UA_STATUSCODE_GOOD;
100static bool opcuaWriteBool( uint16_t nodeId,
const std::string& attrName,
bool set )
102 if( client ==
nullptr )
105 UA_Variant* myVariant = UA_Variant_new();
106 UA_Variant_setScalarCopy(myVariant, &set, &UA_TYPES[UA_TYPES_BOOLEAN]);
107 UA_StatusCode retval = UA_Client_writeValueAttribute(client, UA_NODEID_STRING((UA_UInt16)nodeId, (
char*)attrName.c_str()), myVariant);
108 UA_Variant_delete(myVariant);
109 return retval == UA_STATUSCODE_GOOD;
112static bool opcuaReadBool( uint16_t nodeId,
const std::string& attrName )
114 if( client ==
nullptr )
117 UA_Boolean value = 0;
118 UA_Variant* val = UA_Variant_new();
119 UA_StatusCode retval = UA_Client_readValueAttribute(client, UA_NODEID_STRING((UA_UInt16)nodeId, (
char*)attrName.c_str()), val);
121 if(retval == UA_STATUSCODE_GOOD && val->type == &UA_TYPES[UA_TYPES_BOOLEAN])
123 value = *(UA_Boolean*)val->data;
126 UA_Variant_delete(val);
131static float opcuaReadFloat( uint16_t nodeId,
const std::string& attrName )
133 if( client ==
nullptr )
137 UA_Variant* val = UA_Variant_new();
138 UA_StatusCode retval = UA_Client_readValueAttribute(client, UA_NODEID_STRING((UA_UInt16)nodeId, (
char*)attrName.c_str()), val);
140 if(retval == UA_STATUSCODE_GOOD && UA_Variant_isScalar(val) &&
141 val->type == &UA_TYPES[UA_TYPES_FLOAT])
143 value = *(UA_Float*)val->data;
146 UA_Variant_delete(val);
150static bool opcuaWriteFloat( uint16_t nodeId,
const std::string& attrName,
float value )
152 if( client ==
nullptr )
155 UA_Variant* myVariant = UA_Variant_new();
156 UA_Variant_setScalarCopy(myVariant, &value, &UA_TYPES[UA_TYPES_FLOAT]);
157 UA_StatusCode retval = UA_Client_writeValueAttribute(client, UA_NODEID_STRING((UA_UInt16)nodeId, (
char*)attrName.c_str()), myVariant);
158 UA_Variant_delete(myVariant);
159 return retval == UA_STATUSCODE_GOOD;
162static UA_StatusCode opcuaCallBool( uint16_t nodeId,
const std::string& objName,
const std::string& attrName,
bool set )
164 UA_Variant* myVariant = UA_Variant_new();
165 UA_Variant_setScalarCopy(myVariant, &set, &UA_TYPES[UA_TYPES_BOOLEAN]);
167 UA_StatusCode retval = UA_Client_call(client,
168 UA_NODEID_STRING((UA_UInt16)nodeId, (
char*)objName.c_str()),
169 UA_NODEID_STRING((UA_UInt16)nodeId, (
char*)attrName.c_str()),
173 UA_Variant_delete(myVariant);
178static UA_StatusCode opcuaCallInt32( uint16_t nodeId,
const std::string& objName,
const std::string& attrName,
long value )
181 UA_Variant* myVariant = UA_Variant_new();
182 UA_Variant_setScalarCopy(myVariant, &value, &UA_TYPES[UA_TYPES_INT32]);
184 UA_StatusCode retval = UA_Client_call(client,
185 UA_NODEID_STRING((UA_UInt16)nodeId, (
char*)objName.c_str()),
186 UA_NODEID_STRING((UA_UInt16)nodeId, (
char*)attrName.c_str()),
190 UA_Variant_delete(myVariant);
195static UA_StatusCode opcuaCallFloat( uint16_t nodeId,
const std::string& objName,
const std::string& attrName,
float value )
198 UA_Variant* myVariant = UA_Variant_new();
199 UA_Variant_setScalarCopy(myVariant, &value, &UA_TYPES[UA_TYPES_FLOAT]);
201 UA_StatusCode retval = UA_Client_call(client,
202 UA_NODEID_STRING((UA_UInt16)nodeId, (
char*)objName.c_str()),
203 UA_NODEID_STRING((UA_UInt16)nodeId, (
char*)attrName.c_str()),
207 UA_Variant_delete(myVariant);