Trochę teorii
Modbus jest protokołem komunikacyjnym opracowanym w 1979 roku przez firmę Modicon. Komunikacja między urządzeniami realizowana jest w architekturze master-slave/client-server. Modbus jest protokołem otwartym a co za tym idzie wszystkie niezbędne informacje do jego implementacji są ogólnodostępne. Protokół Modbus możemy spotkać pod nazwami Modbus RTU, Modbus TCP oraz Modbus ASCII. Modbus RTU bazuje na standardzie asynchronicznej transmisji szeregowej RS-232 lub RS-485, Modbus TCP bazuje na standardzie komunikacji ETHERNET TCP/IP, natomiast Modbus ASCII działa na takiej samej zasadzie co Modbus RTU jednakże w tym przypadku mamy inny format danych. We wpisach dotyczących protokołu Modbus TCP postaram się przedstawić podstawy protokołu Modbus TCP oraz zaprezentować klika przykładów mojej implementacji.
Zakres artykułu.
- Ramka Modbus w protokole TCP/IP
- Nagłówek MBAP
- Kategorie kodów funkcyjnych
- Testy
Ramka Modbus w protokole TCP/IP
Identyfikacja ramki Modbus przesyłaną przez protokół TCP/IP polega na tym, że klient wysyła do serwera ściśle określoną ramkę danych oraz serwer odpowiada również ściśle określoną ramką danych. Ramka danych złożona jest z trzech części:
– nagłówka MBAP – (MBAP header – Modbus Application Protocol Header),
– kodu funkcyjnego – (Function code),
– danych – (Data).
Uproszczony model komunikacji między klientem a serwerem można opisać w 7 krokach.
Nagłówek MBAP
Nagłówek MBAP, który dostarcza nam wstępne informacje zawiera 4 dane o łącznej wielości 7 Bajtów.
Identyfikator transmisji – jest wykorzystywany do parowania transmisji. Serwer MODBUS kopiuje tą wartość zapytania do odpowiedzi klientowi.
Identyfikator protokołu – jest wykorzystywany do wewnątrz systemowego multiplexingu. Protokół MODBUS jest identyfikowany przez wartość 0.
Długość – zawiera informację o liczbie wszystkich kolejnych pól. W skład tej wartości wchodzi pole identyfikatora jednostki oraz wszystkie pola danych.
Identyfikator jednostki – Pole to jest wykorzystywane do celów wewnątrz systemowego routingu. Przeważnie jest używane do komunikacji z MODBUS+ lub slave’m MODBUS szeregowej linii komunikacyjnej za pomocą Gateway’a pomiędzy siecią Ethernetową TCP/IP a szeregową linią komunikacyjną MODBUS. Pole to jest ustawiane w zapytaniu przez klienta MODBUS oraz musi zostać odesłane w odpowiedzi z tą samą wartością przez serwer.
Kategorie kodów funkcyjnych
W protokole Modbus możemy wyróżnić trzy kategorie kodów funkcyjnych:
1) Publiczne kody funkcyjne
Kategoria ta zawiera kody funkcyjne, które są zdefiniowane, unikalne, zweryfikowane przez społeczność MODBUS-IDA.org. Do publicznych kodów funkcyjnych występuje ogólnodostępna dokumentacja.
2) Kody funkcyjne zdefiniowane przez użytkownika
Kategoria ta zawiera kody, które mogą być dodatkowo implementowane przez użytkownika. Standard MODBUS przewiduje dwa zakresy tych kodów od 65 do 72 oraz od 100 do 110 (w zapisie dziesiętnym).
3) Zarezerwowane kody funkcyjne
Kategoria ta zawiera kody z zakresów publicznych kodów funkcyjnych. Kody te są obecnie wykorzystywane przez różne firmy oraz w większości przypadków nie są dostępne publicznie.