Wiemy już, czym charakteryzuje się język ST (Structured Text), na czym polega przepływ programu oraz główne zasady dotyczące składni i dodawania komentarzy. W tej części skupimy się przede wszystkim na zmiennych.
Tworzenie poleceń w języku ST
Język ST składa się z poleceń. Czym właściwie jest polecenie?
Polecenia funkcjonują także w świecie ludzi. Ty możesz wydawać polecenia, Twój szef czy policjant. W programowaniu PLC jest podobnie. To Ty wydajesz polecenia sterownikowi PLC, jak ma się zachować.
1 // Polecenie to wydanie rozkazu sterownikowi w jaki sposób PLC ma się zachować
Wykonam przykładowe polecenie jako przykład:
1 xPrzycisk := TRUE;
W powyższym poleceniu mówisz sterownikowi, że ma przypisać stan wysoki zmiennej „xPrzycisk”.
Kompilator zinterpretuje tą linię kodu jako jedno polecenie, ponieważ kiedy osiągnie średnik, to wie, że jest to koniec polecenia. Pamiętaj, polecenia są oddzielane średnikami. Jest to główna zasada składni języka ST.
Używanie zmiennych w języku ST
Zmienne są definiowane między dwoma wyrazami VAR oraz END_VAR. Są to zarezerwowane słowa kluczowe. To znaczy, że nie możesz ich używać w żadnym innym miejscu w programie.
Jeżeli znasz inne języki programowania, to na pewno już miałeś szansę spotkać z pojęciem zmiennych.
1 // Zmienna to miejsce gdzie możesz przechowywać dane
Zmienna zawsze przyjmuje określony typ danych. Przykładem jest zmienna typu BOOL, gdzie możesz przechowywać wartość TRUE lub FALSE (tylko dwa stany).
Zmienna zawsze ma przypisany odpowiedni typ danych i przechowuje wartość określonego typu danych. Programista może nadawać nazwy deklarowanym zmiennym.
Używając środowiska programistycznego WAGO-I/O-PRO lub e!COCKPIT deklarujemy zmienne na dwa sposoby. Można wykonać operacje deklaracji zmiennych poprzez wywołanie okna deklaracji lub wpisanie „ręcznie” w polu deklaracji zmiennych.
Dodatkowo rozróżnia się podział zmiennych na zmienne globalne oraz zmienne lokalne.
1 // Zmienna lokalna – zdefiniowana i widoczna tylko w określonym bloku programu
1 // Zmienna globalna – widoczna we wszystkich miejscach w programie
Typy zmiennych używane w języku ST
Międzynarodowa norma IEC 61131-3 opisująca graficzne i tekstowe języki programowania dla sterowników PLC standaryzuje także typy danych na dwie kategorie: elementarne typy danych oraz pochodne typy danych.
Elementarne typy danych:
- Integer
- Float
- Time
- String
Pod każdym typem elementarnym definiuje się ich podtypy. I tak:
Dla zmiennych typu integer
Typ danych | Dolny zakres | Górny zakres | Informacja | Prefiks |
SINT | -128 | 127 | 8 bitów | si |
USINT | 0 | 255 | 8 bitów | usi |
INT | -32768 | 32767 | 16 bitów | I |
UINT | 0 | 65535 | 16 bitów | ui |
DINT | -2 147 483 648 | 2 147 483 647 | 32 bity | di |
UDINT | 0 | 4 294 967 295 | 32 bity | udi |
LINT | -2^63 | 2^63-1 | 64 bity | li |
ULINT | 0 | 2^64-1 | 64 bity | uli |
Dla zmiennych typu float
Typ danych | Dolny zakres | Górny zakres | Informacja | Prefiks |
REAL | 1.175494351e-38 | 3.402823466e+38 | 32 bity | r |
LREAL | – | – | 64 bity | Lr |
Dla zmiennych time
Typ danych | Dolny zakres | Górny zakres | Informacja | Prefiks |
TIME | t#0ms | t#49d17h2m47s295ms | 32 bity | tim |
TIME_OF_DAY | tod#00:00:00 | tod#23:59:59.999 | 32 bity | tod |
DATE_AND_TIME | dt#1970-00-00-00:00:00 | Dt#2106-02-06-06:28:15 | 32 bity | dt |
DATE | D#1970-00-00 | D#2106-02-06 | 32 bity | date |
Dla zmiennych string
Typ danych | Dolny zakres | Górny zakres | Informacja | Prefiks |
STRING | ‘’ | ‘ciąg znaków’ | s |
Dla zmiennych bit string
Typ danych | Dolny zakres | Górny zakres | Informacja | Prefiks |
BOOL | FALSE | TRUE | 1 bit | x |
BYTE | 0 | 255 | 8 bitów | b |
WORD | 0 | 65535 | 16 bitów | w |
DWORD | 0 | 4 294 967 295 | 32 bity | dw |
LWORD | 0 | 2^64 | 64 bity | lw |
Kilka ważnych uwag o zmiennych
- Dodawaj prefiksy przed nazwami zmiennych
Tworząc odpowiednie zmienne pamiętaj, żeby przed nazwą zmiennej stosować odpowiedni prefiks (tabele powyżej) informujący o typie danej zmiennej.
Operacja ta znacznie poprawi czytelność Twojego kodu. Łatwiej będziesz mógł zidentyfikować zmienne określonego typu w programie.
Zmienna może być zainicjalizowana pewną wartością. Wartość ta będzie przypisana zawsze po starcie sterownika PLC.
Czasami istnieje potrzeba definiowania zmiennych na wcześniej ustalonych adresach sterownika PLC. Można to wykonać w oknie autodeklaracji lub zrobić to w oknie deklaracji zmiennych dodając słowo kluczowe AT.
Zmienna mogą być zadeklarowane jako zmienne nieulotne, tj. RETAIN oraz PERSISTENT. Różnice przedstawia tabela poniżej, gdzie:
X = oznacza, ze wartość zmiennej zostaje zachowana w pamięci nieulotnej
– = oznacza, że wartość zmiennej zostaje kasowana, inicjalizowana od nowa
Wartości w zmiennych mogą być na bieżąco zmieniane podczas działania programu PLC. Do stałej wpisywana jest odpowiednia wartość przy deklaracji. Wartości stałej nie można zmieniać.
Przykład deklaracji stałej
Pochodne typy danych:
- Typ strukturalny (struktura danych)
Opisuje złożone struktury danych, w których występują dane różnych typów. Dozwolone są struktury zagnieżdżone. Zmienne nie mogą być wstawiane w adresy sterownika. Prefiks przed każdą strukturą to typ lub ut.
Jeżeli zdefiniujemy strukturę, to w łatwy sposób można się do niej odwołać w programie głównym. Wystarczy stworzyć nazwę zmiennej i wybrać dla niej wcześniej zdefiniowany przez użytkownika typ strukturalny.
Przykład definicji zmiennej typu strukturalnego z wykorzystaniem okna autodeklaracji.
- Enumeracja (typ wyliczeniowy)
Uporządkowany i skończony zbiór wartości oznaczonych dowolnie przez programistę. Zmienna może przyjmować tylko wartości określone w deklaracji typu (umieszczone w nawiasach). Elementy występujące w nawiasach są wprowadzane jako nazwy (stałe tekstowe), które są kodowane jako wartości całkowite. Jeśli wartości enumeracji nie są zainicjalizowane, liczenie rozpoczyna się od 0.
Przykład enumeracji, która może być wykorzystywana do przygotowania programu sterowania sygnalizacją świetlną.
Dobrym przykładem jest także enumeracja wykorzystywana w bibliotece Modb_I05.lib (przeznaczona do konfiguracji protokołu MODBUS). Enumeracja dostarcza kod błędu w zrozumiałej dla użytkownika tekstowej wiadomości.
- Typ okrojony
Typ danych, którego zakres wartości obejmuje tylko podzbiór typów podstawowych. Zmienna typu okrojonego może przyjmować tylko wartości z zakresu zadeklarowanego w nawiasach.
- Tablice danych
Tablica składa się z ustalonej liczby elementów tego samego typu. Dostęp do elementu tablicy uzyskuje się przez podanie indeksu. W nawiasach kwadratowych deklaruje się zakresy zmian tych indeksów, definiując jednocześnie w ten sposób rozmiar tablicy. Wskutek zagnieżdżenia tablic (ARRAY[0..2] OF ARRAY[0..3] OF …) może powstać maksymalnie 9 wymiarów. Stosowany prefiks to arr lub a (CODESYS 2.3).
Pochodne typy danych tworzone są przez dowolnie przez programistę. Wszystkie pochodne typy danych budowane są przy pomocy słów kluczowych TYPE oraz END_TYPE z wyjątkiem tablic. Pomiędzy tymi słowami kluczowymi umieszczamy określone zmienne. Tablice definiujemy w blokach programów lub jako zmienne globalne.
Powinieneś zapamiętać kilka typów zmiennych, żeby zacząć programować w języku ST. Wraz z poziomem zaawansowania programisty i budowaniem coraz bardziej skomplikowanych programów nauczysz się, jak poprawnie i w jakiej sytuacji używać pochodnych typów danych. Ważne, żeby nie próbować zgłębić całej wiedzy natychmiast. Najpierw trzeba opanować podstawy.
Jak wpisać wartość do zmiennej? Jak używać zmiennych w programie? Służą do tego instrukcje oraz operatory.
Maciej Kurantowicz, WAGO.PL
Zobacz także:
Kurs programowania w języku ST, cz. 5
Kurs programowania w języku ST, cz. 4
Kurs programowania w języku ST, cz. 3
Kurs programowania w języku ST, cz. 1