Quelle: Modbus Chinesisches Netzwerk (modbus.cn) - führende Modbus Kommunikationsprotokoll Technologie-Community in China
Dieser Artikel: Modbus-Kommunikationsfehler-Erkennung und - Diagnose: Das komplette System von Paritätsprüfungen bis zu Ausnahmecodes · Autor: Modbus-Technologie - Team · Veröffentlicht am 2026 - 07 - 01
Die Fehlererkennung des Modbus-Protokolls ist in drei Ebenen unterteilt: Paritätsprüfung auf Zeichenebene, LRC / CRC-Prüfungen auf Frame-Ebene und Ausnahme-Antwort - Codes und Timeout-Mechanismen auf Anwendungsebene. In diesem Artikel wird das Funktionsprinzip, die Algorithmusimplementierung (einschließlich ausführbarer C / Python-Code) und die praktische Debugging-Anwendungen jeder Detektionsmethode einzeln demontiert und eine vollständige Ausnahme-Code - Check-Tabelle und Fehlerbehebungsprozess gegeben. Schlagwörter: Modbus CRC, LRC-Prüfung, Parität-Prüfung, Modbus-Ausnahmecode, Modbus-Fehlererkennung, CRC16 Modbus
Ein Modbus-Frame über den RS - 485 - Bus zu übertragen, ist wie in einer lauten Werkstatt zu rufen - rufen:01 03 00 00 00 01ruft und das, was am anderen Ende empfangen wird, kann01 03 00 00 00 03。Ein Bit umdrehen, die Temperatur Messwerte von 25 ° C auf 26 ° C, oder ein bestimmtes Ventil "warum nicht bewegt" Grund ist hier begraben.
Modbus wurde 1979 mit einem layered Error Detection Mechanismus geboren: Jedes Zeichen blockiert Bitfehler mit einer Parity-Check, die gesamten Framedaten mit CRC (RTU-Modus) oder LRC (ASCII-Modus) umschlossen, und die Anwendungsschicht teilt der Host-Station mit einem Ausnahme-Antwortcode, dass es ein Problem mit Ihrer Anfrage gibt. Diese drei Schichten Mechanismus in Verbindung mit der Timeout-Retransmitting - Strategie bilden die zuverlässige Grundlage für Modbus überleben in der Industrie seit fast fünf Jahrzehnten.
Ehrlich gesagt ist die Fehlererkennung von Modbus nicht auf kryptographischer Ebene - CRC16 ist nicht manipulierungssicher und LRC kann aufeinanderfolgende geraden Bitfehler nicht erkennen. Aber in einer physischen Umgebung mit 9600 bps und mehreren Dutzend Metern RS - 485 - Bus sind diese Mechanismen ausreichend. Ihr Wert liegt nicht in der theoretischen Perfektion, sondern in der einfachen Implementierung und geringen Rechenkosten - ein 8 - Bit-Sinochip kann eine CRC16 - Berechnung mit weniger als 100 Bytes Code durchführen.
Drei-Schiff - Architektur für die Fehlererkennung
Die Fehlererkennung der Modbus-seriellen Kommunikation ist in drei Ebenen unterteilt, die den gesamten Kommunikationsstack von oben nach unten abdecken:
应用层:异常响应码 + 超时重发
↓
帧层 :CRC-16(RTU)或 LRC(ASCII)
↓
字符层:奇偶校验(Even/Odd/None)Zeichen-EbeneSchützen Sie die Übertragungsaufrichtigkeit jedes Byte - 8 Datenbits in einem UART-Frame plus ein Check-Bit, die Hardware automatisch überprüft.
Frame-Ebeneschützt die Integrität der gesamten Modbus-Nachricht - von der Station-Adresse bis zum letzten Datenbyte. Wenn die Frame-Verifikation nicht bestehen kann, wird die Nachricht vom Gerät leise verworfen, ohne irgendwelche Antworten zu geben.
Die Anwendungsschichtbehandelt "physische Schicht in Ordnung, aber logische Probleme" - z. B. das von Ihnen angeforderte Funktionscode-Gerät wird nicht unterstützt, die Registeradresse existiert nicht oder der Datenwert liegt außerhalb des Bereichs. Diese Fehler werden der Masterstation über einen Ausnahme-Antwortcode mitgeteilt.
Die drei Ebenen haben ihre eigenen Aufgaben, aber es ist einfacher für Ingenieure, die Ausnahmecodes in der Anwendungsschicht zu sehen, während sie die Paritätsfehler in der physischen Schicht ignorieren - da die Paritätsfehler auf der Hardware-Ebene des Geräts verworfen werden und Sie sie nicht sehen können.
II. Zeichen-Ebene: Paritätsprüfung
2.1 Prinzip
Die Parität ist das Hinzufügen eines Prüfsbits zu jedem UART-Zeichen - Frame, so dass die Gesamtzahl der "1" im gesamten Frame ungerade (Odd) oder sogar (Even) ist.
Die Definition von Zeichenfrämen für Modbus variiert von Modus zu Modus:
| Modus | Startbit | Datenbit | Check-Bits | Stop-Bits | Gesamtzahl der Bits |
|---|---|---|---|---|---|
| RTU (mit Check) | 1 | 8 | 1 | 1 | 11 |
| RTU (ohne Check) | 1 | 8 | 0 | 2 | 11 |
| ASCII | 1 | 7 | 1 | 1 | 10 |
Beachten Sie, dass die RTU keine Überprüfung verwendet 2 Stop-Bits, um die Anzahl der Bits zusammenzufassen - dies ist eine obligatorische Anforderung, viele Leute haben No Parity bei der Konfiguration der seriellen Port-Parameter gewählt, aber vergessen, die Stop-Bits von 1 in 2 zu ändern, das Ergebnis der Kommunikation ist instabil, aber nicht vollständig nicht funktioniert, sehr schwierig zu überprüfen.
2.2 Berechnung Beispiele
Nehmt ein Byte:11000101。Die Zahl von 1 ist 4 (gerade Zahlen).
- Parity → Checkbits = 0, hält die Gesamtzahl von 1s auf eine gerade Zahl (4)
- Ungerade → Checkbits = 1, macht die Gesamtzahl von 1s auf eine ungerade Zahl (5)
Die Hardware UART berechnet und füllt die Checkbits automatisch beim Senden und überprüft automatisch beim Empfangen. Wenn die Empfängerprüfung fehlschlägt, markiert die UART-Hardware einen Paritätsfehler, verwerft aber die Daten nicht automatisch - es liegt an der Software, ob sie verworfen werden oder not.
2.3 Einschränkungen der Paritätsprüfung
Die Paritätsprüfung erkennt nurungerade Bitfehler. Wenn die Übertragung gerade 2 Bits umgekehrt ist, die Parität bleibt unverändert, wird die Überprüfung durchlaufen, aber die Daten sind bereits falsch. Auf RS - 485 verursacht elektromagnetische Störungen eine viel höhere Wahrscheinlichkeit, dass ein einzelnes Bit-Flip verursacht wird als ein gleichzeitiges Multi-Bit - Flip, so dass die Parität in der Praxis noch nützlich ist - aber sie ist keineswegs allumfassend.
DebuggerempfehlungWenn Sie vermutet haben, dass es ein Problem mit der Leitungsqualität gibt, nutzen Sie einen Logik-Analysator, um den UART-Frame zu graben, um die Paritätsfehlermarker für jedes Zeichen zu sehen. Serial Port-Assistenten (wie SSCOM) können die Anzahl der Paritätsfehler anzeigen, wenn dieser Zähler steigt, zeigt, dass Ihre physikalische Leitung ein Problem mit elektromagnetischen Störungen hat - möglicherweise das Kabel nicht abgeschirmt, und der Frequenzumrichter in eine Brücke gegangen ist, oder der Terminationswiderstand ist nicht angeschlossen, was zu einer Signalreflexion führt.
Frame-Layer (I): LRC-Prüfungen - Modbus-ASCII - Modus
3.1 Was ist LRC
Längste Redundanz-Prüfung (LRC) ist ein Frame-Prüfung - Algorithmus, der im Modbus-ASCII - Modus verwendet wird. Es handelt sich um einen 8 - Bit (1 - Byte) - Prüfcode, der am Ende des Frames liegt und alle Bytes von der Station-Adresse bis zum Datenbereich umfasst, ohne den Frame-Header (Doppelpunkt:) und den Frame-End (Carrier-Return - Zeilenwechsel-Zeichen CR / LF).
3.2 Modbus ASCII-Frame - Struktur
: 01 03 21 02 00 02 D7 CR LF
│ └─────────┬────────────┘ │
帧头 LRC 校验范围 LRC码Ein vollständiger Modbus ASCII-Anfrage - Frame:
:0103020002F8rn3.3 Das LRC-Algorithmus
ist extrem einfach - in drei Schritten:
- addiert alle Bytes des Adresscodes an den Datenbereich und summiert
- die unteren 8 Bits (modulo 256)
- ergänzt den Code (256 subtrahiert diesen Wert oder 1 addiert 1 nach Bit)
Beispiel: Nachricht: 01 03 21 02 00 02
求和:0x01 + 0x03 + 0x21 + 0x02 + 0x00 + 0x02 = 0x29
低 8 位:0x29
补码:256 - 0x29 = 0xD7
LRC 校验码 = D7Vollständiger Frame lautet:: 01 03 21 02 00 02 D7 rn
C-Implementierung von 3.4 LRC
/**
* 计算 Modbus ASCII LRC 校验码
* buf: 需要校验的数据(从地址码到数据区的所有字节)
* len: 字节数
* 返回值: 1 字节 LRC 校验码
*/
unsigned char LRC(unsigned char *buf, unsigned short len)
{
unsigned char lrc = 0;
while (len--) {
lrc += *buf++;
}
// 取补码:256 - lrc,等效于 (-lrc)
return (unsigned char)(-lrc);
}Verifiziert mit Python:
def calc_lrc(data: bytes) -> int:
"""计算 Modbus ASCII LRC 校验码"""
return (256 - (sum(data) & 0xFF)) & 0xFF
# 测试
msg = bytes([0x01, 0x03, 0x21, 0x02, 0x00, 0x02])
lrc = calc_lrc(msg)
print(f"LRC: 0x{lrc:02X}") # 输出: LRC: 0xD7Einschränkungen von 3.5 LRC
LRC erkennt nur einen gewissen Anteil an Fehlern. Wenn die gleichen Bit-Bits von zwei Bytes gleichzeitig umgedreht werden (z. B. der dritte Bit von Bytes A von 0 zu 1 und der dritte Bit von Bytes B von 1 zu 0), bleibt das Ergebnis der Summe unverändert und die LRC-Prüfung ist bestanden. Aus diesem Grund verwendet Modbus RTUs den stärkeren CRC - 16 anstelle von LRC-RTU - Modus für die binäre Datenübertragung, der höhere Zuverlässigkeit erfordert, während der ASCII-Modus hauptsächlich für das Debuggen und die Kompatibilität mit älteren Geräten verwendet wird.
Frame-Schicht (II): CRC - 16 - Überprüfung - Modbus-RTU - Modus
4.1 CRC - 16 Mathematische Definition von Modbus
Modbus RTU verwendet den CRC - 16 - Algorithmus mit folgenden Parametern:
| Parameter: | 值 |
|---|---|
| Breite | 16 - Bit |
| Polynomial erstellen | 0x8005 (x16 + x15 + x2 + 1) |
| Tatsächliches Operationspolynomial | 0xA001 (0x8005 - Bit-Inversion) |
| Anfangswert | 0xFFFF |
| Eingabe-Byte - Reflexion | 否 |
| Ausgabe CRC-Reflexion | ist (End-Ergebnis High-Low - Byte-Switch) |
| Ausgabe Exclusive-OR - Wert | 0x0000 |
Bit-Inversion ist hier ein leicht verwirrendes Konzept in der CRC-Parameter - Architektur. Modbus-Berechnungen werden tatsächlich bitweise verarbeitet, in die Richtung LSB verschoben, mit Inversion Polynomial 0xA001, und das Ergebnis ist natürlich umgekehrt - so dass letztendlich keine weitere globale Inversion erforderlich ist, sondern nurHigh-Low - Byte-Austauscherforderlich ist. Bei der Übertragung werden die niedrigen Bytes vor und die hohen Bytes hinter.
4.2 CRC - 16 Modbus-Algorithmus - Ablauf (Bit-für-Bit - Berechnung)
Die Bit-für-Bit - Berechnung ist zwar langsam, lässt aber deutlich sehen, was in jedem Schritt passiert:
- vorinstellte 16 - Bit-CRC - Register als
0xFFFF - wird das erste Byte der Nachricht mit den niedrigen 8 - Bit-CRC - Register exklusiv OR, das Ergebnis zurück in das CRC-Register
- CRC-Register nach rechts verschoben 1 Bit, die höchste Bit ergänzt 0, überprüfen Sie die niedrigste Verschiebung Bit
- verschoben aus Bit = 1 → CRC-Register und 0xA001 exklusiv OR;
- Wiederholen Sie die Schritte 3 bis 4 insgesamt 8 mal (mit 8 Bits eines Bytes verarbeitet)
- Wiederholen Sie die Schritte 2 bis 5, um das nächste Byte der Nachricht zu verarbeiten
- Nachdem alle Byte-Verarbeitung abgeschlossen ist, wird das CRC-Register mit niedrigem Byte vor und hochem Byte hinter dem CRC - 16 - Check-Code
4.3 CRC - 16 Modbus-C - Sprache-Implementierung
/**
* 计算 Modbus RTU CRC-16 校验码(逐位计算法)
* buf: 需要校验的数据(从地址码到数据区的所有字节)
* len: 字节数
* 返回值: 16 位 CRC 值(低字节在前)
*/
unsigned short CRC16_Modbus(unsigned char *buf, unsigned short len)
{
unsigned short crc = 0xFFFF;
unsigned short i, j;
for (i = 0; i < len; i++) {
crc ^= buf[i]; // 步骤 2
for (j = 0; j < 8; j++) { // 步骤 3~5 循环 8 次
if (crc & 0x0001) {
crc = (crc >> 1) ^ 0xA001; // 移出位为 1
} else {
crc >>= 1; // 移出位为 0
}
}
}
// 注意:Modbus CRC 发送时低字节在前
return crc;
}4.4 Tabellensuche - Standard-Implementierung auf eingebetteten Geräten
Bit-by - bit-Berechnung pro Byte 8 - mal Schleife, die für die eingebettete MCU zu groß ist. Das Engineering verwendet die Tabellensuchmethode, berechnet 256 Bytes CRC-Wert im Voraus, pro Bytes nur eine Tabellensuche + ein Exklusiv-OR + ein Verschiebung.
High-Level - Tabellen-Suche(am häufigsten verwendet):
/* CRC 高位表 */
static const unsigned char auchCRCHi[] = {
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
/* ... 完整 256 项,此处省略 */
};
/* CRC 低位表 */
static const unsigned char auchCRCLo[] = {
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,
0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
/* ... 完整 256 项,此处省略 */
};
unsigned short CRC16_Modbus_Table(unsigned char *buf, unsigned short len)
{
unsigned char crcHi = 0xFF;
unsigned char crcLo = 0xFF;
unsigned short index;
while (len--) {
index = crcLo ^ *buf++;
crcLo = crcHi ^ auchCRCHi[index];
crcHi = auchCRCLo[index];
}
return (crcHi << 8) | crcLo;
}Die vollständige High-Level - Tabelle mit insgesamt 512 Bytes kann direkt aus dem Modbus-Protokoll - Spezifikation-Anlage kopiert werden, die vollständige Beispieltabelle auf Seite 40 der Modbus.org V1.1b3 - Spezifikation enthält.
4.5 Verifizieren Sie Ihre CRC-Implementierung
Test mit bekannten Nachrichten:
报文: 01 03 00 00 00 01
正确的 CRC: 84 0A(低字节在前)
验证步骤:
crc = 0xFFFF
crc ^= 0x01 → 0xFFFE
bit0=0, crc>>1 → 0x7FFF
bit1=1, (0x3FFF) ^ 0xA001 → 0x9FFE
...
最终 crc = 0x0A84
发送时低字节在前: 84 0AGesamte Nachrichtenübertragungsequenz:01 03 00 00 00 01 84 0A
Sie können auch CRCs direkt mit Modbus Poll oder Modbus-Applets berechnen, um Ihren Code zu überprüfen.
4.6 Die Fähigkeit des CRC-Fehlers
CRC - 16 kann folgende Fehlerarten erkennen:
- Alle Einzel-Bit - Fehler
- Alle Doppel-Bit - Fehler (wenn die Nachricht nicht mehr als 32.767 Bit beträgt)
- Alle ungeraden Einzel-Bit - Fehler
- Alle Burst-Fehler, Länge ≤ 16 Bits
- 99,998% Längere Burst-Fehler
Einfach gesagt, unter der Voraussetzung, dass Modbus-Frame normalerweise nicht mehr als 256 Bytes überschreitet, kann CRC - 16 fast alle Übertragungsfehler in der physischen Schicht erfassen. Die Daten, die mit CRC überprüft werden, können im Grunde vertrauenswürdig sein.
V. Anwendungsschicht: Außergewöhnliche Antwortcode
Die physische Schicht und die Frame-Prüfung wurden bestanden und ein vollständig gültiger Modbus-Frame wurde vom Gerät empfangen - aber logisch falsch. Anstatt zu schweigen, gibt das Slave-Gerät eine Ausnahmeantwort zurück und sagt der Master-Station: „Ich kann nicht tun, was du mir sagen willst."
5.1 Frameformat für Ausnahmeantworten
Der Unterschied zwischen normalen und Ausnahmeantworten besteht nur in einem:Das höchste Bit des Funktionscodes。
- Normale Antwort: Funktionscode = ursprüngliche Funktionscode (z. B. 0x03 Lesen-Halt - Register)
- Ausnahmeantwort: Funktionscode = Original-Funktionscode + 0x80 (z. B. 0x83), gefolgt von einem Byte-Ausnahmecode
Beispiel: Master-Anforderung Lesen-Register01 03 00 00 00 01 84 0A
Normaler Antwort:01 03 02 00 7B F9 8D(2 - Byte-Daten zurücklesen00 7B)
Ausnahmeantwort (vorausgesetzt, dass das Register nicht vorhanden ist):01 83 02 C0 F1
83= 0x03 (Original-Funktionscode) + 0x8002= Ausnahmecode für "illegale Datenadresse"
5.2 Standard-Ausnahmecode - Schnellsuchliste
| Ausnahmecode | Name | Bedeutung | Häufige Ursachen |
|---|---|---|---|
| 0x01 | Illegal Function | Illegale Funktionscode | Das Gerät unterstützt diesen Funktionscode nicht (z. B. Befehle an ein Lesegerät ausstellen) |
| 0x02 | Illegal Data Address | Ungültige Datenadresse | Registeradresse außerhalb des Bereichs oder Startadresse + Anzahl überschritten |
| 0x03 | Illegal Data Value | Ungültiger Datenwert | Der geschriebene Wert überschreitet den zulässigen Bereich des Registers |
| 0x04 | Slave Device Failure | Ausfall des Slave-Geräts | Unwiederherstellbarer Fehler beim Ausführen eines Vorgangs beim Slave-Gerät |
| 0x05 | Acknowledge | Bestätigung (in Bearbeitung) | Die Anforderung wurde akzeptiert, aber die Bearbeitung dauert länger, die Masterstation sollte warten |
| 0x06 | Slave Device Busy | Das Slave-Gerät ist beschäftigt | Das Gerät verarbeitet einen anderen Befehl und kann vorübergehend nicht reagieren. |
| 0x07 | Negative Acknowledge | Negative Bestätigung | Der Slave kann diese Funktion nicht ausführen.(Normalerweise nicht spezifische Fehler) |
| 0x08 | Memory Parity Error | Memory Parity-Fehler | Erweiterte Dateibereich-Konsistenz - Überprüfung fehlschlägt |
0x01 bis 0x04 sind am häufigsten, während 0x05 bis 0x08 auf herkömmlichen Modbus-Geräten relativ selten sind - viele Gerätehersteller implementieren nur die ersten vier Ausnahmecodes.
5.3 Tatsächliche Anwendung von ungewöhnlichem Code
"Warum gibt das Gerät keine Daten zurück?" Nachdem Sie Probleme mit der physischen Schicht und dem CRC behoben haben, sehen Sie sich den Ausnahmecode an:
0x01 (illegale Funktion)Sie haben einen Funktionscode gesendet, der von einem Gerät nicht unterstützt wird. Das häufigste Szenario ist - Sie lesen mit 0x03 (Lese-Halt - Register) einen analogen Eingang, auf den Sie nur über 0x04 (Lese-Eingang - Register) zugreifen können. Durchblättern Sie die Registerkarte im Gerätemanual und bestätigen Sie den entsprechenden Zugangsfunktionscode für die Adresse.
0x02 (illegale Adresse): Ihre Startadresse und die Anzahl der Anfragen liegen außerhalb des Adressbereichs, der von Ihrem Gerät unterstützt wird. Wenn das Gerät nur 10 Hold-Register (Adressen 0 - 9) hat, fragen Sie 12 Register ab der Adresse 0 an - die Grenze ist überschritten. Umgehung: Reduzieren Sie die Anzahl der Register pro Anforderung oder bestätigen Sie den Gerätetyp mit 0x11 (Report Slave Station ID) vor dem Lesen.
0x03 (illegaler Datenwert)Der Wert, den Sie schreiben möchten, ist für das Gerät nicht sinnvoll. Wenn das Gerät einen Datenbereich von 0 - 100 unterstützt, schreiben Sie 200. Oder die Anzahl der Datenbyte beim Schreiben entspricht nicht der Länge des Funktionscodes.
Ganz ohne Antwort.Kein ungewöhnlicher Code, sondern gar nichts. Mögliche Ursachen: CRC-Fehler (still vom Gerät verworfen), Framelabstand (3,5 Zeichen) nicht korrekt implementiert, Gerätadresse nicht übereinstimmt. Zu diesem Zeitpunkt müssen Sie den Bus mit einem Logik-Analysator greifen, um zu bestätigen, was vom Gerät empfangen wurde, und ob es eine Paritätsfehlermarke auf der UART-Hardware gibt.
6. Overtime Mechanismus: Die letzte Verteidigungslinie der Hauptstation
Die Modbus-Spezifikation verlangt, dass die Masterstation eine Timeout-Zeit konfiguriert. Die Zeitüberschreitung wird ausgelöst, wenn:
- Nach der Anforderung von der Master-Station, keine Antwort von der Slave-Station innerhalb der angegebenen Zeit
- Frame-Fehler von der Slave-Station erkannt (CRC / LRC fehlschlägt), Frames leise verworfen, Master-Station kann keine Antwort erhalten
- Slave-Station - Adresse nicht vorhanden - - Nachricht an eine leere Adresse gesendet
Es gibt eine Einschränkung für die Einstellung der Zeitüberschreitung:muss größer als die maximal mögliche Antwortzeit des Slaves sein.。Die Berechnungsmethode lautet:
超时时间 > 传输延迟 × 2 + 从站处理时间Bei 9600 bps beträgt eine typische Modbus-RTU - Anfrage (Lesen eines Registers) etwa 8 Bytes = 64 Bits und die Übertragungszeit = 64 / 9600 ≈ 6,7 ms. Die Antwort beträgt ca. 7 Bytes = 56 Bits und die Übertragungszeit beträgt ≈ 5,8 ms. Zusätzlich mit der Verarbeitungszeit von der Station (vorausgesetzt, dass die langsamste 50ms), die bidirektionelle Gesamtzeit beträgt etwa 6,7 + 50 + 5,8 ≈ 62,5ms. Lassen Sie einen doppelten Rest, die Überschreitung von 100 - 200ms ist vernünftig.
Wenn es mehrere Slave-Stationen auf dem Bus gibt, sollten Sie die am langsamsten abgegebenen Geräte berücksichtigen (z. B. einige alte SPS, die eine Anforderung 100 ms verarbeiten). Die Modbus-Spezifikation empfiehlt eine Standardzeitüberschreitung von 1 Sekunde - ein Wert, der für moderne Geräte übermäßig ist, aber als Anfangswert für den Debuggerinn ist es vernünftig.
7. Vollständige Entfernung von Hindernissen
Wenn Sie mit einem „Modbus-Kommunikationsfehler" konfrontiert sind, überprüfen Sie diese Reihenfolge Stufenweise:
| 层 | Prüfeinträge | Werkzeuge | Beurteilung |
|---|---|---|---|
| Physikalische Schicht | RS - 485 Verkabelung (A / B, Common Ground, Terminationswiderstand) | Multimeter | Leitung, Bus-Leerstand ≥ 200mV |
| Zeichen-Schicht | Serielle Anschlussparameter (Budrate, Datenbit, Checkbit, Stopbit) | Logik-Analysator | Messte Bitbreite = 1 / Baud |
| Zeichen-Ebene | Paritätsfehler | Logik-Analysator / Serial-Assistent | Paritätsfehler-Zahl = 0 |
| Frame-Ebene | CRC-Prüf | Modbus-Applet / Self-Schreib - Code | CRC-Empfangen = CRC-Berechnung |
| Frame-Layer | Frame-Intervall (≥ 3,5 Zeichenzeit) | Logic Analyzer | Inter-Frame - Freizeit ≥ 3.6ms @ 9600bps |
| Anwendungs-Layer | Slave-Station - Adresse | Gerätemanual / Wählschalter | Anforderungsadresse = tatsächliche Adresse der Slave-Station |
| Anwendungs-Schicht | Funktionscode + Adressbereich | Geräte-Register - Zuordnungstabelle | Funktionscode und Register-Adressen im Geräteunterstützungsbereich |
| Anwendungs-Schicht | Ausnahme-Antwort - Code | Serial-Assistent / Pack-Grab | Funktionscode Überprüfen von Ausnahme-Codes, wenn der höchste Bit 1 ist |
| Anwendungsschicht | Timeout | Paket-Grab - Zeitstempel | Reaktionszeit < Timeout Konfiguration |
Besondere Hinweis: Wenn Sie mit Standardmodbus-Anfragen wie "01 03 00 00 01" interagieren, senden Sie nicht direkt mit ASCII-Zeichenfolgen - Sie müssen einen Binärrahmen senden. Anfänger können0x31 0x30 0x33 0x30 0x30 0x30 0x30 0x30 0x30 0x31(die ASCII-Zeichenfolge "010300000001") im ASCII-Modus anstelle der sechs Bytes von01 03 00 00 00 01ausführen. Dieser Fehler hat fast jeder, der Modbus lernt, gemacht.
Die richtige Berechnung des CRC-Prüfcodes ist ein Grundstein für die zuverlässige Kommunikation von Modbus. Aber 90 Prozent der Probleme am Baustand liegen nicht im CRC selbst - in der Verkabelung, in den Parametern, in der Grenze des Adressbereichs, in der Auswahl des Funktionscodes. CRC ist eher wie ein Sicherheitsnetz, das Ihnen Vertrauen gibt, wenn Sie sagen: „Daten sollten korrekt sein". Wenn die Daten wirklich falsch sind, überprüfen Sie zuerst einige Ebenen.
L egen Sie den Code in diesem Artikel in Ihr Projekt und überprü fen Sie es , und er war ten Sie nicht , dass Sie einen belie bi gen Teil des CR C - C odes im Internet kopi eren können - ich habe zu viele F älle gesehen , in denen die CR C - V eri fizi erung aufgrund von By te - Se qu enz - Um kehr ungen immer feh l gesch lagen ist . Inter essi ert kann man sich um dre hen .Modbus.orgDer Anhang der V 1.1 b 3 - Spe zi fikation enthält voll stän dige Daten für die CR C - S uch tab elle und of fizi elle Beisp iele für die Imp lem enti erung von High - L ow - Bit .
Probleme noch mal reden.
1