Skip to main content

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-1

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.

image.png

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.

image.png

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.

image.png

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).

image.png

5.        Zaznacz słowo w edytorze, aby kopiować lub wyciąć. Po wykonaniu polecenia kopiuj lub wytnij włączona zostaje funkcja wklej.

image.png

6.       Użyj opcji zaznacz wszystko, aby zaznaczyć całą treść w obszarze edycji.

image.png

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.

image.png

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.

image.png

9.       Aby rozwinąć wszystkie zwinięte kody można nacisnąć prawym przyciskiem i wybrać opcję rozwiń wszystkie zwinięcia.

image.png

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.

image.png

12.    Edytor makro pozwala na wykorzystanie funkcji znajdź i zamień.

image.png

13.     Gdy zaznaczone jest opcja wykonywanie cykliczne, makro jest  uruchomiane okresowo.

image.png

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.

image.png

image.png

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ę:

image.png

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-9

18.5.    Wyrażenia

18.5.1. Definicja zmiennych

Definicja zmiennych i tablic - składnia jest następująca:

image.png

Określa zmienną o nazwie "nazwa" i typie "typ".

Przykład:

int A                        // definicja zmiennej integer o nazwie A

image.png

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.

image.png

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

image.png

Przykład:

if a == 2 then

                               b = 1

else

                               b = 2

end if

Format blokowy

image.png

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

image.png

Przykład:

                    Select Case A

                               Case 1

                                           b=1

                               break

                    end Select

Format z domyślnym przypadkiem (Case else)

image.png

Przykład:

                    Select Case A

                               Case 1

                                           b=1

                               break

                               Case else

                                           b=0

                               break

                    end Select

Wiele przypadków w tym samym bloku

image.png

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:

image.png
Or

image.png

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.

image.png

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-14

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

image.png

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

image.png

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-19

18.7.   Zaimplementowane bloki funkcyjne

EasyBuilder Pro ma wiele wbudowanych funkcji, które można wykorzystać w programie makra.

18.7.1. Funkcje matematyczne

image.pngimage.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

 

18.7.2. Konwersja formatu danych

 

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

 

18.7.3. Operacje na zmiennych

 

image.png

image.png

image.png

image.png

image.png

image.png

image.png

 

18.7.4. Operacje na bitach

 

image.png

image.png

image.png

image.png

 

18.7.5. Komunikacja

 

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.pngimage.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

18.7.6. Operacje na ciągach znaków


image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

 

18.7.7. Zapytania do receptur

image.png

image.png

image.png

image.png

image.png

 

18.7.8. Różne

 

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

 

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ę image.png [Marka] na pasku narzędzi w programie EasyBuilder Pro, aby otworzyć okno dialogowe z listą makr jak pokazano poniżej.

 

image.png

 

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.

image.png

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.

image.png

4.        Po napisaniu nowego makra naciśnij przycisk [Zapisz i Kompiluj], aby skompilować makro.

 

image.png

 

5.        Jeśli nie ma błędów, naciśnij przycisk [Wyjście], nowe makro "macro_0" pojawi się liście makr.

image.png

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.

image.png

image.png

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ć.

image.png

18.9.2. Jak używać biblioteki funkcji makro

1.        Należy wskazać funkcję z biblioteki funkcji.

 

image.png

 

2.        W edytorze makr należy nacisnąć przycisk funkcje.

 

image.png

 

3.        Następnie należy zaznaczyć opcję wbudowane lub biblioteki funkcji.

 

image.png

4.        Opis wyświetlany w oknie dialogowym jest taki sam jak ten napisany w edytorze funkcji.

image.png

 

5.        Wybierz funkcję, która ma być używana, wpisz odpowiednie zmienne zgodnie z typem danych.

image.png

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].

image.png

2.        Zostanie wyświetlona lista funkcji. Po otwarciu projektu oprogramowanie załaduje wszystkie funkcje do biblioteki funkcji makr..

image.png

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.

image.png

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.

image.png

18.9.3.1. Tworzenie funkcji

1.        Naciśnij [Nowe], aby wejść do Edytora funkcji.

image.png

2.        Utwórz nową funkcję w edytorze funkcji.

image.png

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..

image.png

5.        Z powodzeniem dodano nową funkcję do biblioteki funkcji makr.

image.png

 

image.pngUwaga

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ń].

image.png

2.        Naciśnij [Tak], aby potwierdzić, lub [Nie], aby anulować akcję. Po naciśnięciu [Tak] funkcja „unsigned short odczyt” zostanie usunięta.

image.png

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.

image.png

3.        Również poprzez dwukrotne kliknięcie funkcji można wejść do Edytora funkcji.

 

image.png

 

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.

image.png

2.        Dla przykładu zaimportujemy bibliotekę “math.mlb”, która zawiera kilka funkcji. Naciśnij [Otwórz].

 

image.png

 

3.        Podczas importowania, gdy dana funkcja już istnieje w Bibliotece, pojawi się okno z komunikatem. Są następujące opcje:

image.png

[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.

image.png

 

18.9.3.5. Eksport funkcji

1.        Wyeksportuj funkcję z biblioteki funkcji i zapisz w plik o formacie .mlb. Naciśnij [Eksportuj].

image.png

2.        Wybierz, które funkcje mają być wyeksportowane i naciśnij [Eksportuj].

image.png

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

image.png

. 18-85

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-99

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:

 

image.png

    

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:

image.png

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).

image.png

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:

image.png

Następnie należy użyć polecenia OUPORT, aby wysłać żądanie odczytu do PLC

image.png

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:

image.png

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.

image.png

Pełny program makro wygląda następująco:

image.png

W poniższym przykładzie wyjaśniono, jak napisać program zmieniający stan zmiennej 0x_1. Program wykorzystuje funkcję "Write Single Coil (0x5)".

image.png

Pełny program makro wygląda następująco:

image.png

 

.. 18-99

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-104

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-110

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:

image.png

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.

image.png

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.

image.png

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.

image.png

Kiedy EasyDiagnoser nie jest w stanie połączyć się z HMI, okno [Log] wyświetla komunikat, jak pokazano na poniższym rysunku:

image.png

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ę.

image.png

7.        W programie EasyDiagnoser numer portu powinien być ustawiony tak samo, jak numer portu w projekcie.

image.png

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.

 

image.png

 

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.

image.png

 

. 18-115

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:

image.png

Uruchom symulację i wprowadź “abcdef”:

image.png

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):

image.png

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:

 

image.png

 

Wpisz zawartość programu:

image.png

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  image.png obiekt ASCII i przycisk image.png funkcyjny na oknie 10 w projekcie. Ustawienia tych obiektów pokazano poniżej. Przycisk funkcyjny służy do wywołania programu makro.

 

 

image.png obiekty ASCII:

image.png

 

image.png przycisk funkcyjny:

image.png

 

Na końcu, użyj  image.png [Kompiluj], aby skompilować projekt, a następnie wywoła  image.png [Symulację Off-line] lub image.png [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”.

image.png

Step 3.        Obserwuj wyjściowy ciąg znaków string.

image.png

2.        Inicjalizacja ciągu znaków string.

Utwórz nowe makro i napis następujący program:

image.png

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.

image.png

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.

image.png

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   image.png ASCII i przycisk  image.png funkcyjny na oknie 10 w projekcie. Ustawienia tych obiektów pokazano poniżej. Przycisk funkcyjny służy do wywołania programu macro_0.

image.png

Obiekt 1: Przycisk funkcyjnyimage.png

Wybierz opcję [Wywołaj makro] i wybierz z listy: [ID:000] macro_0.

image.png

Obiekt 2: obiekt ASCIIimage.png

 

image.png

Obiekt 3: obiekt ASCIIimage.png

 

image.png

image.png

Object 4: obiekt ASCIIimage.png

 

image.png

 

Na końcu, użyj  image.png [Kompiluj], aby skompilować projekt, a następnie wywoła  image.png

[Symulację Off-line] lub image.png [Symulację On-line]. Wykonaj poniższe kroki, aby obserwować działanie projektu:

 

Step 1.   Wprowadź nazwę użytkownika.

image.png

Step 2.   Wprowadź hasło i naciśnij przycisk [Login].

image.png

Step 3.   W zależności od wprowadzenia poprawne hasło lub niepoprawnego operacja powiedzie się lub nie, jak pokazano poniżej.

 

image.png

 

18.16.   Zabezpieczenie programu marko hasłem

image.png

image.png

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.

image.png

 

image.png Uwaga

n   Gdy program MAKRO jest chroniony hasłem, nie będzie możliwości przywrócenia jego zawartości poprzez dekompilację pliku EXOB.

 

. 18-119

 

 

 

   18-127