使用open62541将值写入PLC标记
Writing value to PLC tag with open62541
我正试图将布尔值写入PLC标签(打开或关闭继电器(,使用OPC UA作为客户端写入运行在西门子S7-1512 PLC上的OPC UA服务器。客户端必须在c/c++中实现
我已经尝试了几个不同的GUI客户端,没有出现任何问题。
此外,我还尝试过Python SDK,包括freeopcua。我有一些小问题,但在写入请求中设置了一个属性后,我能够写入值。但对于open62541,我找不到任何解决方案(状态代码很好,但值没有改变我可以读取值(:
Python工作请求:
node.set_attribute(ua.AttributeIds.Value, ua.DataValue(not node.get_value()))
C不工作请求代码如下:
UA_WriteRequest request;
UA_WriteRequest_init(&request);
request.nodesToWrite = UA_WriteValue_new();
request.nodesToWriteSize = 1;
request.nodesToWrite[0].nodeId = UA_NODEID_STRING_ALLOC(3, ""VALUE"");
request.nodesToWrite[0].attributeId = UA_ATTRIBUTEID_VALUE;
request.nodesToWrite[0].value.hasValue = true;
request.nodesToWrite[0].value.value.type = &UA_TYPES[UA_TYPES_BOOLEAN];
request.nodesToWrite[0].value.value.storageType = UA_VARIANT_DATA_NODELETE;
request.nodesToWrite[0].value.hasServerTimestamp = true;
request.nodesToWrite[0].value.hasSourceTimestamp = true;
request.nodesToWrite[0].value.sourceTimestamp = UA_DateTime_now();
request.nodesToWrite[0].value.value.data = val;
request.requestHeader.timestamp = UA_DateTime_now();
request.requestHeader.authenticationToken = UA_NODEID_NUMERIC(0, UA_NS0ID_SESSIONAUTHENTICATIONTOKEN);
//write to client service
UA_WriteResponse wResp = UA_Client_Service_write(client, request);
我希望PLC标签的值被更改为相反的值,或者向我提供为什么它不起作用的信息。
更好地使用客户端高级api:
UA_NodeId nodeid = UA_NODEID_STRING_ALLOC(3, ""VALUE"");
UA_Boolean value = true;
UA_Variant *var= UA_Variant_new();
UA_Variant_setScalarCopy(var, &value, &UA_TYPES[UA_TYPES_BOOLEAN]);
UA_StatusCode ret = UA_Client_writeValueAttribute(client, nodeid, var);
....
UA_Variant_delete(var);
它被拒绝的原因是您试图在写入请求中设置时间戳。大多数服务器拒绝这样做。
相关文章:
- 将依赖名称显式标记为类型名和模板的奇怪之处
- 为什么output_editor Concept不需要output_e迭代器标记
- 标记 '","' 之前的预期主表达式
- 为什么g++在未执行的代码处标记强制转换错误
- muQueue.front() 给出了 const 实例,即使我没有将其标记为 const
- 使用 boost 进行标记化会给出相同的输出
- 为什么 -mmacosx-version-min=10.10 不阻止使用标记为从 10.11 开始的函数?
- 错误 C2760:语法错误:映射迭代器上意外的标记"标识符",预期的";"
- C++标头错误 C2238 意外标记";"
- 语句错误:"","标记之前有"预期的')'
- 编译 llvm 3.1 时,为什么会出现错误:在">"标记之前预期主表达式
- 生成错误 - "." 标记之前的预期主表达式
- 错误:应在"{"标记之前使用"",""或";&qu
- '{'标记之前的预期类名,然后在预声明时无效使用不完整的类型'class class_name'
- 将字符串拆分为标记,并将标记拆分为两个单独的数组
- 无法使用迭代器标记调度实例化模板
- 如何分隔字符串并将标记传递给方法
- SFML:错误:")"标记之前的预期主表达式
- "]"标记之前的预期主要表达式(平分搜索)
- 使用open62541将值写入PLC标记