[英]name=Bad_NodeIdUnknown, value=0x80340000, quality=bad (opc ua milo WriteExample about the NodeId)
我想通過 opc ua milo 客戶端將“1”寫入kepware(PLC)地址進行測試。 我從 GitHub 獲得客戶端,URL 是https://github.com/eclipse/milo 。 但我總是得到不准確的信息,像這樣:
[main] INFO oemexamples.client.WriteExample - StatusCode{name=Bad_NodeIdUnknown, value=0x80340000, quality=bad}
同時,我可以成功地從kepware(PLC)讀取數據。
我的 opc 標記名稱是“AFSM010_WriteRFID”,通道名稱是“FE6”,設備名稱是“AFSM”。 那么,NodeId 的第二個參數是什么? ??
public class WriteExample implements ClientExample {
public static void main(String[] args) throws Exception {
WriteExample example = new WriteExample();
new ClientExampleRunner(example).run();
}
private final Logger logger = LoggerFactory.getLogger(getClass());
@Override
public void run(OpcUaClient client, CompletableFuture<OpcUaClient> future) throws Exception {
// synchronous connect
client.connect().get();
// List<NodeId> nodeIds = ImmutableList.of(new NodeId(2, "HelloWorld/ScalarTypes/Int32"));
// NodeId nodeId_Tag1 = new NodeId(3, "FE6.AFSM.AFSM010_WriteRFID");
NodeId nodeId_Tag1 = new NodeId(3, "AFSM010_WriteRFID");
List<NodeId> nodeIds = ImmutableList.of(nodeId_Tag1);
// for (int i = 0; i < 10; i++) {
Variant v = new Variant(5);
// don't write status or timestamps
DataValue dv = new DataValue(v, null, null);
// write asynchronously....
CompletableFuture<List<StatusCode>> f =
client.writeValues(nodeIds, ImmutableList.of(dv));
// ...but block for the results so we write in order
List<StatusCode> statusCodes = f.get();
StatusCode status = statusCodes.get(0);
if (status.isGood()) {
logger.info("Wrote '{}' to nodeId={}", v, nodeIds.get(0));
}
logger.info("this is the end : status " + status.toString());
// }
future.complete(client);
}
}
我建議您使用 UaExpert 之類的客戶端連接到 Kepware 並瀏覽地址空間,找到您感興趣的節點,並查看 Kepware 如何格式化 NodeId。
每個服務器對於如何制作 NodeId 都有自己的“規則”。 在不知道該服務器的規則的情況下,您無法僅從“標簽名稱”中派生 NodeId。
預計您可以通過瀏覽或通過一些您已經知道格式的帶外機制來發現節點和 NodeId。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.