由于没有相应的Tutorial,学习Milo库的唯一方式就是通过阅读源码来学习。接着说之前的
1.添加命名空间:
命名空间的定义参考的是OPC Foundation官方:
Namespaces are used by OPC UA to create unique identifiers across different naming
authorities. — The NodeId and BrowseName Attributes are identifiers
大意就是说Namespace是通过创建相应的指示量来定义地址空间的浏览名称和结点ID。
看个例子就知道了:
Standard UA Namespace (0:http://opcfoundation.org/UA/) – 加粗的就是一个典型的命名空间,就类似URL
然后是在Server中定义Namespace的方式,examples里面已经有一个预定义好的Namespace:ExampleNamespace
我们在ExampleServer里面找到如下代码:
ExampleNamespace exampleNamespace = new ExampleNamespace(server);
exampleNamespace.startup();
将server传入其中,然后启动对应的命名空间,example里面是(urn:eclipse:milo:hello-world)
如果我们又定义了一个机床的命名空间,那么就在其下添加
CncNamespace cncNamespace = new CncNamespace(server);
cncNamespace.startup();
之后server又会得到另一个命名空间。相应的index如下,我们将断点放在ExampleServer中的这一行:
server.startup().get();
执行一步,或者用Evaluate Expression,我们看到定义的命名空间:

有三个,其中编号0是基础的命名空间,第二个是服务器的命名空间,而第三个则是我们定义的命名空间,命名空间可以依次累加。
2.结点定义
接下来我们深入了解命名空间,也就是OPC UA中结点定义的地方。在ExampleNamespace中,最核心的就是它的onStartup方法:
@Override
protected void onStartup() {
super.onStartup();
可以看到,首先是唤醒了父类汇总的onStartup方法,查看源码可知:
@Override
protected void onStartup() {
super.onStartup();
registerAddressSpace(this);
}
父类的方法主要用于注册地址空间。
folder结点的定义上一篇已经讲过,接下来来看variable结点
addVariableNodes(folderNode);
对应的方法再本类中找到
private void addVariableNodes(UaFolderNode rootNode) {
addArrayNodes(rootNode);
addScalarNodes(rootNode);
addAdminReadableNodes(rootNode);
addAdminWritableNodes(rootNode);
addDynamicNodes(rootNode);
addDataAccessNodes(rootNode);
addWriteOnlyNodes(rootNode);
}
可以发现它添加了很多种类的结点,这里主要介绍ScarlarNode,即单值的标量变量结点
UaFolderNode scalarTypesFolder = new UaFolderNode(

本文深入探讨了OPC UA服务器中命名空间的定义,通过Milo库学习如何添加命名空间,并详细解释了结点定义,特别是变量结点(ScarlarNode)。文章介绍了OPC Foundation的命名空间概念,以及在Java OPC UA Server中如何添加和管理命名空间,包括预定义的Namespace和自定义命名空间。此外,还讨论了结点的注册过程,特别是如何在folder结点基础上创建和赋值操作,利用委托模式实现ValueLoggingDelegate。
最低0.47元/天 解锁文章
:Server结点定义方式&spm=1001.2101.3001.5002&articleId=104431859&d=1&t=3&u=8acce8d99cda45be8b59771cb4b785bb)
2104

被折叠的 条评论
为什么被折叠?



