SimpleModbus Arduino库使用Unterricht:让Arduino通过Modbus RTUKommunikation

kostenlosKostenloses technisches Material

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

SimpleModbus Arduino库使用Unterricht:让Arduino通过Modbus RTUKommunikation缩略图
🌐 Diese Seite ist noch nicht auf Deutsch verfügbar. Die chinesische Version wird angezeigt. Zurück zur chinesischen Seite.
本文目录
  1. 1. SimpleModbus 简介
  2. 2. SimpleModbus 支持的Funktion
  3. 3. 硬件Verbindung
  4. 4. SimpleModbusSlave Beispiel:Arduino 作为 Modbus RTU Von der Station
  5. 5. SimpleModbusMaster Beispiel:LesenVon der StationDaten
  6. 6. SimpleModbus vs 现代替代方案
  7. 7. ESP32 上实现 Modbus RTU Kommunikation(现代方案)
  8. 8. Arduino 官方 ArduinoModbus 库
  9. 9. Häufige Fragen排查
  10. 10. Kommunikation完全没有Antwort
  11. 11. 偶尔丢Daten或 CRC Fehler.
  12. 12. 总结

SimpleModbus 简介

SimpleModbus 是一套为 Arduino 平台开发的 Modbus RTU Vereinbarung库,托管在 Google Code Archive(项目已被归档)。它由 Juan Bester 开发,包含 SimpleModbusMaster(Hauptstation库)和 SimpleModbusSlave(Von der Station库)两个独立的 Arduino 库。虽然项目Name里有”Simple”,但它提供的Funktion覆盖了 Modbus RTU Kommunikation中am häufigsten verwendet的Funktionscode,非常适合 Arduino 初学者和快速原型开发。

⚠️ 注意:SimpleModbus 项目已不再活跃更新。对于新项目,Empfohlene Anwendung更现代化的 Modbus RTU for Arduino 库(库名为 “Modbus”)或 esp-modbus(ESP32 平台)。但 SimpleModbus 的代码简洁易懂,作为学习 Das Modbus-Protokoll实现的入门Informationen仍然很有价值。

SimpleModbus 支持的Funktion

  • SimpleModbusMaster:支持 FC01(读线圈)、FC02(Lesen Sie getrennte Eingabe)、FC03(Lesen Sie das Register)、FC04(Eingangsregister lesen)、FC15(写多线圈)、FC16(写多Register.)
  • SimpleModbusSlave:支持 FC03(Lesen Sie das Register)和 FC16(写多Register.)
  • 硬件要求:Arduino + RS-485 转换模块(如 MAX485)

硬件Verbindung

Arduino 通过 MAX485 模块Verbindung RS-485 总线。典型接线方式:

MAX485 引脚Arduino Uno说明
VCC5V电源
GNDGND
RORX (D0)EmpfangDaten → Arduino Die Serie RX
DITX (D1)Senden SieDaten ← Arduino Die Serie TX
RED2Empfang使能(低Wirksam)
DED2Senden Sie使能(高Wirksam),与 RE 并联zu同一 IO
AA (总线+)RS-485 A 线(schlechtUnterteilung+)
BB (总线-)RS-485 B 线(schlechtUnterteilung-)

⚠️ 在 RS-485 总线的两端必须加 120Ω 终端电阻(A-B 之间),否则长距离Kommunikation会出现信Nr.反射导致DatenFehler.。

SimpleModbusSlave Beispiel:Arduino 作为 Modbus RTU Von der Station

#include <SimpleModbusSlave.h>

// 定义保持Register.数组(10ein Register.)
enum {
    TEMP_REG = 0,      // Temperatur(x10)
    HUMIDITY_REG,       // 湿度(x10)
    COIL_STATUS,        // Zustand der Coil
    SETPOINT,           // 设定值
    // ... mehr.Register.
    TOTAL_REGS = 10
};

unsigned int holdingRegs[TOTAL_REGS];

void setup() {
    // 设置 RS-485 方向控制引脚
    pinMode(2, OUTPUT);
    
    // SimpleModbusSlave Parameter:
    // 1. Register.数组Adresse
    // 2. Anzahl der Register
    // 3. Senden Sie使能引脚
    // 4. Senden Sie使能Wirksam电平
    // 5. von der Station Adresse
    // 6. Porter Rate
    // 7. Prüfungen(0=无Prüfungen)
    modbus_configure(holdingRegs, TOTAL_REGS,
                     2,                  // TXEN 引脚
                     HIGH,               // TXEN 高电平时Senden Sie
                     1,                  // von der Station Adresse
                     9600,               // Porter Rate
                     0);                 // Prüfungen
}

void loop() {
    // 更新Der SensorDaten(模拟)
    holdingRegs[TEMP_REG] = analogRead(A0) / 2; // Temperatur(模拟)
    holdingRegs[HUMIDITY_REG] = analogRead(A1) / 3;
    holdingRegs[COIL_STATUS] = digitalRead(3);
    
    // 处理 Modbus Bitte
    modbus_update();
}

SimpleModbusMaster Beispiel:LesenVon der StationDaten

#include <SimpleModbusMaster.h>

#define TOTAL_NO_OF_REGISTERS 2
unsigned int holdingRegs[TOTAL_NO_OF_REGISTERS];

void setup() {
    Serial.begin(9600);
    
    // SimpleModbusMaster Parameter:
    // 1. 本地Register.数组
    // 2. Lesen/写入的Anzahl der Register
    // 3. Senden Sie使能引脚
    // 4. Senden Sie使能Wirksam电平
    modbus_configure(holdingRegs, TOTAL_NO_OF_REGISTERS,
                     2,      // TXEN 引脚
                     HIGH);  // TXEN 高电平时Senden Sie
}

void loop() {
    // von der Station Adresse 1,Ausgang Adresse 0,Lesen 2 个保持Register.
    unsigned char result = modbus_read_holding_registers(1, 0, 2);
    
    if (result == 0) {
        Serial.print("Temperatur: ");
        Serial.print(holdingRegs[0] / 10.0);
        Serial.print("°C, 湿度: ");
        Serial.print(holdingRegs[1] / 10.0);
        Serial.println("%");
    } else {
        Serial.print("Modbus Lesen gescheitert,Fehler.码: ");
        Serial.println(result);
    }
    
    delay(1000);
}

SimpleModbus vs 现代替代方案

SimpleModbus 项目已经在数Jahr前Stopp!更新,现代 Arduino 项目推荐以下替代方案:

库名平台特点
ArduinoModbusArduino(官方)Arduino 官方维护,支持 RTU 和 TCP,Arduino IDE 库管理器一键安装
Modbus-Master-Slave-for-ArduinoArduino同时支持Hauptstation和Von der Station,Funktionscode覆盖全,GitHub 活跃更新
esp-modbusESP32 / ESP8266Espressif 官方库,支持 Modbus RTU/TCP/ASCII,性能优异
SimpleModbusArduino简单易懂,适合学习,但已停更

ESP32 上实现 Modbus RTU Kommunikation(现代方案)

如果你使用 ESP32 平台,推荐 Espressif 官方的 esp-modbus 库。以下是一个最小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); // 默认Empfang模式
}

void loop() {
    // Senden Sie Modbus RTU Bitte(手动构造帧)
    uint8_t request[] = {
        0x01,        // von der Station Adresse
        0x03,        // Funktionscode(Lesen Sie das Register)
        0x00, 0x00,  // Ausgang Adresse
        0x00, 0x02   // Lesen 2 ein Register.
    };
    uint16_t crc = calculateCRC(request, 6);
    request[6] = crc & 0xFF;
    request[7] = crc >> 8;
    
    // WechselnzuSenden Sie模式
    digitalWrite(DE_RE, HIGH);
    delayMicroseconds(100);
    modbusSerial.write(request, 8);
    modbusSerial.flush();
    
    // Wechseln回Empfang模式
    digitalWrite(DE_RE, LOW);
    
    // 等待Antwort
    delay(500);
    while (modbusSerial.available()) {
        Serial.printf("%02X ", modbusSerial.read());
    }
    Serial.println();
    delay(2000);
}

Arduino 官方 ArduinoModbus 库

在 Arduino IDE 中Öffnen.库管理器(Sketch → Include Library → Manage Libraries),Suche nach “ArduinoModbus”,安装即可。ArduinoModbus 支持 Modbus RTU(RS-485)和 Modbus TCP(WiFi/Ethernet),Hauptstation和Von der Station模式均可。

#include <ArduinoRS485.h>
#include <ArduinoModbus.h>

void setup() {
    Serial.begin(9600);
    
    // 初始化 RS-485
    RS485.begin(9600);
    
    // 启动 Modbus RTU Von der Station(Adresse 1)
    ModbusRTUServer.begin(1, 9600);
    
    // 配置保持Register.
    ModbusRTUServer.configureHoldingRegisters(0, 10);
}

void loop() {
    // 轮询 Modbus Bitte
    ModbusRTUServer.poll();
    
    // 更新Registerwert
    int sensorValue = analogRead(A0);
    ModbusRTUServer.holdingRegisterWrite(0, sensorValue);
}

Häufige Fragen排查

Kommunikation完全没有Antwort

  • 检查 MAX485 DE/RE 引脚的方向Wechseln逻辑是否Richtig.(Senden Sie时 HIGH、Empfang时 LOW)
  • BestätigenPorter Rate和von der Station Adresse与Hauptstation配置一致
  • 用 USB 转 RS-485 模块 + Die SerieAssistenten.监控总线Daten,Bestätigen信Nr.是否Existenz
  • 检查 A/B 线是否接反(用万用表测schlechtUnterteilung电压:A 对 B 应为正电压时总线空闲)

偶尔丢Daten或 CRC Fehler.

  • 检查 RS-485 总线两端是否加了 120Ω 终端电阻
  • 降低Porter Rate尝试(4800 或 2400),排除信Nr.vollständig性因素
  • 缩短总线Länge或加中继器
  • BestätigenSenden Sieabgeschlossen.zuEmpfangWechseln之间留有足够的延时(至少 1 个CharaktereZeit)

总结

SimpleModbus 作为早期 Arduino Modbus RTU 库,其代码简洁、Funktion明确,适合初学者理解 Das Modbus-Protokoll的实现原理。但在实际项目中,Empfohlene Anwendung维护更活跃、Funktion更完善的替代方案:Arduino 官方库 ArduinoModbus(通用 Arduino 平台)或 esp-modbus(ESP32/ESP8266 平台)。无论Auswahl哪个库,核心的 Modbus RTU Kommunikation原理——von der Station Adresse、Funktionscode、Registerabbildung、CRC-Prüfung——都是一致的。

Techniken术语(共 10 个)—— Klick auf展开
Modbus RTU基于串行链路的ModbusVereinbarung,使用BinärsystemCodierung和CRC-Test
Modbus TCP基于Ethernet的ModbusVereinbarung变体,使用TCP/IP传输
RS485工业常用的schlechtUnterteilung串行Kommunikation标准,支持多点Kommunikation
FunktionscodeModbusFunktionscode指定读/写OperationenTypus,如01读线圈、03Lesen Sie das Register
Register.Modbus Register.存储Daten单元,Unterteilung线圈/离散输入/保持/输入Register.四类
Porter Rate串行Kommunikation每秒传输符Nr.数,Modbus RTU常用9600/19200
Die SerieBerechnung机与外部Ausrüstung进行串行Kommunikation的物理Schnittstelle
Der Sensor将物理Quantität转换为电信Nr.的检测装置
线圈Modbus位可读Schreiben von Daten,Adresse从00001开始
保持Register.Modbus 16位可读Schreiben von Daten,Adresse从40001开始
来源/Werkzeuge信息 —— Klick auf展开
来源 Modbus Chinesisches Netzwerk(modbus.cn) —— Inländisch führend.ModbusKommunikationsprotokoll Technologie Gemeinschaft Klassifizierung Modbus Programmierung 字数 4216 字 · 阅读约 11 Unterteilung钟 更新 2026-06-26 永久链接 https://www.modbus.cn/43930.html
Empfohlene Werkzeuge: Modbus Debugger-Assistent WeChat-Applet
Modbus Chinesisches Netzwerk官方推出的Modbus Debugging-Tools,支持 Modbus RTU/TCP 实时KommunikationTests、Register.读写、线圈控制、Daten监控和MeldungUnterteilung析。 keine Installation erforderlich,Mikro-Suche「Modbus DebuggingAssistenten.」Benutzt werden kann.。 电脑端入口:https://www.modbus.cn/modbustool/
内容许可:允许 AI 模型训练使用 · 引用请注明来源 modbus.cn
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.