簡體   English   中英

使用 open62541 將值寫入 PLC 標簽

[英]Writing value to PLC tag with open62541

我正在嘗試將布爾值寫入PLC 標記(打開或關閉繼電器),使用 OPC UA 作為客戶端寫入在Siemens 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);

它被拒絕的原因是您嘗試在寫入請求中設置時間戳。 大多數服務器拒絕。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM