使用 open62541 将值写入 PLC 标签

Posted

技术标签:

【中文标题】使用 open62541 将值写入 PLC 标签【英文标题】:Writing value to PLC tag with open62541 【发布时间】:2020-02-18 18:47:18 【问题描述】:

我正在尝试使用 OPC UA 作为 客户端 将布尔值 写入 到 PLC 标记(打开或关闭继电器)写入运行在 Siemens 上的 OPC UA 服务器S7-1512 PLC。客户端必须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 标记的值更改为相反的值,或者向我提供有关它为什么不起作用的信息。

【问题讨论】:

【参考方案1】:

最好使用客户端高级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);

它被拒绝的原因是你试图在你的写请求中设置时间戳。大多数服务器拒绝这样做。

【讨论】:

以上是关于使用 open62541 将值写入 PLC 标签的主要内容,如果未能解决你的问题,请参考以下文章

从节点属性读取数据类型

open62541:发布温度值

在 Windows 中使用 open62541 构建一个简单的服务器

open62541 浏览节点和使用它的方法

使用 Visual Studio 2017 构建 open62541 DLL

在 Windows 上使用 CMake 构建 open62541 失败