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