AKADEMIA GÓRNICZO- HUTNICZA IM. STANISŁAWA STASZICA W KRAKOWIE LABORATORIUM PRZEMYSŁOWYCH SYSTEMÓW STEROWANIA Wydział Inżynierii Mechanicznej i Robotyki Katedra Automatyzacji Procesów Przedmiot: Przemysłowe Systemy Sterowania (PSS) Laboratorium 11: Bloki programowe OB., FB, FC, DB Kraków
Cel ćwiczeń laboratoryjnych 1. Poznanie funkcjonalności OB., FC, FB, DB 2. Określenie różnicy pomiędzy funkcją i blokiem funkcji 3. Poznanie sposobów alokacji pamięci Po ukończeniu zajęć student powinien potrafić: 1. Samodzielnie zorganizować program w sposób liniowy i modułowy 2. Określić przydatność stosowania FB lub FC do danego zadania automatyzacji 3. Zrealizować obsługę wielu urządzeń za pomocą funkcjonałów
Wstęp Podczas tworzenia programu użytkownika do zadania automatyzacji używa się instrukcji zamieszczanych w blokach kodu (OB., FB lub FC). W oparciu o wymagania aplikacji użytkownik podczas tworzenia swojego programu może wybrać dla niego albo strukturę liniową, albo modularną. Program liniowy wykonuje wszystkie instrukcje zadania automatyzacji po kolei jedną po drugiej. Zwykle, program liniowy umieszcza wszystkie instrukcje w OB przeznaczonym do cyklicznego wykonywania (OB 1). Program modułowy wywołuje określone bloki kodu do wykonania specyficznych zadań. W celu stworzenia struktury modularnej, użytkownik musi podzielić złożone zadania automatyzacji na mniejsze podzadania odpowiadające funkcjom procesu. Każdy blok kodu zapewnia segment programu dla wykonania podzadania. Użytkownik określa strukturę programu poprzez wywoływanie jednego bloku kodu z innego bloku. Bloki organizacyjne OB Bloki organizacyjne wprowadzają w programie pewną strukturę. Służą jako interfejs między systemem operacyjnym i programem użytkownika. OB są sterowane zdarzeniami. Zdarzenie, takie jak przerwanie diagnostyczne lub interwału czasowego, powoduje, że CPU wykonuje OB. Niektóre OB mają predefiniowane zdarzenia startowe i działanie. Rys. 1. Definicja nowego bloku programu
Cykliczny OB zawiera główny program. Użytkownik może włączyć więcej niż jeden cykliczny OB w swój program użytkownika. W trybie RUN, cykliczne OB działają z najniższym priorytetem i mogą być przerwane przez wszystkie inne typy programów. (Rozruchowy OB nie przerywa działania cyklicznego OB, ponieważ CPU wykonuje rozruchowy OB przed wejściem do trybu RUN.) Po zakończeniu wykonywania cyklicznego OB, CPU natychmiast zaczyna ponownie wykonywać cykliczny OB. To działanie cykliczne jest normalnym sposobem pracy sterowników PLC. W wielu aplikacjach cały program użytkownika jest zlokalizowany w jednym cyklicznym OB., jak np. w domyślnym cyklicznym OB1. Rys. 2. Zasada wykonywania bloków organizacyjnych W celu dodania nowego bloku organizacyjnego należy w drzewie projektu w polu Program blocks kliknąć LPM w pozycję Add new block. Po tej akcji pojawi się okno wyboru rodzaju bloku (Rys. 1). Do dydpozycji są 4 rodzaje bloków: OB - blok organizacyjny FC - funkcja FB - blok funkcji DB - blok danych Blok organizacyjny może być programowany w dowolnym języku wspieranym przez CPU. Dostępne są trzy typy bloków organizacyjnych, których zasadę działania przedstawiono na (Rys. 2). Zasadniczo dzielą się one na: Blok typu Startup (OB100) - wykonywany przed przejściem do trybu pracy RUN
Bloki (programowo) cykliczne - wykonywane w trybie RUN w nieskończonej pętli while Bloki przerwań - program w nich wykonywany jest tylko w wypadku wystąpienia konkretnego zdarzenia OB może zostać także wykorzystany do obsługi zdarzenia przerwania. Jeśli zajdzie takie zdarzenie, to CPU przerywa cykl programu użytkownika i wywołuje OB skonfigurowany do obsługi tego zdarzenia. Po zakończeniu działania przez OB obsługujący przerwanie, CPU podejmuje wykonywanie programu użytkownika od miejsca, w którym wystąpiło przerwanie. Poprzez stworzenie ogólnego bloku kodu, który może być wykorzystywany w programie użytkownika można uprościć projektowanie i implementację programu użytkownika. Funkcjonały Do wykonywania standardowych zadań, takich jak sterowanie pompami lub silnikami można stworzyć bloki kodu wielokrotnego użytku. Te ogólne bloki kodu można przechowywać w bibliotece z możliwością wykorzystania w różnych aplikacjach lub rozwiązaniach. Jeżeli program użytkownika ma strukturę modularną zgodną z zadaniami funkcjonalnymi, to realizacja programu użytkownika jest łatwiejsza do zrozumienia i zarządzania. Składniki modularne nie tylko pomagają standaryzować konstrukcję programu, ale również sprawiają, że wprowadzanie uaktualnień i modyfikacji kodu programu jest łatwiejsze i szybsze. Tworzenie składników modularnych upraszcza debugowanie programu. Jeżeli cały program ma strukturę złożoną ze zbioru modułów programowych, to funkcjonalność każdego bloku kodu można testować zaraz po jego opracowaniu. Tworzenie składników modułowych powiązanych z określonymi zadaniami funkcyjnymi upraszcza i przyspiesza wdrażanie całej aplikacji. Funkcja FC Funkcja (FC) działa jak podprogram. FC to blok kodu, który zazwyczaj wykonuje określone działania na zbiorze wartości wejściowych. FC przechowuje wyniki operacji w komórkach pamięci i stosuje się do wykonywania następujących zadań: Standardowych i powtarzalnych działań, jak na przykład obliczeń arytmetycznych. Zadania funkcyjne, takie jak indywidualne sterowanie za pomocą działań logicznych. FC może być wywoływana wielokrotnie w różnych miejscach programu. Ta możliwość wielokrotnego użycia FC upraszcza programowanie często występujących zadań.
Przeciwnie niż blok funkcji (FB), FC nie jest skojarzona z żadnym blokiem danych instance (DB). Dla danych tymczasowych (obszar pamięci L) występujących podczas przeprowadzania obliczeń, FC wykorzystuje lokalny stos danych. Dane tymczasowe nie są zapamiętywane. W celu zapamiętania danych należy przypisać wartości wyjściowej miejsce w pamięci, na przykład w pamięci M lub w globalnym DB. Blok funkcji (FB) Blok funkcji (FB) działa jak podprogram z pamięcią. Jego wywołanie może być programowane za pomocą parametrów bloku. FB przechowuje wejściowe (IN), wyjściowe (OUT) i wejściowo/wyjściowe parametry w zmiennej pamięci zlokalizowanej w bloku danych (DB) lub instancji DB. Instancja DB zapewnia blok pamięci skojarzonej z wywołaniem FB i przechowuje dane po zakończeniu działania FB. FB są zwykle używane do sterowania działaniem zadań lub urządzeń, które nie kończą swojej pracy w jednym cyklu programu. W celu przechowywania parametrów operacyjnych w taki sposób, by były szybko dostępne w kolejnych cyklach programu, każda FB w programie użytkownika ma jedną lub więcej instancji DB. Kiedy FB jest wywoływana, wtedy również jest otwierany DB przechowujący parametry bloku i statyczne dane lokalne dla danego wywołania lub instancji FB. Instancja DB pamięta te wartości po zakończeniu działania FB. Użytkownik może nadać wartości początkowe parametrom interfejsu FB. Te wartości zostaną przeniesione do skojarzonej instancji DB. Jeśli parametrom nie zostaną nadane wartości, to będą wykorzystane wartości pamiętane w instancji DB. W niektórych przypadkach istnieje konieczność nadania parametrów początkowych. Można skojarzyć różne bloki danych instancji DB z różnymi wywołaniami FB. Bloki DB pozwalają na użycie tego samego FB do sterowania wielu urządzeń. Tworzenie struktury programu polega na tym, że jeden blok kodu wywołuje inny FB oraz instancję DB. CPU wykonuje wówczas program zawarty w FB i zapamiętuje parametry bloku oraz statyczne dane lokalne w danej instancji DB. Gdy wykonanie FB jest zakończone, wtedy CPU powraca do bloku kodu, z którego FB został wywołany. Instancja DB zachowuje wartości wpisane podczas tego wykonania FB. Projektując FB do wykonywania ogólnych zadań sterowania, użytkownik może wykorzystać ten FB z wieloma urządzeniami wybierając różne instancje DB do różnych wywołań FB. Uwaga Funkcje i bloki funkcji muszą być zagnieżdżone w bloku OB, aby mogły być wywoływane. Niezagnieżdżone FC i FB nie będą wykonywane Uwaga Wywołanie funkcji FC jest szybsze niż wywołanie bloku funkcji FB, gdyż FC nie odnosi się do bloku danych DB. Stąd stosowanie funkcji jest bardziej optymalne
Bloki danych DB Bloki danych (DB) są umieszczane w programie użytkownika po to, by przechowywały dane dla bloków kodu. Wszystkie bloki kodu w programie użytkownika mają dostęp do globalnego DB, ale poszczególne instancje DB przechowują dane dla określonych bloków funkcji (FB). Program użytkownika może przechowywać dane w specjalizowanych obszarach pamięci CPU, przeznaczonych dla wejścia (I), wyjścia (Q) i pamięci bitowej (M). Ponadto użytkownik może wykorzystywać bloki danych (DB) dla uzyskania szybkiego dostępu do danych przechowywanych w samym programie. Użytkownik może nadać DB status tylko do odczytu. Dane pamiętane w DB nie są usuwane po zamknięciu bloku danych lub po zakończeniu wykonywania korzystającego z nich bloku kodu. Są dwa typy DB: Globalny DB przechowuje dane dla bloków kodu programu użytkownika. Dostęp do danych zawartych w globalnym DB ma dowolny OB, FB i FC. Instancja DB przechowuje dane dla określonych FB. Struktura danych w instancji DB odzwierciedla parametry (wejściowe, wyjściowe i wejściowo/wyjściowe) oraz dane statyczne FB. Pamięć Temp FB nie jest przechowywana w instancji DB. Mimo, że instancja DB przechowuje dane dla konkretnego FB, to dostęp do tych danych ma dowolny blok kodu. Rys. 3. Urządzenie do pakowania cukierków, za : http://wdp.com.pl/userfiles/editor/_wdp/prezentacje/20163_wdp/yamato-03.2016-1.jpg Przykład Zadanie automatyzacji będzie polegało na zautomatyzowaniu trzech identycznych urządzeń do pakowania mieszanki cukierków - zawsze trzech kolorów (Rys. 3). Każdy podajnik ma specjalny czujnik przelotu cukierka nazwany żółty1, żółty2, zielony1,
zielony2, etc. Wszystkie cukierki wpadają do paczki. Gdy w paczce znajduje się 40 cukierków, uruchamiane jest urządzenie, które zgrzewa paczkę, odcina ją i zakłada nową. Układ umożliwia pakowanie trzech paczek równocześnie. Użycie FB i FC wymaga pewnego doświadczenia, ale mniej doświadczeni użytkownicy mogą skorzystać z poniższego algorytmu. Krok 1 Utworzenie programu bez użycia FC i FB (Rys. 4). Każde wystąpienie cukierka powoduje inkrementację rejestru ilość. Po przekroczeniu 40 wystąpień uruchamiana jest zgrzewarka (Q0.0) Rys. 4. Ogólny program realizujący zadanie automatyzacji Po sprawdzeniu poprawności działania programu przechodzi się do następnego kroku. Krok 2 Należy utworzyć funkcję lub blok funkcji i zadeklarować odpowiedne zmienne (Rys. 5). Uwaga Sprawdź działanie programu, jeśli zmienna ilość jest typu Temp
Rys. 5. Interfejs bloku funkcji FB Następnie należy przekleić wcześniej utworzony program do bloku funkcji i zamienić zmienne globalne na wskaźniki z interfejsu (Rys. 6). Rys. 6. Program w bloku funkcji FB wraz z zamienionymi przyłączami Krok 3 Należy zagnieździć funkcję lub blok funkcji w bloku OB, a następnie podłączyć usunięte zmienne globalne do odpowiadających im wskaźników(rys. 7)
Rys. 7. Zagnieżdżenie bloku funkcji FB Krok 4 Po sprawdzeniu poprawności działania programu należy przejść do multipleksowania FB lub FC poprzez zagnieżdżenie kolejnych funkcji lub bloków funkcji i podłączenie do nich odpowiednich zmiennych globalnych. (Rys. 8) Rys. 8. Multipleksowanie bloku funkcji FB
Ćwiczenie 1 Wykorzystując wskaźnik typu IN/OUT zrealizuj powyższy program z użyciem bloku FC Ćwiczenie 2 Zrealizuj trzy ekrany na panelu HMI, jak na (Rys. 9). Przycisk dolej oraz wylej powinien mieć działanie bistabilne. Korzystając z bloku cyklicznych przerwań (OB30) oraz funkcji lub bloku funkcji zrealizuj następującą funkcjonalność: Jeśli dolej jest w stanie wysokim, to poziom (INT) wzrasta o 3, co 200 ms Jeśli wylej jest w stanie wysokim, to poziom (INT) maleje o 2, co 200 ms Jeśli wylej i dolej są w stanie wysokim, to poziom (INT) wzrasta o 1, co 200 ms Nałóż ograniczenia na poziom - nie może on przekroczyć wartości 100, ani być ujemny. Zrealizuj program dla 3 zbiorników. Rys. 9. Okno aplikacji dla 1 zbiornika