ModbusPal 是什么?
ModbusPal 是一个基于 Java 的오픈소스 Modbus 슬레이브(Slave)模拟器,项目托管在 SourceForge:https://modbuspal.sourceforge.net/。它的核心特色是通过内嵌的 Jython(Java 版 Python)스크립트引擎动态生成레지스터 값,而不是仅仅返回预先设定的静态데이터。这意味着你可以模拟真实工业设备的各种行为——온도 센서的季节波动、变频器的加速曲线、甚至带有소음的模拟量信号。
在개발 Modbus 마스터程序时,엔지니어링师经常面临"没有真实硬件"的困境。ModbusPal 就是为解决这个문제而设计的——它可以在一台普通电脑上同时模拟数十个不同유형的 Modbus 슬레이브设备,支持 Modbus RTU(시리얼 포트)和 Modbus TCP(以太网)两种传输모드。
ModbusPal 核心功能特性
- 动态레지스터生成:通过内置的数学函数(正弦波、斜坡、随机数)或用户自定义 Python 스크립트实时계산每个레지스터的值
- 多슬레이브并发:同时模拟多个不同 Slave ID 的 Modbus RTU/TCP 设备
- 自动化机制:支持定时任务自动修改레지스터 값,模拟设备状态变化(如开关量翻转、模拟量渐变)
- 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
# 下载 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 安装
下载 modbuspal.jar 后,如果系统已安装 Java,双击即可运行。如需시리얼 포트功能,下载 RxTx 的 Windows DLL 文件(rxtxSerial.dll),복사到 C:Program FilesJavajrebin 目录。
创建第一个 Modbus TCP 슬레이브
启动 ModbusPal 后,主界面从上到下分为菜单栏、엔지니어링树、설정面板和로그출력区。创建基础슬레이브只需 5 步:
- 菜单栏클릭 Add → Modbus Slave
- 在弹出的对话框中,选择프로토콜유형为 TCP
- 设置监听포트(默认 502),如需多슬레이브可分配不同포트(如 502, 503, 504)
- 设置슬레이브 주소(Slave ID),例如 1
- 右键클릭新创建的슬레이브,选择 Add → Holding 회원가입s,设置시작주소和数量
클릭도구栏的 Run 버튼启动슬레이브。此时슬레이브已经在 TCP 502 포트监听,可以用 Modbus Poll 或 Modpoll 等마스터도구연결并읽기레지스터 값。
用 Python 스크립트生成动态데이터
这是 ModbusPal 的杀手级功能。以下예제模拟一个온도 센서,让레지스터 값以正弦波形式在 20°C 到 30°C 之间波动:
# temperature_simulator.py
# 模拟온도 센서,值在 20.0 - 30.0°C 间以正弦波周期变化
import time
import math
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
return int(temperature * 10)
def setValue(register, value):
"""可选:处理마스터쓰기的命令"""
print("회원가입 %d written with value %d" % (register, value))
在 ModbusPal 中绑定스크립트:右键클릭目标레지스터 → Bindings → Add Python Binding → 选择스크립트文件 → 指定绑定的레지스터주소范围。启动슬레이브后,用마스터도구持续읽기该레지스터주소,即可观察到온도值随时间的正弦变化。
进阶시나리오:模拟完整的多设备工业네트워크
实际工业시나리오中,一条 RS-485 总线上通常挂载多个슬레이브设备。我们可以用 ModbusPal 模拟以下典型설정:
| 슬레이브 ID | 设备유형 | 레지스터 매핑 |
|---|---|---|
| 1 | 온습도센서 | R0: 온도(x10), R1: 湿度(x10) |
| 2 | 三相电表 | R0: A相电压, R1: A相电流, R2-3: 有功功率(32-bit) |
| 3 | 变频器 | R0: 运行频率(x100), R1: 출력电流(x10), R2: 运行状态(bit编码) |
| 4 | 수위计 | R0-1: 수위高度(mm, 32-bit), R2: 온도(x10) |
在 ModbusPal 中依次추가 4 个슬레이브,为每个슬레이브创建对应的레지스터组,再为需要动态值的레지스터绑定 Python 스크립트。这样做的好处是:无需购买和연결真实硬件,即可在개발机上完成多设备통신联调和프로토콜逻辑验证。
设计复杂的模拟行为
模拟变频器启停和转速变化
# 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: 启动/정지, 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 형식),通过命令行불러오기:
# 불러오기预설정的엔지니어링文件并启动
java -jar modbuspal.jar --load my_project.mbp &
这使其可以통합到自动化测试流程中。测试스크립트的典型流程:
- 启动 ModbusPal 并불러오기测试엔지니어링(后台运行)
- 대기슬레이브就绪
- 运行 Modbus 마스터测试用例(如用 Modpoll 读写레지스터)
- 验证返回值是否符合预期
- 生成测试보고서
- 정지 ModbusPal
ModbusPal 的局限性
使用 ModbusPal 时需要注意以下几点:
- 项目活跃度:ModbusPal 是一个较早期的오픈소스项目,近几年更新频率降低。对于一些较新的 Modbus 功能(如 FC43/14 읽기设备标识),支持可能不完整。
- Jython 버전:内置的 Jython 引擎基于 Python 2.x 语法,不支持 f-string、type hints 等 Python 3 特性。
- 高分辨率显示:基于 Java Swing 的 GUI 在 4K 高 DPI 屏幕上可能显示不佳,需要调整 Java 的 DPI 缩放设置。
- 性能上限:模拟大量슬레이브(超过 20 个)时,Java 的시리얼 포트处理可能成为瓶颈。
替代方案对比
- pymodbus(Python):灵活性最高,支持 TCP/RTU/TLS,适合构建自定义模拟器,但需要编写完整代码
- ModRSsim2:Windows 平台的무료 Modbus 슬레이브模拟器,有 GUI 但不支持 Python 스크립트
- Modbus Slave(商业软件):功能最全的商业 Modbus 模拟도구,但不是무료的
- Unslave Modbus Simulator:较新的무료选择,界面更现代
总结
ModbusPal 以其 Python 스크립트驱动的动态레지스터生成能力,在오픈소스 Modbus 模拟器领域独具特色。它特别适合以下적용시나리오:Modbus 마스터程序개발阶段没有目标硬件时的프로토콜联调与验证;需要模拟多个不同유형슬레이브设备(仪表、PLC、变频器)的复杂系统통합测试;以及需要通过动态波形、随机소음、斜坡函数等来复现真实工业现场行为的시나리오。如果你正在개발 Modbus 上位机软件、SCADA 系统或物联网데이터采集게이트웨이,ModbusPal 是验证통신逻辑的得力도구。
답글 작성