使用 open62541 将值写入 PLC 标签
Writing value to PLC tag with open62541
我正在尝试使用 OPC UA 写入 bool 值到 PLC 标签(打开或关闭继电器)作为 Client 写入 OPC Siemens S7-1512 PLC 上的 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);
它被拒绝的原因是您试图在您的写入请求中设置时间戳。大多数服务器拒绝。
我正在尝试使用 OPC UA 写入 bool 值到 PLC 标签(打开或关闭继电器)作为 Client 写入 OPC Siemens S7-1512 PLC 上的 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);
它被拒绝的原因是您试图在您的写入请求中设置时间戳。大多数服务器拒绝。