Komputery i sterowniki przemysłowe Zbigniew Kulesza
Standard IEC1131-3 ISaGRAPH posiada pięć języków programowania: sekwencyjne schematy funkcyjne (SFC - Sequential Function Chart), bloki funkcyjne (FBD - Function Block Diagramm ), schematy drabinkowe (LD - Ladder Diagram ), lista instrukcji (IL - Instruction List), tekst strukturalny (ST - Structured Text ).
Języki programowania Graficzne Tekstowe edytory graficzne dla języków: schemat sekwencji funkcji (SFC - Sequential Function Chart), schemat bloku funkcji (FBD - Function Block Diagram), schemat drabinkowy (LD - Ladder Diagram); Tekstowe edytory tekstowe dla języków: lista instrukcji (IL - Instruction List), tekst strukturalny (ST – Structured Text), kodu C (opcjonalny);
Typy danych I - całkowite
Typy danych II - zmiennoprzecinkowe
Typy danych III - czasowe
Typy danych IV – daty i czasu
Typy danych V – łańcuchy znaków
Typy danych VI – ciągi bitowe
IL - Lista Instrukcji Lista instrukcji IL (Instruction List) jest językiem niskiego poziomu, podobnym do języka asemblera. Język ten jest efektywny dla małych aplikacji lub służy dla optymalizacji części aplikacji. Instrukcje odnoszą się zawsze do aktualnego wyniku (rejestru – lub elementu stosu). Operator wskazuje, jakiego typu operacja będzie wykonywana. Wynik jest ponownie zapisywany do rejestru (na stos) i traktowany jako aktualny wynik.
IL - Lista Instrukcji II Większość operacji standardowego języka IL ma postać: wynik := wynik OP operand Program IL jest listą instrukcji, z których każda musi zaczynać się od nowej linii, zawierać operator z kompletnymi modyfikacjami i ewentualnie jeden lub więcej operandów oddzielonych separatorem ",„. Etykieta zawsze poprzedza znak ":" i może być umieszczona przed instrukcją lub w wolnej linii. Nazwa nie może przekraczać 16 znaków, pierwszy znak musi być literą, następne literą, liczbą bądź znakiem "_". Może być definiowana tylko raz w programie.
IL – Lista Instrukcji III Rozmieszczenie elementów w programie ma postać: ETYKIETA OPERATOR OPERAND KOMENTARZ Start LD zm1 (*wczytanie zm1*) AND zm2 (*koniunkcja z zm2*) ST wynik (*wynik operacji zapisany do wynik*)
LD – Schematy drabinkowe I Schematy drabinkowe LD (Ladder Diagram) są graficzną reprezentacją logicznych równań przez układ graficznych symboli. Diagram LD zawiera się pomiędzy lewą i prawą szyną mocy, do których jest dołączony. Elementy mogą być łączone liniami pojedynczymi lub grupowymi. Lewa szyna mocy, jak również wszystkie linie połączone z nią, posiadają stan logiczny prawdy. Stan ten jest przenoszony przez kontakt w przypadku, gdy jest zamknięty. Każdy kontakt jest przyporządkowany zmiennej wejściowej lub wewnętrznej. Gdy zmienna przyjmuje stan 1, kontakt ulega zamknięciu. Gdy linia połączona z cewką posiada "moc", to cewka jak również przyporządkowana do niej zmienna wyjściowa zostają uaktywnione (przyjmują wartość 1).
LD – Schematy drabinkowe II Kontakt może występować w różnych modyfikacjach: standardowy, zanegowany - (/), uaktywniany zboczem narastającym - (P), uaktywniany zboczem opadającym - (N). Z kolei cewki mogą mieć postać: standardową, zanegowaną - (/), ustawialną - (S), kasowalną - (R). Schematy drabinkowe reprezentują formalizm elektrycznych diagramów połączeń stosując sterowanie bazujące na przełącznikach binarnych. Wadą tych schematów jest to, że jeżeli mają być zaprogramowane nie tylko operacje binarne, to schematy te muszą być rozszerzone o dodatkowe elementy. Elementami łączonymi tylko z lewej strony do linii sygnałowych są: instrukcja powrotu - RETURN - powodująca przerwanie wykonywania programu i instrukcja skoku - umożliwiająca przejście wykonywania programu do miejsca oznaczonego etykietą.
FBD – Bloki funkcyjne I Bloki funkcyjne FBD (Functional Block Diagram) są graficznym językiem, umożliwiającym budowę całościowych procedur przez pobieranie bloków funkcyjnych z bibliotek i ich łączenie. Elementy języka FBD opisują zależność funkcyjną pomiędzy zmiennym wejściowymi a wyjściowymi. Bloki funkcyjne wywodzą się ze schematów obwodów cyfrowych. W standardzie IEC wyróżnia się funkcje i bloki funkcyjne. Zakłada się, że obiekt typu funkcja posiada tylko jedne wyjście i dla tych samych wejść wydaje tą samą wartość wyjścia. Bloki funkcyjne posiadają kilka wyjść i dla tych samych wartości wejść mogą posiadać różne wartości wyjść, ze względu na wewnętrzne sprzężenia zwrotne i pamięć. Funkcje i bloki funkcyjne mogą być zdefiniowane hierarchicznie.
FBD – Bloki funkcyjne II Funkcje lub bloki funkcji mogą realizować przetwarzanie binarne, numeryczne, analogowe lub znakowe. Bloki funkcyjne łączone są liniami, przy czym ważne jest, aby lewy koniec linii nie znajdował się wyżej niż prawy, gdyż diagram programu rozpatrywany jest kolejno z góry w dół. Pojedyncza linia może łączyć: zmienną wejściową z wejściem funkcji, wyjście funkcji ze zmienną wyjściową, wyjście funkcji z wejściem innej funkcji. Linie rozgałęziającą tworzymy na tych samych zasadach pamiętając również aby prawy koniec nie przewyższał lewego. W przypadku, gdy linia jest zakończona kółkiem, oznacza to logiczne zaprzeczenie przenoszonego sygnału. Wywołanie procedury przeprowadza się przez wstawienie bloku, który ją obrazuje. Nazwa procedury widnieje wewnątrz bloku. Natomiast wyjściem z procedury jest zwracana przez nią wartość.
FBD – przykład I
FBD – przykład II
ST - Tekst strukturalny Tekst strukturalny ST (Structured Text) ma składnię podobną do języka Pascal. W języku ST zdefiniowane są instrukcje podstawiania, wyboru IF i CASE, iteracyjne FOR, WHILE, REPEAT, wywołanie funkcji lub bloku funkcji oraz przerwania wykonania funkcji. Język ST stanowi główne narzędzie do budowy złożonych procedur, dlatego nie może być przedstawiony jako język graficzny. Domyślnie używa się go przy opisie akcji w blokach i przejściach SFC. Program ST jest listą wyrażeń zakończonych średnikiem, będącym separatorem instrukcji.
Typy wyrażeń języka ST I Przyporządkowanie: zmienna := wyrażenie; Wywołanie podprogramu lub funkcji C: zmienna := podprogram (par1,par2,...); Wywołanie bloku funkcji C: nazwa_bloku (par1,par2,...); rezultat := nazwa_bloku.par1; Wyrażenie wyboru: IF wyr_logiczne THEN wyrażenie; ELSE wyrażenie; END_IF;
Typy wyrażeń języka ST II Pętle: FOR ind:=min TO max BY krok DO wyrażenie; END_FOR; WHILE wyr_logiczne DO wyrażenie; END_WHILE; REPEAT wyrażenie; UNTIL war_logiczny; END_REPEAT; Powrotu: RETURN;
Operatory języka ST I Nawiasy (maksymalnie 8 w wyrażeniu) Funkcje konwersji: zmienna := BOO (wyrażenie); zmienna := ANA (wyrażenie); zmienna:=REAL(wyrażenie); zmienna := TMR (wyrażenie); zmienna := MSG (wyrażenie); Operatory logiczne: zm_logiczna := NOT (wyr_logiczne); rez_logiczny := wyr_log1 AND wyr_log2; rez_logiczny := wyr_log1 OR wyr_log2; rez_logiczny := wyr_log1 XOR wyr_log2; brzeg := REDGE (wyr_logiczne,zm_pam); brzeg := FEDGE (wyr_logiczne,zm_pam);
Operatory języka ST II Operatory arytmetyczne: Porównania: wynik := wyr1 * wyr2; wynik := wyr1 / wyr2; wynik := wyr1 + wyr2; wynik := wyr1 - wyr2; Porównania: wynik := wyr1 < wyr2; wynik := wyr1 > wyr2; wynik := wyr1 <= wyr2; wynik := wyr1 >= wyr2; wynik := wyr1 = wyr2; wynik := wyr1 <> wyr2;
Rozszerzenia języka ST Sterowanie zegarem (zmienne zegarowe): TSTART, TSTOP; Zarządzanie programami (podprogramy): GSTART, GKILL, GFREEZE, GRST, GSTATUS; Wyrażenie systemowe: zm_analog := SYSTEM (rozkaz, argument); Wyrażenie akcji: zm_analog := OPERATE (zm_we_wy, rozkaz, argument);
Wyrażenia w języku ST
Operatory języka ST I
Operatory języka ST II
Rozszerzenia języka ST
Funkcje konwertujące języka ST I
Funkcje konwertujące języka ST II
Operatory i priorytety języka ST
Wywołanie programu w języku ST
Wywołanie bloku funkcyjnego w języku ST
Instrukcja IF
Instrukcja CASE
Instrukcja CASE - przykład
Instrukcja FOR
Instrukcja WHILE
Instrukcja REPEAT
Instrukcje sterowania czasowego
Instrukcje wykrywania zmian stanu
Instrukcje sterowania podprogramów
Instrukcja statusu podprogramu
Sterowanie skrzyżowaniem -przykład I
Sterowanie skrzyżowaniem -przykład II
ST - przykład
Biblioteki bloków funkcji C Zawierają: manipulacje danymi logicznymi: ustawialny przerzutnik bistabilny, kasujący przerzutnik bistabilny, wykrywanie powstania brzegu, wykrycie opadania brzegu, semafor, liczniki: licznik w górę, licznik w dół, licznik w górę i w dół, zegary: opóźnienie przy sygnale 1, opóźnienie przy sygnale 0, zegar pulsacyjny, manipulacje danymi całkowitymi: pełne porównanie bloku funkcyjnego, stos, procesy dotyczące sygnałów analogowych: przepełnienie, histereza, alarm z ograniczeniem, połączenie z czasem, różnice czasu, regulator PID, generacje sygnału: generator sygnału logicznego. funkcje matematyczne, trygonometryczne, kontroli rejestrów (przesunięcia, przeniesienia), manipulacji danymi (minimum, maksimum, modulo, multiplekser 4 lub 8 wejść, parzystość, generator liczb losowych, selektor logiczny 0), konwersji danych, realizujące operacje na łańcuchach znaków i tablicach.
SFC Sekwencyjne schematy funkcyjne I Sekwencyjne schematy funkcyjne SFC (Sequential Function Chart) tworzą język graficzny, służący do opisu operacji wykonywanych sekwencyjnie. Proces jest reprezentowany przez definiowane bloki, łączone również definiowalnymi przejściami. Definicja bloków może być dokonana przez użycie pozostałych języków (ST, IL, LD, FDB), natomiast przejście musi zawierać warunek logiczny. Składowe języka: Bloki i bloki inicjalizacyjne - reprezentowane są jako pojedyncze prostokąty. Każdy blok jest oznaczony numerem automatycznie nadawanym przez program lub definiowanym przez użytkownika. Oprócz numeru blok może mieć nadany identyfikator znakowy - krótki opis, nie będący kodem programu. Aktywność bloku w czasie działania programu sygnalizuje podświetlenie bloku szarym okręgiem. Atrybutem bloku, służącym do reprezentacji bloku w innych językach lub do identyfikacji bloku podczas kompilacji i przyporządkowaniu błędów, jest symbol: GSnnn.x (zmienna logiczna), GSnnn.t (zmienna czasowa). Gdzie nnn oznacza numer bloku.
SFC – przykład I
SFC – przykład II
SFC Sekwencyjne schematy funkcyjne II Przykłady bloków: Przejścia - reprezentowane przez grubszą linię umieszczoną w poprzek linii łączących elementy. Każde przejście opisane jest przez numer identyfikacyjny, umieszczony obok przejścia. Przejściu można również nadać komentarz - krótki opis nie będący kodem programu. Pojedyncze linie łączące - służą do łączenia bloków i przejść. Symbolizują przechodzenie punktu pracy programu przez elementy składowe. Zezwolenie na Start numer przejścia Komentarz Pojedyncze linie rozgałęzione - służą do połączenia jednego bloku z wieloma przejściami. Praktyczne umożliwia to wybór jednej z dróg dla której spełniony jest warunek przejścia. Podwójne linie łączące - służą do połączenia jednego przejścia z kilkoma blokami, których instrukcje wykonywane są dalej równolegle
SFC Sekwencyjne schematy funkcyjne III Metoda ta może być traktowana jako zastosowanie pojęć sieci Petriego. Miejsca sieci Petriego odpowiadają krokom SFC, natomiast przejścia sieci Petriego odpowiadają przejściom SFC. Przejścia definiują warunki przejścia z jednego kroku, do następnego. Skoki do bloków - mogą być użyte do przeniesienia punktu pracy z przejścia do bloku. Skok symbolizuje strzałka z numerem bloku, do którego skok jest skierowany. Blok makra - zawiera bloki i przejścia łączone w standardowy sposób, lecz traktowane jako odrębna część zamknięta w jednym bloku makra. Wywołanie procedury - powoduje przejście wykonywania instrukcji do procedury zawartej w ramce. Funkcja zwraca wartość będącą rezultatem poprawności jej wykonania. <rezultat> := <procedura> ();
SFC Sekwencyjne schematy funkcyjne IV Konwersja IL - bloki SFC można opisać także za pomocą IL. Tą część kodu należy umieścić w ramach ograniczonych rozkazami: #info=IL .................... #endinfo Reguły układu i wykonania programu: bloki i przejścia łączone są liniami pojedynczymi lub złożonymi, poszczególne części programu mogą być grupowane i wywoływane jako makra, blok nie może następować bezpośrednio po bloku, przejście nie może następować po przejściu, to samo makro nie może być użyte więcej niż jeden raz w programie, program FSC nie mający programu nadrzędnego jest nazywany main, program ten jest uruchamiany przy starcie aplikacji, podprogram może mieć tylko jednego właściciela, podprogram może być kontrolowany tylko przez jego właściciela, właściciel nie ma wpływu na podprogram wywoływany w podprogramie, jeżeli przejście nie posiada instrukcji, to jego wartość logiczna wynosi 1.
SFC Sekwencyjne schematy funkcyjne V Typy aktywności bloków Aktywność logiczna - przypisuje aktywność zmiennym logicznym przy aktywności bloku. Przy czym zmienna logiczna musi być zmienną wewnętrzną lub wyjściową. Aktywność pulsacyjna - powoduje, że instrukcja wykonywana jest tylko raz w przypadku aktywności bloku. Ten rodzaj aktywności uzyskiwany jest przez umieszczenie instrukcji w części ograniczonej rozkazami ACTION (P) i END_ACTION; aktywność bloku aktywność logiczna - bidirect aktywność logiczna - binvert aktywność logiczna - bset aktywność logiczna - breset aktywność pulsacyjna aktywność bez pamięci
SFC Sekwencyjne schematy funkcyjne VI Aktywność bez pamięci - instrukcje są wykonywane w każdym cyklu podczas aktywności bloku. Ten rodzaj pracy uzyskuje się przez zamknięcie w klamry rozkazów ACTION (N) i END_ACTION; Aktywność SFC - umożliwia zarządzanie podprogramami na podobnych zasadach, jak akcja zmiennych logicznych. Jej uruchomienie następuje przez podanie nazwy podprogramu i parametru: <pod_program> (N) - uruchamia podprogram, gdy blok jest aktywny oraz kończy wraz z dezaktywacją bloku. (N) jest parametrem opcjonalnym; <pod_program> (S) - startuje podprogram; <pod_program> (R) - zatrzymuje podprogram
SFC Sekwencyjne schematy funkcyjne VII Przyporządkowanie warunków do przejść Konwersja języka ST - przejście osiąga stan prawdy, gdy wyrażenie napisane w języku ST jest prawdziwe. Konwersja języka IL - jeżeli aktualna wartość akumulatora jest równa 0, przejście nie jest aktywne. Uaktywni się wówczas, gdy wartość akumulatora będzie się różnić od zera. Wywołanie procedury - wywołana przy przejściu procedura musi po wykonaniu zwrócić wartość różną od zera, aby uaktywnić przejście. Sterowanie podprogramem przez program nadrzędny realizowane jest przez instrukcje: Gstart - uruchamia podprogram, Gkill - zatrzymuje podprogram wraz z jego podprogramami, Gfreeze - zawiesza wykonanie podprogramu, Grst - ponownie restartuje zawieszony podprogram, Gstatus - pobiera aktualny status podprogramu.
Przykład programu
Deklaracja zmiennych - wspólna
SFC
LD - fragment
FBD
ST
IL
Sterowanie współbieżne GSTART(nazwa_podfunkcji) - uaktywnij proces tzn. dodaje go do listy procesów aktywnych. GKILL(nazwa_podfunkcji) - zdeaktywizuj proces tzn. zostaje usunięty z listy procesów aktywnych. GSTATUS(nazwa_podfunkcji) - zwraca stan procesu: 0 - nieaktywny, 1 - aktywny, 2 - zamrożony. GFREEZE(nazwa_podfunkcji) - zatrzymaj proces, tzn. zdeaktywizuj proces tak aby można go było odtworzyć do stanu z przed zamrożenia. GRST(nazwa_podfunkcji) - wznów proces, stosowane po GFREEZE.
Programy współbieżne
Program główny
Opis warunków i akcji I
Opis warunków i akcji II
Opis warunków i akcji III
Funkcja mieszaj
Opis warunków i akcji
Funkcja napełnianie
Opis warunków i akcji I
Opis warunków i akcji II
Procesor MC68303
Płyta główna Smart-Base