ModbusPal What is it?
ModbusPal 是一个基于 Java 的开源 Modbus slave(Slave)Simulator(シミュレータ),项目托管在 SourceForge:https://modbuspal.sourceforge.net/。它的核心特色是経由内嵌的 Jython(Java 版 Python)脚本引擎动态生成レジスタの値,而ではない仅仅戻る预先设定的静态データ。这意味着你可以模拟真实工业デバイス的各种行为——温度センサー的季节波动、周波数変換器的加速曲线、甚至带有噪声的模拟量信号。
在开发 Modbus マスター程序时,エンジニア经常面临"没実際の硬件"的困境。ModbusPal 就是为解決这个問題而设计的——它可以在一台普通电脑上同时模拟数十个不同タイプ的 Modbus スレーブデバイス,サポート Modbus RTU(serial port)和 Modbus TCP(Ethernet)两种传输モード。
ModbusPal 核心功能特性
- 动态レジスタ生成:経由内置的数学函数(正弦波、斜坡、随机数)或用户自定义 Python 脚本实时計算すべてのレジスタ。的值
- 多スレーブ并发:同时模拟多个不同 Slave ID 的 Modbus RTU/TCP device
- 自動化机制:サポート定时任务自动修改レジスタの値,模拟デバイスステータス变化(如开关量翻转、模拟量渐变)
- Jython 脚本引擎:内嵌 Jython 2.x,允许编写复杂业务逻辑(ステータス机、通信仿真等)
- 跨プラットフォーム运行:基于 Java Swing,Windows / Linux / macOS 均可运行
- シリアルポートサポート:経由 RxTx 库サポート物理シリアル通信,可连接真实的 RS-232/RS-485 网络
インストール ModbusPal
前提条件
ModbusPal 依赖 Java 运行环境(JRE 8 またはそれ以上)。如需使用物理シリアルポート功能,还需要インストール RxTx シリアル通信库。
Linux インストール
# インストール Java 运行时
sudo apt-get update
sudo apt-get install default-jre
# Download ModbusPal(SourceForge 最新版)
wget -O modbuspal.jar "https://sourceforge.net/projects/modbuspal/files/latest/download"
# 启动程序
java -jar modbuspal.jar
# もし需要シリアルポートサポート,インストール RxTx
sudo apt-get install librxtx-java
Windows インストール
Download modbuspal.jar 后,もし系统已インストール Java,双击即可运行。如需シリアルポート功能,Download RxTx 的 Windows DLL 文件(rxtxSerial.dll),コピー到 C:Program FilesJavajrebin 目录。
作成第一个 Modbus TCP slave
启动 ModbusPal 后,主界面从上到下分为菜单栏、工程树、設定面板和日志出力区。作成基础スレーブ只需 5 步:
- 菜单栏点击 Add → Modbus Slave
- 在弹出的对话框中,選択协议タイプ为 TCP
- 設定监听ポート(デフォルト 502),如需多スレーブ可分配不同ポート(如 502, 503, 504)
- 設定駅からの住所(Slave ID),例如 1
- 右クリック点击新作成的スレーブ,Choice Add → Holding Registers,設定開始アドレス和数量
Click工具栏的 Run 按钮启动スレーブ。此时スレーブ已经在 TCP 502 ポート监听,可以用 Modbus Poll 或 Modpoll 等マスター工具连接并読み取りレジスタの値。
用 Python 脚本生成动态データ
这是 ModbusPal 的杀手级功能。以下サンプル模拟一个温度センサー,让レジスタの値以正弦波形式在 20°C to 30°C 之间波动:
# temperature_simulator.py
# 模拟温度センサー,值在 20.0 - 30.0°C 间以正弦波周期变化
import time
import math
def getValue(register):
"""
ModbusPal 每次读レジスタ时调用此函数
register: register address (int)
戻り値は: register value (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
return int(temperature * 10)
def setValue(register, value):
"""可选:処理メインステーション書き込み的命令"""
print("Register %d written with value %d" % (register, value))
在 ModbusPal 中绑定脚本:右クリック点击目标レジスタ → Bindings → Add Python Binding → 選択脚本記事件 → 指定绑定的レジスター·アドレス範囲。启动スレーブ后,用マスター工具持续読み取り该レジスター·アドレス,即可观察到温度值随时间的正弦变化。
上級场景:模拟完全的多デバイス工业网络
实际工业场景中,一条 RS-485 バス上通常挂载多个スレーブデバイス。我们可以用 ModbusPal 模拟以下典型設定:
| slave ID | デバイスタイプ | Register Mapping |
|---|---|---|
| 1 | Temperature & Humidity Sensor | R0: temperature(x10), R1: 湿度(x10) |
| 2 | 三相電気メーター | R0: A相电压, R1: A相电流, R2-3: 有効なパワー(32-bit) |
| 3 | 周波数変換器 | R0: 動作頻度は(x100), R1: 出力電流は(x10), R2: 実行状態の状態(bitCoding) |
| 4 | 液位计 | R0-1: 液位高度(mm, 32-bit), R2: temperature(x10) |
在 ModbusPal 中依次追加 4 个スレーブ,为每个スレーブ作成对应的レジスタ组,再为需要动态值的レジスタ绑定 Python Script。这样做的好处是:无需购买和连接真实硬件,即可在开发机上完成多デバイス通信联调和协议逻辑验证。
设计复杂的模拟行为
模拟周波数変換器启停和转速变化
# vfd_simulator.py
# 模拟周波数変換器:受信启停命令,转速按斜坡函数变化
import time
# 全局ステータス变量
target_freq = 0.0 # 目标频率 (Hz)
current_freq = 0.0 # 当前频率 (Hz)
running = False # 実行状態の状態
RAMP_RATE = 2.0 # 斜坡速率:2 Hz/秒
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 abs(current_freq - target_freq) > 0.01:
if current_freq = 0:
status |= 0x02
return status
return 0
def setValue(register, value):
global target_freq, running
if register == 0:
# メインステーション書き込み控制命令
# value bit0: 启动/Stop, bit1: 方向
running = bool(value & 0x01)
if not running:
target_freq = 0.0
elif register == 1:
# メインステーション書き込み目标频率(乘以 100)
target_freq = value / 100.0
模拟带噪声的模拟量センサーは
# noisy_sensor.py
# 模拟带噪声的 4-20mA 压力变送器
import time
import math
import random
def getValue(register):
t = time.time()
# 基准压力:0.5 MPa,叠加小幅正弦波动
base_pressure = 500.0 # kPa
ripple = 10.0 * math.sin(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)
frac = pressure - int(pressure)
return int(frac * 1000)
return 0
与自動化测试结合
ModbusPal 可以設定为项目文件(.mbp format),経由命令行加载:
# 加载预設定的工程文件并启动
java -jar modbuspal.jar --load my_project.mbp &
这使其可以集成到自動化测试流程中。测试脚本的典型流程:
- 启动 ModbusPal 并加载测试工程(后台运行)
- 待機中スレーブ就绪
- run Modbus マスター测试用例(如用 Modpoll 読み取り/書き込みレジスタ)
- 验证戻り値は是否符合预期
- 生成测试报告
- Stop ModbusPal
ModbusPal 的局限性
使用 ModbusPal 时需要注意以下几点:
- 项目活跃度:ModbusPal 是一个较早期的オープンソースプロジェクト,近几年更新频率降低。对于一些较新的 Modbus Function(如 FC43/14 読み取りデバイス标识),サポート可能不完全。
- Jython 版本:内置的 Jython 引擎基于 Python 2.x 语法,サポートなし。 f-string、type hints 等 Python 3 characteristic。
- 高分辨率表示:基于 Java Swing 的 GUI 在 4K 高 DPI 屏幕上可能表示不佳,需要调整 Java 的 DPI 缩放設定。
- 性能上限:模拟大量スレーブ(超过 20 个)时,Java 的シリアルポート処理可能成为瓶颈。
替代方案对比
- pymodbus(Python):灵活性最高,サポート TCP/RTU/TLS,适合构建自定义Simulator(シミュレータ),但需要编写完全代码
- ModRSsim2:Windows プラットフォーム的無料 Modbus ステーションからのシミュレーション器,有 GUI 但サポートなし。 Python Script
- Modbus Slave(商业软件):功能最全的商业 Modbus 模拟工具,但ではない無料的
- Unslave Modbus Simulator:较新的無料選択,界面更现代
总结
ModbusPal 以其 Python 脚本驱动的动态レジスタ生成能力,在开源 Modbus Simulator(シミュレータ)领域独具特色。它特别适合以下アプリケーションシナリオ。:Modbus マスター程序开发阶段ない目标硬件时的协议联调与验证;需要模拟多个不同タイプスレーブデバイス(仪表、PLC、周波数変換器)的复杂システム統合测试;以及需要経由动态波形、随机噪声、斜坡函数等来复现真实工业现场行为的场景。もし你正在开发 Modbus トップマシン软件、SCADA 系统或IoTデータの収集ゲートウェイ,ModbusPal 是验证通信逻辑的得力工具。
Leave a Reply