Kurs obsługi sterowników PLC M
- Wprowadzenie do oprogramowania UperLogic
- Pierwszy program i wgranie do PLC
- Karta Stanu i Wykresy Zmiennych
- Zegary i liczniki
- Widok urządzenia
- Moduły analogowe (w budowie)
- Moduły temperaturowe (w budowie)
- Przerwania
- Modbus
- Język Stukturalny
- Bloki funkcyjne
- Import Projektu z WinProLadder do UperLogic
Wstęp
Blok funkcyjny tworzy programista, aby uporządkować działanie programu i ułatwić jego budowę. Służy on do realizacji konkretnego zadania i pozwala wielokrotnie wykorzystywać to samo rozwiązanie bez pisania kodu od nowa.
Tworzenie własnego bloku funkcyjnego:
Po uruchomieniu oprogramowania UperLogic i wybraniu modelu sterownika, blok funkcyjny dodaje się poprzez wykonanie następujących kroków:
- Kliknąć prawym przyciskiem myszy zakładkę Programy bloków funkcyjnych.
- Wybrać opcję Dodaj bibliotekę funkcji (FB).
Następnie wyświetli się okno dialogowe, w którym należy zdefiniować podstawowe parametry bloku funkcyjnego:
- Nazwę bloku funkcyjnego.
- Język, w którym zostanie napisana funkcja (LAD lub ST).
- Liczbę wejść i wyjść. Wejście może być typu BOOL lub BOOL:Pulse Rising (zbocze narastające), wyjścia mogą być i wyłącznie typu BOOL.
- Wprowadzić liczbę wymaganych parametrów w zakładce Liczba parametrów, zostaną one automatycznie dodane do tabeli.
- VAR_PARA_IN (Wejście): Służy tylko do odczytu danych przez blok.
- VAR_PARA_OUT (Wyjście): Służy tylko do zapisu danych przez blok.
- VAR_PARA_INOUT (Wejście/Wyjście): Pozwala na jednoczesny odczyt i zapis. blok pobiera wartość, może ją zmodyfikować w trakcie działania i „oddać” zmienioną z powrotem pod ten sam adres.
- Parametry mogą być typu: INT16, UINT16, INT32, UINT32, FLOAT, BOOL.
5. Dodać wymagane zmienne tymczasowe. Po zakończeniu działania bloku ich wartość jest kasowana, używane są tylko do przechowywania wyników pośrednich. Mogą być typu: INT16, UINT16, INT32, UINT32, FLOAT, BOOL.
Podane parametry zostaną wykorzystane w dalszej części manuala, w której omówiony zostanie praktyczny problem oraz jego rozwiązanie z użyciem bloku funkcyjnego. Po wypełnieniu wszystkich pól okna dialogowego należy zatwierdzić je przyciskiem OK.
Do drzewa projektu została dodany blok funkcyjny (strzałka 1), natomiast nad obszarem roboczym automatycznie pojawiła się tabela zawierająca jego parametry (strzałka 2). Cała logika tworzona jest w jego przestrzeni roboczej, natomiast w programie głównym Main następuje jedynie odwołanie się do tego bloku.
Część praktyczna
Utworzony blok funkcyjny posłuży do rozwiązania następującego zadania:
Zbiornik na wodę o kształcie prostopadłościanu ze stałą długością i szerokością wewnętrzną. Należy utworzyć funkcję, która oblicza głębokość wody na podstawie parametru objętości wody. Jeżeli objętość przekracza 6000 ml, włącza się alarm górnego poziomu. Jeżeli objętość jest mniejsza niż 1000 ml, włącza się alarm dolnego poziomu.
W pierwszej kolejności należy:
- Wejść w blok funkcyjny.
- Nacisnąć na ikonę funkcji.
- Wpisać nazwę funkcji ZNCMP (Zone Compare) która służy do sprawdzenia czy wartość zadanego rejestru mieści się w określonym przedziale (między dolnym a górnym limitem).
Część programu odpowiadająca za alarmowanie, gdy poziom wody wyjdzie poza limit została zrobiona. Należy jeszcze utworzyć algorytm, który oblicza głębokość wody na podstawie parametru objętości wody znając długość i szerokość wewnętrzną zbiornika. Pierwszym krokiem będzie wykonanie podstawowych przekształceń wzorów:
Lvol = BoxW * BoxL * LDep
LDep = Lvol/(BoxW*BoxL)
gdzie:
- BoxW, BoxL – wymiary podstawy zbiornika
- Lvol – objętość wody
- LDep – głębokość wody
W pierwszej kolejności obliczamy wysokość słupa wody, dzieląc objętość wody przez jeden wymiar podstawy zbiornika, a następnie przez drugi wymiar podstawy. Operację dzielenia realizujemy dwuetapowo — w pierwszym etapie wykorzystujemy funkcję 14 ( / ).
Wynik dzielenia został zapisany pod zmienna TP0. By obliczenia na dalszym etapie były bardziej dokładne dobrą kwestią jest zmiana typów zmiennych z Integer na Float. Posłuży do tego funkcja 200. I → F której parametry to:
- S – rejestr źródłowy z wartością typu Integer.
- D – rejestr docelowy, do którego zapisywana jest wartość po konwersji na Float.
Konwersję wykonujemy na zmiennej TP0, zapisując wynik pod tym samym adresem oraz na zmiennej BoxL, zapisując wynik pod adresem TP1.
Drugi etap dzielenia wykonujemy przy użyciu specjalnej funkcji dzielenia dla wartości typu Float 205.FDIV. Parametry wewnętrzne tej funkcji mają takie samo znaczenie, jak w standardowej funkcji dzielenia.
Gotowy blok funkcyjny składa się z kilku funkcji. Pierwsza z nich odpowiada za generowanie alarmu w sytuacji, gdy poziom wody wykracza poza zadane wartości graniczne. Kolejne cztery funkcje realizują operacje matematyczne oraz przekształcenia typów zmiennych.
Odwołanie w Main
Następnie należy przejść do programu głównego Main, w którym możliwe jest odwoływanie się do utworzonego bloku funkcyjnego. Takie podejście poprawia czytelność kodu programu głównego oraz umożliwia wielokrotne wykorzystanie tego samego algorytmu. W przypadku potrzeby ponownego użycia danego rozwiązania wystarczy zaimplementować je w postaci bloku funkcyjnego i następnie wywoływać go w różnych miejscach programu.
- Wejście w program główny Main.
- Wybranie ikony Funkcje.
- Przejście z zakładki Ogólne do Programy bloków funkcyjnych.
- Wybranie z listy bloku funkcyjnego, który ma zostać wywołany.
Należy jeszcze przypisać wyjścia odpowiedzialne za alarmy poziomu wody. W tym celu jako sygnały alarmowe wykorzystane zostaną bity pomocnicze M32 oraz M33.
Przykład w języku ST
W nowym programie zostanie pokazane jak napisać blok funkcyjny w języku ST. Przykładowy program zamienia poziom w zbiorniku wody (0-500 litrów) na procenty (0-100%).
W pierwszej kolejności należy utworzyć nowy blok funkcyjny oraz w sekcji język wybrać Strukturalny (ST). Funkcja posiadać będzie:
- 1 wejście typu BOOL nazwane EN odpowiedzialne za załączenie funkcji.
- 2 wyjścia typu BOOL nazwane OK oraz ERR odpowiedzialne za to czy funkcja działa prawidłowo (Np. Gdy wartość wody wyjdzie poza dozwolone limity).
- 2 parametry wejściowe, gdzie Max przypisany jest maksymalny możliwy poziom zbiornia, a rVolume za chwilowy poziom wody w zbiorniku.
- 1 parametr wyjściowy rperc odpowiadający za wynik procentowy poziomu wody w zbiorniku.
Na początku kod sprawdza czy wartość wody mieści się w normie, a następnie wylicza jej wartość procentową w zbiorniku.
