UniSet 2.32.1
client.h
1#include <open62541/client_config_default.h>
2#include <open62541/client_highlevel.h>
3#include <open62541/plugin/log_stdout.h>
4
5
6static UA_Client* client = nullptr;
7
8static bool opcuaCreateClient( const std::string& addr )
9{
10 if( client != nullptr )
11 return true;
12
13 client = UA_Client_new();
14
15 if( client == nullptr )
16 return false;
17
18 UA_StatusCode retval = UA_ClientConfig_setDefault(UA_Client_getConfig(client));
19
20 if( retval != UA_STATUSCODE_GOOD )
21 {
22 UA_Client_delete(client);
23 client = nullptr;
24 return false;
25 }
26
27 retval = UA_Client_connect(client, addr.c_str());
28
29 if( retval != UA_STATUSCODE_GOOD )
30 {
31 UA_Client_delete(client);
32 client = nullptr;
33 return false;
34 }
35
36 return true;
37}
38
39//static void opcuaDeleteClient()
40//{
41// if( client == nullptr )
42// return;
43//
44// UA_Client_disconnect(client);
45// UA_Client_delete(client);
46// client = nullptr;
47//}
48
49static long opcuaRead( uint16_t nodeId, const std::string& attrName )
50{
51 if( client == nullptr )
52 return 0;
53
54 UA_Int32 value = 0;
55 UA_Variant* val = UA_Variant_new();
56 UA_StatusCode retval = UA_Client_readValueAttribute(client, UA_NODEID_STRING((UA_UInt16)nodeId, (char*)attrName.c_str()), val);
57
58 if(retval == UA_STATUSCODE_GOOD && UA_Variant_isScalar(val) &&
59 val->type == &UA_TYPES[UA_TYPES_INT32])
60 {
61 value = *(UA_Int32*)val->data;
62 }
63
64 UA_Variant_delete(val);
65 return value;
66}
67
68static bool opcuaWrite( uint16_t nodeId, const std::string& attrName, long value )
69{
70 if( client == nullptr )
71 return 0;
72
73 UA_Variant* myVariant = UA_Variant_new();
74 UA_Variant_setScalarCopy(myVariant, &value, &UA_TYPES[UA_TYPES_INT32]);
75 UA_StatusCode retval = UA_Client_writeValueAttribute(client, UA_NODEID_STRING((UA_UInt16)nodeId, (char*)attrName.c_str()), myVariant);
76 UA_Variant_delete(myVariant);
77 return retval == UA_STATUSCODE_GOOD;
78}
79
80static bool opcuaWriteBool( uint16_t nodeId, const std::string& attrName, bool set )
81{
82 if( client == nullptr )
83 return 0;
84
85 UA_Variant* myVariant = UA_Variant_new();
86 UA_Variant_setScalarCopy(myVariant, &set, &UA_TYPES[UA_TYPES_BOOLEAN]);
87 UA_StatusCode retval = UA_Client_writeValueAttribute(client, UA_NODEID_STRING((UA_UInt16)nodeId, (char*)attrName.c_str()), myVariant);
88 UA_Variant_delete(myVariant);
89 return retval == UA_STATUSCODE_GOOD;
90}
91
92static bool opcuaReadBool( uint16_t nodeId, const std::string& attrName )
93{
94 if( client == nullptr )
95 return false;
96
97 UA_Boolean value = 0;
98 UA_Variant* val = UA_Variant_new();
99 UA_StatusCode retval = UA_Client_readValueAttribute(client, UA_NODEID_STRING((UA_UInt16)nodeId, (char*)attrName.c_str()), val);
100
101 if(retval == UA_STATUSCODE_GOOD && val->type == &UA_TYPES[UA_TYPES_BOOLEAN])
102 {
103 value = *(UA_Boolean*)val->data;
104 }
105
106 UA_Variant_delete(val);
107 return value;
108}
109
110
111static float opcuaReadFloat( uint16_t nodeId, const std::string& attrName )
112{
113 if( client == nullptr )
114 return 0;
115
116 UA_Float value = 0;
117 UA_Variant* val = UA_Variant_new();
118 UA_StatusCode retval = UA_Client_readValueAttribute(client, UA_NODEID_STRING((UA_UInt16)nodeId, (char*)attrName.c_str()), val);
119
120 if(retval == UA_STATUSCODE_GOOD && UA_Variant_isScalar(val) &&
121 val->type == &UA_TYPES[UA_TYPES_FLOAT])
122 {
123 value = *(UA_Float*)val->data;
124 }
125
126 UA_Variant_delete(val);
127 return value;
128}
129
130static bool opcuaWriteFloat( uint16_t nodeId, const std::string& attrName, float value )
131{
132 if( client == nullptr )
133 return 0;
134
135 UA_Variant* myVariant = UA_Variant_new();
136 UA_Variant_setScalarCopy(myVariant, &value, &UA_TYPES[UA_TYPES_FLOAT]);
137 UA_StatusCode retval = UA_Client_writeValueAttribute(client, UA_NODEID_STRING((UA_UInt16)nodeId, (char*)attrName.c_str()), myVariant);
138 UA_Variant_delete(myVariant);
139 return retval == UA_STATUSCODE_GOOD;
140}
141
142static UA_StatusCode opcuaCallBool( uint16_t nodeId, const std::string& objName, const std::string& attrName, bool set )
143{
144 UA_Variant* myVariant = UA_Variant_new();
145 UA_Variant_setScalarCopy(myVariant, &set, &UA_TYPES[UA_TYPES_BOOLEAN]);
146
147 UA_StatusCode retval = UA_Client_call(client,
148 UA_NODEID_STRING((UA_UInt16)nodeId, (char*)objName.c_str()),
149 UA_NODEID_STRING((UA_UInt16)nodeId, (char*)attrName.c_str()),
150 1, myVariant,
151 0, nullptr);
152
153 UA_Variant_delete(myVariant);
154
155 return retval;
156}
157
158static UA_StatusCode opcuaCallInt32( uint16_t nodeId, const std::string& objName, const std::string& attrName, long value )
159{
160
161 UA_Variant* myVariant = UA_Variant_new();
162 UA_Variant_setScalarCopy(myVariant, &value, &UA_TYPES[UA_TYPES_INT32]);
163
164 UA_StatusCode retval = UA_Client_call(client,
165 UA_NODEID_STRING((UA_UInt16)nodeId, (char*)objName.c_str()),
166 UA_NODEID_STRING((UA_UInt16)nodeId, (char*)attrName.c_str()),
167 1, myVariant,
168 0, nullptr);
169
170 UA_Variant_delete(myVariant);
171
172 return retval;
173}
174
175static UA_StatusCode opcuaCallFloat( uint16_t nodeId, const std::string& objName, const std::string& attrName, float value )
176{
177
178 UA_Variant* myVariant = UA_Variant_new();
179 UA_Variant_setScalarCopy(myVariant, &value, &UA_TYPES[UA_TYPES_FLOAT]);
180
181 UA_StatusCode retval = UA_Client_call(client,
182 UA_NODEID_STRING((UA_UInt16)nodeId, (char*)objName.c_str()),
183 UA_NODEID_STRING((UA_UInt16)nodeId, (char*)attrName.c_str()),
184 1, myVariant,
185 0, nullptr);
186
187 UA_Variant_delete(myVariant);
188
189 return retval;
190}