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.
// Jeszcze coś dopiszę...
środa, 21 czerwca 2017
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:
ODCZYT
Struktura ramki zapytania dla funkcji 1,2,3 i 4:
Struktura ramki odpowiedzi dla funkcji 1,2,3 i 4:
ZAPIS
Struktura ramki zapytania i odpowiedzi dla funkcji 5 i 6:
Struktura ramki zapytania dla funkcji 15 i 16:
Struktura ramki odpowiedzi dla funkcji 15 i 16:
PS. "Po pierwsze primo" i "po drugie primo" to oczywiście cytaty z filmu "Poranek kojota".
- 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 |
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 |
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:
ODCZYT
Struktura ramki zapytania dla funkcji 1,2,3 i 4:
Struktura ramki odpowiedzi dla funkcji 1,2,3 i 4:
ZAPIS
Struktura ramki zapytania i odpowiedzi dla funkcji 5 i 6:
Struktura ramki zapytania dla funkcji 15 i 16:
Struktura ramki odpowiedzi dla funkcji 15 i 16:
17210 = AB16 A to kod ASCII 65 B to kod ASCII 66Ta 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 |
: | 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 |
niedziela, 14 sierpnia 2016
Protokoły komunikacyjne - ramka Modbus RTU
Modbus RTU wydaje się być najprostszą wersją tego protokołu. Ramki w tej wersji oddziela przerwa w transmisji na łączu. Istotny jest również fakt, że w zapytaniu podaje się zarówno ilość danych do odczytu czy zapisu, jak i rozmiar danych w ramce. Coils i Discrete Inputs zajmują tylko 1 bit, w 1 bajcie zmieści się ich 8. Z kolei każdy rejestr z grupy Input Registers i Holding Registers zajmuje 16 bitów, czyli 2 bajty.
ODCZYT
Struktura ramki zapytania dla funkcji 1,2,3 i 4:
Struktura ramki odpowiedzi dla funkcji 1,2,3 i 4:
ZAPIS
Struktura ramki zapytania i odpowiedzi dla funkcji 5 i 6:
Struktura ramki zapytania dla funkcji 15 i 16:
Struktura ramki odpowiedzi dla funkcji 15 i 16:
ODCZYT
Struktura ramki zapytania dla funkcji 1,2,3 i 4:
Adres Modbus | 1 bajt |
Kod funkcji | 1 bajt |
Adres w pamięci | 2 bajty |
Ilość danych | 2 bajty |
CRC | 2 bajty |
Struktura ramki odpowiedzi dla funkcji 1,2,3 i 4:
Adres Modbus | 1 bajt |
Kod funkcji | 1 bajt |
Rozmiar danych | 1 bajt |
Dane | N bajtów |
CRC | 2 bajty |
ZAPIS
Struktura ramki zapytania i odpowiedzi dla funkcji 5 i 6:
Adres Modbus | 1 bajt |
Kod funkcji | 1 bajt |
Adres w pamięci | 2 bajty |
Dane | 2 bajty |
CRC | 2 bajty |
Struktura ramki zapytania dla funkcji 15 i 16:
Adres Modbus | 1 bajt |
Kod funkcji | 1 bajt |
Adres w pamięci | 2 bajty |
Ilość danych | 2 bajty |
Rozmiar danych | 1 bajt |
Dane | N bajtów |
CRC | 2 bajty |
Adres Modbus | 1 bajt |
Kod funkcji | 1 bajt |
Adres w pamięci | 2 bajty |
Ilość danych | 2 bajty |
CRC | 2 bajty |
sobota, 30 lipca 2016
Protokoły komunikacyjne - wstęp do Modbus
Modbus to jeden z najczęściej spotykanych protokołów komunikacyjnych. To prosty i otwarty standard. Powiada wersje zarówno dla portów szeregowych jak i sieci ethernet.
WERSJE MODBUS
FUNKCJE MODBUS
Wszystkie wersje protokołu Modbus posiadają taki sam zestaw funkcji.
Po przyjrzeniu się zestawowi funkcji nie jest trudno zauważyć 4 obszary pamięci.
ADRES MODBUS
Adres Modbus, inaczej UnitID, to adres konkretnego urządzenia. Na linii musi być unikalny dla każdego slave'a i master'a. Jest szczególnie istotny przy komunikacji za pomocą portów szeregowych.
WERSJE MODBUS
- RTU - podstawowa wersja dla portów szeregowych
- ASCII - alternatywna wersja dla portów szeregowych, wyróżnia się dodatkowym kodowaniem ASCII
- TCP - podstawowa wersja dla sieci ethernet
- OverTCP - alternatywna wersja dla sieci ethernet, gdzie ramka wersji RTU lub ASCII jest wysyłana po TCP
FUNKCJE MODBUS
Wszystkie wersje protokołu Modbus posiadają taki sam zestaw funkcji.
- 01 - Read Coils
- 02 - Read Discrete Inputs
- 03 - Read Holding Registers
- 04 - Read Input Registers
- 05 - Write Single Coil
- 06 - Write Single Register
- 15 - Write Multiple Coils
- 16 - Write Multiple Registers
Po przyjrzeniu się zestawowi funkcji nie jest trudno zauważyć 4 obszary pamięci.
Rodzaj zmiennej | Odczyt | Zapis | |
---|---|---|---|
Coils | 1-bitowy | Tak | Tak |
Discrete Inputs | 1-bitowy | Tak | Nie |
Holding Registers | 16-bitowy | Tak | Tak |
Input Registers | 16-bitowy | Tak | Nie |
ADRES MODBUS
Adres Modbus, inaczej UnitID, to adres konkretnego urządzenia. Na linii musi być unikalny dla każdego slave'a i master'a. Jest szczególnie istotny przy komunikacji za pomocą portów szeregowych.
czwartek, 28 lipca 2016
TwinCAT - dodawanie modułów i podłączanie zmiennych
Sterownik PLC nie miałby sensu, gdyby nie podłączone moduły. Jest ich wiele rodzajów. Za przykład posłużą wejścia i wyjścia, zarówno cyfrowe jak i analogowe. Konfiguracja modułów podłączonych do sterownika odbywa się w trybie CONFIG.
WYKRYCIE MODUŁÓW
DODANIE PROJEKTU
LINKOWANIE
Do zlinkowania zmiennych potrzebne są odpowiednio zadeklarowane zmienne w programie, na przykład:
AKTYWACJA
Ostatni krok to umieszczenie konfiguracji w sterowniku.
WYKRYCIE MODUŁÓW
- gałąź I/O - Configuration
- gałąź I/O Devices
- opcja Scan Devices (po kliknięciu prawym przyciskiem myszy na gałęzi)
- potwierdzenie Scan Boxes
DODANIE PROJEKTU
- gałąź PLC - Configuration
- opcja Append PLC Project(po kliknięciu prawym przyciskiem myszy na gałęzi)
LINKOWANIE
Do zlinkowania zmiennych potrzebne są odpowiednio zadeklarowane zmienne w programie, na przykład:
wejscie_cyfrowe AT%I* : BOOL; wyjscie_cyfrowe AT%Q* : BOOL; wejscie_analogowe AT%I* : REAL; wyjscie_analogowe AT%Q* : REAL;Teraz wystarczy znaleść odpowiednią wartość w drzewie. Po kliknięciu na nią prawym przyciskiem myszy wybieramy opcję Change Link. Pokazuje się lista zmiennych z programu, które możemy zlinkować z wybraną wartością. Ten sam efekt przyniesie kliknięcie lewym przyciskiem myszy i użycie przycisku Linked to w zakładce Variable. Tutaj widać też jakiego typu zmienną należy zadeklarować w programie. Jeśli nie widać ostatnio dodanych zmiennych, należy w gałęzi PLC - Configuration wybrać projekt i nacisnąć przycisk ReScan.
AKTYWACJA
Ostatni krok to umieszczenie konfiguracji w sterowniku.
- przycisk Generate mappings
- przycisk Check configuration
- przycisk Activate configuration
wtorek, 12 kwietnia 2016
TwinCAT - komunikacja pomiędzy instancjami
Komunikacja pomiędzy dwoma instancjami TwinCAT'a możliwa jest wtedy, kiedy obie instancje wiedzą, gdzie szukać drugiej z nich. W tym celu muszą umieć powiązać adres AMS i adres IP. Oczywiście ten drugi musi być osiągalny w sieci. Możliwe jest też korzystanie z nazwy komputera zamiast adresu IP, ale jest to metoda moim zdaniem znacznie mniej pewna.
SPOSÓB AUTOMATYCZNY
Sposób automatyczny pozwala na dodanie tras na obu instancjach jednocześnie. Najpierw jednak należy dodać trasę do naszego komputera:
Pojawia się okno służące do dodawania tras. Po kliknięciu przycisku "Broadcast search" otrzymujemy listę instancji TwinCAT'a widocznych w lokalnej sieci. Wybieramy z niej odpowiedni sterownik. Warto dodać, że czasami zamiast "Broadcast search" trzeba użyć przycisku "Enter hostname/IP".
Dodanie trasy:
W rezultacie na liście pojawia się nazwa i adres AMS, a po rozwinięciu przynajmniej jeden runtime. Po potwierdzeniu wyboru przyciskiem "OK" lub podwójnym kliknięciem można już wykonywać operacje na sterowniku.
Dodanie tras do kolejnych sterowników wygląda podobnie.
SPOSÓB RĘCZNY
Zdarzają się sytuacje, w których wykorzystanie sposobu automatycznego jest niemożliwe. Na liście może na przykład istnieć już wpis o pożądanym adres IP i innym adresie AMS lub odwrotnie. Wpisy można jednak dodać ręcznie na obu urządzeniach.
W przypadku urządzeń z TwinCAT 3 należy otworzyć plik xml:
i uzupełnić węzeł „TcConfig/RemoteConnections” odpowiednim wpisem:
Jeśli chodzi o komputery z TwinCAT 2, korzystamy z ikony w zasobniku systemowym:
W przypadku Windows CE musimy zdalnie połączyć się ze sterownikiem przy pomocy programu Microsoft Remote Display (CERHost.exe):
SPOSÓB AUTOMATYCZNY
Sposób automatyczny pozwala na dodanie tras na obu instancjach jednocześnie. Najpierw jednak należy dodać trasę do naszego komputera:
- gałąź "SYSTEM" w drzewie projektu
- przycisk "Choose Target"
- przycisk "Search ethernet"
Pojawia się okno służące do dodawania tras. Po kliknięciu przycisku "Broadcast search" otrzymujemy listę instancji TwinCAT'a widocznych w lokalnej sieci. Wybieramy z niej odpowiedni sterownik. Warto dodać, że czasami zamiast "Broadcast search" trzeba użyć przycisku "Enter hostname/IP".
Dodanie trasy:
- opcja "IP Address" zaznaczona
- opcje "Static route" zaznaczone
- przycisk "Add route"
- przycisk "OK"
W rezultacie na liście pojawia się nazwa i adres AMS, a po rozwinięciu przynajmniej jeden runtime. Po potwierdzeniu wyboru przyciskiem "OK" lub podwójnym kliknięciem można już wykonywać operacje na sterowniku.
Dodanie tras do kolejnych sterowników wygląda podobnie.
- gałąź "SYSTEM" w drzewie projektu
- podrzędna gałąź "Routes"
- zakładka "Static routes"
- przycisk "Add"
SPOSÓB RĘCZNY
Zdarzają się sytuacje, w których wykorzystanie sposobu automatycznego jest niemożliwe. Na liście może na przykład istnieć już wpis o pożądanym adres IP i innym adresie AMS lub odwrotnie. Wpisy można jednak dodać ręcznie na obu urządzeniach.
W przypadku urządzeń z TwinCAT 3 należy otworzyć plik xml:
c:\TwinCAT\3.1\Target\StaticRoutes.xml
i uzupełnić węzeł „TcConfig/RemoteConnections” odpowiednim wpisem:
<Route> <Name>nazwa</Name> <Address>adres IP</Address> <NetId>adres AMS</NetId> <Type>TCP_IP</Type> </Route>
Jeśli chodzi o komputery z TwinCAT 2, korzystamy z ikony w zasobniku systemowym:
- menu "Properties"
- zakłada "AMS Router"
- przycisk "Add"
W przypadku Windows CE musimy zdalnie połączyć się ze sterownikiem przy pomocy programu Microsoft Remote Display (CERHost.exe):
- menu "File"
- opcja "Connect"
- menu "Start"
- opcja "Run"
- polecenie "explorer"
- folder "\Hard Disk\System\"
- plik "TcAmsRemoteMgr.exe"
- przycisk "Add"
Subskrybuj:
Posty (Atom)