【pymodbus】ModbusSimulatorServerでNameErrorが発生する

PythonでModbus通信を模擬できる便利なライブラリ「pymodbus」。
その中でも ModbusSimulatorServer は、サーバー側の動作を手軽に再現できる強力なツールだ。

コードを書いて実行したところ、以下のエラーが発生した。
実行コード:

from pymodbus.server import ModbusSimulatorServer
import asyncio
import os


async def run():
    simulator = ModbusSimulatorServer(
        modbus_server="server",
        modbus_device="device",
        http_host="localhost",
        http_port=8080)
    await simulator.run_forever()

folder_path = os.path.dirname(__file__)
os.chdir(folder_path)
asyncio.run(run())

実行結果:

NameError: name 'web' is not defined

特に対処していない場合、上記の エラーに遭遇する。

1.発生原因:aiohttp が未インストール

ModbusSimulatorServer は内部で aiohttp(非同期Webサーバーライブラリ) を使って HTTP インターフェースを提供している。

しかし、pymodbus を pip install pymodbus だけでインストールした場合、aiohttp は自動では入らない
そのため、aiohttp.web を参照しようとしたときに NameError が発生する。

2. 解決方法:aiohttp をインストール

aiohttpをインポートすることで、実行できる。
以下のコマンドを実行してください。

pip install aiohttp

自分がインストールしたバージョンは[3.13.3]でしたので、[3.13.3]であれば動作可能だ。

pip install aiohttp==3.13.3

これで ModbusSimulatorServer を使っても NameError は発生しなくなる。

3. まとめ

症状原因解決策
NameError: name 'web' is not definedaiohttp が未インストールpip install aiohttp

pymodbus のシミュレータは非常に便利ですが、依存ライブラリが明示的に入っていないと、一見関係なさそうなエラーが出ることがある。
もし同じようなエラーに悩んでいる方がいたら、まずは aiohttp のインストールを確認してみてください。
また、シミュレータを使用して、疎通確認を行う方法は以下でまとめている。
pymodbus.simulatorを使iいModbus通信する | エクヌツITブログ

コメント

タイトルとURLをコピーしました