Jak konwertować typy zmiennych i przemieszczać zmienne w programie?
Kurs programowania PLC od podstaw
Odc. 8
Kontakt w sprawie artykułu: Kamil Zajdel - 2020-02-12
Z tego artykułu dowiesz się:
- Jakie bloki do konwersji typów zmiennych dostępne są w środowisku Cscape oraz jaka jest zasada ich działania?
- Jak konfigurować bloki konwersji typów zmiennych?
- Jakie rejestry można przemieszczać w programach?
- Jakie bloki do przemieszczania danych oferuje oprogramowanie Cscape?
- Jaka jest zasada działania bloków służących do przemieszczania rejestrów?
W poprzednim artykule dowiedziałeś się jak działają bloki funkcyjne służące do zliczania impulsów w sterowniku PLC i jak je wykorzystywać podczas programowania w języku drabinkowym.
Ta lekcja kursu jest podzielona na dwie istotne części – o konwersji danych i o przemieszczaniu rejestrów. Wiedzę teoretyczną z każdej części wykorzystasz w praktyce poprzez rozbudowanie Twojej aplikacji.
Kurs programowania PLC od podstaw dla automatyków i elektryków
Podstawy programowania sterowników PLC
Programowanie sterownika PLC w języku drabinkowym
Programowanie zintegrowanego panelu HMI
Komunikacja sterowników PLC w sieci szeregowej i Ethernet
Zaawansowane funkcje sterownika PLC
Część I: Jak i po co robić konwersję typów zmiennych
Bloki do konwersji danych, to kolejny element języka LAD. Pozwalają na zamianę typów danych. Głównie wykorzystywane są bloki do konwersji między typami: INT (16-bitowy), DINT (32-bitowy) i REAL (32-bitowy). Ponadto możliwa jest też konwersja znaków ASCII czy liczb typu long.
Pamiętaj, że operacja konwersji dotyczy wartości, a nie miejsca zajmowanego przez zmienną w pamięci sterownika.
Podczas konwersji możesz mieć do czynienia z sytuacjami takimi jak:
- zmniejszenie dokładności – co nie jest traktowane jako błąd i program jest prawidłowo wykonywany,
- konwertowanie dużej wartości na typ, który nie jest w stanie reprezentować tej wartości – błąd jest sygnalizowany i wynik działania programu może być nieoczekiwany.
Jakie bloki do konwersji typów zmiennych dostępne są w sterownikach PLC Horner?
Blok służący do konwersji typu INT na REAL – blok konwertuje wartość INT (16-bitową), zadaną parametrem IN1 na wartość REAL (32-bitową), zapisywaną w parametrze Q.
INT(16-bitowy) | REAL(32-bitowy) | WYJŚCIE |
1 | 1 | 1 |
20 | 20 | 1 |
100 | 100 | 1 |
1500 | 1500 | 1 |
25786 | 25786 | 1 |
32689 | 32689 | 1 |
Blok służący do konwersji typu DINT na REAL – blok konwertuje wartość DINT (32-bitową), zadaną parametrem IN1 na wartość REAL (32-bitową), zapisywaną w parametrze Q.
DINT(32-bitowy) | REAL(32-bitowy) | WYJŚCIE |
1 | 1 | 1 |
20 | 20 | 1 |
100 | 100 | 1 |
1500 | 1500 | 1 |
45928 | 45928 | 1 |
9876543 | 9876543 | 1 |
Blok służący do konwersji typu REAL na INT – blok konwertuje wartość REAL (32-bitową), zadaną parametrem IN1 na wartość INT (16-bitową), zapisywaną w parametrze Q.
REAL(32-bitowy) | INT(16-bitowy) | WYJŚCIE |
1.0 | 1 | 1 |
20.23 | 20 | 1 |
100.50 | 100 | 1 |
100.99 | 100 | 1 |
4589.543 | 4589 | 1 |
987543.2 | 4503 | 0 |
Blok służący do konwersji typu REAL na DINT – blok konwertuje wartość REAL (32-bitową), zadaną parametrem IN1 na wartość DINT (32-bitową), zapisywaną w parametrze Q.
REAL(32-bitowy) | DINT(32-bitowy) | WYJŚCIE |
1.0 | 1 | 1 |
20.23 | 20 | 1 |
100.50 | 100 | 1 |
100.99 | 100 | 1 |
4589.543 | 4589 | 1 |
888888888888 | 2147483647 | 0 |
Blok służący do konwersji typu INT na DINT – blok konwertuje wartość INT (16-bitową), zadaną parametrem IN1 na wartość DINT (32-bitową), zapisywaną w parametrze Q.
INT(16-bitowy) | DINT (32-bitowy) | WYJŚCIE |
1 | 1 | 1 |
20 | 20 | 1 |
100 | 100 | 1 |
1500 | 1500 | 1 |
25786 | 25786 | 1 |
32689 | 32689 | 1 |
Blok służący do konwersji typu DINT na INT – blok konwertuje wartość DINT (32-bitową) zadaną parametrem IN1 na wartość INT (16-bitową), zapisywaną w parametrze Q.
DINT (32-bitowy) | INT(16-bitowy) | WYJŚCIE |
1 | 1 | 1 |
20 | 20 | 1 |
100 | 100 | 1 |
1500 | 1500 | 1 |
25786 | 25786 | 1 |
45987 | 0 | 0 |
Programowanie w akcji!
Krok 1: Jak dodać i skonfigurować bloki konwersji typów danych w środowisku Cscape?
W tworzonej aplikacji zawartość zbiorników reprezentowana jest przez rejestry typu real. Do tworzenia wizualizacji stanów zbiorników na ekranach operatorskich niezbędne będą wartości typu int.
Teraz wykorzystaj bloki konwersji danych w każdym podprogramie służącym do napełniania i opróżniania odpowiedniego zbiornika.
Ikony służące do konwersji danych dostępne są z poziomu górnego paska narzędziowego.
Jeśli ich tam nie znajdujesz, włącz je, wybierając Menu -> View -> Toolbars -> Convert Operations.
W pierwszej kolejności dodaj nowe zmienne typu int. W oknie Project Navigator wybierz opcję I/O Names i za pomocą przycisku Add dodaj zmienne:
- – Adres: %R00020, Nazwa: Zbiornik_1_INT
- – Adres: %R00021, Nazwa: Zbiornik_2_INT
- – Adres: %R00022, Nazwa: Zbiornik_3_INT
Następnie przejdź do podprogramu Zbiornik_1 i w trzecim szczeblu drabinki, po styku normalnie otwartym ALWAYS_ON, wstaw blok konwersji REAL na INT. Nie musisz obawiać się błędnego wyniku, ponieważ wartości rejestru nie przekraczają zakresu obsługiwanego przez int.
Klikając dwukrotnie na dodany blok przejdziesz do jego konfiguracji. Jako Source wybierz zmienną Zbiornik_1 o adresie %R00001. W polu Destination wybierz stworzoną przed momentem zmienną Zbiornik_1_INT o adresie %R00020.
Uzupełnianie logiki kolejnych zbiorników będzie analogiczne.
Przechodząc do podprogramu Zbiornik_2 i Zbiornik_3, w trzecim szczeblu drabinki za stykiem ALWAYS_ON, dodaj blok konwersji typu REAL na INT i skonfiguruj następująco:
Zbiornik_2:
Zbiornik_3:
Krok 2: Wgraj program do sterownika i przetestuj
Po tylu odcinkach praktyki wiesz już na pewno, jak w kilku krokach przejść do testowania programu:
- – Wgraj program do sterownika,
- – Przełącz sterownik w tryb RUN,
- – Włącz opcję Debug,
- – Włącz opcję Data Watch
Kolejno w oknie Data Watch dodaj zmienne:
Sterując zaworami napełniania i opróżniania poszczególnych zbiorników, możesz obserwować zmiany wartości informujących o ich zawartości. Możesz wtedy zauważyć działanie bloków konwersji typów.
Część II: Jak przemieszczać dane pomiędzy rejestrami?
Środowisko zmiennych Cscape zawiera bloki funkcyjne służące do przemieszczania danych pomiędzy rejestrami sterownika. Bloki te można wykorzystać do wstawiania stałych do rejestrów, przemieszczania bloków danych do innego miejsca lub wypełniania bloków rejestrów tą samą wartością.
Co cechuje parametry bloków do przemieszczania danych?
- Wartości w rejestrze będącym parametrem wejściowym nie ulegają zmianie.
- W przypadku bloków funkcyjnych do przemieszczania pojedynczych rejestrów, jako parametr wejściowy można podać stałą numeryczną. Spowoduje to umieszczenie tej stałej we wszystkich rejestrach wyjściowych.
- W przypadku bloków funkcyjnych do przemieszczania bloków rejestrów, zarówno parametr wejściowy, jak i wyjściowy, musi być określony poprzez podanie adresu – nie można określać parametru wejściowego stałą numeryczną.
- Parametr Count określa liczbę przemieszczanych lub wypełnianych rejestrów w czasie pojedynczego wykonania bloku funkcyjnego. Dla bloku funkcyjnego do przemieszczania pojedynczego rejestru, parametr Count ma stałą domyślną wartość ‘1’. W przypadku bloków funkcyjnych do przemieszczania lub wypełniania bloków, parametr Count jest konfigurowalny i może mieć wartość z przedziału od 0 do 2048.
Jakie rodzaje bloków do przemieszczania danych oferuje środowisko Cscape i jak one działają?
Blok funkcyjny przemieszczający pojedynczy rejestr – MOV
Powoduje przesunięcie rejestru, pary rejestrów (32 bitów lub stałej wartości do następnego rejestru lub do pary rejestrów (32 bitów).
| | ||
| |||
| | ||
| | ||
| |
Blok funkcyjny przemieszczający bloki rejestrów – BMV
Powoduje przesunięcie bloku rejestrów z zadanego miejsca w inne. Move Block operuje wyłącznie na rejestrach 16-bitowych.
| | ||||||
%R42 | 34567 | %R50 | 0 | %R42 | 34567 | %R50 | 34567 |
%R43 | 12 | %R51 | 0 | %R43 | 12 | %R51 | 12 |
%R44 | 63 | %R52 | 0 | %R44 | 63 | %R52 | 63 |
%R45 | 129 | %R53 | 0 | %R45 | 129 | %R53 | 129 |
%R46 | 4 | %R54 | 0 | %R46 | 4 | %R54 | 4 |
%R47 | 56 | %R54 | 0 | %R47 | 56 | %R54 | 0 |
Blok funkcyjny Indirect Move – IMV
Powoduje on przemieszczenie pojedynczego rejestru lub bloku danych z jednego miejsca pamięci do innego. W przypadku tej instrukcji możliwe jest bezpośrednie lub pośrednie podanie adresu.
Adresowanie pośrednie wykorzystane było w powyższych blokach, gdzie podawałeś adres rejestru, który ma zostać przesunięty.
Adresowanie bezpośrednie polega na podaniu wskaźnika na adres. Rejestr podany jako parametr wejściowy traktowany jest jako wskaźnik, który blok funkcyjny odczytuje, następnie pobiera jego wartość i wartość tę przypisuje jako docelowy adres rejestru, z którego dane mają być przesunięte.
PRZED WYKONANIEM BLOKU FUNKCYJNEGO | PO WYKONANIU BLOKU FUNKCYJNEGO | ||||||
%R4 | 56 | %R12 | 100 | %R4 | 56 | %R12 | 100 |
%R55 | 123 | %R99 | 0 | %R55 | 123 | %R99 | 0 |
%R56 | 45 | %R100 | 0 | %R56 | 45 | %R100 | 45 |
%R57 | 28 | %R101 | 0 | %R57 | 28 | %R101 | 28 |
%R58 | 1116 | %R102 | 0 | %R58 | 1116 | %R102 | 1116 |
Blok funkcyjny do wypełniania bloków – FILL
Powoduje wypełnienie bloku rejestrów określoną wartością. Parametr IN może być stałą numeryczną lub adresem rejestru.
PRZED WYKONANIEM BLOKU FUNKCYJNEGO | PO WYKONANIU BLOKU FUNKCYJNEGO | ||
%R12 | 1234 | %R42 | 1234 |
%R40 | 0 | %R40 | 1234 |
%R41 | 0 | %R41 | 1234 |
%R42 | 0 | %R42 | 1234 |
%R43 | 0 | %R43 | 1234 |
%R43 | 0 | %R43 | 0 |
Blok funkcyjny do przemieszczania bloków stałych – CST MOV
Pozwala na zapisanie tabeli ze stałymi do grupy kolejnych rejestrów sterownika. Tabela stałych może zawierać wartości typu INT, DINT, UDINT, REAL. Jednak wszystkie elementy tablicy muszą być tego samego typu.
PO WYKONANIU BLOKU FUNKCYJNEGO | |
%R100 | 123 |
%R101 | 456 |
%R102 | 789 |
Programowanie w akcji!
Krok 1: Jak dodać i skonfigurować bloki do przemieszczania danych w programie?
Teraz dopiszesz kolejne linie kodu w Twojej aplikacji. Rozbudujesz program o logikę pozwalającą zadać w pierwszym cyklu pracy kontrolera czasy mieszania i grzania oraz ustawianie maksymalnych poziomów w zbiornikach.
W tym celu przejdź do programu głównego main i poniżej istniejącego szczebla wstaw styk normalnie otwarty i podłącz do niego zmienną S1. Jest to zmienna, która ma stan wysoki i przepuszcza sygnał tylko w pierwszym cyklu kontrolera. To zagwarantuje, że przemieszczanie danych do zmiennych będzie realizowane jednorazowo po uruchomieniu sterownika.
Kolejnym krokiem jest wstawienie za stykiem S1 dwóch bloków Move Data MOV.
Pierwszy blok będzie ustawiał czas mieszania. Przechodząc do konfiguracji jako Source zdefiniuj stałą wartość 50, natomiast w polu Destination wybierz zmienną Czas_Mieszanie. Typ danych ustaw na WORD. Blok ten spowoduje ustawienie czasu mieszania na 5 sekund.
Drugi blok posłuży do przypisania czasu grzania, w sposób analogiczny jak powyżej. Jako Source zdefiniuj stałą wartość 70, natomiast w polu Destination wybierz zmienną Czas_Grzanie. Typ danych również skonfiguruj jako WORD. Konsekwentnie, czas grzania będzie równy 7 sekund.
Do ustawienia maksymalnych pojemności zbiorników wykorzystasz blok Move Constant Data – MOV CST. Przechodząc do jego konfiguracji określ typ danych na REAL, a w oknie do wprowadzenia wartości wpisz kolejno pod sobą: 50.5, 40.8, 75.2. Jako Destination Address wybierz zmienną Zbiornik_1.
Taka konfiguracja spowoduje, że do kolejnych zmiennych: %R1 – Zbiornik_1, %R3 – Zbiornik_2, %R5 – Zbiornik_3 zostaną przypisane odpowiednio wprowadzone wartości.
Krok 2: Wgraj program do sterownika i przetestuj jego działanie
Tak jak wcześniej, wgraj program do sterownika, wprowadź sterownik w tryb RUN, włącz opcję Debug oraz włącz podgląd zmiennych w oknie Data Watch.
W oknie Data Watch dodaj do podglądu następujące zmienne i zobacz, jakie wartości zostały im przypisane:
Powinny być one zgodne z wartościami wprowadzonymi przez Ciebie w programie.
W kolejnym, ostatnim już odcinku części związanej z programowaniem sterowników PLC, poznasz instrukcję skoku warunkowego, która umożliwia sterowanie wykonywaniem programu logicznego.
Dowiesz się, jak działa ta instrukcja i jak można wykorzystywać ją w programie sterującym. Będzie to ostatni element uzupełniający Twoją wiedzę i umiejętności z zakresu tworzenia logiki w języku drabinkowym.
W kolejnym artykule z cyklu kurs „Programowanie oraz konfiguracja sterowników PLC zintegrowanych z hmi”: Jak sterować wykonywaniem programu logicznego? Instrukcja skoku warunkowego.
- Czym jest instrukcja skoku warunkowego i do czego służy?
- Jakie rodzaje bloków sterowania wykonywaniem programu dostępne są w środowisku Cscape?
- Jak wykorzystywać instrukcję skoku warunkowego w programie sterującym?