
Komunikacja PLC – mikrokontroler via MODBUS RTU

Jakiś czas temu musiałem skomunikować S7-1200 z małym sterownikiem na Atmega644. Udało się to zrobić przy pomocy MODBUS RTU. Dzisiaj przedstawię Wam ten projekt.
Program na Atmegę napisany w C (nie ufam Arduino).
Na potrzeby ćwiczeń powstał prosty termostat składający się z trzech sterowników:
- S7-1200 + CB1241 jako master. Do niego podłączony jest wentylator.
- Sterownik mojej konstrukcji jako slave. Zbiera dane z cyfrowego czujnika temperatury DS18b20, gadającego po 1Wire oraz dwóch potencjometrów (jeden do nastawiania setpoint, drugi do histerezy).
- Sterownik mojej konstrukcji jako drugi slave. Wyświetla dane zebrane przez poprzedni sterownik.
Efekty testów można zobaczyć na filmie:
Kilka słów o użytym sprzęcie…
Na początek PLC. Zastosowałem popularny S7-1200 1211C + CB1241 do komunikacji RS485. Na temat tego sterownika nie ma co za wiele pisać – prawie każdy go zna.
Jest skonfigurowany jako master w sieci modbus.
Dalej co 500 ms pobiera do tablicy dane o nastawach i temperaturze z jednego sterownika i przesyła je do drugiego, który ma to wyświetlić.
W międzyczasie przeliczana jest różnica między aktualną temperaturą, setpointem i histerezą oraz załączanie/wyłączanie wentylatora podłączonego do Q0.3.
Pozostałe sterowniki są zaprojektowane przeze mnie. Jeden z nich może być zasilany napięciem 230VAC lub 24VDC, drugi tylko 24VDC. Obydwa oparte są o mikrokontrolery z rodziny AVR – Atmega328 oraz Atmega644. Ich ogólna budowa dotycząca wejść/wyjść jest podobna. Mają po trzy wyjścia przekaźnikowe (5A-30VDC/250VAC). Wejścia izolowane transoptorami, dopuszczalne napięcie wejściowe 30VDC. Ponadto można je konfigurować jako PNP lub NPN (należy wlutować odpowiednie rezystory). Wszystkie wejścia mają możliwość wywoływania przerwania zewnętrznego. Znajduje się tam też wyprowadzona magistrala 1-Wire – w tym przypadku do podłączenia cyfrowych czujników temperatury DS18b20. W sterowniku z wyświetlaczem wejście to jest wyprowadzone na gniazdo obok wejść. Na potrzeby komunikacji Modbus konieczne było dorobienie interfejsu UART <->RS485, ponieważ sterowniki mają tylko UART. Tyle jeżeli chodzi o podobieństwa. Sterownik bez wyświetlacza posiada dodatkowo slot karty mikroSD, która w większości przypadków jest wykorzystywana do zapisywania logów, ale może być użyta do wprowadzania parametrów. Znajduje się tam też moduł RF – umożliwiający komunikację radiową 433MHz do komunikacji z innymi układami zasilanymi z baterii, w innej konfiguracji sterownik ten robi jako brama RF – WIFI, zbiera dane z czujników radiowo, obrabia i przesyła po WIFI na serwer SQL lub thingspeak. Widać tam też dwa małe potencjometry, które służą jedynie do nastawiania parametrów.
Komunikacja
Jeżeli chodzi o implementację modbus RTU na tych sterownikach, to wszystko jest opisane na stronie projektu https://www.embedded-solutions.at/en/freemodbus/ .
Generalnie po pobraniu biblioteki należy tylko skonfigurować ją pod wybrany mikrokontroler i po zapoznaniu się z dokumentacją wszystko działa. Niestety w wersji darmowej możliwa jest tylko konfiguracja jako SLAVE.
W moim przypadku drzewo projektu wygląda tak:
Wszystkie pliki/foldery z wyjątkiem 1_WIRE i main.c należą do biblioteki freeModbus.
W main.c należy podłączyć pliki biblioteki:
Zdefiniować rejestry modbusa:
Cała funkcja main wygląda jak niżej. Przed pętlą główną należy skonfigurować parametry komunikacji. W pętli głównej wywoływana jest funkcja eMBPoll() która obsługuje komunikację modbus.
W dalszej części pobierane są nastawy potencjometrów i po obrobieniu umieszczane w rejestrach które z kolei są pobierane przez S7-1200.
Pętla sterownika wyświetlającego dane jest jeszcze mniej rozbudowana. Tutaj dane wysłane z S7-1200 są odpowiednio formatowane i wysyłane do wyświetlacza. Poza tym kod dla obydwu sterowników jest praktycznie identyczny.
![]() Nagrodę Zasilacz EPSITRON® ECO Power dostarcza firma WAGOWięcej o konkursie: https://iautomatyka.pl/konkurs-iautomatyka/ |
Powiązane artykuły

Integracja Sterownika S71200/1500 z modułem IO Inveo Lantick przez Modbus TCP/IP
Seria Lantick to zaawansowana seria modułów sterujących. Każde wyjście/wejście modułu może być indywidualnie konfigurowane, umożliwiając ustawienie odrębnych trybów operacyjnych, co zapewnia wysoką elastyczność w zastosowaniach automatyki przemysłowej.

Tworzenie aplikacji – integracja Siemens S7 z czytnikiem Inveo BoxID
W tym artykule skupimy się na praktycznym wykorzystaniu czytnika BoxID.

Integracja PLC Siemens S71200/S71500 z czytnikiem RFID Inveo BoxID
Konfiguracja sterownika S7 Ten poradnik ma na celu demonstrację procesu konfiguracji czytnika RFID Inveo BoxID ze sterownikami Siemens S7-300/S7-1200/S7-1500.

Niespodziewane włączenie maszyny – jak zapobiegać?
Zlokalizuj problematyczne miejsca w obszarach produkcyjnych i podnieś poziom bezpieczeństwa operatorów.