Komunikacja Powerflex 4M z Micro850 poprzez Modbus RTU - część 2

04.07.2025
Komunikacja Powerflex 4M z Micro850 poprzez Modbus RTU - część 2
Wizerunek autora

Wstęp

Ten artykuł jest kontynuacją tekstu Komunikacja PowerFlex4M z Micro850 poprzez Modbus cz. 1, w którym opisany został sposób odczytywania informacji poprzez protokół komunikacyjny Modbus RTU. W tej części zajmiemy się wysyłaniem komend sterujących, dzięki którym będziesz mógł kontrolować pracę silnika podłączonego do przemiennika częstotliwości PowerFlex4M. 

Opis stanowiska i schemat połączeń

Opis stanowiska

Podczas testowania programu będziemy się posługiwać poniższym zestawem demonstracyjnym, wyposażonym w 4 przełączniki monostabilne, 3 przełączniki bistabilne, jeden przycisk monostabilny oraz czujnik zbliżeniowy. 

Warto zauważyć, że w naszym przypadku przełączniki monostabilne są podłączone odpowiednio do wejść "0", "1", "3" i "13", dlatego też w dalszej części artykułu, gdy będziemy tworzyć już program będziemy posługiwali się dokładnie tymi wejściami.

Schemat połączeń

Połączenie pomiędzy komputerem a sterownikiem należy zrealizować przy użyciu kabla Ethernet. Przed rozpoczęciem konfiguracji należy upewnić się, że oba urządzenia znajdują się w tej samej podsieci IP i są w stanie się wzajemnie komunikować. Mikrokontroler został podłączony z przemiennikiem częstotliwości przy pomocy kabla RS485.

WAŻNA INFORMACJA: W przedstawionym przykładzie przemiennik częstotliwości PowerFlex 4M nie jest podłączony bezpośrednio do sterownika Micro850, lecz do zainstalowanego w nim modułu plug-in 2800-SERIALISOL. Istnieje możliwość nawiązania komunikacji również bez użycia tego modułu, jednak w takim przypadku należy zwrócić uwagę, aby podczas konfiguracji w CCW wybierać wbudowany port szeregowy sterownika.

Logika sterowania falownikiem PowerFlex4M - komendy Modbus RTU

Sterowanie ruchem silnika

Przed przystąpieniem do dalszej części pisania kodu należy zapoznać się, w jaki sposób odczytywane są sygnały wysyłane przez Modbus do adresu rejestru nr 8192. Aby nadać polecenie ruchu silnikowi, użytkownik wysyła liczbę w systemie dziesiętnym, która następnie przekształcana jest na postać binarną, a następnie rozkładana na poszczególne bity i grupy bitów. W zależności od ich stanu (zgodnego z poniższą tabelą) silnik wykonuje określone działania. 

Adres (w systemie dziesiętnym) Nr bitu - wraz z opisem angielskim Opis
8192 0 - STOP 1 = zatrzymanie silnika, 0 = brak zatrzymania silnika
1 - START 1 = start silnika, 0 = brak startu silnika
2 - Jog 1 = kontrolowane, próbne obracanie silnika (ang. jog)
0 = brak kontrolowanego, próbnego obracania silnika (ang. jog)
3 - Clear Faults 1 = kasowanie błędów
0 = brak kasowania błędów
5,4 - Move Direction 00 = brak polecenia
01 = ruch silnika zgodnie z ruchem wskazówek zegara
10 = ruch silnika przeciwnie do ruchu wskazówek zegara
11 = brak polecenia
6 - C-form relay control 1 = przekaźnik załączony
0 = przekaźnik wyłączony
7 - MOP Increment 1 = zwiększenie wartości sterowania
0 = brak zmiany
9,8 - Acceleration Rate 00 = brak polecenia
01 = przyspieszenie nr 1
10 = przyspieszenie nr 2
11 = zatrzymanie obecnego tempa przyspieszenia
11,10 - Deceleration Rate Selection 00 = brak polecenia
01 = hamowanie nr 1
10 = hamowanie nr 2
11 = zatrzymanie obecnego tempa hamowania
14,13,12 - Frequency Source Selection 000 = brak polecenia
001 = źródło częstotliwości: parametr P108
010 = źródło częstotliwości: parametr A409
011 = źródło częstotliwości: adres 8193
100 = źródło częstotliwości: parametr A410
101 = źródło częstotliwości: parametr A411
110 = źródło częstotliwości: parametr A412
111 = źródło częstotliwości: parametr A413
15 - MOP Decrement 1 = zmniejszenie wartości sterowania
0 = brak zmiany

Przykładowo:

Zakładamy, ze chcemy wykonać następujące polecenia ruchu:

  • Start Silnika
  • Ruch silnika przeciwnie do ruchu wskazówek zegara

Sprawdzamy wówczas zgodnie z powyższą tabelą, jakie bity odpowiadają powyższym poleceniom. Są to 1-szy bit (start silnika) oraz bity 5,4 (ruch silnika przeciwnie do ruchu wskazówek zegara). Możemy przypisać te dane do poniższej tabeli. 

Pozycja bitu 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Wartość bitu - - - - - - - - - - 1 0 - - 1 -
Wykonywane polecenie ruchu - - - - - - ruch silnika przeciwnie do ruchu wskazówek zegara - - start silnika -

W następnym kroku, uzuepłniamy tę tabelę o brakujące bity. W związku z tym, że nie będą wykonywane żadne inne polecenia to w puste miejsca przypisujemy wartość "0". Tabela będzie prezentować się w następujący sposób. 

Pozycja bitu 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Wartość bitu 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0
Wykonywane polecenie ruchu - - - - - - ruch silnika przeciwnie do ruchu wskazówek zegara - - start silnika -

Jeżeli zapiszemy teraz obok siebie wszystkie wartości bitów, które znajdują się w tabeli to otrzymamy liczbę w postaci binarnej: 0000 0000 0010 0010. 

Aby przekonwertować ją z postaci binarnej na dziesiętną, należy zidentyfikować pozycje bitów, które mają wartość 1, a następnie zsumować odpowiadające im potęgi liczby 2. W naszym przypadku są to odpowiednio bity nr 1 i 5. 

Wykonujemy wówczas następujące obliczenia.

(21 × 1) + (25 × 1) = 2 + 32 = 34

Otrzymana liczba, po wysłaniu jej do mikrokontrolera przez zmienną "Modbus_Local_Addr_2[1]", wyda polecenie określone powyżej. 

Sterowanie prędkością silnika

Nadanie prędkości silnika jest znacznie bardziej intuicyjne. Nadana przez użytkownika wartość jest przesyłana do "Modbus_Local_Addr2[2]", a następnie dzielona przez 10 i nadawana silnikowi jako prędkość obrotowa. Przykładowo dla wartości 100 otrzymamy 10,0 Hz, a dla wartości 355 będzie to 35,5 Hz. 

Pisanie programu

Program napisany zgodnie z instrukcjami z poprzedniej części artykułu, wraz z przypisanymi do niego zmiennymi, powinien prezentować się następująco.

Kontynuując konfigurację stworzymy nową linię logiczną, na którą dodajemy kolejny blok "MSG_MODBUS". W naszym przypadku jest on nazwany "Write_Modbus". W kolejnym kroku dodajemy dwie zmienne, które następnie przypisywane są do nowo utworzonej struktury. Dla pozostałych pól, dla których nie zostały utworzone nowe zmienne, posiłkujemy się tymi utworzonymi dla pierwszego bloku "MSG_MODBUS".

Przenosimy kolejno całą linię logiczną o pozycję wyżej (tak, aby zamiast na pozycji nr 2 była na pozychi nr 1). Całość powinna wyglądać w następujący sposób.

Następnie dodamy przyciski, po których naciśnięciu wysyłana jest odpowiednia komenda sterująca. Aby to uczynić musimy utworzyć trzy dodatkowe rozgałęzienia i dodać je do linii logicznej, na której znajduje się świeżo utworzony moduł "Write_Modbus".

Kolejno dodajemy styki zbocza narastającego, aby wywoływać akcję, po jednokrotnym przestawieniu przełącznika monostabilnego. W kolejnym kroku przypisujemy tym stykom odpowiednie wejścia zgodnie z tym, w jaki spsoób połączyliśmy przełączniki z mikrokontrolerem.

Aby zwiększyć czytelność programu, przypiszemy odpowiednim wejściom aliasy, które pomogą lepiej je zidentyfikować. Aby to zrobić należy dwukrotnie kliknąć na dodany wcześniej styk ze zboczem narastającym. Otworzy nam się wówczas poniższa tabela, do której w kolumnie "Alias" wpisujemy wybraną przez siebie nazwę. 

Automatycznie wyświetlane są wówczas nazwy wyjść wraz z aliasami, będące mało czytelne. Aby to zmienić klikamy prawym przyciskiem myszy na styk ze zboczem narastajacym i wybieramy opcję "Properties", a  w nowo otwartym oknie zmieniamy "Name&Alias" na "Alias". Proces powtarzamy dla wszystkich czterech styków.

Następnie musimy zdeklarować akcję, która ma następować po włączeniu przycisku. W tym celu posłużymi się blokiem "MOV". Umieszczamy po jednym takim bloku dla każdego przycisku i przypisujemy im następujące wartości.

WAŻNE: Należy zwrócić uwagę, na to, aby odwoływać się do wartości postaci "Modbus_Local_Addr_2[XXX]", gdzie XXX przyjmuje wartość "1" lub "2" w zależności od tego, czy chcemy zmienić odpowiednio parametry ruchu bądź prędkości.

Następnie powtarzając instrukcje z poprzednich kroków tworzymy nową linię logiczną, zgodną z tą na poniższej grafice. Będzie ona odpowiedzialna za zmianę kierunku ruchu silnika. 

Aby program działał prawidłowo dodatkowo musimy umieścić w nim flagi, których zadanie polegać będzie na zapamiętaniu stanu systemu, a także niedopuszczenie do wystąpienia pod pewnymi warunkami poszczególnych akcji. W naszym programie będziemy posługiwali się 3-ma flagami:

  • Motor_Run - żadne działanie (oprócz START) nie może zostać podjęte w sytuacji, gdy flaga ta jest nieaktywna.
    • Aktywowana przy starcie silnika
    • Dezaktywowana przy jego zatrzymaniu.
  • Motor_Forward - używana, aby (w połączeniu z ustawieniem przełącznika bistabilnego) załączyć obroty silnika zgodnie z ruchem wskazówek zegara.
    • Aktywowana przy starcie silnika, a także po tym jak silnik załączy obroty w kierunku przeciwnym do ruchu wskazówek zegara.
    • Dezaktywowana po jednym cyklu pracy sterownika, gdy silnik zaczął obracać się zgodnie z kierunkiem ruchu wskazówek zegara.
  • Motor_Reverse - używana, aby (w połączeniu z ustawieniem przełącznika bistabilnego) załączyć obroty silnika przeciwnie do ruchu wskazówek zegara.
    • Aktywowana przy starcie silnika, a także po tym jak silnik załączy obroty w kierunku przeciwnym do ruchu wskazówek zegara.
    • Dezaktywowana po jednym cyklu pracy sterownika, gdy silnik zaczął obracać się zgodnie z kierunkiem ruchu wskazówek zegara.

Dodatkowo, oprócz ustanowienia flag, w związku z tym, że w programie CCW nie jest możliwe automatyczne porównywanie z "0" i "1" boolowskimi (domyślnie cyfry "0" i "1" traktowane są jako zmienne typu LINT [long-integer]), musimy sobie takie zmienne stworzyć.

W tym celu klikamy dwukrotnie na znajdujące się w "Project Organizer" pole "Local Variables". Otworzy nam się wówczas tabela, do której możemy przypisać nasze zmienne. Prezentują się one zgodnie z poniższą grafiką.

WAŻNE: Należy zwrócić szczególną uwagę na to, aby wartości te były przypisane w polu "Initial Value".

Flaga Motor_Run

Dla zwiększenia czytelności każdorazowo przy dodawaniu kolejnych bloków instrukcji będą prezentowane dwie grafiki.

  • Pierwsza ma za zadanie ukazać położenie nowo dodanej instrukcji na tle całej linii logicznej.
  • Na drugiej prezentowana jest ona w przybliżeniu, aby widać było wyraźniej zaznaczone tam zmienne.

Na samym początku dodajemy dwa bloki "MOV", aby ustawiać wartości "0" i "1" dla flagi "Motor_Run".

Następnie dodajemy cztery bloki "Equal" dla pozostałych przycisków.

Flaga Motor_Forward

Na początku musimy upewnić się, że przy włączeniu silnika flaga ta jest aktywowana.

Następnie przechodzimy na drugą linię logiczną, na której dodajemy blok "Equal" sprawdzający czy flaga "Motor_Forward" jest aktywna w sytuacji, gdy chcemy, aby silnik obracał się zgodnie z ruchem wskazówek zegara. Dodatkowo dodajemy 2 bloki "MOV" które wyłączają i włączają tę flagę.

Flaga Motor_Reverse

Z tą flagą postępujemy analogicznie jak z "Motor_Forward". Na początek dodajemy blok "MOV" do linii logicznej uruchamiającej silnik.

W kolejnym kroku uzupełniamy drugą linię logiczną o blok "Equal" oraz dwa bloki "MOV".

Ostatnim elementem programu jest dodanie bloku "MOV" resetującego prędkość obrotową silnika do pierwszej linii logicznej.

Kompletny kod programu, uwzględniający wszystkie wcześniej omówione etapy konfiguracji dostępny jest po kliknięciu w poniższe hiperłącze.

Podsumowanie

Przemienniki PowerFlex można łatwo zintegrować ze sterownikami Micro850 dzięki protokołowi Modbus RTU. Prosta konfiguracja parametrów komunikacyjnych w oprogramowaniu CCW oraz gotowe funkcje do obsługi rejestrów Modbus umożliwiają szybkie uruchomienie i niezawodną wymianę danych.

Jeśli masz pytania dotyczące działania programu w CCW, zapraszam do kontaktu:

pawel.dzieciol@elmark.com.pl

Skontaktuj się ze specjalistą Elmark

Masz pytania? Potrzebujesz porady? Zadzwoń lub napisz do nas!