ModbusPal仿真器完全チュートリアル:用Java和Python脚本模拟Modbusスレーブデバイス

freeFree Technical Resource

This content is free to read, suitable for basic learning and search traffic.

ModbusPal仿真器完全チュートリアル:用Java和Python脚本模拟Modbusスレーブデバイス

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 步:

  1. 菜单栏点击 Add → Modbus Slave
  2. 在弹出的对话框中,選択协议タイプ为 TCP
  3. 設定监听ポート(デフォルト 502),如需多スレーブ可分配不同ポート(如 502, 503, 504)
  4. 設定駅からの住所(Slave ID),例如 1
  5. 右クリック点击新作成的スレーブ,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
1Temperature & Humidity SensorR0: 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 &

这使其可以集成到自動化测试流程中。测试脚本的典型流程:

  1. 启动 ModbusPal 并加载测试工程(后台运行)
  2. 待機中スレーブ就绪
  3. run Modbus マスター测试用例(如用 Modpoll 読み取り/書き込みレジスタ)
  4. 验证戻り値は是否符合预期
  5. 生成测试报告
  6. 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 是验证通信逻辑的得力工具。

Put this resource to use in a real project?

Go to the Tool Center for message parsing, CRC verification and device debugging, or submit your requirements for selection and integration advice.

Engineer Membership

Turn this article into actionable debugging resources

After activation, you can use advanced message parsing, resource pack downloads, code examples, engineering cases and priority technical support, suitable for real project delivery.

Unlimited Advanced Tools
Resource & Code Packs
Complete Engineering Case Library
Priority Technical Support

Leave a Reply

Your email address will not be published. Required fields are marked *.