私は OPC-UA ユニバースと Milo SDK を初めて使用するので、何をしようとしているのかを説明するために最善を尽くします。
サーバー NameSapce にいくつかのノードをロードする OPC-UA サーバー インスタンスを実行しています。一方、このサーバーにサブスクライブし、このノードを参照しようとするクライアントがあります。クライアントにノードが表示され、このノードに定義されているいくつかの参照にアクセスできます。私が今やろうとしているのは、サーバーで定義されている参照にアクセスすることであり、UA-Expert はそれを見ることができますが、Milo Client の実装はできません。カスタム参照はサーバー側で定義されており、私の目標は「BrowseName」または「DisplayName」にアクセスすることです。
これは簡単な問題だと思いますが、今は苦労しています。
上記のテキストで私が意味することを例示するために、いくつかの印刷画面を残します。
下の画像では、赤い矢印が読み取ろうとしている参照を指しているため、2 番目の画像では、HasComponentのタイプを持つ製造と説明が正しくリードされていることがわかりますが、HasAMLRoleReferenceはデバッグにリストされていません。窓。
このコードは私のものではないため、正しい実装を保証することはできませんが、サーバー側ではこれが起こることを知っています:
server.getNodeMap().addReference(new Reference(
new NodeId(NAMESPACE_IDX, getPrefix(e.getParentElement())),
new NodeId(1, 4001),// new NodeId(1,4001) = HasAmlRoleReference
server.getNodeMap().getNode(new NodeId(NAMESPACE_IDX, name)).get().getNodeId().expanded(),
server.getNodeMap().getNode(new NodeId(NAMESPACE_IDX, name)).get().getNodeClass(),
true)
したがって、ReferenceTypeIdは でnew NodeId(1, 4001)
あり、これはクライアント側で読み取ろうとしている型です。私のコードは、Milo git リポジトリの BrowseNode Exemple に基づいています。
この最後の画像では、アドレス空間を確認できます。ここでは、 HasComponentとして参照にも存在するパラメーターがいくつかあります。そのため、 HasAMLRoleReferenceを取得できないメソッドにアクセスするために間違ったメソッドを使用している可能性があります。わからない。
助けてくれてありがとう。
[編集1]
public void browseNode(String indent, OpcUaClient client, NodeId browseRoot){
try
{
String equipmentNamespace = "openMOSRoleClassLib/Equipment";
String skillNamespace = "openMOSRoleClassLib/Skill";
String moduleNamespace = "openMOSRoleClassLib/Equipment/Module";
BrowseDescription browse = new BrowseDescription(
browseRoot,
BrowseDirection.Forward,
Identifiers.References,
true,
//uint(NodeClass.Object.getValue() | NodeClass.Variable.getValue()),
uint(NodeClass.Object.getValue() | NodeClass.Variable.getValue() | NodeClass.ReferenceType.getValue()),
uint(BrowseResultMask.All.getValue())
);
BrowseDescription browse2 = new BrowseDescription(
browseRoot,
BrowseDirection.Forward,
new NodeId(1, 4001),
true,
//uint(NodeClass.Object.getValue() | NodeClass.Variable.getValue()),
uint(NodeClass.Object.getValue() | NodeClass.Variable.getValue() | NodeClass.ReferenceType.getValue()),
uint(BrowseResultMask.All.getValue())
);
BrowseResult browseResult = client.browse(browse).get();
List<ReferenceDescription> references = toList(browseResult.getReferences());
System.out.println("\n");
for (ReferenceDescription rd : references)
{
//logger.info("Node={}", rd.getBrowseName().getName());
System.out.println(indent + "Node= " + rd.getBrowseName().getName());
System.out.println(indent + "Type= " + rd.getTypeId().toParseableString());
System.out.println(indent + "NodeId: " + rd.getNodeId().toString());
System.out.println(indent + "Other INFO[]: " + rd.getTypeDefinition().toParseableString());
System.out.println(indent + "Other INFO[NamespaceIndex]: " + rd.getReferenceTypeId().expanded().getNamespaceIndex());
System.out.println(indent + "Other INFO[ReferenceTypeId]: " + rd.getReferenceTypeId().expanded().toString());
// recursively browse to children
rd.getNodeId().local().ifPresent(nodeId -> browseNode("\t" + indent, client, nodeId));
}
} catch (InterruptedException | ExecutionException e)
{
logger.error("Browsing nodeId={} failed: {}", browseRoot, e.getMessage(), e);
}
}
[編集2]
Equipmentリファレンスを右クリックすると、以下に示す情報が読み込まれます。