środa, 21 czerwca 2017

Protokoły komunikacyjne - ramka Modbus Over TCP

Modbus Over TCP to kolejna wersja protokołu Modbus dla sieci Ethernet. Spotykana szczególnie często w systemach, w których sieci Ethernet poprzez odpowiednie konwertery stykają się z magistralami do szeregowej transmisji danych (jak RS-232, RS-433, RS-485), ale nie tylko. Zasada jest tu bardzo prosta.

Do ramki protokołu Modbus RTU dokładany jest nagłówek protokołu TCP.

Może to też być ramka protokołu Modbus ASCII, lub dokładany może być nagłówek protokołu UDP, ale są to bardzo rzadko spotykane przypadki.

Protokoły komunikacyjne - ramka Modbus TCP

Modbus TCP to wersja dostosowana do komunikacji w sieci Ethernet. Nietrudno się domyślić, że korzysta z protokołu TCP. Istnieje również wersja Modbus UDP, ale w praktyce nigdy się z nią nie spotkałem. Nie ma sensu opisywać w tym wpisie struktury protokołu TCP, z dwóch powodów. "Po pierwsze primo"* jest to podstawowa wiedza sieciowa i w sieci jest mnóstwo informacji na ten temat, na przykład TUTAJ. "Po drugie primo"* prawie na pewno nie będzie go trzeba samodzielnie implementować.

Ramka protokołu Modbus TCP jest bardzo podobna do ramki z wersji RTU. Na końcu nie ma sumy kontrolnej, to załatwia protokół TCP. Na początku z kolei występuje kilka dodatkowych elementów:
  • Identyfikator transakcji
  • - to dowolna wartość, ale powinna być taka sama w zapytaniu i odpowiedzi
  • Identyfikator protokołu
  • - 0 (słownie "zero")
  • Rozmiar datagramu
  • - to liczba bajtów datagramu zaczynając od adresu Modbus


ODCZYT

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

Identyfikator transakcji 2 bajty
Identyfikator protokołu 2 bajty
Rozmiar datagramu 2 bajty
Adres Modbus 2 bajty
Kod funkcji 2 bajty
Adres w pamięci 4 bajty
Ilość danych 4 bajty

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

Identyfikator transakcji 2 bajty
Identyfikator protokołu 2 bajty
Rozmiar datagramu 2 bajty
Adres Modbus 2 bajty
Kod funkcji 2 bajty
Rozmiar danych 2 bajty
Dane N bajtów


ZAPIS

Struktura ramki zapytania i odpowiedzi dla funkcji 5 i 6:

Identyfikator transakcji 2 bajty
Identyfikator protokołu 2 bajty
Rozmiar datagramu 2 bajty
Adres Modbus 2 bajty
Kod funkcji 2 bajty
Adres w pamięci 4 bajty
Dane 4 bajty

Struktura ramki zapytania dla funkcji 15 i 16:

Identyfikator transakcji 2 bajty
Identyfikator protokołu 2 bajty
Rozmiar datagramu 2 bajty
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

Struktura ramki odpowiedzi dla funkcji 15 i 16:

Identyfikator transakcji 2 bajty
Identyfikator protokołu 2 bajty
Rozmiar datagramu 2 bajty
Adres Modbus 2 bajty
Kod funkcji 2 bajty
Adres w pamięci 4 bajty
Ilość danych 4 bajty

PS. "Po pierwsze primo" i "po drugie primo" to oczywiście cytaty z filmu "Poranek kojota".