Skip to main content

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:

ParametrWartośćOpis
P20109600Baud rate
P20118Długość słowa
P20121Bity stopu
P20130Parzystość: brak
P20140Timeout watchdog – wyłączony na czas testów
P20211Adres slave (1 domyślnie)
P20231Tryb 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_MinwMOP_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.

O autorze

Szymon Adamek

Author Szymon Adamek

Automatyk, Manager ds. klienta w ControlByte

Więcej postów tego autora Szymon Adamek