python-opcuaのnodeidのつけ方に苦労した
最近 自分で作ったアプリとほかのソフトのつなぎでOPC UAに対応を迫られる場面があって,node opcuaを使用したが,通信が問題なく続いている間は問題がないが,いったん不具合があったときに再接続に失敗する不具合が解消せずpython-opcuaに乗り換えることになった。ところが,サンプルを見ても"ns=2;i=3"などのnodeid?のつけ方がわからずに苦労した。
さんざん調べていたら,偶然
myvar2 = myobj.add_variable("ns=2;i=3", "takeme", True)
などとすると良いことが分かった。
server_minimal.pyのサンプルから以下のようにすれば変更できる。
myvar = myobj.add_variable(idx, "MyVariable", 6.7) から myvar = myobj.add_variable("ns=2;i=3", "MyVariable", 6.7) へ変更
ただし,上の書式でコールして勝手に追加されるnodeidとの重複には十分に注意しなければならない。
先にadd_variable("ns=2;i=3", "MyVariable", value)の書式で指定したidは後からadd_variable(idx, "MyVariable", value)の書式で指定したときには重複しないように避けられる。逆の順番でコールした場合には重複は避けられない。"ns=2;i=xxx"で固定したいものを先にコールして固定しないといけない。
クライアントソフトによっては名前を見ずにnodeidで一意性を確認している場合があるので,サブスクライブの設定の時についていたnodeidは使い続ける限り,ずーっと維持されなくてはならない。サーバが再起動しても同じnodeidが付かないと別の変数と認識されてしまう。