Komunikacja z wykorzystaniem protokołu Modbus RTU dla sterowników z rodziny Micro800 1
MODBUS to jeden z najstarszych protokołów komunikacyjnych dedykowanych do zastosować w systemach automatyki przemysłowej, wciąż popularny i obecny na rynku. Jest stosunkowo prosty, niedrogi, oraz uniwersalny. Podstawowe polecenia protokołu ModBus to: odczyt, zapis zmiennej dwustanowej (bit) albo zmiennej liczbowej (word 16 bit). W zależności od rodzaju zmiennej i możliwości jej zapisu został wprowadzony podział. Typ Rodzaj zmiennej Możliwość zapisu Wykorzystanie Dicretes Input bit Wejście dwustanowe Read Tylko odczyt Dwustanowe wejścia/wyjścia Coil Cewka, przekażnik bit Read/Write Odczyt/zapis Przekaźniki/wyjścia Input Register rejestry wejściowe Słowo 16-bitów Read Tylko odczyt Liczbowe wartości na wejściach/wyjściach Holding Register rejestry pamiętające Słowo 16-bitów Read/Write Odczyt/zapis Odczyt i zapisy do rejestrów wewnętrznych Podstawowe funkcje protokołu MODBUS. Kod funckji. Opis funckji (dziesiętnie) 1 Read Coils, odczyt stanów wyjść binarnych. 2 Read discrete inputs, odczyt stanów wejść binarnych. 3 Read holding register, odczyt rejestrów pamiętających. 4 Read Input Register, odczyt rejestrów wejściowych. 5 Write Single Coils, zapis jednego wyjścia binarnego. 6 Write single register, zapis do jednego rejestru pamiętającego. 15 Write multiple coils, zapis wielu wyjśc binarnnych. 16 Write multiple register, zapis do wielu rejestrów. 3 Diagnoza, zgłaszanie błędów. 2
Protokołu Modbus RTU, w przypadku sterowników z rodziny Micro800, możemy używać w modelach Micro820, Micro830 oraz Micro850. Wszystkie wymienione sterowniki mają wbudowany nieizolowany port szeregowy, który zalecany jest do komunikacji (wymiany danych) z panelami HMI, lub sterownikami. W przypadku komunikacji z falownikami, lub urządzeniami, które znajdują się w odległości większej niż 5 metrów, oraz mogące generować zakłócenia zalecane jest użycie modułu wtykowego 2080SERIALSOL, który zapewnia nam izolacje, oraz nie wymaga stosowania dodatkowych złącz, (tak jak ma to miejsce w przypadku Micro830 oraz Micro850). W czerwonej ramce zostały zaznaczono wbudowane porty szeregowe. Micro820 Micro830 Micro850 3
Poniżej zostanie przedstawiony praktyczny przykład zastosowania sterownika Micro830 do komunikacji z Falownikiem PowerFlex 4M z wykorzystaniem protokołu Modbus RTU. Należy pamiętać, że na końcach magistrali zalecane jest użycie terminatora (rezystor 120 Ω) w celu zniwelowania zakłóceń. Sterowniki Micro800 komunikuję się tylko z jednym napędem w tym samym czasie, poprzez wysłanie tzw. explicit messages. Oznacza to, że w przypadku kilku napędów w sieci, komunikacja między nimi wydłuży się proporcjonalnie do ilości napędów. Message instruction jest to część konfigurowalna w programie przez użytkownika. Testy wykazały, że w przypadku komunikacji z falownikiem PowerFlex 4 przy prędkości 9600 baud, średni czas odpowiedzi to 50 ms, W przypadku ustawienia prędkości na 19200 baud, czas ten wyniósł 30 ms. 4
Przykład: 5 Należy w pierwszej kolejności dodać sterownik do naszego okna projektu. Z paska narzędzi klikamy zakładkę file i wybieramy New. Z okna projektu programu CCW, katalogu projektu przeciągamy wybrany sterownik, przykładowo 2080-LC30-24QBB.
W oknie projektu klikamy dwa razy na wybrany sterownik Micro830. 6 Następnie klikamy prawym przyciskiem myszy na wolny slot w sterowniku i dodajemy moduł 2080-SERIALISOL.
Klikając na dodany moduł, przechodzimy do jego ustawień. Pojawia się okno, w którym konfigurujemy parametry transmisji, takie jak prędkość, parzystość, role węzła w sieci (master czy slave). Po ustawieniu parametrów komunikacji, przechodzimy do tworzenia programu. 7 W oknie projektu, klikamy prawym przyciskiem myszy zakładkę Programs, następnie wybieramy Ladder Diagram. Zmieniamy nazwę programu na Mod_Message.
8 Klikamy dwa razy na Mod_Message. Z ToolBox wybieramy element Block i przeciągamy go do rungu. Z okna Instruction Block Selector wybieramy instrukcje MSG_MODBUS.
9 Klikamy dwa razy na ikonę Local Variables znajdującą się w oknie projektu i tworzymy następujące zmienne. Nazwa zmiennej Typ danych Cancel BOOL D3_lcfg MODBUSLOCADDR D3_Tcfg MODBUSLOCADDR D3_laddr MODBUSLOCADDR D3_error BOOL D3_errorc UINT
Przypisujemy następujące wartości do zmiennych. 10 Nazwa zmiennej Opis Wartość D3_Icfg.Channel Nr kanału portu szeregowego 5 D3_Icfg. TriggerType Sposób wyzwalania. 0 pojedyncze, 1-ciągły 1 D3_lcfg.Cmd Funkcja komunikacji modbusa 03(Read Single Coil), 06 (Write Single Coil) or 16 (Write Multiple Coil) 16 D3_Icfg.ElementCnt Liczba danych słów czytanych albo zapisywanych 2 D3_Tcfg.Addr Adres rejestru jednostki slave od którego rejestru czytamy dane lub do których rejestrów zapisujemy. 8193 D3_Tcfg.Node Adres slave 3 D3_laddr[1] Dane zapisywane/ dane czytane jeśli wybrana jest funkcja odczytu.( wartość 2 w rejestrze o adresie 8193 oznacza start) 2 D3_laddr[2] Dana zapisana/odczytana w rejestrze D3_Tcfg.Addr+1 czyli 8194. W naszym przypadku jest to rejestr odpowiadający za prędkość referencyjną. 100
Przykład wypełnienia wartościami struktur. UWAGA!!! Należy pamiętać, że w przypadku sterowników Micro800, jeżeli chcemy zmieniać/odczytać wartości w rejestrze falownika, należy zapytać/zapisać wartości do: rejestr +1, czyli 8193. Opis rejestrów dla falownika PowerFlex 4M, (szczegółowy opis wszystkich rejestrów znajduję się w dokumentacji do falownika). 11
12 Do D3_laddr[2], należy wpisać wartości prędkości odniesienia. Proszę pamiętać, że wartości te są dzielone przez dziesięć dla falownika PowerFlex 4M. ( dla PowerFlexa 525 wartości dzielone są przez 100).
Przykład: jeżeli chcemy uzyskać 10 Hz, należy do rejestru o adresie 8194 wysłać liczbę 100. Opis kanałów dla sterownika Micro830. Rung pierwszy wygląda następująco: 13
Kompilujemy nasz program. Prawym przyciskiem, w oknie projektu, klikamy na sterownik i dajemy Build. Jeżeli, nie wystąpiły błędy przy kompilacji w oknie Output, pojawi się komunikat informujący nas o sukcesie. Następnie należy zapisać projekt, klikając na ikonę save. Schemat podłączenia sterownika z Falownikiem PowerFlex 4M. 14
Po stronie PowerFlexa 4M należy ustawić następujące parametry. 15 Parametr opis Setting C302 Prędkość transmisji 4 = 19200 bps 4 C303 Adres węzła (slave) w sieci 2 C304 Wystąpienie zdarzenia podczas utraty komunikacji, 0=zatrzymanie z wystąpieniem błędów 0 C305 Czas po którym zostają podjęte działania ustawione w parametrze 304, 5 sek. (max 60) 5 C306 Format danych (dane,parzystość,stop), RTU:8 bit, brak parzystości, jeden bit stop
Następnie wgrywamy program do sterownika, poprzez przycisk Download. Z okna Connection Browser, wybieramy nasz sterownik i klikamy OK. Pojawi się następujący komunikat, że należy przejść w tryb Program z trybu RUN. Należy potwierdzić przyciskiem OK. 16
Po wgraniu programu pojawi się następujący komunikat. Pojawi się kolejne okno, które zapyta nas czy przejść w tryb RUN, klikamy YES. 17 Na pasku narzędzi klikamy ikonę start debugging (F5) Uzyskamy w ten sposób podgląd online kroku programu oraz aktualnych wartości w sterowniku.
Jeżeli wszystkie kroki wykonaliśmy poprawnie, falownik powinien wystartować z ustawioną prędkością 10 Hz. W aplikacjach w których chcemy sterować/odpytywać kilka, kilkanaście urządzeń z wykorzystaniem protokołu Modbus, lub gdy do jednego urządzenia chcemy zapisywać wartości oraz czytać z niego informacje zalecane jest kolejkowanie messages (wiadomości), aby nie przepełnić bufora na wyjściu. Przykład takiego kolejkowania zostanie wyjaśniony w poniższym przykładzie. Tworzymy nowe zmienne, które posłużą nam w przypadku wysłania komendy MSG_1 Modbusa do kolejnego falownika (slave o adresie 2). Proszę zwrócić uwagę, że w porównaniu do pierwszego przykładu tym razem tryb wyzwalania D2_Icfg. TriggerType ustawiamy na 0 (wyzwalanie pojedyncze, realizowane gdy stan na wejsciu MSG_Modbus IN zmieni się z 0 na 1). 18
Wartości zmiennych w przypadku komunikacji z urządzeniem o adresie 2. Nazwa zmiennej Wartość D2_Icfg.Channel 5 D2_Icfg. TriggerType 0 D2_lcfg.Cmd 16 D2_Icfg.ElementCnt 2 D2_Tcfg.Addr 8193 D2_Tcfg.Node 2 D2_laddr[1] 2 D2_laddr[2] 200 Rung nr 1: 19
Rung nr 2 i 3. Wartości zmiennych w przypadku komunikacji z urządzeniem o adresie 3 20 Nazwa zmiennej Wartość D3_Icfg.Channel 5 D3_Icfg. TriggerType 0 D3_lcfg.Cmd 16 D3_Icfg.ElementCnt 2 D3_Tcfg.Addr 8193 D3_Tcfg.Node 3 D3_laddr[1] 2 D3_laddr[2] 100
Po uruchomieniu sterownika wyzwalana jest pierwsza komenda od styku normalnie zamkniętego PowerUp, który znajduje się w stanie logicznego zera. Przejdzie dopiero w stan wysoki, po wykonaniu wszystkich instrukcji, gdyż ustawienie wyjść następuje w ostatnim cyklu pracy sterownika. Jeżeli komenda zostanie wysłana, następuje pojawienie się stanu wysokiego na wyjściu instrukcji MSG_1, czyli MSG_1.Q=1. Stan wysoki MSG_1.Q powoduje zadziałanie instrukcji MSG_2, oraz ustawia stan wysoki dla MSG_2.Q, który następnie wyzwala blok MSG_1 i tak w kółko. W przypadku pojawienia się błędu np. jeżeli falownik o adresie nr 2 zostanie odłączony od prądu, lub nastąpi zmiana jego parametrów transmisji, nastąpi wysterowanie zmiennej D2_error, która powoduje zadziałanie komendy MSG_2. Sytuacja jest analogiczna jeżeli błąd wystąpi dla falownika o adresie nr 3 (MSG_2). Takie rozwiązanie zapewnia, że nie przepełnimy bufora wiadomości Modbusa na wyjściu, gdy nastąpi brak komunikacji z urządzeniem slave, oraz w przypadku awarii urządzenia, wiadomości do pozostałych urządzeń w sieci będą nadal wysyłane. UWAGA!!! W przypadku, kiedy używamy sterownika do komunikacji z falownikami Rockwella, są gotowe bloki funkcyjne do komunikacji, które możemy pobrać ze strony Allen Bradley. Korzystanie z gotowych bloków znacznie oszczędza czas, gdyż nie trzeba szukać w dokumentacji pod jakimi adresami rejestrów kryją się parametry, które chcemy odczytać lub zmienić. Oczywiście należy pamiętać, że bloki te posiadają jedynie możliwość, zapisu, odczytu podstawowych funkcji, które przy prostym sterowaniu w zupełności wystarczą. Bloki te można pobrać za pośrednictwem strony: http://ab.rockwellautomation.com/programmablecontrollers/micro800#resources, a następnie klikając Sample Code Library 21
Przykładowy blok funkcyjny napisany dla Falownika 4M. 22
Jak widać, mamy możliwość zadawania prędkości, wymuszania startu, stopu, zmiany kierunków pracy, ustawień czasu ramp oraz pracy w trybie jog. Proszę pamiętać, że sterowniki Micro800 mogą pracować również jako jednostki slave. Jeżeli chcemy udostępnić dane innym masterom (urządzeniom) w sieci, należy te dane/zmienne z mapować. Mapowania robimy, klikając dwa razy na ikonę sterownika w oknie projektu, a następnie przechodzimy do zakładki Modbus Mapping. 23
Wybieramy zmienną i wprowadzamy adresy dla Modbusa używając 5 lub 6 cyfr. Adresy rejestrów 0xxxx lub 0xxxxx dla wyjść/cewek (stany binarne) (do 09999 lub 065536) 1xxxx lub 1xxxxx dla wejść/contacts (do 19999 lub 165536) 3xxxx lub 3xxxxx dla wejścia/rejestr tylko do odczytu (do 39999 lub 365536) 4xxxx lub 4xxxxx dla rejestr pamiętający/zapis, odczyt rejestru(do 49999 lub 465536) 24