
Wprowadzenie
Modbus RTU to jeden z najpopularniejszych protokołów komunikacyjnych stosowanych w automatyce przemysłowej, głównie dzięki swojej prostocie, niezawodności oraz szerokiemu wsparciu przez różne urządzenia. W tym artykule przedstawimy krok po kroku, jak połączyć sterownik Finder OPTA programowany w środowisku Codesys z falownikiem Siemens Sinamics V20 za pomocą protokołu Modbus RTU wykorzystując magistralę szeregową RS485.

Opisujemy podłączenie fizyczne urządzeń, konfigurację projektu Codesys, prosty przykładowy program sterujący oraz wskazujemy najczęstsze błędy i praktyczne wskazówki dotyczące uruchamiania komunikacji.
1. Podłączenie fizyczne przewodów RS485
Jednym z kluczowych kroków w uruchomieniu komunikacji między sterownikiem PLC Finder OPTA a falownikiem Sinamics V20 jest poprawne podłączenie magistrali RS-485.
Zarówno Finder OPTA, jak i Sinamics V20 wspierają komunikację szeregową poprzez ten standard, ale wymagają odpowiedniego połączenia przewodów oraz konfiguracji.
1.1. Przykładowy schemat
Poniższy fragment schematu pokazuje pełne połączenie:


Na podstawie schematu widzimy, że:
- W sterowniku Finder OPTA linie RS485 są dostępne na złączu oznaczonym jako:
- A(-) – linia A
- B(+) – linia B
- W falowniku Siemens Sinamics V20 linie RS485 oznaczone są jako:
- P+ – linia dodatnia
- N- – linia ujemna
Zalecane połączenie:
| OPTA (moduł Modbus RS-485) | Sinamics V20 (RS-485) |
|---|---|
| A(-) | P+ (pin 6) |
| B(+) | N- (pin 7) |
Dodatkowo na schemacie możemy zauważyć, że oba urządzenia mają wspólną masę 0V – ważne jest, aby również masa zasilania była wspólna dla zapewnienia poprawnej referencji napięć.
1.2. Przewody i zalecenia transmisyjne
Do połączenia wykorzystaj:
- Skrętkę dwużyłową ekranowaną (np. LiYCY 2×0,5 mm²) – skrętka minimalizuje wpływ zakłóceń,
- Długość przewodu: do 1000 m w standardzie RS-485 (zalecane: do 100 m bez rezystora terminującego),
- Brak skrzyżowania przewodów A/B – A(-) zawsze do P+, B(+) do N-.
Wskazówka:
Jeśli magistrala ma tylko dwa urządzenia (1 master + 1 slave), rezystory terminujące nie są obowiązkowe, ale mogą poprawić stabilność. Zalecana wartość: 120 Ω między A i B na obu końcach linii.
1.3. Ustawienia parametrów transmisji
Aby komunikacja zadziałała, zarówno sterownik, jak i falownik muszą mieć takie same ustawienia portu RS-485.
W sterowniku Finder OPTA (w Codesys):
- COM Port: COM2 (zależnie od wersji urządzenia)
- Prędkość: 9600
- Parzystość: None
- Długość słowa: 8 bitów
- Bity stopu: 1
W falowniku Siemens V20:
Ustaw z poziomu panelu falownika następujące parametry:
| Parametr | Wartość | Opis |
|---|---|---|
| P2010 | 9600 | Baud rate |
| P2011 | 8 | Długość słowa |
| P2012 | 1 | Bity stopu |
| P2013 | 0 | Parzystość: brak |
| P2014 | 0 | Timeout watchdog – wyłączony na czas testów |
| P2021 | 1 | Adres slave (1 domyślnie) |
| P2023 | 1 | Tryb Modbus RTU |
1.4. Przełączenie falownika w tryb zdalnego sterowania
Domyślnie Sinamics V20 może być ustawiony na sterowanie z zacisków wejściowych (np. DI1, DI2…). Aby przejść na tryb komunikacji Modbus, należy zmienić dwa kluczowe parametry:
- P0700 = 5 → sterowanie poprzez RS485 (źródło poleceń),
- P1000 = 5 → zadawanie częstotliwości poprzez RS485 (źródło setpointu).
Można to też szybko wykonać wybierając z poziomu panelu jedno z gotowych makr:
- Cn011 – Modbus RTU – ustawia wszystkie potrzebne parametry automatycznie.
Po zapisaniu parametrów i restarcie falownik będzie gotowy do przyjęcia komend z poziomu sterownika przez Modbus.
2. Konfiguracja komunikacji Modbus RTU w Codesys
Po wykonaniu połączenia fizycznego konfigurujemy środowisko Codesys. Oto prosty proces:
Krok 1: Dodanie portu Modbus RTU (COM)
W drzewie projektu kliknij prawym na Device i wybierz Add Device. Dodaj urządzenie typu Modbus Serial COM.


Następnie skonfiguruj:
- COM port: np. COM2 (zależnie od wersji Finder OPTA)
- Baudrate: 9600
- Data bits: 8
- Parity: None
- Stop bits: 1

Krok 2: Dodanie urządzenia Master i Slave (Client i Server)
Kliknij prawym na Modbus Serial COM, wybierz Add Device i dodaj Modbus Serial Client (jest to Master w terminologii Modbus). Następnie kliknij na Modbus Client, ponownie Add Device i dodaj Modbus Server (urządzenie slave – czyli falownik).
Dla Modbus Server ustaw Station address na wartość 1 (domyślny adres falownika Sinamics V20).

Krok 3: Dodanie kanałów (Channel) do komunikacji
Dodajemy kanały do zapisu oraz odczytu rejestrów w falowniku. Dla przykładu:
- Zapis do rejestrów STW (słowo sterujące, offset 99) oraz HSW (częstotliwość zadana, offset 100):
- Funkcja: 16 – Write Multiple Registers
- Offset: 99
- Ilość rejestrów: 2
- Odczyt rejestru statusowego ZSW (offset 109):
- Funkcja: 03 – Read Holding Registers
- Offset: 109
- Ilość rejestrów: 1


Te rejestry pozwalają na sterowanie falownikiem (start, stop, zmiana prędkości, zmiana kierunku) oraz monitorowanie jego statusu.
3. Przykład programu sterującego w języku ST (Structured Text)
Poniżej prezentujemy kompletny przykład programu w języku ST, który pozwala na sterowanie falownikiem Siemens Sinamics V20 z poziomu sterownika Finder OPTA poprzez Modbus RTU. Program działa zarówno w trybie automatycznym (zadana częstotliwość) jak i manualnym za pomocą przycisków +/-).
PROGRAM PLC_PRG
VAR
wSTW_V20 AT %QW0: WORD; (* Control Word - do V20 *)
wHSW_V20 AT %QW1: WORD; (* Frequency Word - częstotliwość do V20 *)
wZSW_V20 AT %IW0: WORD; (* Status Word - z V20 *)
wTest: WORD;
wFreq: WORD;
aMotorData AT %IW1: ARRAY [0..2] OF WORD;
(* Przyciski sterujące *)
xStart: BOOL := FALSE;
xStop: BOOL := FALSE;
xManual_Mode: BOOL := FALSE;
xMOP_Higher: BOOL := FALSE;
xMOP_Lower: BOOL := FALSE;
xReverse: BOOL := FALSE;
(* Zmienne MOP *)
wMOP_Frequency: WORD := 1500; (* Aktualna częstotliwość MOP (15.00 Hz) *)
wMOP_Step: WORD := 1000; (* Krok zmiany (1.00 Hz) *)
wMOP_Min: WORD := 0; (* Min 0.00 Hz *)
wMOP_Max: WORD := 5000; (* Max 50.00 Hz *)
(* Detekcja flanki dla MOP *)
xMOP_Higher_Old: BOOL := FALSE;
xMOP_Lower_Old: BOOL := FALSE;
// Przeskalowane wartości rzeczywiste
rFrequency : REAL; // Częstotliwość wyjściowa [Hz] - ze znakiem
rFrequency_Abs : REAL; // Częstotliwość bezwzględna [Hz]
rSpeed : REAL; // Prędkość [RPM] - ze znakiem
rSpeed_Abs : REAL; // Prędkość bezwzględna [RPM]
rCurrent : REAL; // Prąd [A]
// Pomocnicze zmienne do konwersji
diSpeedRaw : DINT; // Surowa wartość prędkości jako DINT
diFreqRaw : DINT; // Surowa wartość częstotliwości jako DINT
END_VAR
(* Obsługa MOP - zmiana częstotliwości na flankę *)
IF xManual_Mode THEN
(* Zwiększanie częstotliwości na flankę narastającą *)
IF xMOP_Higher AND NOT xMOP_Higher_Old THEN
wMOP_Frequency := wMOP_Frequency + wMOP_Step;
END_IF
(* Zmniejszanie częstotliwości na flankę narastającą *)
IF xMOP_Lower AND NOT xMOP_Lower_Old THEN
wMOP_Frequency := wMOP_Frequency - wMOP_Step;
END_IF
END_IF
(* Zapamiętanie poprzednich stanów *)
xMOP_Higher_Old := xMOP_Higher;
xMOP_Lower_Old := xMOP_Lower;
(* Sterowanie Control Word *)
IF xStop THEN
wTest := 1134; (* STOP *)
ELSIF xManual_Mode THEN
IF xMOP_Higher THEN
wTest := 45055; (* Manual + MOP Higher *)
ELSIF xMOP_Lower THEN
wTest := 53247; (* Manual + MOP Lower *)
ELSE
wTest := 36863; (* Manual Mode Only *)
END_IF
ELSIF xStart THEN
IF xReverse THEN
wTest := 3199; (* RUN REVERSE *)
ELSE
wTest := 1151; (* RUN FORWARD *)
END_IF
ELSE
wTest := 1278; (* STANDBY *)
END_IF
(* Sterowanie częstotliwością *)
IF xManual_Mode THEN
wFreq := wMOP_Frequency; (* Użyj częstotliwości z MOP *)
ELSE
wFreq := 2500; (* 25.00 Hz w trybie auto *)
END_IF
// ===== SKALOWANIE CZĘSTOTLIWOŚCI WYJŚCIOWEJ =====
// Parametr 40024 (r0024) - zakres: -327.68 do +327.67 Hz
// Współczynnik skalowalności: 100
// UWAGA: Wartość jest w formacie WORD ale reprezentuje wartości ze znakiem!
// Konwersja WORD na DINT (interpretacja ze znakiem)
IF aMotorData[0] > 32767 THEN
// Wartość ujemna - konwersja z dopełnienia do dwóch
diFreqRaw := WORD_TO_DINT(aMotorData[0]) - 65536;
ELSE
// Wartość dodatnia
diFreqRaw := WORD_TO_DINT(aMotorData[0]);
END_IF
// Przypisanie częstotliwości ze znakiem i skalowanie
rFrequency := DINT_TO_REAL(diFreqRaw) / 100.0;
// Częstotliwość bezwzględna (bez znaku)
rFrequency_Abs := ABS(rFrequency);
// ===== SKALOWANIE PRĘDKOŚCI =====
// Parametr 40025 (r0022) - zakres: -16250 do +16250 RPM
// Współczynnik skalowalności: 1
// UWAGA: Wartość jest w formacie WORD ale reprezentuje wartości ze znakiem!
// Konwersja WORD na DINT (interpretacja ze znakiem)
IF aMotorData[1] > 32767 THEN
// Wartość ujemna - konwersja z dopełnienia do dwóch
diSpeedRaw := WORD_TO_DINT(aMotorData[1]) - 65536;
ELSE
// Wartość dodatnia
diSpeedRaw := WORD_TO_DINT(aMotorData[1]);
END_IF
// Przypisanie prędkości ze znakiem
rSpeed := DINT_TO_REAL(diSpeedRaw);
// Prędkość bezwzględna (bez znaku)
rSpeed_Abs := ABS(rSpeed);
// ===== SKALOWANIE PRĄDU =====
// Parametr 40026 (r0027) - współczynnik skalowalności: 100
rCurrent := WORD_TO_REAL(aMotorData[2]) / 100.0;
(* Przypisanie do wyjść *)
wHSW_V20 := wFreq;
wSTW_V20 := wTest;
wZSW_V20;
aMotorData;Główne funkcje programu:
- Wysyłanie słowa sterującego wSTW_V20 oraz zadanej częstotliwości wHSW_V20 do falownika,
- Odczyt słowa statusowego wZSW_V20 oraz parametrów pracy silnika (częstotliwość, prędkość, prąd),
- Obsługa przycisków Start, Stop, Reverse, Reset,
- Tryb ręczny MOP (Manual Operation Panel) do zwiększania i zmniejszania częstotliwości.
Zmienne wejściowe i wyjściowe
Zmienne z mapowania I/O Modbus:
- wSTW_V20 – słowo sterujące (adres 40100),
- wHSW_V20 – słowo częstotliwości (adres 40101),
- wZSW_V20 – słowo statusowe (adres 40110),
- aMotorData – tablica odczytów: częstotliwość, prędkość, prąd (adresy kolejno 23, 24, 25).
Zmienne lokalne:
- xStart, xStop, xReverse – przyciski,
- xManual_Mode – aktywacja trybu MOP,
- xMOP_Higher, xMOP_Lower – przyciski „+” i „−”,
- wMOP_Frequency – aktualna częstotliwość w trybie MOP,
- wTest, wFreq – zmienne pomocnicze dla wyjść,
- rFrequency, rSpeed, rCurrent – wartości skalowane rzeczywiste.
Tryb manualny
Jeśli aktywny jest tryb ręczny (xManual_Mode), użytkownik może zwiększać lub zmniejszać częstotliwość falownika przyciskami xMOP_Higher i xMOP_Lower. Program wykrywa zbocza narastające tych przycisków:
- Jeżeli przycisk „+” jest wciśnięty i wcześniej nie był, częstotliwość zwiększa się o wMOP_Step.
- Jeżeli przycisk „−” jest wciśnięty i wcześniej nie był, częstotliwość zmniejsza się o wMOP_Step.
Wartość ta jest ograniczana przez zakres wMOP_Min – wMOP_Max (np. od 0 do 5000, co odpowiada 0–50 Hz).
Wysyłanie słowa sterującego (STW)
W zależności od trybu i stanu przycisków, do falownika wysyłane są odpowiednie komendy:
- 1278 – standby/reset,
- 1151 – start do przodu,
- 3199 – start do tyłu,
- 1134 – stop,
- 36863 – manual mode bez zmiany częstotliwości,
- 45055 – manual mode + zwiększanie częstotliwości,
- 53247 – manual mode + zmniejszanie częstotliwości.
Dzięki temu możliwe jest pełne sterowanie napędem zarówno w trybie automatycznym, jak i ręcznym.
Skalowanie odczytów z falownika
Falownik Sinamics V20 udostępnia rejestry zawierające dane o rzeczywistej częstotliwości, prędkości i prądzie. Są one w formacie WORD, ale często ze znakiem i w specyficznej skali. Program przelicza te dane:
- Częstotliwość (adres 23) – zakres: -327.68 do +327.67 Hz, skala: 0.01 Hz/jednostkę,
- Prędkość (adres 24) – zakres: -16250 do +16250 RPM, skala: 1:1,
- Prąd (adres 25) – zakres bez znaku, skala: 0.01 A/jednostkę.
W programie zastosowano konwersję WORD→DINT z interpretacją znaku i skalowanie do zmiennych typu REAL. Dodatkowo program oblicza wartość bezwzględną rFrequency_Abs oraz rSpeed_Abs, przydatne np. do logiki porównawczej czy wizualizacji.
Gotowy program do pobrania w Codesys
Pobierz gotowy projekt w LAD i ST tutaj:
Sprawdź pełny materiał wideo gdzie pokazujemy również program w języku Ladder oraz szczegółowo omawiamy program.







