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
| if | Musi być użyty do rozpoczęcia pętli |
| <Warunek> | Wymagany. Jeśli jest spełniony zostaje wykonane wyrażenie |
| then | Poprzedza instrukcje do wykonania, jeśli <Warunek> zostanie spełniony |
| [Wyrażenie] | Jest opcjonalny w formacie blokowym, ale konieczny w formacie jednoliniowym, bez opcji użycia opcji else. Wyrażenie zostanie wykonana, gdy <Warunek> jest spełniony. |
| else if | Opcjonalny. Instrukcja else if zostanie wykonana, gdy <Warunek-n> zostanie spełniony. |
| <Wyrażenie-n> | Opcjonalny. Działa na tej samej zasadzie, co <Wyrażenie> |
| else | Opcjonalny. Wyrażenie występujące po else zostanie wykonane, gdy <Warunek> i < Warunek -n> nie zostaną spełnione |
| end if | Musi być użyty do zakończenia pętli. |
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
| Select Case | Musi być użyty do rozpoczęcia pętli |
| [zmienna] | Musi być użyty do rozpoczęcia pętli |
| Case else | Opcjonalny. Reprezentuje domyślny przypadek. Jeśli żaden z wcześniejszych przypadków nie zostanie spełniony, zostanie wykonane wyrażenie z domyślnego przypadku. Jeśli nie ma domyślnego przypadku i żaden inny przypadek nie zostanie spełniony program przejdzie bezpośrednio do końca pętli select-case |
| break | Opcjonalny. Pętla będzie wykonywana, dopóki nie zostanie osiągnięte polecenie przerwania. Jeśli polecenie przerwania nie jest używane, program kontynuuje wykonywanie następnego wyrażanie, aż do osiągnięcia polecenia końcowego |
| break | Musi być użyty do zakończenia pętli. |
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
| for | Musi być użyty do rozpoczęcia pętli |
| [licznik] | Wymagany. Wartość zmiennej jest wykorzystywana do porównania, czy pętla została wykonana daną ilość pętli |
| <wartość_startowa> | Wymagany. Wartość początkowa licznika |
| to/down |
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 |
| step |
Opcjonalny. 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
| while | Musi być użyty do rozpoczęcia pętli |
| continue | Wymagany. Warunek sprawdzający. Gdy jest spełniony, pętla będzie wykonywana. Kiedy przestanie być spełniany, pętla zakończy wykonywanie. |
| return [wartość] | Wyrażenie do wykonania, gdy warunek jest spełniony |
| wend | Musi być użyty do zakończenia pętli |
18.5.5.3. Inne komendy sterujące
| break | Używane w pętlach for-next i while-wend. Instrukcja powoduje natychmiastowe przejście do końca pętli iteracyjnej |
| continue | Używane w pętlach for-next i while-wend. Kończy bieżącą iterację pętli i rozpoczyna następną |
| return | Polecenie return wewnątrz głównego bloku makra powoduje zatrzymanie się wykonywanie programu w dowolnym miejscu. Program przechodzi natychmiast do końca głównego bloku |
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
| sub | Musi być użyty, jako rozpoczęcia bloku funkcyjnego |
| type | Opcjonalny. Jest to typ danych zwracanych przez funkcję. Blok funkcyjny nie zawsze musi zwracać wartość |
| (parametry) |
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.7.3. Operacje na zmiennych
18.7.4. Operacje na bitach
18.7.5. Komunikacja
18.7.6. Operacje na ciągach znaków
18.7.7. Zapytania do receptur
18.7.8. Różne
18.8. Jak utworzyć i wywołać program makro
18.8.1. Jak utworzyć program makro
Należy wykonać poniższe kroki, aby utworzyć program makro.
1. Naciśnij ikonę
[Marka] na pasku narzędzi w programie EasyBuilder Pro, aby otworzyć okno dialogowe z listą makr jak pokazano poniżej.
W oknie dialogowym na liście makr wyświetlane są wszystkie makra, które zostały pomyślnie skompilowane, a wszystkie makra, które są w trakcie tworzenia lub nie mogą być skompilowane, są wyświetlane w obszarze "Makro w trakcie tworzenia". Poniżej znajduje się opis przycisków.
| Opcja | Opis |
| Nowe | Otwiera pusty edytor do tworzenia nowego makra |
| Usuń | Usuwa wybrane makro |
| Edytuj | Otwiera edytor z wybranym makrem |
| Kopiuj | Kopiuje wybrane makro do schowka |
| Wklej | Dodaje makro z schowka na listę z nową nazwą makra |
| Eksportuj | Zapisuje wybrane makro w formacie *.edm |
| Importuj | Importuje makro w formacie *.edm do projektu |
| Biblioteka | Otwiera okno dialogowe zarządzania biblioteką funkcji makr |
2. Naciśnij przycisk [Nowy], aby utworzyć puste makro i otworzyć edytor makr. Każde makro ma unikalny numer [Makro ID] i musi posiadać nazwę, w przeciwnym razie podczas kompilacji pojawi się błąd.
3. Napisz swoje makro. Aby użyć wbudowanych funkcji (takich jak SetData () lub Getdata ()), naciśnij przycisk [Funkcje], aby otworzyć okno dialogowe API, wybrać funkcję i ustawić podstawowe parametry.
4. Po napisaniu nowego makra naciśnij przycisk [Zapisz i Kompiluj], aby skompilować makro.
5. Jeśli nie ma błędów, naciśnij przycisk [Wyjście], nowe makro "macro_0" pojawi się liście makr.
18.8.2. Wywoływanie programu makro
Jest kilka sposobów na wywołanie program marko
l Wykorzystanie obiektu kontroli przez PLC
1. Otwórz w zakładce obiekty [Kontrola przez plc] i dodaj nową kontrolę z typem akcji [Wywołaj program makro].
2. Wybierz utworzone wcześniej makro z listy. Wskaż adres i tryb wywołania, który będzie odpowiedzialny za uruchomienie makra. Aby zagwarantować, że makro uruchomi się tylko raz, należy rozważyć zablokowanie bitu wywołującego, a następnie resetować warunek wyzwalający w makrze.
3. Użyj obiektu ustaw bit lub przełącznik, aby zmieniać stan wybranego bitu i wywoływać program makro.
l Wykorzystanie obiektu ustaw bit lub przełącznik
1. W zakładce ogólnej obiektu ustaw bit lub przełącznik zaznacz opcję wywołaj makro.
2. Wybierz program makro z listy. Będzie on wywoływany przy każdym użyciu obiektu.
l Wykorzystanie obiektu funkcyjnego
1. W zakładce ogólnej obiektu funkcyjnego zaznacz opcję wywołaj makro.
2. Wybierz program makro z listy. Będzie on wywoływany przy każdym użyciu obiektu.
l W edytorze makr
1. [Wykonywanie cykliczne]: Makro będzie wykonywane z zadanym interwałem czasu.
2. [Wykonaj jednokrotnie po uruchomieniu panela]: Makro zostanie wykonane raz po uruchomieniu panela
l W ustawieniach okna, w polu Makro
1. [Przy otwarciu]: Podczas otwarcia okna zostanie raz wykonane makro.
2. [Cyklicznie]: Po otwarciu okna makro będzie wykonywane z interwałem czasowym równym 0.5 sekund.
3. [Przy zamknięciu]: Podczas zamykania okna zostanie raz wykonane makro..
18.9. Funkcje makro zdefiniowane przez użytkownika
Podczas edycji programu makro, aby zaoszczędzić czas na definiowanie funkcji, użytkownik może wyszukać potrzebne z wbudowanej biblioteki. Niektóre funkcje mogą nie być zdefiniowane. W takim przypadku użytkownik może zdefiniować potrzebną funkcję i zapisać ją do wykorzystania w przyszłości. Następnym razem, gdy będzie potrzeba użycia tej samej funkcji, będzie można ją wywołać z[Biblioteka funkcji. Ponadto biblioteka funkcji znacznie ułatwia przenoszenie funkcji zdefiniowanych przez użytkownika pomiędzy programami. Przed zdefiniowaniem nowej funkcji należy sprawdzić czy dana funkcja już nie istnieje w wbudowanych funkcje lub bibliotece funkcji.
18.9.1. Import pliku biblioteki funkcji
Należy otworzyć projekt, domyślny plik biblioteki funkcji zostanie automatycznie odczytany, a informacja o funkcjach zostanie załadowana. W tym momencie, jeśli wywoływana jest funkcja zdefiniowana przez użytkownika, odpowiedni plik .mlb musi zostać najpierw zaimportowany.
1. Domyślna nazwa pliku biblioteki funkcji: MacroLibrary (bez rozszerzenia nazwy pliku)
2. Katalog biblioteki funkcji: katalog instalacyjny oprogramowania EasyBuilderPro \ library (folder)
3. \library (folder) zawiera dwa typy plików biblioteki funkcji:
Bez rozszerzenia nazwy pliku: MacroLibrary - domyślna biblioteka funkcji oprogramowania HMI odczytywana automatycznie.
Z rozszerzeniem nazwy pliku (.mlb): np. „math.mlb". Pliki mogą być odczytywane i zapisywane podczas operacji importuj / eksportuj. Te pliki można przenosić i importować do programy w razie potrzeby.
4. Podczas otwierania oprogramowania EasyBuilderPro, zostaną załadowane tylko funkcje z domyślnej biblioteki funkcji, aby móc korzystać z funkcji w plikach .mlb, należy najpierw je zaimportować.
18.9.2. Jak używać biblioteki funkcji makro
1. Należy wskazać funkcję z biblioteki funkcji.
2. W edytorze makr należy nacisnąć przycisk funkcje.
3. Następnie należy zaznaczyć opcję wbudowane lub biblioteki funkcji.
4. Opis wyświetlany w oknie dialogowym jest taki sam jak ten napisany w edytorze funkcji.
5. Wybierz funkcję, która ma być używana, wpisz odpowiednie zmienne zgodnie z typem danych.
6. Po wykonaniu powyższych czynności funkcje zdefiniowane przez użytkownika mogą być wielokrotnie używane bez kolejnego definiowania.
19.9.3. Interfejs menadżera biblioteki funkcji
1. Otwórz okno dialogowe menadżera makr, kliknij [biblioteka], aby otworzyć okno dialogowe [biblioteka funkcji makr].
2. Zostanie wyświetlona lista funkcji. Po otwarciu projektu oprogramowanie załaduje wszystkie funkcje do biblioteki funkcji makr..
3. Każda wymieniona funkcja ma następujący format:
| Typ_zwracanej_wartosci nazwa_funkcji ( parametr_typ1, …, parametr_typN) |
Typ_zwracanej_wartosci wskazuje typ zwracanej wartości. Jeśli ta wartość nie istnieje, ta kolumna zostanie pominięta. nazwa_funkcji wskazuje nazwę pliku funkcji. “N” w parametr_typN oznacza liczbę typów parametrów. Jeśli ta funkcja nie wymaga żadnego parametru, ta kolumna zostanie pominięta.
4. Funkcja makro może być zapisywana w pliku projektu. Należy wybrać funkcję, a następnie kliknąć [skopiuj do projektu]. Funkcja ta zostanie przeniesiona do zakładki [Projekt]. Podczas otwierania projektu na innym komputerze ta funkcja nadal będzie dostępna. Podczas kompilowania projektu plik .exob będzie zawierał funkcje, które są używane w projekcie. Należy pamiętać, że dekompilacja projektu spowoduje wygenerowanie tylko użytych programów makr.
18.9.3.1. Tworzenie funkcji
1. Naciśnij [Nowe], aby wejść do Edytora funkcji.
2. Utwórz nową funkcję w edytorze funkcji.
3. W polu „w poniższym polu wprowadź” można wprowadzić opis funkcji.
4. Po edycji kliknij [Kompiluj] i [Zapisz], aby zapisać nową funkcję w Bibliotece. W przeciwnym razie pojawi się ostrzeżenie..
5. Z powodzeniem dodano nową funkcję do biblioteki funkcji makr.
n Całkowita wielkość zadeklarowanych danych w funkcji nie może być większa niż 4096 bajtów.
n Nazwa funkcji może zawierać tylko znaki alfanumeryczne i nie może zaczynać się od cyfry..
18.9.3.2. Usuwanie funkcji
1. Z listy funkcji wybierz funkcję i naciśnij [Usuń].
2. Naciśnij [Tak], aby potwierdzić, lub [Nie], aby anulować akcję. Po naciśnięciu [Tak] funkcja „unsigned short odczyt” zostanie usunięta.
18.9.3.3. Edycja funkcji
1. Użytkownicy mogą modyfikować funkcje znajdujące się w bibliotece.
2. Wybierz funkcję do modyfikacji, naciśnij [Edytuj], aby wejść do edytora funkcji.
3. Również poprzez dwukrotne kliknięcie funkcji można wejść do Edytora funkcji.
4. Po edycji, przed opuszczeniem edytora należy nacisnąć przycisk [Kompiluj], a następnie [Zapisz].
18.9.3.4. Import funkcji
1. Funkcje można importować z pliku o rozszerzeniu .mlb.
2. Dla przykładu zaimportujemy bibliotekę “math.mlb”, która zawiera kilka funkcji. Naciśnij [Otwórz].
3. Podczas importowania, gdy dana funkcja już istnieje w Bibliotece, pojawi się okno z komunikatem. Są następujące opcje:
[Tak]: Zastąp istniejącą funkcję.
[Nie]: Anuluj import funkcji.
[Tak dla wszystkich]: Zastąp wszystkie istniejące funkcje o tej samej nazwie.
[Nie dla wszystkich]: Anuluj import funkcji, których nazwy już istnieją.
4. Zaimportowane funkcje zostaną zapisane w domyślnej bibliotece funkcji, więc jeśli plik "math.mlb" zostanie usunięty, nowe funkcje nadal będą istniały w bibliotece, nawet po ponownym uruchomieniu EasyBuilder Pro.
18.9.3.5. Eksport funkcji
1. Wyeksportuj funkcję z biblioteki funkcji i zapisz w plik o formacie .mlb. Naciśnij [Eksportuj].
2. Wybierz, które funkcje mają być wyeksportowane i naciśnij [Eksportuj].
3. Zostanie utworzony plik o wskazanej nazwie, w wskazanym katalogu. Będzie on zawierał tylko wybrane funkcje.
4. Wyeksportowany plik .mlb będzie można zaimportować do oprogramowania na innym komputerze. Po wykonaniu procedury importu, będzie można korzystać z wcześniej wyeksportowanych funkcji
18.10. Uwagi dotyczące korzystania z makr
1. Maksymalna wielkość pamięci dla zmiennych w makrze wynosi 4 KB. Tak, więc maksymalny rozmiar tablicy różnych typów zmiennych jest następujący:
char a[4096]
bool b[4096]
short c[2048]
int d[1024]
float e[1024]
2. Maksymalnie można utworzyć 255 makr w projekcie w EasyBuilder Pro.
3. Makro może powodować brak reakcji interfejsu HMI. Możliwe powody to:
l Makro zawiera nieskończoną pętlę bez komunikacji z PLC.
l Rozmiar tablicy przekracza miejsce w makrze.
4. Prędkość komunikacji z PLC wpływa na czas wykonania makra. Ponadto zbyt wiele makr może spowolnić komunikację między HMI i PLC.
18.11. Używanie Free protokołu do sterowania urządzeniem
Jeśli EasyBuilder Pro nie posiada sterownika dla określonego urządzenia, użytkownicy mogą używać wbudowanych funkcji OUTPORT i INPORT do sterowania tym urządzeniem. Dane wysyłane przez OUTPORT i INPORT muszą być zgodne z protokołem komunikacyjnym urządzenia. Poniższy przykład wyjaśnia, w jaki sposób korzystać z tych dwóch funkcji do sterowania na podstawie urządzenia MODBUS RTU.
1. Najpierw dodaj nowe urządzenie na liście urządzeń. Typ należy ustawić, jako "Free Protocol" i nadać nazwę "urządzenie MODBUS RTU" jak pokazano poniżej:
2. Interfejs urządzenia (PLC I/F) używa [RS-232]. Jeśli podłączone jest urządzenie MODBUS TCP/IP, interfejs powinien być ustawiony, jako [Ethernet] z prawidłowym adresem IP i numerem portu w następujący sposób:
Załóżmy, że chcemy, aby panel HMI odczytał dane 4x_1 i 4x_2 z urządzenia. Najpierw korzystając z funkcji OUTPORT, należy wysłać żądanie odczytu do urządzenia. Format OUTPORT to: OUTPORT (polecenie [start], nazwa urządzenia, cmd_liczba)
Ponieważ "urządzenie MODBUS RTU" jest urządzeniem korzystającym z protokołu MODBUS RTU, żądanie odczytu musi być zgodne z tym protokołem. W żądaniu użyto polecenia "Reading Holding Registers (0x03)" do odczytu danych. Poniższy rysunek wyświetla zawartość polecenia. (Pozycje: numer stacji (bajt 0) i ostatnie dwa bajty (CRC) są ignorowane).
W zależności od protokołu, zawartość polecenia odczytu może wyglądać jak poniżej (Łącznie wynosi 8 bajtów):
komenda[0]: numer stacji (BYTE 0)
komenda [1]: kod funkcji (BYTE 1)
komenda [2]: starszy bajt adresu odczytu (BYTE 2)
komenda [3]: młodszy bajt adresu odczytu (BYTE 3)
komenda [4]: starszy bajt ilości adresów (BYTE 4)
komenda [5]: młodszy starszy bajt ilości adresów (BYTE 5)
komenda [6]: młodszy bajt 16-bitowego CRC (BYTE 6)
komenda [7]: starszy bajt 16-bitowego CRC (BYTE 7)
Tak, więc żądanie odczytu należy napisać w następujący sposób:
Następnie należy użyć polecenia OUPORT, aby wysłać żądanie odczytu do PLC
Po wysłaniu żądania należy użyć polecenia INPORT, aby uzyskać odpowiedź od PLC. W zależności od protokołu treść odpowiedzi może być następująca (całkowita ilość bajtów wynosi 9):
komenda[0]: numer stacji (BYTE 0)
komenda[1]: kod funkcji (BYTE 1)
komenda[2]: liczba bajtów (BYTE 2)
komenda[3]: starszy bajt zmiennej 4x_1 (BYTE 3)
komenda[4]: młodszy bajt zmiennej 4x_1 (BYTE 4)
komenda[5]: starszy bajt zmiennej 4x_2 (BYTE 5)
komenda[6]: młodszy bajt zmiennej 4x_2 (BYTE 6)
komenda[7]: młodszy bajt 16-bitowego CRC (BYTE 7)
komenda[8]: starszy bajt 16-bitowego CRC (BYTE 8)
Składnia funkcji inport jest następująca:
Gdzie liczba odczytanych zmiennych jest zapisywana do zmiennej wartosc_zwracana (jednostka to bajt). Jeśli wartosc_zwracana wynosi 0, oznacza to, że odczyt nie powiódł się podczas wykonywania funkcji INPORT.
Zgodnie ze specyfikacją protokołu MODBUS RTU poprawna wartość zmiennej odpowiedz[1] musi być równa 0x03. Po uzyskaniu poprawnej odpowiedzi należy wyodrębnić dane 4x_1 i 4x_2 i wprowadzić do zmiennych lokalnych HMI, LW-100 i LW-101.
Pełny program makro wygląda następująco:
W poniższym przykładzie wyjaśniono, jak napisać program zmieniający stan zmiennej 0x_1. Program wykorzystuje funkcję "Write Single Coil (0x5)".
Pełny program makro wygląda następująco:
18.12. Komunikaty o błędzie kompilacji
l Format komunikatu o błędzie
błąd C# : opis błędu
(# jest numerem komunikatu błędu)
przykład: błąd C37 : niezadeklarowany identyfikator : i
Gdy występują błędy kompilacji, opis błędu można znaleźć za pomocą numeru komunikatu o błędzie kompilatora.
l Opis błędów
(C1) błąd składni
Istnieje wiele możliwości wystąpienia tego błędu kompilatora.
Przykład:
macro_command main()
char i, 123xyz // nieobsługiwana nazwa zmiennej
end macro_command
(C2) użyta, ale jej nazwa nie została zainicjalizowana
W programie makro musi być określony rozmiar tablicy podczas deklaracji.
Przykład:
macro_command main()
char i
int g[i] // i musi być stałą liczbową
end macro_command
(C3) podwójna deklaracja zmiennej
Nazwa zmiennej i funkcji, do której się odwołuje musi być unikalna.
Przykład:
macro_command main()
int g[10],g // błąd
end macro_command
(C4) błąd nazwy funkcji
Zastrzeżone słowa kluczowe i stała nie mogą być nazwą funkcji
Przykład:
sub int if() // błąd
(C5) nawiasy nie występują w parach
Brakuje znaku "(" lub ")"
Przykład:
macro_command main ) // brakuje “(“
(C6) niedozwolone wyrażenie bez przedrostka "if"
Brakujące wyrażenie w instrukcji "if"
(C7) niedozwolone wyrażenie (brak "then") w instrukcji "if"
Brakuje przedrostka "then" w instrukcji "if"
(C8) niedozwolone wyrażenie (brak przedrostka "end if")
Brakuje przedrostka “end if”
(C9) niedozwolone wyrażanie "end if" bez przedrostka "if"
Brakuje przedrostka "if" przed przedrostkiem "end if"
(C10) niedozwolone wyrażenie ‘else’
Format instrukcji "if" to:
if [wyrażenie logiczne] to
[else [if [wyrażenie logiczne] następnie]]
end if
Inny niż powyższy format spowoduje błąd kompilacji.
(C17) niedozwolone wyrażenie (brak "for") przed przedrostkiem "next"
Błędna składnia funkcji for: brak przedrostka "for" przed przedrostkiem "next"
(C18) niedozwolony typ zmiennej (nie jest liczbą całkowitą ani znakiem)
Typ zmiennej może być zmienną całkowitą lub znakiem
(C19) błąd typu zmiennej
Brakująca instrukcja przypisania zmiennej
(C20) brak słowa kluczowego "to lub "down"
Brakujące słowo kluczowe “to” lub “down”
(C21) niedozwolone wyrażenie (brak 'next')
Format instrukcji "for" to:
for [zmienna] = [wartość początkowa] to [wartość końcowa] [krok]
next [zmienna]
Inny niż powyższy format spowoduje błąd kompilacji.
(C22) niedozwolone wyrażenie (brak ‘while’)
Brakujący przedrostek “while” przed “Wend”
(C23) niedozwolone wyrażenie (brak ‘wend’)
Format instrukcji "while" to:
while [wyrażenie logiczne]
wend
Inny niż powyższy format spowoduje błąd kompilacji.
(C24) błąd składni: ‘break’
Instrukcja "break" może być użyta tylko w instrukcji "for" i "while".
(C25) błąd składni: ‘continue’
Instrukcja " continue’" może być użyta tylko w instrukcji "for" i "while
(C26) błąd składni
Błąd w wyrażeniu.
(C27) niezadeklarowany identyfikator xyz
Brak deklaracji zmiennej występującej w wyrażeniu.
Przykład:
macro_command main( )
int a, b
for a = 0 to 2
b = 4 + xyz // niedozwolone : xyz jest niezadeklarowane
next a
end macro_command
(C28) brak przedrostka ‘macro_command’
Program makro musi zaczynać się od przedrostka ’macro_command’
(C29) brak słowa kluczowego ‘sub’
Format deklaracji funkcji to:
sub [tym zmiennej] function_name(…)
………..
end sub
Przykład:
sub int pow(int exp)
…….
end sub
Inny niż powyższy format spowoduje błąd kompilacji.
(C30) liczba parametrów jest nieprawidłowa
Niepasująca liczba parametrów
(C31) nieprawidłowy typ parametrów
Niepasujący typ parametrów. Po wywołaniu funkcji typ danych i liczba parametrów powinny być zgodne z deklaracją funkcji, w przeciwnym razie spowoduje to błąd kompilacji.
(C32) niepoprawna zmienna
Parametry funkcji muszą być zgodne z zmiennymi przychodzącym do funkcji, aby uniknąć błędu kompilacji.
(C33) nazwa funkcji: funkcja niezadeklarowana
(C34) oczekiwane stałe wyrażenie
Niedozwolony format indeksu tablic.
(C35) niepoprawna deklaracja tablicy
(C36) błąd indeksu tablicy
(C37) niezadeklarowany zmienna: i
Każda zmienna lub funkcja powinna zostać zadeklarowana przed użyciem.
(C38) nieobsługiwany adres danych PLC
Parametr GetData (...), SetData (...) muszą się odwoływać do poprawnego adresu PLC. Jeśli adres jest nieobsługiwany wystąpi błąd kompilacji.
(C39) wartość musi być liczbą całkowitą, znakiem lub stałą
Format tablicy to:
Deklaracja: array_name[stała] (stała to rozmiar tablicy)
Użycie: array_name[zmienna całkowita, znak lub stała]
Inny niż powyższy format spowoduje błąd kompilacji.
(C40) funkcja zawierająca zmienne lub stałe nie może istnieć przed ich deklaracją
Przykład:
macro_command main( )
int a, b
for a = 0 To 2
b = 4 + a
int h , k // niedozwolone - definicje zmiennych muszą występować przed ich użyciem
// dla przykładu, b = 4 + a
next a
end macro_command
(C41) zmienne zmiennoprzecinkowe nie mogą być użyte w operacjach przesunięcia
(C42) funkcja musi zwrócić wartość
(C43) funkcja nie powinna zwracać wartości
(C44) zmienne zmiennoprzecinkowe nie mogą być zawarte w obliczeniach
(C45) błąd adresu PLC
(C46) przepełnienie rozmiaru tablicy (maks. 4k)
(C47) więcej niż jedno wyrażenie macro_command
(C48) funkcja wprowadzania poleceń makro może być tylko jedna
Składnia macro_comman może być użyta tylko raz:
macro_command function_name( )
end macro_command
(C49) numer stacji musi zawierać się między 0 a 255
Przykład:
SetData(bits[0] , “PLC 1”, LB , 300#123, 100)
// niedozwolone: 300#123, numer stacji to 300, a maksymalna wartość to 255
(C50) niepoprawna nazwa PLC
Nazwa PLC nie jest zdefiniowana na liście urządzeń.
(C51) program makro nie może sterować urządzeniem zdalnym
Program makro może odwoływać się tylko do lokalnego urządzenia.
Przykład:
SetData(bits[0] , “PLC 1”, LB , 300#123, 100)
“PLC 1“ jest podłączony do poprzez zdalny panel HMI, więc nie może działać.
18.13. Przykładowe programy makro
l Instrukcja "for" i inne wyrażenia (arytmetyczne, przesunięcie bitowe, logika i porównanie)
macro_command main()
int a[10], b[10], i
b[0] = (400 + 400 << 2) / 401
b[1] = 22 *2 - 30 % 7
b[2] = 111 >> 2
b[3] = 403 > 9 + 3 >= 9 + 3 < 4 + 3 <= 8 + 8 == 8
b[4] = not 8 + 1 and 2 + 1 or 0 + 1 xor 2
b[5] = 405 and 3 and not 0
b[6] = 8 & 4 + 4 & 4 + 8 | 4 + 8 ^ 4
b[7] = 6 – (~4)
b[8] = 0x11
b[9] = 409
for i = 0 to 4 step 1
if (a[0] == 400) then
GetData(a[0],”Device 1”, 4x, 0,9)
GetData(b[0],”Device 1”, 4x, 11,10)
end If
next i
end macro_command
l Pętle “while”, “if” i funkcja “break”
macro_command main()
int b[10], i
i = 5
while i == 5 - 20 % 3
GetData(b[1], ”Device 1”, 4x, 11, 1)
if b[1] == 100 then
break
end if
wend
end macro_command
l Zmienne globalne i wywołanie funkcji
char g
sub int fun(int j, int k)
int y
SetData(j, “Local HMI”, LB, 14, 1)
GetData(y, “Local HMI”, LB, 15, 1)
g = y
return y
end Sub
macro_command main()
int a, b, i
a = 2
b = 3
i = fun(a, b)
SetData(i, “Local HMI”, LB, 16, 1)
end macro_command
l Pętla “if”
macro_command main()
int k[10], j
for j = 0 to 10
k[j] = j
next j
if k[0] == 0 then
SetData(k[1], “Device 1”, 4x, 0, 1)
end if
if k[0] == 0 then
SetData(k[1], “Device 1”, 4x, 0, 1)
else
SetData(k[2], “Device 1”, 4x, 0, 1)
end if
if k[0] == 0 then
SetData(k[1], “Device 1”, 4x, 1, 1)
else if k[2] == 1 then
SetData(k[3], “Device 1”, 4x, 2, 1)
end If
if k[0] == 0 then
SetData(k[1], “Device 1”, 4x, 3, 1)
else if k[2] == 2 then
SetData(k[3], “Device 1”, 4x, 4, 1)
else
SetData(k[4], “Device 1”, 4x, 5, 1)
end If
end macro_command
l Pętla “while” i “wend”
macro_command main()
char i = 0
int a[13], b[14], c = 4848
b[0] = 13
while b[0]
a[i] = 20 + i * 10
if a[i] == 120 then
c =200
break
end if
i = i + 1
wend
SetData(c, “Device 1”, 4x, 2, 1)
end macro_command
l Funkcja “break” i “continue”
macro_command main()
char i = 0
int a[13], b[14], c = 4848
b[0] = 13
while b[0]
a[i] = 20 + i * 10
if a[i] == 120 then
c =200
i = i + 1
continue
end if
i = i + 1
if c == 200 then
SetData(c, “Device 1”, 4x, 2, 1)
break
end if
wend
end macro_command
l Tablice
macro_command main()
int a[25], b[25], i
b[0] = 13
for i = 0 to b[0] step 1
a[i] = 20 + i * 10
next i
SetData(a[0], “Device 1”, 4x, 0, 13)
end macro_command
18.14. Funkcja TRACE programu makro
Funkcja TRACE może być używana wraz z programem EasyDiagnoser, aby pokazać bieżącą zawartość zmiennych. Poniższy przykład ilustruje sposób użycia funkcji TRACE w makrze.
1. W pierwszym kroku należy utworzyć nowe makro "macro_0" w projekcie i dodać w nim funkcję TRACE ("LW =% d", a). "% D" wskazuje aktualną wartość zmiennej LW w formacie dziesiętnym. Program "macro_0" wygląda następująca:
2. W drugim kroku należy dodać obiekt numeryczny i funkcyjny w oknie nr. 10 projektu. Obiekt funkcyjny służy do wywołania makra_0.
3. Na koniec należy skompilować projekt i wykonać symulację On-line lub Off-line.
4. Podczas wykonywania symulacji na komputerze, kliknij prawym przyciskiem myszy i wybierz "Run EasyDiagnoser" w wyskakującym menu.
5. Następnie uruchomi się oprogramowanie EasyDiagnoser. Okno [Log] wyświetla, czy EasyDiagnoser może się połączyć z interfejsem HMI, w celu podglądu komunikacji, czy też nie. Okno [Odpowiedzi Makr] wyświetla dane wyjściowe funkcji TRACE. Poniższa ilustracja pokazuje, że EasyDiagnoser nawiązuje połączenie z HMI.
Kiedy EasyDiagnoser nie jest w stanie połączyć się z HMI, okno [Log] wyświetla komunikat, jak pokazano na poniższym rysunku:
6. Możliwą przyczyną braku możliwości połączenia się z interfejsem HMI może być błąd podczas wykonywania symulacji na komputerze. Innym powodem jest to, że numer portu używany w projekcie do symulacji na komputerze jest nieprawidłowy (lub zajęty przez system). Należy zmienić numer portu, jak pokazano poniżej, skompilować projekt, a następnie ponownie wykonaj symulację.
7. W programie EasyDiagnoser numer portu powinien być ustawiony tak samo, jak numer portu w projekcie.
Dla komunikacji HMI powinny być zarezerwowane trzy kolejne porty począwszy od numeru portu ustawionego w projekcie. W powyższym przykładzie, numer portu jest ustawiony, jako 8005. Port 8005, 8006 i 8007 powinny być zarezerwowane. W takim przypadku podczas wykonywania symulacji na komputerze należy upewnić się, że te porty nie są zajęte przez inne programy.
Składnia funkcji TRACE
|
Nazwa |
TRACE |
|
Składnia |
TRACE(format, argument) |
|
Opis |
Funkcja pozwala na wyświetlanie bieżącej wartości zmiennej w programie EasyDiagnoser. Użytkownicy mogą wysłać bieżącą wartość zmiennych podczas wykonywania makra w celu debugowania. Kiedy funkcja TRACE napotka pierwszą specyfikację formatu, (jeśli jest), konwertuje wartość pierwszego argumentu do odpowiedniego formatu i wysyła je do oprogramowania EasyDiagnoser. Format odnosi się do kontroli formatu ciągu wyjściowego. Specyfikacja formatu, która składa się z części opcjonalnych (w []) i wymaganych pól (pogrubionych), ma następującą formę: %[flaga] [szerokość] [.precyzja] type Każde z pól specyfikacji formatu opisano poniżej: flaga (opcjonalnie): - + szerokość (opcjonalnie): Nieujemna liczba dziesiętna kontrolująca minimalną liczbę wysyłanych znaków. precyzja (opcjonalnie): Nieujemna liczba całkowita dziesiętna, która określa precyzję i liczbę znaków do wysłania. typ: C lub c : określa znak jednobajtowy d : liczba dziesiętna ze znakiem i : liczba dziesiętna ze znakiem o : liczba ósemkowa bez znaku u : liczba dziesiętna bez znaku X lub x : liczba szesnastkowa bez znaku. E lub e : Wartość ze znakiem mająca postać. [ – ]d.dddd e [znak]ddd gdzie d jest pojedynczą cyfrą, dddd jest jedną cyfrą lub ciągiem cyfr, ddd jest dokładnie trzeba cyframi, a znakiem może być + lub –. f : Wartość ze znakiem mająca postać [ – ]dddd.dddd, gdzie dddd jest jedną cyfrą lub ciągiem cyfr.
Długość ciągu wyjściowego jest ograniczona do 256 znaków. Dodatkowe znaki będą zignorowane. Argument jest opcjonalny. Jedna specyfikacja formatu konwertuje dokładnie jeden argument. |
|
Przykład |
macro_command main() char c1 = ’a’ short s1 = 32767 float f1 = 1.234567
TRACE(“Wynikiem jest”) // wyjście: Wynikiem jest TRACE(“c1 = %c, s1 = %d, f1 = %f”, c1, s1, f1) // Wyjście: c1 = a, s1 = 32767, f1 = 1.234567
end macro_command |
8. Można użyć zmiennej LB-9059, aby wyłączyć funkcję TRACE (gdy jest w stanie ON). Po ustawieniu jej w stan ON komunikat wyjściowy TRACE nie zostanie wysłany do oprogramowania EasyDiagnoser.
9. Użytkownicy mogą bezpośrednio uruchamiać program EasyDiagnoser.exe z poziomy Utility manager. Po otwarciu EasyDiagnosera wyświetla się lista dostępnych paneli w sieci. Należy pamiętać, że port projektu powinien być taki sam jak numer portu ustawiony w programie.
10. Wgraj projekt do HMI i poczekaj, aż się uruchomi. Jeśli program EasyDiagnoser nie jest w stanie uzyskać połączenia z interfejsem HMI do podglądu komunikacji, możliwe jest, że zasilanie HMI nie jest włączone lub numer portu jest nieprawidłowy. Może to powodować, że EasyDiagnoser będzie się łączył i rozłączał z panelem HMI. Należy wtedy sprawdzić numer portu w ustawieniach oprogramowania EasyDiagnoser.
11. Gdy EasyDiagnoser nawiąże połączenie HMI, należy wywołać makro_0, okno [Odpowiedzi Mark] wyświetli wyjście funkcji TRACE.
18.15. Przykłady operacji na ciągach znaków String
Funkcje operacji na ciągach znaków String są dodawane do makr, aby zapewnić wygodny sposób ich obsługi. Termin "ciąg" oznacza sekwencję znaków ASCII, a każdy z nich zajmuje 1 bajt. Sekwencja znaków może być zapisana w rejestrach 16-bitowych przynajmniej na najmłodszym bajcie. Przykład: utwórz obiekt wejściowy ASCII i skonfiguruj go w następujący sposób:
Uruchom symulację i wprowadź “abcdef”:
Ciąg znaków “abcdef” będzie przechowywany w zmiennych LW-0~LW-2 jak poniżej (LB reprezentuje młodszy bajt, HB starszy bajt):
Obiekt ASCII odczytuje 1 słowo (2 bajty) w czasie opisanym w poprzednim rozdziale. Załóżmy, że obiekt wejściowy ASCII jest ustawiony na odczyt 3 słów, jak pokazano w powyższym przykładzie, może on faktycznie odczytać maksymalnie 6 znaków ASCII, ponieważ jeden znak ASCII zajmuje 1 bajt.
Zastosowanie każdej funkcji operacji na ciągach znaków String została opisana w poniższej tabeli:
| Nazwa funkcji | Opis |
| StringGet | Odczytuje znaki String z urządzenia |
| StringGetEx | Odczytuje znaki String z urządzenia i nie przerywa wykonywania kolejnych poleceń, nawet mimo braku odpowiedzi z urządzenia |
| StringSet | Zapisuje znaki String do urządzenia |
| StringSetEx | Zapisuje znaki String do urządzenia i nie przerywa wykonywania kolejnych poleceń, nawet mimo braku odpowiedzi z urządzenia |
| StringCopy | Kopiuje jeden ciąg znaków do drugiego |
| StringMid | Pobiera ciąg znaków |
| StringDecAsc2Bin | Konwertuje ciąg dziesiętny na liczbę całkowitą |
| StringBin2DecAsc | Konwertuje liczbę całkowitą na ciąg dziesiętny |
| StringDecAsc2Float | Konwertuje ciąg dziesiętny na liczbę zmiennoprzecinkowe |
| StringFloat2DecAsc | Konwetuje liczbę zmiennoprzecinkową na ciąg dziesiętny |
| StringHexAsc2Bin | Konwertuj ciąg szesnastkowy na dane binarne |
| StringBin2HexAsc | Konwertuj dane binarne na ciąg szesnastkowy |
| StringLength | Uzyskaj informacje o długości ciągu |
| StringCat | Dołącza ciąg źródłowy do zapisanego ciągu znaków |
| StringCompare | Porównuje dwa ciągi z rozróżnieniem wielkości liter |
| StringCompareNoCase | Porównuje dwa ciągi bez rozróżnienia wielkości liter |
| StringFind | Znajduje wskazany fragment ciągu w dłuższym ciągu rozpoczynając poszukiwania od lewej strony |
| StringReverseFind | Znajduje wskazany fragment ciągu w dłuższym ciągu rozpoczynając poszukiwania od prawej strony |
| StringFindOneOf | Znajduje pierwszy pasujący znak z zestawu |
| StringIncluding | Wyodrębnia ciąg zawierający tylko znaki z zestawu |
| StringExcluding | Wyodrębnia ciąg nie zawierający znaków z zestawu |
| StringToUpper | Konwertuje znaki ciągu na wielkie litery |
| StringToLower | Konwertuje znaki ciągu na małe litery |
| StringToReverse | Zmienia wielkość liter w ciągu |
| StringTrimLeft | Przycina określone znaki początkowe w ciągu źródłowym |
| StringTrimRight | Przycina określone znaki końcowe w ciągu źródłowym |
| StringInsert | Wstaw ciąg znaków w określonej lokalizacji w obrębie innego ciągu |
1. Aby odczytać, lub zapisać ciąg znaków z urządzenia:
Utwórz nowe makro:
Wpisz zawartość programu:
Pierwsza funkcja “StringGet” jest używana do odczytania ciągu znaków zapisanego na zmiennych LW-0~LW-19, i zapisania go do tablicy str. Druga funkcja “StringSet” jest używana do zapisu tabeli ciągu znaków do zmiennych LW.
Dodaj jeden
obiekt ASCII i przycisk
funkcyjny na oknie 10 w projekcie. Ustawienia tych obiektów pokazano poniżej. Przycisk funkcyjny służy do wywołania programu makro.
Na końcu, użyj
[Kompiluj], aby skompilować projekt, a następnie wywoła
[Symulację Off-line] lub
[Symulację On-line]. Wykonaj poniższe kroki, aby obserwować działanie projektu:
Step 1. Wprowadź ciąg znaków string.
Step 2. Naciśnij przycisk “GO”.
Step 3. Obserwuj wyjściowy ciąg znaków string.
2. Inicjalizacja ciągu znaków string.
Utwórz nowe makro i napis następujący program:
Dane ujęte w podwójny cudzysłów ("") są wyświetlane, jako ciąg znaków. Tabela str1 jest inicjalizowana, jako ciąg znaków, podczas gdy tabela str2 jest inicjowana, jako tablica znaków. Poniższy zrzut z symulacji pokazuje różnicę między tablicą str1 i str2 przy użyciu dwóch obiektów wejściowych ASCII.
Kompilator programu makro doda końcowy pusty znak ("\ 0") na końcu ciągu. Funkcja "StringSet" będzie wysyłać każdy znak str1 do rejestrów, dopóki nie zostanie osiągnięty pusty znak. Dodatkowe znaki następujące po pustym znaku zostaną zignorowane, nawet, jeśli liczba danych zostanie ustawiona na większą wartość niż długość ciągu.
Dla tablicy str2 funkcja zachowa się wręcz przeciwnie, kompilator programu makro nie doda kończącego pustego znaku ("\ 0") na końcu tablicy znaków. Faktyczna liczba znaków str2 wysyłanych do rejestrów zależy od wartości liczby danych przekazywanych do funkcji "StringSet".
3. Prosta strona logowania
Utwórz nowe makro i napisz program według wzoru poniżej, na przykład Makro [ID: 001] makro_0.
Pierwsze dwie funkcje "StringGet" będą odczytywać ciągi znaków wprowadzane przez użytkowników i przechowywać je oddzielnie w tablicach o nazwie name_input i password_input. Przy użyciu funkcji "StringCompare", zostanie sprawdzone, czy wprowadzana nazwa konta i hasło są takie same. Jeśli nazwa konta jest taka sama, zmienna name_match jest ustawiona w stan ON; jeśli hasło jest dopasowane, zmienna password_match zostanie również ustawiona w stan ON. Jeśli obie zmienne name_match i password_match są w stanie ON, zostanie utworzony ciąg wyjściowy o treści " Sukces! Access Accepted.". W przeciwnym razie zawartość ciągu będzie następująca " Fail! Access Denied.".
Dodaj obiekt ASCII
ASCII i przycisk
funkcyjny na oknie 10 w projekcie. Ustawienia tych obiektów pokazano poniżej. Przycisk funkcyjny służy do wywołania programu macro_0.
Wybierz opcję [Wywołaj makro] i wybierz z listy: [ID:000] macro_0.
Na końcu, użyj
[Kompiluj], aby skompilować projekt, a następnie wywoła 
[Symulację Off-line] lub
[Symulację On-line]. Wykonaj poniższe kroki, aby obserwować działanie projektu:
Step 1. Wprowadź nazwę użytkownika.
Step 2. Wprowadź hasło i naciśnij przycisk [Login].
Step 3. W zależności od wprowadzenia poprawne hasło lub niepoprawnego operacja powiedzie się lub nie, jak pokazano poniżej.
18.16. Zabezpieczenie programu marko hasłem
W oknie z listą programów MAKRO znajduje się opcja [Ustaw hasło]. Po naciśnięciu przycisku pojawia się okno dialogowe, w którym możemy wybrać opcję [Ochrona hasłem], aby ustawić hasło nie dłuższe niż 10 znaków (obsługuje tylko znak ASCII, np. "A $ # * hFds").
Po ustawieniu hasła, użytkownik będzie musiał wprowadzić poprawne hasło podczas otwierania okna edycji programu MACRO. Po 3 nieudanych próbach wprowadzenia hasła należy ponownie uruchomić program EasyBuilder Pro.
n Gdy program MAKRO jest chroniony hasłem, nie będzie możliwości przywrócenia jego zawartości poprzez dekompilację pliku EXOB.


















































































































































































































No comments to display
No comments to display