16.06.2015 Views

ForthLogic inst prog H P.1.2 120113.pdf - F&F

ForthLogic inst prog H P.1.2 120113.pdf - F&F

ForthLogic inst prog H P.1.2 120113.pdf - F&F

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

F&F Filipowski sp.j.<br />

ul. Konstantynowska 79/81<br />

95‐200 Pabianice<br />

tel/fax 42‐2152383, 2270971<br />

e‐mail: 0Hfif@fif.com.pl<br />

www.fif.com.pl<br />

Programowanie sterowników serii H<br />

w języku<br />

<strong>ForthLogic</strong><br />

Wersja dokumentu P.1<br />

Wersja dokumentu P.2.1<br />

v120113<br />

przeznaczona dla<br />

hardware:<br />

wersja 5.1<br />

firmware:<br />

01.16(D) dla H01<br />

01.15(GII) dla H02<br />

01.15(D) dla H03<br />

04.50 dla H04<br />

www.plcmax.pl


Sterowniki <strong>prog</strong>ramowalne MAX Logic<br />

‐ 2 ‐


Instrukcja <strong>prog</strong>ramowania w języku <strong>ForthLogic</strong> wersja <strong>P.1.2</strong><br />

SPIS TREŚCI<br />

1. WSTĘP ............................................................................................................................................................................ ‐ 5 ‐<br />

2. MODEL PROGRAMISTYCZNY ............................................................................................................................................ ‐ 5 ‐<br />

2.1 SŁOWA ............................................................................................................................................................................ ‐ 5 ‐<br />

2.2 STOSY ............................................................................................................................................................................. ‐ 6 ‐<br />

2.3 ZMIENNE ........................................................................................................................................................................ ‐ 6 ‐<br />

2.4 BUFOR WEJŚCIOWY I WYJŚCIOWY ................................................................................................................................. ‐ 7 ‐<br />

3. PRACA W TRYBIE DIALOGOWYM ................................................................................................................................... ‐ 7 ‐<br />

3.1 TRYBY PRACY DIALOGOWEJ ........................................................................................................................................... ‐ 7 ‐<br />

3.2 PRACA W TRYBIE TERMINALOWYM ............................................................................................................................... ‐ 7 ‐<br />

3.3 HYPERTERMINAL ‐ KONFIGURACJA PROGRAMU ........................................................................................................... ‐ 8 ‐<br />

3.4 NOTEPAD++PUTTY ‐ INTERAKTYWNE ŚRODOWISKO PROGRAMOWANIA W JĘZYKU FORTHLOGIC ..................................................... ‐ 11 ‐<br />

4. ELEMENTY JĘZYKA FORTHLOGIC .................................................................................................................................. ‐ 11 ‐<br />

4.1 STOS DANYCH I STOS MATEMATYCZNY .......................................................................................................................‐ 11 ‐<br />

4.2 DZIAŁANIA ARYTMETYCZNE .........................................................................................................................................‐ 14 ‐<br />

4.3 DEFINIOWANIE NOWYCH SŁÓW ..................................................................................................................................‐ 15 ‐<br />

4.4 STAŁE, ZMIENNE I WIERSZE ..........................................................................................................................................‐ 17 ‐<br />

4.4.1 Stałe ................................................................................................................................................................ ‐ 18 ‐<br />

4.4.2 Zmienne .......................................................................................................................................................... ‐ 18 ‐<br />

4.4.3 Zmienne wierszowe i formatowanie tekstu .................................................................................................... ‐ 19 ‐<br />

4.4 OPERACJE LOGICZNE ...................................................................................................................................................‐ 21 ‐<br />

4.5 STRUKTURA STEROWANIA........................................................................................................................................... ‐ 22 ‐<br />

4.6 TIMERY I WIELOZADANIOWOŚĆ ..................................................................................................................................‐ 23 ‐<br />

4.7 WYKONANIA WEKTOROWE .........................................................................................................................................‐ 25 ‐<br />

4.8 PRACA Z HARDWARE ...................................................................................................................................................‐ 26 ‐<br />

4.8.1 Status WEJŚĆ/WYJŚĆ ................................................................................................................................. ‐ 26 ‐<br />

4.8.2 Blokada dostępu do systemu .......................................................................................................................... ‐ 27 ‐<br />

4.8.3 Wejścia ............................................................................................................................................................ ‐ 27 ‐<br />

4.8.4 Wyjścia ............................................................................................................................................................ ‐ 28 ‐<br />

4.8.5 Port komunikacyjny RS‐485 i protokół komunikacyjny MODBUS RTU ........................................................... ‐ 29 ‐<br />

4.9 PARAMETRY SYSTEMU .................................................................................................................................................‐ 34 ‐<br />

4.9.1 Wznowienie pracy systemu ............................................................................................................................ ‐ 34 ‐<br />

4.9.2 Uruchomienie aplikacji.................................................................................................................................... ‐ 34 ‐<br />

4.9.3 Zasilanie .......................................................................................................................................................... ‐ 35 ‐<br />

4.9.4 Zegar systemowy ............................................................................................................................................ ‐ 35 ‐<br />

4.9.5 Rejestracja danych .......................................................................................................................................... ‐ 37 ‐<br />

‐ 3 ‐


Sterowniki <strong>prog</strong>ramowalne MAX Logic<br />

4.9.6 Dźwięk ............................................................................................................................................................. ‐ 40 ‐<br />

4.9.7 Kalibracja wartości wejściowych dla sterowników typu H01 i H02 ................................................................... ‐ 41 ‐<br />

4.10 INTERFEJS UŻYTKOWNIKA ......................................................................................................................................... ‐ 41 ‐<br />

4.10.1 Menu bloku „Funkcje dodatkowe” (dla sterowników typu H03 i H04) ......................................................... ‐ 41 ‐<br />

4.10.2 Klawiatura (dla sterowników typu H03 i H04) ............................................................................................... ‐ 42 ‐<br />

4.10.3 Wyświetlacz (dla sterowników typu H03 i H04) ............................................................................................ ‐ 43 ‐<br />

4.10.4 Okno parametryzacji (widżet)........................................................................................................................ ‐ 44 ‐<br />

4.11 KOMUNIKACJA GSM .................................................................................................................................................. ‐ 45 ‐<br />

4.11.1 Sieć GSM ........................................................................................................................................................ ‐ 45 ‐<br />

4.11.2 Połączenia głosowe ........................................................................................................................................ ‐ 45 ‐<br />

4.11.3 Operatorskie menu głosowe (IVR) i funkcja DTMF ........................................................................................ ‐ 48 ‐<br />

4.11.4 Numery telefonów ......................................................................................................................................... ‐ 51 ‐<br />

4.11.5 SMS ................................................................................................................................................................ ‐ 51 ‐<br />

4.11.6 Konfiguracja funkcji zdalnego sterowania ....................................................................................................... ‐ 54 ‐<br />

4.12 MIKROFON I WYJŚCIE GŁOŚNIKOWE (H04) ................................................................................................................ ‐ 54 ‐<br />

5. WCZYTANIE I URUCHOMIENIE APLIKACJI (PROGRAMU W JĘZYKU FORTHLOGIC) ....................................................... ‐ 55 ‐<br />

5.1 DLA WSZYSTKICH TYPÓW STEROWNIKÓW ................................................................................................................. ‐ 55 ‐<br />

5.2 DODATKOWY SPOSÓB DLA STEROWNIKÓW TYPU H03 I H04 ...................................................................................... ‐ 57 ‐<br />

6. TWORZENIE APLIKACJI W JĘZYKU FORTHLOGIC ........................................................................................................... ‐ 57 ‐<br />

6.1 PROGRAMY DO TWORZENIA APLIKACJI ...................................................................................................................... ‐ 57 ‐<br />

6.2 ZASADY TWORZENIA APLIKACJI .............................................................................................................................. ‐ 58 ‐<br />

7. TWORZENIE PLIKÓW DZWIĘKOWYCH .......................................................................................................................... ‐ 65 ‐<br />

8. TABELA ZASOBÓW PROGRAMOWYCH ......................................................................................................................... ‐ 65 ‐<br />

9. KOMUNIKATY BŁĘDÓW ............................................................................................................................................... ‐ 65 ‐<br />

10. SPIS SŁÓW JĘZYKA FORTHLOGIC ................................................................................................................................. ‐ 66 ‐<br />

11. WNIESIONE ZMIANY ................................................................................................................................................... ‐ 71 ‐<br />

‐ 4 ‐


Instrukcja <strong>prog</strong>ramowania w języku <strong>ForthLogic</strong> wersja <strong>P.1.2</strong><br />

1. WSTĘP<br />

Język <strong>prog</strong>ramowania Forth (ang. forth [do przodu, dalej] i jednocześnie skrót od fourth [czwarty]), który leży u podstaw<br />

języka <strong>ForthLogic</strong>, pojawił się na początku lat 70 w USA. Jego twórca, Charles Moore, na początku zastosował go do<br />

opracowania o<strong>prog</strong>ramowania do małej elektronicznej maszyny liczącej, która kierowała pracą radioteleskopu. Zalety<br />

pracy z językiem Forth były tak duże, że już wkrótce zaczęto go wykorzystywać do pracy z innymi wyspecjalizowanymi<br />

elektronicznymi maszynami liczącymi.<br />

Efektywność zastosowania języka Forth potwierdza fakt, że jest on wykorzystywany przez gigantów przemysłu: korporacja<br />

Boeing stosuje wbudowany interpretator języka Forth w systemie awioniki (wyposażenia pokładowego) samolotu Boeing<br />

777; korporacja Tektronix wykorzystuje język Forth dla serii analizatorów protokołów sieciowych K1297 i K1205;<br />

korporacja Lockheed Martin wykorzystuje język Forth w wyposażeniu pokładowym naziemnego systemu telemetrycznego<br />

SMART do rakiety balistycznej Trident 2 D5; korporacja FedEx wykorzystuje ręczny czytnik kodów kreskowych<br />

SuperTracker z wbudowanym Forth‐systemem w swoim elektronicznym systemie kontroli przesyłek COSMOS II;<br />

korporacja General Electric wykorzystuje język Forth w serii przełączników SONET JungleMUX; korporacja Europay<br />

wykorzystuje język Forth przy tworzeniu o<strong>prog</strong>ramowania do uniwersalnych terminali kasowych i czytników kart smart z<br />

architekturą Open Terminal Architecture (OTA); korporacja Sun Microsystems od 1989 r. wykorzystuje <strong>prog</strong>ram ładujący<br />

OpenBoot (<strong>prog</strong>ram typu BIOS) z wbudowanym interpretatorem języka Forth w swoich komputerach SparcStation i<br />

serwerach SPARCServer; a korporacja Apple Inc. wykorzystuje analogiczny <strong>prog</strong>ram Open Firmware w swoich<br />

komputerach Power Macintosh. Poza tym język Forth jest standardowym językiem sterowania teleskopów – zarówno na<br />

ziemi, jak i w kosmosie.<br />

2. MODEL PROGRAMISTYCZNY<br />

Za realizację zadań i interpretację <strong>prog</strong>ramu w języku <strong>ForthLogic</strong> odpowiedzialny jest system sprzętowo‐<strong>prog</strong>ramistyczny<br />

zwany forth‐systemem. Model obliczeniowy leżący u podstaw języka <strong>ForthLogic</strong> składa się ze stosów, globalnych<br />

zmiennych, słownika, buforu wejściowego i buforu wyjściowego. Język <strong>ForthLogic</strong> pozwala opisywać procesy<br />

przebiegające równolegle i funkcjonuje w środowisku wielozadaniowym.<br />

2.1 SŁOWA<br />

Jest to grupa rozkazów o określonym działaniu. Każdy rozkaz – zwany dalej słowem, składa się z ciągu znaków (bez spacji).<br />

Długość słowa jest ograniczona do 14 znaków. Program napisany w języku <strong>ForthLogic</strong> to sekwencja słów i odpowiednich<br />

wartości będących parametrami wykonawczymi tych słów. Słowa są oddzielane spacją. Modelem obliczeniowym forthsystemu<br />

jest tzw. maszyna stosowa. Słowa zdejmują niezbędne operandy ze stosu i kładą swoje wyniki na tymże stosie,<br />

jeżeli są. W forth‐systemie określono relatywnie nieduży zestaw „standardowych” słów. Wśród nich są słowa, pozwalające<br />

definiować nowe poprzez już istniejące i w ten sposób poszerzać początkowy zestaw słów w wymaganym dla danego<br />

zadania kierunku.<br />

Spośród słów standardowych, ze względu na specjalny sposób działania, stosowania lub sposób ich kompilacji z innymi<br />

słowami możemy wyodrębnić dodatkowe dwie podgrupy: słowa pomocnicze i słowa wywoławcze.<br />

Słowa pomocnicze ‐ jest to grupa słów, możliwych do zastosowania tylko podczas pracy dialogowej, czyli podczas<br />

bezpośredniego połączenia sterownika z komputerem (MAX‐PC). Nie mogą one być wykorzystane w aplikacji (po prostu<br />

ich działanie nie ma praktycznego zastosowania i nie są one wykonywane w ogóle). Służą użytkownikowi jedynie przy<br />

nauce <strong>prog</strong>ramowania, rozwiązywaniu zadań <strong>prog</strong>ramistycznych lub rozwiązywaniu zaistniałych problemów w pracy<br />

sterownika. Pozwalają na odszukiwanie, przywoływanie i poznawanie odpowiednich wartości lub elementów stosów dla<br />

analizy pracy poszczególnych słów standardowych i zdefiniowanych oraz rozwiązywania problemów części lub całego<br />

<strong>prog</strong>ramu. Również dla dalszego ich wykorzystania. Słowa te mogą być zestawiane z innymi słowami standardowymi w<br />

krótkich blokach <strong>prog</strong>ramowych pisanych bezpośrednio na terminalu lub mogą być podane samodzielnie w nowej linii i<br />

bezpośrednio wykonywane.<br />

Słowa wywoławcze ‐ jest to grupa słów standardowych wyróżnionych ze względu na sposób ich kompilacji z innymi<br />

słowami. Bezpośrednio po takim słowie może znaleźć się tylko inne słowo lub słowa jako wymagane parametry<br />

wykonawcze (nazywane w nomenklaturze <strong>prog</strong>ramistycznej callback), natomiast nie mogą zostać podane jakiekolwiek<br />

‐ 5 ‐


Sterowniki <strong>prog</strong>ramowalne MAX Logic<br />

wartości wprowadzane na stos lub do bufora wejściowego. Może to być jakiekolwiek słowo znane forth‐systemowi,<br />

standardowe lub zdefiniowane. Jeżeli zachodzi potrzeba użycia słowa, które wymaga podania wartości ze stosu lub z<br />

bufora wyjściowego jako parametrów wykonawczych tego słowa, to należy uprzednio zdefiniować nowe słowo<br />

zawierające wymagane słowa oraz wprowadzające na stos odpowiednie wartości i realizujące wymagane funkcje.<br />

Stałe systemowe ‐ są to specjalne słowa, które mają przypisane pewne wartości. Mają na celu ułatwić pracę nad<br />

zadaniami <strong>prog</strong>ramistycznymi. Stałych tych nie można przedefiniować.<br />

Rozkazy systemowe ‐ jest to grupa specjalnych rozkazów możliwych do wykonania tylko podczas pracy dialogowej<br />

terminalowej. W odróżnieniu od standardowych słów ich nazwy są dwuczłonowe. Rozkazów systemowych nie można<br />

wykorzystywać w aplikacji (forth‐system zwróci je jako błąd). Nie mogą być zestawiane z innymi słowami. Rozkaz musi być<br />

samodzielnie podany w nowej linii i wykonany (bez poprzedzających spacji). W obecnej wersji <strong>prog</strong>ramowej istnieją trzy<br />

rozkazy systemowe: BUILD DICTIONARY, COMPILE FILE, RECIVE FILE, SHOW STATUS, HIDE STATUS i RESTORE DEFAULTS.<br />

Zestaw wszystkich słów standardowych i stałych systemowych wraz ze skróconym opisem działania oraz ich klasyfikację<br />

przedstawiono w tabeli w rozdziale 10.<br />

2.2 STOSY<br />

Stos danych znajduje się w pamięci operacyjnej i jest wykorzystywany do przekazania parametrów i wyników między<br />

słowami wykonywanymi w ramach jednego zadania. Składa się z elementów o wartościach czterobajtowych, które są<br />

rozpatrywane jako liczby całkowite ze znakiem (+/‐) w zakresie ‐2147483648 ÷ +2147483647. W procesie wykonywania<br />

słów wartości są umieszczane na stosie i zdejmowane z niego. Ilość elementów na stosie jest kontrolowana, a<br />

przepełnienie stosu jest zgłaszane jako błąd. Maksymalna wielkość stosu to 16 elementów.<br />

Stos matematyczny znajduje się w pamięci operacyjnej i wykorzystuje się dla matematycznych obliczeń z wykorzystaniem<br />

liczb rzeczywistych. Składa się z elementów o wartościach czterobajtowych, które są rozpatrywane jako liczby<br />

zmiennoprzecinkowe zgodnie ze standardem IEEE‐754 i przyjmować mogą wartości z zakresu ±(1.4E‐45...3.4E+38). W<br />

trakcie wykonania operacji matematycznych z wykorzystaniem liczb zmiennoprzecinkowych, wartości ich umieszczane są<br />

na stosie matematycznym i zdejmowane z niego. Ilość elementów na stosie jest kontrolowana, a przepełnienie stosu jest<br />

zgłaszane jako błąd. Maksymalna wielkość stosu to 16 elementów.<br />

Stos powrotu służy do tymczasowego przechowywania adresów i niektórych informacji roboczych. Podczas wykonania<br />

niektórych zadań, np. definiowania nowego słowa. Stan stosu jest sprawdzany, a przepełnienie jest sygnalizowane jako<br />

błąd.<br />

2.3 ZMIENNE<br />

Zmienne globalne ‐ zwane dalej zmiennymi, są zwykłymi zmiennymi statycznymi przechowywanymi w pamięci<br />

operacyjnej. Ich elementy mają wartości czterobajtowe i są rozpatrywane jako liczby całkowite. Zmienne globalne z reguły<br />

są wykorzystywane do przekazywania parametrów i wyników między słowami wykonywanymi w różnych zadaniach lub<br />

do długoterminowego przechowywania parametrów i wyników w ramach jednego zadania.Liczbę zmiennych globalnych<br />

dla danej wersji sterownika określa parametr D_MAX.<br />

Zmienne matematyczne ‐ są zmiennoprzecinkowymi zmiennymi statycznymi przechowywanymi w pamięci operacyjnej.<br />

Ich elementy mają wartości czterobajtowe i są rozpatrywane jako liczby zmiennoprzecinkowe zgodnie ze standardem<br />

IEEE‐754. Zmienne matematyczne są wykorzystywane do przekazywania matematycznych wartości i wyników obliczeń.<br />

Liczbę zmiennych matematycznych dla danej wersji sterownika określa parametr F_MAX.<br />

Zmienne bitowe – są elementami jednobitowymi, które przyjmują znaczenie 0 lub 1. Przechowywane są w pamięci<br />

operacyjnej. Zmienne bitowe wykorzystuje się jako flagi i służą do budowania wewnątrz<strong>prog</strong>ramowej logiki potrzebnej do<br />

kierowania określonym zadaniem. Liczbę zmiennych bitowych dla danej wersji sterownika określa parametr B_MAX.<br />

Zmienne wierszowe – są ciągami dowolnych znaków. Przechowywane są w pamięci operacyjnej. Ich elementami są<br />

jednobajtowe znaczenia, które przedstawiają kody znaków. Zmienne wierszowe są przeznaczone dla operacyjnego<br />

przechowywania tekstów o długości do 14 znaków. Liczbę zmiennych wierszowych dla danej wersji sterownika określa<br />

parametr S_MAX.<br />

‐ 6 ‐


Instrukcja <strong>prog</strong>ramowania w języku <strong>ForthLogic</strong> wersja <strong>P.1.2</strong><br />

2.4 BUFOR WEJŚCIOWY I WYJŚCIOWY<br />

Bufory wejściowy i wyjściowy są to statyczne bufory pamięciowe, które znajdują się w pamięci operacyjnej. Składają się z<br />

ciągów elementów o wartościach jednobajtowych, które przedstawiają kody znaków. Bufor wejściowy i wyjściowy służy<br />

do tymczasowego przechowywania i bezpośredniego wykorzystania danych wierszowych. Można je praktycznie określić<br />

jako stos jednego elementu (w tym przypadku ciągu znaków, czyli tekstu). Rozmiar bufora (liczbę znaków) dla danej wersji<br />

sterownika określa parametr OUTBUF_MAX.<br />

3. PRACA W TRYBIE DIALOGOWYM<br />

3.1 TRYBY PRACY DIALOGOWEJ<br />

Bezpośrednią pracę z systemem sterownika nazywamy trybem dialogowym. Wyróżniamy dwa typy pracy dialogowej:<br />

terminalowy i zdalny.<br />

‐ tryb terminalowy to praca ze specjalnym <strong>prog</strong>ramem komputerowym, za pomocą którego użytkownik komunikuje się z<br />

sterownikiem (połączenie MAX‐PC przewodem USB). Program taki posiada tzw. okno terminalu, w którym użytkownik, za<br />

pomocą klawiatury komputera może wprowadzać słowa i rozkazy systemowe języka <strong>ForthLogic</strong>, a forth‐system<br />

bezpośrednio je analizuje i wykonuje, zwrotnie podając informacje o poprawności wykonania lub błędzie. Tryb<br />

terminalowy przede wszystkim wykorzystujemy przy nauce <strong>prog</strong>ramowania, rozwiązywaniu zadań <strong>prog</strong>ramistycznych lub<br />

rozwiązywaniu zaistniałych problemów w pracy sterownika.<br />

‐ tryb zdalny ‐ tylko dla sterowników z modułem GSM ‐ to praca sterownika z telefonem za pośrednictwem SMSów. W<br />

trybie tym ekran telefonu spełnia podobne funkcje jak okno terminalu na monitorze komputera. Wejściowe SMSy to<br />

słowa języka <strong>ForthLogic</strong> ‐ standardowe i zdefiniowane oraz wartości w postaci liczb i tekstów. Wszystkie wejściowe SMSy<br />

trafiają bezpośrednio do interpretatora tekstu forth‐systemu, który bezpośrednio je analizuje i wykonuje, zwrotnie<br />

SMSem podając informacje o poprawności wykonania lub błędzie. Wyjściowe SMSy to jeden ze sposobów powiadamiania<br />

użytkownika o zdarzeniach i parametrach. Tryb zdalny w sposób oczywisty wykorzystujemy do zdalnego sterowania<br />

urządzeniami podłączonymi do sterownika. Funkcję te szerzej opisano w <strong>inst</strong>rukcji użytkowania.<br />

3.2 PRACA W TRYBIE TERMINALOWYM<br />

Praca w trybie terminalowym polega na wprowadzaniu słów i odpowiednich wartości przez użytkownika i odpowiedniej<br />

jej realizacji przez forth‐system. O gotowości do przyjęcia kolejnego wiersza tekstu fort‐system zawiadamia użytkownika<br />

znakiem „>”. Po tym znaku użytkownik wpisuje do terminalu kolejną porcję tekstu i naciska przycisk „Enter”. Po<br />

otrzymaniu sygnału o zakończeniu wprowadzania, forth‐system zaczyna interpretować wprowadzony tekst, rozpoznając<br />

w nim słowa i podane wartości, a następnie odpowiednio je wykonuje. Po przetworzeniu całego wprowadzonego tekstu,<br />

forth‐system znów poprosi użytkownika o wprowadzenie tekstu. Opisany cykl dialogu powtórzy się. Po udanym<br />

zakończeniu przetwarzania wprowadzonego tekstu forth‐system drukuje na terminalu powiadomienie potwierdzające<br />

„OK”. Jeżeli w trakcie przetwarzania wprowadzonego tekstu pojawi się jakikolwiek błąd (na przykład podamy słowo,<br />

którego forth‐system nie rozpoznaje), na terminalu ukazuje się odpowiednie powiadomienie, jednocześnie przetwarzanie<br />

wprowadzonego tekstu zostaje zatrzymane, a forth‐system poprosi użytkownika o wprowadzenie nowego tekstu. Długość<br />

wiersza tekstu przyjmowanego do przetwarzania wynosi 80 znaków. Wbudowany edytor forth‐systemu automatycznie<br />

ogranicza długość wiersza do 80 znaków i zawiadamia o tym sygnałem dźwiękowym. Maksymalna długość jednego<br />

wiersza tekstu wprowadzonego na terminal przez użytkownika wynosi 77 znaków (3 pozycje znaków są automatycznie<br />

zajęte przez znak gotowości „>” i dwie spacje ‐ na początku i końcu wiersza. W przypadku przekroczenie limitu znaków<br />

forth‐system zawiadomi długość tym sygnałem dźwiękowym. Przy pracy terminalowej, poza przyciskami liter i cyfr, można<br />

używać wyłącznie przycisków „Backspace”, „Space” i „Enter”. Można również kopiować fragmenty tekstu (do 18 znaków)<br />

z okna terminalu i wklejać je używając kombinacji klawiszy Ctrl+C i Ctrl+V lub poprzez wybór odpowiedniej opcji z menu<br />

wywołanego prawym klawiszem myszy.<br />

Wygląd i znaczenie drukowanych informacji w oknie terminalu przy uruchomieniu połączenia MAX‐PC różni się w<br />

zależności od typu sterownika. Informacje te podane są w <strong>inst</strong>rukcjach użytkowania.<br />

‐ 7 ‐


Sterowniki <strong>prog</strong>ramowalne MAX Logic<br />

Do pracy dialogowej wykorzystujemy dwa typy <strong>prog</strong>ramów, które wchodzą w skład załączonego zestawu<br />

o<strong>prog</strong>ramowania dla sterowników MAX:<br />

1. HYPERTERMINAL<br />

W charakterze terminalu w środowisku Microsoft Windows XP wykorzystujemy <strong>prog</strong>ram Microsoft HyperTerminal, który<br />

wchodzi w skład systemu operacyjnego. Dla systemu Windows VISTA i Windows 7 należy za<strong>inst</strong>alować <strong>prog</strong>ram ze składu<br />

załączonego o<strong>prog</strong>ramowania dla sterownika lub jeden z dostępnych w sieci darmowych <strong>prog</strong>ramów typy Hyperterminal.<br />

2. NOTEPAD++PuTYY<br />

Interaktywne środowisko <strong>prog</strong>ramowania i tworzenia aplikacji dla sterowników MAX w języku <strong>ForthLogic</strong> składające się z<br />

edytora tekstowego Notpade++, <strong>prog</strong>ramu terminalowego PuTTY oraz <strong>prog</strong>ramu <strong>ForthLogic</strong> Programmer zapewniającego<br />

dwustronną komunikację miedzy komputerem PC i sterownikiem MAX. Dane środowisko pozwala tworzyć skrypty w<br />

jezyku <strong>ForthLogic</strong>, <strong>prog</strong>ramować sterowniki MAX oraz komunikować się ze sterownikiem w trybie terminalowym.<br />

Środowisko nie wymaga <strong>inst</strong>alacji <strong>prog</strong>ramowej. Pracuje z systemami operacyjnymi Windows 2000, Windows NT,<br />

Windows XP, Windows Vista oraz Windows 7.<br />

3.3 HYPERTERMINAL ‐ KONFIGURACJA PROGRAMU<br />

Poniżej podano sposób konfiguracji <strong>prog</strong>ramu, który wchodzi w skład systemu operacyjnego<br />

Microsoft®Windows®XP. W innych <strong>prog</strong>ramach tego typu sposób konfiguracji może się nieznacznie różnić.<br />

Jednakże ustawiane atrybuty muszą być zgodne z podanymi poniżej.<br />

Przed rozpoczęciem pracy z <strong>prog</strong>ramem należy za<strong>inst</strong>alować sterownik USB. W tym celu należy uruchomić plik „CDM<br />

2.04.16.exe”, który znajduje się w folderze „USB” na płycie CD załączonej w komplecie ze sterownikiem. Po<br />

za<strong>inst</strong>alowaniu sterownika USB podłączyć sterownik do dowolnego portu USB przy pomocy kabla załączonego do<br />

sterownika. W systemie operacyjnym pojawi się nowy port szeregowy (jego numer można sprawdzić i zmienić w<br />

<strong>prog</strong>ramie „Menedżer urządzeń”).<br />

Kiedy sterownik zostanie podłączony do komputera, można uruchomić <strong>prog</strong>ram HyperTerminal.<br />

Przy pierwszym uruchomieniu pojawi się okno Opis połączenia, w którym należy podać nazwę połączenia.<br />

‐ 8 ‐


Instrukcja <strong>prog</strong>ramowania w języku <strong>ForthLogic</strong> wersja <strong>P.1.2</strong><br />

Akceptować przyciskiem OK.<br />

Następnie pojawi się okno Łączenie. W oknie wyboru Połącz używając: należy wybrać numer portu szeregowego, który<br />

został automatycznie przydzielony dla sterownika.<br />

Akceptować przyciskiem OK.<br />

Następnie pojawi się okno Właściwości: COM....<br />

Ustawić parametry łączności: „Liczba bitów na sekundę” – 57600 (dla H01, H02,) lub 19200 (dla H03, H04), „Bity danych”<br />

– 8, „Parzystość” – brak, „Bity stopu” – 1, „Sterowanie przepływem” – Brak. Parametry te można zawsze korygować<br />

wchodząc w zakładkę Właściwości Konfiguruj…<br />

Akceptować przyciskiem OK.<br />

Następnie należy wejść w zakładkę Wywołanie i zamknąć połączenie (Wywołanie Odłącz lub skrót przez ikonę).<br />

Wejść w zakładkę Właściwości (Plik – Właściwości lub skrót przez ikonę).<br />

‐ 9 ‐


Sterowniki <strong>prog</strong>ramowalne MAX Logic<br />

Otworzy się okno Właściwości: COM....<br />

Wybrać zakładkę: Ustawienia. W oknie wyboru Emulacja ustawić TTY (pozostałe ustawienia bez zmian).<br />

Następnie wcisnąć przycisk Ustawienia ASCII, odznaczyć wszystkie „znaczniki” zostawiając tylko ostatni.<br />

‐ 10 ‐


Instrukcja <strong>prog</strong>ramowania w języku <strong>ForthLogic</strong> wersja <strong>P.1.2</strong><br />

Zatwierdzić wszystkie ustawienia przyciskiem „OK”. Potem ponownie zatwierdzić wszystkie ustawienia przyciskiem „OK”.<br />

(Wywołanie Wywołaj lub skrót przez ikonę). Urządzenia zostaną połączone. Po naciśnięciu klawisza „Enter” sterownik<br />

zgłosi gotowość do dialogu.<br />

Wygląd i znaczenie drukowanych informacji w oknie terminalu przy uruchomieniu połączenia MAX‐PC różni się w<br />

zależności od typu sterownika. Informacje te podane są w <strong>inst</strong>rukcjach użytkowania.<br />

Ponowne uruchomienie <strong>prog</strong>ramu z tym samym sterownikiem nie wymaga wykonywania powyższych czynności.<br />

Wszystkie czynności, które dokonujemy podczas bezpośredniej pracy ze sterownikiem za pomocą <strong>prog</strong>ramu możemy<br />

rejestrować. Wprowadzone przez użytkownika na terminal słowa, wartości, rozkazy systemowe i komentarze oraz<br />

wszystkie komunikaty, wartości i teksty wprowadzone na terminal przez forth‐system są zapisywane na bieżąco w pliku<br />

tekstowym. Aby uruchomić automatyczną rejestrację należy wejść w zakładkę Transfer i wybrać Przechwyć tekst.<br />

Następnie w otwartym oknie podać lokalizację zapisu pliku. Przyciskiem START rozpocząć automatyczny zapis.<br />

3.4 NOTEPAD++PuTTY ‐ Interaktywne środowisko <strong>prog</strong>ramowania w języku <strong>ForthLogic</strong><br />

Opis działania <strong>prog</strong>ramów wchodzących w skład środowiska <strong>prog</strong>ramistycznego opisano w oddzielnej <strong>inst</strong>rukcji<br />

znajdującej się w zestawie załączonego o<strong>prog</strong>ramowania dla sterowników MAX.<br />

4. ELEMENTY JĘZYKA <strong>ForthLogic</strong><br />

4.1 STOS DANYCH i STOS MATEMATYCZNY<br />

U podstaw modelu obliczeniowego języka <strong>ForthLogic</strong> leży maszyna stosowa. Stos to obiekt <strong>prog</strong>ramowy, funkcjonujący na<br />

‐ 11 ‐


Sterowniki <strong>prog</strong>ramowalne MAX Logic<br />

zasadzie „ostatni przyszedł – pierwszy wyszedł” (last‐in, first‐out [LIFO]). Jest on przeznaczony do przekazywania<br />

parametrów i danych między poszczególnymi poleceniami. Stos można porównać z talią kart: położenie nowego elementu<br />

na stos można porównać z położeniem nowej karty na wierzchu talii, a zdjęcie elementu ze stosu ze zdjęciem karty z talii.<br />

Słowa w języku <strong>ForthLogic</strong> wykorzystują górne elementy stosu z reguły w charakterze operandów, zabierając je ze stosu i<br />

przywracając w ich miejsce wyniki, jeżeli takie są. Każdy ze stosów może pomieścić maksymalnie 16 elementów.<br />

W celu opisania słów służących do pracy ze stosami danych i matematycznym zastosujemy poniższy schemat:<br />

nazwa szczyt stosu przed ‐‐‐> szczyt stosu po<br />

słowa wykonaniem słowa wykonaniem słowa<br />

Uwaga! Najwyższy element na stosie (dodany jako ostatni) znajduje się po prawej.<br />

Do pracy ze szczytem stosu danych (3 górne elementy) służą słowa:<br />

DUP (od DUPLICATE – powielić) ‐ kopiuje górny element stosu danych, dodając do stosu jeszcze jeden element, równy<br />

temu, który wcześniej był górnym.<br />

DROP (usunąć) ‐ usuwa górny element ze stosu danych.<br />

OVER (przez) ‐ kopiuje element, znajdujący się na stosie bezpośrednio pod górnym i kładzie go na szczyt stosu.<br />

ROT (od ROTATE ‐ obracać) ‐ cyklicznie przestawia trzy górne elementy na stosie zgodnie z ruchem wskazówek zegara.<br />

SWAP (wymienić) ‐ zamienia miejscami dwa górne elementy na stosie danych.<br />

DUP A, B, C ‐‐‐> A, B, C, C<br />

DROP A, B, C ‐‐‐> A, B<br />

OVER A, B, C ‐‐‐> A, B, C, B<br />

ROT A, B, C, ‐‐‐> B, C, A<br />

SWAP A, B, C ‐‐‐> A, C, B<br />

Do pracy z dowolnym elementem stosu służą słowa:<br />

PICK (wziąć) ‐ powiela n dany element stosu (licząc od zera) i kładzie go na szczyt stosu (0 PICK = DUP; 1 PICK = OVER).<br />

ROLL (obrócić) ‐ przestawia n górny element stosu (licząc od zera) na szczyt stosu zgodnie z ruchem wskazówek zegara (2<br />

ROLL = ROT; 1 ROLL = SWAP; 0 ROLL jest „pustą” operacją).<br />

PICK An,An‐1,...Ao,n ‐‐‐> An,An‐1,...Ao,An<br />

ROLL An,An‐1,...Ao,n ‐‐‐> An‐1,...Ao,An<br />

Słowo . (kropka) ‐ zdejmuje element z wierzchołka stosu, wprowadza go do bufora wyjściowego i drukuje na terminalu<br />

jako liczbę całkowitą (bez początkowych zer i ze znakiem minus, jeśli jest to liczba ujemna).<br />

Jeśli użytkownik chce, aby wydrukowany element został na stosie, powinien wprowadzić następujący tekst:<br />

> DUP .<br />

Słowo DUP utworzy kopię górnego elementu, a kropka go zdejmie ze stosu i wydrukuje.<br />

Do pracy z wierzchołkiem stosu matematycznego (3 górne elementy) służą słowa:<br />

FDUP (od DUPLICATE ‐ powielać) – powiela wierzchołek stosu matematycznego, dodając do stosu jeszcze jeden element,<br />

równy temu, który wcześniej był górnym.<br />

FDROP (usunąć) ‐ usuwa górny element stosu matematycznego.<br />

FOVER (przez) ‐ powiela element stosu matematycznego, znajdujący się na stosie bezpośrednio pod górnym i kładzie go<br />

na szczyt stosu.<br />

FROT (od ROTATE – obracać) – cyklicznie przestawia trzy górne elementy na stosie matematycznym zgodnie z ruchem<br />

wskazówek zegara.<br />

FSWAP (wymienić) ‐ zamienia miejscami dwa górne elementy stosu matematycznego.<br />

FDUP A, B, C ‐‐‐> A, B, C, C<br />

FDROP A, B, C ‐‐‐> A, B<br />

‐ 12 ‐


Instrukcja <strong>prog</strong>ramowania w języku <strong>ForthLogic</strong> wersja <strong>P.1.2</strong><br />

FOVER A, B, C ‐‐‐> A, B, C, B<br />

FROT A, B, C ‐‐‐> B,C,A<br />

FSWAP A, B, C ‐‐‐> A, C, B<br />

Do pracy z dowolnym elementem stosu matematycznego służą słowa:<br />

FPICK (wziąć) ‐ powiela n dany element stosu matematycznego (licząc od zera) i kładzie go na szczyt stosu (0 FPICK =<br />

FDUP; 1 FPICK = FOVER).<br />

FROLL (obrócić) ‐ przestawia n górny element stosu matematycznego (licząc od zera) na szczyt stosu zgodnie z ruchem<br />

wskazówek zegara (2 FROLL = FROT; 1 FROLL = FSWAP; 0 FROLL jest „pustą” operacją).<br />

FPICK An,An‐1,...Ao,n ‐‐‐> An,An‐1,...Ao,An<br />

FROLL An,An‐1,...Ao,n ‐‐‐> An‐1,...Ao,An<br />

Aby „zobaczyć” górny element w stosie matematycznym stosowane jest słowo „F.” (kropka) lub FE. (FLOAT ENGINEER ‐<br />

kropka):<br />

‐ F. (FLOAT kropka) ‐ zdejmuje górny element ze stosu matematycznego, wprowadza go do bufora wyjściowego i drukuje<br />

na terminalu jako liczbę rzeczywistą w formacie z sześcioma znakami po przecinku (bez początkowych zer i ze znakiem<br />

minus, jeśli jest to liczba ujemna).<br />

‐ FE. (FLOAT ENGINEER ‐ kropka) ‐ zdejmuje górny element ze stosu matematycznego, wprowadza go do bufora<br />

wyjściowego i drukuje na terminalu jako liczbę w postaci wykładniczej (w notacji naukowej), np. ‐1,234E‐02; 1,98E+12, z<br />

sześcioma znakami po przecinku (bez początkowych zer i ze znakiem minus, jeśli jest to liczba ujemna).<br />

Aby "zobaczyć" zawartość obu stosów nie zmieniając ich stanu, stosujemy słowa pomocnicze .S (dla stosu danych) i .FS (dla<br />

stosu matematycznego), które odpowiednio drukują na terminalu zawartość stosu danych i stosu matematycznego (w<br />

nawiasach kwadratowych []). Górne znaczenia na stosie znajdują się po prawej stronie. Znaczenia ze stosu<br />

matematycznego drukowane są w postaci liczb wykładniczych z 6 znakami po przecinku.<br />

Precyzję przedstawienia liczb przy wydruku (czyli ilość cyfr po przecinku) można ustalić za pomocą systemowej zmiennej<br />

FPREC!, która domyślnie jest równa 6. Dla ustanowienia nowego znaczenia dla systemowej zmiennej FPREC istnieje słowo<br />

FPREC!, które ze szczytu stosu danych zdejmuje liczbę, która stanowi liczbę drukowanych cyfr po przecinku (zakres 0÷6).<br />

Przykład: 2 FPREC! ustanawia precyzję 2, co znaczy, że liczby ze stosu matematycznego będą drukowane z dokładnością<br />

do 2 cyfr po przecinku. Jeżeli precyzja jest równa 0, to oznacza brak cyfr po przecinku w ogóle (przekształcenie do liczby<br />

całkowitej). Uwaga! Po zaniku napięcia zasilania i ponownym starcie fort‐system kasuje ustawiona wartość precyzji i<br />

powraca do domyślnej (6).<br />

Aby „poznać” liczbę elementów na stosie danych i matematycznym, stosujemy słowa DEPTH i FDEPTH.<br />

‐ DEPTA kładzie na szczyt stosu danych liczbę elementów na tym stosie;<br />

‐ FDEPTH kładzie na szczyt stosu danych liczbę elementów na stosie matematycznym.<br />

DEPTH An,An‐1,...,A1 ‐‐‐> An,An‐1,...,A1,n<br />

FDEPTH F:An,An‐1,...,A1 ‐‐‐> F:An,An‐1,...,A1<br />

‐‐‐> An,An‐1,...,A1,n<br />

Wymienione słowa pracują z elementami, które już znajdują się na stosie. A jak dodać element na stos? Język <strong>ForthLogic</strong><br />

ma następującą zasadę domyślną: jeżeli forth‐system nie zna wprowadzonego słowa, to przed zawiadomieniem<br />

użytkownika o błędzie rozpatrzy to słowo jako zapis liczby. Jeżeli słowo składa się z samych cyfr z ewentualnym<br />

początkowym znakiem minus, to błędu nie ma – jako rozpoznane kładzie na szczyt stosu danych. Jeśli słowo składa się z<br />

cyfr rozdzielonych przecinkiem (.) z ewentualnym początkowym znakiem minus lub liczby w postaci liczby wykładniczej (za<br />

pomocą liter e albo E i możliwym znakiem minus eksponenta) to kładzie je na szczyt stosu matematycznego.<br />

Dla bezpośredniego przenoszenia liczb z jednego stosu na drugi służą słowa D>F i F>D:<br />

‐ Słowo D>F zdejmuje górne znaczenie ze szczytu stosu danych i przenosi na szczyt stosu matematycznego z odpowiednim<br />

przekształceniem na liczbę zmiennoprzecinkową (5 ‐> 5.000000).<br />

‐ Słowo F>D zdejmuje górne znaczenie ze szczytu stosu matematycznego i przenosi na szczyt stosu danych z<br />

zaokrągleniem do liczby całkowitej.<br />

‐ 13 ‐


Sterowniki <strong>prog</strong>ramowalne MAX Logic<br />

Rozpatrzymy następujący przykład pracy z liczbami na stosach:<br />

> 5 6 7<br />

(OK)<br />

> SWAP . . .<br />

6 7 5 (OK)<br />

> 123.456 FE.<br />

1.234560E+02 (OK)<br />

> ‐12.987E‐2 F.<br />

‐0.129870 (OK)<br />

Na terminal wprowadzamy trzy liczby: 5, 6 i 7. Przetwarzając wprowadzany tekst, forth‐system układa te liczby we<br />

wskazanej kolejności na stosie i po zakończeniu przetwarzania drukuje powiadomienie „OK”. Następnie wprowadzamy<br />

słowa SWAP i trzy kropki. Wykonując te słowa, forth‐system zamienia miejscami dwa górne elementy stosu (5, 6, 7 ‐> 5, 7,<br />

6), a następnie trzy razy zdejmuje górny element ze stosu i drukuje go. W wyniku tego na terminalu pojawia się tekst 6 7 5<br />

i powiadomienie „OK”, potwierdzające zakończenie przetwarzania. Następnie wprowadzamy dwie liczby: pierwszą ‐<br />

rzeczywistą z przecinkiem i drugą rzeczywista w notacji naukowej. Przetwarzając wprowadzone liczby, fort‐system kładzie<br />

te liczby w odpowiedniej kolejności na stos matematyczny a potem zdejmuje je ze stosu drukując we wskazanym<br />

formacie.<br />

4.2 DZIAŁANIA ARYTMETYCZNE<br />

Do wykonywania działań arytmetycznych na liczbach ze stosu danych, służą ogólnie przyjęte oznaczenia matematyczne:<br />

+ A,B ‐‐‐> suma A+B<br />

‐ A,B ‐‐‐> różnica A‐B<br />

* A,B ‐‐‐> iloczyn A*B<br />

/ A,B ‐‐‐> iloraz A/B<br />

MOD A,B ‐‐‐> reszta z działania A/B<br />

ABS A ‐‐‐> wartość bezwzględna A<br />

NEGATE A ‐‐‐> znaczenie z odwrotnym znakiem ‐A<br />

Do wykonywania działań arytmetycznych na liczbach ze stosu matematycznego, służą ogólnie przyjęte oznaczenia<br />

matematyczne ze znakiem F:<br />

F+ A,B ‐‐‐> suma A+B<br />

F‐ A,B ‐‐‐> różnica A‐B<br />

F* A,B ‐‐‐> iloczyn A*B<br />

F/ A,B ‐‐‐> iloraz A/B<br />

FABS A ‐‐‐> wartość bezwzględna A<br />

FNEGATE A ‐‐‐> znaczenie z odwrotnym znakiem ‐A<br />

Do wykonywania obliczeń funkcji matematycznych z wykorzystaniem liczb ze stosu matematycznego, służą ogólnie<br />

przyjęte oznaczenia matematyczne ze znakiem F:<br />

FSIN A ‐‐‐> sinus kąta A w radianach sin(A)<br />

FCOS A ‐‐‐> cosinus kąta A w radianach cos(A)<br />

FTAN A ‐‐‐> tangens kąta A w radianach tg(A)<br />

FSINH A ‐‐‐> sinus hiperboliczny A sh(A)<br />

FCOSH A ‐‐‐> cosinus hiperboliczny A ch(A)<br />

FTANH A ‐‐‐> tangens hiperboliczny A th(A)<br />

FASIN A ‐‐‐> arcus sinus A arcsin(A), ‐1.0


Instrukcja <strong>prog</strong>ramowania w języku <strong>ForthLogic</strong> wersja <strong>P.1.2</strong><br />

FLOG A ‐‐‐> logarytm dziesiętny A log10(A)<br />

FLN A ‐‐‐> logarytm naturalny A ln(A)<br />

FEXP A ‐‐‐> eksponent A<br />

F** A,B ‐‐‐> potęgowanie A do B<br />

FSQRT A ‐‐‐> pierwiastek kwadratowy z A<br />

Wykorzystanie stosu do przechowania elementów przejściowych w sposób naturalny prowadzi do tak zwanej „odwrotnej<br />

notacji polskiej” (Reverse Polish Notation [RPN]) – jednego ze sposobów beznawiasowych obliczeń wyrażeń<br />

arytmetycznych, opracowanego przez polskiego logika Jana Łukasiewicza (1878‐1956). Pozwala to na przeprowadzanie<br />

bieżącej operacji bezpośrednio na wyniku wcześniejszej operacji, który to wynik nie wymaga adresu i odwołania do niego,<br />

ponieważ zostaje pozostawiony i jest od razu zdjęty (wykorzystany) przez następującą po nim operację (idea stosu).<br />

Sposób ten wymaga ustawienie znaku operacji po operandach. Na przykład, wyraz (A/B+C)*(D*E‐F*(G‐H)) zapisuje się w<br />

taki sposób: A B / C + D E * F G H ‐ * ‐ *. Tak, więc forth‐system można wykorzystać jako kalkulator. Aby obliczyć wartość<br />

(25 + 18+32)*5, wystarczy wprowadzić taki tekst:<br />

> 25 18 + 32 + 5 * .<br />

375 (OK)<br />

><br />

Wynikiem jest liczba 375.<br />

Dla liczb zmiennoprzecinkowych podobnie. Aby obliczyć wartość 1.2e‐2*sin(25.23+0.18*3.1415), wprowadzamy tekst:<br />

> 1.2e‐2 25.23 0.18 3.1415 F* F+ FSIN F* F.<br />

0.007383 (OK)<br />

><br />

Wynikiem jest liczba 0,007383.<br />

4.3 DEFINIOWANIE NOWYCH SŁÓW<br />

Podstawową właściwością języka FortLogic jest możliwość definiowania nowych słów, co umożliwia poszerzenie zestawu<br />

poleceń w wymaganym przez użytkownika kierunku. Definiowanie słowa zaczyna się słowem „:” (dwukropek) i kończy się<br />

słowem „;” (średnik). Po dwukropku umieszcza się nazwę nowego słowa, a za nim kolejne słowa, przez które jest ono<br />

definiowane. Na przykład, tekst<br />

> : S2 DUP * SWAP DUP * + ;<br />

(OK)<br />

><br />

definiuje słowo S2, które oblicza sumę kwadratów dwóch liczb:<br />

S2 A,B ‐‐‐> A*A+B*B<br />

Po wprowadzeniu tego opisu słowo S2 zostaje włączone do słownika forth‐systemu i można je wykonywać. Przy<br />

definiowaniu nowych słów zaleca się uważnie prześledzić wszystkie zmiany na stosie.<br />

Prześledźmy podane wyżej określenia słowa S2, podając w nawiasach stan wierzchołka stosu po wykonaniu każdego<br />

wiersza:<br />

> : S2 DUP * SWAP DUP * + ;<br />

: S2 ( A,B ‐‐‐> A*A+B*B ‐ suma kwadratów )<br />

DUP ( A,B,B )<br />

* ( A,B*B )<br />

SWAP ( B*B,A )<br />

‐ 15 ‐


Sterowniki <strong>prog</strong>ramowalne MAX Logic<br />

DUP ( B*B,A,A )<br />

* ( B*B,A*A )<br />

+ ( B*B+A*A )<br />

;<br />

(OK)<br />

><br />

Rozpatrzymy dokładniej pracę forth‐systemu podczas definiowania nowych słów. Wiemy, że po otrzymaniu od<br />

użytkownika kolejnej porcji tekstu wejściowego forth‐system wyróżnia w niej poszczególne słowa i szuka ich w swoim<br />

słowniku. Pracę tę wykonuje wbudowany interpretator tekstu forth‐systemu. Jeżeli słowo w słowniku nie zostanie<br />

znalezione, interpretator tekstu rozpatrzy to słowo jako zapis liczby. Jeśli słowo zostało rozpoznane lub zinterpretowane<br />

jako liczba, dalsze działania interpretatora zależą od jego stanu bieżącego. W każdej chwili interpretator tekstu znajduje<br />

się w jednym z dwóch stanów: w stanie realizacji lub w stanie kompilacji. W stanie realizacji rozpoznane słowo jest<br />

wykonywane, a liczba jest kładziona na stos. Jeśli interpretator znajduje się w stanie kompilacji, to znalezione słowo nie<br />

jest wykonywane, lecz kompilowane, czyli włącza się w tworzoną sekwencję działań dla definiowanego słowa w chwili<br />

obecnej. Rozpoznane i skompilowane w ten sposób słowo zostaje wykonane razem z innymi słowami podczas wykonania<br />

określonego przez nie słowa.<br />

Prześledzimy pracę interpretatora tekstu w oparciu o zdefiniowane słowo S2. Załóżmy, że przed rozpoczęciem<br />

przetwarzania wprowadzonego wiersza interpretator znajduje się w stanie wykonania. Pierwsze słowo, które jest<br />

wykonywane, to „:” (dwukropek). Jego semantyka polega na tym, że z wiersza wejściowego wybierane jest kolejne słowo i<br />

zostaje ono zapamiętane jako słowo definiowane, a interpretator przełącza się w stan kompilacji. Następne słowa, które<br />

interpretator będzie wybierał z wiersza wejściowego (DUP, * , SWAP, itp.), będą kompilowane, a nie wykonywane,<br />

ponieważ interpretator znajduje się w stanie kompilacji. W rezultacie ze słowem „S2” jest kojarzona sekwencja działań<br />

odpowiadających tym słowom. Proces wyróżnienia i kompilacji słów będzie trwał do chwili zakończy definicji słowem „;”<br />

(średnik). Po słowie „;” interpretator znów przełącza się w stan realizacji. Dlatego po wprowadzeniu określenia słowa S2<br />

możemy natychmiast sprawdzić, jak ono pracuje z konkretnymi wartościami:<br />

> 5 4 S2 .<br />

41 (OK)<br />

><br />

Zdefiniowane słowa można usunąć ze słownika przy pomocy słowa „FORGET” (zapomnieć), które wyklucza zdefiniowane<br />

słowo ze słownika razem ze wszystkimi słowami zdefiniowanymi po tym słowie (według zasady “od dołu ‐ w górę”). Słowo<br />

FORGET nie może wchodzić w skład definiowanego słowa.<br />

Schemat kolejności definicji słów i ich usuwania (Małymi literami oznaczono słowa definiowane, dużymi literami<br />

oznaczono słowa standardowe):<br />

: aaa AAA BBB ; FORGET ccc : aaa AAA BBB ;<br />

: bbb CCC DDD ; : bbb CCC DDD ;<br />

: ccc bbb aaa ; : ccc bbb aaa ;<br />

: ddd ccc EEE ; : ddd ccc EEE ;<br />

Rozpatrzymy następujący przykład dialogu:<br />

> 2 2 * .<br />

4 (OK)<br />

> : 2 3 ;<br />

(OK)<br />

> 2 2 * .<br />

9 (OK)<br />

> FORGET 2<br />

(OK)<br />

> 2 2 * .<br />

4 (OK)<br />

‐ 16 ‐


Instrukcja <strong>prog</strong>ramowania w języku <strong>ForthLogic</strong> wersja <strong>P.1.2</strong><br />

><br />

Najpierw obliczamy wynik mnożenia 2*2 i otrzymuje odpowiedź 4. Następnie definiując słowo 2 jako liczbę o wartości 3,<br />

otrzymamy odpowiedź 9. Po wykluczeniu znaczenia słowa 2 poprzez słowo FORGET, wraca ono do dawnej semantyki<br />

słowa 2, czyli zwykłej cyfry.<br />

Do pracy z nowymi słowami i słownikiem służą także słowa pomocnicze WORDS (słowa) i UNUSED (nie wykorzystany).<br />

Słowo WORDS drukuje na terminalu listę wszystkich słów w słowniku. Jeżeli wszystkie słowa nie zmieszczą się na ekranie,<br />

to klawiszem „spacja” drukujemy następny zestaw słów zawarty w słowniku. Słowo UNUSED kładzie na stos liczbę<br />

wolnego miejsce w słowniku wyrażoną w bajtach. Dalej, przy pomocy słowa . (kropka), element ten można wydrukować<br />

na terminalu.<br />

Każde słowo standardowe i zdefiniowane ma przyporządkowany swój adres (kod), który jest znany forth‐systemowi.<br />

Słowo NAME zdejmuje ze stosu górny element i interpretuje go jako adres. Następnie w słowniku forth‐systemu<br />

poszukuje słowa o danym adresie i, jeśli takie słowo znajdzie, to drukuje je w buforze wyjściowym i na terminalu, w<br />

przeciwnym wypadku drukuje nic. W przypadku zatrzymania pracy aplikacji z powodu błędów na terminalu może zostać<br />

wydrukowany adres słowa, w którym doszło do błędu. Dzięki słowu NAME możemy je bezpośrednio poznać, np.:<br />

[ERROR: 7 RS: 2354]<br />

> 2354 NAME<br />

alarm (OK)<br />

Słowo FIND (znaleźć) pozwala poznać adres wykonawczy słowa. Słowo FIND sczytuje wiersz z bufora wyjściowego do<br />

pierwszej spacji (słowo, dla którego trzeba znaleźć wykonawczy adres) i jeśli słowo to jest znane forth‐systemowi, na stos<br />

kładzie adres wykonawczy tego słowa. W przeciwnym przypadku na stos kładzie znaczenie FAŁSZ (0).<br />

> .” alarm ” FIND .<br />

alarm 2354 (OK)<br />

><br />

Rozkaz systemowy BUILD DICTIONARY powoduje powrót słownika do stanu pierwotnego. Po tym rozkazie w<br />

słowniku pozostaną tylko słowa standardowe (wbudowane). Wszystkie słowa zdefiniowane zostaną<br />

usunięte.<br />

Przy definiowaniu nowych słów zdarza się, że brakuje miejsca w jednym wierszu, aby zakończyć budowę nowego słowa.<br />

W sytuacjach, kiedy wiersz przekracza ustaloną długość, można przejść do następnego wiersza przy pomocy przycisku<br />

„Enter” i w nim kontynuować definiowanie. Proces ten można powtarzać, póki nie zakończy się definiowanie, czyli do<br />

słowa „;”.<br />

Przy definiowaniu nowych słów można wykorzystywać słowa standardowe systemu, jak i te uprzednio zdefiniowane.<br />

System pozwala na definiowanie nowych słów z wykorzystaniem już zdefiniowanego słowa. „Głębia” układu<br />

definiowanych słów może sięgać 64 poziomów. Przekroczenie jest sygnalizowane jako błąd.<br />

Zawartość słów standardowych w słowniku forth‐systemu zależy od o<strong>prog</strong>ramowania firmware. Do sprawdzania wersji<br />

firmware służy sowo VERSION, które drukuję na terminalu i buforze wyjściowym wersję o<strong>prog</strong>ramowania (jest to liczba<br />

składająca się z dwóch liczb rozdzielonych kropką).<br />

4.4 STAŁE, ZMIENNE i WIERSZE<br />

Zamiast pracy z konkretnymi wartościami wygodniej jest pracować z nazwanymi wartościami. Analogicznie do zasobów<br />

innych języków zasoby języka <strong>ForthLogic</strong> są nazywane stałymi i zmiennymi. Istnieją także wiersze – obiekty, które<br />

wykorzystuje się dla wyprowadzenia tekstu do bufora wyjściowego i na terminal.<br />

‐ 17 ‐


Sterowniki <strong>prog</strong>ramowalne MAX Logic<br />

4.4.1 Stałe<br />

Stałe są określonymi przez nazwę wielkościami. Zdefiniowane są traktowane przez forth‐system jak słowa i lokowane są w<br />

pamięci nieulotnej, co oznacza, że nie są tracone po zaniku napięcia zasilania. Pozwala to trwale przechowywać parametry<br />

liczbowe do wykonania konkretnego zadania.<br />

W ramach jednego zadania można zmieniać wartości zmiennych. Ilość zmian jednej stałej jest ograniczona, w przybliżeniu<br />

ok. 100000 razy. Sam proces zmiany jest stosunkowo długi (4÷10 msek.).<br />

Słowa dla pracy z stałymi:<br />

‐ CONSTANT ‐ (dla liczb całkowitych) ze stosu danych zdejmuje górny element jako wartość stałej, i przyjmuje dla niej<br />

nazwę określoną bezpośrednio po nim. Jego działanie polega na położeniu na stos danych liczby (wartości), jaka została<br />

przypisana pod dana nazwą.<br />

‐ TO (do) ‐ (dla liczb całkowitych) ze stosu danych zdejmuje górny element jako nową wartość i przypisuje ją już<br />

zdefiniowanej stałej, której nazwę podajemy bezpośrednio po nim.<br />

‐ FCONSTANT ‐ (dla liczb zmiennoprzecinkowych) Ze stosu matematycznego zdejmuje górny element jako wartość stałej, i<br />

przyjmuje dla niej nazwę określoną bezpośrednio po nim. Jego działanie polega na położeniu na stos matematyczny liczby<br />

(wartości), jaka została przypisana pod dana nazwą.<br />

‐ TOF (do) ‐ (dla liczb zmiennoprzecinkowych) ze stosu matematycznego zdejmuje górny element jako nową wartość i<br />

przypisuje ją już zdefiniowanej stałej, której nazwę podajemy bezpośrednio po nim.<br />

Przykład:<br />

> 4 CONSTANT x 3.14156 FCONSTANT pi<br />

(OK)<br />

> x . pi F.<br />

4 3.141560 (OK)<br />

><br />

Przy wykonaniu słowa x, na stos danych zostanie położona liczba 4, a przy wykonaniu słowa pi ‐ na stos matematyczny<br />

zostanie położona liczba 3.14156.<br />

4.4.2 Zmienne<br />

Zmienne to określone komórki pamięci operacyjnej. Fizyczna natura tej pamięci pozwala modyfikować zmienne<br />

nieskończoną ilość razy. Proces modyfikacji jest stosunkowo szybki (100 nsek). Zmienne nie są przechowywane w pamięci<br />

nieulotnej i wraz z zanikiem zasilania ich wartości są kasowane.<br />

Do pracy ze zmiennymi globalnymi całkowitymi służą słowa VAR! i VAR?.<br />

‐ VAR! ‐ zdejmuje ze stosu danych dwa górne znaczenia – pierwsze jako numer zmiennej, a drugie jako jej wartość.<br />

‐ VAR? ‐ zdejmuje ze stosu danych górny element jako numer zmiennej, a na stos danych kładzie kopię wartości tej<br />

zmiennej. Liczbę zmiennych globalnych całkowitych dla danej wersji sterownika określa parametr D_MAX. Patrz: rozdz. 8<br />

Tabela zasobów <strong>prog</strong>ramowych.<br />

Przykład:<br />

> 4 1 VAR! ‐237889 16 VAR!<br />

(OK)<br />

> 1 VAR? .<br />

4 (OK)<br />

> 16 VAR? .<br />

‐237889 (OK)<br />

><br />

Dla pracy ze zmiennymi globalnymi zmiennoprzecinkowymi służą słowa FVAR! i FVAR?.<br />

‐ FVAR ‐ zdejmuje ze stosu matematycznego dwa górne znaczenia – pierwsze jako numer zmiennej, a drugie jako jej<br />

wartość.<br />

‐ FVAR? ‐ zdejmuje ze stosu matematycznego górny element jako numer zmiennej, a na stos matematyczny kładzie kopię<br />

wartości tej zmiennej. Liczbę zmiennych globalnych zmiennoprzecinkowych dla danej wersji sterownika określa parametr<br />

F_MAX. Patrz: rozdz. 8 Tabela zasobów <strong>prog</strong>ramowych.<br />

‐ 18 ‐


Instrukcja <strong>prog</strong>ramowania w języku <strong>ForthLogic</strong> wersja <strong>P.1.2</strong><br />

Przykład:<br />

> 4.123 1 FVAR! ‐2.37889 16 FVAR!<br />

(OK)<br />

> 1 FVAR? F.<br />

4.123000 (OK)<br />

> 16 FVAR? FE.<br />

‐0.237889E+01 (OK)<br />

><br />

Często przy tworzeniu <strong>prog</strong>ramów dla zadań sterowania trzeba operować pojedynczymi bitami, tzw. flagami. Flaga to<br />

znacznik jednobitowy przyjmujący wartości logiczne 1 [PRAWDA] lub 0 [FAŁSZ], potrzebne do budowania logicznych zadań<br />

na potrzeby wewnętrzne <strong>prog</strong>ramu. Do pracy ze zmiennymi globalnymi jednobitowymi służą słowa FLAG! i FLAG?. Liczbę<br />

zmiennych bitowych dla danej wersji sterownika określa parametr B_MAX. Patrz: rozdz. 8 Tabela zasobów<br />

<strong>prog</strong>ramowych.<br />

‐ FLAG! ‐ zdejmuje ze stosu danych dwa górne znaczenia – pierwsze jako numer zmiennej, a drugie jako jej wartość i jest<br />

interpretowana jako wartość logiczna PRAWDA (1) lub FAŁSZ (0), przy czym PRAWDA jest definiowana przez każdą<br />

wartość różną od zera (również ze znakiem minus „‐”), a FAŁSZ przez jest definiowany tylko przez zero.<br />

‐ FLAG? ‐ zdejmuje ze stosu danych górny element jako numer zmiennej, a na stos danych kładzie kopię wartości tej<br />

zmiennej i jest interpretowana jako wartość logiczna PRAWDA (1) lub FAŁSZ(0).<br />

Przykład:<br />

> 1 1 FLAG! 0 16 FLAG! 124 100 FLAG!<br />

(OK)<br />

> 1 FLAG? . 16 FLAG? . 100 FLAG? .<br />

‐1 0 ‐1 (OK)<br />

><br />

Zmienna 16 kładzie na stos wartość logiczną FAŁSZ (na terminalu drukuj 0), ponieważ jej wartość została zdefiniowana<br />

jako 0. Wartość flagi 100 była zdefiniowana jako różna od zera i dlatego kładzie na stos wartości logiczne PRAWDA.<br />

Wartość PRAWDA na terminalu drukowana jest jako ‐1. Jest to spowodowane zapisem tej wartości jako liczby 32‐bitowej<br />

w systemie binarnym, w którym odbywają się wszystkie operacje obliczeniowe każdego procesora. Dla wartości logicznej<br />

PRAWDA jest to ciąg 32 „jedynek” (1), a bit o najwyższym znaczeniu wyznacza znak liczby (+/‐). Jeżeli jest to 1 to liczba jest<br />

o wartości ujemnej. Dlatego wartość PRAWDA jest zwracana i drukowana na terminalu (gdzie posługujemy się systemem<br />

dziesiętnym) liczba ‐1. Wartości logiczna FAŁSZ jako liczba 32‐bitowa w systemie binarnym to ciąg 32 „zer” (0), dlatego<br />

zwracana jest i drukowana na terminalu jako 0.<br />

Do wyzerowania zmiennych, oczyszczenia stosów danych i matematycznego oraz resetowania stanów wyjść (do wartości<br />

logicznej 0) służy słowo CLEARSYS.<br />

4.4.3 Zmienne wierszowe i formatowanie tekstu<br />

Wiersze pomagają użytkownikowi przy <strong>prog</strong>ramowaniu specyficznych poleceń, takich jak wykonanie i odbiór<br />

telefonicznych połączeń głosowych, odtworzenie plików dźwiękowych, drukowanie tekstów na wyświetlaczu sterownika,<br />

itp. Polecenia te wykorzystują sformatowaną treść buforu wyjściowego. Przy pracy w trybie terminalowym fort‐systemu,<br />

wprowadzenie wiersza w bufor wyjściowy skutkuje powieleniem go i wydrukowaniem w oknie terminal.<br />

Rozmiar bufora (liczbę znaków) dla danej wersji sterownika określa parametr OUTBUF_MAX. Patrz: rozdz. 8 Tabela<br />

zasobów <strong>prog</strong>ramowych.<br />

Dla tworzenia wiersza tekstu, który będzie drukowany w wyjściowym buforze służy słowo ." (kropka‐cudzysłów), po<br />

którym wprowadza się tekst składający się z dowolnych znaków, również spacji. Tekst trzeba rozpocząć od spacji. Na<br />

końcu tekstu trzeba wprowadzić spację i zamknąć słowem " (cudzysłowy).<br />

‐ 19 ‐


Sterowniki <strong>prog</strong>ramowalne MAX Logic<br />

> ." +48123456789 "<br />

+48123456789 (OK)<br />

> ." Witaj w systemie <strong>ForthLogic</strong> "<br />

Witaj w systemie <strong>ForthLogic</strong> (OK)<br />

Wiersz może być również zdefiniowany jako słowo i wywoływany w każdym momencie przez to słowo. Definiowanie<br />

słowa wywołującego wiersz zaczyna się słowem „:” (dwukropek) i kończy się słowem „;” (średnik) [standardowa<br />

procedura definiowania nowych słów]. Po dwukropku umieszcza się nazwę nowego słowa definiującego wiersz, a<br />

następnie pomiędzy słowami .” i ” umieszcza się tekst wiersza [standardowa procedura tworzenia wiersza]. Wiersz<br />

zdefiniowany jako słowo zachowuje się jak stała (nie podlega modyfikacji) i jest przechowywany w pamięci nieulotnej.<br />

> : Hi! ." Hello world! " ;<br />

(OK)<br />

> Hi!<br />

> Hello world! (OK)<br />

W języku <strong>ForthLogic</strong> istnieje możliwość zdefiniowania tzw. zmiennych wierszowych, służących do przechowywania w<br />

pamięci operacyjnej wierszy tekstu o długości do 15 znaków. Do pracy ze zmiennymi wierszowymi służą słowa STRING! i<br />

STRING?. Liczbę zmiennych wierszowych dla danej wersji sterownika określa parametr S_MAX. Patrz: rozdz. 8 Tabela<br />

zasobów <strong>prog</strong>ramowych.<br />

‐ STRING! ‐ definiuje numer i tekst zmiennej zdejmując ze stosu danych górne znaczenia jako numer zmiennej i sczytując z<br />

bufora wyjściowego ciąg znaków jako wiersz tekstu, który pozostaje w pamięci tej zmiennej. Znaki wprowadzone po spacji<br />

nie będą drukowane po wywołaniu tej zmiennej.<br />

‐ STRING? ‐ zdejmuje ze stosu danych górny element jako numer zmiennej, a na stos danych kładzie kopię wartości tej<br />

zmiennej (w tym przypadku jest to wiersz tekstu).<br />

> ." Tekst 15 znakow " 1 STRING!<br />

Tekst 15 znakow (OK)<br />

> 1 STRING?<br />

Tekst 15 znakow (OK)<br />

Tekst powyżej 15 znaków jest automatycznie ucinany.<br />

W poprzednich przykładach, przy drukowaniu znaczeń ze stosu i z bufora wyjściowego forth‐system automatycznie<br />

drukował jedną spację pomiędzy elementami. Automatyczne drukowanie spacji jest domyślnie dla forth‐systemu. Jednak<br />

można wyłączać i ponownie załączać automatyczny druk jednej spacji. Służą do tego słowa:<br />

NOAUTOSPACE ‐ wyłączenie automatycznego druku jednej spacji pomiędzy zdjętymi elementami stosu;<br />

AUTOSPACE ‐ załączenie automatycznego druku spacji pomiędzy zdjętymi elementami stosu.<br />

Aby powiększać liczbę spacji pomiędzy zdjętymi elementami stosu można zastosować słowo SPACE (spacja). Dane słowo<br />

drukuje w wyjściowym buforze i na terminalu dodatkową spację.<br />

> 5 23.5<br />

> ." Liczba " . SPACE SPACE ." TEMP.: " NOAUTOSPACE ." stC " AUTOSPACE<br />

Liczba 5 TEMP.: 23.5stC (OK)<br />

Do przeniesienia tekst do nowej linii służy słowo NEWLINE (nowa linia). Słowo to przenosi tekst w wyjściowym buforze i<br />

na terminalu do nowej linii. Praktyczne zastosowanie słowo to ma przy formatowaniu tekstu projektowanego na<br />

wyświetlaczu sterownika i dla formatowania tekstów SMS oraz formatu publikacji rejestrowanych danych.<br />

> ." linia pierwsza " NEWLINE ." linia druga "<br />

linia pierwsza<br />

linia druga (OK)<br />

W przypadku kiedy w samym formatowanym wierszu tekstu zachodzi potrzeba zastosowania cudzysłowów ( „ ” )<br />

oddzielonych od tekstu przynajmniej jedna spacją cudzysłowy możemy wprowadzić za pomoca słowa QUOTE.<br />

‐ 20 ‐


Instrukcja <strong>prog</strong>ramowania w języku <strong>ForthLogic</strong> wersja <strong>P.1.2</strong><br />

> NOAUTOSPACE ." Tekst “ SPACE QUOTE SPACE .” Hello world! " SPACE QUOTE<br />

> (OK) Tekst ” Hello world! "<br />

Na potrzeby realizacji zadań zachodzi potrzeba sprawdzenia czy wiersz w buforze wyjściowym nie jest „pusty”,<br />

ewentualnie, jakiej jest długości. Służy do tego słowo LENGHT (długość), które oblicza liczbę znaków wiersza wraz ze<br />

spacjami znajdującego się na dany moment w buforze wyjściowym i kładzie wynik na stos. Nie kasuje zawartości bufora<br />

wyjściowego.<br />

Do wykasowania tekstu znajdującego się na dany moment w buforze wyjściowym służy słowo FLUSH (zmyć).<br />

4.4 OPERACJE LOGICZNE<br />

Jak już wyjaśniano przy opisywaniu działania zmiennych jednobitowych (FLAG) w języku <strong>ForthLogic</strong> liczba 0 (w<br />

ekwiwalencie dwójkowym jej wszystkie pozycje to zera) przedstawia znaczenie logiczne FAŁSZ, a jakakolwiek inna liczba<br />

32‐bitowa przedstawia znaczenie logiczne PRAWDA. Jednocześnie słowa standardowe, które zwracają jako rezultat<br />

wartość logiczną, ze wszystkich możliwych postaci znaczenia PRAWDA wykorzystują tylko jedna wartość: liczbę ‐1 (w<br />

ekwiwalencie dwójkowym jej wszystkie pozycje to jedynki). Związane to jest z tym, że operacje logiczne: koniunkcji,<br />

dysjunkcji i zaprzeczenia wykonywane są na analogicznych pozycjach bitów danych operandów.<br />

Dla ułatwienia pracy przy tworzenia logicznych operacji istnieją specjalne stałe systemowe: TRUE (prawda) i FALSE (fałsz),<br />

które kładą na stos danych znaczenia logiczne PRAWDA i FAŁSZ.<br />

TRUE ‐ ‐‐‐> ‐1<br />

FALSE ‐ ‐‐‐> 0<br />

Dla opisanych znaczeń PRAWDA i FAŁSZ istnieją słowa, które wykonują logiczne obliczenia na górnych elementach stosu<br />

danych. Ich nazwy i funkcje są takie same jak znane, standardowe operatory matematycznych działań logicznych:<br />

AND A,B ‐‐‐> iloczyn logiczny (I) AB<br />

OR A,B ‐‐‐> suma logiczna (LUB) A+B<br />

XOR A,B ‐‐‐> symetryczna suma logiczna (ExOR) AB+ Ā B<br />

NOT A ‐‐‐> zaprzeczenie logiczne (NEGACJA) Ā<br />

Logiczne znaczenia wynikają także z operacji porównania. Te operacje zdejmują ze stosu dwa górne elementy, porównują<br />

je jako liczby ze znakiem i zwracają na stos danych porównania w postaci twierdzeń PRAWDA lub FAŁSZ. Znaki<br />

porównania, które wchodzą do zestawu bazowego słów mają ogólnie przyjęte oznaczenia:<br />

< A,B ‐‐‐> A < B mniejsze<br />

= A,B ‐‐‐> A = B równe<br />

> A,B ‐‐‐> A > B większe<br />

A A != B różne<br />

>= A,B ‐‐‐> A >= B większe lub równe<br />

Logiczne znaczenia również powstają w operacjach porównania liczb ze stosu matematycznego. Słowa usuwają z<br />

matematycznego stosа dwa górne znaczenia, porównują je jako liczby ze znakiem i kładą na stos danych wynik<br />

porównania pod postacią znaczeń PRAWDA lub FAŁSZ.<br />

Znaki porównania dla liczb zmiennoprzecinkowych:<br />

F< F: A,B ‐‐‐> F: ‐<br />

‐ ‐‐‐> A < B mniejsze<br />

F> F: A,B ‐‐‐> F: ‐<br />

‐ ‐‐‐> A > B większe<br />

Przykład obliczeń logicznych:<br />

‐ 21 ‐


Sterowniki <strong>prog</strong>ramowalne MAX Logic<br />

> 32 124 < .<br />

‐1 (OK)<br />

> 2.4e‐2 124.904 F< .<br />

‐1 (OK)<br />

> 1.23 56.5678 F> 34 35 < AND .<br />

0 (OK)<br />

> ‐1 DUP NOT . NOT NOT .<br />

0 ‐1 (OK)<br />

><br />

Do logicznych operacji na wartościach służą również słowa LSHIFT i RSHIFT. Dokonują one operacji przesunięcia bitowego<br />

ekwiwalentu dwójkowego wartości ze stosu danych. Przesunięcie bitowe jest to operacja na liczbach w systemie<br />

dwójkowym polegająca na przesunięciu wszystkich cyfr o n pozycji w lewo lub prawo. Jest to działanie powszechnie<br />

stosowane w informatyce. Najczęściej przesunięcie wykorzystuje się do szybkiego mnożenia/dzielenia przez liczbę 2 i jej<br />

potęgi, do sekwencyjnego testowania wartości poszczególnych bitów lub do logarytmicznych mechanizmów tworzenia<br />

masek bitowych, które są potrzebne przy ustalaniu pojedynczych bitów w logicznych operacjach.<br />

Słowo LSHIFT zdejmuje ze stosu danych dwa górne znaczenia ‐ pierwsze jako liczbę pozycji, o którą przesuwamy bity, a<br />

drugie jako wartość, na której dokonujemy logicznego przesunięcia bitowego w lewo. Na najmłodsze pozycje dopisywane<br />

są bit o wartości zero, natomiast najstarsze bity są tracone. Na stos danych kładzie się wynik wykonania, czyli nowa<br />

wartość, jaką otrzymaliśmy w wyniku przesunięcia bitowego.<br />

Słowo RSHIFT zdejmuje ze stosu danych dwa górne znaczenia ‐ pierwsze jako liczbę pozycji, o którą przesuwamy bity, a<br />

drugie jako wartość, na której dokonujemy logicznego przesunięcia bitowego w prawo. Na najstarsze pozycje dopisywane<br />

są bit o wartości zero, natomiast najmłodsze bity są tracone. Na stos danych kładzie się wynik wykonania, czyli nowa<br />

wartość, jaką otrzymaliśmy w wyniku przesunięcia bitowego.<br />

LSHIFT A,B ‐‐‐> (A (A >> B) logiczne przesunięcie w prawo bitów wartości B o A pozycji<br />

Przykład operacji przesunięcia logicznego:<br />

> 1 1 LSHIFT .<br />

2 (OK)<br />

> 2 1 RSHIFT .<br />

1 (OK)<br />

> 1 20 LSHIFT .<br />

1048576 (OK)<br />

> ‐1048576 20 RSHIFT .<br />

4095 (OK)<br />

><br />

4.5 STRUKTURA STEROWANIA<br />

W języku <strong>ForthLogic</strong> jest tylko jeden typ struktury sterowania procesem wykonania algorytmu. Jest to operator<br />

warunkowy. Operator warunkowy jest budowany przy pomocy słów IF, ELSE i THEN. Tworzą one czytelny schemat<br />

warunkowego wykonywania słów zawartych miedzy nimi. Słowa te możemy wykorzystać tylko podczas definicji nowego<br />

słowa. Same słowa IF, ELSE i THEN nie mają samodzielnego znaczenia. Razem wyznaczają odpowiednie pola dla słów,<br />

które maja być wykonane przy zachodzących warunkach. Całe wyrażenie operatora ma następujący schemat: IF ELSE THEN. Słowo IF zdejmuje element ze szczytu stosu i rozpatruje go jako wartość logiczną ‐ jeżeli<br />

jest to PRAWDA (jakakolwiek wartość nie zerowa), to wykonywane są słowa z pola , czyli słowa znajdujące się<br />

między IF a ELSE; jeżeli FAŁSZ (równa się zeru), to wykonywane są słowa z pola , czyli słowa znajdujące się między<br />

ELSE a THEN.<br />

Istnieje szczególna postać operatora warunkowego. Polega na tym, że pola wraz ze słowem ELSE może nie być.<br />

Wtedy operator warunkowy ma postać skróconą IF THEN. Jeżeli element logiczny zdjęty ze stosu przed<br />

‐ 22 ‐


Instrukcja <strong>prog</strong>ramowania w języku <strong>ForthLogic</strong> wersja <strong>P.1.2</strong><br />

słowem IF jest PRAWDĄ, to wykonywane są słowa, z których składa się , a jeśli FAŁSZEM, to operator nie<br />

wykonuje żadnych działań. W obu przypadkach warunek dla słowa IF jest obliczany przez poprzedzające go słowa.<br />

Podamy przykład zdefiniowanego słowa warunek ‐ rozpatrującego warunek matematyczny lub logiczny przed nim i<br />

drukujące słowo prawda lub fałsz, w zależności od prawdziwości postawionego warunku:<br />

> : warunek IF .” prawda „ ELSE .” falsz „ THEN ;<br />

(OK)<br />

> 1 warunek<br />

prawda (OK)<br />

> 0 warunek<br />

falsz (OK)<br />

> ‐123 warunek<br />

prawda (OK)<br />

> 1 2 = warunek<br />

falsz (OK)<br />

Rozpatrzymy przykład budowy wielostopniowego wyboru na podstawie warunkowego operatora:<br />

: temp<br />

DUР 18 < IF ." Chlodno " ELSE<br />

DUP 21 < IF ." Umiarkowanie " ELSE<br />

DUP 25 < IF ." Cieplo " ELSE<br />

DUP 30 < IF ." Goraco " ELSE<br />

." Upalnie "<br />

THEN THEN THEN THEN DROP ;<br />

(OK)<br />

> 22 temp<br />

Cieplo (OK)<br />

Zdefiniowaliśmy słowo temp, które ze szczytu stosu zdejmuję wartość i porównuję ją kolejno z zadanymi wartościami. W<br />

przypadku, kiedy wynikiem porównania jest FAŁSZ, porównanie odbywa się na kolejnym poziomie, aż do momentu<br />

otrzymania PRAWDY. Wtedy kolejne porównania nie odbywają się, a wiersz podany między słowami IF i ELSE zostaje<br />

wydrukowany.<br />

W tym przykładzie pokazano również możliwość jednego, tego samego wykonania pola dla wszystkich kolejnych<br />

operatorów. Przy takim złożeniu słów operatora należy pamiętać, aby liczba słów THEN była taka sama jak IF i ELSE.<br />

Operator warunkowy można również zastosowanie dla porównań wartości ze stosu matematycznego oraz dla wartości<br />

logicznych. Można nawet porównywać różne typy danych w granicach jednego takiego wyrażenia.<br />

4.6 TIMERY I WIELOZADANIOWOŚĆ<br />

Forth‐system funkcjonuje w środowisku wielozadaniowym, więc język <strong>ForthLogic</strong> pozwala opisywać procesy wykonywane<br />

równolegle. Ta właściwość ściśle związana jest ze słowem timer. Timer ‐ to <strong>prog</strong>ramowy obiekt, który pozwala realizować<br />

interwał czasowy po zakończeniu, którego wykonywane jest podane słowo.<br />

Liczbę timerów dla danej wersji sterownika określa parametr T_MAX. Patrz: rozdz. 8 Tabela zasobów <strong>prog</strong>ramowych.<br />

Do konfiguracji timerów służy słowo TIMER!. Słowo to ze stosu matematycznego zdejmuje górny element jako czasową<br />

zwłokę w sekundach, a górny element ze stosu danych jako numer timera. Po słowie TIMER! podaje się słowo, które jest<br />

wykonane po odliczeniu ustawionego interwału czasowego przez ten timer.<br />

Forth‐system pozwala realizować interwały czasowe w zakresie 0,01sek ÷ 21474836,47sek (248 dni) ze skokiem, co<br />

0,01sek. Szczególny przypadek interwału czasowego, to 0 sek (parametr 0.0). Zwłoka 0 sec oznacza bezzwłoczne<br />

wykonanie słowa danego timera.<br />

Słowo TIMER! jest słowem wywoławczym. Bezpośrednio po może znaleźć się tylko inne słowo jako wymagany parametr<br />

wykonawczy, natomiast nie mogą zostać podane jakiekolwiek wartości wprowadzane na stos lub do bufora wejściowego.<br />

‐ 23 ‐


Sterowniki <strong>prog</strong>ramowalne MAX Logic<br />

Może to być jakiekolwiek słowo znane forth‐systemowi, standardowe lub zdefiniowane. Jeżeli zachodzi potrzeba użycia<br />

słowa, które wymaga podania wartości ze stosu lub z bufora wyjściowego jako parametrów wykonawczych tego słowo, to<br />

należy uprzednio zdefiniować nowe słowo zawierające wymagane słowa oraz wprowadzające na stos odpowiednie<br />

wartości i realizujące wymagane funkcje.<br />

Przykład wykorzystania timera:<br />

> : on1 1 1 RO! ;<br />

(OK)<br />

> 4.0 1 TIMER! on1<br />

(OK)<br />

><br />

Zdefiniowaliśmy nowe słowo on1, które ustawia wartość logiczną dla wyjścia przekaźnikowego S1 (przełącza styk<br />

przekaźnika w stan aktywny). Dalej uruchomiliśmy timer 1 na czas 4 sek., po zakończeniu, którego będzie wykonane słowo<br />

on1 (UWAGA! Czas zwłoki podany w postaci liczby zmiennoprzecinkowej). Tak więc, styk przekaźnika przełączą się po 4<br />

sekundach (licząc od chwili zakończonego powodzeniem przetworzenia ostatniego wiersza tekstu przez interpretator<br />

forth‐systemu, czyli w tym przypadku po wydrukowaniu powiadomienia „OK”).<br />

Słowo TIMER! można używać także przy definicji nowych słów, wtedy pojawia się możliwość tworzenia sekwencji działań<br />

wykonywanych z pewnym odstępem czasowym. Jedną z postaci takich sekwencji jest tworzenie działań, wykonywanych<br />

cyklicznie nieskończoną ilość razy. Przykład:<br />

> : alarm 1 RO? NOT 1 RO! 2.0 1 TIMER! alarm ;<br />

(OK)<br />

> alarm<br />

(OK)<br />

><br />

Zdefiniowaliśmy nowe słowo alarm z następującą treścią wykonania: na stos kładziemy wartość logicznego stanu wyjścia<br />

przekaźnikowego S1 (1‐ aktywne; 0‐ bierne), dokonuje się logiczna inwersja szczytu stosu (słowo NOT: jeżeli było 1 to na<br />

stos kładzie 0). Znaczenie to zdejmowane jest ze stosu jako wartość logicznego stanu wyjścia przekaźnikowego S1.<br />

Następnie uruchamia się timer 1 na czas 2 sekundy, po zakończeniu, którego będzie ponownie wykonane słowo alarm.<br />

Czyli cały proces wykonania słowa alarm znów się powtórzy. Po zdefiniowaniu słowa, wykonujemy słowo alarm,<br />

uruchamiając w ten sposób nieskończoną ilość razy proces przełączania styku przekaźnika S1.<br />

W trakcie pracy timera (kiedy trwa wsteczne odliczanie czasu) można go ponownie uruchomić na wykonanie innego słowa<br />

z innym interwałem czasowym. Przy czym poprzednie słowo i poprzedni interwał czasowy zostają anulowane. Do<br />

faktycznego zatrzymania uruchomionego timera służy słowo STOP, które nie wykonuje żadnej akcji. Należy je podać jako<br />

wykonywane po interwale czasowym danego timera przy ponownym uruchomieniu tego timera. Przykład:<br />

> : end 0.0 1 TIMER! STOP ;<br />

(OK)<br />

> end<br />

(OK)<br />

W zdefiniowanym słowie end przemianowaliśmy timer 1 ze słowa alarm na słowo STOP i zatrzymaliśmy nieskończone<br />

działanie słowa alarm. Interwał czasowy 0.0 sekund, który wskazaliśmy w przykładzie, w tym wypadku oznacza<br />

bezzwłoczne wykonanie słowa STOP.<br />

Do zatrzymania wszystkich timerów służy słowo STOPALL (zatrzymać wszystko). Słowo to zatrzymuje wszystkie „biegnące”<br />

timery oraz anuluje wykonanie słowa podanego po danym timerze. Słowo to szczególnie przydatne jest podczas pracy<br />

terminalowej przy wykonywaniu testów napisanej aplikacji.<br />

Za pomocą timerów możemy uruchomić wiele pojedynczych zadań, z których każde opisane jest swoim słowem. Do<br />

rozpoznawania zadań timerów służą słowa TIMER? i słowo NAME (imię).<br />

Słowo TIMER? zdejmuje ze stosu górny element jako numer timera. Na stos danych kładzie wynik wykonania: w<br />

przypadku, kiedy timer jest w stanie odliczania interwału czasowego będzie to adres słowa, które zostanie wykonane po<br />

‐ 24 ‐


Instrukcja <strong>prog</strong>ramowania w języku <strong>ForthLogic</strong> wersja <strong>P.1.2</strong><br />

słowie TIMER!, a w przypadku kiedy timer nie jest uruchomiony będzie to 0.<br />

Z uwzględnieniem poprzedniego podamy następujący przykład:<br />

> alarm<br />

(OK)<br />

> 1 TIMER? DUP . NAME<br />

1534 alarm (OK)<br />

> end<br />

(OK)<br />

> 1 TIMER? DUP . NAME<br />

0 (OK)<br />

><br />

Ponieważ po wykonaniu słowa alarm, timer 1 uruchamia się ponownie, to w jakiejkolwiek chwili czasu, podczas<br />

wykonania słowa TIMER?, na stos będzie położony adres słowa „alarm” (pokazane znaczenie adresu przytoczono w<br />

przykładzie). Za pomocą słów DUP . NAME zarazem przywołaliśmy na terminal adres i nazwę słowa. Po zatrzymaniu<br />

wykonywania słowa alarm i powtórzeniu procedury na stosie będzie wartość 0, a wiersz z nazwą słowa nie jest<br />

drukowany.<br />

4.7 WYKONANIA WEKTOROWE<br />

Wiemy, że przy definicji nowych słów musimy stosować znane fort‐systemowi słowa. Jednak, istnieje mechanizm, który<br />

pozwala zdefiniować słowo, które w swej definicji zawiera słowo jeszcze nie zdefiniowane. Ten mechanizm ściśle związany<br />

jest z pojęciem wykonania wektorowego i opiera się na słowach EXECUTE i FIND. Słowo EXECUTE (wykonać) zdejmuje ze<br />

stosu górne znaczenie jako wykonawczy adres jakiegokolwiek słowa w słowniku i dane słowo natychmiast wykonywane<br />

jest tak, jakby było bezpośrednio wprowadzone do fortu‐systemu. Uwaga: zalecana duża ostrożność przy pracy z<br />

adresami wykonawczymi ‐ jeśli liczba na szczycie stosu podczas wykonania słowa EXECUTE nie jest takim adresem, to<br />

skutki wykonania słowa EXECUTE będą nieprzewidywalne! Dzięki słowu EXECUTE pojawia się możliwość przekazania<br />

przez stos adresu wykonawczego tego samego typu słów i w ten sposób zrealizować wektorowe, czyli zależne od<br />

kontekstu wykonanie <strong>prog</strong>ramu.<br />

Wykonawczy adres słowa można za pomocą słowa FIND (znaleźć). Słowo FIND sczytuje wiersz z bufora wyjściowego do<br />

pierwszej spacji (słowo, dla którego trzeba znaleźć wykonawczy adres) i jeśli słowo to jest znane forth‐systemowi, na stos<br />

kładzie adres wykonawczy tego słowa.<br />

Przytoczymy przykład aplikacji wspomnianych słów:<br />

> 0 CONSTANT 1beep_adr<br />

(OK)<br />

> : (1beep) 1beep_adr EXECUTE ;<br />

(OK)<br />

> : 2beep 1.0 1000 BEEP 1.0 1 TIMER! (1beep) ;<br />

(OK)<br />

> : 1beep 1.0 2000 BEEP 1.0 1 TIMER! 2beep ;<br />

(OK)<br />

> ." 1beep " FIND TO 1beep_adr<br />

(OK)<br />

> 1beep<br />

(OK)<br />

><br />

Najpierw stworzyliśmy stałą 1beep_adr dla otrzymania wykonawczego adresu (można zastosować zmienną). Następnie<br />

stworzyliśmy słowo‐translator (1beep), które wykonuje adres 1beep_adr. To słowo można wykorzystywać tam, gdzie<br />

planowało się wykorzystać jeszcze niezdefiniowane słowo 1beep w słowie 2beep. I wreszcie, definiujemy słowo 1beep.<br />

Przypisujemy adres wykonawczy słowa 1beep do stałej 1beep_adr, i tym samym tworzymy nieskończoną kolejność<br />

wykonania słów 1beep 2beep 1beep...<br />

‐ 25 ‐


Sterowniki <strong>prog</strong>ramowalne MAX Logic<br />

4.8 PRACA Z HARDWARE<br />

Do pracy z platformą hardware, na której zrealizowano forth‐system, w języku <strong>ForthLogic</strong> istnieje szereg słów<br />

standardowych, które można podzielić na odpowiednie grupy: wejścia, wyjścia, port RS‐485, połączenia głosowe, SMS.<br />

4.8.1 Status WEJŚĆ/WYJŚĆ<br />

W trybie pracy terminalowej sterowników H01 i H02 (bez wyświetlacza), w oknie terminalu projektowany jest pasek<br />

statusu. Pasek statusu wejść i wyjść pozwala na optyczną orientację stanu pracy sterownika, informuje o wersji<br />

o<strong>prog</strong>ramowania firmware, dostępnej pamięci, parametrach napięć zasilania i sieci GSM.<br />

Version: ‐ numer wersji o<strong>prog</strong>ramowania firmware.<br />

Free Log menory: ‐ liczba kilobajtów wolnych dla rejestracji danych Log w pamięci sterownika.<br />

Free Forth menory: ‐ liczba bajtów wolnych dla aplikacji w języku <strong>ForthLogic</strong> w pamięci sterownika.<br />

Time: ‐ czas systemowy sterownika (godz. ‐ minuty ‐ sekundy).<br />

Date: ‐ ustawiona data (dzień ‐ miesiąc ‐ rok).<br />

POW: ‐ wyświetla wartości napięcia zasilania.<br />

BAT: ‐ wyświetla wartości napięcia podłączonego akumulatora. W przypadku braku podłączenia akumulatora będzie<br />

podawana wartość napięcia ładowania na wyjściu.<br />

GSM: ‐ zasięg i nazwa operatora.<br />

AI: ‐ stan wejść analogowych (jeżeli zostały takimi ustawione). Górny wiersz wyświetla numer wejścia. Dolny wiersz<br />

odpowiednio wyświetla aktualną wartość wchodząca wyrażoną w jednostkach rozdzielczości wejścia analogowego<br />

sterownika (0÷1024).<br />

DI: ‐ stan wejść cyfrowych (jeżeli zostały takimi ustawione). Górny wiersz wyświetla numer wejścia. Dolny wiersz<br />

odpowiednio wyświetla aktualny stan wejścia (0 – bierne; 1 – aktywne).<br />

DO: ‐ stan wyjść cyfrowych. Górny wiersz wyświetla numer wyjścia. Dolny wiersz odpowiednio wyświetla aktualny stan<br />

wyjścia (0 – bierne; 1 – aktywne).<br />

RO: ‐ stan wyjść przekaźnikowych. Górny wiersz wyświetla numer wyjścia. Dolny wiersz odpowiednio wyświetla aktualny<br />

stan wyjścia (0 – bierne; 1 – aktywne).<br />

Do wywołania paska statutu służy rozkaz systemowy SHOW STATUS.<br />

Do ukrycia paska statutu służy rozkaz systemowy HIDE STATUS.<br />

W sterownikach typu H03 i H04 status WE/WY projektowany jest na ekranie sterownika [MENU ‐> System ‐> SERWIS ‐><br />

STATUS WE/WYJ].<br />

‐ 26 ‐


Instrukcja <strong>prog</strong>ramowania w języku <strong>ForthLogic</strong> wersja <strong>P.1.2</strong><br />

4.8.2 Blokada dostępu do systemu<br />

Dostęp do forth‐systemu może być zablokowany i chroniony hasłem. Służy do tego słowo PASSWORD.<br />

Słowo to wymaga podania dodatkowych, specjalnych stałych systemowych, które określają sposób pracy komunikatora.<br />

Stałe systemowe dla słowa PASSWORD:<br />

‐ PROTECT_BY ‐ blokada dostępu hasłem;<br />

‐ DISABLE ‐ brak blokady dostępu.<br />

Załączenie wraz z ustanowieniem hasła lub wyłączenie blokad zależy od odpowiedniej kombinacji powyższych stałych i<br />

słowa PASSWORD. Hasło musi składać się tylko z cyfr.<br />

PROTECT_BY ." 1234 " PASSWORD<br />

DISABLE PASSWORD<br />

‐ załączenie blokady dostępu z jednoczesnym<br />

ustanowieniem hasła (w tym przykładzie 1234)<br />

‐ wyłączenie blokady dostępu<br />

Ustanowienie hasła blokuje dostęp do systemu poprzez okno terminalu, poprzez wejściowe SMSy i połączenia głosowe oraz<br />

w przypadku sterowników z graficznym menu konfiguracyjnym (H03 i H04) również dostęp do tego menu. Wejście do<br />

systemu poprzez okno terminalu poprzedzone będzie żądaniem podania hasła [ACCESS DENIED! ENTER PASSWORD: ].<br />

Dostęp poprzez operatorskie menu głosowe (IVR) poprzedzony jest żądaniem hasła, które wprowadzamy za pomocą<br />

klawiatury telefonu (funkcja DTMF). W trybie SMS tekst wejściowego SMSa musi być poprzedzony hasłem, np.: „1234 1 1<br />

RO!”.<br />

UWAGA!<br />

Dla sterowników typu H03 i H04 ustawiania kontroli dostępu wyłącznie w menu konfiguracyjnym.<br />

4.8.3 Wejścia<br />

Sygnały podawane na wejścia analogowe i cyfrowe sterownika poddawane są filtracji. Sygnały analogowe filtrowane są<br />

cyfrowym filtrem dolnoprzepustowym o częstotliwości granicznej 0,24Hz i czasie odpowiedzi skokowej równym 690ms.<br />

Filtracja sygnałów cyfrowych odbywa się poprzez porównywanie kilku kolejno odczytanych wartości napięcia na wejściu<br />

cyfrowym. Jeżeli wszystkie te napięcia odpowiadają temu samemu poziomowi logicznemu, to jest on przyjmowany jako<br />

aktualny poziom logiczny wejścia. Zastosowanie takiego rozwiązania umożliwia wyeliminowanie zakłóceń sygnału<br />

wejściowego krótszych niż 40ms.<br />

Do pracy z wejściami cyfrowymi i analogowymi służą słowa DI? i AI?:<br />

‐ DI? ‐ zdejmuje ze stosu górne znaczenie jako numer wejścia w zakresie od 1 do 8, a jako wynik kładzie na stos logiczny<br />

stan odpowiedniego wejścia cyfrowego DI/AI1÷DI/AI4, DI5÷DI8. Stan logiczny FAŁSZ (0) oznacza stan bierny wejścia,<br />

natomiast stan logiczny PRAWDA (1) oznacza stan aktywny wejścia, czyli zamknięcie obwodu między tym wejściem a<br />

masą (GND). W przypadku wejść DI/AI1÷DI/AI4, jeżeli to wejście zostało skonfigurowane jako analogowe, to stan logiczny<br />

tego wejścia zawsze będzie FAŁSZ (0). Liczbę wejść cyfrowych danej wersji sterownika określa parametr DI_MAX. Patrz:<br />

rozdz. 8 Tabela zasobów <strong>prog</strong>ramowych.<br />

‐ AI? ‐ zdejmuje ze stosu górne znaczenie jako numer wejścia w zakresie od 1 do 4, a jako wynik kładzie na stos<br />

matematyczny wartość odpowiedniego wejścia analogowego DI/AI1÷DI/AI4 (jeżeli to wejście zostało skonfigurowane jako<br />

analogowe). Jeżeli wejście ustawiono jak prądowe, to wartość odpowiada prądowi w miliamperach [mA]. Jeżeli wejście<br />

ustawiono jako napięciowe, to znaczenie odpowiada napięciu w woltach [V]. Jeżeli wejście ustawiono jak cyfrowe, to<br />

wartość położona na stos przyjmuje znaczenie z zakresu 0÷1023 i jest analogiczna do wartości wejściowej podanej na to<br />

wejście. Liczbę wejść analogowych danej wersji sterownika określa parametr AI_MAX. Patrz: rozdz. 8 Tabela zasobów<br />

<strong>prog</strong>ramowych.<br />

‐ AIS? – (tylko dla H04) zdejmuje ze stosu górne znaczenie jako numer wejścia w zakresie od 1 do 4, a jako wynik kładzie<br />

na stos matematyczny przeskalowaną wartość (np. z zakresu pomiarowego czujnika przetwornika ACP) odpowiedniego<br />

‐ 27 ‐


Sterowniki <strong>prog</strong>ramowalne MAX Logic<br />

wejścia analogowego DI/AI1÷DI/AI4, przy czym skalowanie wartości odbywa się zgodnie z parametrami skalowania<br />

podanymi w menu konfiguracyjnym [Wejścia ‐> DI/AI1÷DI/AI4 ‐> SKALA]. Jeżeli wejście ustawiono jak cyfrowe, to wartość<br />

położona na stos przyjmuje znaczenie z zakresu 0÷1023 i jest analogiczna do wartości wejściowej podanej na to wejście.<br />

UWAGA! Zakresy wejść analogowych są uzależnione od konfiguracji sprzętowej i <strong>prog</strong>ramowej i mogą przyjmować<br />

następujące wartości z zakresu: 0÷~21,5mA; 0÷~10,3V oraz 0÷1023 dla podziałki cyfrowej (10 bitów).<br />

> 1 DI? .<br />

0 (OK)<br />

> 5 DI? .<br />

‐1 (OK)<br />

> 1 AI? F. 2 AI? F. 2 AIS? F.<br />

456.000000 6.683519 46.936302 (OK)<br />

><br />

W tym przykładzie, między innymi zapytaliśmy o stan wejść analogowych. Dla wejścia AI1 skonfigurowanego <strong>prog</strong>ramowo<br />

jako cyfrowe otrzymaliśmy wartość z zakresu podziałki cyfrowej. Dwukrotnie zapytaliśmy też o stan wejścia AI2<br />

skonfigurowanego jako napięciowe. Najpierw słowem AI?, gdzie otrzymaliśmy wartość z zakresu napięcia, a następnie<br />

słowem AIS?, gdzie otrzymaliśmy przeskalowaną wartość w menu konfiguracyjnym z zakresu ‐20÷+80.<br />

Konfiguracja <strong>prog</strong>ramowa typu wejść w sterownikach typu H01 i H02<br />

Dla ustalania typu kombinowanych wejść służy słowo DIAI. Słowo to wymaga podania dodatkowych, specjalnych stałych<br />

systemowych, które określają typ wejścia.<br />

Stałe systemowe dla słowa DIAI:<br />

‐ SET_TO_V ‐ wejście analogowe napięciowe<br />

‐ SET_TO_I ‐ wejście analogowe prądowe<br />

‐ SET_TO_D ‐ wejście cyfrowe<br />

‐ typ wejścia ‐ może przyjmować znaczenie<br />

DIAI<br />

SET_TO_V, SET_TO_I albo SET_TO_D;<br />

‐ numer wejścia ‐ liczba całkowita z zakresu 1÷4.<br />

W sterownikach typu H03 i H04 parametry te ustawiane są w menu konfiguracyjnym.<br />

Słowo DIAIPARAM – kładzie na stos wartości określające ustawienia wejść.<br />

Znaczenia słowa:<br />

SET_TO_D = 0<br />

SET_TO_V = 1<br />

SET_TO_I = 2<br />

4.8.4 Wyjścia<br />

Do pracy z cyfrowymi wyjściami służą słowa DO? i DO!:<br />

‐ DO? ‐ zdejmuje ze stosu górne znaczenie jako numer wyjścia w zakresie od 1 do 4, i kładzie na stos logiczny stan<br />

odpowiedniego wyjścia cyfrowego DO1÷DO4. Stan logiczny FAŁSZ oznacza stan bierny wyjścia, natomiast stan logiczny<br />

PRAWDA oznacza stan aktywny wejścia, czyli tranzystor odpowiedniego wyjścia znajduje się w stanie przewodzenia.<br />

‐ DO! ‐ zdejmuje ze stosu dwa górne znaczenia, pierwsze jako numer wyjścia w zakresie od 1÷4, drugie jako stan tego<br />

wyjścia. Stan logiczny PRAWDA ustawia wyjście w stan aktywny, co oznacza, że tranzystor tego wyjścia będzie znajduje się<br />

w stanie przewodzenia. Stan logiczny FAŁSZ ustawia wyjście w stan bierny.<br />

Liczbę wyjść cyfrowych danej wersji sterownika określa parametr DO_MAX. Patrz: rozdz. 8 Tabela zasobów<br />

<strong>prog</strong>ramowych.<br />

Do pracy z wyjściami przekaźnikowymi służą słowa RO? i RO!:<br />

‐ RO? ‐ zdejmuje ze stosu górne znaczenie jako numer wyjścia w zakresie od 1 do 3, i kładzie na stos logiczny stan<br />

odpowiedniego wyjścia przekaźnikowego RO1÷RO3. Stan logiczny FAŁSZ oznacza stan bierny styku, natomiast stan<br />

‐ 28 ‐


Instrukcja <strong>prog</strong>ramowania w języku <strong>ForthLogic</strong> wersja <strong>P.1.2</strong><br />

logiczny PRAWDA oznacza stan aktywny styku, czyli załączenia.<br />

‐ RO! ‐ zdejmuje ze stosu dwa górne znaczenia, pierwsze jako numer wyjścia w zakresie od 1÷3, drugie jako stan tego<br />

wyjścia. Stan logiczny PRAWDA) ustawia wyjście w stan aktywny, co oznacza załączenie styku. Stan logiczny FAŁSZ ustawia<br />

wyjście w stan bierny.<br />

Liczbę wyjść przekaźnikowych danej wersji sterownika określa parametr RO_MAX. Patrz: rozdz. 8 Tabela zasobów<br />

<strong>prog</strong>ramowych.<br />

Przykład:<br />

> 1 DO? . 1 1 DO! 1 DO? .<br />

0 ‐1 (OK)<br />

> 3 RO? .<br />

‐1 (OK)<br />

> 3 RO? NOT 3 RO!<br />

(OK)<br />

> 3 RO? .<br />

0 (OK)<br />

><br />

Do wyzerowania zmiennych, oczyszczenia stosów danych i matematycznego oraz resetowania stanów wyjść (do wartości<br />

logicznej 0) służy słowo CLEARSYS.<br />

4.8.5 Port komunikacyjny RS‐485 i protokół komunikacyjny MODBUS RTU<br />

Sieć urządzeń komunikujących się według protokołu Modbus RTU składa się z jednego urządzenia typu MASTER i jednego<br />

lub wielu urządzeń typu SLAVE. Poszczególne urządzenia połączone są równolegle poprzez interfejs RS‐485. Komunikacja<br />

może być inicjowana wyłącznie przez urządzenie MASTER, natomiast urządzenia typu SLAVE mogą tylko odpowiadać na<br />

zapytanie.<br />

Domyślnie dane pomiędzy urządzeniem nadrzędnym i podrzędnym przesyłane są z prędkością 9600bitów/sek. w postaci<br />

11‐bitowych pakietów. Każdy pakiet zaczyna się od bitu startu (o wartości zero), następnie wysyłany jest bajt (osiem<br />

bitów) z danymi, a na końcu wysyłane są dwa bity stopu (o wartości 1). Pojedyncze pakiety składają się na ramkę<br />

komunikatu o ściśle określonej strukturze:<br />

ADRES FUNKCJA DANE CRC<br />

1 BAJT 1 BAJT N BAJTÓW 2 BAJTY<br />

Urządzenie MASTER zaczyna każdą ramkę od adresu urządzenia SLAVE, do którego adresowana jest przesyłka. Każde<br />

urządzenie SLAVE musi mieć niepowtarzalny adres sieciowy z zakresu od 1 do 247. W przypadku, gdy urządzenie SLAVE<br />

wysyła odpowiedź na zapytanie, to w polu adresu umieszcza swój adres sieciowy, co umożliwia zweryfikowanie skąd<br />

przyszła odpowiedź. Kolejny bajt ramki wysłanej przez urządzenie MASTER zawiera kod polecenia, które ma być<br />

wykonane przez urządzenie SLAVE. W odpowiedzi SLAVE wysyła ramkę z takim samym kodem funkcji. W dalszej<br />

kolejności następuje wysłanie lub odbiór danych. Ilość i format przesłanych danych zależą od kodu realizowanej aktualnie<br />

funkcji. Na zakończenie do ramki dołączane są dwa bajty z sumą kontrolną CRC. Przeznaczeniem sumy CRC jest eliminacja<br />

błędów, które mogą powstać podczas przesyłania danych, na przykład na skutek oddziaływania silnych zakłóceń<br />

elektromagnetycznych.<br />

Do zmiany domyślnych parametrów komunikacyjnych portu służy słowo MODBUSPARAM, które przyjmuje postać:<br />

MODBUSPARAM<br />

Zmiana parametrów komunikacji portu<br />

Parzystość: NONE [brak]; EVEN [parzyste]; ODD [nieparzyste]<br />

< stopbits > Liczba bitów stopu: 1 lub 2. [Dla parzystości NONE ma sens tylko 1]<br />

< baudrate> Prędkość transmisji bit/sek: 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200<br />

‐ 29 ‐


Sterowniki <strong>prog</strong>ramowalne MAX Logic<br />

Sterownik MAX Logic zapewnia obsługę następujących poleceń:<br />

- 01 (0x01) Read Coils – Odczyt stanów jednego lub wielu kolejnych wyjść binarnych<br />

- 02 (0x02) Read Discrete Inputs – Odczyt wartości jednego lub wielu kolejnych wejść binarnych<br />

- 03 (0x03) Read Holding Registers – Odczyt wartości z jednego lub wielu kolejnych rejestrów 16‐bitowych<br />

- 04 (0x04) Read Input Registers – Odczyt wartości z jednego lub wielu kolejnych rejestrów 16‐bitowych<br />

- 05 (0x05) Write Single Coil – Ustawienie wartości pojedynczego wyjścia binarnego<br />

- 06 (0x06) Write Single Register – Ustawienie wartości pojedynczego rejestru 16‐bitowego<br />

- 15 (0x0F) Write Multiple Coils – Ustawienie wartości wielu kolejnych wyjść binarnych<br />

- 16 (0x10) Write Multiple registers – Ustawienie wartości wielu kolejnych rejestrów<br />

Protokół Modbus umożliwia operowanie na dwóch typach danych:<br />

‐ dane bitowe wykorzystywane do przedstawiania stanów wejść i wyjść cyfrowych. Dane bitowe przyjmować mogą<br />

wartości 1 lub 0.<br />

‐ dane rejestrowe – przedstawiane w postaci zmiennych 16‐bitowych, mogących przyjmować wartości od 0 do 65535.<br />

Każde wykorzystanie polecenia komunikacyjnego związane jest z wymianą danych pomiędzy urządzeniem Master i Slave.<br />

W związku z tym dla każdego z poleceń rezerwowany jest bufor danych znajdujący się w obszarze zmiennych bitowych<br />

(FLAG) sterownika – dla danych bitowych, lub w obszarze zmiennych globalnych (VAR) – dla zmiennych rejestrowych.<br />

Polecenia komunikacyjne w sterowniku realizowane mogą być w dwóch trybach – cyklicznie, gdzie polecenia powtarzane<br />

zostają automatycznie, co zadany okres czasu, oraz w trybie pojedynczego wywołania. Możliwe jest jednoczesne<br />

zdefiniowanie do 4 pakietów cyklicznych oraz dowolną liczbę poleceń pojedynczych ( o tym samym numerze pakietu).<br />

Do inicjowania poleceń komunikacyjnych służy słowo MODBUSSTART, przy czym zgodnie z konwencją języka <strong>ForthLogic</strong> w<br />

pierwszej kolejności określane są parametry połączenia, a dopiero na końcu wprowadzane jest słowo MODBUSSTART. Dla<br />

polecenia cyklicznego przekazywana jest do funkcji stała systemowa CYCLIC_ACCESS, natomiast dla polecenia<br />

pojedynczego jest to stała SINGLE_ACCESS.<br />

Pełna składnia polecenia przedstawiona jest poniżej (wszystkie parametry są obowiązkowe).<br />

Dla wywołania cyklicznego:<br />

CYCLIC_ACCESS MODBUSSTART<br />

Dla wywołania pojedynczego:<br />

SINGLE_ACCESS < func> MODBUSSTART<br />

Parametry:<br />

<br />

<br />

<br />

<br />

<br />

<br />

Określa czas (w sekundach) po którym zostanie powtórzone wywołanie cykliczne.<br />

Parametr ten może przyjmować wartości od 0,1 sek. do 600 sek., ze skokiem 0,01 sek.<br />

Adres urządzenia Slave do którego adresowane jest polecenie. Parametr ten może<br />

przyjmować wartości z przedziału od 1 do 247<br />

Adres komórki pamięci (rejestru) urządzenia Slave, od którego rozpocznie się<br />

wysyłanie / odbieranie danych. Parametr ten może przyjmować wartości z przedziału<br />

od 0 do 65535.<br />

Ilość kolejnych danych bitowych lub rejestrowych, które mają zostać odebrane lub<br />

wysłane z urządzenia Slave począwszy od numeru adresu komórki pamięci urządzenia<br />

Slave (). Parametr ten może przyjmować wartości z przedziału od 1 do 64.<br />

Numer pierwszej zmiennej globalnej całkowitej (VAR) lub bitowej (FLAG) sterownika,<br />

od której rozpoczyna się przypisanie wartości rejestrów odczytanych z urządzenia<br />

Slave lub, od której rozpoczyna się zapisywania wartości rejestrów w urządzeniu Slave<br />

(rozmiar tablicy jest zgodny z wartością określoną parametrem ).<br />

Kod polecenia, które ma zostać wykonane. Polecenia te mogą przyjmować<br />

następującą postać:<br />

READ_COILS ‐ Odczyt stanów jednego lub wielu kolejnych wyjść binarnych (kod<br />

polecenia 0x01).<br />

READ_INPUTS ‐ Odczyt wartości jednego lub wielu kolejnych wejść binarnych (kod<br />

polecenia 0x02).<br />

READ_HOLDREGS ‐ Odczyt wartości z jednego lub wielu kolejnych rejestrów 16‐<br />

‐ 30 ‐


Instrukcja <strong>prog</strong>ramowania w języku <strong>ForthLogic</strong> wersja <strong>P.1.2</strong><br />

bitowych (kod polecenia 0x03).<br />

READ_INPUTREGS ‐ Odczyt wartości z jednego lub wielu kolejnych rejestrów 16‐<br />

bitowych (kod polecenia 0x04).<br />

WRITE_COIL ‐ Ustawienie wartości pojedynczego wyjścia binarnego (kod polecenia<br />

0x05).<br />

WRITE_REG ‐ Ustawienie wartości pojedynczego rejestru 16‐bitowego (kod polecenia<br />

0x06).<br />

WRITE_COILS ‐ Ustawienie wartości wielu kolejnych wyjść binarnych (kod polecenia<br />

0x0F).<br />

WRITE_REGS ‐ Ustawienie wartości wielu kolejnych rejestrów (kod polecenia 0x10).<br />

<br />

Numer pakietu, czyli adres wewnętrznej struktury danych sterownika, w której<br />

zapamiętane będą parametry danego wywołania. Parametr ten może przyjmować<br />

wartości od 1 do 4.<br />

Parametrami funkcji MODBUSSTART mogą być zarówno bezpośrednie wartości liczbowe, jak i zmienne lub wyniki operacji<br />

matematycznych. Istotne jest tylko prawidłowe umieszczenie elementów na stosie.<br />

UWAGA!<br />

Stałe systemowe CYCLIC_ACCESS i SINGLE_ACCESS mogą zostać zastąpiona bezpośrednio poprzez wartości<br />

liczbowe. Parametrowi CYCLIC_ACCESS odpowiada wartość 1, natomiast parametrowi SINGLE_ACCESS<br />

odpowiada wartość 2. Podobnie kody poleceń. Stałe systemowe CYCLIC_ACCESS i SINGLE_ACCESS mogą zostać<br />

zastąpiona bezpośrednio poprzez wartości liczbowe. Parametrowi READ_COILS odpowiada wartość 1;<br />

READ_INPUTS odpowiada wartość 2; READ_HOLDREGS odpowiada wartość 3; READ_INPUTREGS odpowiada<br />

wartość 4; WRITE_COIL odpowiada wartość 5; WRITE_REG odpowiada wartość 6; WRITE_COILS odpowiada<br />

wartość 15; WRITE_REGS ‐ odpowiada wartość 16.<br />

Słowo MODBUSCALLBACK służy do wskazania słowa, które ma zostać wykonane dopiero po wymianie danych i<br />

zakończonej komunikacji pojedynczego wywołania słowa MODBUSSTART. Podczas wywołania i transmisji podane słowo<br />

nie będzie wykonane. Zostanie ono wykonane najszybciej jak to możliwe dopiero po zamknięciu wskazanego wywołania.<br />

Słowo MODBUSCALLBACK zdejmuje ze stosu danych parametr, jako numer pojedynczego wywołania , a za nim<br />

podajemy słowo jakie zostanie wykonane.<br />

Słowo MODBUSCALLBACK jest słowem wywoławczym. Bezpośrednio po może znaleźć się tylko inne słowo jako wymagany<br />

parametr wykonawczy, natomiast nie mogą zostać podane jakiekolwiek wartości wprowadzane na stos lub do bufora<br />

wejściowego. Może to być jakiekolwiek słowo znane forth‐systemowi, standardowe lub zdefiniowane. Jeżeli zachodzi<br />

potrzeba użycia słowa, które wymaga podania wartości ze stosu lub z bufora wyjściowego jako parametrów<br />

wykonawczych tego słowo, to należy uprzednio zdefiniować nowe słowo zawierające wymagane słowa oraz<br />

wprowadzające na stos odpowiednie wartości i realizujące wymagane funkcje.<br />

MODBUSCALLBACK <br />

Wykonanie wskazanego słowa po zakończeniu wywołania oznaczonego numerem<br />

Numer pakietu wywołania<br />

Standardowe lub zdefiniowane słowo<br />

Zatrzymanie<br />

Do zatrzymanie wywołania cyklicznego określonego parametrem służy słowo MODBUSSTOP.<br />

MODBUSSTOP<br />

Parametr ten może przyjmować wartość od 1 do 4.<br />

‐ 31 ‐


Sterowniki <strong>prog</strong>ramowalne MAX Logic<br />

Kontrolę stanu procesu komunikacyjnego umożliwia polecenie MODBUSSTATUS?, które przyjmuje postać:<br />

MODBUSSTATUS?<br />

gdzie parametrem jest numer wywołania cyklicznego (o wartości od 1 do 4), a odpowiedź określona jest<br />

parametrem , który może przyjmować następujące wartości:<br />

Kod Kody błędów zgłaszane przez urządzenie Master<br />

0 Brak błędów. Polecenie zostało wykonane poprawnie<br />

16 Urządzenie Slave nie odpowiedziało w zadanym czasie (Time Out)<br />

17 Błędna suma kontrolna w odpowiedzi z urządzenia Slave<br />

Pozostałe kody błędów zgłaszane są przez urządzenie Slave i ich znaczenie jest zgodne ze specyfiką protokołu Modbus:<br />

Kod<br />

Oznaczenie błędu według<br />

Modbus<br />

Opis błędu zgłaszanego przez urządzenie Slave<br />

1 ILLEGAL FUNCTION<br />

Kod polecenia przekazany przez urządzenie Master nie jest<br />

obsługiwany przez urządzenie Slave.<br />

2 ILLEGAL DATA ADDRESS<br />

Adres danych przekazany w zapytaniu z urządzenia Master nie jest<br />

dostępny w urządzeniu Slave.<br />

3 ILLEGAL DATA VALUE Nieprawidłowa wartość danych przekazanych z urządzenia Master.<br />

4 SLAVE DEVICE FAILURE<br />

Sygnalizacja wystąpienia niesprecyzowanego błędu w urządzeniu<br />

Slave podczas obsługi polecenia przekazanego z urządzenia Master.<br />

5 ACKNOWLEDGE<br />

Urządzenie Slave przyjęło polecenie z urządzenia Master, ale jego<br />

wykonanie wymaga dużo czasu.<br />

6 SLAVE DEVICE BUSY<br />

Urządzenie Slave jest zajęte obsługą wcześniejszego polecenia. W<br />

takim wypadku urządzenie Master musi ponowić zapytanie w<br />

późniejszym terminie, gdy urządzenie Slave będzie wolne.<br />

Zgłoszenie błędu o kodzie 16 oznacza, że urządzenie Slave nie odpowiedziało w zadanym czasie określonym parametrem<br />

TIMEOUT. Domyślnie czas ten przyjmuje wartość jednej sekundy, ale może on zostać zmieniony poprzez polecenie<br />

MODBUSTIMEOUT!. Składnia polecenia MODBUSTIMEOUT! ma następującą postać:<br />

MODBUSTIMEOUT!<br />

gdzie parametr określa nowy czas oczekiwania na odpowiedź z urządzenia Slave i może przyjmować wartości z<br />

przedziału od 1,0sek do 600,0sek, ze skokiem 0,1sek.<br />

Konwersja danych<br />

Podczas przekazywania danych w postaci bitów nie ma problemów z interpretacją danych, z uwagi na to, że przyjmują<br />

one wyłącznie dobrze określone wartości 1 (Prawda) oraz 0 (Fałsz). Inaczej rzecz się ma w przypadku przesyłania danych w<br />

postaci 16‐bitowych zmiennych rejestrowych. Problem wynika z tego, że standardowo w protokole Modbus<br />

przekazywane są zmienne całkowite bez znaku (czyli przyjmujące wartości 0..65535). W praktyce często wykorzystywane<br />

są również zmienne całkowite ze znakiem (przyjmujące wartości ‐32767…32767) oraz złożenie kilku zmiennych<br />

rejestrowych na liczbę zmiennoprzecinkową.<br />

Słowa umożliwiające konwersję pomiędzy różnymi formatami liczbowymi:<br />

‐ US>S ‐ służy do konwersji liczby całkowitej bez znaku, na liczbę całkowitą ze znakiem.<br />

‐ S>US ‐ służy do konwersji liczby całkowitej ze znakiem na liczbę całkowitą bez znaku.<br />

Przykład: Jeżeli w rejestrze 16‐bitowym zapisane są same jedynki (0xFFFF w postaci 16‐owej), to w zależności od<br />

interpretacji może ona oznaczać 65535 – jeśli liczba jest traktowana jako liczba bez znaku, lub ‐1 – gdy jest ona<br />

traktowana jako liczba ze znakiem.<br />

Poniżej przedstawiony jest schemat przekształcenia:<br />

> 65535 US>S<br />

> ‐1 (OK.)<br />

‐ 32 ‐


Instrukcja <strong>prog</strong>ramowania w języku <strong>ForthLogic</strong> wersja <strong>P.1.2</strong><br />

‐ US>F ‐ służy do konwersja zmiennych rejestrowych do postaci liczby zmiennoprzecinkowej<br />

‐ F>US ‐ służy do konwersji liczby zmiennoprzecinkowej do postaci zmiennych rejestrowych<br />

Liczba zmiennoprzecinkowa, zgodnie ze standardem IEEE‐754, jest liczbą czterobajtową. Przechowywana jest w postaci<br />

dwóch 16‐bitowych zmiennych rejestrowych. Przykładowo – liczba 1,2345 zapisana w postaci szesnastkowej zgodnie z<br />

IEEE‐754 ma postać 0x3F9E0418, co oznacza, że jeden rejestr przechowuje wartość 0x3F9E, a drugi 0x0418. Po<br />

przełożeniu do postaci dziesiętnej oznacza to, że pierwszy rejestr przechowuję liczbę 16286 (0x3F9E), a drugi liczbę 1048<br />

(0x0418). Przekształcenie to zapisane w języku Forth będzie miało postać:<br />

> 1.2345 F>US<br />

> 1048 16286 (OK.)<br />

Przekształcenie odwrotne – czyli złożenie z dwóch wartości rejestrów do jednej liczby zmiennoprzecinkowej będzie miało<br />

postać:<br />

> 16286 1048 US>F F.<br />

> 1.234500 (OK)<br />

Przykład:<br />

Poniżej przedstawiony jest fragment aplikacji umożliwiający odczyt za pośrednictwem protokołu Modbus zdalnych<br />

przetworników temperatury. Zakładamy, że przetwornik temperatury przekazuje wartości w liczby całkowitej ze znakiem<br />

w zakresie ‐1900 do 1900, co odpowiada temperaturze ‐190.0°C … +190.0°C. W pierwszej kolejności utworzone zostało<br />

słowo print, które przetwarza wskazanie temperatury zapisane w pierwszej zmiennej i wyświetla jego wartość na<br />

wyświetlaczu:<br />

> : print 1 VAR? US>S D>F 10.0 F /<br />

." Temp= " F. 1 1 PRINT 1.0 1 TIMER! print ;<br />

Następnie utworzone zostało słowo skan, definiujące polecenie komunikacji odczytujące cyklicznie, co jedną sekundę<br />

wartość temperatury oraz wymuszające wyświetlenie na wyświetlaczu wyniku w zadanym formacie:<br />

> : skan 1 FPREC! 3.0 1 TIMER! print<br />

1.0 CYCLIC_ACCESS 247 64 1 7 READ_INPUTREGS 1 MODBUSSTART ;<br />

W powyższym przykładzie polecenie komunikacyjne o numerze 1 odbiera cyklicznie, co 1 sek. z urządzenia Slave o adresie<br />

247, jeden rejestr danych znajdujący się pod adresem 64 i zapisuje jego wartość do zmiennej globalna VAR o numerze 7.<br />

Przykład bloku <strong>prog</strong>ramowego, w którym dokonano zmiany parametrów komunikacji oraz zastosowano słowa<br />

MODBUSSTATUS i MODBUSCALLBACK pozwalającego na kontrolę i pewną wymianę danych poszczególnych rejestrów bez<br />

obaw o nałożenie się zadań poszczególnych wywołań:<br />

EVEN 1 MODBUSPARAM<br />

: transU1 1 VAR? 2 VAR? US>F 1 FVAR! ;<br />

: transU2 3 VAR? 4 VAR? US>F 2 FVAR! ;<br />

: transU3 5 VAR? 6 VAR? US>F 3 FVAR! ;<br />

: transI1 7 VAR? 8 VAR? US>F 4 FVAR! ;<br />

: transI2 9 VAR? 10 VAR? US>F 5 FVAR! ;<br />

: transI3 11 VAR? 12 VAR? US>F 6 FVAR! ;<br />

: transF 13 VAR? 14 VAR? US>F 7 FVAR! ;<br />

: statusU 1 MODBUSSTATUS? 21 VAR! ;<br />

: statusI 1 MODBUSSTATUS? 22 VAR! ;<br />

: statusF 1 MODBUSSTATUS? 23 VAR! ;<br />

: trans<br />

‐ 33 ‐


Sterowniki <strong>prog</strong>ramowalne MAX Logic<br />

statusF<br />

transU1 transU2 transU3 transI1 transI2 transI3 transF ;<br />

: skanF ( częstotliwość sieci F<br />

statusI<br />

SINGLE_ACCESS 1 84 2 13 READ_HOLDREGS 1 MODBUSSTART<br />

1 MODBUSCALLBACK trans ;<br />

: skanI ( prądy I1 I2 I3<br />

statusU<br />

SINGLE_ACCESS 1 70 6 7 READ_HOLDREGS 1 MODBUSSTART<br />

1 MODBUSCALLBACK skanP ;<br />

: skanU ( napięci U1 U2 U3<br />

SINGLE_ACCESS 1 64 6 1 READ_HOLDREGS 1 MODBUSSTART<br />

1 MODBUSCALLBACK skanI ;<br />

: skan skanU 60.0 1 TIMER! skan ;<br />

skan<br />

W pierwszym wierszu dokonujemy zmiany parametrów komunikacji za pomocą słowa MODBUSPARAM. Definiujemy<br />

słowa wykonujące poszczególne pojedyncze wywołania: skanU, skanI oraz skanF. Następnie definiujemy słowo, które<br />

cyklicznie, co 60sek. będzie wywoływać słowo skanU. Po dokonaniu wywołania, transmisji danych i zamknięciu<br />

komunikacji dla wywołania zdefiniowanego w słowie skanU zostanie wykonane słowo skanI ( 1 MODBUSCALLBACK skanI).<br />

Analogicznie słowo skanF, po którym wywołane jest słowo trans. Dzięki takiej strukturze kolejnych wywołań wszystkie one<br />

mogą być zapisane pod tym samym numerem pakietu (1 MODBUSSTART). Słowa statusU, statusI oraz statusF<br />

pozwalają na przywołanie kodu statusu danego wywołania (1 MODBUSSTATUS) i zapisania go pod określoną zmienną.<br />

Słowa transU1, transI1, itd., dokonują zapisu wartości odpowiednich rejestrów pod określone zmienne, a następnie<br />

dokonują konwersji na liczbę zmiennoprzecinkową (US>F) przedstawiającą rzeczywistą wartość odczytanego danego<br />

parametru. Wartości te są zapisywane pod kolejne zmienne matematyczne: 1 FVAR!, 2 FVAR!, itd.<br />

4.9 PARAMETRY SYSTEMU<br />

4.9.1 Wznowienie pracy systemu<br />

Słowo RESTART ‐ ponownie uruchamia system (analogicznie do wyłączanie i ponownego załączenie zasilania sterownika).<br />

Zeruje wszystkie wyjścia oraz zmienne. Słowo pomocnicze do wykorzystania w trybie terminalowym.<br />

Do wyzerowania zmiennych, oczyszczenia stosów danych i matematycznego oraz resetowania stanów wyjść (do wartości<br />

logicznej 0) służy słowo CLEARSYS.<br />

4.9.2 Uruchomienie aplikacji<br />

Do definiowania i wykonywania głównego słowa uruchamiającego aplikację służy słowo BOOT (załadować). W przypadku<br />

sterowników H01 i H02 słowo to sczytuje z buforu wyjściowego tekst długości do 77 znaków, a w przypadku sterowników<br />

H03 i H04 tekst długości do 15 znaków i zachowuje go w pamięci nieulotnej. Podany tekst może zawierać jakiekolwiek<br />

słowo lub grupę słów standardowych lub zdefiniowanych. Również możliwe jest wprowadzenie wartości na stos jako<br />

parametrów wykonawczych podanego słowa. Każdorazowo przy uruchomieniu systemu słowa te będą automatycznie<br />

wykonane. Wyjątkiem jest sterownik typu H04, w którym koniecznie musimy dokonać ustawienia trybu pracy FORTH w<br />

menu konfiguracyjnym. Opis wymaganych czynności i ustawień w menu konfiguracyjnym opisano w <strong>inst</strong>rukcji<br />

użytkowania.<br />

W aplikacji zastosowanie słowa BOOT możliwe jest tylko jeden raz. Jeżeli słowo to zastosujemy powtórnie podając inny<br />

wiersz zawierający nowe słowa to zastąpi on poprzedni i w efekcie wykonywane będą nowe słowa.<br />

> : alarm 1 RO? NOT 1 RO! 2.0 1 TIMER! alarm ;<br />

(ОК)<br />

> ." 1 2 RO! alarm " BOOT<br />

(ОК)<br />

‐ 34 ‐


Instrukcja <strong>prog</strong>ramowania w języku <strong>ForthLogic</strong> wersja <strong>P.1.2</strong><br />

><br />

Zdefiniowaliśmy słowo alarm, które cyklicznie przełącza styk wyjścia przekaźnikowego 1. Następnie przy pomocy słowa<br />

BOOT definiujemy główne słowo, które po uruchomieniu systemu załączy styk wyjścia przekaźnikowego 2 i wykonuje<br />

słowo alarm.<br />

Przy pracy terminalowej przydatne jest słowo BOOT. , które wprowadza do bufora wyjściowego i drukuje na terminalu<br />

słowo główne.<br />

Przykład:<br />

> BOOT.<br />

1 2 RO! alarm (ОК)<br />

><br />

4.9.3 Zasilanie<br />

‐ POW? ‐ kładzie na stos matematyczny stan napięcia zasilania głównego wyrażonego w woltach [V].<br />

‐ BAT? ‐ kładzie na stos matematyczny stan napięcia akumulatora wyrażonego w woltach [V].<br />

Przykład stosowania danych słów:<br />

> POW? BAT? F. F.<br />

18.120234 13.780560 (OK)<br />

><br />

4.9.4 Zegar systemowy<br />

Zegar systemowy sterownika pracuje zgodnie z czasem UTC (Universal Time Coordinated), który jest standardowym<br />

czasem międzynarodowym. UTC odpowiada czasowi słonecznemu dla głównego południka (0 stopni długości<br />

geograficznej), wcześniej nazywanym, jako GMT. Czas systemowy sterownika wyrażony jest w formacie UNIX. Format ten<br />

przedstawia czas w postaci globalnej liczby sekund, co znaczy, że zamiast ogólnie przyjętego formatu czasu z podziałem na<br />

lata, miesiące, dni oraz na godziny, minuty i sekundy czas jest przedstawiony tylko w sekundach. Początek odliczania, czyli<br />

sekundę 0 przyjęto 1 stycznia 1970 o godz. 00:00:00. Czas od tej chwili nazywany jest "erą UNIX" (Unix Epoch). W wielu<br />

przypadkach łatwiej posługiwać się czasem w formacie UNIX. Sposób przechowywania czasu pod postacią liczby sekund<br />

ułatwia porównania dat (z dokładnością do 1 sekundy), a także ich przechowywanie w pamięci.<br />

W języku <strong>ForthLogic</strong> istnieją słowa pozwalające swobodnie operować czasem w formacie UNIX, jaki w ogólnie przyjętym<br />

formacie oraz swobodnie przekształcać je do wybranego formatu:<br />

‐ UTC? ‐ kładzie na stos danych stan systemowego zegara pod postacią globalnej liczby sekund, tak jak to przyjęto w<br />

systemie UNIX.<br />

‐ >UTC ‐ służy do przekształcania czasu ogólnie przyjętego formatu w format UNIX; zdejmuje ze stosu wartości traktując je<br />

kolejno jako sekundy, minuty, godzinę, rok, miesiąc i dzień, a następnie zamienia podany czas na globalną liczbę sekund.<br />

>UTC<br />

SEK, MIN, GODZ, ROK, MIESIĄC, DZIEŃ ‐‐‐> UNIX [sek]<br />

Dla ustawienia czasu zegara systemowego służy słowo WATCH!, które zdejmuje ze stosu sześć znaczeń jako parametry czasu<br />

kalendarzowego ogólnie przyjętego formatu i ustawia zgodnie z nimi zegar systemowy w chwili wykonania tego słowa:<br />

WATCH!<br />

‐ ustawia czas zegara systemowego<br />

sekundy – liczba całkowita w zakresie 0÷59<br />

minuty – liczba całkowita w zakresie 0÷59<br />

godziny – liczba całkowita w zakresie 0÷23<br />

rok – liczba całkowita w zakresie 1969‐2038.<br />

miesiąc – liczba całkowita w zakresie 1‐12.<br />

dzień – liczba całkowita w zakresie 1‐31.<br />

‐ 35 ‐


Sterowniki <strong>prog</strong>ramowalne MAX Logic<br />

Do przekształcania czasu z formatu UNIX do formatu ogólnego służą słowa: >TIME, >DATE i >WDAY. Słowa te zdejmują ze<br />

stosu znaczenia czasu w formacie UNIX i kładą na stos czas, datę i dzień tygodnia systemu ogólnego.<br />

>TIME UTC ‐‐‐> SEKUNDA, MINUTA, GODZINA<br />

>DATE UTC ‐‐‐> ROK, MIESIĄC, DZIEŃ<br />

>WDAY UTC ‐‐‐> DZIEŃ TYGODNIA<br />

Przykład przekształceń:<br />

> UTC? DUP . > TIME . . .<br />

1247856331 18 45 31<br />

Najpierw odczytaliśmy czas w formacie UNIX. Wartość sekund położoną na stos zduplikowaliśmy. Następnie Słowo >TIME<br />

zdejmuje ze stosu wartość sekund i kładzie je na stos. Drukując wartości stosu na terminalu otrzymujemy czas (liczbę<br />

sekund) w formacie UNIX, a następnie czas w formacie ogólnym (18:45:31).<br />

Wartości przyporządkowane dniom tygodnia: niedziela ‐ 0; poniedziałek ‐ 1; wtorek ‐ 2; środa ‐ 3; czwartek ‐ 4; piątek ‐ 5,<br />

sobota ‐ 6.<br />

Do bezpośredniego odczytywania aktualnego czasu systemowego sterownika służą słowa:<br />

‐ TIME? ‐ kładzie na stos trzy znaczenia w kolejności: sekundy, minuty, godzinę zegara systemowego na chwilę wykonania<br />

tego słowa. Odpowiednio, przy zdejmowaniu ze stosu, najpierw będą godzina, potem minuty i na końcu sekundy.<br />

‐ DATE? ‐ kładzie na stos trzy znaczenia w kolejności: rok, miesiąc, dzień zegara systemowego na chwilę wykonania tego<br />

słowa. Odpowiednio, przy zdejmowaniu ze stosu, najpierw będzie dzień, potem miesiąc i na końcu rok.<br />

‐ WDAY? ‐ kładzie na stos znaczenie dnia tygodnia na chwilę wykonania tego słowa. Wartości przyporządkowane dniom<br />

tygodnia: niedziela ‐ 0; poniedziałek ‐ 1; wtorek ‐ 2; środa ‐ 3; czwartek ‐ 4; piątek ‐ 5, sobota ‐ 6.<br />

TIME? ‐ ‐‐‐> SEK,MIN,GODZ<br />

DATE? ‐ ‐‐‐> ROK, MIESIĄC, DZIEŃ<br />

WDAY? ‐ ‐‐‐> DZIEŃ_TYGODNIA<br />

Do porównania dat i czasów istnieje słowo ISNOW, które parami porównuje sześć górnych znaczeń ze stosu danych i<br />

kładzie na stos znaczenia logiczne. Przy czym wartość PRAWDA jest wtedy, gdy wszystkie porównania są prawdziwe, a<br />

FAŁSZ w przeciwnym wypadku. Porównanie odbywa się w szczególnym trybie:<br />

ISNOW A1,B1,C1,C2,B2,A2 ‐‐‐> (A1=A2)•(B1=B2) •(C1=C2)<br />

Jeżeli A1=A2, B1=B2, C1=C2, to na stos zostanie położona wartość logiczna 1 (PRAWDA), w przeciwnym wypadku 0<br />

(FAŁSZ). Przytoczymy przykład aplikacji wspomnianych słów:<br />

> DATE? . . . TIME? . . .<br />

21 6 2008 14 7 2 (OK)<br />

> UTC? .<br />

1214057197 (OK)<br />

> TIME? DATE? >UTC .<br />

1214057199 (OK)<br />

> 23 0 0 TIME? ISNOW . 21 6 2008 DATE? ISNOW .<br />

0 ‐1 (OK)<br />

> 0 0 15 DATE? WATCH!<br />

(OK)<br />

><br />

W ostatniej linii pokazano przykład ustalania systemowego czasu (15:00:00) bez zmiany daty.<br />

‐ 36 ‐


Instrukcja <strong>prog</strong>ramowania w języku <strong>ForthLogic</strong> wersja <strong>P.1.2</strong><br />

Konfiguracja zegara systemowego w sterownikach typu H01 i H02<br />

Dla ustalania wartości korekcji i opcji systemowego zegara systemowego służy słowo SETWATCH. Słowo to wymaga<br />

podania dodatkowych, specjalnych stałych systemowych, które określają sposób pracy zegara systemowego.<br />

Stałe systemowe dla słowa SETWATCH:<br />

‐ SUMMER_ON ‐ automatyczna zmiany czasu letni/zimowy;<br />

‐ SUMMER_OFF ‐ brak automatycznej zmiany czasu letni/zimowy.<br />

Ustawienie odpowiedniego sposobu pracy sterownika zależy od odpowiedniej kombinacji powyższych stałych, wartości<br />

korekcji, strefy czasowej i słowa SETWATCH.<br />

SUMMER_ON SETWATCH<br />

SUMMER_OFF SETWATCH<br />

‐ włączenie automatycznej zmiany czasu letni/zimowy;<br />

‐ liczba całkowita ‐ comiesięczna<br />

automatyczna korekcja czasu zegara systemowego<br />

wyrazona w sekundach;<br />

‐ liczba całkowita ‐ strefa czasowa wyrażona w<br />

godzinach.<br />

‐ brak automatycznej zmiany czasu letni/zimowy;<br />

‐ liczba całkowita ‐ comiesięczna<br />

automatyczna korekcja czasu zegara systemowego<br />

wyrazona w sekundach;<br />

W sterownikach typu H03 i H04 parametry te ustawiane są w menu konfiguracyjnym.<br />

4.9.5 Rejestracja danych<br />

Wbudowany w sterownik rejestrator pracuje niezależnie od algorytmu pracy sterownika, a sposób jego pracy można<br />

ustawić za pomocą słów i specjalnych stałych systemowych języka <strong>prog</strong>ramowania <strong>ForthLogic</strong> (i dodatkowo za pomocą<br />

menu konfiguracyjnego w sterowniku typu H04). Rejestrator pozwala zapisywać dane w jednym z trzech trybów:<br />

interwałów, zdarzeń lub ustawień użytkownika.<br />

Dane są zapisywane domyślnie w pamięci nieulotnej, której pojemność zależy od wersji o<strong>prog</strong>ramowania sterownika.<br />

Praktycznie dostępny jest 1÷1,3 Mb pamięci. Po zatrzymaniu procesu rejestracji dane z pamięci można skopiować na kartę<br />

pamięci SD/SDHC/MMC. Plik z pamięci sterownika zostanie usunięty. Dane można zapisywać także bezpośrednio na karcie<br />

pamięci SD/SDHC/MMC.<br />

Do włączenia i parametryzacji procesu rejestracji służy słowo LOGON. Słowo to wymaga podania dodatkowych,<br />

specjalnych stałych systemowych, które określają sposób pracy rejestratora.<br />

Stałe systemowe dla słowa LOGON:<br />

‐ EVENTS_MODE ‐ dane są zapisywane wyłącznie przy zaistnieniu jakichkolwiek zmian w stanie logicznym wejść/wyjść lub<br />

przy komunikacji przez sieć GSM (połączenia głosowe, SMS);<br />

‐ INTERVAL_MODE ‐ dane są zapisywane w równych, ustalonych odstępach czasu;<br />

‐ USER_MODE – dowolne dane z systemu zapisywane w oparciu o indywidualne zestawienie użytkownika;<br />

‐ TO_SD ‐ zapis pliku rejestracji na karcie SD;<br />

‐ TO_FLASH ‐ zapis pliku rejestracji w pamięci wewnętrznej sterownika;<br />

‐ ALL_DATA ‐ rejestracja daty, czasu, napięcia zasilania, stanu wejść i wyjść;<br />

‐ INPUTS ‐ rejestracja daty, czasu i stanu wejść;<br />

‐ OUTPUTS rejestracja daty, czasu i stanu wyjść.<br />

Ustawienie odpowiedniego sposobu pracy rejestratora zależy od odpowiedniej kombinacji powyższych stałych i słowa<br />

LOGON.<br />

‐ 37 ‐


Sterowniki <strong>prog</strong>ramowalne MAX Logic<br />

EVENTS_MODE LOGON<br />

Proces rejestracji w trybie zdarzeń<br />

INTERVAL_MODE LOGON<br />

Proces rejestracji w trybie interwałów<br />

USER_MODE LOGON<br />

Proces rejestracji w trybie ustawień użytkownika<br />

Opcje: ALL_DATA, INPUTS lub OUTPUTS<br />

Opcje: TO_SD lub TO_FLASH<br />

Liczba całkowita określająca w sekundach interwał (odstęp) rejestracji<br />

Wynik wykonania słowa LOGON kładzie się na stos jako znaczenie logiczne. Przy czym, logiczne znaczenie „PRAWDA”<br />

oznacza, że proces rejestracji rozpoczął się, a „FAŁSZ”, że zaistniał problem, np.: proces rejestracji już trwa albo nie udało<br />

się otworzyć istniejącego już pliku.<br />

Do zatrzymania procesu rejestracji służy słowo LOGOFF.<br />

Przykład wykorzystania słowa LOGON:<br />

> ALL_DATA TO_FLASH EVENTS_MODE LOGON .<br />

‐1 (ОК)<br />

> LOGOFF<br />

> OUTPUTS TO_SD 25 INTERVAL_MODE LOGON .<br />

‐1 (ОК)<br />

><br />

W pierwszym przypadku uruchomiliśmy rejestrację wszystkich danych w pamięci wewnętrznej w trybie zdarzeń. W<br />

drugim przypadku uruchomiliśmy rejestrację stanu wyjść na karcie SD w trybie interwałów odstępem rejestracji, co 25sek.<br />

Do ponownego uruchomienia procesu rejestracji z ustawionymi uprzednio opcjami (bez ich zmiany) służy słowo LOGRUN.<br />

Jest ono przydatne, gdy zachodzi potrzeba częstego zatrzymywania i uruchamiania procesu rejestracji.<br />

Wynik wykonania słowa LOGRUN kładzie się na stos jako znaczenie logiczne. Przy czym, logiczne znaczenie PRAWDA<br />

oznacza, że proces rejestracji rozpoczął się, a FAŁSZ, że zaistniał problem, np.: proces rejestracji już trwa albo nie udało się<br />

otworzyć istniejącego już pliku.<br />

Do przenoszenia danych rejestracji z wewnętrznej pamięci na kartę SD służy słowo LOG>SD. Słowo to z wyjściowego<br />

bufora sczytuje wiersz jako nazwę pliku, do którego ma przenieść dane rejestracji. Jeżeli taki plik już istnieje na karcie to<br />

rozpoczyna się proces przenoszenie danych z wewnętrznej pamięci do danego pliku. Jeżeli takiego pliku jeszcze nie ma to<br />

zostanie on automatycznie utworzony na karcie.<br />

.” log_1 „ LOG>SD<br />

Wynik wykonania słowa LOG>SD kładzie się na stos jako znaczenie logiczne. Przy czym, logiczne znaczenie „PRAWDA”<br />

oznacza, że proces przenoszenia danych przebiegł poprawnie, a „FAŁSZ”, że zaistniał problem, np.: trwa proces rejestracji<br />

albo nie udało się otworzyć istniejącego już pliku.<br />

Jeżeli nie podamy nazwy pliku to dane rejestracji będą przeniesione do utworzonego automatycznie pliku "datalog.txt".<br />

Format rejestrowanych danych zależy od wybranej opcji. Wiersz jednego zapisu ma dany format i kończy się symbolami<br />

zakończenia zapisu wiersza ENTER ‐ \ n \ r (w systemie szesnastkowym 0h0A i 0h0D. Znaki te są niewidoczne):<br />

‐ ALL_DATA – rejestruje czas, datę, napięcie zasilania, wejścia i wyjścia w następującej postaci:<br />

„13:04:39|19/03|18.4 13.8|0021 1023 0006 0020 | 10000000|0000|000\n\r”, gdzie<br />

13:04:39 19/03 18.4 13.8 0000 0000 0000 0000 10000000 0000 000<br />

godzina,<br />

minuty,<br />

sekundy<br />

dzień,<br />

miesiąc<br />

Napięcie zasilania,<br />

napięcie<br />

akumulatora, [V]<br />

Wartość wejść<br />

Stan logiczny Stan logiczny<br />

analogowych AI1…AI4<br />

(od 1 do 4) wyrażona<br />

w podziałce cyfrowej<br />

(0‐1023) *<br />

Stan<br />

logiczny<br />

wejść<br />

DI1…DI8<br />

(od 1 do 8)<br />

wyjść<br />

DO1…DO4<br />

(od 1 do 4)<br />

wyjść<br />

RO1…RO3<br />

(od 1 do 3)<br />

‐ 38 ‐


Instrukcja <strong>prog</strong>ramowania w języku <strong>ForthLogic</strong> wersja <strong>P.1.2</strong><br />

* ‐ W sterowniku H04 przy skonfigurowanym wejściu jako analogowe prądowe lub napięciowe podawane są wartości<br />

przeskalowane zgodnie z parametrami podanymi dla danego wejścia w menu konfiguracyjnym [Menu ‐> Wejścia ‐> DI/AI4<br />

‐> SKALA …]. Czyli otrzymujemy wynik jako wartość rzeczywistą mierzoną przez podłączony przetwornik analogowy. W<br />

przypadku konfiguracji <strong>prog</strong>ramowej wejścia jako cyfrowe otrzymamy wynik w podziałce cyfrowej (0‐1023). Patrz<br />

<strong>inst</strong>rukcja użytkowania H04.<br />

‐ INPUT – rejestruje czas, datę, wejścia w następującej postaci:<br />

„13:04:39|19/03|0021 1023 0006 0020 | 10000000”, gdzie<br />

13:04:39 19/03 0021 1023 0006 0020 10000000<br />

godziny, Dzień, Wartość wejść Stan logiczny<br />

minuty,<br />

sekundy<br />

miesiąc analogowych AI1…AI4<br />

(od 1 do 4)<br />

wejść<br />

DI1…DI8<br />

(od 1 do 8)<br />

‐ OUTPUT – rejestruje czas, datę, wyjścia w następującej postaci:<br />

„13:04:39|19/03|0000|000\n\r”, gdzie<br />

13:04:39 19/03 0000 000<br />

dzień,<br />

stan logiczny<br />

miesiąc<br />

godziny,<br />

minuty,<br />

sekundy<br />

stan logiczny wyjść<br />

DO1…DO4<br />

(od 1 do 4)<br />

wyjść<br />

RO1…RO3<br />

(od 1 do 3)<br />

Dodatkowo są zapisywane wszystkie połączenia telefoniczne przychodzące/wychodzące i SMS w następującym formacie<br />

wiersza:<br />

„13:04:39|19/03|+48123456789|SMS>\n\r”, gdzie<br />

13:04:39 19/03 +48123456789 SMS><br />

godziny,<br />

minuty,<br />

sekundy<br />

dzień, miesiąc numer telefonu typ wydarzenia<br />

Opis typów wydarzeń:<br />

‐ „>SMS” – odbiór SMS wejściowego;<br />

‐ „SMS>” – wysłanie SMS wyjściowego;<br />

‐ „>VOICE” – podjęcie wejściowego połączenia głosowego;<br />

‐ „VOICE>” – inicjacja wejściowego połączenia głosowego;<br />

‐ „HOLD” – zakończenie połączenia głosowego.<br />

W trybie USER_MODE rejestracja danych jest wynikiem pracy konkretnej aplikacji. Dane rejestrowe i format publikacji<br />

tych danych może być ustawiony przez użytkownika według indywidualnych potrzeb. Służy do tego słowo LOG.<br />

Słowo to zapisuje zawartość wyjściowego bufora do systemowego rejestru. Dane zapisywane są tylko podczas pracy<br />

rejestratora. Domyślnie rejestrowane są również czas i data. Wyznaczona wartość rejestracji poprzedzona jest<br />

nagłówkiem <strong>ForthLogic</strong>>. Maksymalna długość wiersza tekstu zależy od wersji <strong>prog</strong>ramowej i sprzętowej. Rozmiar bufora<br />

(liczbę znaków) dla danej wersji sterownika określa parametr OUTBUF_MAX. Patrz: rozdz. 8 Tabela zasobów<br />

<strong>prog</strong>ramowych.<br />

Format rejestracji danych użytkownika wygląda nastepująco:<br />

„13:04:39|19/03|[zestawienie danych użytkownika]\n\r”, gdzie<br />

13:04:39 19/03 .” xxx „<br />

dzień,<br />

miesiąc<br />

godziny,<br />

minuty,<br />

sekundy<br />

zestawienie<br />

danych<br />

użytkownika<br />

‐ 39 ‐


Sterowniki <strong>prog</strong>ramowalne MAX Logic<br />

Do wyłączenia automatycznie wstawianych nagłówka, daty i czasu w linie rejestrową służy słowo LOGTITLEOFF.<br />

Do załączenia automatycznego wstawiania daty, czasu i nagłówka służy słowo LOGTITLEON.<br />

LOGTITLTON ‐> "12:32:57|19/03|<strong>ForthLogic</strong>> [zestawienie danych użytkownika]\n\r"<br />

LOGTITLTOFF ‐> " [tekst maks. 120 znaków]\n\r"<br />

Linie kończą się znakami zakończenia zapisu wiersza (ENTER) ‐ \ n \ r; (w systemie szesnastkowym 0h0A i 0h0D). Znaki te<br />

na monitorze są niewidoczne.<br />

1 FPREC!<br />

LOGTITLEOFF<br />

ALL_DATA TO_SD USER_MODE LOGON DROP<br />

: log_print<br />

NOAUTOSPACE<br />

DATE? ROT . ." ‐ " SWAP . ." ‐ " . SPACE<br />

TIME? . ." : " . ." : " . SPACE<br />

." Uzas= " POW? F. ." V " SPACE<br />

." Temp= " 4 AI? 15.0 F* 50.0 F‐ F. ." stC "<br />

AUTOSPACE ;<br />

: log_cykl log_print LOG 1500 0.2 BEEP 60.0 1 TIMER! log_cykl ;<br />

: log_start LOGRUN log_cykl ;<br />

: log_stop 0.0 1 TIMER! STOP LOGOFF ;<br />

Słowo log_start uruchamia proces rejestracji oraz cykl zapisu danych rejestrowych (słowo log_cykl). Słowo log_stop<br />

zatrzymuje proces rejestracji oraz cykl zapisu. W przykładzie tym zapis odbywa się co 60 sek. Format danych rejestrowych<br />

określa słowo log_print. Trzy pierwsze linie to ustawienie parametrów rejestracji oraz formatu drukowania danych. W<br />

efekcie co 60 sek. otrzymujemy zapis linii rejestru w postaci: 2011‐2‐17 14:51:24 Uzas=23.9V Temp=56.7stC<br />

Używając słów NEWLINE i SPACE (patrz rozdział 4.4.3)możemy powiększyć liczbę znaków oraz dowolnie formatować zapis<br />

danych.<br />

Stan procesu rejestracji można rozpoznać za pomocą słowa LOG?. Słowo to kładzie się na stos znaczenie logiczne. Przy<br />

czym, logiczne znaczenie „PRAWDA” oznacza, że proces rejestracji jest uruchomiony (LOGRUN), a „FAŁSZ”, że proces<br />

rejestracji jest zatrzymany (LOGOFF).<br />

Do ustalenia wolnego miejsca dla procesu rejestracji w pamięci wewnętrznej służy słowo FREELOG?. Słowo to kładzie na<br />

stos danych liczbę wyrażającą w bajtach ilość wolnego miejsca w pamięci wewnętrznej.<br />

Do kasowania pamięci rejestracji służy słowo LOGFORMAT. Formatuje ono wewnętrzny system plikowy usuwając<br />

wszystkie zarejestrowane dane.<br />

Do sprawdzania istnienia pliku rejestracji danych służy słowo LOGFILE?. Słowo to kładzie się na stos znaczenie logiczne.<br />

Przy czym, logiczne znaczenie „PRAWDA” oznacza, że plik istnieje, a „FAŁSZ”, że pliku nie ma.<br />

Słowo LOGSEND? służy do sprawdzania procesu przenoszenia danych rejestrowych z pamięci wewnętrznej. Słowo to<br />

kładzie się na stos znaczenie logiczne. Przy czym, logiczne znaczenie „PRAWDA” oznacza, że proces przenoszenia danych<br />

jest w toku, a „FAŁSZ”, że przenoszenie nie odbywa się.<br />

4.9.6 Dźwięk<br />

Do odtworzenia dźwiękowego sygnału za pomocą wbudowanego generatora dźwiękowych sygnałów, służy słowo BEEP<br />

(sygnał), które ze stosu matematycznego zdejmuje górne znaczenie jako długość sygnału w zakresie 0,001÷64,0sek. z<br />

krokiem, co 0,001sek., oraz ze stosu danych górne znaczenie jako częstotliwość sygnału dźwiękowego w zakresie<br />

100÷10000Hz.<br />

Przytoczymy przykład zastosowania słowa BEEP dla stworzenia sygnału o częstotliwości 1000Hz i długości trwania 2<br />

sekundy:<br />

‐ 40 ‐


Instrukcja <strong>prog</strong>ramowania w języku <strong>ForthLogic</strong> wersja <strong>P.1.2</strong><br />

> 2.0 1000 BEEP<br />

(OK)<br />

><br />

4.9.7 Kalibracja wartości wejściowych dla sterowników typu H01 i H02<br />

Dla sterowników H03 i H04 czynności kalibracji są poza<strong>prog</strong>ramowe i dokonuje się je w graficznym menu konfiguracyjnym<br />

(patrz <strong>inst</strong>rukcja użytkowania sterowników H03 i H04).<br />

Do kalibracji wartości wejściowych, czyli podania wartości wzorcowej służą słowa:<br />

‐ CALPOW ‐ do kalibracji napięcia zasilania. Słowo to ze stosu matematycznego zdejmuje wartość i zapisuje jako wartość<br />

wzorcową napięcia zasilania.<br />

‐ CALBAT ‐ do kalibracji napięcia zasilania rezerwowego (akumulatora) lub napięcia ładowania. Słowo to ze stosu<br />

matematycznego zdejmuje wartość i zapisuje jako wartość wzorcową napięcia zasilania rezerwowego lub napięcia<br />

ładowania.<br />

‐ CALI ‐ do kalibracji wartości kombinowanych wejść analogowych prądowych. Słowo to zdejmuje ze stosu danych wartość<br />

z zakresu 1÷4 jako numer wejścia oraz ze stosu matematycznego wartość z zakresu 4÷20 jako wartość prądu wejścia i<br />

ustawia ją jako wartość wzorcową dla podanego wejścia.<br />

‐ CALV ‐ do kalibracji wartości kombinowanych wejść analogowych napięciowych. Słowo to zdejmuje ze stosu danych<br />

wartość z zakresu 1÷4 jako numer wejścia oraz ze stosu matematycznego wartość z zakresu 0÷10 jako wartość napięcia<br />

wejścia i ustawia ją jako wartość wzorcową dla podanego wejścia.<br />

Uwaga! Nie powtarzać poniższego przykładu podczas ćwiczeń w pracy terminalowej. Grozi to rozkalibrowaniem<br />

sterownika.<br />

> 23.8 CALPOW<br />

(OK)<br />

> 0.13 1 CALV<br />

(OK)<br />

><br />

4.10 INTERFEJS UŻYTKOWNIKA<br />

4.10.1 Menu bloku „Funkcje dodatkowe” (dla sterowników typu H03 i H04)<br />

Blok „Funkcje dodatkowe” zawiera tekstowe submenu tworzone w trybie <strong>prog</strong>ramowania w języku <strong>ForthLogic</strong> na<br />

indywidualne potrzeby użytkownika. Służyć ono może do uruchamiania dodatkowych aplikacji, ustawiania i edycji<br />

parametrów pracy, tworzenia szybkich skrótów konfiguracyjnych, itp. Liczba punktów menu jest zależna od wersji<br />

<strong>prog</strong>ramowej i sprzętowej sterowników i określa ją parametr MENU_MAX. Patrz: rozdz. 8 Tabela zasobów <strong>prog</strong>ramowych.<br />

W przypadku braku takich za<strong>prog</strong>ramowanych funkcji submenu jest puste.<br />

Do tworzenia punktów menu użytkownika służą słowa MENU, HIDE, LASTMENU?, INFO.<br />

Wszystkie przedstawione słowa do pracy z menu „Funkcji dodatkowych” pozwalają stwarzać wielostopniowe, dynamiczne<br />

menu użytkownika, które nie ustępuje funkcjonalnością i możliwościami wbudowanemu menu konfiguracyjnemu.<br />

Słowo MENU służy do tworzenia kolejnych punktów menu „Funkcji dodatkowych”. Zdejmuje ze stosu danych górne<br />

znaczenie jako numer wiersza menu w zakresie od 1 do MENU_MAX, z wyjściowego bufora sczytuje wiersz jako tekst,<br />

który będzie wyświetlany w odpowiednim punkcie menu. Po słowie MENU należy podać słowo, które będzie wykonane<br />

przy wyborze tego punktu menu. Podane wartości liczbowe odpowiadają kolejnym wierszom menu widocznym w blok<br />

„Funkcje dodatkowe”. Po wyborze punktu menu i zatwierdzeniem przyciskiem OK wykonane zostanie podane słowo.<br />

Nadanie numeru 0 powoduję wykonanie przypisanego słowa bezpośrednio przy wejściu do menu "Funkcji dodatkowych"<br />

(po naciśnięciu OK). Długość wiersza menu nie może przekraczać 12 znaków. Dla punktu menu z numerem 0 tekstu nie<br />

podajemy, ponieważ nie jest on drukowany. Przytoczymy przykład aplikacji danego słowa:<br />

‐ 41 ‐


Sterowniki <strong>prog</strong>ramowalne MAX Logic<br />

> : bip 1.0 1000 BEEP ;<br />

(OK)<br />

> : alarm bip 2.0 1 TIMER! alarm ;<br />

(OK)<br />

> : stop 0.0 1 TIMER! STOP ;<br />

(OK)<br />

> : 0menu 0 MENU bip ;<br />

bip (OK)<br />

> : 1menu .” ALARM ” 1 MENU alarm<br />

ALARM (OK)<br />

> : 2menu .” STOP ” 2 MENU stop<br />

STOP (OK)<br />

> 0menu 1 menu 2menu<br />

(OK)<br />

Najpierw definiujemy słowa bip, alarm i stop, których wykonanie przypisujemy odpowiednim punktom tworzonego menu.<br />

Potem definiujemy słowa 0menu, 1menu i 2menu opisujące funkcje punktów menu ALARM i STOP oraz sygnał dźwiękowy<br />

przy wejściu w blok. Nazwy te będą drukowane jako menu bloku „Funkcje dodatkowe”. Następnie wykonujemy te słowa<br />

dla permanentnej projekcji zdefiniowanych punktów menu. Kursorami możemy dokonać wyboru punktu menu, a OK<br />

akceptujemy wybór. Wybierając ALARM uruchamiamy cykliczne odtwarzanie sygnału dźwiękowego. Wybierając następnie<br />

STOP zatrzymujemy alarm. Dodatkowo przy każdorazowym wejściu w blok „Funkcje dodatkowe” usłyszymy<br />

jednosekundowy sygnał dźwiękowy przypisany do słowa MENU 0.<br />

Słowo HIDE służy do ukrywania zdefiniowanego punktu menu (nie wykasowuje go). Zdejmuje ze stosu danych górne<br />

znaczenie jako numer wiersza menu i ukrywa punkt menu o wskazanym numerze (staje się on nieaktywny i niedostępny<br />

dla użytkownika). Ponowne uaktywnienie tego punktu menu odbywa się słowem MENU. Wystarczy tylko podać numer<br />

wiersza menu przed słowem (bez tekstu, ponieważ jest on zapamiętywany przy wcześniejszej definicji) i słowo, jakie ma<br />

być wykonane. Oczywiście jest możliwe całkowite przedefiniowanie danego punktu menu. Opierając się na wcześniejszym<br />

przykładzie pokażemy zastosowanie słowa HIDE:<br />

> 1 HIDE<br />

(OK)<br />

> 1 MENU alarm<br />

(OK)<br />

Najpierw ukrywamy wiersz menu ALARM. Znika on z wyświetlacza. Słowem MENU bez podanego wiersza tekstu<br />

ponownie uaktywniamy ten punkt.<br />

Słowo LASTMENU? podaje numer punktu menu, który był wykonany jako ostatni. Słowo to kładzie na stos danych numer<br />

punktu menu, który był wykonany jako ostatni. Dane słowo pozwala parametryzować pracę z oddzielnymi punktami<br />

menu.<br />

Przy każdorazowym wejściu w blok „Funkcje dodatkowe” standardowo podświetlany jest pierwszy punkt menu. Słowo<br />

FOCUS pozwala ustawić podświetlenie dowolnego wiersza menu. Słowo FOCUS ze stosu danych zdejmuje górne znaczenie<br />

jako numer wiersza menu. Wskazany wiersz po wejściu w blok „Funkcje dodatkowe” będzie podświetlony i to on będzie<br />

widoczny jako pierwszy.<br />

Dodatkowo dla H04, dla większej wygody w korzystaniu z menu, istnieje możliwość wyprowadzenia pomocniczej<br />

informacji tekstowej w górnym, żółtym pasku stanu (lewa górna część wyświetlacza). Służy do tego słowo INFO<br />

(informacja), które z wyjściowego bufora sczytuje wiersz tekstu o długości do 15 znaków i wyświetla go w lewej części<br />

informacyjnego pola (zastępuje napis „Funkcje dodatkowe”).<br />

4.10.2 Klawiatura (dla sterowników typu H03 i H04)<br />

Do definiowania funkcji klawiszy służy słowo BUTTON (przycisk), które ze stosu danych zdejmuje górny element jako<br />

numer klawisza z zakresu od 1 do 7, a po słowie tym podajemy słowo, które będzie bezpośrednio wykonywane przy<br />

naciskaniu odpowiedniego przycisku. Wartości przyporządkowane przyciskom: F1 ‐ 1; F2 – 2; ‐3; ‐ 4; ‐ 5; ‐ 6;<br />

‐ 42 ‐


Instrukcja <strong>prog</strong>ramowania w języku <strong>ForthLogic</strong> wersja <strong>P.1.2</strong><br />

OK – 7. Dla ułatwienia korzystania ze słowa BUTTON, istnieją systemowe stałe oznaczające konkretne przyciski. Są to: F1 –<br />

F1; F2 – F2; UP ‐ ; DOWN ‐ ; LEFT‐ ; RIGHT ‐ ; OK. ‐ OK. Stałe te kładą na stos numer odpowiedniego klawisza.<br />

W przypadku zaniku zasilania sterownika wszystkie funkcje przypisane przyciskom są kasowane. Dla zachowania<br />

przypisanych funkcji przyciskom można zdefiniować słowo, które wywołane przywróci określoną funkcję ponownie.<br />

Przytoczymy przykład stosowania słowa BUTTON do zdefiniowania funkcji klawiszy F1 i F2:<br />

> : bip 1.0 1000 BEEP ;<br />

(OK)<br />

> : alarm bip 2.0 1 TIMER! alarm ;<br />

(OK)<br />

> : stop 0.0 1 TIMER! STOP ;<br />

(OK)<br />

> : up UP BUTTON bip ;<br />

(OK)<br />

> : f1 F1 BUTTON alarm ;<br />

(OK)<br />

> : f2 F2 BUTTON stop ;<br />

(OK)<br />

> up f1 f2<br />

(OK)<br />

W trakcie wykonania <strong>prog</strong>ramu, funkcje klawiszy można wielokrotnie zmieniać w zależności od potrzeb. Zdefiniowane<br />

funkcje klawiszy F1 i F2 są aktywne na wszystkich poziomach interfejsu oprócz przypadku wprowadzenia wartości w oknie<br />

parametryzacji (wiersz koloru niebieskiego). Zdefiniowane funkcje przycisków , , , i OK są aktywne tylko poza<br />

menu konfiguracyjnym, czyli tylko podczas aktywnego okna dialogu.<br />

4.10.3 Wyświetlacz (dla sterowników typu H03 i H04)<br />

Do drukowania tekstowych informacji na wyświetlaczu służy słowo PRINT (drukować). Drukowanie jest możliwe tylko w<br />

oknie dialogu (poziom główny przed wejściem do menu konfiguracyjnego). Pole drukowania to prostokąt pośrodku<br />

wyświetlacza o rozmiarach określonych parametrami: ROW_MAX (liczba wierszy) i COL_MAX (liczba kolumn). Numeracja<br />

wierszy ‐ z góry na dół od 0 do ROW_MAX, numeracja kolumn ‐ od lewej strony do prawej od 0 do COL_MAX. Tekst<br />

drukowany jest w jednym z 9 kolorów na białym tle albo na czarnym.<br />

Słowo PRINT zdejmuje ze stosu dwa górne znaczenia ‐ współrzędne pozycji wyprowadzenia tekstu, które składają się z<br />

numeru wiersza i numeru kolumny, z bufora wyjściowego sczytuje tekst, który będzie drukowany od wskazanej pozycji. Po<br />

dojściu do końca rzędu, symbole tekstu automatycznie przenoszone są do następnego rzędu. W przypadku osiągnięcia<br />

przez tekst ostatniej pozycji w ostatnim rzędzie dalsze drukowanie będzie zablokowane.<br />

Fabrycznie ustawione jest drukowanie czarnego fontu na białym tle. Aktywny kolor czcionki można ustalić za pomocą słów<br />

WHITE (biały), RED (czerwony), ORANGE (pomarańczowy), YELLOW (żółty), GREEN (zielony), BLUE (błękitny), DEEPBLUE<br />

(niebieski), VIOLET (fioletowy) i BLACK (czarny). Słowa te ustalają odpowiedni aktywny kolor tekstu. Drukowanie w<br />

ustawionym kolorze odbywają się aż do jego kolejnej zmiany.<br />

Tło może przyjmować tylko dwa kolory: biały i czarny. Do ustawiania koloru tła służy słowo INVERT, które zmienia<br />

aktywny kolor tła na przeciwny, wskutek czego kolor biały staje się czarnym (albo odwrotnie). Słowo to również dokonuje<br />

inwersji aktywnego koloru fontu, przy czym kolor ten zmienia się na dopełniający (negatyw). Wszystkie późniejsze<br />

drukowania odbywają się w danym kolorze aż do ich kolejnej zmiany.<br />

Do czyszczenia pola z wprowadzonych wcześniej tekstów służy słowo CLEAR (czyścić), które ustawia wszystkie symbole<br />

odpowiednio do aktywnego tła – pole drukowania staje się białe lub czarne.<br />

Przykład:<br />

> ." "Czerwony" " RED 0 0 PRINT<br />

(OK)<br />

> ." "Zielony" " GREEN 0 1 PRINT<br />

(OK)<br />

> ." "Inwersja zielonego" " INVERT 0 2 PRINT<br />

‐ 43 ‐


Sterowniki <strong>prog</strong>ramowalne MAX Logic<br />

(OK)<br />

> ." "Błękitny na czarnym" " DEEPBLUE 0 4 PRINT<br />

(OK)<br />

> CLEAR<br />

(OK)<br />

><br />

Słowo “Czerwony” będzie drukowane w wierszu 0 i w kolumnie 0 w kolorze czerwonym. Słowo “Zielony” będzie<br />

drukowane w wierszu 1 i w kolumnie 0 w kolorze zielonym. Fraza “Inwersja zielonego” będzie drukowana w wierszu 3 i w<br />

kolumnie 0 w kolorze fioletowym na czarnym tle. Fraza “Błękitny na czarnym” będzie drukowana w wierszu 4 i w<br />

kolumnie 0 w kolorze niebieskim na czarnym tle. Po wykonaniu słowa CLEAR, pole drukowania (tło) stanie się czarne.<br />

4.10.4 Okno parametryzacji (widżet)<br />

Do wprowadzenia liczbowych parametrów na wyświetlaczu za pomocą przycisków sterownika służy okno parametryzacji.<br />

Do wywołania okna do wprowadzania wartości liczbowych służy słowo GET. Ze stosu matematycznego zdejmuje górne<br />

znaczenie jako liczbę, która będzie drukowana w dolnym wierszu okna parametryzacji, jako wartość początkowa<br />

(domyślna) podlegająca dalszej edycji (maksymalnie 15 znaków); z bufora wyjściowego sczytuje tekst, który będzie<br />

drukowany w górnym wierszu okna parametryzacji, jako tekst informacyjny (maksymalnie 12 znaków. UWAGA! Forthsystem<br />

domyślnie ma ustawione dodawanie jednej spacji na końcu tekstu wprowadzanego do bufora wejściowego, więc<br />

możemy podać tylko 11 znaków. Funkcję tę można wyłączyć słowem NOAUTOSPACE i tym samym poszerzyć możliwość<br />

wprowadzania tekstu do faktycznych 12 znaków). Po słowie GET podajemy dwa słowa: pierwsze słowo będzie wykonane<br />

w przypadku wprowadzenia parametru i akceptacji przyciskiem OK; drugie słowo zostanie wykonane w przypadku<br />

rezygnacji wprowadzania parametru przyciskiem Esc.<br />

Przy akceptacji wprowadzonego parametru, oprócz wykonania pierwszego słowa, na stos matematyczny zostanie<br />

położona wprowadzona wartość. Wywołanie okna parametryzacji jest możliwe tylko w oknie drukowania oraz w bloku<br />

"Funkcji dodatkowych" jako punkt menu. W innych przypadkach fort‐system blokuje pracę słowa GET. Wartość<br />

początkowa (domyślna) nie może przekraczać 15 znaków wraz z przecinkiem „.”. Liczba ta jest drukowana z ustawioną<br />

precyzją, czyli z ustawioną liczbą cyfr po przecinku. Przytoczymy przykład aplikacji słowa GET:<br />

> : print F. 0 0 PRINT ;<br />

(OK)<br />

> ." TEMP> " 20.0 GET print STOP<br />

TEMP > (OK)<br />

><br />

Do wywołania okna do wprowadzania wartości wierszowych (tekstów) służy słowo GETS. Ze stosu danych zdejmuje górne<br />

znaczenie jako numer zmiennej wierszowej, której tekst będzie drukowana w dolnym wierszu okna parametryzacji, jako<br />

tekst początkowy (domyślny) podlegająca dalszej edycji (maksymalnie 15 znaków); z bufora wyjściowego sczytuje tekst,<br />

który będzie drukowany w górnym wierszu okna parametryzacji, jako tekst informacyjny (maksymalnie 12 znaków.<br />

UWAGA! Forth‐system domyślnie ma ustawione dodawanie jednej spacji na końcu tekstu wprowadzanego do bufora<br />

wejściowego, więc możemy podać tylko 11 znaków. Funkcję tę można wyłączyć słowem NOAUTOSPACE i tym samym<br />

poszerzyć możliwość wprowadzania tekstu do faktycznych 12 znaków). Po słowie GETS podajemy dwa słowa.<br />

Pierwsze słowo będzie wykonane w przypadku wprowadzenia tekstu i akceptacji przyciskiem OK; drugie słowo zostanie<br />

wykonane w przypadku rezygnacji wprowadzania tekstu przyciskiem Esc. Przy akceptacji wprowadzonego tekstu, oprócz<br />

wykonania pierwszego słowa, tekst ten zostanie zapisany jako wartość zmiennej wierszowej o numerze podanym przed<br />

słowem GETS, czyli zastąpi tekst początkowy (domyślny). Wywołanie okna parametryzacji jest możliwe tylko w oknie<br />

drukowania oraz w bloku "Funkcji dodatkowych" jako punkt menu. W innych przypadkach fort‐system blokuje pracę<br />

słowa GETS. Tekst zmiennej wierszowej, który jest drukowany w górnym wierszu okna jako tekst początkowy (domyślny)<br />

nie powinien zawierać spacji. Znaki wprowadzone po spacji nie są drukowane w wierszu. Przytoczymy przykład<br />

zastosowania słowa GETS:<br />

‐ 44 ‐


Instrukcja <strong>prog</strong>ramowania w języku <strong>ForthLogic</strong> wersja <strong>P.1.2</strong><br />

> : print 1 STRING? 0 0 PRINT ;<br />

(OK)<br />

> ." Slowo " 1 STRING!<br />

Slowo (OK)<br />

> ." PRZYKLAD " 1 GETS print STOP<br />

PRZYKLAD (OK)<br />

><br />

4.11 KOMUNIKACJA GSM<br />

4.11.1 Sieć GSM<br />

Do wprowadzenia kodu aktywnej karty SIM służy słowo PIN. Słowo to z bufora wyjściowego sczytuje tekst (ciąg cyfr) jako<br />

kod i zapisuje go w pamięci sterownika. To powoduje automatyczne logowanie do sieci GSM przy załączeniu sterownika<br />

(np. po zaniku zasilania). W przeciwnym wypadku sterownik przy uruchamianiu nie zaloguje się do sieci GSM.<br />

Do otrzymania tekstu aktualnego PINu służy słowo PIN. (PIN „kropka”), które drukuje w buforze wyjściowym tekst PINu.<br />

Przykład użycia słów:<br />

> ." 1234 " PIN<br />

1234 (OK)<br />

> PIN.<br />

1234 (OK)<br />

W sterowniku typu H04 parametry te ustawiane są w menu konfiguracyjnym.<br />

Dla zwiększenia możliwości korzystania z zasobu słów odnoszących się do połączeń GSM istnieją słowa pozwalające<br />

określić warunki techniczne sieci GSM<br />

ROAMING? – kładzie na stos znaczenie logiczne. Przy czym, logiczne znaczenie PRAWDA oznacza, że karta SIM<br />

zalogowana jest w zagranicznej sieci (roaming), a FAŁSZ, że karta SIM zalogowana jest w sieci krajowej naszego operatora.<br />

Słowo to może być pomocne w strefach przygranicznych dla wyeliminowania połączeń roamingowych.<br />

OPERATOR ‐ drukuje w buforze wyjściowym i na terminalu nazwę operatora sieci GSM, w której zalogowała się karta SIM.<br />

Jeżeli karta nie będzie zalogowana to bufor będzie pusty.<br />

SIGNAL? ‐ kładzie na stos wartość liczbową oznaczającą poziom sygnału sieci GSM. Siła sygnału w stanie zalogowania<br />

może przyjmować znaczenie od 0 do 4. Jeśli zaistniał problem z załogowaniem do sieci albo z samym modułem GSM to<br />

słowo SIGNAL? ‐ kładzie na stos wartość ‐1. Słowo to może służyć jako wskaźnik początku poprawnej pracy sterownika w<br />

sieci GSM. Informacja o sile sygnału w sieci GSM odświeżana jest automatycznie przez system, co 3 sek.<br />

Przytoczymy przykład stosowania danych słów:<br />

> ROAMING? .<br />

0 (OK)<br />

> OPERATOR<br />

Plus GSM (OK)<br />

> SIGNAL? .<br />

3 (OK)<br />

4.11.2 Połączenia głosowe<br />

Do pracy z komunikatorem GSM wykorzystujemy grupę słów, które pozwalają sterownikowi inicjować i podejmować<br />

połączenia głosowe, podłączać zewnętrzny mikrofon i ustalać reakcję fort‐systemu na sygnały DTMF.<br />

Do odtwarzania plików dźwiękowych podczas wejściowego lub wyjściowego połączenia głosowego służy słowo PLAY<br />

(odtwórz). Słowo to z bufora wyjściowego sczytuje tekst jako nazwę pliku w formacie .wav (plik musi być załączony na<br />

karcie pamięci SD/SDHC/MMC). Po słowie PLAY podajemy słowo, które będzie wykonane po zakończeniu odtwarzania<br />

wskazanego pliku dźwiękowego.<br />

Wynik wykonania słowa PLAY kładzie się na stos jako znaczenie logiczne. Przy czym, logiczne znaczenie PRAWDA oznacza,<br />

‐ 45 ‐


Sterowniki <strong>prog</strong>ramowalne MAX Logic<br />

że proces odtworzenia pliku rozpoczął się, a FAŁSZ, że zaistniał problem, np.: brak karty SD w porcie; brak pliku na karcie<br />

SD; dokonywane jest właśnie inne połączenie; itp.).<br />

Do syntezy i głosowego odtworzenia wartości liczbowej podczas wyjściowego lub wejściowego połączenia głosowego<br />

służy słowo SAY (powiedzieć). Słowo to zdejmuje ze stosu matematycznego górną wartość z zakresu ‐999.9÷+999.9. Po<br />

słowie SAY podajemy słowo, które będzie wykonane po zakończeniu syntezy i głosowego odtworzenia podanej wartości<br />

liczbowej.<br />

Wynik wykonania słowa SAY kładzie się na stos jako znaczenie logiczne. Przy czym, znaczenie logiczne PRAWDA oznacza,<br />

że proces syntezy i odtworzenia rozpoczął się pomyślnie, a FAŁSZ, że zaistniał jakiś problem, np.: podana liczba była z poza<br />

ustalonego zakresu. Domyślnie podana wartość liczbowa jest odtwarzana z podaniem znaku tej liczby (+/‐) i z<br />

dokładnością do 1 cyfry po przecinku.<br />

Do wyłączenia automatycznego podawania znaku „plus” (+) służy słowo NOSAYPLUS. Do ponownego załączenia służy<br />

słowo SAYPLUS.<br />

Do zatrzymania odtwarzanego powiadomienia dźwiękowego służy słowo MUTE, które natychmiast wstrzymuje<br />

odtwarzanie i blokuje wykonania słowa zadanego po słowach PLAY i SAY.<br />

Do zatrzymania połączenia głosowego służy słowo HOLD (wstrzymać), które wstrzymuje każde połączenie głosowe<br />

(wejściowego lub wyjściowego).<br />

Do inicjowania przez sterownik połączenia głosowego służy słowo DIAL, które z bufora wyjściowego sczytuje numer<br />

telefonu (w formacie międzynarodowym). Po słowie DIAL podajemy dwa słowa.<br />

Pierwsze słowo będzie wykonane w przypadku, kiedy inicjowane połączenie przez sterownik zostanie podjęte; drugie<br />

słowo będzie wykonane w przypadku nie podjęcia połączenia w ciągu 60 sek. lub jego odrzucenia. Wynik wykonania słowa<br />

DIAL kładzie się na stos jako znaczenie logiczne. Przy czym, logiczne znaczenie PRAWDA oznacza, że rozpoczęła się<br />

inicjacja połączenia, a FAŁSZ, że zaistniał problem (np.: nie pracuje modem GSM; dokonywane jest właśnie inne<br />

połączenie; itp.).<br />

Przykład połączenia głosowego:<br />

> : temperatura 1 AI? 2.345 F* SAY HOLD DROP ;<br />

(OK)<br />

> : powitanie ." hello.wav " PLAY temperatura DROP ;<br />

(OK)<br />

> : zadzwon ." +48123456789 " DIAL powitanie STOP DROP ;<br />

(OK)<br />

> zadzwon<br />

+48123456789 (OK)<br />

><br />

Zdefiniowaliśmy nowe słowo temperatura, które wykonuje następujące operacje: na szczyt stosu matematycznego<br />

kładzie wartość podaną na wejściu analogowym 1, którą mnożymy przez określony współczynnik. W ten sposób na szczyt<br />

stosu matematycznego kładziemy wartość (temperatury), która jest potrzebne do wykonania słowa SAY. Następnie<br />

wykonane zostaje słowo SAY (głosowa synteza wartości liczbowej), po którym zostanie wykonane słowo HOLD<br />

(zakończenie połączenia). Na koniec zostanie wykonane słowo DROP (wykasowanie ze stosu danych wyniku wykonania<br />

słowa SAY, ponieważ nie jest nam w tym przypadku potrzebny). Następnie zdefiniowaliśmy następne słowo „powitanie”,<br />

które wykonuje następujące operacje: do bufora wyjściowego zapisana zostaje nazwa pliku, który jest potrzebny do<br />

wykonania słowa PLAY. Następnie wykonywane jest słowo PLAY (odtwarzanie pliku dźwiękowego, po którym zostanie<br />

wykonane słowo temperatura. Na koniec zostanie wykonane słowo DROP (wykasowanie ze stosu danych wyniku<br />

wykonania słowa PLAY, ponieważ nie jest nam w tym przypadku potrzebny). Następnie zdefiniowaliśmy kolejne słowo<br />

„zadzwon”, które wykonuje następujące operacje: do bufora wyjściowego wprowadza numer telefonu, który jest<br />

potrzebny do wykonania słowa DIAL. Następnie wykonywane jest słowo DIAL (inicjacja połączenia głosowego, w którym<br />

zostanie wykonane słowo „powitanie”, jeżeli zostanie ono podjęte w ciągu 60 sek., lub słowo STOP, jeżeli nie zostanie ono<br />

podjęte w ciągu 60 sek. Na koniec zostanie wykonane słowo DROP (wykasowanie ze stosu danych wyniku wykonania<br />

słowa DIAL, ponieważ nie jest nam w tym przypadku potrzebny). Następnie wykonujemy słowo „zadzwon”.<br />

W trybie dialogowym zdalnym bezpośrednie wykonanie słowa DIAL jest zablokowane. Jest to spowodowane możliwością<br />

‐ 46 ‐


Instrukcja <strong>prog</strong>ramowania w języku <strong>ForthLogic</strong> wersja <strong>P.1.2</strong><br />

nałożenia się dwóch zadań: automatycznej odpowiedzi forth‐systemu na wejściowy SMS oraz wykonania podanego w tym<br />

wejściowym SMSie słowa DIAL, co może mieć nieprzewidywalne skutki dla pracy forth‐systemu. Problem ten można<br />

rozwiązać poprzez definicję nowego słowa, które w swoim składzie będzie zawierać słowo DIAL, a realizacja jego będzie<br />

odłożona w czasie, np. poprzez słowo TIMER! . Minimalny czas zwłoki to 1 sek.<br />

Do podjęcia połączenia głosowego służy słowo ANSWER (odpowiedz), które z bufora wyjściowego sczytuje jeden lub kilka<br />

wierszy tekstu rozdzielonych spacją. Są to numery telefonów w formacie międzynarodowym. Po słowie ANSWER<br />

podajemy słowo, które będzie wykonywane po podjęciu przez sterownik przychodzącego połączenia.<br />

Słowo ANSWER podejmuje inicjowane połączenie głosowe przez wskazane numery telefonów. Wynik wykonania słowa<br />

ANSWER kładzie się na stos jako znaczenie logiczne. Przy czym, logiczne znaczenie PRAWDA oznacza, że inicjowane<br />

połączenie głosowe zostało podjęte przez sterownik, a FAŁSZ, że na chwile wykonywania słowa ANSWER nie było<br />

inicjowane połączenie, właśnie trwa połączenie głosowe lub inicjowanie połączenia głosowego odbyło się z<br />

nieuwzględnionego numeru telefonu. Jeżeli dla słowa ANSWER nie podamy żadnego numer telefonu, to sterownik<br />

podejmie każde inicjowane połączenie niezależnie od numeru telefonu.<br />

Przykład:<br />

> : powitanie . " hello.wav " PLAY HOLD DROP ;<br />

(OK)<br />

> : wait ." +48123456789 +48987654321 ”<br />

ANSWER powitanie<br />

NOT IF 3.0 3 TIMER! wait THEN ;<br />

(OK)<br />

> wait<br />

+48123456789 +48987654321 (OK)<br />

><br />

Słowo powitanie już opisywaliśmy. Następnie definiujemy nowe słowo wait, które wykonuje następujące operacje: do<br />

bufora wyjściowego zapisane zostają numery telefonów potrzebne do wykonania słowa ANSWER. Następnie<br />

wykonywane jest słowo ANSWER (podjęcie inicjowanego połączenia głosowego ze wskazanego numeru telefonu i<br />

wykonanie słowa powitanie). Bezpośrednio po słowie ANSWER będzie dokonana analiza jego wykonania. Jeżeli wynikiem<br />

będzie FAŁSZ, to po 3 sek. znów będzie wykonane sowo wait (uruchamiając ponownie proces oczekiwania na wejściowe<br />

połączenie głosowe), a jeżeli wynikiem będzie PRAWDA, to nic nie będzie wykonane.<br />

Ilość numerów telefonów, które mają być autoryzowane przez sterownik jest ograniczona przez pojemność bufora<br />

wyjściowego. Jednak istnieje sposób, który pozwala zwiększyć liczbę numerów telefonów, na których wezwanie odpowie<br />

sterownik wykonując słowo ANSWER.<br />

Przykład:<br />

> : powitanie ." hello.wav " PLAY HOLD DROP ;<br />

(ОК)<br />

> : wait1 ." +48123456789 " ANSWER powitanie DROP<br />

3.0 1 TIMER! wait1 ;<br />

(ОК)<br />

> : wait2 ." +48987654321 " ANSWER powitanie DROP<br />

3.0 2 TIMER! wait2 ;<br />

(ОК)<br />

> wait1 wait2<br />

+48123456789 +48987654321 (ОК)<br />

><br />

Słowo powitanie już opisywaliśmy w poprzednich przykładach. Następnie definiujemy nowe słowo wait1. Z bufora<br />

wyjściowego zostaje podany numer telefonu. Następnie podajemy słowo ANSWER, które dokona próby podjęcia<br />

przychodzącego połączenia inicjowanego przez telefon o podanym wcześniej numerze. Jeżeli połączenie będzie właśnie z<br />

‐ 47 ‐


Sterowniki <strong>prog</strong>ramowalne MAX Logic<br />

tego numeru to zostanie wykonane słowo powitanie, a od razu po słowie ANSWER będzie wykonane słowo DROP, czyli<br />

wykasowanie ze stosu wyniku wykonania słowa ANSWER. Po 3 sekundach słowo wait1 zostanie wykonane ponownie.<br />

Analogicznie tworzymy kolejne słowo wait2 z następnym numerem telefonu. Wykonując słowa wait1 i wait2<br />

uruchamiamy nieskończony proces oczekiwania na przychodzące połączenie z wyznaczonego numeru telefonu<br />

Do identyfikacji numeru telefonu, z którego jest inicjowane połączenie i wykonania określonych zadań bez podjęcia tego<br />

wezwania służy słowo CLIP. Słowo to pozwala na bezpłatne sterowanie urządzeniami lub proste potwierdzenie<br />

otrzymania komunikatu SMS. Po prostu wystarczy „puścić sygnał” do sterownika, a on wykona wskazane słowo. Słowo<br />

CLIP z bufora wyjściowego sczytuje jeden lub kilka wierszy rozdzielonych spacją. Są to numery telefonów w formacie<br />

międzynarodowym. Po słowie CLIP podajemy słowo, które będzie wykonywane w chwili wezwania z telefonu o<br />

wskazanym wcześniej numerze telefonu.<br />

Wynik wykonania słowa CLIP kładzie się na stos jako znaczenie logiczne. Przy czym, logiczne znaczenie PRAWDA oznacza,<br />

że wezwanie zostało dokonane z autoryzowanego numeru telefonu i zostało ono odrzucone, a FAŁSZ, że na chwile<br />

wykonywania słowa CLIP nie było wezwania, właśnie trwa połączenie głosowe lub wezwanie odbyło się z<br />

nieuwzględnionego numeru telefonu. Jeżeli dla słowa CLIP nie podamy żadnego numer telefonu, to podane słowo<br />

zostanie wykonane przy wezwaniu z dowolnego numeru telefonu.<br />

Przykład załączenia urządzenia przychodzącym wezwaniem z podanych numerów telefonów:<br />

> : inv 1 RO? NOT 1 RO! ;<br />

> : clip .” +48123456789 +48987654321 ” CLIP inv DROP ;<br />

> : wait clip 1.0 1 TIMER! wait ;<br />

> wait<br />

Do określenia statusu połączenia głosowego służy słowo HOOK? (jak widełki słuchawki telefonicznej), które kładzie na stos<br />

logiczne znaczenie, które odpowiada stanowi połączenia głosowego. Przy czym, logiczne znaczenie PRAWDA oznacza, że<br />

na daną chwilę nie odbywa się żadne połączenie głosowego (słuchawka leży na widełkach), a FAŁSZ, że właśnie odbywa<br />

się połączenie głosowe wejściowy lub wyjściowe (słuchawka jest podniesiona).<br />

UWAGA!<br />

W przypadku ustawienia hasła dostępu do systemu dostęp poprzez operatorskie menu głosowe (IVR)<br />

poprzedzony jest żądaniem hasła, które wprowadzamy za pomocą klawiatury telefonu (funkcja DTMF).<br />

4.11.3 Operatorskie menu głosowe (IVR) i funkcja DTMF<br />

Przy tworzeniu menu głosowego niezbędnym elementem takiego menu jest możliwość <strong>prog</strong>ramowanie działań przy<br />

użyciu przycisków telefonu komórkowego ‐ czyli ustawienie reakcji na sygnały DTMF. Służą do tego słowa:<br />

‐ WAITKEY (czekać na przycisk) ‐ ustala wymaganą reakcję forth‐systemu na pojedynczy sygnał DTMF;<br />

‐ WAITPW (czekać na hasło) ‐ ustala wymaganą reakcję forth‐systemu na wprowadzenie hasła dostępu za pomocą<br />

sygnałów DTMF;<br />

‐ WAITSTR (czekać na wiersz) ‐ ustala wymaganą reakcję forth‐systemu na wprowadzenie wiersza cyfr za pomocą<br />

sygnałów DTMF, przy czym wiersz cyfr może być liczbą całkowitą lub liczbą zmiennoprzecinkową. Dla użytkowników są<br />

dostępne przyciski od „1” do „9”, oraz przyciski „0”, „*” i „#”. Odpowiadają im kody od 1 do 12 (klawiszom od "1" do "9"<br />

odpowiada analogicznie kod od 1 do 9, klawisze "0" ‐ 10, klawisze "*" ‐ 11, a klawisze "#" ‐ 12).<br />

Każdemu naciśnięciu klawisza telefonu komórkowego przyporządkowany jest odpowiedni sygnał (ton). Fort‐system<br />

rozpoznaje sygnały przyporządkowane odpowiednim przyciskom i domyślnie dla potwierdzenia przyjęcia sygnału zwrotnie<br />

generuje sygnał dźwiękowy przypisany danemu przyciskowi. Dźwiękowe potwierdzenie przyjęcia sygnału można wyłączyć<br />

za pomocą stałej systemowej NODTMFCONFIRM. Powtórnie dźwiękowe potwierdzenie można załączyć stała systemową<br />

DTMFCONFIRM. Po zaniku zasilania i powtórnym uruchomieniu sterownika funkcja wyłączająca automatyczne<br />

potwierdzenia jest kasowana.<br />

Fort‐system ma również możliwość wygenerowania sygnału (tonu) odpowiadającego danemu przyciskowi. Służy do tego<br />

słowo TONE, które ze stosu zdejmuje górne znaczenie jako kod przycisku z zakresy od 1 do 12 i generuje standardowy<br />

‐ 48 ‐


Instrukcja <strong>prog</strong>ramowania w języku <strong>ForthLogic</strong> wersja <strong>P.1.2</strong><br />

sygnał, który odpowiada temu przyciskowi.<br />

Za słowem WAITKEY podajemy trzy słowa. Podczas połączenia głosowego naciśniecie dowolnego przycisku telefonu<br />

komórkowego spowoduje wykonanie pierwszego słowa. W przypadku, kiedy nie zostanie podany żaden sygnał w ciągu 60<br />

sek., zostanie wykonane drugie słowo. W przypadku, kiedy połączenie zostanie przerwane przez użytkownika zostanie<br />

wykonane trzecie słowo.<br />

Wynik wykonania słowa WAITKEY kładzie się na stos jako znaczenie logiczne. Przy czym znaczenie logicznie PRAWDA<br />

oznacza, że proces rejestrowania podanych słów (typu callback) zakończył się i są one gotowe do ewentualnego<br />

wykonania, a FAŁSZ, że pojawiły się problemy (np.: w danej chwili nie ma żadnego przychodzącego połączenia<br />

głosowego). Podamy przykład prostego menu głosowego składającego się z jednego punktu:<br />

> : analiza 1 = IF ." true.wav " PLAY HOLD<br />

ELSE ." by.wav " PLAY HOLD THEN DROP ;<br />

(OK)<br />

> : wait WAITKEY analiza HOLD STOP DROP<br />

2 TONE ;<br />

(OK)<br />

> : powitanie ." hello.wav " PLAY wait DROP ;<br />

(OK)<br />

> : menu_glosowe<br />

." +48123456789 " DIAL powitanie STOP DROP ;<br />

(OK)<br />

> menu_glosowe<br />

+48123456789 (OK)<br />

><br />

Zdefiniowaliśmy nowe słowo analiza, które będzie porównywało kod ostatniego otrzymanego sygnału DTMF z 1. Jeżeli<br />

wynikiem porównania będzie logiczne znaczenie PRAWDA, to zostanie odtworzony plik "true.wav". W przeciwnym<br />

wypadku zostanie odtworzony plik "by.wav". W każdym przypadku, zostanie również wykonane słowo DROP, żeby<br />

wykasować ze stosu wynik wykonania słów PLAY, ponieważ go nie analizujemy. Następnie definiujemy nowe słowo wait,<br />

które ustala wymaganą reakcję forth‐systemu na sygnały DTMF: przy naciśnięciu któregokolwiek przycisku zostanie<br />

wykonane słowo analiza. Poza tym, przy wykonaniu słowa wait (po wysłuchaniu pliku dźwiękowego hallo) użytkownik<br />

usłyszy w telefonie sygnał, który informuje go o gotowości przyjęcia przez sterownik sygnału DTMF. W sytuacji, kiedy<br />

minie ustawiony czas reakcji 60 sekund, forth‐system zakończy połączenie, a w sytuacji, kiedy połączenie zostanie<br />

przerwane przez użytkownika, nie będzie żadnej reakcji. Następnie zdefiniowaliśmy nowe słowo powitanie, które<br />

odtwarza plik "hello.wav", a następnie wykonuje słowo wait. Ostatecznie zdefiniowaliśmy główne słowo menu_glosowe,<br />

które wykonuje połączenie głosowe na wskazany numer telefonu i wykonuje słowo powitanie. Wykonanie głównego<br />

słowa w następnej linii rozpoczyna proces inicjacji połączenia i odtworzenia menu głosowego .<br />

Za słowem WAITPW podajemy trzy słowa. Podczas połączenia głosowego podanie właściwego hasła spowoduje<br />

wykonanie pierwszego słowa (każdą kolejną cyfrę należy wprowadzać wyłącznie po sygnale [bip]). Wprowadzanie hasła<br />

należy zakończyć symbolem # (przykład: „Podaj hasło”[bip] 1[bip] 2[bip] 3[bip] 4[bip] # [1234]). W przypadku<br />

załączenia funkcji NODTMFCOMFIRM hasło wprowadzamy ciągiem, bez oczekiwania na sygnały potwierdzające.<br />

W przypadku, kiedy nie zostanie podany żaden sygnał w ciągu 60 sek. lub podane hasło jest niepoprawne, zostanie<br />

wykonane drugie słowo. W przypadku, kiedy połączenie zostanie przerwane przez użytkownika zostanie wykonane trzecie<br />

słowo.<br />

Wynik wykonania słowa WAITPW kładzie się na stos jako znaczenie logiczne. Przy czym znaczenie logicznie PRAWDA<br />

oznacza, że proces rejestrowania podanych słów (typu callback) zakończył się i są one gotowe do ewentualnego<br />

wykonania, a FAŁSZ, że zaistniał problem (np.: w danej chwili nie ma żadnego przychodzącego połączenia głosowego).<br />

Zmienimy poprzedni przykład menu głosowego, wprowadzając hasło (zmiany zaznaczono pomarańczowym kolorem):<br />

> : analiza 1 = IF ." true.wav " PLAY HOLD<br />

ELSE ." by.wav " PLAY HOLD THEN DROP ;<br />

(OK)<br />

> : czekac WAITKEY analiza HOLD STOP DROP<br />

2 TONE ;<br />

‐ 49 ‐


Sterowniki <strong>prog</strong>ramowalne MAX Logic<br />

(OK)<br />

> : powitanie ." hello.wav " PLAY wait DROP ;<br />

(OK)<br />

> : wait_haslo WAITPW powitanie HOLD STOP DROP 6 TONE ;<br />

(OK)<br />

> : haslo ." haslo.wav " PLAY czekac_haslo DROP ;<br />

(OK)<br />

> : menu_glosowe<br />

." +48123456789 " DIAL haslo STOP DROP ;<br />

(OK)<br />

> menu_glosowe<br />

+48123456789 (OK)<br />

><br />

Za słowem WAITSTR podajemy trzy słowa. Podczas połączenia głosowego podanie wiersza cyfr za pomocą klawiatury<br />

telefonu zostanie zinterpretowane przez forth‐system jako liczba i zostanie ona położona na szczyt stosu<br />

matematycznego, zarazem spowoduje wykonanie pierwszego słowa. Każdą kolejną cyfrę należy wprowadzać wyłącznie po<br />

sygnale [bip]. Przecinek dla liczb zmiennoprzecinkowych wprowadzamy przyciskiem *. Wprowadzanie liczby należy<br />

zakończyć symbolem # (przykład: „Podaj wartość”[bip] 1[bip] 2[bip] 3[bip] *[bip]4[bip] # [123,4]). W<br />

przypadku, kiedy nie zostanie podany żaden sygnał w ciągu 60 sek. zostanie wykonane drugie słowo. W przypadku, kiedy<br />

połączenie zostanie przerwane przez użytkownika zostanie wykonane trzecie słowo. W przypadku załączenia funkcji<br />

NODTMFCOMFIRM liczbę wprowadzamy ciągiem, bez oczekiwania na sygnały potwierdzające.<br />

Wynik wykonania słowa WAITSTR kładzie się na stos jako znaczenie logiczne. Przy czym znaczenie logicznie PRAWDA<br />

oznacza, że proces rejestrowania podanych słów (typu callback) zakończył się i są one gotowe do ewentualnego<br />

wykonania, a FAŁSZ, że zaistniał problem (np.: w danej chwili nie ma żadnego przychodzącego połączenia głosowego).<br />

Przykład prostego menu głosowego z wprowadzeniem wartości (temperatury) jako zmiennej zmiennoprzecinkowej:<br />

> : set_temp FDUP 60.0 F<<br />

IF 1 FVAR! ." ok.wav " PLAY HOLD DROP<br />

ELSE ." wrong.wav " PLAY HOLD DROP<br />

THEN;<br />

(OK)<br />

> : wait_temp WAITSTR set_temp HOLD STOP DROP 11 TONE ;<br />

(OK)<br />

> : powitanie ." demand.wav " PLAY wait_temp DROP ;<br />

(OK)<br />

> : menu_glosowe<br />

." +48123456789 " DIAL powitanie STOP DROP ;<br />

(OK)<br />

> menu_glosowe<br />

+48123456789 (OK)<br />

><br />

Zdefiniowaliśmy słowo set_temp, które tworzy kopię liczby na stosie matematycznym, porównuje ją z liczbą 60.0<br />

(zdejmując ze stosu matematycznego jedną z kopii). Jeżeli w skutek porównania na stosie danych będzie logiczne<br />

znaczenie PRAWDA, to zmiennej matematycznej numer 1 zostanie nadana wartość temperatury (przy czym z<br />

matematycznego stosu zostanie zdjęta ostatnia kopia), oraz zostanie odtworzony plik "ok.wav", po którym połączenie<br />

zostanie przerwane. W przeciwnym wypadku zostanie odtworzony plik "wrong.wav", po którym połączenie zostanie<br />

przerwane. Następnie zdefiniowaliśmy słowo wait_temp, które pozwala na wprowadzenie liczby za pomocą sygnałów<br />

DTMF z klawiatury telefonu. Po naciśnięciu przycisku # zostanie wykonane słowo set_temp. W przypadku, kiedy nie<br />

zostanie podany żaden sygnał w ciągu 60 sek. sterownik zakończy połączenie. W przypadku, kiedy połączenie zostanie<br />

przerwane przez użytkownika sterownik nie podejmie żadnej akcji. Następnie zdefiniowaliśmy słowo powitanie, które<br />

odtworzy plik „demand.wav”, a następnie wykona słowo wait_temp. Ostatecznie zdefiniowaliśmy główne słowo<br />

menu_glosowe, które wykonuje połączenie głosowe na wskazany numer telefonu i wykonuje słowo powitanie.<br />

Wykonanie głównego słowa w następnej linii rozpoczyna proces inicjacji połączenia i odtworzenia menu głosowego.<br />

‐ 50 ‐


Instrukcja <strong>prog</strong>ramowania w języku <strong>ForthLogic</strong> wersja <strong>P.1.2</strong><br />

4.11.4 Numery telefonów<br />

W poprzednich przykładach wszystkie numery telefonów były statycznie określone za pomocą wierszy. Dlatego, by móc<br />

zmieniać numery telefonów bez potrzeby przebudowy całego zadania, istnieją specjalne zmienne wierszowe do<br />

utrzymania numerów telefonów użytkowników. Służą do tego słowa: USER (użytkownik) pozwalające wykorzystywać<br />

telefoniczne numery użytkowników przy tworzeniu zadania, oraz słowo USERPHONE (telefon użytkownika) pozwalające<br />

określać i zmieniać telefoniczne numery użytkowników ‐ czyli nadawać nowe znaczenia tym specjalnym zmiennym. Liczbę<br />

zmiennych dla danej wersji sterownika określa parametr PHONE_MAX.<br />

Słowo USERPHONE zdejmuje ze stosu górne znaczenie, które może przyjmować wartości z zakresu od 1 do PHONE_MAX<br />

jako porządkowy numer telefonu użytkownika. Następnie z bufora wyjściowego sczytywany jest wiersz – numer telefonu<br />

w formacie międzynarodowym, który zapamiętany jest jako specjalna zmienna wierszowa z porządkowym numerem.<br />

Słowo USER zdejmuje ze stosu górne znaczenie, które może przyjmować wartości z zakresu od 1 do PHONE_MAX jako<br />

numer zmiennej z porządkowanym numerem telefonu użytkownika. Następnie w buforze wyjściowym i na terminalu<br />

drukuje ten numer telefonu.<br />

Pierwsze sześć zmiennych (numery 1÷6) zarezerwowane jest dla numerów telefonów, które uczestniczą w<br />

polityce bezpieczeństwa forth‐systemu. Są to pozycje, których przypisane numery telefonów są autoryzowane<br />

przez sterownik. Przy odpowiednich ustawieniach parametrów komunikatora tylko z tych telefonów można<br />

będzie dokonywać zdalnego sterowania poprzez menu głosowe i SMSy. W sterowniku typu H04 pierwsze sześć<br />

zmiennych ustala się w menu konfiguracyjnym. W sterowniku H02 za pomocą słowa CONTROL i odpowiednich<br />

stałych systemowych.<br />

Przykład aplikacji słów USER i USERPHONE:<br />

> ." +48123456789 " 1 USERPHONE<br />

+48123456789 (OK)<br />

> 1 USER<br />

+48123456789 (OK)<br />

><br />

W sterowniku typu H04 numer ten pojawi się w menu konfiguracyjnym w bloku Użytkownicy w submenu TELEFONY… w<br />

punkcie NR TEL 1>, jako ustawiony numer użytkownika nr 1.<br />

Słowo LAST zachowuje w buforze wyjściowym numer telefonu abonenta, który jako ostatni dokonał połączenia<br />

głosowego ze sterownikiem, albo jako ostatni nadesłał SMS do sterownika.<br />

Przytoczymy przykład zastosowania ostatnich dwóch słów:<br />

> 1 USER LAST<br />

+48123456789 +42987654321 (OK)<br />

><br />

Pierwszy numer telefonu został określony w poprzednim przykładzie. Drugi wydrukowany numer telefonu to numer<br />

telefonu, z jakiego dokonano ostatniego połączenia, jeżeli takie było.<br />

4.11.5 SMS<br />

Praca sterownika z telefonem za pośrednictwem SMSów określana jest trybem dialogowym zdalnym. W trybie tym ekran<br />

telefonu spełnia podobne funkcje jak okno terminalu na monitorze komputera.<br />

Wyjściowe SMSy to jeden ze sposobów powiadamiania użytkownika o zdarzeniach i parametrach. Wejściowe SMSy to<br />

słowa języka <strong>ForthLogic</strong> ‐ standardowe i zdefiniowane oraz wartości w postaci liczb i tekstów. Wszystkie wejściowe SMSy<br />

trafiają bezpośrednio do interpretatora tekstu forth‐systemu. Tam są odpowiednio interpretowane: słowa są<br />

wykonywane a wartości trafiają na szczyt odpowiedniego stosu. Długość wejściowego i wyjściowego SMSa nie może<br />

przekraczać 160 znaków wraz ze spacjami. W przypadku przekroczenia dopuszczalnej liczby znaków system<br />

‐ 51 ‐


Sterowniki <strong>prog</strong>ramowalne MAX Logic<br />

automatycznie ograniczy ich liczbę do wymaganej. Dla bezpieczeństwa całego forth‐systemu możliwość definiowania<br />

nowych słów w wejściowych SMSie jest zablokowana. Po wprowadzeniu przez użytkownika do forth‐systemu słów w<br />

wejściowym SMS, automatycznie zostanie wygenerowany zwrotny wyjściowy SMS z odpowiedzią forth‐systemu (tak jak w<br />

trybie dialogowym terminalowym forth‐system drukuje komunikaty (OK), (ERROR ‐ UNKNOWN WORD), itp.). Wyjściowy<br />

SMS z odpowiedzią można zablokować. Służy do tego słowo NAK. Podajemy je na początku tekstu SMSa lub zaraz po haśle<br />

dostępu, jeżeli jest ono ustanowione. Ogranicza to koszty obsługi sterownika związane z eksploatacją karty SIM. Również<br />

jest to przydatne w przypadku współdziałania wielu sterowników ze sobą (tzw. M2M (machine to machine), czyli w<br />

system bezpośredniej współpracy urządzeń). Zapobiega to automatycznej odpowiedzi do urządzenia przysyłającego SMSa<br />

i w efekcie zapobiega „łańcuszkowi” nieskończonych SMSów między dwoma sterownikаmi. Słowo NAK jest słowem<br />

pomocniczym w trybie terminalowym zdalnym. Nie wchodzi ono w skład słownika forth‐systemu i nie może być użyte w<br />

pracy terminalowej i w aplikacji jako słowo do wykonania. Może być zastosowane jedynie jako słowo w tekście SMSa<br />

wejściowego lub w aplikacji jako słowo tekstu SMSa wyjściowego, czyli jako tekst bufora wejściowego.<br />

Dla numerów telefonów krótszych niż 8 cyfr wyjściowe SMSy z odpowiedzią są automatycznie blokowane. Jest to filtr<br />

forth‐systemu ograniczający koszty eksploatacji karty SIM w przypadku odbioru przez sterownik SMSów z treścią<br />

reklamową lub komercyjną wysłanych automatycznie z serwerów operatorów telefonii komórkowej lub inne podmioty.<br />

Dla identyfikacji automatycznej odpowiedzi sterownika na wchodzące SMSy i ich realizacji służy słowo IDx [gdzie x to<br />

dowolna liczba z zakresu 1÷65536]. Numer identyfikacyjny wejściowego SMSa tworzymy poprzez złożenie bez spacji<br />

słowa ID i wybranej liczby (np.: ID123). Nadany numer dołączmy na początku treści SMSa (np. ID123 1 1 RO!). W<br />

przypadku ustanowienia hasła dostępu numer podajemy po haśle (np. 9876 ID123 1 1 RO!). W treści odpowiedzi na<br />

wejściowego SMSa z podanym numerem otrzymamy słowo określające status realizacji wejściowego SMSa poprzedzone<br />

podanym numerem identyfikacyjnym (np.: (ID123 OK), (ID2345 ERROR ‐ …)).<br />

UWAGA! Słowa IDx i NAK nie mogą być stosowane jednocześnie. Jest to nielogiczne, a zarazem doprowadzi do błędu<br />

interpretacji tekstu SMSa.<br />

Dla tej wersji o<strong>prog</strong>ramowania istnieje ograniczenie, co do wykorzystania liter w tekstach SMS. Można jedynie<br />

stosować znaki alfabetu angielskiego (niedopuszczalne są polskie znaki diakrytyczne, tj.: ą, ę, ć, itp. lub inne<br />

znaki). Przy definiowaniu nowych słów dla konkretnego zadania, należy to uwzględniać!<br />

Do przesyłania tekstowych powiadomień SMS służy słowo SMS, które z bufora wyjściowego sczytuje numer telefonu w<br />

formacie międzynarodowym oraz tekst tego SMSa. Następnie dokonuje próby wysłania SMSa. Na stos kładzie wynik<br />

wykonania słowa SMS jako znaczenie logiczne. Przy czym znaczenie logicznie PRAWDA oznacza, że SMS został wysłany,<br />

a FAŁSZ, że zaistniał problem (np.: moduł GSM nie pracuje). Długość tekstu SMSa nie może przekraczać ilości znaków<br />

(wraz ze spacjami) określonej parametrem OUTBUF_MAX. W przypadku przekroczenia dopuszczalnej liczby znaków<br />

system automatycznie ograniczy ich liczbę do wymaganej. Należy również pamiętać, że linia <strong>prog</strong>ramu i na terminalu nie<br />

może przekraczać 77 znaków. Długi tekst SMSa należy wprowadzać do bufora wejściowego krótszymi porcjami, np.<br />

dzieląc tekst SMSa na dwie części jako dwa bufory wejściowe w dwóch liniach <strong>prog</strong>ramu.<br />

Przykład:<br />

> : sendSMS ." +48123456789 "<br />

." Wartosc AI2= " 2 AI? F. ." AI3= " 3 AI? F.<br />

SMS DROP ;<br />

(OK)<br />

> sendSMS<br />

+48123456789 Wartosc AI2 = 9.123123 AI3 = 349.000000 (OK)<br />

><br />

Zdefiniowaliśmy słowo sendSMS, które drukuje w buforze wyjściowym (i na terminalu) numer telefonu i sformowany<br />

tekst samego powiadomienia, następnie wykonuje słowo SMS, które “ konsumuje” wszystkie te dane i dokonuje próby<br />

wysłania SMSa. Słowo DROP kasuje ze stosu wynik wykonania operacji słowa SMS, ponieważ w tym przypadku go nie<br />

analizujemy.<br />

Jak widać w tym przykładzie, do tekstu powiadomienia można włączać stałe wierszowe, jak i zmienne za pomocą słów „.”,<br />

„F.”, i „FE.”. Do budowy tekstu powiadomienia mogą być wykorzystane wszystkie słowa, które jako wynik wykonania<br />

‐ 52 ‐


Instrukcja <strong>prog</strong>ramowania w języku <strong>ForthLogic</strong> wersja <strong>P.1.2</strong><br />

kładą na stos danych lub stos matematyczny odpowiednie wartości. Dla formatowania tekstu powiadomienia można<br />

również wykorzystywać słowo SPACE (spacja) do zwiększania, w razie potrzeby odległości między znakami tekstu SMSa.<br />

Przykład SMSa wysłanego bezpośrednio z terminalu:<br />

> ." +48123456789 Hello World! " SMS .<br />

+48123456789 Hello World! ‐1 (OK)<br />

><br />

W trybie dialogowym zdalnym bezpośrednie wykonanie słowa SMS jest zablokowane. Jest to spowodowane możliwością<br />

nałożenia się dwóch zadań: automatycznej odpowiedzi forth‐systemu na wejściowy SMS oraz wykonania podanego w tym<br />

wejściowym SMSie słowa SMS), co może mieć nieprzewidywalne skutki dla pracy forth‐systemu. Problem ten można<br />

rozwiązać poprzez definicję nowego słowa, które w swoim składzie będzie zawierać słowo SMS, a realizacja jego będzie<br />

odłożona w czasie, np. poprzez słowo TIMER!. Minimalny czas zwłoki to 1 sek.<br />

UWAGA!<br />

W przypadku ustawienia blokady dostepu tekst wejściowego SMSa musi być poprzedzony aktualnym hasłem<br />

dostępu, np.: „ 1234 1 1 RO! „.<br />

Do realizacji zadań serwisowych, takich jak aktywacja i dezaktywacja usług, sprawdzanie stanu i uzupełnianie konta, itp., u<br />

operatorów sieci komórkowych służy serwis USSD (Unstructured Supplementary Service Data)<br />

Do pracy forth‐systemu z serwisem USSD służy słowo USSD, które z bufora wyjściowego sczytuje numer telefonu w<br />

formacie międzynarodowym i wiersz z rozkazem serwisowym USSD (rozkazy serwisowe ustalane są przez operatora sieci<br />

komórkowej i są podane w <strong>inst</strong>rukcji użytkowania karty SIM). Słowo to wysyła podany wiersz do operatora, a na stos<br />

kładzie wynik wykonania. Przy czym logicznie znaczenie PRAWDA oznacza, że rozkaz USSD został odprawiony, a FAŁSZ, że<br />

zaistniał problem (np.: moduł GSM nie pracuje lub dokonywany jest inny rozkaz serwisowy USSD). Odpowiedź operatora<br />

na rozkaz serwisowy USSD odsyłany jest pod postacią SMSa na wskazany numer telefonu.<br />

Ogólna długość rozkazu serwisowego USSD nie może przekraczać 80 znaków. W przypadku przekroczenia dopuszczalnej<br />

liczby znaków system automatycznie ograniczy ich liczbę do wymaganej. Słowo USSD można wykorzystywać w tekście<br />

SMS do zdalnego odczytu stanu konta oraz <strong>prog</strong>ramowo po timerze dla regularnego sprawdzenia stanu konta. Jeśli przy<br />

wykonaniu słowa USSD zostanie dokonane połączenie głosowe, to działanie słowa będzie zatrzymane aż do zakończenia<br />

tego połączenia.<br />

Przykład sprawdzenia stanu i terminu ważności konta:<br />

[hasło] NAK LAST ." *111# " USSD DROP<br />

Hasło dostępu podajemy tylko wtedy, jeżeli zostało ono ustanowione. W odpowiedzi przyjdzie SMS z odpowiedzią<br />

operatora, w którym będzie informacja o bieżącym stanie konta i terminie ważności (format przedstawienia<br />

powiadomienia zależy od operatora).<br />

Doładowanie konta:<br />

[hasło] NAK LAST ." *111*12345678909876# " USSD DROP<br />

Hasło dostępu podajemy tylko wtedy, jeżeli zostało ono ustanowione. W odpowiedzi przyjdzie SMS z odpowiedzią<br />

operatora potwierdzającą doładowanie konta (format przedstawienia powiadomienia zależy od operatora).<br />

• Na czerwono podano przykładowe kody rozkazów USSD. W rzeczywistości są one ustalane indywidualnie przez<br />

operatorów sieci komórkowych.<br />

W tym przykładzie, dla ustalenia numeru telefonu, na który przyjdzie odpowiedź, wykorzystaliśmy słowo LAST, tym<br />

samym wskazawszy numer telefonu, z którego został wysłany SMS. Numer telefonu można również wskazać<br />

bezpośrednio albo za pomocą słowa USER.<br />

‐ 53 ‐


Sterowniki <strong>prog</strong>ramowalne MAX Logic<br />

4.11.6 Konfiguracja funkcji zdalnego sterowania<br />

W sterowniku H02 zdalne sterowanie za pomocą SMSów wymaga ustawienia odpowiednich parametrów systemowych.<br />

Parametry te ustawia się za pomocą odpowiednich słów i stałych systemowych.<br />

Do parametryzacji procesu komunikacji GSM za pomocą SMSów służy słowo CONTROL. Słowo to wymaga podania<br />

dodatkowych, specjalnych stałych systemowych, które określają sposób pracy komunikatora.<br />

Stałe systemowe dla słowa CONTROL:<br />

‐ LOCAL ‐ sterowanie zdalne wyłączone<br />

‐ REMOTE ‐ sterowanie zdalne załączone<br />

‐ FOR_ALL ‐ zdalne sterowanie można zrealizować z dowolnego numeru telefonu komórkowego<br />

‐ FOR_LOYAL ‐ zdalne sterowanie można zrealizować tylko z określonych numerów telefonów<br />

Ustawienie odpowiedniego sposobu pracy komunikatora zależy od odpowiedniej kombinacji powyższych stałych i słowa<br />

CONTROL.<br />

FOR_ALL REMOTE CONTROL<br />

FOR_LOYAL REMOTE CONTROL<br />

FOR_ALL LOCAL CONTROL<br />

‐ zdalne sterowanie możliwe z dowolnego numeru telefonu<br />

komórkowego;<br />

‐ zdalne sterowanie możliwe tylko z określonych numerów<br />

wskazanych za pomocą słowa USERPHONE (1÷6);<br />

‐ kierowanie zdalne sterowanie wyłączone w ogóle.<br />

Do określenia numerów telefonicznych, z których może odbywać się zdalne sterowanie służy słowo USERPHONE. Słowo<br />

USERPHONE zdejmuje ze stosu górne znaczenie, które może przyjmować wartości z zakresu od 1 do 40 jako porządkowy<br />

numer telefonu użytkownika. Następnie z bufora wyjściowego sczytywany jest wiersz – numer telefonu w formacie<br />

międzynarodowym, który zapamiętany jest jako specjalna zmienna wierszowa z porządkowym numerem. W tej wersji<br />

<strong>prog</strong>ramowej można zrealizować do 40 numerów telefonów.<br />

Pierwsze sześć zmiennych (numery 1÷6) zarezerwowane jest dla numerów telefonów, które uczestniczą w<br />

polityce bezpieczeństwa forth‐systemu. Są to pozycje, których przypisane numery telefonów są autoryzowane<br />

przez sterownik. Przy ustawieniu opcji FOR_LOYAL REMOTE CONTROL tylko z tych telefonów można będzie<br />

dokonać zdalnego sterowania poprzez SMSy.<br />

Oprócz autoryzacji numerów telefonów można niezależnie ustanowić hasło dostępu do systemu, które również działa dla<br />

wejściowych SMSów. Służy do tego słowo PASSWORD. W przypadku ustanowienia hasła dostępu każdy tekst wejściowego<br />

SMSa musi być poprzedzony hasłem, np.: „1234 1 1 RO!”. Sposób ustanawiania blokady dostępu i hasła opisano w<br />

rozdziale 4.8.2.<br />

4.12 MIKROFON i WYJŚCIE GŁOŚNIKOWE (H04)<br />

Kanał audio sterownika w zależności od jego konfiguracji sprzętowej może pracować w dwóch trybach: audio GSM i audio<br />

SPEAKER. Tryb GSM to wyjście kanału audio na połączenie głosowe z telefonem użytkownika. Tryb SPEAKER to wyjście<br />

kanału audio na zewnętrzny głośnik (poprzez wzmacniacz liniowy). Sposób konfiguracji opisano w <strong>inst</strong>rukcji użytkowania<br />

sterownika H04.<br />

Do pracy z zewnętrznym mikrofonem i wyjściem głośnikowym służą słowa MIC i VOICE.<br />

W trybie GSM wykonanie słowa MIC podczas połączenia głosowego powoduje uruchomienie zewnętrznego mikrofonu<br />

oraz przełączenie kanału audio sterownika na liniowe wyjście głośnikowe. W telefonie będzie słyszalny dźwięk<br />

rejestrowany przez mikrofon podłączony do wejść MIC+ i MIC‐, a na wyjście głośnikowe SPK będzie kierowany sygnał<br />

audio z modułu GSM (głos z telefonu będzie słyszalny w zewnętrznym głośniku podłączonym przez wzmacniacz liniowy do<br />

sterownika). Wykonywanie powiadomień głosowych przez sterownik oraz menu głosowe są zablokowane. Po zakończeniu<br />

połączenia (przez użytkownika lub sterownik) automatycznie powraca funkcja powiadomień głosowych, a przy ponownym<br />

połączeniu również funkcja menu głosowego. Słowo MIC nie blokuje wykonania funkcji DTMF. Wynik wykonania słowa<br />

MIC kładzie się na stos jako wartość logiczna. Przy czym logiczne znaczenie PRAWDA oznacza, że mikrofon i wyjście<br />

głośnikowe uruchomiono, a FAŁSZ, że zaistniał problem (np.: w danej chwili nie było połączenia głosowego).<br />

Słowo VOICE rozłącza mikrofon i wyjście głośnikowe i ponownie przełącza kanał audio na moduł GSM. Wynik wykonania<br />

‐ 54 ‐


Instrukcja <strong>prog</strong>ramowania w języku <strong>ForthLogic</strong> wersja <strong>P.1.2</strong><br />

słowa VOICE kładzie się na stos jako wartość logiczna. Przy czym logiczne znaczenie PRAWDA oznacza, że mikrofon i<br />

wyjście głośnikowe odłączono, a FAŁSZ, że zaistniał problem (np.: w danej chwili nie było połączenia głosowego).<br />

W trybie SPEAKER po wykonaniu słowa MIC wszelkie wykonania słów SAY i PLAY, czyli odtworzenie plików dźwiękowych<br />

.wav będzie słyszalne w zewnętrznym głośniku.<br />

Do regulacji czułości zewnętrznego mikrofonu służy słowo MICLEVEL. Słowo to zdejmuje ze stosu danych wartość z<br />

zakresu 0÷15 jako poziom czułości. Zmiana poziomu czułości o 1 powoduje realna zmianę o współczynnik 1,1885.<br />

Domyślnie czułość wynosi 2. Po zaniku zasilania i powtórnym uruchomieniu sterownika poziom czułości powraca do<br />

wartości domyślnej.<br />

Do regulacji poziomu głośności zewnętrznego kanału audio służy słowo SPKLEVEL. Słowo to zdejmuje ze stosu danych<br />

wartość z zakresu 0÷100 jako poziom głośności. Domyślnie poziom głośności wynosi 100. Po zaniku zasilania i powtórnym<br />

uruchomieniu sterownika poziom powraca do wartości domyślnej.<br />

5. WCZYTANIE I URUCHOMIENIE APLIKACJI (<strong>prog</strong>ramu w języku <strong>ForthLogic</strong>)<br />

5.1 DLA WSZYSTKICH TYPÓW STEROWNIKÓW<br />

Plik tekstowy zawierający <strong>prog</strong>ram stworzony w języku <strong>ForthLogic</strong> (aplikację) należy nazwać "autorun.txt" (koniecznie z<br />

rozszerzeniem .txt!). Następnie wgrać go na kartę SD i włożyć w port sterownika. Plik zostanie automatycznie sczytany.<br />

Plik przy wgrywaniu do pamięci interpretatora forth‐systemu sterownika będzie na bieżąco sprawdzany. Jeżeli forthsystem<br />

napotka jakikolwiek błąd <strong>prog</strong>ramowy wstrzyma wczytywanie aplikacji.<br />

W sterownikach typu H03 i H04 na wyświetlaczu zostanie podany kod błędu i numer wiersza <strong>prog</strong>ramu, w którym<br />

wystąpił błąd. Po wgraniu aplikacji plik zostaje automatycznie usunięty z karty SD, a aplikacja zostanie automatycznie<br />

uruchomiona.<br />

Odrębny przypadek stanowią sterowniki typu H03 i H04. W przypadku, kiedy start aplikacji nie odbywa się poprzez słowo<br />

BOOT, które definiuje i automatycznie wykonuje główne słowo startujące wgrywanej aplikacji, należy dodatkowo ustawić<br />

odpowiednie punkty menu konfiguracyjnego. Po zaniku zasilania głównego i braku zasilania rezerwowego, jeżeli zmiany w<br />

menu konfiguracyjnym zostały zapisane, to po powrocie napięcia zasilania sterownik ponownie rozpocznie pracę wg<br />

wgranej aplikacji. Opis wymaganych czynności i ustawień w menu konfiguracyjnym opisano w <strong>inst</strong>rukcji użytkowania.<br />

Wykorzystując środowisko <strong>prog</strong>ramistyczne Notepad++PuTTY możemy napisany <strong>prog</strong>ram w notatniku bezpośrednio<br />

przesłać do sterownika za pomocą <strong>prog</strong>ramu <strong>ForthLogic</strong> Programmer. Procedura ta jest szczegółowo opisana w oddzielnej<br />

<strong>inst</strong>rukcji użytkowania środowiska <strong>prog</strong>ramistycznego Notepad++PuTTY.<br />

Istnieje również możliwość wczytania aplikacji podczas pracy ze sterownikiem w trybie dialogowym w <strong>prog</strong>ramie<br />

Hiperterminal. Służą do tego rozkazy systemowe:<br />

1. COMPILE FILE [nazwa pliku] ‐ automatycznie wgrywa plik o dowolnej nazwie (zawsze z rozszerzeniem .txt) do<br />

sterownika z karty SD/MMC. Plik przy wgrywaniu do pamięci interpretatora forth‐systemu sterownika będzie na bieżąco<br />

sprawdzany. Jeżeli forth‐system napotka jakikolwiek błąd <strong>prog</strong>ramowy wstrzyma wgrywanie aplikacji i poda na monitorze<br />

kod błędu i numer wiersza <strong>prog</strong>ramu, w którym znalazł błąd.<br />

2. RECEIVE FILE – wgrywa wskazany plik o dowolnej nazwie (zawsze z rozszerzeniem .txt) z zasobów komputera przy<br />

pomocy protokołu CRC XModem. Po wpisaniu rozkazu systemowego RECEIVE FILE i wykonaniu go przyciskiem OK pojawi<br />

się komunikat WAITING CRC MODEM FILE TRANSFER… Rozpocznie się odliczanie czasu 30sek w ciągu, którego należy<br />

rozpocząć transfer pliku. Upływający czas sygnalizowany jest pojawiającymi się kolejnymi znakami C (C=3sek). W<br />

przypadku, gdy nie zdążymy rozpocząć transferu pliku w ciągu tego czasu otrzymamy komunikat (ERROR – FILE TRANSFER<br />

TIMOUT). Procedurę należy powtórzyć.<br />

‐ 55 ‐


Sterowniki <strong>prog</strong>ramowalne MAX Logic<br />

Następnie rozwinąć zakładkę Transfer i wybrać opcję Wyślij plik…<br />

Otworzy się okno Wysyłanie pliku.<br />

W oknie Nazwa pliku: podać ścieżkę dostępu i nazwę pliku lub załączyć plik korzystając z przycisku Przeglądaj… W oknie<br />

wyboru opcji Protokół: ustawić Xodem. Po dokonaniu wyboru pliku i ustawień wcisnąć przycisk Wyślij. Otworzy się okno<br />

transferu.<br />

‐ 56 ‐


Instrukcja <strong>prog</strong>ramowania w języku <strong>ForthLogic</strong> wersja <strong>P.1.2</strong><br />

Jeżeli forth‐system napotka jakikolwiek błąd <strong>prog</strong>ramowy wstrzyma wgrywanie aplikacji i poda na monitorze kod błędu i<br />

numer wiersza <strong>prog</strong>ramu, w którym znalazł błąd. Po pomyślnym wgraniu pliku na oknie terminalu pojawi się komunikat (OK).<br />

5.2 DODATKOWY SPOSÓB DLA STEROWNIKÓW TYPU H03 i H04<br />

Plik tekstowy zawierający <strong>prog</strong>ram stworzony w języku <strong>ForthLogic</strong> (aplikację) należy nazwać "forthdic.txt" (koniecznie z<br />

rozszerzeniem .txt!). Następnie wgrać go na kartę SD i włożyć w port sterownika. Następnie wykonać kolejne punkty<br />

menu konfiguracyjnego. Plik przy wgrywaniu do pamięci interpretatora forth‐systemu sterownika będzie na bieżąco<br />

sprawdzany. Jeżeli forth‐system napotka jakikolwiek błąd <strong>prog</strong>ramowy wstrzyma wgrywanie aplikacji i poda na<br />

wyświetlaczu kod błędu i numer wiersza <strong>prog</strong>ramu, w którym znalazł błąd.<br />

W przypadku, kiedy start aplikacji nie odbywa się poprzez słowo BOOT, które definiuje i automatycznie wykonuje główne<br />

słowo startujące wgrywanej aplikacji, należy dodatkowo ustawić odpowiednie punkty menu konfiguracyjnego.<br />

Dla sterownika H04 należy w menu konfiguracyjnym ustawić pracę sterownika w tryb FORTH, a następnie podać słowo<br />

uruchamiające aplikację. Dla sterownika H03 należy jedynie w menu konfiguracyjnym podać słowo uruchamiające<br />

aplikację. Po dokonaniu tych zmian należy je zapisać. Po zaniku zasilania głównego i braku zasilania rezerwowego, jeżeli<br />

zmiany w menu konfiguracyjnym zostały zapisane, to po powrocie napięcia zasilania sterownik ponownie rozpocznie<br />

pracę wg wgranej aplikacji. Opis wymaganych czynności i ustawień w menu konfiguracyjnym przy wgrywaniu aplikacji<br />

opisano w <strong>inst</strong>rukcji użytkowania.<br />

6. TWORZENIE APLIKACJI W JĘZYKU <strong>ForthLogic</strong><br />

6.1 PROGRAMY DO TWORZENIA APLIKACJI<br />

Tworzenie obszernych <strong>prog</strong>ramów w trybie terminalowym jest trudne i praktycznie się tego nie robi. Ze względu na<br />

specyfikę pracy terminalu nie można modyfikować <strong>prog</strong>ramu. Dlatego tworzenie aplikacji w języku <strong>ForthLogic</strong> odbywa się<br />

w dowolnym edytorze tekstu (np. w Microsoft Notepad, który wchodzi w skład systemu operacyjnego Microsoft<br />

Windows XP lub Windows Vista). Należy pamiętać, że długość wiersza nie może przekraczać 77 znaków.<br />

Dla ułatwienia pracy dedykujemy specjalnie do tworzenia aplikacji w języku <strong>ForthLogic</strong> specjalne środowisko<br />

<strong>prog</strong>ramistyczne Notepad++PuTTY. Program ten jest bezpłatny i jest załączany na płycie CD do każdego sterownika oraz<br />

do pobrania na naszej stronie internetowej www.plcmax.pl. Zasady posługiwania się tym <strong>prog</strong>ramem opisano w osobnej<br />

<strong>inst</strong>rukcji.<br />

( STOPALL FORGET ---HeatCtr---<br />

( Zrealizowano proste dwapoziomowe menu glosowe kierowania dwoma<br />

(wyjsciami przekaznikowymi.<br />

( Tymi samymi wyjsciami mozna kierowac przez SMS, za pomoca<br />

( przyciskow F1/F2 i za pomoco przyciskow dzwonkowych. Stan wyjsc<br />

( mozna obserwowac na wyswietlaczu i na cyfrowych wyjsciach. Przez<br />

( menu uzytkownika jest mozliwosc zal/wyl hasla.<br />

: ---HeatCtr--- ;<br />

( ====================================================================<br />

( Definicja Slow (Rowniez dla SMS)<br />

( ====================================================================<br />

: Boiler? 1 RO? ;<br />

: Boiler-ON TRUE 1 RO! ;<br />

: Boiler-OFF FALSE 1 RO! ;<br />

: Boiler-INV 1 RO? NOT 1 RO! ;<br />

: Ogrzewanie? 2 RO? ;<br />

: Ogrzewanie-ON TRUE 2 RO! ;<br />

: Ogrzewanie-OFF FALSE 2 RO! ;<br />

: Ogrzewanie-INV 2 RO? NOT 2 RO! ;<br />

: Wszystko-ON Boiler-ON Ogrzewanie-ON ;<br />

: Wszystko-OFF Boiler-OFF Ogrzewanie-OFF ;<br />

: Status ." Boiler " Boiler? IF ." ON " ELSE ." OFF " THEN NEWLINE<br />

." Ogrzewanie " Ogrzewanie? IF ." ON " ELSE ." OFF " THEN ;<br />

( ====================================================================<br />

( MENU GLOSOWE<br />

( ====================================================================<br />

( sprawdzenie bledow - obecnosci karty pamieci,<br />

( podejmowanie wezwania glosowego, i tym podobnie<br />

: Iffailthenhold NOT IF HOLD THEN ;<br />

( zakonczenie jadlospisu<br />

: Sayby MUTE ." by.wav " PLAY HOLD Iffailthenhold ;<br />

(flaga zapytania o haslo w menu glosowym<br />

0 CONSTANT Passwflag<br />

Notepade++PuTTY<br />

Microsoft Notepad<br />

‐ 57 ‐


Sterowniki <strong>prog</strong>ramowalne MAX Logic<br />

6.2 ZASADY TWORZENIA APLIKACJI<br />

Poniższy przykład jest praktycznym przedstawieniem budowy aplikacji dla sterownika H04 w oparciu o poznany już zasób<br />

słów języka <strong>ForthLogic</strong>. Pokazuje jak tworzyć obszerny <strong>prog</strong>ram budując go z poszczególnych mniejszych bloków<br />

<strong>prog</strong>ramowych będących rozwiązaniem części zadania.<br />

W opisach budowanej aplikacji dla wskazania pojedynczych słów lub całych zagadnień, o których mowa będą podawane w<br />

nawiasach prostokątnych [ ] numery wierszy, w których się znajdują.<br />

1. Początek aplikacji<br />

Dla lepszej przejrzystości <strong>prog</strong>ramu można dodawać komentarze i opisy poszczególnych fragmentów <strong>prog</strong>ramu. Służą do<br />

tego znaki „(” i „)”. Tekst pomiędzy nawiasami będzie interpretowany przez forth‐system jako komentarz i nie zostanie<br />

zwrócony jako nieznane słowo. Wszystkie słowa standardowe są pisane dużymi literami, dlatego dla odróżnienia warto<br />

definiowane słowa pisać małymi literami .<br />

1 ( MÓJ PIERWSZY PROGRAM<br />

2 ( Nazwa projektu: MAX<br />

3 ( data otwarcia projektu: 2010.09.17<br />

4 ( Wersja: v1.0<br />

5<br />

6 ( FORGET <strong>prog</strong>ram<br />

7 : <strong>prog</strong>ram ." MAX v1.0 2010.09.17 " ;<br />

Tworzymy nagłówek <strong>prog</strong>ramu, w którym możemy zawrzeć wszelkie informacje na temat budowanej aplikacji, np. nazwa<br />

aplikacji, kolejny numer wersji i data, kto jest twórcą, dla kogo jest tworzona i itp. [1‐4]. Dla przejrzystości <strong>prog</strong>ramu<br />

zostawiamy jedną linię wolną [5]. Następnie definiujemy słowo <strong>prog</strong>ram [7], które otwiera nam aplikację i praktycznie<br />

wyznacza początek definiowania nowych słów. Dodatkowo, przy wykonaniu go słowo to wyprowadza do bufora<br />

wejściowego tekst, który może kryć nazwę i wersję danej aplikacji. W przypadku, kiedy nie wiemy, jaka aplikacja jest w<br />

sterowniku, w łatwy sposób można to sprawdzić wykonując to słowo bezpośrednio w oknie terminalu lub nawet przez<br />

telefon komórkowy. Przed definicją słowa <strong>prog</strong>ram piszemy słowo standardowe FORGET, kasujące nasze pierwsze słowo<br />

[6]. Jednak przed pierwszym wgraniem naszego <strong>prog</strong>ramu należy tę linię zaznaczyć jako komentarz. Jeżeli tego nie<br />

zrobimy forth‐system natychmiast pokaże nam błąd w linii 7 jako nieznane słowo (UNKNOWD WORLD).<br />

2. Blok <strong>prog</strong>ramowy sterowania wyjściem<br />

Tworzymy funkcję cyklicznego załączania wyjścia DO1.<br />

9 ( sterowanie wyjściem DO1<br />

10 : on 1 1 DO! 0.5 3000 BEEP ;<br />

11 : off 0 1 DO! 0.5 1000 BEEP ;<br />

12 : alarm on 1.0 1 TIMER! off 3.0 2 TIMER! alarm ;<br />

13 : stop 0.0 1 TIMER! STOP 0.0 2 TIMER! STOP 0 1 DO! ;<br />

Piszemy komentarz opisujący nasz blok <strong>prog</strong>ramowy [9]. Definiujemy słowa on i off, które odpowiednio załączają i<br />

wyłączają wyjście DO1 z sygnalizacja dźwiękowa wykonania tych słów [10‐11]. Słowo alarm [12] definiuje na funkcje<br />

naprzemiennego załączania i wyłączania wyjścia DO1 w cyklu 1sek/2sek. Słowo stop [13] zatrzymuje nam rekursywne<br />

wykonanie słowa alarm i zeruje wyjście DO1.<br />

Po zdefiniowaniu pierwszych słów możemy już wgrać naszą aplikację. Podając i wykonując słowo alarm w oknie terminalu<br />

lub przez telefon komórkowy uruchomimy nieskończony cykl załączeń i wyłączeń wyjścia DO1. Cykl ten zatrzymujemy<br />

wykonując słowo stop.<br />

3. Menu funkcji dodatkowych<br />

W poprzednim punkcie nasze zdefiniowane słowa mogliśmy wywołać tylko ręcznie w trybie dialogowym. Dobudujemy<br />

teraz blok <strong>prog</strong>ramowy pozwalający na uruchomienie alarmu wykonując jeden z wierszy funkcji dodatkowych w menu<br />

konfiguracyjnym sterownika.<br />

‐ 58 ‐


Instrukcja <strong>prog</strong>ramowania w języku <strong>ForthLogic</strong> wersja <strong>P.1.2</strong><br />

14<br />

15 ( definicja funkcji w menu Funkcji dodatkowych<br />

16 : 1menu ." ALARM " 1 MENU alarm ;<br />

17 : 2menu ." STOP " 2 MENU stop ;<br />

18<br />

19 1menu 2menu<br />

20<br />

Jak poprzednio, komentarzem wyróżniamy nowy blok <strong>prog</strong>ramowy [15]. Definiujemy słowo 1menu [16], które tworzy<br />

wiersz pierwszy z napisem ALARM. Po wybraniu wiersza i naciśnięciu OK uruchomimy słowo alarm. Analogicznie słowo<br />

2menu [17]. Zdefiniowane słowa podajemy w nowej linii [19]. Całość koniecznie zamykamy ostatnią pustą linią [20].<br />

Musimy podać znak ENTER po słowach, aby je wykonać. Analogicznie jak w oknie terminalu. W przeciwnym razie przy<br />

wgrywaniu <strong>prog</strong>ramu do sterownika linia 19 nie zostałaby wprowadzona do forth‐sysyemu.<br />

Przed ponowieniem naszej zmodyfikowanej aplikacji zdejmiemy komentarz ze słowa FORGET [6].<br />

6 FORGET <strong>prog</strong>ram<br />

W ten sposób utworzyliśmy linię <strong>prog</strong>ramową, która zostanie wykonana na początku wgrywania aplikacji do sterownika.<br />

Jest to wykasowanie słowa <strong>prog</strong>ram zdefiniowanego podczas pierwszego wgrywania. Za słowem <strong>prog</strong>ram zostaną też<br />

wykasowane wszystkie słowa, które zostały po nim zdefiniowane. Praktycznie jest to wykasowanie całej poprzednio<br />

wgrywanej aplikacji. Nowe i zmodyfikowane słowa zostaną na nowo wgrane.<br />

Po wgraniu do sterownika zmodyfikowanej aplikacji słowa 1menu i 2menu zostaną automatycznie wykonane i funkcje<br />

alarm i stop będą natychmiast dostępne w menu funkcji dodatkowych.<br />

4. Automatyczne uruchamianie aplikacji<br />

W poprzednim punkcie stworzyliśmy aplikację, w której zdefiniowane słowa były automatycznie wykonane przy<br />

wgrywaniu. Niestety, po wyłączeniu zasilania sterownika nasza aplikacja nie startuje samoczynnie. Słowa zdefiniowane<br />

zachowują się w pamięci nieulotnej, ale nie są automatycznie wykonywane. Trzeba zbudować mechanizm, który pozwoli<br />

samoczynnie uruchamiać wgraną aplikację.<br />

19 ( słowo uruchamiające aplikację: run<br />

20 : run 1menu 2menu ;<br />

21 ." run " BOOT<br />

22 run<br />

23<br />

Zamiast bezpośredniego podania słów 1menu i 2menu definiujemy nowe słowo run. [20]. Słowo to wyznaczamy jako<br />

automatycznie „butowane” (ładowane) przy uruchomieniu sterownika [21]. Po restarcie sterownika zostanie wykonane<br />

słowo run, które wykona słowa 1menu i 2menu. Podanie słowa run na końcu aplikacji [22] spowoduje wykonanie go<br />

natychmiast po wgraniu aplikacji.<br />

Tak zdefiniowany blok <strong>prog</strong>ramowy praktycznie wyznacza koniec każdej aplikacji.<br />

5. Definiowanie funkcji przycisków sterownika<br />

Tworzymy blok <strong>prog</strong>ramowy, który oprócz menu funkcji dodatkowych pozwoli nasze funkcje alarm i stop wywoływać za<br />

pomocą zdefiniowanych przycisków na czole sterownika.<br />

( definicja funkcji przycisków F1 i F2<br />

: f1 F1 BUTTON alarm ;<br />

: f2 F2 BUTTON stop ;<br />

Definiujemy słowa f1 i f2 [20‐21]. Musimy je zdefiniować po definicjach słów alarm i stop, a przed słowem run.<br />

Aby były automatycznie uruchamiane przy załączeniu sterownika musimy je dołożyć do definicji słowa run [25].<br />

: run 1menu 2menu f1 f2 ;<br />

Nasza zmodyfikowana aplikacja wygląda teraz tak:<br />

‐ 59 ‐


Sterowniki <strong>prog</strong>ramowalne MAX Logic<br />

1 ( MÓJ PIERWSZY PROGRAM<br />

2 ( Nazwa projektu: MAX<br />

3 ( data otwarcia projektu: 2010.09.17<br />

4 ( Wersja: v1.0<br />

5<br />

6 FORGET <strong>prog</strong>ram<br />

7 : <strong>prog</strong>ram ." MAX v1.0 2010.09.17 " ;<br />

8<br />

9 ( sterowanie wyjściem DO1<br />

10 : on 1 1 DO! 0.5 3000 BEEP ;<br />

11 : off 0 1 DO! 0.5 1000 BEEP ;<br />

12 : alarm on 1.0 1 TIMER! off 3.0 2 TIMER! alarm ;<br />

13 : stop 0.0 1 TIMER! STOP 0.0 2 TIMER! STOP 0 1 DO! ;<br />

14<br />

15 ( definicja funkcji w menu Funkcji dodatkowych<br />

16 : 1menu ." ALARM " 1 MENU alarm ;<br />

17 : 2menu ." STOP " 2 MENU stop ;<br />

18<br />

19 ( definicja funkcji przycisków F1 i F2<br />

20 : f1 F1 BUTTON alarm ;<br />

21 : f2 F2 BUTTON stop ;<br />

22<br />

23 ( słowo uruchamiające aplikację: run<br />

24 : run 1menu 2menu f1 f2 ;<br />

25 ." run " BOOT<br />

26 run<br />

27<br />

6. Sygnały wejściowe ‐ zadziałanie wejść cyfrowych<br />

W większości przypadków potrzeba uruchomić daną funkcję <strong>prog</strong>ramową w chwili pojawienia się zewnętrznego sygnału<br />

sterującego na wejściu cyfrowym. Zdefiniujemy blok <strong>prog</strong>ramowy, który ustali odpowiednią reakcję sterownika na sygnały<br />

wejściowe.<br />

( Wej. DI1 i DI2<br />

0 5 FLAG!<br />

0 6 FLAG!<br />

: di5 5 DI? 5 FLAG? NOT AND IF alarm THEN 5 DI? 5 FLAG! 0.1 5 TIMER! di5 ;<br />

: di6 6 DI? NOT 6 FLAG? AND IF stop THEN 6 DI? 6 FLAG! 0.1 6 TIMER! di6 ;<br />

Słowo di5 definiuje nam reakcję na sygnał na wejściu cyfrowym DI5. Słowo alarm zostanie wykonane tylko wtedy, gdy<br />

pojawi się sygnał na tym wejściu (zbocze narastające). Zanik sygnału na wejściu DI5 nie powoduje niczego. Słowo di6<br />

definiuje nam reakcję na sygnał na wejściu cyfrowym DI6. Ale dla odróżnienia słowo stop zostanie wykonane dopiero po<br />

zaniku sygnału wejściowego (zbocze opadające). Pojawienie się sygnału wejściowego nie spowoduje wykonania słowa<br />

stop. Dla rozpatrywania obydwu warunków zastosowaliśmy operator warunkowy IF‐THEN. Wykonywanie każdego ze słów<br />

zamknięte jest w cyklu 0.1sek, co oznacza, że stan wejścia jest sprawdzany właśnie z taką częstotliwością.<br />

Słowa te należy startować wraz z aplikacją, więc trzeba dołożyć je do definicji słowa run.<br />

: run 1menu 2menu f1 f2 di5 di6 ;<br />

7. Zmiana parametrów <strong>prog</strong>ramu – okno parametryzacji.<br />

Dotychczas nasza funkcja alarm działa zawsze w stałym cyklu 1/2sek. Chcąc dowolnie zmieniać te czasy trzeba<br />

zmodyfikować słowo alarm oraz dopisać blok <strong>prog</strong>ramowy wykorzystujący okno parametryzacji do zadawania wartości<br />

czasów oraz kolejne punkty menu funkcji dodatkowych do ich wywoływania. Nasza nowa aplikacja wygląda tak:<br />

1 ( MÓJ PIERWSZY PROGRAM<br />

2 ( Nazwa projektu: MAX<br />

3 ( data otwarcia projektu: 2010.09.17<br />

4 ( Wersja: v1.0<br />

5<br />

‐ 60 ‐


Instrukcja <strong>prog</strong>ramowania w języku <strong>ForthLogic</strong> wersja <strong>P.1.2</strong><br />

6 FORGET <strong>prog</strong>ram<br />

7 : <strong>prog</strong>ram ." MAX v1.0 2010.09.17 " ;<br />

8<br />

9 ( definicja stałych t1 i t2<br />

10 1.0 FCONSTANT t1<br />

11 3.0 FCONSTANT t2<br />

12 : def_t1 TOF t1 ;<br />

13 : def_t2 TOF t2 ;<br />

14 : czas_t1 ." t1 [sek] " t1 GET def_t1 STOP ;<br />

15 : czas_t2 ." t2 [sek] " t2 GET def_t2 STOP ;<br />

16<br />

17 ( sterowanie wyjściem DO1<br />

18 : on 1 1 DO! 0.5 3000 BEEP ;<br />

19 : off 0 1 DO! 0.5 1000 BEEP ;<br />

20 : alarm on t1 1 TIMER! off t2 2 TIMER! alarm ;<br />

21 : stop 0.0 1 TIMER! STOP 0.0 2 TIMER! STOP 0 1 DO! ;<br />

22<br />

23 ( definicja funkcji w menu Funkcji dodatkowych<br />

24 : 1menu ." ALARM " 1 MENU alarm ;<br />

25 : 2menu ." STOP " 2 MENU stop ;<br />

26 : 3menu ." Czas t1> " 3 MENU czas_t1 ;<br />

27 : 4menu ." Czas t2> " 4 MENU czas_t2 ;<br />

28<br />

29 ( definicja funkcji przycisków F1 i F2<br />

30 : f1 F1 BUTTON alarm ;<br />

31 : f2 F2 BUTTON stop ;<br />

32<br />

33 ( Wej. DI1 i DI2<br />

34 0 5 FLAG!<br />

35 0 6 FLAG!<br />

36 : di5 5 DI? 5 FLAG? NOT AND IF alarm THEN 5 DI? 5 FLAG! 0.1 5 TIMER! di5 ;<br />

37 : di6 6 DI? NOT 6 FLAG? AND IF stop THEN 6 DI? 6 FLAG! 0.1 6 TIMER! di6 ;<br />

38<br />

39 ( słowo uruchamiające aplikację: run<br />

40 : run 1menu 2menu 3menu 4menu f1 f2 di5 di6 ;<br />

41 ." run " BOOT<br />

42 run<br />

43<br />

Modyfikujemy słowo alarm [20]. Zamiast czasów dla timerów wstawiamy odpowiednio stałe t1 i t2 (1.0‐>t1; 3.0‐>t2).<br />

Teraz możemy zdefiniować słowo czas_t1 [14], które otwiera okno parametryzacji dla podania nowej wartości czasu. Po<br />

wstawieniu nowej wartości i zatwierdzeniu jej OK zostanie wykonane słowo def_t1, które przedefiniowuje nam wartość<br />

stałej t1. Definicje te muszą być poprzedzone definicją stałej t1, jako wartości początkowej [12]. Analogicznie dla czasu t2.<br />

Na koniec definiujemy słowa 3menu i 4menu [26‐27], które w kolejnych wierszach funkcji dodatkowych pozwalają<br />

wywołać okna parametryzacji czas_t1 i czas_t2. Słowa 3menu i 4menu wywołujemy w słowie run [40].<br />

8. Powiadomienie SMS<br />

Modyfikujemy nasz <strong>prog</strong>ram tak, aby przy zachodzącym warunku zostało wysłane powiadomienie SMS na telefon<br />

użytkownika. Naszym warunkiem będzie 10 cykl alarmu. To znaczy, że słowo alarm będzie mogło być wywołane nie więcej<br />

niż 10 razy i wtedy będzie automatycznie zatrzymane i zostanie wysłany SMS z treścią, jaką ustawimy za pomocą okna<br />

parametryzacji wywoływanego w menu funkcji dodatkowych. Budujemy blok <strong>prog</strong>ramowy komunikat SMS [27]. Nasz<br />

<strong>prog</strong>ram wygląda następująco:<br />

1 ( MÓJ PIERWSZY PROGRAM<br />

2 ( Nazwa projektu: MAX<br />

3 ( data otwarcia projektu: 2010.09.17<br />

4 ( Wersja: v1.0<br />

5<br />

6 FORGET <strong>prog</strong>ram<br />

7 : <strong>prog</strong>ram ." MAX v1.0 2010.09.17 " ;<br />

8<br />

9 ( definicja stałych t1 i t2<br />

10 1.0 FCONSTANT t1<br />

‐ 61 ‐


Sterowniki <strong>prog</strong>ramowalne MAX Logic<br />

11 3.0 FCONSTANT t2<br />

12 : def_t1 TOF t1 ;<br />

13 : def_t2 TOF t2 ;<br />

14 : czas_t1 ." t1 [sek] " t1 GET def_t1 STOP ;<br />

15 : czas_t2 ." t2 [sek] " t2 GET def_t2 STOP ;<br />

16<br />

17 ( licznik cykli ALARM<br />

18 0 1 VAR!<br />

19 : plus 1 VAR? 1 + 1 VAR! ;<br />

20<br />

21 ( sterowanie wyjściem DO1<br />

22 : on 1 1 DO! 0.5 3000 BEEP ;<br />

23 : off 0 1 DO! 0.5 1000 BEEP ;<br />

24 : alarm plus on t1 1 TIMER! off t2 2 TIMER! alarm ;<br />

25 : stop 0.0 1 TIMER! STOP 0.0 2 TIMER! STOP 0 1 DO! 0 1 VAR! ;<br />

26<br />

27 ( komunikat SMS<br />

28 ." KOMUNIKAT " 1 STRING!<br />

29 ." +48123456789 " 1 USERPHONE<br />

30 : string1 ." TEKST " 1 GETS STOP STOP ;<br />

31 : sms 1 USER 1 STRING? SMS DROP ;<br />

32 : limit 1 VAR? 10 = IF sms stop THEN 0.1 4 TIMER! limit ;<br />

33<br />

34 ( definicja funkcji w menu Funkcji dodatkowych<br />

35 : 1menu ." ALARM " 1 MENU alarm ;<br />

36 : 2menu ." STOP " 2 MENU stop ;<br />

37 : 3menu ." Czas t1> " 3 MENU czas_t1 ;<br />

38 : 4menu ." Czas t2> " 4 MENU czas_t2 ;<br />

39 : 5menu ." TEKST SMS " 5 MENU string1 ;<br />

40<br />

41 ( definicja funkcji przycisków F1 i F2<br />

42 : f1 F1 BUTTON alarm ;<br />

43 : f2 F2 BUTTON stop ;<br />

44<br />

45 ( Wej. DI1 i DI2<br />

46 0 5 FLAG!<br />

47 0 6 FLAG!<br />

48 : di5 5 DI? 5 FLAG? NOT AND IF alarm THEN 5 DI? 5 FLAG! 0.1 5 TIMER! di5 ;<br />

49 : di6 6 DI? NOT 6 FLAG? AND IF stop THEN 6 DI? 6 FLAG! 0.1 6 TIMER! di6 ;<br />

50<br />

51 ( słowo uruchamiające aplikację: run<br />

52 : run 1menu 2menu 3menu 4menu 5menu f1 f2 di5 di6 limit ;<br />

53 ." run " BOOT<br />

54 run<br />

55<br />

Warunek, przy spełnieniu którego zostanie wysłane powiadomienie SMS definiujemy w słowie limit [32]. W słowie tym<br />

odczytujemy wartość zmiennej 1 i porównujemy ja do liczby 10. Za pomocą operatora warunkowego rozpatrujemy<br />

warunek i jeżeli wynik porównania jest prawdą (10=10) zostanie wykonane słowo stop i sms [31]. Słowo sms wysyła<br />

powiadomienie zapisane pod 1 zmienną wierszową (STRING) na numer telefonu zapisany pod 1 użytkownikiem (USER).<br />

Wartości początkowe tych parametrów musimy wstępnie zdefiniować [28‐29]. Numer telefonu użytkownika nr 1 możemy<br />

też zdefiniować lub przedefiniować w menu konfiguracyjnym (MENU ‐> Użytkownicy ‐> TELEFONY ‐> TEL 1>). Do zmiany<br />

domyślnego tekstu powiadomienia za pomocą okna parametryzacji służy zdefiniowane słowo string1 [30], które<br />

wywoływane jest w poprzez słowo menu5 [39] jako kolejna funkcja menu funkcji dodatkowych. Jeszcze tylko musimy<br />

stworzyć funkcje, która dokonuje inkrementacji zmiennej 1 wraz z kolejnymi cyklami słowa alarm. Tworzymy słowo plus<br />

[19], które będzie wykonywane w słowie alarm. W słowie run musimy wywołać słowa 5menu i limit.<br />

9. Okno drukowania i formatowanie tekstu.<br />

Stworzymy blok <strong>prog</strong>ramowy, który jest przykładem wyprowadzania danych na ekran sterownika oraz swobodnego<br />

formatowania tekstu. Całość formatowanego tekstu zamyka się w jednym słowie print. Będzie ono cyklicznie wywoływane<br />

przez słowo print_cykl. Odświeżanie ekranu będzie, co 1sek.<br />

‐ 62 ‐


Instrukcja <strong>prog</strong>ramowania w języku <strong>ForthLogic</strong> wersja <strong>P.1.2</strong><br />

: print<br />

." Moja pierwsza " NEWLINE ." aplikacja " GREEN 0 0 PRINT<br />

." Stan: " BLACK 0 2 PRINT<br />

1 FLAG? IF ." ALARM " ELSE ." STOP " THEN RED 6 2 PRINT<br />

." Temp: " BLACK 0 3 PRINT NOAUTOSPACE 4 AI? F.<br />

." stC " BLACK 6 3 PRINT AUTOSPACE<br />

." Cykl: " BLACK 0 4 PRINT 1 VAR? . RED 6 4 PRINT ;<br />

: print_cykl print 1.0 3 TIMER! print_cykl ;<br />

: run CLEAR 1 FPREC! 1menu 2menu 3menu 4menu 5menu f1 f2 di5 di6 limit print_cykl ;<br />

W pierwszym i drugim wierszu będzie drukowany napis „Moja pierwsza aplikacja”. Tekst zawiera więcej niż 15 znaków i<br />

ma wyznaczony tylko jeden punkt startowy drukowania (0 0), ale poprzez „złamanie” go słowem NEWLINE rozłożymy go<br />

na dwie linie. W trzecim wierszu drukujemy słowo „Stan:” oraz w zależności od tego, czy alarm działa czy nie będzie<br />

drukowane słowo „ALARM” lub „STOP”. Zależy to od zmiennej bitowej 1 (1 FLAG!). Jeżeli jest 1, będzie drukowane<br />

„ALARM”, jeżeli 0 to „STOP”. Teraz trzeba jeszcze definiować odpowiednio te flagę w odpowiednim miejscu. W słowie<br />

alarm definiujemy flagę jako 1, a w słowie stop jako 0. Dodatkowo tekst w jednej linii jest drukowany w dwóch kolorach:<br />

czarnym i czerwonym.<br />

: alarm 1 1 FLAG! on plus t1 1 TIMER! off t2 2 TIMER! alarm ;<br />

25 : stop 0.0 1 TIMER! STOP 0.0 2 TIMER! STOP 0 1 DO! 0 1 VAR! 0 1 FLAG! ;<br />

W czwartej linii drukujemy zmienną wartość 4 wejścia analogowego. Dla tego przykładu wejście to możemy ustawić jako<br />

prądowe. Ustawiając precyzje drukowania 1, czyli z jedną liczbą po przecinku, otrzymamy wartość z zakresu 0,0÷21,3. Nie<br />

wymnażamy tej wartości przez określony współczynnik, tak jak to się robi dla uzyskania wartości rzeczywistej z zakresu<br />

czujnika pomiarowego ACP. Z początku wiersza drukujemy słowo „Temp:” z 8 spacjami. Służy to „przykryciu” końcówki<br />

tekstu, który może pozostać na końcu linii z poprzedniego cyklu drukowania, ponieważ naprzemiennie mogą być<br />

drukowane liczby jedno‐ i dwucyfrowe‐ części całkowitej. W celu łącznego drukowania wartości liczbowej z jednostką (°C)<br />

przed zestawieniem tekstu w buforze wejściowym posłużyliśmy się słowem NOAUTOSPACE. Po wydrukowaniu<br />

powracamy do automatycznego wstawiania spacji za pomocą słowa AUTOSPACE.<br />

W piątym wierszu przywołując wartość zmiennej 1 (1 VAR?) będziemy drukować liczbę wykonanych cykli słowa alarm.<br />

W słowie run definiujemy precyzje drukowania liczb jako 1 oraz dokładamy słowo CLEAR (czyszczące ekran przy restarcie<br />

sterownika) i print_cykl (uruchamiające w cyklu nasza funkcję drukowania print).<br />

10. Status pracy – zapytanie i odpowiedź.<br />

Umiemy już formatować tekst i drukować na ekranie. W taki sam sposób formatujemy tekst dla słów SMS oraz LOG.<br />

Możemy tez stworzyć słowo, które tylko wprowadza tekst do bufora wejściowego i nic więcej. Za pomocą takiego słowa<br />

możemy otrzymywać informacje o systemie, stanie wejść/wyjść lub parametrach współpracujących ze sterownikiem<br />

urządzeń.<br />

Definiujemy słowo:<br />

: status<br />

." Stan: " 1 FLAG? IF ." ALARM " ELSE ." STOP " THEN NEWLINE<br />

." Temp: " 4 AI? F. ." stC " ;<br />

To słowo tworzy treść w buforze i nic więcej. A wiemy, że bufor wyjściowy jest drukowany na terminalu lub na<br />

wyświetlaczu telefonu przy wykonaniu słowa, które taki bufor tworzy. Więc wystarczy teraz podać słowo status w treści<br />

SMSa wejściowego, a tekst zostanie dopisany do automatycznej odpowiedzi. Dlatego nie musimy pisać słowa NAK, a<br />

otrzymamy tylko jednego SMSa na numer, z którego wysłano zapytanie stan. Nie musimy podawać żadnych numerów<br />

telefonów. Tekst będzie w tym przypadku taki:<br />

Stan: ALARM<br />

Temp: 18.7 stC<br />

Nasza aplikacja przyjmuje ostateczny kształt:<br />

‐ 63 ‐


Sterowniki <strong>prog</strong>ramowalne MAX Logic<br />

1 ( MÓJ PIERWSZY PROGRAM<br />

2 ( Nazwa projektu: MAX<br />

3 ( data otwarcia projektu: 2010.09.17<br />

4 ( Wersja: v1.0<br />

5<br />

6 FORGET <strong>prog</strong>ram<br />

7 : <strong>prog</strong>ram ." MAX v1.0 2010.09.17 " ;<br />

8<br />

9 ( definicja stałych t1 i t2<br />

10 1.0 FCONSTANT t1<br />

11 3.0 FCONSTANT t2<br />

12 : def_t1 TOF t1 ;<br />

13 : def_t2 TOF t2 ;<br />

14 : czas_t1 ." t1 [sek] " t1 GET def_t1 STOP ;<br />

15 : czas_t2 ." t2 [sek] " t2 GET def_t2 STOP ;<br />

16<br />

17 ( licznik cykli ALARM<br />

18 0 1 VAR!<br />

19 : plus 1 VAR? 1 + 1 VAR! ;<br />

20<br />

21 ( sterowanie wyjściem DO1<br />

22 : on 1 1 DO! 0.5 3000 BEEP ;<br />

23 : off 0 1 DO! 0.5 1000 BEEP ;<br />

24 : alarm 1 1 FLAG! plus on t1 1 TIMER! off t2 2 TIMER! alarm ;<br />

25 : stop 0.0 1 TIMER! STOP 0.0 2 TIMER! STOP 0 1 DO! 0 1 VAR! 0 1 FLAG! ;<br />

26<br />

27 ( komunikat SMS<br />

28 ." KOMUNIKAT " 1 STRING!<br />

29 ." +48123456789 " 1 USERPHONE<br />

30 : string1 ." TEKST " 1 GETS STOP STOP ;<br />

31 : sms 1 USER 1 STRING? SMS DROP ;<br />

32 : limit 1 VAR? 10 = IF sms stop THEN 0.1 4 TIMER! limit ;<br />

33<br />

34 ( definicja funkcji w menu Funkcji dodatkowych<br />

35 : 1menu ." ALARM " 1 MENU alarm ;<br />

36 : 2menu ." STOP " 2 MENU stop ;<br />

37 : 3menu ." Czas t1> " 3 MENU czas_t1 ;<br />

38 : 4menu ." Czas t2> " 4 MENU czas_t2 ;<br />

39 : 5menu ." TEKST SMS " 5 MENU string1 ;<br />

40<br />

41 ( definicja funkcji przycisków F1 i F2<br />

42 : f1 F1 BUTTON alarm ;<br />

43 : f2 F2 BUTTON stop ;<br />

44<br />

45 ( Wej. DI1 i DI2<br />

46 0 5 FLAG!<br />

47 0 6 FLAG!<br />

48 : di5 5 DI? 5 FLAG? NOT AND IF alarm THEN 5 DI? 5 FLAG! 0.1 5 TIMER! di5 ;<br />

49 : di6 6 DI? NOT 6 FLAG? AND IF stop THEN 6 DI? 6 FLAG! 0.1 6 TIMER! di6 ;<br />

50<br />

51 : print<br />

52 ." Moja pierwsza " NEWLINE ." aplikacja " GREEN 0 0 PRINT<br />

53 ." Stan: " BLACK 0 2 PRINT<br />

54 1 FLAG? IF ." ALARM " ELSE ." STOP " THEN RED 6 2 PRINT<br />

55 ." Temp: " BLACK 0 3 PRINT NOAUTOSPACE 4 AI? F.<br />

56 ." stC " BLACK 6 3 PRINT AUTOSPACE<br />

57 ." Cykl: " BLACK 0 4 PRINT 1 VAR? . RED 6 4 PRINT ;<br />

58 : print_cykl print 1.0 3 TIMER! print_cykl ;<br />

59<br />

60 ( SMS: status pracy<br />

61 : status<br />

62 ." Stan: " 1 FLAG? IF ." ALARM " ELSE ." STOP " THEN NEWLINE<br />

63 ." Temp: " 4 AI? F. ." stC " ;<br />

64<br />

65 ( słowo uruchamiające aplikację: run<br />

66 : run CLEAR 1 FPREC! 1menu 2menu 3menu 4menu 5menu f1 f2 di5 di6 limit print_cykl ;<br />

67 ." run " BOOT<br />

‐ 64 ‐


Instrukcja <strong>prog</strong>ramowania w języku <strong>ForthLogic</strong> wersja <strong>P.1.2</strong><br />

68 run<br />

69<br />

7. TWORZENIE PLIKÓW DZWIĘKOWYCH<br />

Do realizacji głosowych powiadomień i menu głosowego z wykorzystaniem słowa PLAY niezbędny jest zestaw plików<br />

dźwiękowych. Pliki takie można stworzyć samodzielnie za pomocą dowolnego <strong>prog</strong>ramu syntezujacego mowę ludzką lub<br />

za pomocą <strong>prog</strong>ramu rejestrującego dźwięk (np. przy pomocy narzędzia systemowego Microsoft®Windows Rejestrator<br />

dźwięku [START Programy Akcesoria]). Pliki muszą być z rozszerzeniem .wav o atrybutach: format PCM, tryb MONO<br />

7kBit/sek, próbkowanie 8000Hz 8bitów. W przypadku niemożności stworzenia pliku o takich parametrach można posłużyć<br />

się załączonym na płycie CD <strong>prog</strong>ramem Free Audio Converter (lub innym dowolnym) do konwersji stworzonego pliku na<br />

odpowiedni format i odpowiednie atrybuty.<br />

Pliki o nazwach zgodnych z podanymi w aplikacji muszą znajdować się w folderze głównym karty SD na stałe włożonej do<br />

portu sterownika.<br />

8. TABELA ZASOBÓW PROGRAMOWYCH<br />

Typ parametru Słowo Opis<br />

Liczba realizacji dla typu<br />

H01 H02 H03 H04<br />

FIRMWARE VERSION Aktualna wersja o<strong>prog</strong>ramowania 1.16(D) 1.15(GII) 1.15(D) 4.50<br />

CONSTANT Stałe całkowite bo bo bo bo<br />

FCONSTANT Stałe matematyczne bo bo bo bo<br />

D_MAX VAR! Zmienne całkowite 64 64 64 128<br />

F_MAX FVAR! Zmienne matematyczne 32 32 32 64<br />

B_MAX FLAG! Zmienne bitowe [FLAG] 128 128 128 128<br />

S_MAX STRING! Zmienne wierszowe ‐ 4 4 8<br />

T_MAX TIMER! Timery 32 32 32 64<br />

DI_MAX DI? Wejścia cyfrowe 8 8 8 8<br />

AI_MAX AI? Wejścia analogowe 4 4 4 4<br />

DO_MAX DO! Wyjścia cyfrowe 4 4 4 4<br />

RO_MAX RO! Wyjścia przekaźnikowe 3 3 3 3<br />

MENU_MAX MENU Punkty bloku menu Funkcji Dodatkowych ‐ ‐ 4 8<br />

ROW_MAX PRINT Wiersze na wyświetlaczu LCD ‐ ‐ 7 6<br />

COL_MAX PRINT Kolumny na wyświetlaczu LCD ‐ ‐ 15 15<br />

PHONE_MAX USERPHONE Numery telefonów użytkowników ‐ 40 ‐ 40<br />

OUTBUF_MAX .” … “ Długość tekstu bufora wyjściowego 120 120 180 180<br />

bo – bez ogran<br />

9. KOMUNIKATY BŁĘDÓW<br />

W terminalowym i zdalnym trybie pracy fort‐systemu, wszystkie błędy, które powstają podczas pracy dialogowej,<br />

drukowane są w nawiasach pod postacią tekstu w języku angielskim. Dla typów sterowników z wyświetlaczem podczas<br />

wczytywania aplikacji i interpretacji pliku, w razie powstania błędu, na wyświetlaczu będzie drukowane zawiadomienie z<br />

kodem błędu, a nie sam tekst.<br />

Znane błędy fort‐systemowi , ich kody i wyjaśnienia:<br />

‐ 65 ‐


Sterowniki <strong>prog</strong>ramowalne MAX Logic<br />

Kod Tekst błędu Objaśnienie<br />

1 UNKNOWN WORD Nieznane słowo dla interpretatora forth‐systemu<br />

2 ILLEGAL USAGE Zastosowanie słowa w niewłaściwym kontekście<br />

3 ILLEGAL PARAMETER Niepoprawny parametr słowa<br />

4 INSUFFICIENT PARAMETERS Niedostateczna ilość parametrów<br />

5 DATA STACK EMPTY Stos danych pusty<br />

6 DATA STACK FULL Przepełnienie stosu danych<br />

7 RETURN STACK EMPTY Stos powrotów pusty<br />

8 RETURN STACK FULL Przepełnienie stosu powrotów<br />

9 OUT OF MEMORY Brak pamięci Forth<br />

10 MATHEMATIC STACK EMPTY Stos matematyczny pusty<br />

11 MATHEMATIC STACK FULL Przepełnienie stosu matematycznego<br />

12 SD CARD NOT FOUND Brak karta pamięci SD/MMC<br />

13 FILE NOT FOUND Nie znaleziono pliku<br />

14 INPUT BUFFER OVERFLOW Przepełnienie bufora wejściowego<br />

15 FILE SYSTEM BUSY System plikowy zajęty (na przykład: jest odtwarzany inny plik)<br />

16 FILE EMPTY Pusty plik<br />

17 WRONG CONSTRUCTION Nieprawidłowa (niepełna) konstrukcja (IF‐ELSE‐THEN)<br />

18 FILE TRANSFER ERROR Błąd podczas przyjmowania pliku po protokole Xmodem<br />

19 FILE TRANSFER TIMOUT Zainicjowane przyjęcie pliku po protokole Xmodem nie rozpoczęło<br />

20 COMPILE MODE NOT ALLOWED Zakaz definiowania słów języka <strong>ForthLogic</strong> (dotyczy tekstów SMS)<br />

10. SPIS SŁÓW JĘZYKA <strong>ForthLogic</strong><br />

Oznaczenia typów słów zastosowanych w tabeli:<br />

ST‐ słowo standardowe; P ‐ słowo pomocnicze; SS ‐ stała systemowa; RS ‐ rozkaz systemowy.<br />

‐ słowo wchodzące w skład słownika forth‐systemu danego typu sterownika;<br />

‐ słowo nie wchodzące lub nie stosowane w składzie słownika forth‐systemu danego typu sterownika.<br />

SŁOWO TYP KATEGORIA OPIS 01 02 03 04<br />

RESTART ST system ponowne uruchomienie systemu <br />

BOOT ST system definiuje i wykonuje główne słowo uruchamiające aplikację <br />

BOOT. ST system drukuje w buforze wyjściowym główne słowo uruchamiające aplikację <br />

LOGON ST log uruchamia i konfiguruje proces rejestracji <br />

LOGRUN ST log uruchamia proces rejestracji w ustawionej wcześniej konfiguracji <br />

EVENTS_MODE SS log stała systemowa dla słowa LOGON: tryb zdarzenia <br />

INTERVAL_MODE SS log stała systemowa dla słowa LOGON: tryb interwałów <br />

TO_SD SS log stała systemowa dla słowa LOGON: zapis danych rejestracji na karcie SD <br />

TO_FLASH SS log stała systemowa dla słowa LOGON: zapis danych rejestracji w pamięci wew. <br />

ALL_DATA SS log stała systemowa dla słowa LOGON: rejestracja daty, czasu, napięcia zasilania, stanu wejść i wyjść <br />

INPUTS SS log stała systemowa dla słowa LOGON: rejestracja daty, czasu i stanu wejść <br />

OUTPUTS SS log stała systemowa dla słowa LOGON: rejestracja daty, czasu i stanu wyjść <br />

LOGOFF ST log zatrzymuje proces rejestracji <br />

LOG ST log zapisuje wartość lub tekst wyjściowy bufor do systemowego rejestratora <br />

LOG? ST log kładzie na stos danych znaczenie logiczne PRAWDA lub FAŁSZ jako stan procesu rejestracji <br />

LOGTITLEON ST log Włączenie automatycznego dostawiania nagłówka rejestracji <br />

LOGTITLEOFF ST log Wyłączenie automatycznego dostawiania nagłówka rejestracji <br />

‐ 66 ‐


Instrukcja <strong>prog</strong>ramowania w języku <strong>ForthLogic</strong> wersja <strong>P.1.2</strong><br />

FREELOG? ST log kładzie na stos danych liczbę wyrażającą w bajtach ilość wolnego miejsca w pamięci wewnętrznej <br />

LOG>SD ST log przenosi dane rejestracje z pamięci wewnętrznej na kartę pamięci SD <br />

SHOW STATUS RS system wywołuje w oknie terminalu pasek statusu wejść/wyjść <br />

HIDE STATUS RS system ukrywa pasek statusu wejść/wyjść wywołany w oknie terminalu <br />

RO? ST wy/we kładzie na stos danych liczbę jako stan wyjścia przekaźnikowego <br />

RO! ST wy/we ustanawia stan wyjścia przekaźnikowego <br />

DO? ST wy/we kładzie na stos danych liczbę jako stan wyjścia cyfrowego <br />

DO! ST wy/we ustanawia stan wyjścia cyfrowego <br />

DI? ST wy/we kładzie na stos danych liczbę jako stan wejścia cyfrowego <br />

AI? ST wy/we kładzie na stos matematyczny liczbę jako stan wejścia analogowego <br />

AIS? ST wy/we kładzie na stos matematyczny liczbę jako przeskalowaną w menu konfiguracyjnym wartość wejścia analogowego <br />

DIAI ST wy/we ustanawia typ wejścia analogowo‐cyfrowego <br />

SET_TO_V SS wy/we stała systemowa dla słowa DIAI: ustanawia typ wejścia jako analogowe napięciowe <br />

SET_TO_I SS wy/we stała systemowa dla słowa DIAI: ustanawia typ wejścia jako analogowe prądowe <br />

SET_TO_D SS wy/we stała systemowa dla słowa DIAI: ustanawia typ wejścia jako cyfrowe <br />

DIAIPARAM ST wy/we zwraca wartość określającą ustawienia typu wejścia (D/V/A) <br />

POW? ST wy/we kładzie na stos matematyczny wartość napięcie zasilania głównego <br />

BAT? ST wy/we kładzie na stos matematyczny wartość napięcie akumulatora <br />

TIME? ST czas kładzie na stos aktualną wartość sekund, minut, godzin <br />

DATE? ST czas kładzie na stos aktualną wartość roku, miesiąca i dnia <br />

WDAY? ST czas kładzie na stos aktualne znaczenie dnia tygodnia <br />

UTC? ST czas kładzie na stos danych stan zegara systemowego pod postacią globalnej liczby sekund (w formacie UNIX) <br />

WATCH! ST czas ustawia aktualny czas zegara systemowego <br />

>UTC ST czas przekształca czas formatu UTC do formatu UNIX <br />

>TIME ST czas przekształca czas formatu UNIX na wartość sekund, minut, godzin <br />

>DATE ST czas przekształca czas formatu UNIX na wartość roku, miesiąca, dni <br />

>WDAY ST czas przekształca czas formatu UNIX na wartość dnia tygodnia <br />

ISNOW ST czas porównuje parami daty i czasy <br />

SETWATCH ST czas ustanawia parametry zegara systemowego <br />

SUMMER_ON SS czas stała systemowa dla słowa SETWATCH: załącza funkcję automatycznej zmiany czasu letni/zimowy <br />

SUMMER_OFF SS czas stała systemowa dla słowa SETWATCH: wyłącza funkcję automatycznej zmiany czasu letni/zimowy <br />

MODBUSSTART ST modbus Przygotowanie i inicjalizacja połączenia komunikacyjnego w sieci MODBUS <br />

MODBUSSTOP ST modbus Zatrzymanie cyklicznego połączenia komunikacyjnego w sieci MODBUS <br />

MODBUSCALLBACK ST modbus Wywołuje podane słowo po zakończeniu komunikacji pojedynczego wywołania <br />

MODBUSSTATUS? ST modbus Kontrola stanu procesu komunikacyjnego w sieci MODBUS <br />

MODBUSTIMEOUT! ST modbus Ustala czas oczekiwania urządzenia MASTER na odpowiedź ze strony urządzenia SLAVE w sieci MODBUS <br />

CYCLIC_ACCESS SS modbus<br />

SINGLE_ACCESS SS modbus<br />

systemowa stała dla słowa MODBUSSTART określająca że dane połączenie w sieci MODBUS będzie cyklicznie<br />

powtarzane<br />

systemowa stała dla słowa MODBUSSTART określająca że dane połączenie w sieci MODBUS będzie wykonane tylko<br />

jeden raz<br />

<br />

<br />

READ_COILS SS modbus systemowa stała dla słowa MODBUSSTART: odczyt stanów jednego lub wielu kolejnych wyjść binarnych <br />

READ_INPUTS SS modbus systemowa stała dla słowa MODBUSSTART: odczyt wartości jednego lub wielu kolejnych wejść binarnych <br />

READ_HOLDREGS SS modbus systemowa stała dla słowa MODBUSSTART: odczyt wartości jednego lub wielu kolejnych rejestrów 16‐bitowych <br />

READ_INPUTREGS SS modbus systemowa stała dla słowa MODBUSSTART: odczyt wartości jednego lub wielu kolejnych rejestrów 16‐bitowych <br />

WRITE_COIL SS modbus systemowa stała dla słowa MODBUSSTART: ustawienie wartości pojedynczego wyjścia binarnego <br />

WRITE_REG SS modbus systemowa stała dla słowa MODBUSSTART: ustawienie wartości pojedynczego wyjścia binarnego <br />

WRITE_COILS SS modbus systemowa stała dla słowa MODBUSSTART: ustawienie wartości pojedynczego rejestru 16‐bitowego <br />

WRITE_REGS SS modbus systemowa stała dla słowa MODBUSSTART: ustawienie wartości wielu kolejnych rejestrów 16‐bitowych <br />

BEEP ST ST generuje sygnał dźwiękowy o określonej częstotliwości i długości <br />

CALIPOW ST we/wy kalibruje wartość napięcia zasilania głównego <br />

CALIBAT ST we/wy kalibruje wartość napięcia zasilania rezerwowego (akumulatora) lub napięcia ładowania <br />

CALI ST we/wy kalibruje wartość wejścia analogowego prądowego <br />

‐ 67 ‐


Sterowniki <strong>prog</strong>ramowalne MAX Logic<br />

CALV ST we/wy kalibruje wartość wejścia analogowego napięciowego <br />

GET ST ui tworzy okno parametryzacji do wprowadzania wartości liczbowych <br />

GETS ST ui tworzy okno parametryzacji do wprowadzania wartości tekstowych <br />

PRINT ST print drukuje zawartość bufora wyjściowego na wyświetlaczu <br />

CLEAR ST print „czyszczenie” wyświetlacza <br />

WHITE ST print kolor fontu: biały <br />

RED ST print kolor fontu: czerwienny <br />

ORANGE ST print kolor fontu: pomarańczowy <br />

YELLOW ST print kolor fontu: żółty <br />

GREEN ST print kolor fontu: zielony <br />

BLUE ST print kolor fontu: błękitny <br />

DEEPBLUE ST print kolor fontu: niebieski <br />

VIOLET ST print kolor fontu: fioletowy <br />

BLACK ST print kolor fontu: czarny <br />

INVERT ST print inwersja kolorów fontu i tłu <br />

MENU ST ui tworzy i uwidacznia punkt menu Funkcji dodatkowych <br />

HIDE ST ui ukrywa punkt menu Funkcji dodatkowych <br />

FOCUS ST ui podświetla wskazany punkt menu Funkcji dodatkowych <br />

INFO ST ui drukuje tekst pomocniczy w pasku stanu dla bloku Funkcji dodatkowych <br />

LASTMENU? ST ui kładzie na stos numer ostatniego wykonanego punktu menu Funkcji dodatkowych <br />

BUTTON ST ui definiuje funkcję klawiszy <br />

F1 SS ui stała systemowa dla słowa BUTTON: przycisk F1 (wartość 1) <br />

F2 SS ui stała systemowa dla słowa BUTTON: przycisk F2 (wartość 2) × <br />

UP SS ui stała systemowa dla słowa BUTTON: przycisk (wartość 3) <br />

DOWN SS ui stała systemowa dla słowa BUTTON: przycisk (wartość 4) <br />

LEFT SS ui stała systemowa dla słowa BUTTON: przycisk (wartość 5) <br />

RIGHT SS ui stała systemowa dla słowa BUTTON: przycisk (wartość 6) <br />

OK SS ui stała systemowa dla słowa BUTTON: przycisk OK (wartość 7) <br />

PLAY ST GSM voice odtworzenie pliku dźwiękowego z karty SD <br />

SAY ST GSM voice syntezuje i odtwarza głosowo wartości liczbowe podczas połączenia głosowego <br />

MUTE ST GSM voice zatrzymuje odtwarzanie powiadomienia głosowego i blokuje wykonanie słów PLAY i SAY <br />

DIAL ST GSM voice inicjuje połączenie głosowe <br />

ANSWER ST GSM voice podejmuje przychodzące połączenie głosowe <br />

CLIP ST GSM voice identyfikuje nr telefonu, z którego przychodzi połaczenie i wykonuje określone zadanie bez podjęcia tego wezwania <br />

HOLD ST GSM voice wstrzymuje każde połączenie głosowe <br />

HOOK? ST GSM voice określa status połączenia głosowego <br />

WAITKEY ST GSM DTMF ustala reakcję na pojedynczy sygnał DTMF <br />

WAITPW ST GSM DTMF ustala reakcję po wprowadzeniu hasła dostępu za pomocą sygnałów DTMF <br />

WAITSTR ST GSM DTMF ustala reakcję po wprowadzeniu wiersza cyfr za pomocą sygnałów DTMF <br />

TONE ST GSM DTMF generuje sygnał dzwiękowy DTMF <br />

NODTMFCONFIRM ST GSM DTMF wyłącza dźwiękowe potwierdzenie przyjęcia sygnału DTMF <br />

DTMFCONFIRM ST GSM DTMF Załącza dźwiękowe potwierdzenie przyjęcia sygnału DTMF <br />

SMS ST GSM SMS do wysyłania SMSów; z bufora wyjściowego sczytuje numer telefonu w formacie międzynarodowym oraz tekst SMSa <br />

USSD ST GSM SMS do realizacji zadań serwisowych operatorów sieci komórkowych <br />

IDx ST GSM SMS Do identyfikacji automatycznej odpowiedzi ns wchodzący SMS <br />

NAK P GSM SMS Blokada automatycznej odpowiedzi forth‐systemy w trybie terminalowym zdalnym <br />

USERPHONE ST GSM SMS zapisuje numer telefonu użytkownika jako specjalną zmienna wierszową <br />

CONTROL ST GSM ustanawia prawa dostępu do zdalnego sterowania <br />

REMOTE SS GSM stała systemowa dla słowa CONTROL: zdalne sterowanie załączone <br />

LOCAL SS GSM stała systemowa dla słowa CONTROL: zdalne sterowanie wyłączone <br />

‐ 68 ‐


Instrukcja <strong>prog</strong>ramowania w języku <strong>ForthLogic</strong> wersja <strong>P.1.2</strong><br />

FOR_ALL SS GSM stała systemowa dla słowa CONTROL: zdalne sterowanie z dowolnego numeru telefonu komórkowego <br />

FOR_LOYAL SS GSM stała systemowa dla słowa CONTROL: zdalne sterowanie z autoryzowanego numeru telefonu komórkowego <br />

PASSWORD ST system ustanawia hasło dostepu <br />

PROTECT_BY SS system stała systemowa dla słowa PASSWORD: załącza blokadę dostępu z jednoczesnym ustanowieniem hasła <br />

DISABLE SS system stała systemowa dla słowa PASSWORD: wyłącza blokadę dostępu <br />

PIN ST GSM wprowadza PIN aktywnej karty SIM <br />

USER ST GSM<br />

drukuje na terminalu i w wyjściowym buforze numeru telefonu użytkownika zapisany pod określonym numerem<br />

zmiennej<br />

<br />

LAST ST GSM ustala i wprowadza do bufora wyjściowego numeru telefonu, którego odbyło się ostatnie połączenie <br />

MIC ST audio uruchamia zewnętrzny mikrofon i wyjścia głośnikowego <br />

VOICE ST audio wyłączenie zewnętrzny mikrofon i wyjścia głośnikowego <br />

MICLEVEL ST audio Ustawia poziom czułości mikrofonu <br />

SPKLEVEL ST audio Ustawia poziom głośności wyjścia głośnikowego <br />

TIMER! ST timer uruchamia dany timer, po czasie którego zostanie wykonane dane słowo <br />

TIMER? ST timer kładzie na stos adres słowa, które będzie dokonane po danym timerze <br />

STOP ST timer „puste” słowo, bez przyporządkowanej funkcji <br />

STOPALL ST timer zatrzymuje wszystkie uruchomione timery <br />

: ST words otwarcie procedury definiowania nowego słowa <br />

; ST words zamkniecie procedury definiowania nowego słowa <br />

FORGET ST words usuwa słowo lub ciąg słów ze słownika forth‐systemu <br />

BUILD DICTIONARY RS words Powrót słownika do stanu pierwotnego <br />

IF ST warunek słowo operatora warunkowego rozpatrujące warunek <br />

ELSE ST warunek słowo operatora warunkowego wyznaczające zadania dla warunku PRAWDA <br />

THEN ST warunek słowo operatora warunkowego wyznaczające zadania dla warunku FAŁSZ <br />

." ST text otwarcie procedury wprowadzania tekstu do bufora wyjściowego <br />

" ST text zamknięcie procedury wprowadzania tekstu do bufora wyjściowego <br />

QUOTE ST text wprowadza znak cudzysłowa ( „ ) do bufora wyjściowego <br />

STRING! ST text zapisuje tekst z wyjściowego bufora jako zmienną wierszową <br />

STRING? ST text wprowadza do bufora wyjściowego tekst ze zmiennej wierszowej <br />

FLUSH ST text oczyszczenie wyjściowego bufora <br />

LENGTH ST text kładzie na stos wartość, jako liczbę znaków tekstu w buforze wyjściowym <br />

NEWLINE ST text przeniesienie do nowego wiersza tekstu wprowadzanym do bufora wyjściowego <br />

SPACE ST text wstawienie pojedynczej spacji w tekście wprowadzanym do bufora wyjściowego <br />

AUTOSPACE ST text<br />

NOAUTOSPACE ST text<br />

włączony tryb automatycznego wstawiania spacji na początku i końcu tekstu wprowadzanego do bufora<br />

wyjściowego<br />

wyłączony tryb automatycznego wstawiania spacji na początku i końcu tekstu wprowadzanego do bufora<br />

wyjściowego<br />

<br />

<br />

WORDS P words drukuje w oknie terminalu zasób słów forth‐systemu <br />

VERSION ST words wprowadza do bufora wyjściowego numer wersji firmware <br />

UNUSED ST words kładzie na stos danych liczbę bajtów wolnej pamięci słownika forth‐systemu <br />

NAME ST words drukuje w oknie terminalu słowo o podanym adresie <br />

FIND ST words kładzie na stos wartość, jako adres słowa <br />

EXECUTE ST words wykonuje słowo, którego adres jest na szczycie stosu danych <br />

( ST words otwarcie komentarza <br />

) ST words zamknięcie komentarza <br />

VAR? ST zas. <strong>prog</strong>r. kładzie na stos danych wartość zmiennej <br />

VAR! ST zas. <strong>prog</strong>r. zapisuje wartość ze szczytu stosu danych, jako zmienną <br />

FLAG? ST zas. <strong>prog</strong>r. kładzie na stos wartość zmiennej bitowej <br />

FLAG! ST zas. <strong>prog</strong>r. zapisuje wartość ze szczytu stosu, jako zmienną bitową <br />

CONSTANT ST zas. <strong>prog</strong>r. definiuje i określa wartość stałej <br />

TO ST zas. <strong>prog</strong>r. zapisuje wartość ze szczytu stosu danych, jako wartość stałej <br />

. ST zas. <strong>prog</strong>r. zdejmuje wartość ze szczytu stosu danych i drukuje w oknie terminalu <br />

‐ 69 ‐


Sterowniki <strong>prog</strong>ramowalne MAX Logic<br />

.S P zas. <strong>prog</strong>r. drukuje w oknie terminalu wszystkie wartości ze stosu danych <br />

DEPTH ST zas. <strong>prog</strong>r. kładzie na gorę stosu danych liczbę elementów tego stosu <br />

DUP ST operator dubluje element ze szczytu stosu danych <br />

DROP ST operator usuwa element ze szczytu stosu danych <br />

OVER ST operator dubluje element znajdujący się pod szczytem stosu danych i kładzie go na szczyt tego stosu <br />

ROT ST operator rotuje cyklicznie trzy górne elementy na stosie danych <br />

SWAP ST operator przestawia dwa górne elementy stosu danych <br />

PICK ST operator dubluje dowolny element stosu danych na szczyt stosu <br />

ROLL ST operator rotuje cyklicznie dowolną ilość elementów na stosie danych <br />

+ ST operator operator dodawania wartości ze stosu danych <br />

‐ ST operator operator odejmowania wartości ze stosu danych <br />

* ST operator operator mnożenia wartości ze stosu danych <br />

/ ST operator operator dzielenia z odrzuceniem reszty dzielenia dla wartości ze stosu danych <br />

MOD ST operator operator dzielenia z pozostawieniem reszty dzielenia dla wartości ze stosu danych <br />

ABS ST operator operator wartości bezwzględnej wartości ze stosu danych <br />

NEGATE ST operator operator zmiany znaku (+/‐) wartości ze stosu danych <br />

AND ST operator operator „iloczyn logiczny” AND <br />

OR ST operator operator „suma logiczna” OR <br />

XOR ST operator operator „poprzeczna suma logiczna” XOR <br />

NOT ST operator operator „zaprzeczenie logiczne” NOT <br />

RSHIFT ST operator operator przesunięcia bitowego w prawo <br />

LSHIFT ST operator operator przesunięcia bitowego w lewo <br />

TRUE ST wartość stała systemowa o znaczeniu logicznym PRAWDA <br />

FALSE ST wartość stała systemowa o znaczeniu logicznym FAŁSZ <br />

= ST operator operator porównania „równe” wartości ze stosu danych <br />

< ST operator operator porównania „mniejsze” wartości ze stosu danych <br />

> ST operator operator porównania „większe” wartości ze stosu danych <br />

= ST operator operator porównania „większe lub równe” wartości ze stosu danych <br />

ST operator operator porównania „nie równe” wartości ze stosu danych <br />

US>S ST operator przekształca liczbę całkowitą bez znaku, na liczbę całkowitą ze znakiem <br />

S>US ST operator przekształca liczbę całkowitą ze znakiem, na liczbę całkowitą bez znaku <br />

FVAR? ST zas. <strong>prog</strong>r. kładzie na stos matematyczny wartość zmiennej matematycznej <br />

FVAR! ST zas. <strong>prog</strong>r. zapisuje wartość ze szczytu stosu matematycznego, jako zmienną matematyczną <br />

FCONSTANT ST zas. <strong>prog</strong>r. definiuje i określa wartość stałej matematycznej <br />

TOF ST zas. <strong>prog</strong>r. zapisuje wartość ze szczytu stosu matematycznego, jako wartość stałej matemat. <br />

F. ST zas. <strong>prog</strong>r. zdejmuje wartość ze szczytu stosu matematycznego i drukuje w oknie terminalu <br />

FE. ST zas. <strong>prog</strong>r. zdejmuje wartość ze szczytu stosu matematycznego i drukuje w oknie terminalu w postaci liczby wykładniczej <br />

.FS P zas. <strong>prog</strong>r. drukuje w oknie terminalu wszystkie wartości ze stosu matematycznego <br />

FDEPTH ST zas. <strong>prog</strong>r. kładzie na gorę stosu matematycznego liczbę elementów tego stosu <br />

FPREC! ST system ustala precyzję liczb ze stosu matematycznego (ilość cyfr po przecinku) <br />

F>D ST operator<br />

przenosi element ze szczytu stosu matematycznego na szczyt stosu danych<br />

z zaokrągleniem wyniku do całości<br />

<br />

D>F ST operator przenosi element ze szczytu stosu danych na szczyt stosu matematycznego <br />

FDUP ST operator dubluje element ze szczytu stosu matematycznego <br />

FDROP ST operator usuwa element ze szczytu stosu matematycznego <br />

FOVER ST operator dubluje element znajdujący się pod szczytem stosu matematycznego i kładzie go na szczyt tego stosu <br />

FROT ST operator rotuje cyklicznie trzy górne elementy na stosie matematycznym <br />

FSWAP ST operator przestawia dwa górne elementy stosu matematycznego <br />

FPICK ST operator dubluje dowolny element stosu danych na szczyt matematycznego <br />

FROLL ST operator rotuje cyklicznie dowolną ilość elementów na stosie matematycznym <br />

‐ 70 ‐


Instrukcja <strong>prog</strong>ramowania w języku <strong>ForthLogic</strong> wersja <strong>P.1.2</strong><br />

F+ ST operator operator dodawania wartości ze stosu matematycznego <br />

F‐ ST operator operator odejmowania wartości ze stosu matematycznego <br />

F* ST operator operator mnożenia wartości ze stosu matematycznego <br />

F/ ST operator operator dzielenia dla wartości ze stosu matematycznego <br />

FABS ST operator operator wartości bezwzględnej wartości ze stosu matematycznego <br />

FNEGATE ST operator operator zmiany znaku (+/‐) wartości ze stosu matematycznego <br />

F< ST operator operator porównania „mniejsze” wartości ze stosu matematycznego <br />

F> ST operator operator porównania „większe” wartości ze stosu matematycznego <br />

FSIN ST operator funkcja sinus kąta dla wartości ze stosu matematycznego <br />

FCOS ST operator funkcja cosinus kąta dla wartości ze stosu matematycznego <br />

FTAN ST operator funkcja tangens kąta dla wartości ze stosu matematycznego <br />

FSINH ST operator funkcja sinus hiperboliczny dla wartości ze stosu matematycznego <br />

FCOSH ST operator funkcja cosinus hiperboliczny dla wartości ze stosu matematycznego <br />

FTANH ST operator funkcja tangens hiperboliczny dla wartości ze stosu matematycznego <br />

FASIN ST operator funkcja arksinus dla wartości ze stosu matematycznego <br />

FACOS ST operator funkcja arkcosinus wartości ze stosu matematycznego <br />

FATAN ST operator funkcja arktangens dla wartości ze stosu matematycznego <br />

FLOG ST operator funkcja logarytm dziesiętny dla wartości ze stosu matematycznego <br />

FLN ST operator funkcja logarytm naturalny dla wartości ze stosu matematycznego <br />

FEXP ST operator funkcja eksponenta dla wartości ze stosu matematycznego <br />

F** ST operator funkcja potęgowania dla wartości ze stosu matematycznego <br />

FSQRT ST operator pierwiastek kwadratowy z wartości ze stosu matematycznego <br />

US>F ST operator przekształca zmienne rejestrowe protokołu MODBUS na liczbę zmiennoprzecinkową <br />

F>US ST operator przekształca liczbę zmiennoprzecinkową na zmienne rejestrowe protokołu MODBUS <br />

COMPILE FILE RS plik Wgrywanie pliku aplikacji o podanej nazwie z karty SD <br />

RECEIVE FILE RS plik Wgrywanie pliku aplikacji z PC poprzez Xmodem <br />

11. WNIESIONE ZMIANY<br />

W stosunku do dokumentu P.1 100412:<br />

2.3 Zmienne<br />

‐ wprowadzono pojęcia zasobów <strong>prog</strong>ramowych: D_MAX, F_MAX, B_MAX, S_MAX.<br />

2.4 BUFOR WEJŚCIOWY I WYJŚCIOWY<br />

‐ wprowadzono pojęcia zasobu <strong>prog</strong>ramowego OUTBUF_MAX.<br />

3.2 PRACA W TRYBIE TERMINALOWYM<br />

‐ wprowadzono ogólny opis na temat środowiska <strong>prog</strong>ramistycznego NOTEPAD++PUTTY dla pracy dialogowej.<br />

4.3 DEFINIOWANIE NOWYCH SŁÓW<br />

‐ wprowadzono opis słowa VERSION.<br />

4.4.2 ZMIENNE<br />

‐ wprowadzono opis słowa CLEARSYS<br />

4.8.1 STATUS WE/WY<br />

‐ nowy rozdział opisujący status systemu, wejść i wyjść.<br />

4.8.2 BLOKADA DOSTEPU DO SYSTEMU<br />

‐ wprowadzono nowy rozdział wyodrębniając słowa do blokady dostępu systemu.<br />

4.8.3 WEJŚCIA<br />

‐ wprowadzono pojęcia zasobu <strong>prog</strong>ramowego DI_MAX i AI_MAX.<br />

‐ wprowadzono opis słowa AIS?.<br />

‐ wprowadzono opis słowa DIAIPARAM.<br />

4.8.4 WYJŚCIA<br />

‐ 71 ‐


Sterowniki <strong>prog</strong>ramowalne MAX Logic<br />

‐ wprowadzono pojęcia zasobu <strong>prog</strong>ramowego DO_MAX i RO_MAX.<br />

4.8.5 Port komunikacyjny RS‐485 i protokół komunikacyjny MODBUS RTU<br />

‐ wprowadzono opis słowa MODBUSPARAM, umożliwiające zmianę parametrów komunikacji.<br />

‐ wprowadzono opis słowa MODBUSCALLBACK.<br />

‐ wprowadzono opis słowa MODBUSTIMEOUT.<br />

‐ przedstawiono nowy przykład budowy bloku <strong>prog</strong>ramowego do wymiany danych po modus.<br />

4.9.4 ZEGAR SYSTEMOWY<br />

‐ zmieniono słowa ustawiające czas systemowy: słowo WATCH! zastąpiło kombinację słów >UTC i UTC!.<br />

4.9.5 REJESTRACJA DANYCH<br />

‐ opisano tryb USER_MODE.<br />

‐ wprowadzono opis słów LOGTITLEON i LOGTITLEOFF, LOGOFF, LOGFORMAT i LOGSEND?.<br />

4.10.1 MENU BLOKU „FUNKCJE DODATKOWE”<br />

‐ wprowadzono pojęcia zasobu <strong>prog</strong>ramowego MENU_MAX.<br />

4.10.3 WYŚWIETLACZ<br />

‐ wprowadzono pojęcia zasobu <strong>prog</strong>ramowego ROW_MAX i COL_MAX.<br />

4.11.1 ŚIEĆ GSM<br />

‐ wprowadzono nowy rozdział opisujący słowa ROAMING?, OPERATOR, SIGNAL?.<br />

4.11.2 POŁĄCZENIA GŁOSOWE<br />

‐ wprowadzono opisy słów SAYPLUS i NOSAYPLUS.<br />

4.11.3 OPERATORSKIE MENU GŁOSOWE (IVR) I FUNKCJE DTMF<br />

‐ wprowadzono opis słów DTMFCONFIRM i NODTMFCONFIRM.<br />

4.11.4 NUMERY TELEFONÓW<br />

‐ wprowadzono pojęcia zasobu <strong>prog</strong>ramowego PHONE_MAX.<br />

4.11.5 SMS<br />

‐ wprowadzono opis słowa ID<br />

4.12 MIKROFON i WYJSCIE GŁOŚNIKOWE<br />

‐ rozdział poszerzono o opis słów do obsługi wyjścia audio<br />

6. TWORZENIE APLIKACJI W JĘZYKU <strong>ForthLogic</strong><br />

‐ wprowadzono rozdział opisujący praktyczne tworzenie aplikacji w języku <strong>ForthLogic</strong><br />

8. TABELA ZASOBÓW PROGRAMOWYCH<br />

‐ wprowadzono tabelę z opisem i wartościami zasobów <strong>prog</strong>ramowych<br />

‐ 72 ‐

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!