ModbusPalとは?
ModbusPalはJavaベースのオープンソースModbusスレーブ(Slave)エミュレータであり、プロジェクトはSourceForgeでホストされている:https://modbuspal.sourceforge.net/。そのコア機能は、あらかじめ設定された静的データを返すのではなく、組み込みのJythonスクリプトエンジンを介して動的にレジスタ値を生成することです。つまり、temperatureセンサの季節変動、周波数コンバータの加速曲線、さらにはノイズの多いアナログ信号など、実際の産業機器のさまざまな挙動をシミュレートできます。
Modbusマスタープログラムの開発において、エンジニアはしばしば“実際のハードウェアがない”というジレンマに直面します。ModbusPalはこの問題を解決するために設計されており、Modbus RTUとModbus TCPの両方のトランスポートモードをサポートし、通常のコンピュータ上で数十種類のModbusスレーブデバイスを同時にエミュレートできます。
ModbusPalの主な機能
- ダイナミックレジスタ生成:組み込みの数学関数(正弦波、ランプ、乱数)またはユーザー定義のPythonスクリプトを使用して、各レジスタの値をリアルタイムで計算します。
- 駅からもっと。複数の異なるSlave IDを持つModbus RTU/TCPデバイスを同時にエミュレートする
- 自動化メカニズム:タイミングタスクをサポートしてレジスタ値を自動的に変更し、デバイス状態の変化をシミュレートする(スイッチングvalueの反転、アナログvalueのグラデーションなど)。
- JythonスクリプトエンジンJython 2.xを組み込み、複雑なビジネスロジック(ステートマシン、Communicationシミュレーションなど)を記述できます。
- クロスプラットフォーム運用Windows / Linux / macOSで動作するJava Swingベース
- シリアルポートサポート:RxTxライブラリにより物理シリアルポートCommunicationをサポートし、実際のRS-232/RS-485ネットワークに接続できます。
ModbusPalのインストール
前提条件は
ModbusPalはJavaランタイム環境(JRE 8以上)に依存します。物理シリアル機能を使用するには、RxTxシリアルCommunicationライブラリもインストールする必要があります。
Linuxのインストール
#Java Runtimeのインストール
sudo apt-get updateをする
sudo apt-get install default-jre
ModbusPal(SourceForgeの最新バージョン)をダウンロード
wget -O modbuspal."https://sourceforge.net/projects/modbuspal/files/latest/download"
#手続きの開始
java-jar modbuspal.jar
シリアルサポートが必要な場合はRxTxをインストールする
sudo apt-get install librxtx-javaWindowsインストール
modbuspal.jarをダウンロードした後、システムにJavaがインストールされている場合は、ダブルクリックして実行します。シリアル機能が必要な場合は、RxTx用のWindows DLLファイルをダウンロード(rxtxSerial.dll(コピーする)C:Program FilesJavajrebinカタログです。
最初のModbus TCPスレーブの作成
ModbusPalを起動すると、メインインターフェイスは上から下へ、メニューバー、エンジニアリングツリー、構成パネル、ログ出力領域にminかれます。わずか5ステップで基地を作成:
- Menu BarクリックAdd → Modbus Slave
- ポップアップしたダイアログボックスで、プロトコルタイプを次のように選択します。TCP
- リスニングポート(デフォルト502)を設定し、必要に応じて異なるポート(502、503、504など)を割り当てることができます。
- スレーブアドレスSlave IDを設定します。たとえば、1
- 新しく作成されたスレーブを右クリックし、Add → Holding Registers開始アドレスとQuantityを設定する
ツールバーをクリック。Run駅からボタンを押す。この時点でスレーブはTCPポート502でリッスンしており、Modbus PollやModpollなどのマスターツールを使用してレジスタ値を読み取ることができます。
Pythonスクリプトによる動的データの生成
これはModbusPalのキラー機能です。次の例では、レジスタ値が20°C ~ 30°Cの間で正弦波として変動するtemperatureセンサをシミュレートします。
#temperature_simulator.py
20.0 ~ 30.0°Cの間で正弦波周期で変化するアナログtemperatureセンサ
輸入時間の延長
数学のインポート。
def getValue register
"""
ModbusPalはレジスタを読み取るたびにこの関数を呼び出す
registerレジスタアドレスint
戻り値レジスタ値int、0-65535
"""
t = time.time
# 中心温度 25°C、振幅 5°C、周期 60秒間
temperature = 25.0 + 5.0 * math.sin 2.0 * math.pi * t / 60.0
#10を掛けると、25.3°C → 253のように1桁の精度が保たれる。
return int temperature * 10
def setValue register value
≪オプション| Options | emdw ≫ ≪プライマリ·ステーションの書き込みを処理するコマンド| Processing Main Station Write | emdw ≫
print "Register %d written with value %d" % register valueModbusPalでスクリプトをバインドする:ターゲットレジスタを右クリック→Bindings → Add Python Binding→スクリプトファイルを選択→バインドするレジスタアドレス範囲を指定します。スレーブステーションを起動した後、マスターステーションツールでレジスタアドレスを読み取り続けると、温度値の経時変化が観察されます。
高度なシナリオ:完全なマルチデバイス産業ネットワークのシミュレーション
実際の産業シナリオでは、通常、複数のスレーブデバイスがRS-485バスにマウントされます。ModbusPalを使って以下のような典型的な構成をシミュレートできます。
| ステーションIDから。 | 機器の種類 | レジスタマップ |
|---|---|---|
| 1 | temperatureと湿度センサー | R0温度x10、R1湿度x10 |
| 2 | 三相電気メーター | R0 A相电圧、R1 A相、R2-3有効32-bit |
| 3 | 周波数変換器 | R0動作周波数x100、R1出力電流x10、R2動作状態ビット符号化 |
| 4 | レベル計 | R0-1液面高さmm、32-bit、R2温度x 10 |
ModbusPalに4つのスレーブを追加し、各スレーブに対応するレジスタグループを作成し、動的値を必要とするレジスタ用のPythonスクリプトをバインドします。これにより、実際のハードウェアを購入して接続する必要がなく、開発機上でマルチデバイス通信調和プロトコルの論理検証が可能になります。
複雑なシミュレーション動作の設計
アナログ周波数コンバータの起動と停止速度の変化
#vfd_simulator.py
#アナログ周波数コンバータ:スタートストップコマンドを受信し、ランプ関数による速度変化
輸入時間の延長
#グローバルステータス変数
target_freq = 0。 #ターゲット周波数Hz
_freq = 0.0 #現在の周波数Hz
running = False #運用状況について
RAMP_RATE = 2.0 #ランプレート2 Hz/s
last_time = time.time
def getValue register
global current_freq last_time
now = time.time
dt = now -last_time
last_time = now
if register === 0
#周波数レジスタ:ランプレートで目標値を近似する
if_freq -_freq 0.01
if current_freq = 0
ステータスステータスは|= 0 x 0 2
Return Statusシングル
return 0より
def setValue register value
global target_freq running
if register === 0
#マスター書き込み制御コマンド
# valueビット0起動/Stop、ビット1方向
running = bool value 0x01
しないif
target_freq = 0。
elif register === 1
#プライマリ局書き込みターゲット周波数(100倍)
target_freq = value / 100.0アナログノイズ付きアナログvalueセンサ
#noisy_sensor.py
ノイズ付き4-20mA圧力トランスミッタのアナログ
輸入時間の延長
数学のインポート。
randomのインポート
def getValue register
t = time.time
#基準圧力:0.5 MPa、小さな正弦波変動を重ね合わせる
base_ure = 500.0 #
ripple = 10.0 * math. 2 * math.pi * t / 30.0
#ランダムノイズを追加±2 kPa
noise = random.uniform-2.0,2.0
pressure = base_pressure + ripple + noise
if register === 0
圧力値(kPa、整数)
return int pressure
elif register === 1
#圧力値の小数部(Pa)
f = ure- int ure
return int frac * 1000
return 0より自動テストとの連携
ModbusPalはプロジェクトファイル(.mbp形式)として設定でき、コマンドラインからロードされます。
#事前設定されたエンジニアリングファイルをロードして起動
java -modbuspal. --load my_project.mbp&これにより、自動テストプロセスに統合できます。スクリプトをテストするための一般的なプロセス
- ModbusPalを起動し、テスト·プロジェクトをロードバックグラウンドで実行
- 駅から待機。
- Modbusマスターテストケースの実行(Modpollによるレジスタの読み書きなど)
- 戻り値が期待通りであることを確認する
- テストレポートの生成
- ModbusPalのStop
ModbusPalの制限
ModbusPalを使用する際の注意点は以下の通りです。
- プロジェクト活動の程度ModbusPalは初期のオープンソースプロジェクトであり、近年は更新頻度が低下している。一部の新しいModbus機能(FC43/14読み取りデバイスIDなど)では、サポートが不完全である場合があります。
- Jythonバージョン組み込みのJythonエンジンはPython 2.x構文に基づいており、f-stringや型ヒントなどのPython 3機能をサポートしていません。
- 高解像度ディスプレイJava SwingベースのGUIは、4 K高 DPI画面ではうまく表示されない場合があり、JavaのDPIスケーリング設定を調整する必要があります。
- パフォーマンスの上限多数のスレーブ(20以上)をエミュレートする場合、Javaのシリアル処理がボトルネックになる可能性があります。
代替案の比較
- pymodbus(Python):TCP/RTU/TLSをサポートし、カスタムエミュレータの構築に適しているが、完全なコードを記述する必要がある。
- ModRSsim2:GUI付きだがPythonスクリプトをサポートしないWindowsプラットフォーム用の無料Modbusスレーブエミュレータ
- Modbus Slave(商用ソフトウェア):最もフル機能の商用Modbusシミュレーションツールですが、無料ではありません。
- Unslave Modbus Simulator:よりモダンなインターフェイスを備えた新しい無料オプション
概要まとめ
ModbusPalは、Pythonスクリプト駆動の動的レジスタ生成機能により、オープンソースのModbusエミュレータの分野ではユニークである。特に、Modbusマスタープログラムの開発段階でターゲットハードウェアがない場合のプロトコルチューニングと検証、複数の異なるタイプのスレーブデバイス(計装、PLC、インバータ)をシミュレートする必要がある複雑なシステム統合テスト、動的波形、ランダムノイズ、ランプ関数などによって実際の産業現場の挙動を再現する必要があるシナリオに適しています。Modbusホストソフトウェア、SCADAシステム、IoTデータ収集ゲートウェイを開発している場合、ModbusPalはCommunicationロジックを検証するのに最適なツールです。
Leave a Reply