poniedziałek, 12 września 2016

Protokoły komunikacyjne - ramka Modbus ASCII

Modbus ASCII to szatański wynalazek. Wie o tym każdy, kto go kiedyś implementował, chociaż ta wersja ma swoich zwolenników. Jest podobny do wersji Modbus RTU, ale dane są dodatkowo kodowane.

Każdy bajt jest mianowicie zapisywany za pomocą dwóch znaków w formacie heksadecymalnym. W ramce umieszczane są kody ASCII tych znaków. W efekcie każdy przesyłany bajt zajmuje 2 bajty.

Przykład:
17210 = AB16
A to kod ASCII 65
B to kod ASCII 66

Ta wersja nie wymaga przerwy na łączu, ale w zamian na początku ramki umieszczony jest zawsze znak ":" (dwukropek), a na końcu zawsze znaki CR i LF (carriage return i line feed). Ich kody ASCII to odpowiednio 58 oraz 13 i 10.

ODCZYT

Struktura ramki zapytania dla funkcji 1,2,3 i 4:

: 1 bajt
Adres Modbus 2 bajty
Kod funkcji 2 bajty
Adres w pamięci 4 bajty
Ilość danych 4 bajty
LRC 2 bajty
CR LF 2 bajty

Struktura ramki odpowiedzi dla funkcji 1,2,3 i 4:

: 1 bajt
Adres Modbus 2 bajty
Kod funkcji 2 bajty
Rozmiar danych 2 bajty
Dane N bajtów
LRC 2 bajty
CR LF 2 bajty


ZAPIS

Struktura ramki zapytania i odpowiedzi dla funkcji 5 i 6:

: 1 bajt
Adres Modbus 2 bajty
Kod funkcji 2 bajty
Adres w pamięci 4 bajty
Dane 4 bajty
LRC 2 bajty
CR LF 2 bajty

Struktura ramki zapytania dla funkcji 15 i 16:

: 1 bajt
Adres Modbus 2 bajty
Kod funkcji 2 bajty
Adres w pamięci 4 bajty
Ilość danych 4 bajty
Rozmiar danych 2 bajty
Dane N bajtów
LRC 2 bajty
CR LF 2 bajty

Struktura ramki odpowiedzi dla funkcji 15 i 16:

: 1 bajt
Adres Modbus 2 bajty
Kod funkcji 2 bajty
Adres w pamięci 4 bajty
Ilość danych 4 bajty
LRC 2 bajty
CR LF 2 bajty