Was ist ModPalbus?
ModPalbus ist ein Java-basierter Open-Source - Modbus-Slave - Simulator, das bei SourceForge gehostet wird:https://modbuspal.sourceforge.net/。Seine Kernfunktion ist die dynamische Generierung von Registerwerten über die eingebettete Jython (Python für Java) Skript-Engine, anstatt nur vordefinierte statische Daten zurückzugeben. Das bedeutet, dass Sie das Verhalten eines echten industriellen Geräts simulieren können - die saisonalen Schwankungen von Temperatursensoren, die Beschleunigungskurven von Frequenzumrichtern und sogar analoges Signal mit Rauschen.
Bei der Entwicklung von Modbus-Master - Programmen stehen Ingenieure oft vor dem Dilemma "ohne echte Hardware". ModbusPal wurde entwickelt, um dieses Problem zu lösen - es kann Dutzende verschiedener Modbus-Slavenarten auf einem normalen Computer simulieren und unterstützt Modbus RTU (serieles Port) und Modbus TCP (Ethernet).
ModPalbus Kernfunktionen
- Dynamisches Register erzeugenBerechnen Sie den Wert jedes Registers in Echtzeit über eingebaute mathematische Funktionen (Sinuswelle, Rampen, Zufallszahlen) oder benutzerdefinierte Python-Skripte
- Multi-Slave - Simulation: Simulation von Modbus RTU / TCP-Geräten mit verschiedenen Slave-IDs
- Automatisierung: Unterstützung für zeitgerechte Aufgaben zur automatischen Änderung von Registerwerten und Simulation von Gerätestatusänderungen (z.B. Schalterumkehr, Analoggradiente)
- Jython Scripting Engine: Embedded Jython 2.x, ermöglicht das Schreiben komplexer Geschäftslogik (Zustandmaschinen, Kommunikationssimulation usw.)
- Plattformübergreifend: Java Swing-basiert, für Windows / Linux / macOS
- Unterstützung für serielle Ports: Unterstützung für die physische serielle Portskommunikation über die RxTx-Bibliothek, Anschluss an ein echtes RS - 232 / RS - 485 - Netzwerk
Installation von ModbusPal
Voraussetzungen
ModbusPal ist abhängig von der Java-Lautezeitumgebung (JRE 8 oder höher). Um die physikalische serielle Anschlussfunktion zu verwenden, müssen Sie auch die RxTx-Bibliothek für serielle Anschlüsse installieren.
Linux-Installation
# 安装 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-javaWindows-Installation
Nachdem Sie modbuspal.jar heruntergeladen haben, können Sie mit einem Doppelklick ausführen, wenn Java bereits auf Ihrem System installiert ist. Für die Serienanschlussfunktion herunterladen Sie die Windows DLL-Datei RxTx (rxtxSerial.dll(Kopieren)C:Program FilesJavajrebinKatalog.
Erstellung der ersten Modbus TCP Slave Station
Nach dem Starten von ModbusPal ist die Hauptoberfläche von oben nach unten in Menüleiste, Baum, Konfigurationspanel und Log-Ausgabebereich unterteilt. Erstellen Sie eine Basis-Slavenstation in nur 5 Schritten:
- Klicken Sie aufAdd → Modbus Slave
- In einem Popup-Dialogfeld wählen Sie den Protokolltyp fürTCP
- Wählen Sie den Listen-Port (Standard 502), wenn Sie mehrere Slaven benötigen, können Sie verschiedene Ports zuweisen (z. B. 502, 503, 504)
- Setzen Sie die Slave-Adresse (Slave-ID), z. B. 1
- Klicken Sie mit der rechten Maustaste auf die neu erstellte Slave-Station, wählen SieAdd → Holding Registers, setzen Sie die Startadresse und Anzahl
Klicken Sie auf die SchaltflächeRunin der Symbolleiste, um die Slave-Station zu starten. Die Slave-Station hat bereits am TCP 502 - Port abgehört und kann mit dem Master-Tool wie Modbus Poll oder Modpoll verbunden werden und den Registerwert gelesen werden.
Dynamische Daten mit Python-Skripten generieren
Dies ist die Killerfunktion von ModbusPal. Das folgende Beispiel simuliert einen Temperatursensor, bei dem der Registerwert in Sinusoidalform zwischen 20 ° C und 30 ° C schwankt:
# 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("Register %d written with value %d" % (register, value))Binden Sie ein Skript in ModbusPal: Klicken Sie mit der rechten Maustaste auf das Zielregister →Bindings → Add Python Binding→ Wählen Sie die Skriptdatei → Angeben Sie den Adressbereich des gebundenen Registers. Nach dem Starten der Slave-Station wird die Registeradresse mit dem Master-Tool fortgesetzt, um die sinusoide Änderung des Temperaturwerts im Laufe der Zeit zu beobachten.
Erweiterte Szenarien: Simulierung eines kompletten Multi-Device - Industrienetzwerks
In einem realen industriellen Szenario werden in der Regel mehrere Slave-Geräte auf einem RS - 485 - Bus montiert. Mit ModbusPal können wir folgende typische Konfigurationen simulieren:
| Slave Station-ID | Gerätetyp | Register-Mapping |
|---|---|---|
| 1 | Temperatur-Feuchtigkeit - Sensor | R0: Temperatur (x10), R1: Feuchtigkeit (x10) |
| 2 | Dreiphasen-Stromzähler | R0: A-Phase - Spannung, R1: A-Phase - Strom, R2 - 3: Aktive Leistung (32 - Bit) |
| 3 | Frequenzumrichter | R0: Betriebsfrequenz (x100), R1: Ausgangsstrom (x10), R2: Betriebszustand (Bit-Codierung) |
| 4 | Flüssigkeitspiegelmesser | R0-1: Flüssigkeitspiegelhöhe (mm, 32 - bit), R2: Temperatur (x10) |
Fügen Sie vier Slaves in ModbusPal hinzu, erstellen Sie für jede Slave eine entsprechende Registergruppe und binden Sie Python-Skripte für die Register, die dynamische Werte benötigen. Der Vorteil ist, dass die Multi-Gerät - Kommunikation und die Protokolllogik verifiziert werden können, ohne echte Hardware zu kaufen und zu verbinden.
Konstruktion komplexer Simulationsverhaltensweisen
Simulation von Start-Stopp - und Drehzahländerungen
# 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.0Simulation von Analog-Sensoren mit Rauschen
# 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 0in Verbindung mit automatisierten Tests
ModbusPal kann als Projektdatei (Format. mbp) konfiguriert werden, die über die Befehlszeile geladen werden:
# 加载预配置的工程文件并启动
java -jar modbuspal.jar --load my_project.mbp &Dadurch kann es in den automatisierten Testprozess integriert werden. Typischer Prozess für Testscript:
- Starten Sie ModbusPal und laden Sie das Testprojekt (Hintergrund)
- Warten auf die Bereitstellung des Slaves
- Ausführen von Modbus-Master - Testfällen (z. B. Lesen und Schreiben von Modpoll-Registern)
- Verifizieren, dass der Rückgabewert den Erwartungen entspricht
- Erstellen von Testberichten
- Stoppen von ModbusPal
Einschränkungen von ModbusPal
Bei der Verwendung von ModbusPal sollten folgende Punkte beachtet werden:
- ProjektaktivitätModbusPal: ModbusPal ist ein früheres Open-Source - Projekt, das in den letzten Jahren weniger häufig aktualisiert wurde. Für einige neuere Modbus-Funktionen (z. B. FC43 / 14 für das Lesen von Geräte-Identifikationen) kann die Unterstützung unvollständig sein.
- Jython-Version: Die eingebaute Jython-Engine basiert auf der Python 2.x-Syntax und unterstützt keine Python 3 - Features wie f-string und type hints.
- Hochauflösende Anzeige: Die Java Swing-basierte GUI kann auf 4K-Bildschirmen mit hohem DPI nicht gut angezeigt werden und erfordert eine Anpassung der Java-DPI - Skalierungseinstellungen.
- ObergrenzeBei der Simulation einer Vielzahl von Slaven (mehr als 20) kann die Verarbeitung der seriellen Ports in Java zu einem Engpass werden.
Alternativen im Vergleich
- pymodbus(Python): Höchste Flexibilität, TCP / RTU / TLS-Unterstützung, geeignet zum Erstellen von benutzerdefinierten Simulatoren, aber vollständiger Code erforderlich
- ModRSim2: Kostenloser Modbus-Slave - Emulator für Windows-Plattformen, mit GUI, aber ohne Python-Skripting
- Modbus Slave(Commercial Software): Das umfassendste kommerzielle Modbus-Simulationswerkzeug, aber nicht kostenlos
- Unslave Modbus Simulator: Neue kostenlose Optionen mit moderner Schnittstelle
Zusammenfassung
ModbusPal ist mit seiner Python-Skript - basierten dynamischen Registergeneration einzigartig in der Welt der Open-Source - Modbus-Emulatoren. Es eignet sich insbesondere für folgende Anwendungsszenarien: Protokoll-Modulation und - Validierung in der Entwicklungsphase des Modbus-Masterprogramms ohne Zielhardware; komplexe Systemintegrationstests, in denen mehrere verschiedene Arten von Slave-Stationen (Messengeräte, SPS, Frequenzumrichter) simuliert werden müssen; und Szenarien, in denen das reale industrielle Verhalten durch dynamische Wellenformen, zufälliges Rauschen, Steigungsfunktionen usw. nachgebildet werden muss. Wenn Sie Modbus-Hostcomputer - Software, SCADA-Systeme oder IoT-Datenerfassungsgateways entwickeln, ist ModbusPal das richtige Werkzeug, um die Kommunikationslogik zu überprüfen.
Antwort veröffentlichen