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

コメント