ś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".

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

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:

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

Struktura ramki odpowiedzi dla funkcji 15 i 16:

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
  • 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
  1. gałąź I/O - Configuration
  2. gałąź I/O Devices
  3. opcja Scan Devices (po kliknięciu prawym przyciskiem myszy na gałęzi)
  4. potwierdzenie Scan Boxes
W efekcie powinna się pojawić lista modułów z domyślną nazwą Term i odpowiednim numerem, co najważniejsze w kolejności zgodnej z fizyczną. Ma ona formę drzewa, którego liście to faktyczne wartości. Wartości wejściowe są oznaczone kolorem żółtym, a wartości wyjściowe czerwonym. W zakładce Online można uzyskać podgląd wartości, a także ją wymusić lub wpisać.

DODANIE PROJEKTU
  1. gałąź PLC - Configuration
  2. opcja Append PLC Project(po kliknięciu prawym przyciskiem myszy na gałęzi)
Teraz wystarczy znaleść odpowiedni plik z rozszerzeniem TPY, który otrzymaliśmy po zbudowaniu projektu w PLC Control.

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.
  1. przycisk Generate mappings
  2. przycisk Check configuration
  3. przycisk Activate configuration
W tym momencie, po zalogowaniu przy pomocy PLC Control i ewentualnemu uruchomieniu programu, powinno być widać odpowiednie wartości przypisane do zmiennych.

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:
  1. gałąź "SYSTEM" w drzewie projektu
  2. przycisk "Choose Target"
  3. 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:
  1. opcja "IP Address" zaznaczona
  2. opcje "Static route" zaznaczone
  3. przycisk "Add route"
  4. 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.
  1. gałąź "SYSTEM" w drzewie projektu
  2. podrzędna gałąź "Routes"
  3. zakładka "Static routes"
  4. przycisk "Add"
Pojawia się znajome okno dodawania tras.

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:
  1. menu "Properties"
  2. zakłada "AMS Router"
  3. przycisk "Add"
Na ekranie pojawia się okno, w którym podajemy nazwę, adres AMS i adres IP, a wszystko potwierdzamy przyciskiem OK.

W przypadku Windows CE musimy zdalnie połączyć się ze sterownikiem przy pomocy programu Microsoft Remote Display (CERHost.exe):
  1. menu "File"
  2. opcja "Connect"
  3. menu "Start"
  4. opcja "Run"
  5. polecenie "explorer"
  6. folder "\Hard Disk\System\"
  7. plik "TcAmsRemoteMgr.exe"
  8. przycisk "Add"
Na ekranie pojawia się okno znane z komputerów z TwinCAT 2.