PythonでOPC UA PLCへ接続する方法 (セキュリティなし)
同期通信
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からカンニング
実行結果
コマンドプロンプトで実行すると
> 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番ポートを使用します。
関連ページ
- OPC UAでPLCと接続する
- OPC UAでPLCと接続する (セキュリティあり)
- UaExpertでPLCと接続する
- 携帯アプリ Prosys OPC UA ClientでPLCと接続する
- [OPC UA] C#でPLCと接続する
GitHub
Free OPC-UA Libraryを詳しく調べたい場合はGitHubを参照してください
Free OPC-UA Library
