3. Prostředky
síťové komunikace
3.1 Komunikační služby
protokolu tcp/ip
4.3 VSTUPNĚ VÝSTUPNÍ ROZHRANÍ
MIKROPROCESORU
4.5.3 Rozšíření funkcí – protokol TCP/IP
5.1 ZAPOJENÍ ROZHRANÍ ETHERNET
5.4.4 Transmit Data to the A2000
6. NÁVRH
SCHématu A DESKY plošných spojů..
6.2.3 Sériová datová FLASH (paměť souborů)
6.3 VÝCHOZÍ PŘEDPOKLADY PRO
NÁVRH DPS
7.1 POSTUP PŘI OŽIVOVÁNÍ
MIKROPROCESORU
7.2 OŽIVENÍ ETHERNETOVÉHO
ŘADIČE
7.3 PROPOJENÍ S PROSTŘEDÍM
DYNAMIC C
7.3.1 Studený start Rabbita s Dynamic C
8.1 POPIS VYUŽITých PROSTŘEDKů
Dynamic C
8.1.1 Operační systém reálného času
8.2 KOMUNIKAČNÍ PROTOKOL HTTP
SERVERU
8.2.2 Parametry pro inicializaci
8.2.3 Parametry pro konfiguraci přístroje
8.2.4 Parametry pro měřené veličiny
8.4.2 Obsluha požadavků komunikace
s HTTP serverem
8.4.3 Ostatní funkce v programu
8.5 Úpravy v původních
knihovnách Dynamic C
Přílohy:
...... Příloha A: Schéma zapojení
...... Příloha B: Deska plošných spojů
...... Příloha C: Seznam použitých součástek
Nabídka firmy GMC – měřící technika, s.r.o obsahuje v současné době i multifunkční wattmetr A2000. Tento měřící přístroj patří do kategorie moderních inteligentních přístrojů obsahujících mikroprocesor pro zpracování dat a komunikaci s okolím.
V dnešní době je komunikace stále se rozvíjející a nezbytnou součástí každodenního života a to i v oblasti měřící a řídící techniky. Rozvoj komunikačních forem pomocí síťových technologií jako je Internet pak přináší nový rozměr všech oblastí využití. V lokálních sítích je dnes nejvíce využívanou architekturou Ethernet. Většina firemních síťových architektur obsahuje brány k sítím Ethernet. Také samostatné přístroje, ale i aktory a čidla jsou již stále častěji vybavovány tímto rozhraním.
Firma GMC také vyvíjí různé způsoby připojení svých přístrojů k síti Internet. Jedním z nich je připojení přes místní síť typu Ethernet, což je tématem a náplní této diplomové práce. Rozhraní mezi sítí Ethernet a měřícím přístrojem A2000 má být realizováno jako samostatná jednotka připojitelná k vlastnímu měřícímu přístroji pomocí již implementovaného rozhraní RS 232C. Jádrem jednotky bude mikroprocesor Rabbit 2000, který bude sloužit ke komunikaci s přístrojem A2000 a komunikaci s uživatelem prostřednictvím http serveru a který umožní spouštění Java Appletu. Ke změně obsahu poskytovaného http serverem bude sloužit ftp server.
Pro potřeby návrhu je k dispozici vývojové prostředí Rabbit TCP/IP Development Kit umožňující práci mikroprocesoru Rabbit připojeného k síti Ethernet. Z tohoto prostředí lze také čerpat motivaci při návrhu, resp. především v části styku mikroprocesoru Rabbit a rozhraní Ethernet.
obr. 1: Vzhled přístroje A2000
A2000 je měřící přístroj určený pro analýzu a monitorování elektrických systémů napájených střídavým napětím. Může pracovat s vnitřními měřícími transformátory ve 3-fázových systémech do napětí 500 V, při použití vnějších měřících transformátorů může pracovat v systémech s větším napětím.
A2000 měří napětí, proud, frekvenci a fázový posun v jedno a 3-fázových systémech. Z těchto údajů počítá činný, jalový a zdánlivý výkon, činnou a jalovou energii a účiník.
Rozsahy vnějších měřících transformátorů mohou být zadány do přístroje, což umožňuje zobrazení primárních údajů přímo na přístroji. Maximální hodnoty mohou být uloženy v paměti pro každou měřenou nebo vypočtenou veličinu. A2000 umožňuje spínat relé při překročení nastavitelných limitních hodnot. Digitální a analogové vstupy slouží k napojení dalších přístrojů jako jsou například elektromechanické čítače energie, zápisníky, řídící smyčky.
Přístroj také může komunikovat s ostatními vnějšími systémy např. pomocí sériového rozhraní RS 232 nebo může být zapojen do sítě LonWorks.
Na následujícím obrázku jsou zobrazena rozhraní přístroje A2000.
obr. 2: Rozhraní přístroje A2000
· napěťové vstupy: každý napěťový vstup má bezpečnou impedanci; měření v třífázových systémech do 500 V je možné bez použití vnějších transformátorů
· proudové vstupy: všechny proudové vstupy jsou vzájemně galvanicky odděleny; jestliže jsou použity vnější transformátory, jejich primární a sekundární rozsahy musí být zadány do přístroje, aby zobrazoval správné hodnoty
· synchronizační vstup je použit pro výběr intervalu pro výpočet 15 minutových hodnot; synchronizace může být také řízena programově samotným přístrojem
· výstupní relé mohou být spínána při překročení nastavené limitní hodnoty pro jakoukoliv měřenou nebo vypočtenou hodnotu
· impulsní výstupy: hodnoty měřené činné a jalové energie mohu být vysílány formou impulsů pro připojení elektromechanických počítadel
· analogové výstupy: jakákoliv měřené nebo vypočtená hodnota může být vysílána prostřednictvím analogového výstupu; jednotlivé analogové výstupy mohou být konfigurovány jako napěťové nebo proudové
· sériové rozhraní RS 232 slouží pro přenos naměřených hodnot do osobního počítače a ke konfiguraci přístroje z osobního počítače. Přes toto rozhraní bude přístroj A2000 komunikovat s navrhovanou kartou, která bude dále zprostředkovávat styk s rozhraním Ethernet
· sériové rozhraní RS 485
· rozhraní Lon Talk je určeno pro připojení do sítě Lon Works
Komunikace v síťovém prostředí je komplexní problém, který byl pro jednoduchost rozdělen na několik dílčích problémů. Toto rozdělení vedlo ke vzniku referenčního vrstvového ISO/OSI modelu. Pomocí něj je možné komunikaci rozdělit na několik jednotlivých částí. Existuje řada síťových protokolů, které víceméně z modelu ISO/OSI vychází nebo se s ním srovnávají. V prostředí Internetu je jedním z nejdůležitějších protokol TCP/IP. Jeho srovnání s modelem ISO/OSI je vidět na obrázku č. 4.
Obr. 4: Vrstvový model ISO/OSI a TCP/IP
Srovnáním modelů je vidět, že funkce nejvyšších vrstev zastávají u modelu TCP/IP jednotlivé aplikační protokoly jako je FTP, Telnet apod. Funkci transportní vrstvy odpovídají protokoly TCP a UDP, síťové vrstvě protokol IP. Linková a fyzická vrstva nejsou jednoznačně definovány.
Jak již vyplývá z výše popsaného modelu, TCP/IP není jednoznačně definovaným protokolem, ale spíše skupinou sdružující protokoly komunikačních služeb Internetu. V následující tabulce je uveden přehled nejdůležitějších služeb.
Protokol |
Popis |
HTTP |
World Wide Web |
NMTP |
Diskusní skupiny |
SMTP |
Elektronická pošta |
POP3 |
Čtení elektronických zpráv uložených na serveru |
FTP |
Přenos souborů mezi počítači |
TELNET |
Vzdálený přístup k počítači |
Tento protokol slouží zejména pro distribuci hypertextových a dalších dokumentů, nebo-li zprostředkování dobře známých www stránek. Využívá portu 80. Je to jednoduchý protokol, který se nestará o to, zda budou data doručena, ale předpokládá, že to co se objeví na jedné straně, dostane se na druhou stranu v nezměněné podobě. Komunikace probíhá formou dotazů, kdy klient vyšle dotaz a server vystaví odpověď. Pro tuto komunikaci definuje protokol HTTP určité metody. Nejznámější metody přenosu požadavků na server jsou POST a GET. Metoda GET zasílá požadavky serveru prostřednictvím URL dotazu, tedy požadovaná data jsou součástí adresy. Velikost těchto dat je omezená. Metoda POST je univerzálnější a nemá omezenou velikost.
Vhodným prostředkem pro zpracování dat na straně HTTP serveru jsou CGI skripty. Tyto rozšiřují schopnosti serveru o komunikaci s dalšími programy nebo dalším hardwarem. CGI skripty jsou spouštěny zadáním dotazu od klienta včetně parametrů prostřednictvím metod GET a POST. Výstupem CGI skriptu může být např. vytvoření HTML stránky, práce s databází, vykonání jiného programu na serveru atd.
Vlastní CGI skript je program vytvořený ve formě spouštěcího souboru v libovolném programovacím jazyku (např. C/C++).
Při použití metody GET jsou data předávána jako parametry
na příkazové řádce. Příklad
volání skriptu metodou GET:
GET /cgi-bin/název_skriptu?param1=hodnota1¶m2=hodnota2
HTTP/1.0,
kde
znak ? je oddělovač mezi názvem skriptu a jeho parametry, znak & je
oddělovač jednotlivých parametrů. HTTP/1.0 označuje použitou verzi protokolu.
Při použití metody
POST jsou data předána zápisem na standardní výstup klienta, tj. na standardní
vstup na straně CGI skriptu. Příklad
volání skriptu metodou POST:
POST /cgi-bin/název_skriptu HTTP/1.0
Content-type: typ_přenášeného_obsahu/podtyp_přenášeného_obsahu
Content-length: délka_přenášených_dat_v_bytech
prázdný_řádek
param1=hodnota1¶m2=hodnota2&…,
kde
proměnná Content-type určuje typ přenášeného obsahu (např. text/plain,
text/html, image/gif). Proměnná Content-length obsahuje velikost
přenášených dat. Po těchto informacích následuje prázdný řádek a pak již
vlastní data, která mají stejný tvar jako u metody GET .
Jedná se o protokol podporující přenos souborů mezi uzly v síti. Pro počáteční přihlášení a získání oprávnění přístupu na FTP server je třeba zadat uživatelské jméno, které je přenášeno sítí v nezašifrované podobě. FTP využívá spolehlivé transportní služby se spojením protokolu TCP. Číslo portu používané protokolem FTP je 21. Tento port slouží pro kontrolní příkazy FTP. Pro přenos dat se implicitně využívá port 20.
O správu souborů v daném uzlu sítě a autentizaci přihlášení se potom stará program zvaný FTP server. Ten podporuje dle implementace jak anonymní přihlášení (většinou přihlašovací jméno anonymous, host nebo quest), tak i přihlášení s vyžádáním uživatelského jména a hesla. Po přihlášení lze využívat základní příkazy, které umožňují výpis souborů a adresářové struktury, upload nebo download souborů a jejich mazání. Pro každý soubor nebo adresář lze většinou odděleně nastavit úroveň práv a vlastníka.
Pro přístup na FTP server slouží program zvaný FTP klient, který je spouštěn na klientské stanici. Ten překládá uživatelské příkazy do požadavků odesílaných na server a zprostředkovává příjem dat ze serveru.
Mikroprocesor Rabbit 2000 (dále jen Rabbit) vychází z koncepcí mikroprocesorů Z80, Z180 a HD64180 při použití v malých řídících aplikacích. Rabbit má podobnou architekturu a vysoký stupeň kompatibility s těmito mikroprocesory, ale je značně vylepšen.
Rabbit je usazen ve 100 vývodovém pouzdru PQFP určeném pro povrchovou montáž na desku plošného spoje. Pracovní napětí je od 2,7 V do 5 V. Hodinový kmitočet může být až 30 MHz. Jeho datová sběrnice je 8-bitová, stejně jako celá koncepce mikroprocesoru. Instrukce pracující s adresou mají 16-bitový operand a tento se převádí v paměťové mapovací jednotce na 20-bitovou adresu pro vlastní paměťový čip. Tím mikroprocesor dokáže adresovat až 1MB paměťového prostoru. Má 40 paralelních vstupně/výstupních linek (sdílených se sériovými porty), které jsou rozčleněny do bran PA až PE. Jednotlivé sériové či paralelní porty mohou pracovat v různých módech činnosti. Bránu PA lze například konfigurovat jako „Slave port“ pro komunikaci s dalším procesorem (v tomto zapojení jsou využity ještě některé bity z dalších bran). Mikroprocesor má čtyři úrovně priority přerušení a rychlou odezvu na přerušovací signál pro praktické aplikace. Umožňuje programování přes PC pomocí vývojového systému jazyka C (Dynamic C). Do paměti o velikosti 1 MB je možné v jazyku C uložit až 50 000 řádků kódu. Přístup k vstupně/výstupním zařízením je řešen použitím instrukcí přístupu do paměti s I/O prefixem.
obr. 3: Vnitřní struktura mikroprocesoru Rabbit 2000
Rabbit má pět osmi-bitových paralelních portů označených jako A, B, C, D a E. Vývody použité pro paralelní porty jsou často sdílené s dalšími vstupně výstupními funkcemi mikroprocesoru viz [1] . Nejdůležitější vlastnosti jsou zde shrnuty.
Port A - je sdílen se „Slave data interface“ portem
Port B - je sdílen s řídícími signály pro Slave port a vývodem hodinového kmitočtu pro použití sériového portu A či B jako synchronního
Port C - sdílen s vývody sériových portů A až D
Port D - vyšší čtyři bity sdíleny s alternativními vývody pro sériový port A a B. Nižší čtyři bity nejsou sdíleny. Má výstupní registry časově řízené umožňující generování pulsů.
Port E - všechny bity portu E mohou být konfigurovány jako vstupně výstupní strobované vývody. Čtyři bity mohou být použity jako vstupy externích přerušení. Jeden bit je sdílen se signálem „Slave port chip select“. Dále obsahuje port E také výstupní registry kaskádně řazené a časově řízené umožňující generování pulsů.
Mikroprocesor obsahuje na čipu integrované čtyři sériové porty označené A, B, C a D sdílené s vývody paralelního portu C. Všechny umožňují vysokorychlostní asynchronní komunikaci. Navíc mohou být porty A a B jako synchronní. Pro tento případ jsou vyvedeny hodinové impulsy CLKA a CLKB sloužící k jejich časování. Porty A a B mají ještě další rozšiřující možnost a to přepnutí mezi standardními a alternativními vývody (sdíleny s paralelním portem D). Port A má speciální možnost být použit ke „studenému“ startu systému. Provádí se přes něj nahrávání programu do paměti a následné ladění.
K dosažení stejné funkčnosti při práci s mikroprocesorem Rabbit může být použito několika způsobů. Připravením a publikováním návrhových standardů firmou Rabbit Semiconductor je umožněna snadnější hardwarová a softwarová podpora.
Jedná se o specifikaci propojení Rabbita kabelem se sériovým portem PC sloužící jako standardní programovací interface. Ve specifikaci je uvedeno zapojení tohoto kabelu a rozhraní RS232/TTL logiky a toto propojovací rozhraní bývá součástí jednotlivých „kitů“ nabízených výrobcem. Také standardní návrhové rozhraní Dynamic C distribuované s mikroprocesorem předpokládá toto komunikační rozhraní k nahrávání a ladění programů. Fyzicky je na straně Rabbita programovací port připojen k sériovému portu A, startovacím vývodům, signálu reset a programovatelnému výstupnímu vývodu k posílání signálů do PC.
Firma Rabbit Semiconductor poskytuje standardní BIOS pro mikroprocesor Rabbit. BIOS je softwarový program, který zajišťuje spuštění a ukončení činnosti Rabbita a základní služby pro běh softwaru na Rabbitu.
Dynamic C je interaktivní vývojový systém odvozený od jazyka C. Je určen pro operační systémy Windows 9x a NT. Nabízí kombinaci překladače, editoru a ladícího prostředí. Nahrávání a ladění softwaru pro Rabbit se děje přes programovací kabel připojený na programovací port mikroprocesoru. Jednotlivé knihovny Dynamic C nabízejí výkonné softwarové prostředky k ovládání Rabbita. Tyto zahrnují ovladače, utility, matematické rutiny a odlaďovací BIOS pro Dynamic C. Dále zahrnují některé verze Dynamic C pro Rabbit upravený operační systém reálného času uC/OS-II.
Dynamic C obsahuje množství základních knihoven funkcí. Některé knihovny nesou stejné označení jako knihovny běžných implementací jazyka C pro PC a obsahují také úplně či téměř stejné funkce. Nachází se zde ale také velké množství funkcí, které jsou určeny specificky pro mikroprocesor Rabbit a využívají plně jeho možností. Funkce lze rozčlenit do skupin dle jejich použití. Jedná se o funkce aritmetické, manipulující s bity, pro práci se znaky, rozšířenou pamětí, pro rychlou FFT transformaci, přerušení, multitasking a mnoho dalších.
Jazyk Dynamic C má implementovány ještě další skupiny funkcí, které ovšem nejsou zahrnuty do standardních, protože k jejich uplatnění je potřeba širší hardwarový základ než jen samotný mikroprocesor s nejnutnějšími obvody. Tyto rozšiřující možnosti využijeme například při práci s rozhraním Ethernet, kdy přichází v úvahu funkce pro práci s protokolem TCP/IP. K tomuto účelu je ovšem nutné mít Rabbit připojený k ethernetovému řadiči přes výrobcem definované vstupy. Takovéto zapojení je použito i ve vývojové sadě „TCP/IP Development Kit“ a použito pro tuto práci. Jedině za takovýchto předpokladů je možné použít jednotlivé funkce v nezměněné podobě. Při zapojení Ethernetového řadiče na jiné vývody mikroprocesoru by bylo nutné vytvořit vlastní funkce například tím, že se předefinují odkazy na použité propojovací vývody.
Funkce a konstanty pro práci s protokolem TCP/IP se dají opět přehledně shrnout do skupin dle významových kategorií. Jedná se o konfigurace, inicializace, nastavení bufferů TCP/IP protokolů, přenos dat, standardní vstupně výstupní funkce, datové konverze a další.
HTTP server (také web server) slouží ke zpřístupnění dokumentů HTML a dalších různých dokumentů klientům pomocí prohlížeče webu. Tento server je implementován v knihovně HTTP.LIB. Knihovna obsahuje čtyři datové struktury.
· HttpSpec – obsahuje všechny soubory, proměnné a funkce, které zpřístupňují web server
· HttpType – provádí asociace přípon souborů s typem MIME (Multipurpose Internet Mail Extension) a funkcí, která ovládá typ MIME
· HttpRealm – stará se o uživatelská ID a hesla zpřístupňující určité chráněné oblasti na serveru
· HttpState – použití této struktury je nutné pro CGI funkce
CGI (Common Gateway Interface) slouží jako standardní rozhraní mezi externími aplikacemi a HTTP serverem. Pokaždé, když si klient vyžádá URL odpovídající CGI programu, server tento CGI program vykoná v reálném čase. V programu pro Rabbit v Dynamic C jsou CGI funkce normálními funkcemi v jazyce C na něž je proveden odkaz přes odpovídající nadefinování struktur HTTP serveru. HTTP server potom zprostředkovává napojení na tyto funkce (jejich vykonání) při požadavku klienta (např. volba odkazu z prohlížené www stránky).
FTP (file transef protocol) server implementuje funkce pro přenos souborů. K tomuto účelu používá dvou TCP/IP spojení. Na otevřeném portu 21 FTP server pasivně očekává připojení klienta. Pro Dynamic C implementovaná verze FTP serveru podporuje také anonymní přihlášení.
Dynamic C také implementuje knihovnu (zserver.lib), která obsahuje struktury, funkce a konstanty umožňující FTP serveru a HTTP serveru sdílet data a uživatelskou autentifikaci. Obsahuje následující struktury:
· ServerSpec - umožňuje přístup FTP serveru k seznamu funkcí, souborů a proměnných
· ServerAuth - definuje globální pole se seznamem uživatelských jmen a hesel
· FormVar – reprezentuje proměnné v HTML formuláři
obr. 5: Blokové schéma rozhraní
Návrh rozhraní vychází z využití stávajících možností přístroje A2000. Ten má již zaimplementováno sériové rozhraní a rozhraní Lon Talk. Mikroprocesor Rabbit slouží k zajištění komunikace s aplikačním procesorem přístoje A2000. Dále na něm běží programové vybavení vytvářející HTTP server a FTP server pro přístup ze sítě Ethernet. Protože Rabbit nebsahuje žádnou vnitřní paměť, je k němu nutné připojit paměť programu typu FLASH, paměť dat typu SRAM a volitelně sériovou paměť DataFLASH sloužící k uložení souborů pro HTTP a FTP server. Jako rozhraní mezi sítí Ethernet a Rabbitem slouží ethernetový řadič Realtek RTL8019AS.
Celé zapojení by mělo být realizované jako samostatná „rozšiřující karta“, respektive modul, na jedné straně připojitelný k měřícímu přístroji přes jeho stávající rozhraní a na druhé straně připojitelný na ethernetové rozhraní pomocí standardu 10Base-T (twisted-pair). Názorný náhled je vidět na obrázku č. 6. Na obrázku č. 5 je principiální blokové schéma komunikace.
obr. 6: Náhled spojení A2000 – Rabbit - Uživatel
Mezi aplikačním procesorem a mikroprocesorem Rabbit 2000 je realizován přenos dat po sériovém asynchronním rozhraní. Spojení je provedeno třívodičově s ukončením pomocí devítipinových konektorů Canon. Formát přenášených dat je v běžném tvaru a to jeden start bit, osm datových bitů, jeden paritní bit a jeden stop bit. Přenosová rychlost je u přístroje A2000 volitelná z ovládacího panelu. V programu pro Rabbit bude nastavená po inicializaci na 19200 bps, ovšem uživatel ji může později změnit pomocí Java Appletu.
Ze strany mikroprocesoru Rabbit je třeba připojit tyto vývody na piny sériového portu. Jelikož sériový port A je použit pro nahrávání programu do paměti z PC, je nutné zvolit některý ze zbývajících portů. Pro realizaci byl zvolen port D. Jeho signály TxD (vysílací signál) a RxD (přijímací signál) jsou na vývodech 59 a 60 a jsou tak sdíleny s vývody paralelního portu C. Tyto signály mají úroveň TTL logiky a je tedy potřeba provést přizpůsobení a oddělení signálu. To se provede pomocí vysílacího/přijímacího obvodu k rozhraní RS 232.
obr. 7: Zapojení sériového rozhraní
Při komunikaci rozlišuje přístroj A2000 několik typů přenášených zpráv. Jsou to zkrácená, řídící a plná zpráva. Následuje přehled tvarů těchto zpráv. Podrobné informace o přesném nastavení a významu jednotlivých znaků uvnitř konkrétní zprávy je možné nalézt ve firemní literatuře [5] a základní přehled v tomto projektu použitých zpráv v další podkapitole „Obsah komunikačních zpráv“.
Je posílána v dotazovacím směru (z masteru) jako příkazy pro instrumenty (např. reset) a žádost o důležitá data z instrumentů. Také může být poslána ve směru odpovědi (z A2000) jako potvrzení příkazu, který nevyžadoval žádná data v odpovědi. Má následující strukturu:
Č. znaku |
Obsah |
Význam |
Poznámka |
1 |
10h |
Start
zprávy |
jen
pro zkrácenou zprávu |
2 |
0..FAh,FFh |
Adresa
instrumentu (IA) |
|
3 |
|
Funkční
pole (FF) |
|
4 |
|
Kontrolní
součet (CS) |
součet
IA a FF |
5 |
16h |
Konec
zprávy |
stejné
pro všechny typy zpráv |
Je přenášena pouze z masteru do přístroje A2000. Bývá u všech žádostí o data, která nemohou být dotazována ve zkrácené zprávě, protože potřebují hlubší specifikaci. Má následující tvar:
Č. znaku |
Obsah |
Význam |
Poznámka |
1 |
68h |
Start
zprávy |
|
2 |
03h |
Délka |
počet
znaků od IA do CS |
3 |
03h |
Délka
(opětovně) |
|
4 |
68h |
Start
zprávy (opětovně) |
|
5 |
0..FAh,FFh |
Adresa
instrumentu (IA) |
|
6 |
|
Funkční
pole (FF) |
|
7 |
|
Index
parametru (PI) |
|
8 |
|
Kontrolní
součet (CS) |
|
9 |
16h |
Konec
zprávy |
stejné
pro všechny typy zpráv |
Tento typ je použit přístrojem A2000 k přenosu příkazů a parametrů do instrumentu a k nahrání dat z instrumentu. Má následující tvar:
Č. znaku |
Obsah |
Význam |
Poznámka |
1 |
68h |
Start
zprávy |
|
2 |
|
Délka (DL) |
počet
znaků od IA do CS |
3 |
|
Délka
(opětovně) |
|
4 |
68h |
Start
zprávy (opětovně) |
|
5 |
0..FAh,FFh |
Adresa
instrumentu (IA) |
|
6 |
|
Funkční
pole (FF) |
|
7 |
|
Index
parametru (PI) |
|
… |
|
Blok dat (DB) |
|
délka
+ 5 |
|
Kontrolní
součet (CS) |
|
délka
+ 6 |
16h |
Konec
zprávy |
stejné
pro všechny typy zpráv |
Slouží k inicializaci. Přístroj provede reset a přepne se do výchozího nastavení. Také smaže některá statistická data jako maxima měřených veličin.
Zpráva z mastera (zkrácená zpráva):
10h |
IA |
09h |
CS |
16h |
Odpověď z A2000: Bez odpovědi
Kontroluje připravenost a správnou funkci přístroje. Dle významu příchozího „FF“ lze zjistit stav přístroje.
Zpráva z mastera (zkrácená zpráva):
10h |
IA |
29h |
CS |
16h |
Odpověď z A2000 (zkrácená zpráva):
10h |
IA |
FF |
CS |
16h |
Veškerá data z přístroje A2000 se přenáší tímto typem zpráv. Jedná se o všechny měřené veličiny, parametry, konfiguraci, podmínky, identifikaci instrumentu atd. Potřebný význam zprávy je určen hodnotou bajtu PI (parameter index).
Zpráva z mastera (řídící zpráva):
68h |
DL |
DL |
68h |
IA |
89h |
PI |
CS |
16h |
Odpověď z A2000 (plná zpráva):
68h |
DL |
DL |
68h |
IA |
FF |
PI |
Data |
… |
Data |
CS |
16h |
Všechny parametry, konfigurace a operační podmínky, které mohou být změněny operátorem, se posílají těmito zprávami. Z příchozího „FF“ lze zjistit, zda byla příchozí data správně zpracována.
Zpráva z mastera (plná zpráva):
68h |
DL |
DL |
68h |
IA |
69h |
PI |
Data |
… |
Data |
CS |
16h |
Odpověď z A2000 (zkrácená zpráva):
10h |
IA |
FF |
CS |
16h |
Měřené veličiny – posílají se vždy po skupinách
PI |
Skupina veličin |
00h |
Fázová napětí |
01h |
Sdružená napětí |
02h |
Fázové proudy |
03h |
Průměrné fázové proudy |
04h |
Činný výkon |
05h |
Jalový výkon |
06h |
Zdánlivý výkon |
07h |
Účiník |
08h |
Energie |
09h |
Intervalová energie (P int) |
0Ah |
Intervalová energie (Q int) |
0Bh |
Intervalová energie (S int) |
0Fh |
Síťová frekvence |
Konfigurace relé, pulsních a analogových výstupů
PI |
Popis konfigurace |
Formát |
Jednotka |
Rozsah hodnot |
10h |
Relé 1 hystereze |
16 bitů |
dle „zdroje“ |
0..100 |
Relé 2 hystereze |
16 bitů |
dle „zdroje“ |
0..100 |
|
Relé 1 limit |
±15 bitů |
dle „zdroje“ |
-1999..1999 |
|
Relé 2 limit |
±15 bitů |
dle „zdroje“ |
-1999..1999 |
|
11h |
Relé 1 zdroj |
8 bitů |
|
viz. [5] |
Relé 2 zdroj |
8 bitů |
|
viz. [5] |
|
Relé 1 konfigurace |
8 bitů |
|
viz. [5] |
|
Relé 2 konfigurace |
8 bitů |
|
viz. [5] |
|
12h |
Pulsní výstup 1 |
16 bitů |
1/kWh (MWh) |
0..5000 |
Pulsní výstup 2 |
16 bitů |
1/kWh (MWh) |
0..5000 |
|
13h |
Zdroj pro pulsní výstup 1 |
8 bitů |
|
viz. [5] |
Zdroj pro pulsní výstup 2 |
8 bitů |
|
viz. [5] |
|
14h |
Analogový výstup 1 – dolní limit |
±15 bitů |
dle „zdroje“ |
-9999..9999 |
Analogový výstup 2 – dolní limit |
±15 bitů |
dle „zdroje“ |
-9999..9999 |
|
Analogový výstup 3 – dolní limit |
±15 bitů |
dle „zdroje“ |
-9999..9999 |
|
Analogový výstup 4 – dolní limit |
±15 bitů |
dle „zdroje“ |
-9999..9999 |
|
15h |
Analogový výstup 1 – horní limit |
±15 bitů |
dle „zdroje“ |
-9999..9999 |
Analogový výstup 2 – horní limit |
±15 bitů |
dle „zdroje“ |
-9999..9999 |
|
Analogový výstup 3 – horní limit |
±15 bitů |
dle „zdroje“ |
-9999..9999 |
|
Analogový výstup 4 – horní limit |
±15 bitů |
dle „zdroje“ |
-9999..9999 |
|
16h |
Analogový výstup 1 - zdroj |
8 bitů |
|
viz. [5] |
Analogový výstup 2 - zdroj |
8 bitů |
|
viz. [5] |
|
Analogový výstup 3 - zdroj |
8 bitů |
|
viz. [5] |
|
Analogový výstup 4 - zdroj |
8 bitů |
|
viz. [5] |
|
Analogový výstup 1 - konfigurace |
8 bitů |
|
viz. [5] |
|
Analogový výstup 2 - konfigurace |
8 bitů |
|
viz. [5] |
|
Analogový výstup 3 - konfigurace |
8 bitů |
|
viz. [5] |
|
Analogový výstup 4 - konfigurace |
8 bitů |
|
viz. [5] |
Kontrola stavu přístroje a řídící příkazy
PI |
Popis |
Formát |
Rozsah hodnot |
20h |
stav nastavení přístroje |
16 bitů |
viz. [5] |
21h |
chybová hlášení přístroje |
2 x 16 bitů |
viz. [5] |
24h |
nulování max. hodnot U a I |
2 x 8 bitů |
viz. [5] |
25h |
nulování max. hodnot výkonů |
3 x 8 bitů |
viz. [5] |
26h |
nulování všech hodnot energie |
16 bitů |
= 55AAh |
27h |
obnova defaultních parametrů |
16 bitů |
= A965h |
29h |
Data-Logger start/stop |
8 bitů |
= 55h: Stop = AAh: Start |
Specifikace instrumentu
PI |
Popis |
Formát |
Rozsah hodnot |
32h |
Převodní poměr U na V |
±7 bitů |
|
Převodní poměr I na A |
±7 bitů |
|
|
Převodní poměr P na W |
±7 bitů |
|
|
Převodní poměr E na Wh |
±7 bitů |
|
|
33h |
Typ připojení 3L/4L |
8 bitů |
55h, AAh, 33h |
34h |
Synchronizační interval pro energii |
8 bitů |
0, 1..60 |
3Bh |
Rozsah napětí Utprim |
100V/16 bitů |
1..7500 |
Rozsah napětí Utsek |
1V/16 bitů |
100..500 |
|
3Ch |
Rozsah proudu Itprim |
1A, 5A/16 bitů |
0, 1..30000 |
Rozsah proudu Itsek |
16 bitů |
0, 1 |
|
3Fh |
Jas displeje |
8 bitů |
0..7 |
Hodiny reálného času, Data-Logger
PI |
Popis |
Formát |
Rozsah hodnot |
90h |
Sekundy |
8 bitů |
0..59 |
Minuty |
8 bitů |
0..59 |
|
Hodiny |
8 bitů |
0..23 |
|
91h |
Den |
8 bitů |
1..31 |
Měsíc |
8 bitů |
1..12 |
|
Rok |
8 bitů |
0..99 |
|
Milénium |
8 bitů |
19..20 |
|
92h |
Data-Logger – vzorkovací interval |
8 bitů |
0..13 |
Data-Logger – čas záznamu |
8 bitů |
8..21 |
|
Data-Logger – specifikace spouštění |
8 bitů |
00h..3Fh |
|
Data-Logger – kanál 1 |
8 bitů |
00h..B3h |
|
Data-Logger – kanál 2 |
8 bitů |
00h..B3h |
|
Data-Logger – kanál 3 |
8 bitů |
00h..B3h |
|
Data-Logger – kanál 4 |
8 bitů |
00h..B3h |
|
Data-Logger – kanál 5 |
8 bitů |
00h..B3h |
|
Data-Logger – kanál 6 |
8 bitů |
00h..B3h |
|
Data-Logger – kanál 7 |
8 bitů |
00h..B3h |
|
Data-Logger – kanál 8 |
8 bitů |
00h..B3h |
|
Data-Logger – kanál 9 |
8 bitů |
00h..B3h |
|
Data-Logger – kanál 10 |
8 bitů |
00h..B3h |
|
Data-Logger – kanál 11 |
8 bitů |
00h..B3h |
|
Data-Logger – kanál 12 |
8 bitů |
00h..B3h |
Pro návrh zapojení bylo jako výchozí materiál použito schéma zapojení mikroprocesoru Rabbit 2000 v prostředí TCP/IP Development Kit. Z tohoto schématu bylo převzato uspořádání součástek na jednotlivých listech, vzhled schematických značek součástek, které nejsou dostupné ve standardních knihovnách kreslících programů, způsob připojení pamětí a zapojení ethernetového rozhraní přes ethernetový řadič RTL8019AS.
Návrh schématu byl proveden v programu Eagle 4.0. Pasivní součástky byly použity ze stávajících knihoven programu, přidané číslicové součástky byly překresleny dle rozměrů a zapojení skutečných součástek, které budou při realizaci použity do nově vytvořené knihovny Rabbit.lbr.
Mikroprocesor Rabbit 2000 je SMD součástka umístěná v pouzdru PQFP100. Adresová a datová sběrnice jsou připojeny k pamětem a k ethernetovému řadiči. Signály CS0\, CS1\, OE0\, OE1\, WE0\ a WE1\ jsou zapojeny k pamětem pro řízení výběru obvodu. Z vstupně/výstupních bran jsou využity PB, PC a PE. Brána PA a PD jsou zcela nevyužity. Na vývody XTALA1, XTALA2, XTALB1 a XTALB2 jsou zapojeny obvody oscilátorů. Mezi XTALA1 a XTALA2 je zapojen krystal s rezonančním kmitočtem 32,768 kHz. Mezi vývody XTALB1 a XTALB2 je možné připojit buď krystal 18,432 MHz nebo aktivní oscilační součástku o kmitočtu 30 MHz. Nevyužitá část tohoto obvodu se neosadí součástkami. Ještě jsou vyvedeny napájecí vstupy a vstupy /RESET, STATUS, SMODE0 a SMODE1 pro programovací port.
K mikroprocesoru Rabbit 2000 jsou připojeny tři číslicové obvody sloužící jako paměť programu a paměť dat.
Jako paměť programu je navržen obvod AT29F040 firmy ATMEL, což je FLASH 512K x 8 s přístupovou dobou 90 ns uložená v pouzdru PLCC32. Obvod bude usazen v patici PLCC32Z. Struktura zapojení vývodů umožňuje poměrně jednoduchou výměnu na obdobné obvod jiných firem se stejnou velikostí paměti nebo na obvody s menší velikostí paměti jako 29C020-12JC (256Kx8), 29C010-12JC (128Kx8) a další. Nutnou podmínkou pro správnou činnost mikroprocesoru je připojení paměti se sektory o maximální velikosti 4096 bajtů. To z důvodů způsobu programování a odlaďování pomocí prostředí Dynamic C a následných možných úprav obsahu paměti FLASH za běhu programu. Výpis kompatibilních typů pamětí je možné nalézt ve firemní literatuře, viz. [3].
Na patici paměti FLASH jsou přivedeny adresové signály A0 – A18. Při použití paměti s menším adresovým prostorem jsou přebytečné vývody nezapojeny. Pro volbu obvodu jsou z mikroprocesoru přivedeny signály CS0\, OE0\ a WE0\ na odpovídající vývody paměti.
Jako operační paměť (paměť dat) je navržen obvod HY628100, což je paměť typu SRAM o velikosti 128 kB od firmy Hyundai v pouzdru SOP 32L. Paměť je z mikroprocesoru aktivována signály CS1\, OE1\ a WE1\. Opět je možné použít kompatibilní typ jiného výrobce.
Dalším paměťovým obvodem připojeným k mikroprocesoru je sériová datová FLASH firmy Atmel AT45DBxxx sloužící zejména k uložení Java Appletu. Toto řešení bylo zvoleno z důvodů podstatného rozšíření Appletu během návrhu a také velmi špatné dostupnosti navržené paměti programu.
Konkrétně navržen je obvod AT45DB041, což je paměť velikosti 512 KB, ale je možné použít i jiné obvody vývodově a funkčně kompatibilní. Navržený obvod je použit v provedení pouzdra 8-SOIC. Sériová paměť FLASH komunikuje s mikroprocesorem pomocí synchronního sériového portu B. Je připojena pomocí signálů vstupu SI (na Rabbitu připojen k PC4), výstupu SO (PC5), hodinových pulsů (PB0), volby obvodu /CS (PB7) a napájecích signálů. Obvody této řady od firmy Atmel jsou napájeny napětím 3,3 V (rozsah 2,7 V až 3,6 V), proto je potřeba zajistit snížení napětí. K tomuto účelu je před vlastní paměť zařazen stabilizátor napětí LE33CD (obvod v pouzdru SO-8), který zajišťuje na výstupu stabilizované napětí 3,3 V. Pro správnou funkci jsou na vstup i výstup stabilizátoru připojeny kondenzátory. K opětovnému převodu výstupního signálu na úroveň 5 V je použit unipolární tranzistor jehož pracovní bod je nastaven dvěma rezistory. Výstup obvodu je třeba vzhledem k zapojení v mikroprocesoru softwarově invertovat. Vstupní vývody jsou k paměti zapojeny bez napěťové konverze, jelikož obvod toleruje vstupní napětí o velikosti 5 V. Celé zapojení sériové paměti s příslušejícími obvody je realizováno na samostatné desce plošných spojů s vývody na dvouřadý konektor PINHEAD s roztečí 2,54 mm. Obdobně jsou připojeny i signály na základní desce s mikroprocesorem.
Testovací vývody byly zařazeny z důvodů snadnějšího oživování. Jedná se o jednořadé konektory PINHEAD s roztečí 2,54 mm, k nimž se může připojit sonda logického analyzátoru nebo osciloskopu. Na tyto konektory jsou vyvedeny důležité řídící signály z Rabbita, datové signály a některé adresové signály.
S přístrojem A2000 komunikuje Rabbit prostřednictvím sériové linky RS232. K oddělení a přizpůsobení úrovní signálů mezi logikou mikroprocesoru a přenosovými impulsy pro RS232 slouží obvod MAX232. To je integrovaný obvod v pouzdru DIL16. K němu jsou pro správnou funkci zapojeny ještě kondenzátory. Pro snadné spojení, například pomocí klasického sériového kabelu (LapLink), je jako konektor použit CANON – vidlice do plošného spoje s devíti vývody.
K rozhraní Ethernet je Rabbit připojen přes ethernetový řadič Realtek RTL8019AS. To je SMD součástka se 100 vývody v pouzdru QFP100. Ze strany mikroprocesoru jsou k ní přivedeny adresové (A0 – A4) a datové signály a dále signály PE0, PE1, PE6 a PE7. Toto zapojení podporují knihovny s funkcemi pro TCP-IP protokol a HTTP server. Obvod je taktován oscilátorem Q1 s kmitočtem 20 MHz a tento je s rezistorem R5 a kondenzátory C6 a C7 přiveden na vývody X1 a X2. Z řadiče jsou vyvedeny dvě indikační diody pro signalizaci přenosu dat. Dále je připojena sériová paměť typu EEPROM (obvod 93C46), která slouží k uchování IP adresy. Signály TPIN+,TPIN-,TPOUT+ a TPOUT- jsou přivedeny na ethernetový transformátor FA163079 a z něj na konektor K1, což je zásuvka WEBP8-8 pro osmipinový konektor RJ-45 na kroucený kabel. Jedná se tedy o standardní připojovací rozhraní. U této části obvodu je možné provést náhradu za konektor, který má transformátor integrován v sobě.
Jedná se o zapojení některých vývodů z mikroprocesoru na konektor pro spojení se sériovým portem PC. Tímto se zprostředkovává komunikace mezi prostředím mikroprocesoru a platformou „Dynamic C“ v níž je vytvářen program na PC. Signály jsou vyvedeny na standardní 10-ti vývodový konektor s roztečí 2,54 mm s označením PINHEAD 2x5 a dále na obdobný konektor s roztečí 2 mm. Pomocí tohoto připojení může PC komunikovat s cílovým zařízením (např. nahrát program), provést reset a reboot.
Standardně programovací port využívá sériového portu A. Pokud ovšem potřebujeme využít sériový port A v uživatelské aplikaci, máme možnost využít alternativních vývodů. Vyvedené signály jsou tedy PC7, PB1, /RESET, SMODE0, SMODE1, STATUS a PC6.
Na napájecí vstup je třeba přivést stejnosměrné napětí 8,5 V až 30 V. To je stabilizováno na vnitřní napájecí napětí Vcc = 5V pomocí stabilizátoru 7805, diody 1N4007, fóliového kondenzátoru 330 nF, dvou elektrolytických kondenzátorů 100 nF a jednoho keramického kondenzátoru 100 nF. Obvod mikroprocesoru a ethernetového řadiče mají ve schématu vyvedeny napájecí vývody jako samostatné brány umístěné v této části schématu. Pamět SRAM a obvod MAX232 mají také napájecí vývody samostatné, ale jsou umístěny ve schématu v těsné blízkosti těchto součástek. K ostatním součástkám je napájení přivedeno přímo. Ke každému napájecímu vstupu integrovaných obvodů ve schématu se mezi napájecí napětí Vcc a uzemnění GND zařadí kondenzátor 100 nF. Pro indikaci přivedeného napájení Vcc je použita LED dioda.
Tato část schématu má několik funkcí. Základní součástkou je zde integrovaný obvod TL7705A skrze něj jsou zprostředkovány všechny požadavky na reset mikroprocesoru. Dále se zde nachází tlačítko pro uživatelský reset a pasivní součástky pro zajištění funkčnosti integrovaného obvodu. Jako vstupní signál je přiveden požadavek na reset z programovacího konektoru a výstupem je signál /RESET pro Rabbit. Obvod TL7705A má několik funkcí:
· „Power-On Reset Generator“ nebo-li generátor signálu /RESET při náběhu systému. Tato činnost je následovná. Po připojení napájecího napětí se při určité jeho úrovni vystaví žádost o reset. Až dosáhne napájecí napětí další úrovně (v našem případě cca 4,5V) je spuštěno časování a po jeho uplynutí je signál /RESET zrušen. Tím je zaručen počáteční reset obvodu.
· Automatický reset při poklesu napětí. Pokud poklesne napětí pod určitou minimální přípustnou mez, je proveden reset. Pokud se napětí vrátí do přípustných mezí je opět spuštěno časování a až následně zrušen resetovací signál. Tímto se zajistí, aby při nebezpečném napájecím napětí nedocházelo k náhodným jevům v systému.
· Pulsní úprava externích žádostí o reset. Tím se zajistí úprava tvaru signálu, který je přiveden na vstup /RESIN a má se následně promítnout na signál /RESET. Takto je tedy zapojeno resetovací tlačítko a externí reset z programovacího portu.
· Obvod má dále možnost výstupu jak negativní tak positivní úrovně signálu reset. V našem případě je využita jen negativní úroveň, protože ji vyžaduje Rabbit. Také dokáže pracovat v širokém rozsahu napájecího napětí (3,5 až 18 V), při kterém zajistí svoji funkci.
Návrh desky plošných spojů je proveden v programu Eagle 4.0 a vychází z již popsaného schématu. V této návrhové fázi nejsou kladeny požadavky na rozměry desky. Tato má sloužit jako prototyp k odladění a ověření funkčnosti jak hardwaru tak i softwaru a poté se předpokládá přepracování do profesionální podoby pro sériovou výrobu (pravděpodobně čtyřvrstvá deska s SMD součástkami).
Pro danou realizaci je tedy použit návrh na oboustrannou desku plošných spojů osazenou jak klasickými součástkami (s vývody skrz desku) tak součástkami SMD což jsou součástky k povrchové montáži na desku plošného spoje.
Pro snadnou vyrobitelnost desky je návrh dále proveden dle následujících požadavků:
· minimální šířka spojů a mezer 0,28 mm
· minimální otvor prokovu (Drill) 0,7 mm
· minimální ploška prokovu (Diameter) 1,4 mm
Dále je třeba brát v úvahu některá další praktická hlediska pro návrh. Například při návrhu byla využita snaha na jednu stranu desky umístit především vertikální spoje a na druhou stranu spoje horizontální. Dále bylo třeba zajistit, aby blokovací kondenzátory byly co nejblíže příslušné napájecí dvojici VCC a GND. Také obvody oscilátorů je třeba pro správnou funkci umístit blízko příslušných součástek (resp. příslušných vývodů) a totéž platí pro jednotlivé součástky těchto obvodů. K dalším hlediskům patří umístění součástek a spojů do mřížky a zalomení spojovacích cest nejlépe v úhlu 45°. Desce bylo přiděleno jméno „Rabbit TCP/IP board“, které je na ní také vypsáno.
Dle těchto předpokladů byl vytvořen návrh v programu Eagle 4.0. Ze schématu vytvořeného také v programu Eagle byla vygenerována deska s náhledy pouzder a rozmístěním vývodů součástek. Samotné propojení spojovacích cest a konkrétní rozmístění součástek muselo být provedeno ručně.
V příručce k mikroprocesoru Rabbit „Designer’s Handbook“ je popsán doporučený postup při oživování systémů založených na bázi Rabbita, který byl použit i v této práci. Jedná se několik testů a drobných měření, kterými se má návrhář přesvědčit o funkčnosti mikroprocesoru, programovacího portu, paměti RAM atd.
Následující kontrola mikroprocesoru se provádí při aktivním signálu /RESET, tedy na vstupu resetu do Rabbita musí být cca 0 V.
· S voltmetrem se proměří přítomnost napětí +5V nebo dalších přípustných hodnot operačního napětí na vývodech 3, 28, 553, 78, 92 a 42. Obdobně nulové napětí kontrolujeme na vývodech 2, 27, 39, 52, 77 a 89.
· S osciloskopem ověříme správnou funkci oscilátoru 32,768 kHz na vývodu 41 (XTALA2). Musí být naměřen správný oscilační kmitočet.
· S osciloskopem zkontrolujeme hlavní systémový oscilátor proměřením signálu CLK (vývod 1).
Tento test předpokládá připojení programovacího kabelu na programovací port Rabbita. Potom je postup následující:
1. Aktivovat signál /RESET na nejméně ¼ sekundy a poté jej uvolnit
2. Při studeném startu poslat po sériovém portu A následující trojice znaků:
80 0E 20 // nastaví vývod STATUS na log. 0
80 0E 30 // nastaví vývod STATUS na log. 1
80 0E 20 // nastaví vývod STATUS opět na log. 0
3. Čekat přibližně ¼ sekundy a potom opakovat postup z bodu 1
Během spuštěného testu pozorujeme osciloskopem výsledek. Je možné takto ověřit funkci mikroprocesoru (správné nastavování vývodu STATUS) a především přenos dat po programovacím kabelu. Osciloskop můžeme spouštět náběžnou hranou signálu reset. Potom je možné sledovat přenos dat na vstup RXA procesoru. Každý přenášený bajt obsahuje 8 datových bitů před nimiž je start bit (nízká úroveň signálu) a za nimiž následuje stop bit (vysoká úroveň signálu). Datové bity jsou ve vysoké úrovni pro log. 1 a v nízké úrovni pro logickou 0.
Tento test ověří funkčnost paměti RAM připojené k signálům /CS1, /OE1 a /WE1. Po vyvolání resetu se pošle následující sekvence trojic bajtů. Posláním poslední trojice se aktivuje start programu od adresy 0 v paměti RAM.
80 14 05 // vybere paměť RAM jako aktivní
80 09 51 // připraví watchdog k nečinnosti
80 09 54 // přestane používat časovač watchdogu
// následující sekvence zapisuje program do paměti
00 01 21 // první dva bajty udávají adresu paměti
00 02 01 // a třetí bajt udává data, která se mají do paměti zapsat
00 02 00
00 04 06
00 05 10
00 06 7E
00 07 29
00 08 10
00 09 FC
00 0A C3
00 0B 00
80 24 80 // přeruší bootstrap a spustí program na adrese 0
Vlastní program v assembleru má následující tvar:
ld hl,1 ;počáteční nastavení pro adresu
ld b,16 ;počet cyklů
loop: ld a, (hl) ;do akumulátoru načte obsah paměti s adresou v hl
add hl,hl ;posune výše adresový signál
djnz loop ;opakuje smyčku do vynulování reg. b
jp 0 ;celý program opakuje od začátku
Tímto způsobem můžeme prověřit prvních 16 adresových signálů, ovšem předpokládá se funkčnost všech datových signálů, aby program pracoval správně.
Ke správné činnosti obvodu Realtek RTL8019AS je třeba naplnit připojenou sériovou EEPROM potřebnými údaji nutnými pro základní činnost. V této sériové paměti jsou uloženy některé konfigurační informace použité jako výchozí po resetu řadiče, avšak povinným údajem je MAC adresa řadiče. Tato adresa (MAC = medium access control) je základním předpokladem správné komunikace síťových zařízení. Pro každé zařízení je jedinečná a výskyt dvou stejných adres by způsobil kolizi daných zařízení připojených k síti.
Příslušná MAC adresa byla pro testovací účely okopírována z modulu TCP/IP Development Kit za předpokladu, že pro provoz s připojením do sítě Internet musí být získána konkrétní jedinečná adresa. K vlastnímu uložení do paměti EEPROM byl použit program „eeprom_init.c“ volně šiřitelný na Internetu.
Po úspěšném provedení základního oživovacího postupu a odstranění nalezených nedostatků v zapojení je dalším krokem ověření propojení desky s prostředím Dynamic C na PC. Pomocí něj je možné již překládat, nahrávat a odlaďovat rozsáhlejší programy psané v jazyku C (resp. ve variantě tohoto jazyka).
Dynamic C se ihned po spuštění pokusí detekovat přítomnost mikroprocesoru Rabbit. Pokud je funkční deska s Rabbitem připojená programovacím kabelem k PC, tak dojde k nahrávání BIOSu do paměti Rabbita. To má několik fází. Nejprve je rychlostí 2400 bps poslán zaváděcí program v bootstrap módu pomocí trojic bajtů. Tento program je po resetu spuštěn a umožní nahrání pilotního BIOSu rychlostí 57 600 bps (tato rychlost je podporována až od verze Dynamic C 7.05). Pilotní BIOS je opět spuštěn a umožní nahrání BIOSu, který je zkompilován prostředím Dynamic C dle nastavení uživatele. Po této fázi obdržíme na PC hlášení o úspěšném zavedení systému do desky s Rabbitem. Následné uživatelské programy jsou nahrávány rychlostí 115 200 bps.
Činnost navržené desky byla ověřena pomocí několika různých programů ze sady ukázkových příkladů k prostředí Dynamic C.
Program „ucospong.c“ využívá operační systém reálného času uC/OSII, pomocí něhož definuje několik úloh. Jedna z nich pravidelně vypisuje stav hodin reálného času a další provádějí ukázkové zobrazení pomocí standardního výstupu.
Program „echochr.c“ vrací nazpět znaky přijaté po sériové lince RS 232C. Tím bylo provedeno testování rozhraní pro následný styk s přístrojem A2000.
Program „static.c“ slouží jako jednoduchý http server zobrazující statickou HTML stránku. Takto se prověřila správná funkce ethernetového rozhraní.
Další ověření probíhalo již při samotném vývoji a testování aplikačního softwaru.
.
Ke správné činnosti navrhovaného rozhraní A2000 – Ethernet je potřeba vybavit mikroprocesor Rabbit odpovídajícím softwarem. Ten má plnit několik funkcí:
· Komunikace s přístojem A2000 po asynchronní sériové lince RS 232C
· Provoz http serveru s patřičným uživatelským obsahem
· Komunikace s uživatelským Java Appletem
· Provoz FTP serveru pro možnost záměny obsahu poskytovaného HTTP serverem
K zajištění všech požadovaných funkcí v reálném čase a možnosti multitaskingu bylo zvoleno použití operačního systému reálného času uC/OSII dodávaného v rámci vývojového prostředí Dynamic C. Tento operační systém umožňuje nadefinování úloh s potřebnými prioritami, jejich spuštění a následné řízení.
Jednotlivé úlohy mají určenu prioritu číslem a dvě úlohy nemohou mít stejnou úroveň priority. Tato priorita se určuje při definování jednotlivých úloh, ale lze ji měnit i za běhu operačního systému. Nižší číslo odpovídá vyšší prioritě. Úlohu vytvoříme následovně:
INT8U OSTaskCreate (void (*task)(), void *pdata, INT16U
stk_size, INT8U prior);
kde: task je ukazatel na startovací adresu úlohy
pdata je ukazatel na inicializační parametry úlohy
stk_size je velikost zásobníku pro úlohu
prior je jedinečné číslo udávající prioritu
Návratovou hodnotou je chybový kód.
Předávání strojového času musíme zajistit tak, že v rámci úlohy s vyšší prioritou definujeme časovou prodlevu (jakési vnitřní přerušení úlohy) během níž jsou dle svých priorit vykonávány úlohy zbývající. Jakmile časová prodleva vyprší jsou procesy s nižšími prioritami přerušeny a řízení je předáno původní úloze dokud opět nebude povolena prodleva. Prodlevu můžeme definovat buď pomocí klasického časového úseku v hodinách, minutách, sekundách a milisekundách nebo pomocí násobku tzv. TICKů. V rámci operačního systému reálného času máme možnost definovat rychlost s jakou bude prováděno přerušení úloh hlavní rutinou systému. To se definuje jako počet TICKů za 1 sekundu a standardní nastavení je 64. Oba způsoby prodlevy vypadají následovně:
void OSTimeDly (INT16U ticks);
INT8U OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U
seconds, INT16U milli);
kde příslušné významy jsou patrné z názvů. Ve druhém případě funkce vrací chybový kód a skutečné trvání prodlevy je zaokrouhleno na nejbližší hodnotu TICKů za sekundu.
Potřebujeme-li opustit úlohu z nižší prioritou za účelem návratu k úloze s prioritou vyšší, můžeme využít funkci, která předá řízení nazpět:
INT8U OSTimeDlyResume (INT8U prio);
kde prio udává prioritu úlohy které chceme předat řízení a návratovou hodnotou je chybový kód.
Samotné spuštění operačního systému je provedeno funkcí:
void OSStart ();
Pro snadnější komunikaci přes sériové porty, obsahuje Dynamic C knihovnu RS232.LIB s potřebnými funkcemi pro přenos jednotlivých znaků či celých bloků dat. U sériových portů v asynchronním režimu lze nastavit použití žádné, sudé či liché parity, sedmi nebo osmibitový formát a jeden nebo dva stop-bity. V případě komunikace s přístrojem A2000 je třeba použít osmibitový formát se sudou paritou a jedním stop-bitem. Potřebné funkce pro nastavení při použití sériového portu D vypadají následovně:
void serDparity(int state);
kde state nabývá hodnot PARAM_OPARITY
PARAM_EPARITY
PARAM_2STOP
PARAM_NOPARITY
void serDdatabits(int state);
kde state nabývá hodnot PARAM_7BIT
PARAM_8BIT
int serDopen(long baud);
je funkce pro otevření sériového portu s komunikační rychlostí baud
void serDclose();
naopak slouží k uzavření portu.
Definicemi hodnot DINBUFSIZE a DOUTBUFSIZE nastavíme velikost vyrovnávacích pamětí pro příjem či odesílání. Hodnoty musí mít velikost .
Pro vlastní blokový přenos dat (vysílání a příjem) slouží následující funkce:
int serDwrite(void *data, int length);
int serDread(void *data, int length, unsigned long tmout);
kde *data je ukazatel na blok dat, do kterého se zapisuje při příjmu nebo se z něj vyčítá při odesílání.
length je počet bajtů, které chceme přijmout nebo odeslat.
tmout je doba v milisekundách mezi dvěma příchozími bajty, za kterou se ukončí příjem, i když není načten potřebný počet bajtů.
Návratové hodnoty jsou potom skutečný počet přijatých nebo odeslaných bajtů.
Potřebujeme-li vyprázdnit příchozí nebo odchozí vyrovnávací paměť daného sériového portu máme možnost použití následujících dvou funkcí.
void serDwrFlush();
void serDrdFlush();
První funkce je pro odchozí vyrovnávací paměť, druhá pro příchozí.
Další z knihoven v prostředí Dynamic C slouží k zajištění funkcí HTTP serveru. Existují dvě možnosti, jak provést patřičné asociace souborů uložených v pamětech Rabbita s HTTP serverem. První je použití struktury HttpSpec zaimplementované přímo v knihovně serveru. Druhou možností, v programu využitou, je použití struktury ServerSpec z knihovny ZSERVER.LIB. Tímto umožníme přístup k souborům jak HTTP severu tak FTP serveru. Funkce pro práci s touto strukturou budou popsány dále.
Pro inicializaci paketového ovladače použijeme funkci:
int sock_init();
Inicializaci HTTP serveru pak provedeme následující funkcí:
int http_init(void);
která při úspěšném provedení vrací hodnotu 0.
Pro HTTP server je dále třeba provést rezervaci využívaného portu č. 80 a to následovně:
word tcp_reserveport(word port);
Po těchto krocích již stačí pravidelně volat funkci, která zajišťuje pasivní řízení serveru:
int http_handler(void);
Pokud chceme komunikovat aktivně např. s CGI funkcí pomocí metody POST musíme zajistit patřičnou obsluhu událostí plynoucích ze získaných parametrů, které HTTP server předá funkci. Tento postup bude popsán v kapitole 8.4.2.
Vlastní výkonné funkce FTP serveru jsou obsaženy v knihovně FTP_SERVER.LIB. Z této se pak mnohé operace jako čtení či zápis souborů a získání potřebných informací o uložených souborech odkazují na knihovnu ZSERVER.LIB. Soubory používané pro FTP server mají pouze jedinou možnost asociace a to právě přes strukturu ServerSpec. Inicializace FTP serveru je pak obdobná jako u HTTP serveru. Nejprve se musí aktivovat paketový ovladač, potom případně rezervovat port č. 21 a provést vlastní inicializaci FTP serveru:
void ftp_init(FTPhandlers *handlers);
kde *handlers je ukazatel na funkce obsluhující jednotlivé příkazy z terminálu. Pokud je hodnota NULL, použijí se standardně definované funkce v rámci knihovny FTP_SERVER.LIB.
Dále je třeba provádět periodické volání obsluhy funkcí:
void ftp_tick(void);
Jak již bylo popsáno, slouží tato knihovna k propojení FTP a HTTP serverů tak, že jim umožňuje sdílet soubory definované ve struktuře ServerSpec.
Přidání souboru uloženého v sériové paměti do struktury se provede následovně:
int sspec_addsf1000file(char* name, byte filenum, word
servermask);
kde *name je ukazatel na řetězec znaků se jménem souboru
filenum je označení pozice souboru v sériové paměti Flash
servermask udává servery, se kterými budou soubory asociovány.
Položka servermask může nabývat předdefinovaných hodnot SERVER_FTP, SERVER_HTTP a SERVER_USER. Dále byla dodefinována hodnota SERVER_BOTH jako logický součet hodnot serverů HTTP a FTP.
Výše popsaná funkce byla do knihovny doplněna, protože ta dříve neobsahovala potřebné rozhraní pro práci se sériovou pamětí FLASH. Naopak obsahuje obdobné asociační funkce pro soubory uložené v základní (root) či rozšířené (xmem) paměti a nebo v souborovém systému FS (file system). Dále je možné asociovat funkce a proměnné, což ovšem není v této práci využito.
Pro odstranění asociace souboru ze struktury ServerSpec se použije následující funkce:
int sspec_remove(int sspec);
kde sspec je číslo asociace ve struktuře. To je třeba nejprve určit další vyhledávací funkcí, proto je v našem případě výhodnější použít funkci, která odstraní všechny záznamy daného typu:
int sspec_removebytype(int type);
kde type udává typ souboru např. SF1000FILE.
Dále obsahuje knihovna funkce pro načtení části souboru nebo zjištění délky souboru, atd. Tyto funkce jsou využity například knihovnami HTTP serveru a FTP serveru. Protože však nejsou využity přímo v navrhovaném softwaru, nebudou zde podrobněji popsány.
Pro komunikační metodu POST, která zajišťuje předávání dat mezi HTTP serverem a klientem je třeba vytvořit protokol, který bude dbát na správný význam jednotlivých přenášených položek.
Data jsou při použití metody post přenášena ve tvaru:
název_parametru1=hodnota1&název_parametru2=hodnota2&…,
kde
znak & je oddělovač jednotlivých položek, které představují parametry pro
CGI program (skript) vykonávaný na HTTP serveru. Stačí nám tedy definovat
posloupnost jednotlivých parametrů a jejich význam. Tento význam musí být
shodně interpretován jak na straně HTTP serveru, tak i na straně klienta, proto
přesná struktura významů parametrů vznikla společně s navazující prací
„Web server pro přístroje A2000“ studenta Jiřího Procházky, v níž je
navržen jak HTTP server, tak i Java Applet, který zajišťuje klientskou
stranu komunikace.
První parametr query (dotaz) je tzv. řídící parametr, který rozděluje typ přenášeného dotazu do tří skupin:
· Inicializační (init)
· Konfigurační (get_config, set_config)
· Měřené veličiny (measured_values)
Dle těchto skupin je dále určen význam následujících parametrů. Parametr query může nabývat hodnot uvedených v závorce za položkami seznamu. Zápis pro získání konfigurace pak vypadá následovně:
query=get_config&...
Tyto parametry jsou použity k provedení základních inicializačních a testovacích procedur přístroje A2000, popř. k dalším nastavením přístroje A2000 nebo komunikačních parametrů programu. Jsou určeny parametrem query, který následuje po parametru proc a mohou být následující:
· Is_OK - testuje základní připravenost přístroje
· Reset_Instrument - provádí základní inicializaci přístroje
· Reset_All - provede zákl. inicializaci a smazání trvalých hodnot
· Reset_Memories - provede smazání trvalých měř. hodnot přístroje
· Get_Comparam - zjistí aktuální parametry komunikace s přístrojem
· Set_Comparam - nastaví tyto parametry (rychlost v baudech a adresa)
· Start_Logger - spustí záznam dat do paměti přístroje
· Stop_Logger - ukončí záznam dat do paměti přístroje
V případě nastavení komunikačních parametrů následují další předávané parametry s hodnotami a to address a baudrate. Ostatní volby jsou bez dalších parametrů. Například základní inicializace se provede následovně:
query=init&proc=Reset_Instrument
Tyto parametry slouží pro získání aktuálního stavu konfigurace nebo pro změnu nastavení. Pro získání konfigurace slouží hodnota get_config a pro nastavení nové hodnota set_config parametru query. Po něm následuje parametr hardware, který může nabývat následujících hodnot:
· relay_1, relay_2 – pro konfiguraci relé
· input – pro konfiguraci vstupů
· pulse_out_1, pulse_out_2 – pro konfiguraci pulsních výstupů
· display – pro nastavení displaye
· analog_out_1, ... , analog_out_4 – pro konfiguraci analogových výstupů
· logger – pro konfiguraci zapisovače
· rtc – pro nastavení hodin reálného času
Při vyčítání aktuální konfigurace se již neuvádějí žádné další parametry. Při nastavování je třeba uvést ještě parametry s hodnotami jednotlivých konfiguračních údajů:
· pro relé – source, limit, level, hystereze, store
· pro vstupy – line_type, primary_U, secondary_U, primry_I, secondary_I, synch_input
· pro pulsní výstupy – source, energy_unit, type, pulses
· pro display – brightness
· pro analogové výstupy – source, output_type, range_lo, range_hi
· pro zapisovač – interval, time, start_mode, ext_run, pre_run, write_mode, channel_1 ... channel_10
· pro hodiny – seconds, minutes, hours, day, month, year, millenium
Parametry je třeba uvádět v naznačeném pořadí a v tomtéž pořadí jsou vráceny zpět při dotazu na aktuální hodnoty konfigurace. Následuje příklad pro zápis konfigurace hodin reálného času.
query=set_config&hardware=rtc&seconds=2&minutes=11&hours=14&day=12&month=5&year=2&millenium=20
Pro
získání měřených veličin je třeba k parametry query uvést hodnotu measured_values.
Poté následuje seznam veličin, které požadujeme. Příslušná hodnota odpovídající
měřené veličině je vždy připojena k parametru magnitude. Pokud chceme
získat všechny měřené veličiny, bude parametr magnitude obsahovat
hodnotu all.
Následuje
výčet hodnot odpovídající jednotlivým měřeným veličinám:
U1,
U2, U3, U1_max, U2_max, U3_max, U12, U23, U31, U12_max, U23_max, U31max, I1,
I2, I3, I1_max, I2_max, I3_max, I1_avg, I2_avg, I3_avg, I1_avg_max, I2_avg_max,
I3_avg_max, P1, P2, P3, P_sum, P1_max, P2_max, P3_max, P_sum_max, Q1, Q2, Q3,
Q_sum, Q1_max, Q2_max, Q3_max, Q_sum_max, S1, S2, S3, S_sum, S1_max, S2_max,
S3_max, S_sum_max, PF1, PF2, PF3, PF_sum, PF1_max, PF2_max, PF3_max,
PF_sum_max, P_int_sum, Q_int_sum, S_int_sum, Freq.
Příklad zápisu pro získání všech měřených veličin:
query=measured_values&magnitude=all
Pro práci se sériovou pamětí FLASH, označovanou jako DataFLASH, slouží knihovna SF1000.LIB. Tato dále spolupracuje s knihovou SPI.LIB pro použití standardního sériového komunikačního přístupu definovaného jako SPI. Knihovna SF1000 obsahuje pro uživatele jen funkce pro inicializaci paměti, čtení a zápis dat z příslušného místa nebo mazání bloků dat. Proto musela být vytvořena koncepce ukládání souborů a jejich odkazů v návaznosti na další funkce a knihovny, které budou s těmito soubory dále pracovat.
V hlavním programu je možné definovat velikost tabulky souborů. Tato se určuje v násobcích paměťových stránek o velikosti 256 bajtů. Každá stránka dokáže uchovat záznam až o osmi souborech, přičemž jejich jména můžou být dlouhá 20 bajtů.
Po spuštění programu je provedena inicializace paměti DataFLASH, která kontroluje tabulku záznamů a najde-li uložené soubory, asociuje je se strukturou ServerSpec pro servery HTTP a FTP. Soubory jsou ukládány kontinuálně za sebe. Jednotlivý soubor nelze přepsat. Vymazat lze jen všechny soubory. Potom je možné libovolně nahrávat soubory nové, dokud se nevyčerpá kapacita paměti nebo tabulky souborů. Tato omezení byla zavedena vzhledem k předpokládanému jednoduchému a jednoúčelovému využití paměti DataFLASH.
Pro možnost použití HTTP serveru s adresou bez přesné specifikace stránky je provedena asociace jména „\“ k prvnímu soubory uloženému v paměti DataFLASH. Proto prvním souborem by měla být HTML stránka (např. index.html, ale na jménu nezáleží) s dalšími potřebnými odkazy, resp. zajišťující spouštění Java Appletu.
Program je realizován v prostředí Dynamic C, za pomoci výše popsaných prostředků zahrnujících funkce standardně obsažené v dodávaných knihovnách a nově vytvořených komponent. Tyto jazykové komponenty (funkce, proměnné, konstanty, struktury a definice) jsou obsaženy zejména v hlavním programovém modulu, ale také byly doplněny do původních knihoven. Veškeré změny provedené v původních knihovnách jsou popsány v kapitole 8.5.
Jádrem programu je operační systém reálného času se dvěma úlohami, čímž je zajištěn paralelní, resp. pseudo-paralelní běh jednotlivých částí. Na začátku každé úlohy jsou provedeny potřebné inicializační úkony a poté je zbytek kódu uzavřen do nekonečné smyčky:
while(1) {
... kód úlohy...
}
V první úloze (s vyšší prioritou) je realizována část komunikace s přístrojem A2000. Z důvodu nutného předávání řízení úloze s nižší prioritou je provádění rozděleno do malých úseků zajišťujících zpracování vždy jen jedné či několika málo komunikačních zpráv. Tento časový multiplex je zajištěn pomocí následující konstrukce:
switch(sercomstate) {
case 0:
...
case n:
default:
}
kde globálně definovaná proměnná sercomstate určuje, která část se bude vykonávat. Tato proměnná je nastavována buď v jednotlivých výkonných úsecích nebo z vnějšku této úlohy např. dle požadavků Java Appletu.
Před nekonečnou smyčkou je inicializována sériová komunikace otevřením portu na počáteční komunikační rychlosti 19200 baudů a nastavením sudé parity. Poté jednotlivé části komunikace využívají volání funkcí, které jsou umístěny mimo její vlastní kód. Tyto slouží např. pro odeslání nebo příjem zprávy, popř. zpracování přijatých dat. Většina úprav s přijatými daty, jako je převod na znaménková čísla nebo násobení konstantami, se však provádí přímo v dané části komunikační úlohy. Ukázka typické části úlohy:
case 1: {
if (n=ReceiveAnswer(FullRec, Comparam.address, 0x32,
&DataSerCom))
{
KU =
DataSerCom[1];
if (KU
> 127) KU = (256 - KU)*-1;
KI =
DataSerCom[2];
if (KI
> 127) KI = (256 - KI)*-1;
KP =
DataSerCom[3];
if (KP
> 127) KP = (256 - KP)*-1;
KE =
DataSerCom[4];
if (KE
> 127) KE = (256 - KE)*-1;
com_error
= 0;
SendContRec(Comparam.address, 0x89, 0x00);
sercomstate++;
break;
}
else
{
com_error
= 1;
sercomstate=0;
break;
}
}
Tato část se bude provádět v případě, že proměnná sercomstate zajišťující časový multiplex nabývá hodnoty 1. Potom je přijata zpráva z přístroje A2000 (žádost o vyslání zprávy s příslušným obsahem byla vystavena na konci předcházející části, tedy pro sercomstate = 0) využitím funkce ReceiveAnswer. Pokud byla přijata odpovídající data, je provedeno jejich zpracování, nastavení příznaku chyby com_error na hodnotu nula, odeslání žádosti o další data funkcí SendContRec, zvýšení proměnné sercomstate na další komunikační část a opuštění multiplexu příkazem break. Pokud byla obdržena špatná data, je příznak chyby nastaven na 1, provádění komunikačních částí na začátek a opět odskok.
Jakmile opustí tok programu části komunikačního multiplexu, dostává se na konec smyčky while(1) {...}, kde je provedeno předání řízení úloze s nižší prioritou na dobu 40 ms.
Skladba komunikačních částí je následující (hodnoty proměnné sercomstate):
· 0 – 15: Vyčítání měřených dat. Prováděno neustále cyklicky, aby v proměnných uchovávajících tato data byly vždy nejnovější údaje.
· 20 – 46: Vyčítání nebo nastavování konfiguračních hodnot přístroje A2000. Vždy je provedena jen daná část nastavující konkrétní parametr a nastaven návrat na začátek komunikačního multiplexu.
· 50: Tato část je výjimečná tím, že provádí změnu komunikační rychlosti a adresy přístroje A2000. Proto je v ní uzavřen sériový port a následně otevřen s novým parametrem.
· default: Pouze nastaví provádění na počátek.
Druhá úloha (s prioritou 2) obsluhuje HTTP server a FTP server. Je velice krátká, jelikož veškeré úkony zajišťují buď původní knihovní funkce nebo nově vytvořené funkce nacházející se mimo tělo této úlohy. Vypadá následovně:
nodebug void Servers(void*
pdata){
int i;
sock_init();
http_init();
ftp_init(NULL);
tcp_reserveport(80);
for (i=0; i<74; i++)
measured_values[i] = 0;
while (1) {
http_handler();
ftp_tick();
}
}
Na začátku je provedena inicializace síťových funkcí protokolu TCP/IP. Následně jsou inicializovány proměnné uchovávající měřené veličiny a pak již probíhá jen pravidelné volání funkcí pro obsluhu HTTP serveru a FTP serveru.
Pro obsluhu požadavků od klienta, které mají účel změny nastavení měřícího přístroje, získání měřených hodnot atd. slouží komunikační metoda POST. K její interpretaci je nutné doplnit stávající funkce HTTP serveru o vlastní funkci, resp. CGI skript, na nějž jsou požadavky odkazovány. Tento musí zajistit jejich správnou interpretaci, v případě chybné komunikační metody (např. GET místo POST) nebo jiné chyby při síťové komunikaci vystavit odpovídající zprávu klientovi a konečně správně obsloužit klientské požadavky. V našem případě se správným obsloužením rozumí např. zaslání hodnot měřených veličin, stavu konfigurace nebo provedení změn ve stávající konfiguraci měřícího přístroje A2000.
Samotné vykonání CGI funkce, konkrétně funkce a2000.cgi je z důvodů rovnoměrného rozložení času a včasného předávání řízení zpět obsluze HTTP serveru rozděleno na více částí konstrukcí switch – case. Zde je ovšem jako indikace stavu využita struktura http_state, resp. její podúrovně state a substate. Nejprve je provedena kontrola správnosti komunikační metody a při špatné metodě je odeslán chybový kód 501. Po ní následuje čtení dat a pokud proběhlo správně, je zjištěn počet parametrů získaných od klienta a tyto jsou převedeny do tabulky. Při chybném četní socketu je odeslán návratový kód 500. V tabulce je vždy na daném řádku název parametru a hodnota parametru, počet řádků odpovídá počtu přijatých parametrů.
Následně je volána funkce proces_table, která zpracuje požadavek a vytvoří odpověď pro klienta. Pokud proběhla v pořádku, je odeslán kód 200, jinak je odeslán kód 400. Tím je zpracování požadavku ukončeno.
Program obsahuje mnoho funkcí, které jsou využívány buď některou úlohou operačního systému reálného času nebo i vnější knihovnou. Následuje jejich stručný popis:
void send_message(HttpState* state, int state_code,
char* reply);
Posílá zprávu klientovi. Parametr state_code udává typ odpovědi serveru, *reply je ukazatel na řetězec znaků, které mají být odeslány a *state je ukazatel na strukturu HttpState, do jejíhož bufferu budou nakopírována data k odeslání.
char* format(char* buffer, int index);
Formátuje měřené veličiny na správný tvar k odeslání. Parametry jsou ukazatel na buffer k uchování formátovaných veličin a index požadované veličiny v tabulce měřených veličin. Návratovou hodnotou je ukazatel na upravenou veličinu v bufferu.
int process_table(int tokens, char* reply, HttpState*
state);
Funkce zpracovává požadavek klienta a připraví odpověď k odeslání. Parametr tokens udává počet parametrů v tabulce, *reply je ukazatel na buffer pro odpověď, *state je ukazatel na strukturu HttpState. Pokud vše proběhlo v pořádku vrací hodnotu 1, jinak 0.
int get_tokens(char* buffer);
Naformátuje požadavek klienta uložený v bufferu do tabulky dle jednotlivých parametrů. Vrací počet parametrů v tabulce.
int read_socket(HttpState* state, char* buffer);
Načte socket s požadavkem klienta do bufferu. Vrací počet načtených znaků nebo 0 pokud je vstup příliš dlouhý.
int InitDataFS(void);
Provede kontrolu sériové paměti FLASH na přítomnost souborů. Nalezené soubory asociuje se strukturou ServerSpec pro HTTP a FTP server. Vrací počet nalezených souborů.
int NewFileInTable(char *f_name);
Vytvoří v tabulce souborů záznam pro nový soubor a otevře jej k zápisu. Parametrem je ukazatel na jméno. Pokud je místo na záznam souboru v tabulce, je vrácena 0, jinak –1.
int WriteFileData(long fbegin, char*fdata, int
flength);
Zapisuje data to aktuálně otevřeného souboru. Parametr fbegin udává offset od počátku souboru, *fdata udává umístění zapisovaných dat a flength počet zapisovaných bajtů. Vrací hodnotu 0 (zápis v pořádku) nebo –1.
int ReadFileData(int file_number, long fbegin,
char*fdata, int flength);
Načte data ze souboru definovaného file_number. Ostatní parametry jsou stejné jako u předchozí funkce. Vrací počet načtených bajtů.
int EndOfWritingFile(long fsize);
Uzavře soubor, do kterého byl prováděn zápis a do tabulky doplní konečnou délku souboru. Parametrem je délka zapsaného souboru.
int DeleteFiles(char*f_name);
Smaže soubory uložené v sériové paměti FLASH, resp. záznamy v tabulce souborů a zruší asociace se strukturou ServerSpec. Pokud je jako parametr předáno slovo all, provede se smazání. Jinak se vrací funkce s hodnotou –1. Pokud již není co mazat také funkce vrací hodnotu –1. Při správném provedení vrací 0.
long GetLength(int file_number);
Vrací délku souboru udávaného parametrem file_number.
int ReceiveAnswer
(int MessType, int InstrumentAddress, int ParameterIndex, void* DataBlock);
Přijme zprávu z přístroje A2000. MessType udává o jaký typ zprávy se jedná, InstrumentAddress nastavenou adresu měřícího přístroje, ParameterIndex specifikaci zprávy a *DataBlock místo kam se budou ukládat načtená data. Funkce vrací počet načtených bajtů nebo záporné hodnoty jako chybové kódy.
int SendAbbRec (int InstrumentAddress, int
FunctionField);
Odešle zprávu Abbreviated Record do přístroje A2000. Vrací 0 při správném odeslání nebo 1 při chybě.
SendContRec (int
InstrumentAddress, int FunctionField, int ParameterIndex);
Odešle zprávu Control Record do přístroje A2000. Vrací 0 při správném odeslání nebo 1 při chybě.
int SendFullRec (int
InstrumentAddress, int FunctionField, int ParameterIndex, void* DataBlock, int
DBLength);
Odešle zprávu Full Record do přístroje A2000. Vrací 0 při správném odeslání nebo 1 při chybě. *DataBlock ukazuje na data k odeslání a DBLength udává počet bajtů, které se mají odeslat.
float tsqr(int pow);
Funkce vrací mocninu deseti. Mocnitel je parametr pow. Používá se při posunu řádových čárek.
unsigned char CodeSource(unsigned char Sour);
Zakóduje označení měřené veličiny udávané parametrem Sour do tvaru používaného u některých konfiguračních nastavení.
unsigned char DetectSource(unsigned int Sour);
Dekóduje označení měřené veličiny Sour na formát používaný web serverem.
V původních knihovnách prostředí Dynamic C byly provedeny některé změny, potřebné pro funkčnost programu. Část z nich by se dala přenést do hlavního programového kódu nebo do samostatné nově vytvořené knihovny, ale takto je dosaženo větší návaznosti, neboť provedené úpravy jsou jen rozšířením, které nijak neomezuje původní funkčnost knihoven. V některých případech tyto úpravy ani nelze umístit mimo původní knihovny. Zde jsou popsány změny, které byly v původním kódu provedeny a taktéž veškeré upravené knihovny jsou součástí příloh této práce.
Do knihovny byla doplněna funkce na mazání souborů. Tato ovšem spolupracuje jen se soubory uloženými v paměti DataFLASH. Dále bylo nutné doplnit z příslušných míst kódu odkazy na funkce, které vytváří nový soubor, zapisují jej a uzavírají. Tyto funkce se nacházejí v hlavním programovém kódu. Také muselo být odstraněno blokování ukládání nových souborů.
Do této knihovny musela být doplněna definice souborového typu SF1000FILE a definice použití systému souborů v paměti DataFLASH. Byla vytvořena nová funkce sspec_addsf1000file, která provádí asociaci souborů se strukturou ServerSpec pro použití se servery HTTP a FTP. Dále do funkcí pro práci se soubory (čtení, zjišťování velikosti, ...) musela být doplněna část, která se stará o návaznost na odpovídající funkce souborů v paměti DataFLASH.
Zde musela být doplněna definice pamětí s potřebnými velikostmi. Původně knihovna podporovala jen paměti o velikosti 32 a 64 Mb. Nyní podporuje i 1 Mb a 4 Mb paměti. Další zásahy nejsou nutné, jelikož veškeré funkce jsou psané univerzálně a paměti jsou navzájem kompatibilní.
Do této knihovny musel být doplněn jediný řádek, a to v části čtení souborů pro následné zpracování a odeslání klientovi. Zde nedokázal server najít soubor označený typem SF1000FILE.
Vzhledem k tomu, že navržený modul se nepodařilo včas osadit pamětí FLASH o potřebné velikosti, byl na něm odlaďován program jen do okamžiku, kdy stačila kapacita stávající paměti (128 KB). Poté byla další část ladění přenesena na modul TCP/IP Development Kit (paměť FLASH 256 KB), kde byl návrh doveden do konečné podoby. Na obou modulech však byla odzkoušena komunikace s přístrojem A2000 a funkce rozhraní Ethernet. Spolupráce s pamětí DataFLASH byla odladěna jen při její velikosti 128 KB, opět z důvodu nedostupnosti navrženého obvodu. Vzhledem ke špatné dostupnosti volných a přístupných vývodů prostředí TCP/IP Development Kit byla paměť DataFLASH připojena přes alternativní vývody paralelních portů.
Při využití výchozích materiálů popisujících činnost jednotlivých komponentů bylo navrženo a v rámci dostupnosti realizováno zapojení s mikroprocesorem Rabbit 2000 pro komunikaci s přístrojem A2000 a sítí Ethernet. Zapojení aplikačního rozhraní mezi mikroprocesorem Rabbit 2000 a přístrojem A2000 využívá již implementovaného sériového rozhraní RS232. Tímto způsobem je umožněno obejít se bez zásahů do hardwaru i softwaru měřícího přístroje a je tím také zaručena přenositelnost na další měřící přístroje při změně komunikačního softwaru.
Během realizace se bylo nutné potýkat s některými problémy, jako nedostupnost navrhovaných součástek, čímž bylo nutné částečně pozměnit původní koncepci. K pamětem mikroprocesoru Rabbit je tak přidána i sériová datová FLASH sloužící pro systém souborů používaný HTTP serverem a FTP serverem. Tento systém i přes svou relativní jednoduchost podstatně zpříjemňuje aktualizaci dat poskytovaných HTTP serverem.
Návrh aplikačního softwaru byl proveden a odladěn v prostředí Dynamic C. Pro zajištění potřebné funkčnosti byly provedeny malé úpravy i v původních knihovnách. Hlavní program využívá k činnosti operační systém reálného času uC/OSII navržený pro mikroprocesor Rabbit. V jedné úloze je realizována veškerá komunikace s přístrojem A2000, ve druhé úloze pak běží servery HTTP a FTP.
Samotné kompletní odlaďování a testování pak z důvodů problematické plnohodnotné realizace navrženého hardwaru bylo částečně provedeno i na původním modulu TCP/IP Development Kit, který disponoval větší pamětí FLASH. I tak se však dala ověřit dostatečná funkčnost hardwaru i softwaru. Pro praktické použití se pak předpokládá, že firma GMC z navrženého schématu vytvoří čtyřvrstvou profesionální desku plošných spojů osazenou SMD součástkami.
Vzhledem k předpokladu nedostatečného využití byla po konzultaci z realizace vypuštěna služba e-mail klienta.
[1] Rabbit 2000 Microprocessor User’s Manual, Rabbit Semiconductor, 1999
[2] Rabbit TCP/IP Development Kit, Rabbit Semiconductor, 1999
[3] Rabbit 2000 Microprocessor Designer’s Handbook, Rabbit Semiconductor, 1999
[4] Dynamic C User’s Manual, Z-World, 1999
[5] A2000 Multifunctional Power Meter – Communications Protocol per DIN Draft 19244, GMC, 2001
[6] Kozák, T.: Impl. progr. pro elektroměr s rozhr. Lon Talk - diplomová práce, FEI VUT v Brně, 1999
[7] Pužmanová, R.: Moderní komunikační sítě, Computer Press, Praha 1998
[8] Procházka, J.: Software pro ovládání přístroje A2000 přes Internet - semestrální práce II, FEKT VUT v Brně, Brno 2002
[9] Procházka, J.: Web server pro přístroje typu A2000 - diplomová práce, FEKT VUT v Brně, Brno 2002
[10] Mikl, M.: Rozhraní přístroje A2000 ke sběrnici Ethernet – semestrální práce II, FEKT VUT v Brně, Brno 2002
[11]
http://www.gmc.cz
[12] http://www.rabbitsemiconductors.com