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