objects = server.get_objects_node() # populating our address space myobj = objects.add_object(idx, "MyObject") sensor1 = objects.add_object('ns=2;s="sens1"', "Sensor 1") sensor2 = objects.add_object('ns=2;xs=43', "Sensor 2")
myobj 使用的参数idx 是我们定义的地址空间的序号,idx 值为2, 如果在其后加上 print myobj 的语句,输出为:ns=2;i=1 。会使用默认递增的编号。
而sensor2 的第一个参数是错的,那么 add_object() 函数的第一个参数应该怎么写呢?
查询文档:
https://python-opcua.readthedocs.io/en/latest/opcua.common.html?highlight=add%20object#opcua.common.node.Node.add_object
P 都没有。那查一下nodeid
https://reference.opcfoundation.org/v104/Core/DataTypes/NodeId/
对了解第一个参数nodeid怎么写好像毫无裨益····看来还是要深入源码看个究竟。
通过断点调试,发现add_object() 的参数会首先进入 opcua.common.manage_nodes.py 里面的 _parse_nodeid_qname()函数:
对于 Sensor1 Sensor2, 会进入 from_string 这个函数。进一步发现,最后实际处理的函数是 opcua.ua.uatypes.py 里面的 _from_string() 函数:
我们发现,nodeid参数可以使用分号分隔,用以添加多个不同的参数。
ns表示地址空间序号,isgb分别代表一种除了 TwoByte 和 FourByte 之外的 NodeIdType:
而 nsu 和srv 分别代表 地址空间uri 和服务器序号。(376,377行)
关于 NodeIdType 参考我的另一篇博文:https://www.cnblogs.com/mrlonely2018/p/15304364.html