18. Makra
Ten rozdział opisuje składnię, metody programowania i użycie poleceń w makrach.
18.1. Wprowadzenie
Makra udostępniają dodatkową funkcjonalność, której może potrzebować aplikacja. Pozwalają na korzystanie z zautomatyzowane sekwencji poleceń wykonywanych w czasie rzeczywistym.
Dodatkowo umożliwiają wykonywanie zadań takich jak złożone operacje skalowania, obsługi ciągów znaków i zdefiniowanie interakcje użytkownika z projektem. Ten rozdział opisuje składnię, użycie i metody programowania przy wykorzystaniu komend w makrach.
18.2. Instrukcje dotyczące korzystania z edytora makr
Edytor makr udostępnia następujące funkcje:
l Wyświetlanie numeru linii
l Cofnij / Ponów
l Wytnij / Kopiuj / Wklej
l Zaznacz wszystko
l Przełącz zaznaczenie/następne zaznaczenie/poprzednie zaznaczenie/usuń wszystkie zaznaczenia
l Skomentuj/usuń komentarz
l Ochrona -> Stosuj warunek wywołania
l Wykonywanie cykliczne
l Wykonaj jednokrotnie, po uruchomieniu panela
Poniżej opisano sposób korzystania z powyższych funkcji.
1. Należy otworzyć edytor makr; po lewej stronie obszaru edycji będą widoczne numery linii.
2. Kliknij prawym przyciskiem w obszarze edycji, aby otworzyć rozwijaną listę jak pokazano poniżej. Opcje niedostępne zaznaczone są kolorem szarym, co oznacza, że nie można używać ich w danej chwili. Na przykład należy zaznaczyć tekst, aby mieć możliwość kopiowania, w przeciwnym wypadku jest ona wyszarzona. Dostępne są również skróty klawiaturowe.
3. Na pasku narzędzi dostępne są funkcje: cofnij, ponów, wytnij, kopiuj, wklej, przełącz zaznaczenie, następne zaznaczenie, poprzednie zaznaczenie, usuń wszystkie zaznaczenia.
4. Można cofnąć każdą wprowadzoną funkcję. Funkcja ponów jest dostępna po użyciu funkcji cofnij. Aby wykonać opcję cofnij / ponów, kliknij prawym klawiszem myszy, aby wybrać opcję lub użyj skrótów klawiaturowych. (Cofnij: Ctrl+Z, Ponów: Ctrl+Y).
5. Zaznacz słowo w edytorze, aby kopiować lub wyciąć. Po wykonaniu polecenia kopiuj lub wytnij włączona zostaje funkcja wklej.
6. Użyj opcji zaznacz wszystko, aby zaznaczyć całą treść w obszarze edycji.
7. Jeśli makro jest zbyt długie, użyj zaznaczeń do łatwej edycji i czytania kodu. Poniższe ilustracje przedstawią sposób działania.
l Przesuń kursor na pozycję w obszarze edycji, gdzie chcesz umieścić zaznaczenie. Kliknij prawym przyciskiem myszy, wybierz polecenie Przełącz zaznaczenie. Pojawi się niebieski kwadrat, który przedstawia znacznik po lewej stronie obszaru edycji.
l Jeśli w wskazanym miejscu istnieje już zaznaczenie, wybierz opcję przełącz zaznaczenie, aby je zamknąć.
l Kliknij prawym przyciskiem myszy i wybierz następne zaznaczenie, kursor zostanie przeniesiony do miejsca, gdzie znajduje się następny znacznik. Wybór opcji poprzednie zaznaczenie spowoduje przesunięcie kursora do poprzedniego znacznika.
l Opcja usuń wszystkie zaznaczenia spowoduje usunięcie wszystkich znaczników.
8. Edytor Makr umożliwia zarysowanie (lub składanie) kodu. Opcja ta pozwana na ukrycie kodu makro, który należy do tego samego bloku i wyświetli je jak pokazano poniżej. Po lewej stronie obszaru edycji pojawi się schemat drzewa. Klikając w minus, można ukryć blok. Aby otworzyć blok należy kliknąć w znak plus.
9. Aby rozwinąć wszystkie zwinięte kody można nacisnąć prawym przyciskiem i wybrać opcję rozwiń wszystkie zwinięcia.
10. Fragment kodu zawarty pomiędzy następującymi słowami kluczowymi nazywane są "blokiem" kodu makr:
l Blok kodu: sub – end sub
l Pętle:
i. for – next
ii. while – wend
l Wyrażenia logiczne:
i. if – end if
l Opcje wyboru: select case – end select
11. Edytor makr nie jest oknem z wyłącznością. Pozwala na powrót z niego do ekranu głównego i edytowanie projektu przy otwartym oknie roboczym makra.
12. Edytor makro pozwala na wykorzystanie funkcji znajdź i zamień.
13. Gdy zaznaczone jest opcja wykonywanie cykliczne, makro jest uruchomiane okresowo.
14. Wybierz opcję w polu ochrona » stosuj warunek wywołania » ustawienia, aby wybrać jedno z następujących:
l Wyłącz, gdy bit jest w stanie ON.
l Wyłącz, gdy bit jest w stanie OFF.
15. Jeśli wybrano opcję wykonaj jednokrotnie, po uruchomieniu panela, po włączeniu panela HMI makro wykona się jeden raz.
18.3. Konfiguracja
W programie makro wykorzystujemy deklaracje. Zawierają się w nich stałe, zmienne i operacje. Umieszczane są one w określonym porządku, co pozwala na zdefiniowanie pożądanego wyjścia. Makro ma następującą strukturę:
W programie makro można zdefiniować tylko jeden główny program, która jest punktem wyjścia dla wykonania makra. Format to:
macro_command main()
Lokalne zmienne są używane w głównym programie marko lub w zdefiniowanym bloku funkcyjnym. Wartość tych zmiennych pozostaje ważna tylko w konkretnym bloku. Zmienne globalne są zadeklarowane przed dowolnymi blokami funkcyjnymi i są ważne dla wszystkich funkcji w makrze. Kiedy lokalne zmienne i zmienne globalne mają tę samą deklarację nazwy, tylko lokalne zmienne działają poprawnie.
Poniższy przykład przedstawia proste makro zawierające deklaracje zmiennych i wywołanie funkcji.
macro_command main()
short pressure = 10 // zmienna lokalna
SetData(pressure, "Allen-Bradley DF1", N7, 0, 1) // wywołanie funkcji
end macro_command
18.4. Składnia
18.4.1. Stałe i zmienne
18.4.1.1 Stałe
Stałe są wartościami stałymi i mogą być bezpośrednio zapisywane w instrukcjach. Dostępne są następujące formaty:
| Typ | Uwaga | Przykład |
| Dziesiętne | 345, -234, 0, 23456 | |
| Hexadecymalne | Musi rozpoczynać się od przedrostka 0x | 0x3b, 0xffff, 0x237 |
| ASCII | Pojedynczy znak musi być umieszczony w apostrofach, a ciąg znaków musi być umieszczony pomiędzy cudzysłowami | ‘a’, "data", "name" |
| Dyskretne | prawda, fałsz |
Poniżej przykład wykorzystania stałych:
macro_command main()
short A, B // A i B są zmiennymi
A = 1234
B = 0x12 // 1234 i 0x12 są stałymi
end macro_command
18.4.1.2 Zmienne
Zmienne to nazwy reprezentujące wartości. Wartości można zmieniać, gdy zmienna jest modyfikowana przez instrukcje.
Zasady nazewnictwa dla zmiennych
l Nazwa zmiennej musi zaczynać się od litery.
l Niedozwolone są nazwy zamiennych dłuższe niż 32 znaki
l Istnieją zarezerwowane słowa, które nie mogą być użyte, jako nazwy zmiennych.
Istnieje 8 różnych typów zmiennych, 5 dla danych ze znakiem oraz 3 typy dla zmiennych bez znaku:
| Typ | Opis | Wartości |
| bool (boolean) | 1 bit (dyskretna) | 0, 1 |
| char (character) | 8 bits (bajt) | +127 to -128 |
| short (short integer) | 16 bits (słowo) | +32767 to -32768 |
| int (integer) | 32 bits (podwójne słowo) | +2147483647to -2147483648 |
| float (floating point) | 32 bits (podwójne słowo) | |
| unsigned char | 8 bits (bajt) | 0 to 255 |
| unsigned short | 16 bits (słowo) | 0 to 65535 |
| unsigned int | 32 bits (podwójne słowo) | 0 to 4,294,967,295 |
Deklaracja zmiennych
Zmienne muszą być zadeklarowane przed ich użyciem w programie makro. Aby zadeklarować zmienną, należy podać typ przed nazwą zmiennej.
Przykład:
int a
short b, przełącznik
float ciśnienie
unsigned short c
Deklaracja tablicy
Makra obsługują tablice jednowymiarowe (z indeksem zerowy). Aby zadeklarować tablicę zmiennych, należy podać typ i nazwę zmiennej, a następnie liczbę zmiennych w tablicy w nawiasie "[]". Długość tablicy może wynosić od 1 do 4096. (Makra obsługują maksymalnie 4096 zmiennych w programie makro).
Przykład:
int a[10]
short b[20], przełącznik [30]
float ciśnienie [15]
Najniższy indeks tablicy to 0, a najwyższy = rozmiar tablicy – 1
Przykład:
char data [100] // rozmiar tablicy 100
W tym przypadku najniższy indeks to 0 a najwyższy to 99 (=100-1)
Inicjalizacja zmiennej i tablicy
Istnieją dwa sposoby inicjowania zmiennych:
l Przez deklarację za pomocą operatora przypisania (=)
Przykład:
int a
float b[3]
a = 10
b[0] = 1
l Podczas deklarowania zmiennej
char a = ‘5’, b = 9
Deklaracja tablic jest szczególnym przypadkiem. Całą tablicę można zainicjować podczas deklaracji, zamykając oddzielone przecinkami wartości wewnątrz nawiasów klamrowych "{}". Przykład:
float data[4] = {11, 22, 33, 44} // wartość w indeksie[0] to 11, w indeksie[1] to 22….
18.4.2. Operatory
Operatory służą do określania sposobu obliczania wartości zmiennych.
| Operator | Opis | Przykład |
| = | Operator przypisania | ciśnienie = 10 |
| Operacja matematyczna | Opis | Przykład |
| + | Dodawanie | A = B + C |
| - | Odejmowanie | A = B – C |
| * | Mnożenie | A = B * C |
| / | Dzielenie | A = B / C |
| % | Modulo (reszta z dzielenia) | A = B % 5 |
Domyślnie uważa się, że liczby całkowite (1, 2,3..etc) mają typ danych całkowitych; dlatego też, gdy dzielenie odbywa się z udziałem dwóch liczb całkowitych, w których wynik powinien mieć punkt dziesiętny, część dziesiętna zostanie usunięta. Aby temu zapobiec, dodaj przecinek lub kropkę do wartości zmiennoprzecinkowej, 0. (1.0, 2.0, 3.0 ... itd.).
Przykład:
A = 3 / 2 = 1 » 3 i 2 są liczbami całkowitymi, dlatego wynik również jest liczą całkowitą.
B = 3 / 2.0 = 1.5 » 3 jest liczbą całkowitą 2.0 jest liczbą zmiennoprzecinkową, dlatego wynik jest również wartością zmiennoprzecinkową.
C = 3.0 / 2 = 1.5 » 3.0 jest liczbą zmiennoprzecinkową, 2 jest liczbą całkowitą, wynik jest również wartością zmiennoprzecinkową.
| Operatory porównań | Opis | Przykład |
| < | Mniejsze niż | if A < 10 then B = 5 |
| <= | Mniejsze, bądź równe | if A <= 10 then B = 5 |
| > | Większe niż | if A > 10 then B = 5 |
| >= | Większe, bądź równe | if A >= 10 then B = 5 |
| == | Równe | if A == 10 then B = 5 |
| <> | Różne | if A <> 10 then B = 5 |
| Operacje logiczne | Opis | Przykład |
| and | Logiczny AND | if A < 10 and B > 5 then C = 10 |
| or | Logiczny OR | if A >= 10 or B > 5 then C = 10 |
| xor | Logiczny Exclusive OR | if f A xor 256 then B = 5 |
| not | Logiczny NOT | if not A then B = 5 |
Operatory przesunięcia i operacje na bitach są używane do manipulowania bitami zmiennych całkowitych ze znakiem i bez znaku. Operatory te działają na bitach zaczynając od lewej do prawej strony..
| Operacje przesunięcia | Opis | Przykład |
| << | Przesuwa bity z wskazanego słowa B o określoną liczbę bitów (8) w lewą stronę i zapisuje do A | A = B << 8 |
| >> | Przesuwa bity z wskazanego słowa B o określoną liczbę bitów (8) w prawą stronę i zapisuje do A | A = B << 8 |
| Operatory bitowe | Opis | Przykład |
| & | Operator bitowy AND | A = B & 0xf |
| | | Operator bitowy OR | A = B | C |
| ^ | Operator bitowy XOR | A = B | C |
| ~ | Kod uzupełnień do jedności | A = ~B |
Priorytety wszystkich operatorów
Priorytet wykonywania wszystkich jest następujący:
1. Operacje w nawiasie są przeprowadzane najpierw
2. Operacje arytmetyczne
3. Operacje przesunięcia, lub operacje z operatorami bitowymi
4. Porównania
5. Logiczne operacje
6. Przypisanie
Zarezerwowane słowa klucze
Następujące słowa kluczowe są zarezerwowane dla systemu. Te słowa nie mogą być użyte, jako zmienna, tablica lub nazwy funkcji.
+, -, *, /, %, >=, >, <=, <, <>, ==, and, or, xor, not, <<, >>,=, &, |, ^, ~
exit, macro_command, for, to, down, step, next, return, bool, short, int, char, float, void, if, then, else, break, continue, set, sub, end, while, wend, prawda, fałsz
SQRT, CUBERT, LOG, LOG10, SIN, COS, TAN, COT, SEC, CSC, ASIN, ACOS, ATAN, BIN2BCD, BCD2BIN, DEC2ASCII, FLOAT2ASCII, HEX2ASCII, ASCII2DEC, ASCII2FLOAT, ASCII2HEX, FILL, RAND, DELAY, SWAPB, SWAPW, LOBYTE, HIBYTE, LOWORD, HIWORD, GETBIT, SETBITON, SETBITOFF, INVBIT, ADDSUM, XORSUM, CRC, INPORT, OUTPORT, POW, GetCnvTagArrayIndex, GetError, GetData, GetDataEx, SetData, SetDataEx, SetRTS, GetCTS, Beep, SYNC_TRIG_MACRO, ASYNC_TRIG_MACRO, TRACE, FindDataSamplingDate, FindDataSamplingIndex, FindEventLogDate, FindEventLogIndex
StringGet, StringGetEx, StringSet, StringSetEx, StringCopy, StringMid, StringDecAsc2Bin, StringBin2DecAsc, StringDecAsc2Float, StringFloat2DecAsc, StringHexAsc2Bin, StringBin2HexAsc, StringLength, StringCat, StringCompare, StringCompareNoCase, StringFind, StringReverseFind, StringFindOneOf, StringIncluding, StringExcluding, StringToUpper, StringToLower, StringToReverse, StringTrimLeft, StringTrimRight, StringInsert, String2Unicode
18.5. Wyrażenia
18.5.1. Definicja zmiennych
Definicja zmiennych i tablic - składnia jest następująca:
Określa zmienną o nazwie "nazwa" i typie "typ".
Przykład:
int A // definicja zmiennej integer o nazwie A
Określa tablicę o nazwie "nazwa" i rozmiarze określoną przez "stałą" i typu "typ"
Przykład:
int B[10] // definicja jednowymiarowej tablicy integer-ów B rozmiarze 10
18.5.2. Przypisania
Instrukcja przypisania używa operatora przypisania do przenoszenia danych z wyrażenia po prawej stronie operatora do zmiennej po jego lewej stronie. Wyrażenie to kombinacja zmiennych, stałych i operatorów, które pozwalają na uzyskania danej wartości.
Przykład
A = 2 gdzie do zmiennej A zostaje przypisana wartość 2
18.5.3. Pętle logiczne
Pętle logiczne wykonują akcje w zależności od warunku wyrażenia logicznego
Składnia wygląda następująco:
Format jednoliniowy
Przykład:
if a == 2 then
b = 1
else
b = 2
end if
Format blokowy
Przykład:
if a == 2 then
b = 1
else if a == 3 then
b = 2
else
b = 3
end if
Opis składni
18.5.4. Pętle wyboru
Pętla select-case może być używana na tej samej zasadzie jak użycie wielu instrukcji if-else i wykonywać wybrane akcje w zależności od wartości danej zmiennej. Po znalezieniu dopasowanej wartości wszystkie wyrażenia zostaną wykonane, dopóki nie zostanie spełniona instrukcja break. Składnia jest następująca:
Format bez domyślnego przypadku
Przykład:
Select Case A
Case 1
b=1
break
end Select
Format z domyślnym przypadkiem (Case else)
Przykład:
Select Case A
Case 1
b=1
break
Case else
b=0
break
end Select
Wiele przypadków w tym samym bloku
Przykład:
Select Case A
Case 1
break
Case 2
b=2
break
Case 3
b=3
break
end Select
Opis składni
18.5.5. Pętle wielokrotne
Iteracyjne pętle i powtarzające zadania w zależności od stanu. Istnieją dwa rodzaje instrukcji iteracyjnych.
18.5.5.1. Pętla for-next
Pętla for-next jest uruchamiana dla określonej liczby iteracji. Zmienna jest używana, jako licznik wykonania pętli i sprawdzania warunków końcowych. Można ją wykorzystać w celu wykonywania stałej liczby pętli. Składnia jest następująca:
Przykład:
for a = 0 to 10 step 2
b = a
next a
Opis składni
Wymagany. Określa, czy wartość określona w polu <krok> zwiększa lub zmniejsza wartość licznika.
"to" zwiększa wartość licznika, a "down" zmniejsza wartość licznika o wartość kroku. <wartość_końcowa> Wymagany. Wykorzystywany do porównywania z wartością licznika, jeśli jego wartość jest większa od wartości końcowej program makra wychodzi z pętli stepOpcjonalny. Pozwala na określenie więcej niż jednej wartości kroku.
[krok] Opcjonalny. Krok służy do zwiększania / zmniejszania wartości licznika. Można go pominąć, wtedy wartość domyślna kroku wynosi 1. [wyrażenie] Opcjonalny. Wyrażenie wykonywane, gdy warunek dla petli jest spełniony. Można używać zagnieżdżonych pętli. next Wymagany [licznik] Opcjonalny. Jest używany podczas zagnieżdżania kolejnych pętli.18.5.5.2. Pętla while-wend
Pętla while-wend nie ma określonej liczby iteracji. Zmienna jest używana do sprawdzania warunków końcowych. Gdy warunek jest spełniony, pętla jest wykonywana, do momentu, gdy warunek przestanie być spełniany. Składnia jest następująca.
Przykład:
while a < 10
a = a + 10
wend
Opis składni
18.5.5.3. Inne komendy sterujące
18.6. Bloki funkcyjne
Bloki funkcyjne są wykorzystywane do redukcji powtarzających się fragmentów kodów. Muszą one być zdefiniowane przed wykorzystaniem w programie, obsługują każdy typ zmiennej i instrukcji. Blok funkcyjny można wywołać, umieszczając jego nazwę, a następnie parametry w nawiasach. Po wykonaniu bloku funkcyjnego zwraca on wartość do funkcji wywołującej, w której jest używana, jako wartość lub warunek. Nie jest wymagane, aby blok funkcyjny zwracał wartość. Parametry mogą być również pomijane w definicji funkcji funkcja nie musi pobierać żadnych parametrów od programu wywołującego blok. Składnia jest następująca:
Definicja funkcji z zwracaniem wartości
Przykład:
sub int Add(int x, int y)
int result
result = x +y
return result
end sub
macro_command main()
int a = 10, b = 20, sum
sum = Add(a, b)
end macro_command
lub:
sub int Add()
int result, x=10, y=20
result = x +y
return result
end sub
macro_command main()
int sum
sum = Add()
end macro_command
Definicja funkcji bez zwracania wartości
Przykład:
sub Add(int x, int y)
int result
result = x +y
end sub
macro_command main()
int a = 10, b = 20
Add(a, b)
end macro_command
lub:
sub Add()
int result, x=10, y=20
result = x +y
end sub
macro_command main()
Add()
end macro_command
Opis składni
Opcjonalny. Jest to typ danych zwracanych przez funkcję. Blok funkcyjny nie zawsze musi zwracać wartość.
Na przykład: sub int Moja_funkcja (int x, int y). x i y będą liczbami całkowitymi przekazanymi do funkcji. Funkcję tą można wywołać na przykład: ret = Moja_funkcja (456, ciśnienie) gdzie "ciśnienie" musi być liczbą całkowitą zgodnie z definicją funkcji.
Należy zauważyć, że funkcja wywołująca może przekazywać zmienne do funkcji. Po wykonaniu tej funkcji wartości całkowite zostają przypisane do zmiennej "ret".
Deklaracja zmiennych lokalnych Zmienne, które są używane w bloku funkcyjnym, muszą być zadeklarowane jako pierwsze. Są to dodatkowe zmienne. W powyższym przykładzie x i y są dodatkowymi zmiennymi, z których można korzystać. Zmienne globalne są również dostępne w bloku funkcyjnym [Wyrażenie] Funkcja, która ma zostać wykonana [return [wartość]] Opcjonalny. Służy do zwracania wartości do instrukcji wywołującej. Wartość może być stałą lub zmienną. Zwrócenie wartości również kończy działanie bloku funkcyjnego. Blok funkcyjny nie musi zwracać wartości, ale gdy korzystamy z składni funkcji z zwracaniem wartości, wyrażenie to jest niezbędne. end sub Wykorzystywany do zakończenia bloku funkcyjnego.
18.7. Zaimplementowane bloki funkcyjne
EasyBuilder Pro ma wiele wbudowanych funkcji, które można wykorzystać w programie makra.
18.7.1. Funkcje matematyczne
18.7.2. Konwersja formatu danych
18.8. Jak utworzyć i wywołać program makro
18.9. Funkcje makro zdefiniowane przez użytkownika
18.10. Uwagi dotyczące korzystania z makr
18.11. Używanie Free protokołu do sterowania urządzeniem
18.12. Komunikaty o błędzie kompilacji
18.13. Przykładowe programy makro
18.14. Funkcja TRACE programu makro
18.15. Przykłady operacji na ciągach znaków String
18.16. Zabezpieczenie programu marko hasłem










































