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:
| Name | Länge (Bytes) | Beschreibung |
|---|---|---|
| Start | 1 | Beginnt mit einem Doppelpunkt:und hat den ASCII-Hexadezimalwert 3A |
| Address | 2 | Hexadezimal-Knoten - Adresse, Zeichen für |
| Function | 2 | Hexadezimal-Funktionscode, Zeichen für |
| Data | n x 2 | n ist die Anzahl der Datenbytes, abhängig von dem Funktionscode |
| LRC | 2 | LRC Redundanz-Checkcode |
| End | 2 | CR / 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.
| Komponenten | Beschreibung | Zeichen | ASCII-Darstellung |
|---|---|---|---|
| Start | Nachrichtenbeginn | 1 CHAR | : |
| Address | Knotenadresse (hexadezimal dargestellt) | 2 CHARS | |
| Function | Funktionscode (hexadezimal dargestellt) | 2 CHARS | |
| Data | Daten (je nach Funktionscodeänderungen, hexadezimal dargestellt) | n CHARS | |
| LRC CHECK | Längsredundanz-Checkcode (LRC) | 2 CHARS | |
| END | Nachrichtende, Wagen-Zeichenwechsel | 2 CHARS | CRLF |
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.

Übertragungszustand des ASCII-Frame

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:
| Zugriffsdresse | Zuordnungsdresse | Beschreibung | Funktionen | R/W |
|---|---|---|---|---|
| 1 bis 10000 | address - 1 | Coils | 01.05.15 | R/W |
| 10001 bis 20000 | address - 10001 | Discrete Inputs | 02 | R |
| 30001 bis 40000 | address-30001 | Input Registers | 04 | R |
| 40001 ~ 50000 | address-40001 | Holding Registers | 03/06/16 | R/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 - 0x3A01- Adresse von der Station - 0x0104- Funktionscode (Lese-Eingabe - Register) - 0x0420C1- Adresse des zu lesen Registers - 0x20C10002- Länge des zu lesen Registers (muss 2) - 0x000218- LRC-Prüfcode<CRLF>-Nachricht beendet, Wagenrückkehr - 0x0D0A
Reaktion:
:01040400001234B1<CRLF>
Antwort:
:- Beginn der Nachricht - 0x3A01- Adresse der Slave-Station - 0x0104- Funktionscode (Lese-Eingabe - Register) - 0x0404- Lese-Daten - Länge (4 Byte) - 0x0400001234- Ausgelesener Wert von VAR1 - 0x00001234B1- 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.

- Antwort: Die Coil-Status - Antwort-Meldung wird als ein Repräsentant für eine Spule pro Bit des Datenfelds verpackt.

Funktion 02 (02H) Diskreteingaben lesen
- Anforderung: Lesen Sie den ON / OFF-Status der diskreten Eingaben des Slaves.

- Antwort: Die Antwortnachricht für den diskreten Eingangszustand ist identisch mit dem Zustand der Spule konstruiert.

Funktion 03 (03H) Read Hold Register
- Anforderung: Lesen Sie den Binärinhalt des Hold Registers des Slaves.

- Antwort: Haltet die Registerdaten in zwei Byte in jedem Register verpackt.

Funktion 04 (04H) Eingabe-Register lesen
- Anforderung: Lest den Binärinhalt des Eingabe-Registers vom Slave.

- Antwort: Die Antwortmeldung zum Lesen der Eingabe-Registerdaten ist identisch mit dem Lesen des Halte-Registers aufgebaut.

Funktion 05 (05H) Single-Coil - Schreiben
- Anforderung: Schreibt eine einzelne Spule auf ON oder OFF.

- Antwort: Die normale Antwort ist das Echo der Anfrage.

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).

- Antwort

Funktion 15 (0FH) Schreiben mehrerer Spulen
- Anforderung: Schreibt jede Spule in einer Spulensequenz ON oder OFF.

- Antwort: Die normale Antwort gibt die Adresse, den Funktionscode, die Startadresse und die Anzahl der geschriebenen Spule zurück.

Funktion 16 (10H) Schreiben mehrerer Hold-Register
- Anforderung: Schreiben Sie einen Wert in eine Sequenz von Hold-Registern.

- Antwort: Die normale Antwort gibt die Adresse, den Funktionscode, die Startadresse und die Anzahl der geschriebenen Register zurück.

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;
}
Antwort veröffentlichen