Mój pierwszy artykuł dotyczył komunikacji pomiędzy falownikiem IG5A a sterownikiem SCADA WebHMI przy pomocy Modbus’a RTU. Stwierdziłem, że warto by wyczerpać temat do końca związany z Modbusem. Dzisiaj więc zajmiemy się tym protokołem z wykorzystaniem popularnego sterownika firmy Mitsubishi FX5U (w kolejnych artykułach będę chciał również pokazać to na Siemensie i może coś z Codesys’a).
Do testów będę wykorzystywał falownik IG5A LS, znany z artykułu o WebHMI, więc nie będę się rozwodził nad konfiguracją sprzętową (cały proces konfiguracji znajdziemy pod tym linkiem WebHMI i Modbus RTU).
Podstawy Modbus RTU
Więc zaczynajmy na początek słów parę na temat samego Modbusa.
Wyróżniamy trzy podstawowe rodzaje Modbusa:
– TCP/IP – wykorzystujący ethernet,
– ASCI – nieco archaiczny (przeważnie RS 232),
– RTU (szeregowy) – pracujący w standardzie RS 485.
Modbus RTU wykorzystuję topologię magistrali (bus). Więc początek oraz koniec sieci trzeba zaterminować rezystorami (w naszym przypadku nie musimy korzystać z fizycznych rezystorów gdyż i PLC i falownik mają wbudowane, wystarczy przełączyć dip switcha)
W sieci Modbusowej, występują dwa rodzaje hostów Master oraz slave. Różnica między nimi jest taka, że tylko Master może żądać rozpoczęcia transmisji. Więc slave nasłuchuje i odpowiada, nie może on wysłać żądania do Mastera.
Każde urządzenie w tej sieci ma swój adres (podobnie jak w Profibusie) od 0 – 255. Liczba nie jest przypadkowa ponieważ w ramce na adresowanie zajęty jest tylko jeden bajt.
Do okablowania w dużej ilości przypadków używa się skrętki Ethernetowej aczkolwiek widziałem też okablowanie zwykłym kablem 3×0.34 i to też działało. Do komunikacji używa się trzech przewodów RX, TX , SG czyli nadajnik, odbiornik oraz uziemienie.
Korzystając z FX5U nie jesteśmy już w tak komfortowej sytuacji jak przy użyciu WebHMI ponieważ, tutaj niezbędna jest nam znajomość budowy ramki komunikacyjnej.
Adress field – 1 Bajt – obszar w którym zapisujemy adres urządzenia z którym rozpoczynamy komunikację jak wcześniej wspomniałem od 1 – 255 (nigdy nie ustawiamy 0 z racji na to że jest to brodcast – adres rozgłoszeni owy).
Function Code – 1 Bajt – kod funkcji czyli wartość numeryczna operacji jaką mamy wykonać inna dla odczytu oraz dla zapisu.
Tutaj lista wszystkich operacji:
Data – jest to krotność bajtu – w tej sekcji, znajdują się informacje dotyczące którego rejestru poszukujemy oraz jakie dane chcemy w nim zapisać.
CRC – 2 bajty – sekcja odpowiedzialna za kontrolę przesyłu danych. (więcej na ten temat można znaleźć w artykule na iAutomatyka).
Ogólnie przyjętą konwencją jest to, że podczas budowania ramki posługujemy sie szesnastkowym systemem liczbowym (w Mitsubishi wartość szesnastkową poprzedzamy indeksem H np: H1, H5, HA, HFF ).
Okablowanie:
Z racji tego, że nasz PLC ma już wbudowany port RS-485 więc nie potrzebujemy żadnych dodatkowych adapterów ani modułów.
Podłączamy zestaw jak na schemacie.
Trzeba pamiętać o tym aby ustawić rezystory terminujące. Ustawiamy więc dip switche na PLC oraz falowniku.
Konfiguracja
Uruchamiamy GxWorks 3 i tworzymy nowy projekt wybierając sterownik FX5C.
Następnie musimy określić sposób komunikacji komputera ze sterownikiem.
W tej serii sterowników nie potrzebujemy żadnych specjalnych kabli (interfejsów) aby się z nim połączyć wystarczy zwykły kabel Ethernetowy.
Klikamy Online -> Current Connection Destination -> Directly Connect to CPU.
W kolejnym oknie jeżeli wszystko podłączyliśmy poprawnie automatycznie zostanie wybrana nasza karta sieciowa. Jeżeli wszystko działa poprawnie po kliknięciu na Communiction Test powinniśmy otrzymać wiadomość o poprawnym połączeniu ze sterownikiem.
Warto również włączyć sobie widoczność komentarzy. Aby to zrobić klikamy View -> Comment Display, Statement Display oraz Note Display.
Przejdźmy teraz do konfiguracji sprzętowej połączenia Modbus RTU. Z prawej strony w panelu Navigation klikamy Parameter -> Module Parameter -> Rs 485 Serial Port.
Otwiera nam się okno z konfiguracją. Wybieramy rodzaj protokołu Modbus RTU.
Wyłączamy kontrolę parzystości, ustawiamy jeden bit stopu i wybieramy prędkość 19 200 bps.
Klikamy Apply i konfigurację sprzętową mamy już za sobą.
Programowanie MODBUS RTU
Zaczynamy od stworzenia Function Block’a aby zachować porządek w kodzie i nie ładować wszystkiego do Main’a (zresztą tak przygotowany kod można śmiało potem wykorzystać w innych projektach). Nadajemy nazwę naszej funkcji FB_ModbusRTU.
Czas zając się parametrami jakie Function Block będzie przyjmował z zewnątrz oraz oddawał jako wyjściowe i oczywiście zmienne statyczne.
Wchodzimy w FB/FUN -> FBFILE -> FB_ModbusRTU->Local Label.
Teraz zastanówmy się jak skonstruować nasz blok aby był jak najbardziej zoptymalizowany. Więc zróbmy tak:
- Z zewnątrz będziemy przyjmować parametry o wartości częstotliwości oraz czy falownik ma wystartować czy się zatrzymać.
- W zmiennych statycznych naszego Function Block’a będziemy przechowywać ostatnio zadaną wartość częstotliwości oraz rejestru sterowania i po przyjściu nowych wytycznych co do sterowania i częstotliwości będziemy porównywać obie zmienne jeżeli są inne będziemy konstruować oraz wysyłać ramkę.
Zaletą takiego rozwiązania jest to, że nie musimy wysterować żadnej zmiennej odpowiedzialnej za wysyłanie co zrzuca z programisty nieco pracy oraz w podczas wysterowania obu zmiennych odpowiedzialnych za częstotliwość oraz sterowanie w jednym cyklu kolejkuje zadania czekając aż zostanie wysłana jedna ramka poprawnie wysyła drugą. Jest to moim zdaniem najbardziej optymalne rozwiązanie.
Będą nam potrzebne następujące zmienne:
SlaveID – zmienna do ramki która będzie przechowywać adres urządzenia do którego wysyłamy dane
FunctionCode – wartość numeryczna działania odczyt / zapis
RegisterAdress – adres rejestru (odczytywany z PDF’a urządzenia)
Frq – zmienna wejściowa – częstotliwość zadana
Frq_A – częstotliwość aktualna zapisywana po poprawnym wysłaniu ramki
Wysyłanie – zmienna wysterowana kiedy ramka jest wysłana tzw. Busy Flag
Start – zadana praca falownika
Start_A – ostatnio zapisany stan pracy falownika
Kiedy znamy już algorytm działania czas zaznajomić się z funkcją do wysyłania
Funkcja ADPRW
Oprócz oczywistych skomentowanych już zmiennych pojawia się czwarty argument w naszym przypadku K1 – ilość rejestrów do wysłani oraz M1 – trzy elementowa tablica wyniku operacji. Nas będzie interesował drugi element czy zajętość (u nas będzie to marker M2).
Tak przedstawia się ciało funkcji:
Analiza kodu.
Zadajemy częstotliwość, jeżeli jest inna niż ostatnio wysłana to ustaw parametry ramki. Ważne żeby podczas zapisywania adresu rejestru zawsze odjąć jeden (jeżeli adres ma wartość 5 to zapisujemy 4). Tak spreparowane wartości podajemy jako argumenty do funkcji ADDPRW. Po poprawnym wysłaniu ramki sprawdzamy wartość zmiennej Rejestr jeżeli jest taka sama jak częstotliwość zadana to aktualizujemy zmienna FRQ_A i kasujemy zmienna Wysyłanie. Podobnie dzieję się z start/stop. Z racji że kod nie jest specjalnie trudny nie będę się bardzo nad nim rozwodził 😉
Ostatnią rzeczą jest wywołanie funkcji w Main’ie.
oraz wgranie programu
Na potrzeby testu sterowanie wartościami jest wykonane przez forsowanie wartości zadanych do funkcji.
Podsumowanie:
Pomimo tego, że praca na Modbusie RTU w sterownikach PLC nie jest taka intuicyjna jak na WebHMI warto zgłębić wiedzę na ten temat chociażby dlatego, że większość falowników posiada ten własnie protokół i podczas wysterowania większej ilości urządzeń mamy oszczędność wyjść cyfrowych i analogowych. Mi osobiście udało się stabilnie działać na 15 falownikach w jednej sieci i program ten pracuje po dzień dzisiejszy na kilku maszynach.
Pozdrawiam
Przemek Czech
Artykuł nagrodzony!
Artykuł został zgłoszony jako Praca Konkursowa do Konkursu iAutomatyka w miesiącu Maj 2018 i zdobył poniższą nagrodę:
Uniwersalny klucz do szaf od WAGO
Nagrodę dostarcza WAGO – producent urządzeń automatyki przemysłowej i budynkowej oraz systemów połączeń dla elektrotechniki i elektroniki. Powstanie w 1951 roku firmy WAGO było wyrazem przekonania o słuszności obranego kierunku i stworzyło podwaliny pod dalszy rozwój technologii. Z czasem stała się ona standardem na całym świecie i teraz nie sposób wyobrazić sobie nowoczesnej instalacji elektrycznej czy systemu automatycznego sterowania bez wyrobów WAGO. http://www.wago.pl/ 🎁 Zwycięzca: Przemysła Czech Praca konkursowa: Przykład komunikacji MODBUS RTU dla sterowników Mitsubishi FX5U |