[英]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.