同期通信

python3で Free OPC-UA Libraryのpython-opcuaを使って同期通信してみます

opcuaをインストール

コマンドプロンプトで


> pip install opcua
	

pythonのコード

PLCのIPアドレス=192.168.0.21 の変数名='uaInt' の値を読み出します

opcuaclient.py

from opcua import Client

if __name__ == "__main__":
    client = Client("opc.tcp://192.168.0.21:4840")
    try:
        client.connect()
        var = client.get_node("ns=4;s=uaInt")
        value = var.get_value()
        print(f'value={value}')

    finally:
        client.disconnect()

読み出したい変数はclient.get_node()で指定
var = client.get_node("ns=4;s=uaInt")のns=4;はこちらのNodeIDからカンニング

UaExpert
UaExpertで確認したOPC UA NodeID

実行結果

コマンドプロンプトで実行すると


> python3 opcuaclient.py
Requested session timeout to be 3600000ms, got 60000ms instead
value=0
	

非同期通信

python3で Free OPC-UA Libraryのopcua-asyncioを使って非同期通信してみます
opcua-asyncioはpython3.7以上でサポートされています

asyncioをインストール

コマンドプロンプトで


> pip install asyncua
	

pythonのコード

PLCのIPアドレス=192.168.0.21 の変数名='uaIntAry' の値を読み出します

opcuaclient_async.py

import asyncio
from asyncua import Client

async def main():
  url = 'opc.tcp://192.168.0.21:4840'
  async with Client(url=url) as client:
      var = client.get_node("ns=4;s=uaIntAry")
      value = await var.read_value()
      print(f'value={value}')

if __name__ == '__main__':
  asyncio.run(main())
	

読み出したい変数はclient.get_node()で指定
var = client.get_node("ns=4;s=uaIntAry")のns=4;は同期と同様にNodeIDからカンニングします

実行結果

コマンドプロンプトで実行すると


> python3 opcuaclient_async.py
Requested session timeout to be 3600000ms, got 60000ms instead
value=[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
	

よくある質問

python-opcuaでPLCへ接続するにはどうすればよいですか?

pip install opcuaでライブラリをインストールし、Clientオブジェクトを生成してconnect()後にNodeIdを指定して値を読み取ります。

NodeIdはどこで確認できますか?

pip install opcuaでライブラリをインストールし、Clientオブジェクトを生成してconnect()後にNodeIdを指定して値を読み取ります。

asyncuaとは何ですか?

Pythonのasyncioに対応したOPC UAライブラリで、非同期通信によるデータ取得が可能です。

OPC UAの標準ポート番号は何番ですか?

通常は4840番ポートを使用します。

関連ページ

GitHub

Free OPC-UA Libraryを詳しく調べたい場合はGitHubを参照してください
Free OPC-UA Library

この記事へのコメント