UniSet 2.35.2
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
39static bool opcuaReconnectClient( const std::string& addr )
40{
41 if( client == nullptr )
42 return false;
43
44 UA_StatusCode retval = UA_Client_disconnect(client);
45
46 if( retval != UA_STATUSCODE_GOOD )
47 return false;
48
49 retval = UA_Client_connect(client, addr.c_str());
50
51 if( retval != UA_STATUSCODE_GOOD )
52 {
53 return false;
54 }
55
56 return true;
57}
58
59//static void opcuaDeleteClient()
60//{
61// if( client == nullptr )
62// return;
63//
64// UA_Client_disconnect(client);
65// UA_Client_delete(client);
66// client = nullptr;
67//}
68
69static long opcuaRead( uint16_t nodeId, const std::string& attrName )
70{
71 if( client == nullptr )
72 return 0;
73
74 UA_Int32 value = 0;
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);
77
78 if(retval == UA_STATUSCODE_GOOD && UA_Variant_isScalar(val) &&
79 val->type == &UA_TYPES[UA_TYPES_INT32])
80 {
81 value = *(UA_Int32*)val->data;
82 }
83
84 UA_Variant_delete(val);
85 return value;
86}
87
88static bool opcuaWrite( uint16_t nodeId, const std::string& attrName, long value )
89{
90 if( client == nullptr )
91 return 0;
92
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;
98}
99
100static bool opcuaWriteBool( uint16_t nodeId, const std::string& attrName, bool set )
101{
102 if( client == nullptr )
103 return 0;
104
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;
110}
111
112static bool opcuaReadBool( uint16_t nodeId, const std::string& attrName )
113{
114 if( client == nullptr )
115 return false;
116
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);
120
121 if(retval == UA_STATUSCODE_GOOD && val->type == &UA_TYPES[UA_TYPES_BOOLEAN])
122 {
123 value = *(UA_Boolean*)val->data;
124 }
125
126 UA_Variant_delete(val);
127 return value;
128}
129
130
131static float opcuaReadFloat( uint16_t nodeId, const std::string& attrName )
132{
133 if( client == nullptr )
134 return 0;
135
136 UA_Float value = 0;
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);
139
140 if(retval == UA_STATUSCODE_GOOD && UA_Variant_isScalar(val) &&
141 val->type == &UA_TYPES[UA_TYPES_FLOAT])
142 {
143 value = *(UA_Float*)val->data;
144 }
145
146 UA_Variant_delete(val);
147 return value;
148}
149
150static bool opcuaWriteFloat( uint16_t nodeId, const std::string& attrName, float value )
151{
152 if( client == nullptr )
153 return 0;
154
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;
160}
161
162static UA_StatusCode opcuaCallBool( uint16_t nodeId, const std::string& objName, const std::string& attrName, bool set )
163{
164 UA_Variant* myVariant = UA_Variant_new();
165 UA_Variant_setScalarCopy(myVariant, &set, &UA_TYPES[UA_TYPES_BOOLEAN]);
166
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()),
170 1, myVariant,
171 0, nullptr);
172
173 UA_Variant_delete(myVariant);
174
175 return retval;
176}
177
178static UA_StatusCode opcuaCallInt32( uint16_t nodeId, const std::string& objName, const std::string& attrName, long value )
179{
180
181 UA_Variant* myVariant = UA_Variant_new();
182 UA_Variant_setScalarCopy(myVariant, &value, &UA_TYPES[UA_TYPES_INT32]);
183
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()),
187 1, myVariant,
188 0, nullptr);
189
190 UA_Variant_delete(myVariant);
191
192 return retval;
193}
194
195static UA_StatusCode opcuaCallFloat( uint16_t nodeId, const std::string& objName, const std::string& attrName, float value )
196{
197
198 UA_Variant* myVariant = UA_Variant_new();
199 UA_Variant_setScalarCopy(myVariant, &value, &UA_TYPES[UA_TYPES_FLOAT]);
200
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()),
204 1, myVariant,
205 0, nullptr);
206
207 UA_Variant_delete(myVariant);
208
209 return retval;
210}