Modbus ASCII-Datennachrichten

kostenlosKostenloses technisches Material

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

Modbus ASCII-Datennachrichten

Modbus ASCII ist ein Modbus-Nachrichtenrahmen, im Vergleich zu RTU, ASCII-Transmission wird nach Zeichen übertragen, die Datenmenge wird mehr als RTU übertragen, so dass die allgemeine Verwendung von RTU, wenn die Datenmenge groß ist, wird ASCII verwendet, wenn die Datenmenge klein ist, und dann wird der Anfang und das Ende des ASCII-Protokoll - Rahmens hinzugefügt, ersetzt den Überprüfungsalgorithmus, die folgenden detaillierten Einführung des ASCII-Protokolls

Frame Format

Modbus ASCII-Modus Kommunikationsframe Format wie folgt:

NameLänge (Bytes)Beschreibung
Start1Beginnt mit einem Doppelpunkt:und hat den ASCII-Hexadezimalwert 3A
Address2Hexadezimal-Knoten - Adresse, Zeichen für
Function2Hexadezimal-Funktionscode, Zeichen für
Datan x 2n ist die Anzahl der Datenbytes, abhängig von dem Funktionscode
LRC2LRC Redundanz-Checkcode
End2CR / LF

Hinweis: Adresse, Funktion, Daten und LRC sind alle hexadezimal-lesbare Zeichenpaare, die 8 - Bit-Werte (0 - 255) darstellen; dh: In Modbus ASCII wird jedes Datenbyte in zwei Bytes aufgeteilt, die zwei ASCII-Zeichen in einem hexadezimalen Wert darstellen.

KomponentenBeschreibungZeichenASCII-Darstellung
StartNachrichtenbeginn1 CHAR:
AddressKnotenadresse (hexadezimal dargestellt)2 CHARS
FunctionFunktionscode (hexadezimal dargestellt)2 CHARS
DataDaten (je nach Funktionscodeänderungen, hexadezimal dargestellt)n CHARS
LRC CHECKLängsredundanz-Checkcode (LRC)2 CHARS
ENDNachrichtende, Wagen-Zeichenwechsel2 CHARSCRLF

Im ASCII-Modus erscheint jeder Teil einer Modbus-Nachricht in einer bestimmten Anzahl von Zeichen und in einem bestimmten Format wie folgt:

:AA BB CC...DD EE<CRLF>
  • :- Beginnsymbol für die Nachricht.
  • AA- Knotenadresse, hexadezimal dargestellt.
  • BB- Funktionscode, hexadezimal dargestellt.
  • CC...DD- ein Datenfeld, das je nach Funktionscode und der Datenlänge variiert, die übertragen werden müssen.
  • EE- LRC-Prüfcode zur Fehlererkennung.
  • <CRLF>- Endzeichen für die Nachricht, das für Carriage Return Line Feed steht.
Modbus ASCII-Datennachrichten插图

Übertragungszustand des ASCII-Frame

Modbus ASCII-Datennachrichten插图1

Informationen über das Zustandsdiagramm:

1) Der Zustand "Leer" ist ein normaler Zustand, in dem keine Send - und Empfangsnachrichten verarbeitet werden müssen.

2) Jedes Mal, wenn das Zeichen ":" empfangen wird, zeigt der Beginn einer neuen Nachricht an. Wenn das Zeichen während des Empfangs einer Nachricht empfangen wird, wird die aktuelle Nachricht als unvollständig angesehen und verworfen. Ein neuer Empfangspuffer wurde neu zugewiesen.

3) Nachdem das Ende des Frames erkannt wurde, wird die LRC-Berechnung und - Überprüfung abgeschlossen. Anschließend wird das Adressfeld analysiert, um festzustellen, ob der Frame an dieses Gerät gesendet wird, und wenn nicht, wird der Frame verworfen. Um die Empfangsverarbeitungszeit zu reduzieren, kann das Adressfeld beim Empfang analysiert werden, ohne bis zum Ende des gesamten Frames zu warten.

ASCII-Frame - Nachrichtenübertragung

Da ASCII-Nachrichtenframe stark von RTU-Nachrichtenframe unterscheiden, haben ASCII-Nachrichtenframe Start - und End-Identifikationen, während RTU-Frames keine solche Identifikation haben. So ist der Empfang von ASCII-Nachrichtenrahmen viel einfacher und bequemer und benötigt keine t3,5 - Frame-Intervall - Zeit.

Um jedoch sicherzustellen, dass der empfangene Nachrichtenrahmen kontinuierlich ist, kann die Übertragungszeit zwischen den Zeichen vereinbart werden. Es wird allgemein angenommen, dass die Zeichen-Zeitintervalle in der Nachricht eine Sekunde erreichen können, wenn diese Zeitspanne überschritten wird, wird angenommen, dass ein Fehler aufgetreten ist, um diesen Rahmen von Nachrichtendaten zu verwerfen und den Empfang neu zu beginnen.

Funktionscode

Der am häufigsten verwendete Funktionscode im ASCII-Modus ist identisch mit der Definition des Funktionscodes im RTU-Modus. Hier sind einige grundlegende Funktionscodes und ihre Beschreibungen:

ZugriffsdresseZuordnungsdresseBeschreibungFunktionenR/W
1 bis 10000address - 1Coils01.05.15R/W
10001 bis 20000address - 10001Discrete Inputs02R
30001 bis 40000address-30001Input Registers04R
40001 ~ 50000address-40001Holding Registers03/06/16R/W

ASCII-Transferbeispiel

Zum Lesen von zwei Registeren für die Adresse0x20C1müssen Sie beispielsweise die folgende ASCII-Meldung senden:

:010420C1000218<CRLF>

Anforderung:

  • :- Beginn der Nachricht - 0x3A
  • 01- Adresse von der Station - 0x01
  • 04- Funktionscode (Lese-Eingabe - Register) - 0x04
  • 20C1- Adresse des zu lesen Registers - 0x20C1
  • 0002- Länge des zu lesen Registers (muss 2) - 0x0002
  • 18- LRC-Prüfcode
  • <CRLF>-Nachricht beendet, Wagenrückkehr - 0x0D0A

Reaktion:

:01040400001234B1<CRLF>

Antwort:

  • :- Beginn der Nachricht - 0x3A
  • 01- Adresse der Slave-Station - 0x01
  • 04- Funktionscode (Lese-Eingabe - Register) - 0x04
  • 04- Lese-Daten - Länge (4 Byte) - 0x04
  • 00001234- Ausgelesener Wert von VAR1 - 0x00001234
  • B1- LRC-Prüfcode
  • <CRLF>Nachricht beendet, Zeile wechseln - 0x0D0A.

üblicher Funktionsbetrieb.

Hier sind Beispiele für häufig verwendete Modbus-Funktionscodes und deren Anfragen und Antworten:

Funktion 01 (01H) Lesen der Spule

  • Anforderung: Lesen Sie den ON / OFF-Status der Spule im Slave.
Modbus ASCII-Datennachrichten插图2
  • Antwort: Die Coil-Status - Antwort-Meldung wird als ein Repräsentant für eine Spule pro Bit des Datenfelds verpackt.
Modbus ASCII-Datennachrichten插图3

Funktion 02 (02H) Diskreteingaben lesen

  • Anforderung: Lesen Sie den ON / OFF-Status der diskreten Eingaben des Slaves.
Modbus ASCII-Datennachrichten插图4
  • Antwort: Die Antwortnachricht für den diskreten Eingangszustand ist identisch mit dem Zustand der Spule konstruiert.
Modbus ASCII-Datennachrichten插图5

Funktion 03 (03H) Read Hold Register

  • Anforderung: Lesen Sie den Binärinhalt des Hold Registers des Slaves.
Modbus ASCII-Datennachrichten插图6
  • Antwort: Haltet die Registerdaten in zwei Byte in jedem Register verpackt.
Modbus ASCII-Datennachrichten插图7

Funktion 04 (04H) Eingabe-Register lesen

  • Anforderung: Lest den Binärinhalt des Eingabe-Registers vom Slave.
Modbus ASCII-Datennachrichten插图8
  • Antwort: Die Antwortmeldung zum Lesen der Eingabe-Registerdaten ist identisch mit dem Lesen des Halte-Registers aufgebaut.
Modbus ASCII-Datennachrichten插图9

Funktion 05 (05H) Single-Coil - Schreiben

  • Anforderung: Schreibt eine einzelne Spule auf ON oder OFF.
Modbus ASCII-Datennachrichten插图10
  • Antwort: Die normale Antwort ist das Echo der Anfrage.
Modbus ASCII-Datennachrichten插图11

Funktion 06 (06H) Single Hold Register schreiben

  • Anforderung, einen Wert in ein einzelnes Hold Register zu schreiben. Wenn die Funktion ausgestrahlt wird, legt die Funktion den gleichen Registerverweis auf allen angeschlossenen Slaves fest. Die Anforderungsmeldung gibt den zu schreibenden Registerverweis an (angeben Sie die Adresse und den Wert).
Modbus ASCII-Datennachrichten插图12
  • Antwort

    Eine normale Antwort ist ein Echo der Anforderung, die nach dem Schreiben des Inhalts des Hold-Registers zurückgegeben wird.

Modbus ASCII-Datennachrichten插图13

Funktion 15 (0FH) Schreiben mehrerer Spulen

  • Anforderung: Schreibt jede Spule in einer Spulensequenz ON oder OFF.
Modbus ASCII-Datennachrichten插图14
  • Antwort: Die normale Antwort gibt die Adresse, den Funktionscode, die Startadresse und die Anzahl der geschriebenen Spule zurück.
Modbus ASCII-Datennachrichten插图15

Funktion 16 (10H) Schreiben mehrerer Hold-Register

  • Anforderung: Schreiben Sie einen Wert in eine Sequenz von Hold-Registern.
Modbus ASCII-Datennachrichten插图16
  • Antwort: Die normale Antwort gibt die Adresse, den Funktionscode, die Startadresse und die Anzahl der geschriebenen Register zurück.
Modbus ASCII-Datennachrichten插图17

LRC-Prüfungscode

Der LRC-Prüfcode wird wie folgt berechnet:

unsigned char ucMBLRC( unsigned char * pucFrame, unsigned short usLen )
{
    unsigned char ucLRC = 0;  /* LRC char initialized */

    while( usLen-- )
    {
        ucLRC += *pucFrame++;   /* Add buffer byte without carry */
    }

    /* Return twos complement */
    ucLRC = ( UCHAR ) ( -( ( CHAR ) ucLRC ) );
    return ucLRC;
}
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.