Bloki funkcyjne

Opublikowano

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: 

  1. Kliknąć prawym przyciskiem myszy zakładkę Programy bloków funkcyjnych. 
  2. Wybrać opcję Dodaj bibliotekę funkcji (FB). 
Dodanie biblioteki funkcji
Dodanie biblioteki funkcji

Następnie wyświetli się okno dialogowe, w którym należy zdefiniować podstawowe parametry bloku funkcyjnego:  

  1. Nazwę bloku funkcyjnego. 
  2. Język, w którym zostanie napisana funkcja (LAD lub ST). 
  3. 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.  
  4. 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.

Opis dodawania bloku funkcyjnego
Opis dodawania bloku funkcyjnego
Parametry w bloku funkcyjnym
Parametry w bloku funkcyjnym
Blok funkcyjny w programie
Blok funkcyjny w programie

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: 

  1. Wejść w blok funkcyjny. 
  2. Nacisnąć na ikonę funkcji. 
  3. 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). 
Funkcja ZNCMP dodawanie
Funkcja ZNCMP dodawanie

Do podstawowych parametrów funkcji należą:  

  • S – rejestr z wartością porównywaną, któremu przypisano parametr Lvol odpowiadający poziomowi wody w zbiorniku. 
  • Su – górna granica przedziału, której przypisano wartość 6000. 
  • Sl – dolna granica przedziału, której przypisano wartość 1000. 
Parametry ZNCMP
Parametry ZNCMP

Funkcja zostanie dodana do bloku funkcyjnego.

Wyjścia funkcji: 

  • INZ – wyjście aktywne, gdy S mieści się w przedziale ⟨SL, SU⟩. 
  • S>U – wyjście aktywne, gdy S jest większe od SU. 
  • S<L – wyjście aktywne, gdy S jest mniejsze od SL. 
  • ERR – błąd, gdy limity są nieprawidłowe (np. SL ≥ SU). 

    

ZNCMP w kodzie
ZNCMP w kodzie

Gdy poziom wody w zbiorniku przekroczy górny limit (S > SU), zostaje aktywowany alarm górnego poziomu, którego rejestrem jest HLMT. Natomiast gdy poziom wody spadnie poniżej dolnego limitu (S < SL), załącza się alarm dolnego poziomu, którego rejestrem jest LLMT. 

Wyjścia ZNCMP
Wyjścia ZNCMP

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 ( / ). 

Funkcja (/) parametry
Funkcja (/) parametry

Do podstawowych parametrów funkcji należą: 

  • Sa – dzielna (pierwsza wartość dzielona). 
  • Sb – dzielnik (wartość, przez którą dzielimy). 
  • D – rejestr wyniku dzielenia.  

Algorytm obliczania wysokości wody niech wykonuje się tylko wtedy, gdy żaden alarm nie jest w stanie wysokim. 

(/) w kodzie
(/) w kodzie

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. 

Konwersja TP0
Konwersja TP0

Używając połączeń pionowych (skrót klawiszowy V) łączymy funkcje w sposób następujący: 

Konwersja TP0 - łączenie
Konwersja TP0 - łączenie

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. 

Konwersja TP0 - dzielenie
Konwersja TP0 - dzielenie

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. 

  1. Wejście w program główny Main. 
  2. Wybranie ikony Funkcje.  
  3. Przejście z zakładki Ogólne do Programy bloków funkcyjnych. 
  4. Wybranie z listy bloku funkcyjnego, który ma zostać wywołany. 
Odwołanie w Main
Odwołanie w Main

Po potwierdzeniu przyciskiem OK, wyskoczy okno dialogowe w którym należy przypisać parametry  funkcji. Niech odpowiadają za nie rejestry R10 oraz R0.

rejestry R10 oraz R0
rejestry R10 oraz R0

Po zatwierdzeniu przyciskiem OK, programie Main będzie wyglądać to następująco: 

Program Main
Program Main

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.

Bity pomocnicze M32 oraz M33
Bity pomocnicze M32 oraz M33

W przypadku obsługi wielu zbiorników wody nie ma potrzeby wielokrotnego pisania tego samego kodu. Wystarczy wykorzystać wcześniej utworzony blok funkcyjny, zmieniając jedynie przypisania wejść i wyjść.

Blok funkcyjny
Blok funkcyjny

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. 

Następnie należy odwołać się do funkcji w programie Main (wszystko analogicznie jak w LAD). Po lewej stronie od przestrzeni roboczej pojawi się lista posiadanych bloków funkcyjnych:  

Następnie należy odwołać się do funkcji w programie Main
Następnie należy odwołać się do funkcji w programie Main

Eksportowanie bloku funkcyjnego

Aby wyeksportować blok funkcyjny należy nacisnąć prawym klawiszem myszy na Programy bloków funkcyjnych (FB) a następnie na Eksportuj bibliotekę funkcji (FB). 

A następnie w oknie dialogowym wybrać funkcję do eksportu oraz określić, czy ma być zabezpieczona hasłem.

A następnie zapisać wyeksportowaną funkcję: 

Bez kategorii