Strona główna ASTOR

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

  • 1. Wprowadzenie. Jak skonfigurować, podłączyć oraz uruchomić sterownik PLC?
  • 2. Jak tworzyć i edytować projekty w oprogramowaniu Cscape?
  • Programowanie sterownika PLC w języku drabinkowym

  • 3. Jak tworzyć oraz konfigurować bazę zmiennych w środowisku Cscape?
  • 4. Jak korzystać ze styków, cewek i bloków operacji arytmetycznych w programie sterującym?
  • 5. Jak odmierzać czas w programie sterującym i jak konfigurować timery?
  • 6. Jak porównywać wartości i wykorzystać wyniki operacji logicznych?
  • 7. Jak zliczać impulsy i konfigurować liczniki?
  • 8. Jak konwertować typy zmiennych i przemieszczać zmienne w programie?
  • 9. Jak sterować wykonywaniem programu logicznego? Instrukcja skoku warunkowego
  • Programowanie zintegrowanego panelu HMI

  • 10. Jak budować ekrany operatorskie z obiektami do wizualizacji i zadawania wartości zmiennych?
  • 11. Jak umożliwić nawigację między ekranami operatorskimi oraz jak korzystać z gotowych obiektów graficznych w środowisku Cscape?
  • 12. Jak wizualizować zmienne analogowe oraz jak modyfikować ich wartości przy pomocy obiektów dostępnych w oprogramowaniu Cscape?
  • 13. Jak korzystać z obiektu menu?
  • 14. Konfiguracja i obsługa alarmów w sterownikach PLC
  • 15. Kontrolka Data Trend
  • Komunikacja sterowników PLC w sieci szeregowej i Ethernet

  • 16. Komunikacja szeregowa Modbus RTU Master i Slave
  • 17. Komunikacja CsCAN
  • 18. Komunikacja Ethernet Modbus TCP
  • 19. Wysyłanie wiadomości Email w sterowniku PLC
  • Zaawansowane funkcje sterownika PLC

  • 20. Regulator PID
  • 21. Składowanie danych: Data logging
  • 22. Składowanie danych: karta MicroSD
  • 23. Trendy historyczne oraz receptury w programie
  • 24. Setpoint, backup i restore danych oraz generowanie raportów z poziomu sterownika
  • 25. Hasła i zabezpieczenia w programie, ustawienia języka oraz edytor dostępny w narzędziu, opcja autodokumentacji / Dodatkowe ustawienia i możliwości edycji
  • 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

    Newsletter Poradnika Automatyka

    Czytaj trendy i inspiracje, podstawy automatyki, automatykę w praktyce

    Please wait...

    Thank you for sign up!

    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:

    1. – Wgraj program do sterownika,
    2. – Przełącz sterownik w tryb RUN,
    3. – Włącz opcję Debug,
    4. – 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).

    PRZED WYKONANIEM BLOKU FUNKCYJNEGO
    PO WYKONANIU BLOKU FUNKCYJNEGO
    %R42
    34567
    %R42
    34567
    %R43
    12
    %R43
    12
    %R44
    63
    %R44
    63
    %R45
    129
    %R45
    129
    %R46
    4
    %R46
    34567

    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.

    PRZED WYKONANIEM BLOKU FUNKCYJNEGO
    PO WYKONANIU BLOKU FUNKCYJNEGO
    %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 FUNKCYJNEGOPO 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?

    Czy ten artykuł był dla Ciebie przydatny?

    Średnia ocena artykułu: 5 / 5. Ilość ocen: 2

    Ten artykuł nie był jeszcze oceniony.

    Zadaj pytanie

    Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *