SimpleModbus Arduino-Bibliothek - Tutorial: Arduino über Modbus RTU kommunizieren

kostenlosKostenloses technisches Material

Dieser Inhalt ist direkt lesbar und eignet sich für das Grundlagenlernen und die Suche.

SimpleModbus Arduino-Bibliothek - Tutorial: Arduino über Modbus RTU kommunizieren

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 - SteckbrettArduino UnoBeschreibung
VCC5VStromversorgung
GNDGND
RORX (D0)Empfangen von Daten → Arduino-Serieller Anschluss RX
DITX (D1)Senden von Daten → Arduino-Serieller Anschluss TX
RED2Empfang aktiviert (niedrig effizient)
DED2Senden aktiviert (hoch effizient), Parallel mit RE an die gleiche IO
AA (Bus +)RS - 485 A-Leitung (Differential +)
BB (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:

BibliothekennamePlattformFeatures
ArduinoModbusArduino (offiziell)Arduino offizielle Wartung, Unterstützung für RTU und TCP, Arduino IDE-Bibliothek - Manager Installation mit einem Klick
Modbus-Master - Slave-for - ArduinoArduinoUnterstützung für Master - und Slave-Stationen, Funktionscode-Abdeckung, GitHub Aktive Updates
esp-modbusESP32 / ESP8266Espressif offizielle Bibliothek, Unterstützung für Modbus RTU / TCP / ASCII, Ausgezeichnete Leistung
SimpleModbusArduinoEinfach 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.

Sollte man diese Informationen für ein echtes Projekt verwenden?

Gehen Sie zum Tool Center, um Nachrichten zu analysieren, CRC-Prüfungen und Geräte-Debugging zu erledigen, oder senden Sie Anforderungen für Auswahl - und Zugangsvorschläge.

Ingenieur Mitglied

Verwandeln Sie diesen Artikel in ein umsetzbares Debuggermaterial

Erweiterte Nachrichtenanalyse, Paket-Downloads, Codebeispiele, Engineering-Szenarien und Priority-Technischer Support sind für die Real-Projekt - Bereitstellung möglich.

Unbegrenzte Werkzeuge
Datenpaket und Codepaket
Vollständige Engineering Case-Basis
Vorrangiger Zugang zum technischen Support

Antwort veröffentlichen

Ihre E-Mail - Adresse wird nicht öffentlich gemacht. Erforderliche Elemente wurden verwendet * markiert.