Professional Documents
Culture Documents
B&R
Automation Basic
Opis jzyka
Document version: 1.0 PL
Perfection in Automation
Spis treci:
1. Wstp ...........................................................................................................3
1.1. Typy, operatory i wyraenia ....................................................................................... 3
1.1.1. ZMIENNE, NAZWY........................................................................................................................... 4
1.1.2. PROSTE TYPY DANYCH................................................................................................................. 5
1.2. Stae......................................................................................................................... 10
1.3. Deklaracje ................................................................................................................ 10
1.4. Operatory arytmetyczne........................................................................................... 10
1.5. Operatory warunkowe .............................................................................................. 11
1.6. Operatory binarne i logiczne .................................................................................... 11
1.7. Sowa kluczowe B&R Automation Basic .................................................................. 13
1.8. Konwersje typw ...................................................................................................... 17
1.8.1. KONWERSJA NIEJAWNA.............................................................................................................. 17
1.8.2. KONWERSJA JAWNA.................................................................................................................... 19
Perfection in Automation
1. Wstp
Aby pomc Ci przyswoi jzyk B&R Automation Basic (AB), poniej przedstawiony jest jego opis i
charakterystyka.
W systemie pomocy B&R Automation Studio zamieszczony jest peen opis jzyka wraz z wieloma
przykadami, ktrych przepisanie i sprawdzenie moe uatwi zrozumienie zagadnienia.
W opisie tym pomito rwnie opis interfejsu uytkownika B&R Automation Studio. Temat ten
opisany jest w oddzielnym dokumencie oraz w systemie pomocy.
Zmienne i nazwy
Proste typy danych
Stae
Deklaracje
Operatory arytmetyczne
Operatory warunkowe
Operatory binarne i logiczne
Sowa kluczowe AB
Konwersje typw
Nadrzdno i kolejno wykonywania
Perfection in Automation
Pozostae znaki nazwy mog by literami, cyframi, podkrelnikiem lub znakiem dolara;
pozostaych znakw nie mona uywa.
W nazwie ma znaczenie wielko liter; przykadowo zmienna switch nie jest tym samym co
zmienna SWITCH.
Zmienna nie moe nazywa si tak samo jak sowo kluczowe jzyka B&RAutomation Basic,
np. if, else, loop.
Kierujc si powyszymi zasadami, takie zmienne jak: lamp_1, F_int$ s prawidowe natomiast
stop!, 33_light s nieprawidowe (stop! zawiera niedozwolony znak (!), a 33_light zaczyna si od
cyfry).
Niezalenie od powyszych zasad, jest jeszcze kilka zalece jakimi naley si kierowa przy
nazywaniu zmiennych:
Nazwa, jak si nadaje powinna by krtkim opisem tego, czego zmienna dotyczy.
Przykadowo nazwa zmiennej s nic nam nie mwi, nazwa switch jest ju lepsza, jednake
optymaln i najbardziej domyln nazw jest light_switch.
Przy dugich nazwach naley uywa podkrelnikw i wielkich liter w celu rozdzielania
sw. Nazwa TopLevelSwitch lub top_level_switch jest lepsza ni toplevelswitch.
Jeeli nazwa nie opisuje zmiennej w sposb wystarczajcy naley zastosowa komentarz.
Perfection in Automation
Perfection in Automation
Perfection in Automation
Binarny odpowiednik liczby 200 i 56 jest identyczny i wynosi (%11001000) ale sposb w jaki jest
wywietlany zaley od typu danej. Gdy liczba jest przypisana do zmiennej, kompilator nie sprawdza
czy zmienna jest w stanie przechowa t warto czy nie.
Musisz sprawdzi sam i upewni si, e adne nieoczekiwane przepenienia nie bd miay
miejsca.
Przepenienia mog wystpi take przy innych typach danych majcych tak sam liczb bitw, np.
INT/UINT lub DINT/UDINT.
Perfection in Automation
Zmienna typu rzeczywistego ma zakres 3.4E+38. Jeli warto ta zostanie przekroczona ustawi si
bit powizany ze zmienn pokazujcy w statusie +INF. Najmniejsza dodatnia liczba rzeczywista to
+1.18E-38 natomiast najwiksza ujemna to -1.18E-38. Liczby z przedziau pomidzy nimi wynosz
zero.
Perfection in Automation
Perfection in Automation
licznik = licznik + 1
Nastpnym krokiem programu bdzie przyjcie przez zmienn licznik wartoci -128 poniewa
zosta przekroczony grny zakres zmiennej typu SINT i nastpio przepenienie. Jeli w
programie dziej si dziwne rzeczy, jedn z przyczyn moe by wanie przekroczenie zakresu.
1.2. Stae
Staa jest liczb, ktra nie zmienia swojej wartoci. Stae wystpuj w systemie i w bibliotekach,
mog by take definiowane przez uytkownika.
1.3. Deklaracje
Zmienna zadeklarowana jest nastpujco:
nazwa_zmiennej : NAZWA_TYPU
Linia powyej nie jest lini programu! Jest to tylko informacja, e zmienna jest w jaki sposb
zadeklarowana.
przypisanie/rwno,
dodawanie,
mnoenie,
dzielenie
mod
reszta z dzielenia
Przykad:
x=3
y=5
10
Perfection in Automation
a = 10
b=5
wynik = x*y + a/b
Najpierw wykonywane jest mnoenie, potem dzielenie (patrz Kolejno wykonywania dziaa).
Nastpnie powstae dwa skadniki s dodawane i w rezultacie otrzymujemy liczb 17. Dla
pewnoci mona uy nawiasw, aby w sposb jasny widzie kolejno wykonywania dziaa.
<>
<
>
>=
<=
Przykad:
Sprawdzanie czy zmienna jest mniejsza od 10:
or
xor
11
Perfection in Automation
Kada zmienna jest traktowana bitowo dziaania na zmiennych odbywaj si jako dziaania na
poszczeglnych bitach tych zmiennych zgodnie z tablic prawdy przedstawion poniej.
Operator not nie jest zamieszczony w tabeli gdy ma tylko jedn warto wejciow. Zmienia
zmienn na przeciwn lub odwraca wszystkie jej bity na przeciwne. Przykadowo: jeli dana typu
BOOL = 1 to not dana = 0 (bit zosta odwrcony na przeciwny). Jeli dana typu USINT = 240
(%11110000) to not dana = 15 (%00001111) (wszystkie bity zostay odwrcone na przeciwne).
Wszystkie operatory maj tak sam kolejno wykonywania dziaa wic s wykonywane od
lewej do prawej strony.
Zastosowanie logiczne:
Operatory or, and lub xor mona wykorzystywa w sprawdzaniu warunkw logicznych.
Rezultatem takiego dziaania jest TRUE lub FALSE. Najlepiej obrazuje t sytuacj przykad:
if (poziom >= max) or (emergencyStop = 1) then
pompa = 0
endif
Pompa zostanie wyczona (pompa = 0) jeli zostanie przekroczony poziom maksymalny
(poziom >= max) albo wczony zostanie wycznik awaryjny (emergencyStop = 1)
Oglnie rzecz ujmujc moemy zapisa tabel prawdy nastpujco:
12
Perfection in Automation
gdzie Left oznacza wyraenie po lewej stronie operatora a Right wyraenie po prawej stronie.
Zarwno Left jak i Right musz by w nawiasach: (Left) operator (Right).
action
BIT
BIT_CLR
A=BIT_CLR(IN, POS)
A przyjmuje warto IN z wyzerowanym bitem na pozycji POS. Operator IN
pozostaje niezmieniony
BIT_SET
A=BIT_SET(IN, POS)
A przyjmuje warto IN z ustawionym bitem na pozycji POS. Operator IN
pozostaje niezmieniony
BIT_TST
A=BIT_TST(IN, POS)
A przyjmuje warto bitu z pozycji POS sowa IN
case
do
downto
EDGE
13
Perfection in Automation
EDGENEG
EDGEPOS
else
patrz wyraenie if
elseaction
endaction
endcase
endif
patrz wyraenie if
endloop
endselect
exitif
FLOAT
FBK
goto
if
patrz wyraenie if
INC
inkrementacja
INT16
INT32
INT8
LONG
loop
next
of
select
14
Perfection in Automation
state
then
patrz wyraenie if
to
when
ABS
ACOS
adr
AND
logiczne AND
ASIN
ASR
ATAN
COS
EXP
EXPT
LIMIT
LN
LOG
LSL
patrz SHL
LSR
patrz SHR
MAX
15
Perfection in Automation
MIN
MUX
OR
logiczne OR
ROL
A=ROL(IN, N)
przesuwanie piercieniowe w lewo wartoci IN o N pozycji
ROR
A=ROR(IN, N)
przesuwanie piercieniowe w prawo wartoci IN o N pozycji
SEL
SHL
SHR
SIN
sizeof
SORT
TAN
TRUNC
XOR
logiczne EXOR
16
Perfection in Automation
Przykad:
byte_pv: USINT, word_pv: UINT, end: UDINT
end = byte_pv + word_pv
Konwersja niejawna
Konwersja jawna
17
Perfection in Automation
Przykad 1:
dzielna: SINT, dzielnik: SINT, iloraz: REAL
dzielna = 3
dzielnik = 4
iloraz = dzielna / dzielnik
Wynik (iloraz) rwna si 0. Dlaczego?
Wykonane zostao dzielenie typw cakowitych (zarwno dzielna, jak i dzielnik s liczbami typu
SINT), w zwizku z tym wynikiem dzielenia jest te liczba cakowita, w tym przypadku rwna 0.
Wynik jest konwertowany do typu rzeczywistego (do uamka). Dlatego liczba 0 przedstawiana
jest jako 0.0.
Przykad 2:
dzielna: SINT, dzielnik: REAL, iloraz: REAL
dzielna = 3
dzielnik = 4
iloraz = dzielna / dzielnik
Wynik (iloraz) rwna si 0.75. Dlaczego?
Dzielna jest konwertowana w gr do liczby rzeczywistej (3.0).
Teraz dzielna i dzielnik s liczbami rzeczywistymi, wic wynik te jest wartoci typu
rzeczywistego (0.75).
Wynik jest przypisywany do te do zmiennej typu rzeczywistego (do uamka). Nie wykonywana
jest adna konwersja.
18
Perfection in Automation
Przykad 3:
dzielna: SINT, dzielnik: SINT, iloraz: REAL
dzielna = 3
dzielnik = 4
iloraz = float(dzielna) / dzielnik
Wynik (iloraz) rwna si 0.75. Dlaczego?
1. Dzielna zostaa skonwertowana w gr w sposb jawny (przez programist) do wartoci
rzeczywistej.
2. Dzielnik zosta skonwertowany w gr w sposb niejawny do wartoci rzeczywistej.
3. Wykonane zostao dzielenie wartoci rzeczywistych. Wynikiem dzielenia jest warto
rzeczywista (0.75).
4. Wynik jest przypisywany do te do zmiennej typu rzeczywistego (do uamka). Nie
wykonywana jest adna konwersja.
19
Perfection in Automation
Konwersj typw mona dokonywa samemu. Mona robi j w d (od wartoci wikszej do
wartoci mniejszej) lub w gr (od wartoci mniejszej do wartoci wikszej). Konwersja w gr
gwarantuje zawsze prawidowe rezultaty.
Przykad:
int8_pv : type SINT. word_pv : type UINT. end : DINT (the same as before)
end = int32(int8_pv) + int32(word_pv)
Uwaga!
Pomidzy PL2000 (pierwotna wersja AB) i Automation Basic wystpuje rnica przy
konwertowaniu z wartoci wikszej do mniejszej typu BOOL. W PL2000 tylko najmodszy bit jest
sprawdzany podczas konwersji. Automation Basic sprawdza wszystkie bity danej. W poniszym
przykadzie boolvar ma warto zero w PL2000 (bit 0 nie jest ustawiony). W Automation Basic
natomiast boolvar ma warto jeden, poniewa usintvar nie jest zerem.
usintvar = 2
boolvar = BIT(usintvar)
Problemy z typami danych mog wynikn rwnie przy stosowaniu zmiennych tego samego typu.
Moe si tak zdarzy, e dodajc do siebie dwie wartoci dojdzie do przepenienia i wynik dziaania
bdzie niepoprawny.
Przykad:
Temperatura w duym pomieszczeniu mierzona jest w trzech rnych miejscach. Naley wyliczy
redni temperatur w pomieszczeniu. Pomiary trzech temperatur przechowywane s w zmiennych o
nazwach: temp_1, temp_2, temp_3 a wynik w zmiennej av_temp. Wszystkie zmienne s typu INT.
Podstawowa formua wykonania dziaania obliczajcego redni temperatura wyglda nastpujco:
av_temp = 1/(liczba pomiarw) * Suma(temperatury)
Jest kilka metod zapisania powyszej formuy w Automation Basicu.
Wersja 1
20
Perfection in Automation
W tej wersji wynik zawsze bdzie zerem gdy 1/3 jest dzieleniem cakowitym i zawsze da warto
zero.
Wersja 2
av_temp = temp_1/3 + temp_2/3 + temp_3/3
Ta wersja jest optymalna: najpierw dodane s cakowite wartoci temperatur a dopiero potem
podzielone s przez 3.
21
Perfection in Automation
22
Perfection in Automation
Bloki wyrae to wyraenia lub instrukcje zajmujce kilka linii. Zawsze zaczynaj si i kocz
sowem kluczowym.
Przykad:
if (x1 < 3) then
y2 = y2 + 1
23
Perfection in Automation
endif
2.2. Wyraenie if
Suy ono do wyraania decyzji. Moe wystpowa w trzech odmianach: if, if-else oraz else if.
if
else
else if
2.2.1. if
if warunek then
wyraenie
endif
Podstawow zasad jest, e jeli warunek jest prawdziwy to wykonywane jest wyraenie (lub
kilka wyrae), jeli natomiast warunek nie jest prawdziwy wykonywane jest wyraenie
(wyraenia) nastpujce po endif. Warunek moe by prosty lub zoony z kilku operatorw, np.
z and czy or. Graf dla wyraenia if pokazany jest poniej:
24
Perfection in Automation
25
Perfection in Automation
2.2.2. else
Wyraenie to stosuje si razem z wyraeniem if. Skadnia wyglda nastpujco:
if (warunek) then
wyraenie A (lub kilka wyrae A)
else
wyraenie B (lub kilka wyrae B)
endif
Jeli warunek jest speniony wyraenie A (wyraenia A) jest wykonywane, jeli warunek nie jest
speniony wyraenie B (wyraenia B) jest wykonywane.
Else musi wystpowa w linii jako jedyne sowo.
Graf dla wyraenia if-else pokazany jest poniej:
26
Perfection in Automation
endif
2.2.2.1. Zagniedanie
Jeeli istnieje potrzeba zastosowania kilku warunkw istnieje moliwo zagniedenia wyrae if
else. Oznacza to wstawienie wyraenia if else w inne wyraenie if else.
if (warunek A) then
wyraenie (wyraenia)A
else
if (warunek B) then
wyraenie (wyraenia) B1
else
wyraenie (wyraenia) B2
endif
endif
Najpierw sprawdzany jest warunek A. Jeli jest on speniony wykonywane s wyraenia A po czym
program przechodzi do ostatniego endif. Jeli jednak warunek nie jest speniony, program
przechodzi do drugiego wyraenia if i sprawdza jego warunek (warunek B). Jeli jest on prawdziwy
wykonuj si wyraenia B1 po czym program przechodzi do nastpnej instrukcji za drugim endif.
Jeli natomiast nie jest prawdziwy wykonaj si wyraenia B2, po czym program przejdzie do
nastpnej instrukcji za drugim endif.
Graf dla zagniedonego wyraenia if else wyglda nastpujco:
27
Perfection in Automation
Zagniedanie jest bardzo przydatne, jeli chcemy sprawdza warunki zalene od innych warunkw.
Trzeba by jednak ostronym i zawsze pamita, e kademu if musi odpowiada endif. Zagnieda
mona dowolnie gboko jednak po kilku zagniedeniach program staje si nieczytelny a po
kilkudziesiciu kompilator moe nie by w stanie przekompilowa listingu ze wzgldu na
ograniczon pami.
Zbyt gbokie zagniedanie jest zym stylem programowania i powinno si w inny sposb
rozwizywa zadania gdzie wystpuj warunki uzalenione od innych warunkw.
Aby poprawi czytelno listingu programu naley uywa wci (tabulatorw) tak jak w
przykadach powyej.
Przykad:
Do poprzedniego przykadu dodalimy teraz alarm niskiej temperatury. Jeli temperatura spadnie
poniej minimalnego poziomu uaktywni si alarm niskiej temperatury, jeli natomiast podniesie si
ponad poziom maksymalny, uaktywni si alarm wysokiej temperatury.
28
Perfection in Automation
2.2.3. else if
To wyraenie jest specjaln wersj wyraenia if. Pozwala na wiele warunkw bez koniecznoci
cigego uywania w nowej linii sowa endif co korzystnie wpywa na przejrzysto kodu programu.
Konstrukcja wyglda podobnie do zagniedonego if - else jednak znaczenie jej jest nieco inne.
if (warunek A) then
wyraenie (wyraenia) A
else if (warunek B) then
wyraenie (wyraenia) B
else if (warunek C) then
wyraenie (wyraenia) C
else
wyraenie (wyraenia) D
endif
29
Perfection in Automation
Jak tylko speniony zostanie jeden z warunkw wykonywane jest odpowiadajce mu wyraenie po
czym program przechodzi za lini endif. W innym przypadku wykonane zostanie wyraenie D po
czym program przejdzie za lini endif.
Uwagi dotyczce if else:
wystpuje tylko jedno endif; else if nie pocztkuje nowego wyraenia if (jest kontynuacj
pierwszego if) i nie potrzebuje zamknicia endif
30
Perfection in Automation
high = 3
; program cykliczny
if curr_temp < (set_temp*5/10) then
heat = high
else if curr_temp < (set_temp*8/10) then
heat = medium
else if curr_temp < set_temp then
heat = low
else
heat = off
endif
Uywajc zagniedonej struktury if else naleaoby napisa (cz inicjalizacyjna bez zmian):
if curr_temp < (set_temp*5/10) then
heat = high
else
if curr_temp < (set_temp*8/10) then
heat = medium
else
if curr_temp < set_temp then
heat = low
else
heat = off
endif
endif
endif
Dwie powysze wersje programu dziaaj tak samo jednake wersja zagniedona jest mniej
czytelna. Naley mie na uwadze fakt, e kto inny czytajcy listing programu (albo nawet Ty sam
po jakim czasie) moe mie trudnoci z rozszyfrowaniem zagniedonego kodu. Czasem warto
zastanowi si nad zmian zapisu programu z bardzo zagniedonego na rzecz prociej
wygldajcych wyrae. Jednym z nich moe by case opisane poniej.
31
Perfection in Automation
32
Perfection in Automation
Tylko jedna akcja w trakcie dziaania wyraenia case moe by wykonana. Jeli expression nie
mieci si w przedziaach n0n1, n2n3 ani nie jest rwne staej constant to zostan wykonane
wyraenia D.
Przykad:
Napiszmy program, ktry zacza rne moce grzania w zalenoci od temperatury podgrzewanego
pynu i ustawienia zadanej temperatury. Bdziemy dokonywali jednego z poniszych wyborw:
jeli bieca temperatura jest z przedziau (0 49%) wartoci zadanej to
wcz grzanie na poziom high
jeli bieca temperatura jest z przedziau (50 79%) wartoci zadanej to
wcz grzanie na poziom medium
jeli bieca temperatura jest z przedziau (80 99%) wartoci zadanej to
wcz grzanie na poziom low
w innym przypadku
wycz grzanie
zakocz
33
Perfection in Automation
heat = low
endaction
elseaction:
heat = off
endaction
endcase
Wartoci action mog by tylko staymi, nie mog by zmiennymi. To, do ktrego zakresu nale
sprawdzane jest tylko jeden raz przy wejciu do wyraenia case.
Wyraenie case jest najlepszym wyjciem, gdy mamy do czynienia z wieloma wyborami. Zapis jest
bardzo przejrzysty i uatwia programicie szybkie zorientowanie si, co i gdzie w danej chwili dzieje
si w programie.
2.3. Ptle
Ptla jest czci programu, ktrej wykonywanie jest powtarzane. O tym, ile razy ma by
powtrzone decyduje licznik ptli lub warunek wyjcia z ptli.
loop todo
loopdowntodo
Warunkowe wyjcie z ptli
2.3.1. loop to do
Podstawowa struktura ptli wyglda nastpujco:
loop PV = liczba to licznik do
wyraenie (wyraenia)
endloop
34
Perfection in Automation
Przykad:
Otrzymujemy pakiety danych, ktre skadaj si z 10 liczb typu INT i sumy kontrolnej. Naley
oblicza sum kontroln dla kadego pakietu (nazwan check_new) i jeli nie zgadza si ona z t do
nas przesan (check_old) naley zasygnalizowa bd. Sum kontroln liczy si przez zwyke
dodanie wszystkich dziesiciu wartoci do siebie (moe wystpi przepenienie, ale to nie jest w tym
przykadzie wane). Schemat programu wyglda nastpujco:
wylicz check_new
if check_new rni si od check_old then
sygnalizuj bd
endif
Wersja 1:
35
Perfection in Automation
Jest ona poprawna jednake mao czytelna. Gdybymy mieli np. 500 danych to dodawanie ich w taki
sposb byoby w ogle nieczytelne.
Wersja 2:
check_new = 0
loop index = 0 to 9 do
check_new = check_new + data[index]
endloop
if check_new <> check_old then
error = 1
endif
Ta wersja jest duo lepsza od poprzedniej. Gdybymy chcieli zmieni np. liczb skadnikw sumy
wystarczy zmieni jeden indeks w programie.
36
Perfection in Automation
Ta ptla powtarzana jest tak dugo a nie zostanie speniony warunek wyjcia.
Uywanie jej niesie z sob to ryzyko, e jeli warunek wyjcia nigdy nie zostanie speniony,
ptla bdzie wykonywaa si nieskoczenie i program nigdy z niej nie wyjdzie.
Poniszy przykad powinien wyjani rnice midzy ptlami z warunkowym wyjciem a wyjciem
zalenym od licznika.
Prowadzimy kontrol jakoci. Wszystkie sprawdzane artykuy s waone a ich wagi zapisywane.
Nastpnie lista wag jest sortowana od najwikszej do najmniejszej. Pewna waga artykuu jest
minimaln akceptowaln w procesie kontroli jakoci. Zadaniem do zrealizowanie jest procentowe
obliczenie ile produktw zostao zaakceptowanych.
Zapiszmy ten problem w sposb strukturalny:
start od pocztku posortowanej listy
start ptli
sprawd wag artykuu, jeli za maa to wyjd z ptli
sprawd, czy wykorzystano wszystkie artykuy, jeli tak to wyjd z
ptli
inkrementuj liczb dobrych artykuw
koniec petli
37
Perfection in Automation
Aby powysz struktur zapisa w jzyku BR Automation Basic naley wprowadzi kilka
zmiennych. Liczba wszystkich artykuw w poddanych kontroli to total, lista wag produktw
przechowywana jest w tablicy nazwanej weights. Minimalna akceptowalna waga to min_weight.
total : USINT, count : USINT, min_weight : USINT, weights[100] : USINT,
quality : UINT
total = 99
count = 0
loop
exitif (weights[count] < min_weight)
exitif (count >= total)
count = count + 1
endloop
quality = UINT(count) * 100 / total
Wyjcie warunkowe zamiast wyjcia zalenego od licznika ptli uywamy wtedy, gdy nie jest nam
znana dokadnie liczba, przy ktrej program ma opuci ptl.
38
Perfection in Automation
wyraenie (wyraenia)2B
next stan3
state stan3
wyraenie (wyraenia)13
when warunek3
next stan1
endselect
Tylko jeden stan (state) jest wykonywany podczas dziaania konstrukcji select. Przechodzenie
midzy stanami moliwe jest, gdy speniony jest warunek przejcia aktualnie wykonywanego stanu.
W przykadzie powyej najpierw wykonywany bdzie stan1, czyli wyraenia 1A. Zmiana stanu na
stan2 nastpi, gdy warunek1 zostanie speniony zaczn wtedy by wykonywane wyraenia 2A.
Gdy teraz speniony zostanie warunek2, wykonaj si wyraenia 2B, po czym program przejdzie do
stanu3.
Najlepiej wytumaczy dziaanie konstrukcji select na przykadzie.
Zbudujmy prosty kawomat, ktry moe sprzedawa dla uatwienia tylko czarn lub bia kaw.
Kawa kosztuje 25 centw, maszyna przyjmuje tylko sumy bdce kombinacj monet picio- i
dziesicio- centowych a take wydaje reszt (jeli przyjta suma jest wiksza ni 25 centw).
Najpierw musimy zastanowi si, jakie stany maszyny bd nam potrzebne. Na pewno konieczne
bdzie uycie stanw zwizanych z przepywem pienidzy, czyli 0, 5, 10, 15, 20 i 25 centw.
Zainicjalizowanie dziaania kawomatu odbywa si przez wrzucenie do niego monet lub wcinicie
przycisku wyboru kawy. Diagram jego pracy wyglda nastpujco:
39
Perfection in Automation
6 powyszych stanw maszyny okrela cakowit sum wrzuconych do niej monet, przykadowo
T_20 oznacza 20 centw. Przerywane linie oznaczaj wrzucone monety, szare linie to wcinicie
przycisku a czarne strzaki mwi o tym, co maszyna w danej chwili robi (wydaje kaw, wydaje
reszt pienidzy). Maszyna zaczyna i koczy prac w stanie T_0. Pseudokod jej dziaania podany
jest poniej:
state T_0:
when a 5c coin inserted,
change to T_5
when a 10c coin inserted,
change to T_10
state T_5:
when a 5c coin inserted,
change to T_10
when a 10c coin inserted,
change to T_15
state T_10:
when a 5c coin inserted,
change to T_15
when a 10c coin inserted,
change to T_20
40
Perfection in Automation
state T_15:
when a 5c coin inserted,
change to T_20
when a 10c coin inserted,
change to T_25
state T_20:
when a 5c coin inserted,
change to T_25
when a 10c coin inserted,
give back 5c and
change to T_25
state T_25:
when a 5c coin inserted,
give back 5c
when a 10c coin inserted,
give back 10c
when the black key is pressed,
dispense black coffee and
change to T_0
when the white key is pressed,
dispense milk and coffee, and
change to T_0
Teraz przetumaczmy powyszy pseudokod na jzyk BR Automation Basic. Musimy napisa select i
endselect oraz stworzy sensownie nazwane zmienne, aby w sposb jasny i zrozumiay mwiy nam
czego dotycz. Wszystkie zmienne mog by typu BOOL, poniewa reprezentuj tylko informacj
TRUE/FALSE (np.: wcinity przycisk tak lub nie, suma pienidzy w kawomacie rwna 25
centw tak lub nie). Program wyglda nastpujco:
select
state T_0
when coin_5 = 1
next T_5
when coin_10 = 1
next T_10
state T_5
when coin_5 = 1
next T_10
41
Perfection in Automation
when coin_10 = 1
next T_15
state T_10
when coin_5 = 1
next T_15
when coin_10 = 1
next T_20
state T_15
when coin_5 = 1
next T_20
when coin_10 = 1
next T_25
state T_20
when coin_5 = 1
next T_25
when coin_10 = 1
return_5 = 1
next T_25
state T_25
if coin_5 = 1 then
return_5 = 1
else if coin_10 = 1 then
return_10 = 1
endif
when black_key = 1
coffee = 1
next T_0
when white_key = 1
milk = 1
coffee = 1
next T_0
endselect
42
Perfection in Automation
state stan1
wyraenia 1A
when warunek1
next stan2
wyraenia 1B
state stan2
wyraenia 2A
when warunek2
wyraenia 2B
next stan3
state stan3
wyraenia 3
when warunek3
next stan1
endselect
43
Perfection in Automation
Przykadem zastosowania goto jest wyjcie z mocno zagniedonej struktury w momencie np.
wystpienia jakiego bdu.
Przykad:
loop ... to ... do
loop ... to ... do
if ... then
loop
if (problem) then
goto recover
endif
endloop
endif
endloop
endloop
...
...
...
recover:
rozwi problem
tablice
acuchy znakw
struktury
adresy
wskaniki
44
Perfection in Automation
3.1. Tablice
Zwyk zmienn mona traktowa jak pojedyncze pudeko do przechowywania danej. Jeli mamy
kilka zmiennych mamy take kilka pudeek. Aby mie dostp do nich wszystkich, musimy mie
dostp do wszystkich pudeek osobno. W tablicy natomiast wszystkie zmienne s ze sob
powizane. Oznacza to, e mona odnosi si do nich za pomoc jednej nazwy, co jest podstawow
zalet uywania tablic.
Jeli chcemy dziaa na pewnej liczbie zmiennych tego samego typu, np. zapisywa je, odczytywa
czy przechowywa, naley si mocno zastanowi nad uyciem wanie tablicy. Moe to uproci
program i sprawi, e bdzie on bardziej przejrzysty.
Aby uy zmiennej tablicowej, trzeba poda nie tylko jej nazw, ale take jej indeks wskazujcy, do
ktrego elementu chcemy si odwoa. W pamici tablica wyglda nastpujco:
Jak wida struktura tablicy jest do prosta. Aby dosta si do jej poszczeglnych elementw naley
posuy si nawiasami kwadratowymi, np. aby trzeciemu elementowi zmiennej tablicowej o nazwie
value nada warto 70 naley napisa value[2] = 70 (value[2] a nie value[3] poniewa numeracja
zaczyna si od zera).
Zmiennych tablicowych uywa si gwnie wtedy, gdy mamy do czynienia z operacjami na seriach
danych, np. wyliczenie redniej temperatury ze stu pomiarw.
Przykad:
Mamy maszyn, ktra wydaje 8 rodzajw napoi: col, lemoniad, sok pomaraczowy, cytrynowy,
jabkowy, winiowy, bananowy i wod. Zadaniem programu jest wydanie napoju w zalenoci od
tego, ktry zosta wybrany (kwesti zapaty w tym zagadnieniu pomijamy). Z kadym napojem
powizany jest jeden przycisk, ktry ma warto, 1 gdy jest wcinity a 0 gdy nie jest. Pseudokod
programu wyglda nastpujco:
45
Perfection in Automation
sprawd przycisk
jeli przycisk wcinity to wydaj napj i wyjd
Powyszy zapis nie jest najlepszy, poniewa kada zmienna musiaa by przetestowana. Gdybymy
mieli tych zmiennych 100 czy 200 program byby bardzo dugi, przez co nieczytelny. Moemy
jednak zapsia tak jak poniej, uywajc ptli:
drinks[8] : BOOL, index : USINT
loop index= 0 to 7 do
if drinks[index] = 1 then
dispense(index+1)
endif
exitif drinks[index] = 1
endloop
46
Perfection in Automation
3.3. Struktury
Struktura jest zbiorem zmiennych, nawet rnych typw, zebranych razem. Uycie struktur lepiej
organizuje zmienne. Zestawienie zmiennych w logiczne zbiory daje lepsz przejrzysto ni serie
nieuporzdkowanych danych. Struktury s czsto stosowane w jzykach wysokiego poziomu.
Struktury w B&R Automation Basic s podobne do struktur uywanych w jzyku C albo rekordw
w Pascalu.
Przykadem wykorzystania struktur w przemysowej aplikacji pozycjonowania moe by punkt,
ktrego okrelaj wsprzdne x, y, z albo wszystkie informacje zwizane z warunkami
przechowywania pynu w kontenerze: wysoko, szeroko, objto, maks. cinienie, poziom
cieczy, typ cieczy, data napenienia itd. Moliwoci wykorzystania struktur s nieskoczone.
Uporzdkowa mona tak wszystkie grupy albo zestawy zmiennych, ktre nale do jednego zbioru.
47
Perfection in Automation
Oczywicie elementy struktur mog by rnych typw w rnej kolejnoci. Elementami struktur
mog by zmienne prostych typw, tablice, acuchy znakw oraz inne struktury.
Struktura jest typem danych i ma swoj nazw (jak BOOL, INT itd.).
Definicja typu strukturalnego Struct_name:
Struct_name {element1: TYP, element2: TYP..}
Nazwa zmiennej typu strukturalnego Struct_name:
var_name: Struct_name
Deklaracja zmiennej
Przykad:
Chcemy przechowywa trjwymiarow wsprzdn punktu. Wykorzystujc proste typy danych
potrzebujemy trzech zmiennych:
punkt_x: REAL, punkt_y: REAL, punkt_z: REAL.
Przykad:
Mamy prosty system pozycjonowania z 5 punktami docelowymi. Maszyna musi przej przez
wszystkie 5 punktw w odpowiedniej kolejnoci. Znana jest prdko maszyny (w jedn./s) i punkty
docelowe. Naley obliczy cakowit przebyt drog maszyny (w jedn.) i czas potrzebny na
48
Perfection in Automation
dyst = ( x2 x1 ) 2 + ( y 2 y1 ) 2
SQRT(a) jest funkcj obliczajc pierwiastek - ( a ). Do obliczania potg liczb suy funkcja
EXPT(a,b) - ( a b ).
Przy zaoeniu, e mamy dan prdko i punkty docelowe nasz pseudokod wygldaby nastpujco:
ustaw dystans = 0
dla kadej pary punktw
oblicz dystans midzy nimi
dodaj do cakowitej drogi
oblicz czas jako zadany dystans/prdko
Majc algorytm mona przystpi do definicji struktur, deklaracji zmiennych i pisania kodu
programu. Napiszemy dwie wersje programu: pierwsz prost i drug ulepszon wykorzystujc
dotychczas zdobyt wiedz.
Wersja 1:
49
Perfection in Automation
Patrzc na struktur programu, wydaje si ona do nieczytelna, nawet uywajc struktur. Byoby
znacznie lepiej gdyby nie powtarza kawakw programu kilka razy. Co, jeli mielibymy 100 albo
1000 punktw?
Stwrzmy wic tablic punktw, czyli tablic struktur. To uproci program i skrci program.
Wersja 2:
WSPOLRZ {x: REAL, y: REAL}
punkt[5]: WSPOLRZ
dyst: REAL, predkosc: REAL, czas: REAL
50
Perfection in Automation
= dyst + diff
endloop
time = dist / speed
Cho na pierwszy rzut oka program wyglda bardziej skomplikowanie, jest on znacznie ulepszony.
Naley zwrci uwag na indeksy i ich odwoanie do poszczeglnych elementw tablicy. W
przypadku wikszej iloci punktw wystarczy zwikszy rozmiar tablicy i liczb koca ptli.
Pamitaj, e 5 elementow tablic indeksuje si od 0 do 4.
Jak wida, mona stosowa same struktury, tablice struktur, struktury struktur itd. Istniej jednak
pewne ograniczenia:
Nie mona zagnieda struktur (tablic struktur, struktur struktur) gbiej ni do 5 poziomu,
Struktura nie moe mie wicej ni 32KB pamici (dodane wszystkie elementy nie
zapominajc o rwnaniu bajtw tzw. byte allignment).
3.4. Adresy
Gdy uywamy zmiennych, zazwyczaj odnosimy si do nich za pomoc ich nazw. W rzeczywistoci
zmienna musi by przechowywana gdzie w pamici, do ktrej to odwouje si CPU wanie przez
adresy. Gdy deklarujemy jak zmienn, CPU rezerwuje dla niej pewien obszar pamici. Jeli
zdefiniujemy cztery zmienne, CPU umieci je prawdopodobnie jedn obok drugiej. Nie musi tak
51
Perfection in Automation
zrobi; zrobi tak by przestrze wykorzystana zostaa jak najbardziej efektywnie. Pami jest
alokowana w jednobajtowych blokach.
Przykad:
Output : USINT, Wait_time : UINT, Elapse : UDINT, Notify[4] : USINT
Mona tutaj zaobserwowa rozmiar zmiennych w pamici. Adres kadego z blokw pokazany jest
poniej rysunku. Jeli zapytamy o adres zmiennej Wait_time to odpowiedzi bdzie $A002. Czasem
potrzeba zmiennej do przechowywania adresu. Adres zawsze przechowuje si w typie UDINT.
Stwrzmy zmienn an_address i przechowajmy w niej adres zmiennej Wait_time.
Wait_time : UINT, an_address : UDINT
an_address = adr(Wait_time)
an_address zawiera teraz warto $A002. Funkcja adr() znajduje adres zmiennej spomidzy
nawiasw. Funkcja zawsze zwraca adres pierwszego bajtu zmiennej. Jeli zapiszemy:
an_address = adr(Elapse)
an_address wyniesie $A004. Gdy mamy do czynienia z tablic i wykorzystamy funkcj adr() to
zwrci warto $A008. Mona take otrzyma adres ktrego elementu tablicy zapisujc:
an_address = adr(notify[2])
52
Perfection in Automation
Otrzymamy wtedy: $A00A. Tablice maj kilka specyficznych cech. Jej elementy s zawsze uoone
jeden pd drugim. Oznacza to, e jeli znamy rozmiar kadego elementu i adres pierwszego elementu
mona obliczy adres innych elementw. Znajdmy trzeci element tablicy notify:
an_address = adr(notify)
an_address = an_address + 2
Rezultat tego dziaania jest taki sam jak z poprzedniego przykadu. Funkcja zwracajca adresy dziaa
rwnie na strukturach.
struct{New : USINT, Effort : UINT, Work[26] : USINT, Origin : USINT}
temp_var : struct
an_address = adr(temp_var.Work[8])
an_address zawiera teraz adres smego elementu komponentu Work zmiennej temp_var.
3.5. Wskaniki
Wskanik jest odwoaniem si do zmiennej pod inna nazw. Rysunek poniej prezentuje tak
sytuacj:
Zmienna var_2 ma dynamiczny dostp do zmiennej var_1. Dynamiczny dostp oznacza, e podczas
dziaania programu var_2 jest powizana z var_1. Jakakolwiek zmiana var_1 wie si z tak sam
zmian var_2 i na odwrt, jednake po takim powizaniu korzysta si tylko ze zmiennej
dynamicznej wskazujcej na zmienn statyczn.
Jak przypisa wskanik do zmiennej?
Zmienna wskanikowa musi mie dostp do zmiennej statycznej. Zapis jest nastpujcy:
var_1 : USINT, var_2 : USINT (dynamic)
var_2 ACCESS adr(var_1)
lub podobnie:
var_1 : USINT, var_2 : USINT (dynamic), address : UDINT
53
Perfection in Automation
address = adr(var_1)
var_2 ACCESS address
Aby pokaza, jakim narzdziem s wskaniki posuymy si przykadem bez wikszego sensu, ale
trafnie demonstrujcego ten rodzaj zmiennych.
x : USINT, y : USINT, z[10] : USINT
ptr : USINT (dynamic)
x = 2 ;initial assignment
y = 6 ;initial assignment
z[0] = 8 ;initial assignment
ptr access adr(x) ;ptr points to x
y = ptr ;y = 2
ptr access adr(y) ;ptr points to y
ptr = z[0] ;y = 8
ptr access adr(z) ;ptr points to z[0]
ptr = 70 ;z[0] = 70
Wskanik moe wskazywa na rne zmienne, naley jednak pamita, e powinien by tego
samego typu co zmienna, ktr wskazuje. Do czego jeszcze moe by uyty wskanik? Zamiast
uywania tablic struktur, wskaniki mog by uyte do powizania struktur razem. Nazywa si to
zwykle dynamicznie czon list. Dynamicznie dlatego, e moe zmienia si jej rozmiar a czon
dlatego, e elementy musz by ze sob powizane. To wyjanienie stanie si zrozumiae po
przeledzeniu poniszych przykadw.
Mamy trzy zmienne, ktre s prostymi strukturami zawierajcymi liczb i wskanik do nastpnego
elementu. S one uoone w formie listy. Trzeba wyzerowa wszystkie liczby znajdujce si na
licie. Po pierwsze, naley stworzy struktury, wypeni je oraz przyporzdkowa wskaniki.
struct{nxt : UDINT, number : USINT}
var_1 : struct, var_2 : struct, var_3 : struct, current : struct
;fill in the numbers
var_1.number = 26
var_2.number = 8
var_3.number = 70
;assign the pointers
var_1.nxt = adr(var_2)
54
Perfection in Automation
var_2.nxt = adr(var_3)
var_3.nxt = 0
current access adr(var_1)
Zmienna wskazuje element na licie, ktry obecnie uywamy. Podobnie jest z indeksem tablicy. Aby
przej przez list naley uy ptli, ktra zostaa ju opisana.
loop
current.number = 0 ;clear the current
;element
exitif current.nxt = 0 ;exit if the end
;of the list
;reached
current access current.nxt ;move to the next
;element in the
;list
endloop
Prosz zauway, e skadnik nxt tej struktury jest adresem kolejnego elementu na licie, w zwizku
z tym nie trzeba znowu uywa funkcji adr(). Spjrzmy na kad iteracj ptli, aby dokadnie
dowiedzie si, w ktre miejsca wskazuj wskaniki i co si dzieje w danym momencie.
Koniec pierwszej iteracji ptli
55
Perfection in Automation
Biecy wskanik zmieni warto, ktr uy aby wskaza 0. Nastpnie przesun si, aby wskaza
to, co poprzedni element (var_1) wskazywa (var_2).
Koniec powtrzenia drugiej ptli
Jest to koniec ptli, poniewa zosta napotkany warunek wyjcia (nxtcomponent = 0). Zwrmy
uwag na to jak wskaniki poday za naszym biecym wskanikiem, aby porusza si wzdu
listy. Jest kilka dodatkowych, specjalnych wskanikw dla listy. S one po to, aby utrzyma ciek
pocztku listy a moe te i koca listy. Listy posiadaj wskaniki biegnce w obydwu kierunkach,
dlatego te mona porusza si wzdu listy do przodu i do tyu.
Dlaczego wic nie uy tablicy?
Jedn z wielu korzyci uywania wskanikw jest to, e wszystkie informacje pozostaj dokadnie w
tym samym miejscu. Lista moe by przestawiona, ale zmienione zostan tylko wskaniki. Jeeli
uywamy tablicy, kiedy dwa elementy s zamienione, to kady skadnik struktury musi by
skopiowany do nowego miejsca. Jeeli natomiast uywamy listy wskanikowej, to zostawiamy
wszystkie informacje tam gdzie s i przestawiamy tylko wskaniki. Tak samo postpujemy przy
wprowadzaniu elementw do listy. W przypadku tablicy wszystkie elementy po wprowadzeniu
56
Perfection in Automation
musz by przesunite, wzdu, ale zamiast tego kiedy uywamy wskaniki, tylko wskaniki musz
by przestawione. Mona to wyranie zaobserwowa na diagramie.
Czasami nie wiadomo ile elementw potrzeba uy w tablicy. Co powinno si wtedy zrobi?
Utworzy tablic tak du jak to moliwe i zmarnowa duo pamici? Utworzy j tak du jak
potrzeba i mie nadziej, e ona tego nie przekroczy? Kiedy uywamy struktur dynamicznych
danych, dodatkowe elementy mog by dodawane podczas uywania, kiedy jest to potrzebne.
Jak dua jest moja zmienna?
Wystpuje jeszcze jedna funkcja, ktr przypisuje si adresom i wskanikom. Podczas uywania
wskanikw nie zawsze wiadomo jak dua jest rzecz, z ktr mamy do czynienia.
Istnieje funkcja, ktra j obliczy. Uywa si jej w podobny sposb do funkcji adr(), czyli tak:
var_size : UINT, var : ANYTHING
var_size = sizeof(var)
Zmienna var_size zawiera liczb bajtw var zajmowan w pamici. Jeli var jest szecioelementow
tablic USINT to var_size te bdzie wynosi 6. Cakiem przydatne jest posiadanie tabeli z liczb
bajtw dla kadego typu danych.
57
Perfection in Automation
Tablice
Teraz powinnimy zna wielko tablicy w bajtach. Trzeba by ostronym, jeeli zmienna jest typu
BOOL, poniewa w tym przypadku sizeof zwrci liczb bitw.
Struktury
Zwrmy uwag na trzeci kolumn w tablicy. Sizeof zawsze zwraca parzyst liczb dla wielkoci
struktury. Dzieje si tak, poniewa kada struktura i wszystkie elementy struktury musz
rozpoczyna si od parzystego adresu. Take, jeli w strukturze element powinien jednak zaczyna
si od nieparzystego adresu, bajt jest pozostawiony wolny a skadnik rozpoczyna si od nastpnego
parzystego adresu. Przykad powinien to wszystko rozjani:
Mamy prost struktur z dwoma skadnikami
struct{item_1 : USINT, item_2 : UDINT}
Jaki powinien by rezultat? Patrzc na dugo w powyszej tabeli (kolumna 2), typ USINT ma
dugo 1 a UDINT 4, dlatego te wydaje si, e result powinna wynosi 5. Jednak nie! Wynosi on
6 (uyj kolumny 3 powyszej tabeli). Struktura zawsze zaczyna si od parzystego adresu w pamici.
58
Perfection in Automation
Oznacza to, e po przydzieleniu bajtu kolejny adres jest nieparzysty. UDINT musi by ustawiony
zaczynajc od parzystego bajtu, wic pusty bajt jest pozostawiony pomidzy.
Jeeli struktura jest zdeklarowana w odwrotny sposb, czyli tak:
struct{item_2 : UDINT, item_1 : USINT}
funkcja sizeof nadal bdzie zwracaa 6. Pusty bajt jest nadal przyczany do koca struktury. Jak
formowana jest struktura, przedstawiona jest poniej.
59
Perfection in Automation
4.1. Funkcje
Funkcje s przydatnym narzdziem do pisania programw. Funkcja jest czci kodu, ktry zosta
ju napisany i ktry ma odpowiednie zadanie, np. obliczanie nachylenia kta, umieszczanie tekstu na
wywietlaczu. Funkcja moe przypomina czarn skrzynk. Skrzynka ta ma swoj nazw, ktra
mwi, co ta funkcja robi. Nie trzeba wiedzie co jest w jej rodku, tylko wiedzie jakie s jej wejcia
a jakie wyjcia.
Perfection in Automation
importowane przed uyciem przykadw w tym rozdziale. Prosz odnie si do rozdziau Library
Menager B&R Automation Software Help.
Jak uywamy funkcji?
To jest funkcja do DISplay (wywietlenia) ChaRacter (znaku) na ekranie B&R 2010 CPU. Funkcja
jest zdefiniowana:
DIS_chr(line, column, char)
Pierwszy parametr line (linia) mwi funkcji, w ktrej linii (0 lub 1) ma by wywietlony znak. Drugi
parametr column (kolumna) mwi funkcji, w ktrej kolumnie ma wywietli znak. Ostatni, trzeci
parametr char jest znakiem, ktry ma by wywietlony zgodnie z lini i kolumn. Zamiast uywa
staych, parametry mog by ustalone zmiennymi.
Jeeli zostanie uyty nieodpowiedni typ zmiennej dla parametru funkcji, to kompilator poinformuje,
e zosta uyty zy typ lub wystpuje za liczba parametrw.
Nazwy funkcji mog by dusze ni 8 znakw, ale tylko pierwszych 8 jest istotnych. Lepiej jest
wpisa ca nazw, poniewa bdzie to bardziej zrozumiae dla nas, jednak nie ma to adnego
znaczenia dla komputera.
Teraz, kiedy znamy ju podstawy funkcji, sprbujmy na kilku przykadach jak wygldaj one w
rzeczywistoci:
Przykad:
Wywietl klasyczny Hello, World!! na wywietlaczu. W tym przykadzie nie s wymagane adne
zmienne i uywamy tutaj nowej funkcji. Pseudokod wyglda nastpujco:
Wywietl Hello w pierwszej linii
Wywietl World w drugiej linii
61
Perfection in Automation
DIS_str(1,0,"World !!")
62
Perfection in Automation
endif
Przykad:
Masz aplikacj, dla ktrej trzeba znale stopie nachylanie kta dla oblicze matematycznych. W
bibliotekach mona znale funkcj COS okrelon w ten sposb:
result = COS(angle)
gdzie wynik i kt nachylenia s typu REAL. Jeeli uyjesz funkcji tak jak tutaj, nic si nie stanie.
COS(my_angle)
Wynik funkcji jest obliczony i nie jest do niczego przypisany. Najprostszym sposobem na to, aby
uy funkcji prawidowo jest przydzielenie wyniku do zmiennej:
my_result = COS(my_angle)
63
Perfection in Automation
Wystpuj lepsze i bardziej wydajne sposoby uywania funkcji inlines. Okrelenie inline (kod
wbudowany) oznacza, e wynik moe by uywany natychmiast i moe by operandem w
wyraeniu. Przyjrzyjmy si bardziej zoonemu przykadowi.
Przykad:
W aplikacji wystpuje warto kta angle_X i kta angle_Y, trzeba oceni warto wyraenia.
SIN(angle_X) x COS(angle_Y) + SIN(angle_Y) x COS(angle_X)
Wiadomo, e wynik inline moe by uywany natychmiast, wic mona to napisa w B&R
Automation Basic w taki sam sposb jak normalny matematyczny wzr.
z = SIN(angle_X)*COS(angle_Y)+SIN(angle_Y)*COS(angle_X)
Funkcja inline nie zawiera statycznych danych. Za kadym razem jest wywoywana t sam grupa
parametrw, wynik jest ten sam.
B&R dostarcza kilka bibliotek na temat funkcji z wbudowanym kodem inline z szerokim opisem ich
funkcjonalnoci. System BURTRAP, AsMath oraz biblioteki IEC 1131 zawieraj funkcje inline.
Pena lista wszystkich funkcji w tych bibliotekach jest opisana w systemie pomocy do B&R
Automation Studio.
FBK nie mog by uywane w wyraeniach takich jak funkcje typu inline, poniewa one zwracaj
informacje do grupy zmiennych. Wszystkie wartoci zmiennych wyjciowych i niezbdne zmienne
wewntrzne s trzymane z dala od jednego wywoania FBK do nastpnego. Oznacza to, i
64
Perfection in Automation
wywoanie tego samego bloku funkcji z tymi samymi zmiennymi wejciowymi nie zawsze daje
takie same zmienne wyjciowe.
Wystpuj dwie rne metody wywoania FBK: normalna i alias. Na pocztku zajmiemy si
wywoaniem normalnym.
Przy normalnym wywoaniu FBK wszystkie parametry s w nim wyszczeglnione.. Wyglda to tak
jak normalne wywoanie funkcji. Na przykad uywajc wyszego licznika FBK
CTU(input, reset, limit, limit_reached, counter).
Gdzie input, reset i limit s parametrami wejciowymi a limit_reached i counter s parametrami
wyjciowymi. Nie mona napisa:
Z = CTU(input, reset, limit,limit_reached, counter)
Jest to bezsensowne kompilator poinformuje o bdzie. Funkcja ta posiada grup a nie pojedynczy
parametr, dlatego te nie mona jej przydzieli do zmiennej lub uywa w wyraeniu.
Wywoanie alias
Pozwala na nazwanie poszczeglnych zmiennych funkcji i na dziaania na nich. Nazwa alias musi
przestrzega tych samych zasad, co nazwa zmiennej. Przykad wywoania alias:
counter_1.CU = input
counter_1.R = reset
counter_1.PV = limit
counter_1 FUB CTU()
limit_reached = counter_1.Q
counter = counter_1.CV
Normalne wywoanie FBK jest proste do zrozumienia dla kogo, kto dopiero rozpoczyna lub dla
kogo kto jest przyzwyczajony do uywania funkcji w innym jzyku. Wszystko zawarte jest w linii z
wywoaniem. Parametry alias s przydzielane i wczytywane przy uyciu struktury oraz nie s w
ogle widoczne w linii. Wywoania alias s take szybsze, poniewa posiadaj oddzieln przestrze
65
Perfection in Automation
pamici, do ktrej dostp ma blok funkcji. Zmienne struktury alias mog by przydzielane take
bezporednio, czyli tak:
counter_1.CU = input
counter_1.R = reset
counter_1.PV = limit
counter_1 FUB CTU()
counter_1.CV = counter_1.CV + 5
counter_1 FUB CTU()
limit_reached = counter_1.Q
counter = counter_1.CV
Po napisaniu kodu i zdeklarowaniu zmiennych naley skonstruowa blok funkcji, eby inne
programy wiedziay jakie s wejcia i wyjcia. Musimy uy edytora FBK i powinnimy stworzy
FBK, ktry wyglda tak:
66
Perfection in Automation
Nasz blok funkcji moe by teraz uywany w ten sam sposb jak FBK dostarczany przez B&R.
Lista parametru przemieszcza si z gry na d, z lewa na prawo, i aby wywoa blok funkcji naley
uy nastpujcego wywoania:
ADD_OVER (input_1, input_2, answer, o_flow)
Zanim stworzymy nasz blok funkcji, dobrym pomysem na pocztek jest wyprbowanie go jako
mini programu. W ten sposb mona najpierw sprawdzi czy zostay popenione jakie bdy. Jeeli
jestemy pewni, e kod dziaa bez zarzutu, to naley skopiowa kod do bloku funkcji i okreli
wejcia oraz wyjcia za pomoc edytora FBK.
Przekazywanie wskanikw do FBK
Potrafimy ju napisa FBK uywajc prostych typw danych, ale co trzeba zrobi jeli chcemy uy
acuchw znakw, tablicy czy struktury jako parametrw wejciowych i wyjciowych? Wtedy
wanie trzeba uy wskanikw. Jeeli nie jest Ci znana sekcja Wskaniki i zoone typy danych
z tego rozdziau to zalecane jest najpierw j przeczyta.
Nie mona przekazywa struktury ani tablicy jako parametru bezporednio do bloku funkcji, ale
mona wysa adres. Wtedy blok funkcji moe zaoy wskanik do tego adresu i moe mie dostp
do informacji bez adnych dalszych problemw.
Przykad:
Mamy string (acuch znakw) i musimy odwrci kolejno liter, tj. podane sowo loot FBK
zamieni na tool. Mamy podany adres zmiennej tekstowej i musimy j zmieni.
67
Perfection in Automation
Wersja 1
1. Pocz wejciowy adres danej string z docelowym adresem
2. Znajd dugo wejciowej danej string
3. Przejd przez wszystkie elementy na tablicy zaczynajc od koca
3.1
3.2
Zwrmy uwag na podwjne uycie wyraenia loop. Jeden licznik jest tak naprawd czci ptli
(new_index) a drugim (index) zajmujemy si oddzielnie.
Kod B&R Automation Basic podany powyej jest ju skoczony, ale trzeba go jeszcze zamieni w
FBK. Powinno to wyglda tak:
68
Perfection in Automation
Wszystko jest teraz zrozumiae i moemy uy bloku funkcji. Napiszmy may program, aby go
wyprbowa.
forwards[10] : USINT, backwards[10] :USINT
strcpy(adr(forwards),"Hello")
reverse((adr(forwards),adr(backwards))
DIS_str(0,0,adr(forwards))
DIS_str(1,0,adr(backwards))
Ta sekcja kodu wykonuje ca prac programu. Dziaa ona cyklicznie, czyli dziaa stale tak samo, od
pocztku do koca w nieskoczonej ptli. Jest to bardzo wane, aby o tym pamita przy pisaniu
programu. Program musi by napisany tak by dziaa wtedy, kiedy w kko si powtarza. Program
nie moe by umieszczony w ptli Twojego programu. Oto przykad jak nie powinno by:
69
Perfection in Automation
...
loop
...
exitif on_switch = 1
endloop
Powstanie problem, jeeli program bdzie obecny w tej ptli i bdzie czeka na wczenie
(prawdopodobnie manualne) przecznika. Moe to zabra duo czasu (kilka minut, godzin, ...). Ten
rodzaj czekajcej ptli nie moe by czci programu. Wanie dlatego specjalna konstrukcja select
B&R Automation Basic jest bardzo uyteczna w aplikacjach na PLC.
Ta sekcja programu powinna by krtka. Jest okrelona maksymalna ilo czasu, ktr program
moe zuy na jeden cykl (czas cyklu zadania).
Sekcja inicjalizacyjna
Sekcja ta dziaa tylko raz, na pocztku programu. Zwykle jest uywana do inicjalizacji staych,
ustawienia wartoci pocztkowych zmiennych i do wykonania jakiej operacji tylko raz.
; czesc inicjalizacyjna programu (wykonywana tylko raz)
...
...
; czesc cykliczna programu
...
...
...
70