Einführung in SimpleModbus
SimpleModbus ist eine Modbus-RTU - Protokollbibliothek, die für die Arduino-Plattform entwickelt wurde und unterGoogle Code Archive(Das Projekt wurde archiviert). Es wurde von Juan Bester entwickelt und enthält zwei separate Arduino-Bibliotheken: SimpleModbusMaster (die Master-Bibliothek) und SimpleModbusSlave (die Slave-Bibliothek). Obwohl das Projekt im Namen "Simple" steht, bietet es Funktionen, die den am häufigsten verwendeten Funktionscode in der Modbus-RTU - Kommunikation abdecken und sich ideal für Arduino-Anfänger und schnelle Prototypenentwicklung eignen.
und️Achtung: Das SimpleModbus-Projekt ist nicht mehr aktiv. Für neue Projekte wird die modernereModbus RTU for Arduino- Bibliothek mit dem Namen "Modbus" oderesp-modbus empfohlen.(ESP32 - Plattform) Dennoch ist der Code von SimpleModbus einfach zu verstehen und als Einführungstool für das Erlernen der Implementierung des Modbus-Protokolls noch wertvoll.
Unterstützte Funktionen von SimpleModbus
- SimpleModbusMaster: Unterstützung für FC01 (Lese-Spule), FC02 (discrete Eingangsvorrichtung), FC03 (Lese-Halt - Register), FC04 (Lese-Eingangs - Register), FC15 (Schreib-Multi - Spule), FC16 (Schreib-Multi - Register)
- SimpleModbusSlave: Unterstützung für FC03 (Lese-Halt - Register) und FC16 (Schreib-Multi - Register)
- Hardwareanforderungen: Arduino + RS - 485 - Konvertermodul (z. B. MAX485)
Hardwareverbindung
Arduino verbindet den RS - 485 - Bus über das MAX485 - Modul. Typische Verbindungsmethode:
| Max485 - Steckbrett | Arduino Uno | Beschreibung |
|---|---|---|
| VCC | 5V | Stromversorgung |
| GND | GND | 地 |
| RO | RX (D0) | Empfangen von Daten → Arduino-Serieller Anschluss RX |
| DI | TX (D1) | Senden von Daten → Arduino-Serieller Anschluss TX |
| RE | D2 | Empfang aktiviert (niedrig effizient) |
| DE | D2 | Senden aktiviert (hoch effizient), Parallel mit RE an die gleiche IO |
| A | A (Bus +) | RS - 485 A-Leitung (Differential +) |
| B | B (Bus -) | RS - 485 B-Leitung (Differential -) |
und️ An beiden Enden des RS - 485 - Buses muss ein 120 - Ω-Terminalwiderstand (zwischen A und B) hinzugefügt werden, sonst wird die Signalreflexion bei der Langstreckenkommunikation zu Datenfehlern führen.
SimpleModbusSlave Beispiel: Arduino als Modbus-RTU - Slave
#include <SimpleModbusSlave.h>
// 定义保持寄存器数组(10个寄存器)
enum {
TEMP_REG = 0, // 温度(x10)
HUMIDITY_REG, // 湿度(x10)
COIL_STATUS, // 线圈状态
SETPOINT, // 设定值
// ... 更多寄存器
TOTAL_REGS = 10
};
unsigned int holdingRegs[TOTAL_REGS];
void setup() {
// 设置 RS-485 方向控制引脚
pinMode(2, OUTPUT);
// SimpleModbusSlave 参数:
// 1. 寄存器数组地址
// 2. 寄存器数量
// 3. 发送使能引脚
// 4. 发送使能有效电平
// 5. 从站地址
// 6. 波特率
// 7. 校验(0=无校验)
modbus_configure(holdingRegs, TOTAL_REGS,
2, // TXEN 引脚
HIGH, // TXEN 高电平时发送
1, // 从站地址
9600, // 波特率
0); // 校验
}
void loop() {
// 更新传感器数据(模拟)
holdingRegs[TEMP_REG] = analogRead(A0) / 2; // 温度(模拟)
holdingRegs[HUMIDITY_REG] = analogRead(A1) / 3;
holdingRegs[COIL_STATUS] = digitalRead(3);
// 处理 Modbus 请求
modbus_update();
}SimpleModbusMaster Beispiel: Lesen von Slave-Daten
#include <SimpleModbusMaster.h>
#define TOTAL_NO_OF_REGISTERS 2
unsigned int holdingRegs[TOTAL_NO_OF_REGISTERS];
void setup() {
Serial.begin(9600);
// SimpleModbusMaster 参数:
// 1. 本地寄存器数组
// 2. 读取/写入的寄存器数量
// 3. 发送使能引脚
// 4. 发送使能有效电平
modbus_configure(holdingRegs, TOTAL_NO_OF_REGISTERS,
2, // TXEN 引脚
HIGH); // TXEN 高电平时发送
}
void loop() {
// 从站地址 1,起始地址 0,读取 2 个保持寄存器
unsigned char result = modbus_read_holding_registers(1, 0, 2);
if (result == 0) {
Serial.print("温度: ");
Serial.print(holdingRegs[0] / 10.0);
Serial.print("°C, 湿度: ");
Serial.print(holdingRegs[1] / 10.0);
Serial.println("%");
} else {
Serial.print("Modbus 读取失败,错误码: ");
Serial.println(result);
}
delay(1000);
}SimpleModbus vs. heutige Alternativen
Das SimpleModbus-Projekt hat das Update vor einigen Jahren eingestellt und moderne Arduino-Projekte empfehlen folgende Alternativen:
| Bibliothekenname | Plattform | Features |
|---|---|---|
| ArduinoModbus | Arduino (offiziell) | Arduino offizielle Wartung, Unterstützung für RTU und TCP, Arduino IDE-Bibliothek - Manager Installation mit einem Klick |
| Modbus-Master - Slave-for - Arduino | Arduino | Unterstützung für Master - und Slave-Stationen, Funktionscode-Abdeckung, GitHub Aktive Updates |
| esp-modbus | ESP32 / ESP8266 | Espressif offizielle Bibliothek, Unterstützung für Modbus RTU / TCP / ASCII, Ausgezeichnete Leistung |
| SimpleModbus | Arduino | Einfach zu verstehen, geeignet für das Lernen, aber nicht mehr verfügbar |
Implementierung der Modbus-RTU - Kommunikation auf ESP32 (Moderne Szenario)
Wenn Sie die ESP32 - Plattform verwenden, empfehlen wir die offizielle esp-modbus - Bibliothek Espressif. Hier ist ein kleines Beispiel:
// ESP32 使用 HardwareSerial + MAX485
#include <Arduino.h>
// 定义 RS-485 控制引脚
#define RXD2 16 // ESP32 RX2
#define TXD2 17 // ESP32 TX2
#define DE_RE 4 // RS-485 方向控制
HardwareSerial modbusSerial(2);
void setup() {
Serial.begin(115200);
modbusSerial.begin(9600, SERIAL_8N1, RXD2, TXD2);
pinMode(DE_RE, OUTPUT);
digitalWrite(DE_RE, LOW); // 默认接收模式
}
void loop() {
// 发送 Modbus RTU 请求(手动构造帧)
uint8_t request[] = {
0x01, // 从站地址
0x03, // 功能码(读保持寄存器)
0x00, 0x00, // 起始地址
0x00, 0x02 // 读取 2 个寄存器
};
uint16_t crc = calculateCRC(request, 6);
request[6] = crc & 0xFF;
request[7] = crc >> 8;
// 切换到发送模式
digitalWrite(DE_RE, HIGH);
delayMicroseconds(100);
modbusSerial.write(request, 8);
modbusSerial.flush();
// 切换回接收模式
digitalWrite(DE_RE, LOW);
// 等待响应
delay(500);
while (modbusSerial.available()) {
Serial.printf("%02X ", modbusSerial.read());
}
Serial.println();
delay(2000);
}Arduino Modbus-Bibliothek für Arduino
Öffnen Sie den Library-Manager in der Arduino IDE (Sketch → Include Library → Manage Libraries), suchen Sie"ArduinoModbus"und installieren Sie es. Arduino Modbus unterstützt Modbus RTU (RS - 485) und Modbus TCP (WiFi / Ethernet), sowohl in Master - als auch in Slave-Modus.
#include <ArduinoRS485.h>
#include <ArduinoModbus.h>
void setup() {
Serial.begin(9600);
// 初始化 RS-485
RS485.begin(9600);
// 启动 Modbus RTU 从站(地址 1)
ModbusRTUServer.begin(1, 9600);
// 配置保持寄存器
ModbusRTUServer.configureHoldingRegisters(0, 10);
}
void loop() {
// 轮询 Modbus 请求
ModbusRTUServer.poll();
// 更新寄存器值
int sensorValue = analogRead(A0);
ModbusRTUServer.holdingRegisterWrite(0, sensorValue);
}Häufig gestellte Fragen
Kommunikation reagiert nicht.
- Überprüfen Sie, ob die Richtungsschaltlogik des MAX485 DE / RE-Pins korrekt ist (HIGH beim Senden, LOW beim Empfang)
- Bestätigen Sie, dass die Baudrate und die Adresse der Slave-Station mit der Master-Konfiguration übereinstimmen
- Überwachen Sie die Busdaten mit dem USB-zu - RS - 485 - Modul + dem seriellen Anschluss-Assistenten, bestätigen Sie, dass das Signal vorhanden ist
- Überprüfen Sie, ob das A / B-Kabel zurückgekehrt ist (Differenzspannung mit einem Multimeter: Bus im Leerlauf, wenn A gegen B eine positive Spannung haben sollte)
Gelegentlich Datenverlust oder CRC-Fehler
- Überprüfen, ob an beiden Enden des RS - 485 - Buses ein 120 Ω Terminationswiderstand hinzugefügt wurde
- Reduzierung der Baudrate (4800 oder 2400), Ausschluss des Signalintegritätfaktors
- Verkürzen der Buslänge oder Hinzufügen eines Relaisers
- Bestätigen Sie, dass ausreichend Zeitverzögerung (mindestens 1 Zeichen) zwischen dem Senden und dem Empfangswechsel vorhanden ist
Zusammenfassung
SimpleModbus ist eine frühe Arduino-Modbus - RTU-Bibliothek mit einem einfachen Code und klaren Funktionen, die Anfängern zum Verständnis der Implementierung des Modbus-Protokolls geeignet ist. Im praktischen Projekt wird jedoch eine aktivere und funktionsfähigere Alternative empfohlen: die offizielle Arduino-Bibliothek Arduino Modbus (Universal Arduino-Plattform) oder esp-modbus (ESP32 / ESP8266 - Plattform). Unabhängig davon, welche Bibliothek ausgewählt wird, sind die grundlegenden Modbus-RTU - Kommunikationsprinzipien - Slave-Station - Adresse, Funktionscode, Register-Zusammenarbeit, CRC-Prüfungen - konsistent.
Antwort veröffentlichen