Komunikační
protokol
Důvody k
použití komunikačního protokolu
Pro
komunikaci jednoho zařízení s počítačem
PC by bylo možno použít obvyklého řešení
s rozhraním RS 232 nebo pro zvýšení
odolnosti proti rušení jeho modifikace s diferenciálním
příjmem signálu RS 422. Komplikovanější
způsob komunikace přes sběrnici a komunikačního
protokolu byl použit proto, že již byl implementován
pro řadu jiných zařízení, má
zabezpečení proti chybám přenosu a byly
pro něj vytvořeny nástroje pro ladění
a nahrávání programů do aplikací.
Komunikace
však nebyla řešena pro jednotku zapalování
ale již dříve pro přístroje firmy
PiKRON s.r.o.. Výsledky tohoto vývoje byly také
použity pro jednotku zapalování. Komunikace byla
vyvíjena pro propojení přístrojů
tvořících kapalinový chromatograf LC4000.
Byla též nasazena v prostředí nemocnic pro
monitorování činnosti infuzních
pump IP2050 a je projektována i do volumetrické pumpy
VP1000 a analyzátoru aminokyselin AAA 400. Jedná
se o přístroje vybavené rozdílným
množstvím paměti a s rozdílným
stupněm autonomie. Při nasazení přístrojů
v nemocnicích a laboratořích se počítá
až s propojením 50 přístrojů.
Výběr
protokolu
Požadavky na
vlastnosti protokolu
Protokol
musí umožnit připojení minimálně
50 přístrojů na komunikační
sběrnici. Protokol by neměl vyžadovat nepřetržitý
provoz všech přístrojů. Protože se
jedná o přístroje s rozdílným
množstvím vlastní inteligence, neměl by od
nich vyžadovat znalost všech ostatních přístrojů
připojených ke sběrnici. Měla by být
alespoň částečně řešena
situace, kdy dojde k přetížení sběrnice,
tak, že se přístroje budou při obsazování
sběrnice střídat. Protokol by neměl
vyžadovat rekonfiguraci při výpadku nebo vypnutí
některého přístroje. Protokol by měl
umožňovat potvrzení doručení zprávy
příjemcem pro odesílatele. Pro řízení
jednoduchých slave přístrojů je nutné,
aby bylo možné pro iniciátora spojení
zpětně vyčíst informace ze slave.
Komunikace s jedním přístrojem by neměla
příliš zatěžovat ostatní
přístroje, pro které není zpráva
určena. Komunikace nemusí být extrémně
rychlá. Sběrnici by mělo jít snadno
realizovat s bezpečným galvanickým oddělením
(pro medicínu minimálně 4kV) a s minimální
délkou 20 m. V neposlední řadě je
nutné, aby řešení bylo levné,
nevyžadovalo speciální obvody a bylo použitelné
i pro standardní počítač PC.
Standardní
protokoly
V
této části budou vyjmenovány známé
protokoly, jejich výhody a nevýhody pro splnění
uvažovaných požadavků.
Komunikační
sběrnice I2C má dokonale deterministicky
vyřešen problém arbitrace přístupu
sběrnicovým součinem výstupů s
otevřenými kolektory. Vyžaduje pouze dva vodiče
(hodiny SCL a data SDA). Je relativně velmi rychlá
(více než 100 kBd). Výhodou je možnost
zpomalit přenos ze strany přijímače
libovolně dlouhým prodloužením stavu s
vodičem SCL v nízké úrovni. Umožňuje
kombinaci několika přenosů za sebou při
opakované podmínce start. Umožňuje vyčtení
informací z naadresovaného zařízení
a kontrolu doručení zprávy. Nemá řešen
problém rovnoměrného přidělení
času mezi konkurující si iniciátory
spojení (nejvyšší prioritu má
minimální cílová adresa). Vyžaduje
speciální hardware na straně připojení
k PC a na straně přístrojů vyžaduje
omezené množství procesorů vybavených
tímto rozhraním nebo další obvody. Lze ji
sice realizovat pouze softwarově, ale s velkými nároky
na zatížení procesoru (při kombinaci s
velmi jednoduchým hardwarem minimálně jedno
přerušení na přenesený bit).
Komunikační
protokol PROFIBUS má výhodu ve značném
rozšíření v průmyslových
aplikacích. Lze ho snadno realizovat při použití
diferenciální obousměrné dvojdrátové
sběrnice RS 485. Přidělení oprávnění
vysílat je vyřešeno předáváním
tokenu. Je nutné znát adresu následujícího
přístroje v logickém kruhu, zapojovat nové
master přístroje do logického kruhu. V případě
výpadku nebo vypnutí přístroje musí
dojít k rekonfiguraci kruhu a při ztrátě
tokenu k vygenerování právě jednoho
nového tokenu. Protokol umožňuje potvrzení
a vyčtení informací z naadresovaného
přístroje. Standardně se používá
komunikace se start a stop bitem a osmi datovými bity. Řídící
kódy jsou odlišeny od binárních dat pouze
pozicí svého výskytu. K synchronizaci počátku
zprávy se využívá časové
prodlevy. Komunikace vyžaduje kontrolu všech znaků
všemi přístroji a měření času
mezi znaky. Přístroje schopné iniciování
komunikace musejí znát své sousedy, minimálně
svého následníka v logickém kruhu.
Protokoly
HDLC, CAN a BITBUS jsou sice dobře propracované
synchronní protokoly pro předávání
zpráv, ale vyžadují pouze určitý
hardware.
Volba vlastního
protokolu
Protože
žádný z mě známých protokolů
se nejevil jako vhodný pro požadovanou komunikaci, byl
vytvořen protokol nový.
Protokol
využívá možnosti některých
procesorů generovat přerušení pouze při
příjmu znaku s nastaveným 8 bitem. Jedná
se o rodiny procesorů I8051, I8096, I80196, MC68332 a další.
Devítibitové komunikace se softwarově řízeným
osmým bitem lze docílit i u standardního
sériového rozhraní počítačů
PC módem softwarové parity nebo je možno postavit
rozšiřující kartu s obvodem I80510, který
je pro devítibitovou komunikaci navržený. Díky
tomuto rozlišení řídících
znaků a adres od dat není nutná kontrola všech
znaků všemi přístroji a dochází
k menšímu výkonovému zatížení
jednotek, pro které není zpráva určena.
Pro protokol bylo nutné vymyslet způsob arbitrace
přístupu ke sběrnici, zabezpečení
dat proti chybám a formát zpráv. Jako fyzické
vrstvy sběrnice byla využita RS 485.
Popis protokolu
mLan
Datový rámec
Datový
rámec je základní jednotkou komunikace mLan.
Skládá se z posloupnosti devítibitových
znaků. Protože se jedná o asynchronní
komunikaci, je každý znak opatřen startbitem
a stopbitem. Celková doba přenosu jednoho znaku je
jedenáctkrát delší než doba přenosu
bitu. Průběh přenosu jednoho znaku je
na obrázku. Pro zvýraznění bude
nejvýznamější bit přenášeného
devítibitového znaku D8 vykreslen tučně.
Znaky s bitem D8=1 jsou speciální řídící
znaky, které se mohou v datovém rámci vyskytovat
jen na určitých pozicích a ohraničují
přenášená data.
Datový
rámec začíná cílovou adresou (DAdr
- destination address) nebo znakem neadresného počátku
rámce (uL_Beg) s nastaveným bitem D8. Tento znak
zachytí všechny přístroje a podle něj
se rozhodnou jestli jsou pro ně určeny další
znaky. Další znaky jsou již bez nastaveného
bitu D8. Jedná se o adresu odesílatele rámce
(SAdr - source address) a číslo služby, pro
kterou je rámec určen (Com - command). Dále
jsou vysílána data rámce bez nastaveného
bitu D8. S daty není vyslána délka. Ta se může
pohybovat v rozsahu nula až maximální povolená
délka dat MaxBlock. Maximální délku
dat je nutné zvolit podle nejdelší přípustné
doby odezvy mezi přístroji, rychlosti komunikace a
počtu aktivních přístrojů pro
konkrétní aplikaci. Předpokládaná
hodnota je v rozsahu 256 B až 10 kB. Přenos až
dvou byte délky dat by prodlužoval délku rámce
a vyžadoval by od všech přístrojů
počítání přijímaných
byte, proto jsou data ukončena pouze znakem s nastaveným
D8. Podle použitého ukončovacího znaku ze
čtyř možných ukončovacích
znaků (uL_End, uL_Arq, uL_Prq, uL_Aap) se rozhoduje
dalším průběhu komunikace po skončení
rámce. Jako poslední znak rámce je vyslán
kontrolní znak (XorSum - vypočítaný
ze všech přenesených znaků včetně
DAdr a ukončovacího znaku) bez nastaveného
bitu D8.
Pro
zajištění zotavení při výpadku
přístroje a pro umožnění
bezkolizního přepínání výstupních
budičů sběrnice jsou definovány
následující časové relace. Mezi
vysíláním jednotlivých znaků rámce
nesmí být větší prodleva než
doba vyslání jednoho znaku. Pokud k ní dojde a
je cílovým přístrojem rozpoznána,
je zpráva prohlášena za poškozenou. Protože
při vysílání rámců a
odpovědí dochází k změně
směru přenosu dat přes transceivery sběrnice
jsou definovány minimální a maximální
časy jednotlivých úkonů. Tyto časy
jsou definovány poměrem k době přenosu
jednoho znaku. Při ukončení vysílání
signálu na sběrnici musí být vypnut
výstupní budič po skončení
vysílání posledního znaku zprávy v
době kratší než doba vysílání
jednoho znaku. Při přechodu z příjmu na
vysílání znaku je nutné po příjmu
posledního znaku počkat před zapnutím
výstupního budiče minimálně po
dobu vysílání jednoho znaku. Tato doba by však
neměla být delší než doba vysílání
dvou znaků. Čekání na znak po dobu delší
než trojnásobek vysílání znaku je
předchozí vysílaný rámec považován
za nepotvrzený a spojení je ukončeno s chybou.
Následující
odstavce popisují jednotlivá možná
zakončení rámce.
uL_End
(end) nejjednodušší ukončení rámce.
Příjemce nesmí vyslat žádný
znak na sběrnici do uvolnění sběrnice.
Vysílající přístroj prohlásí
okamžitě rámec za odvysílaný a
nekontroluje, že byl přijat. Tyto rámce se
využívají k přenosu informačních
zpráv, u nichž nedoručení nevede ke
kritické chybě. Dále je nutné je použít,
pokud je naadresováno více cílů zprávy.
V tomto případě by při snaze potvrdit
zprávu více přístroji vedl ke kolizi na
sběrnici a i k chybě komunikace. Pro kontrolu přenosu
těchto rámců je možné použít
vhodného průběhu komunikace mezi aplikacemi,
kdy jedna po doručení zprávy reaguje vložením
zprávy s odpovědí do výstupní
fronty zpráv s adresou DAdr rovnou SAdr původní
zprávy.
uL_Arq
(acknowledge request) umožňuje okamžitou kontrolu
doručení rámce. Příjemce rámce
musí reagovat na toto ukončení jednoznakovou
odpovědí bez nastaveného D8. Odpověď
uL_ACK potvrzuje příjem rámce. Odpověď
uL_NAK nebo odmlka po dobu delší než doba
vysílání tří znaků je
považována za chybu příjmu. Ta může
být způsobena zaneprázdněností
zařízení, přeplněním
vstupní fronty nebo chybou přenosu rámce.
Přístroj, který je schopen zjistit, že k
chybě došlo v důsledku jeho dočasného
zaneprázdnění nebo dočasného
přeplnění vstupní fronty, může
odpovědět uL_WAK. Tato odpověď může
být chápána vysílajícím
přístrojem pro zjednodušení stejně
jako uL_NAK nebo, je-li to možné, výhodněji.
Když dojde k nepotvrzení rámce, snaží
se většinou vysílající přístroj
při příštím přidělení
sběrnice o opakování vyslání
rámce. Počet pokusů o opakování
je předdefinován. Tento postup může
zbytečně zatěžovat sběrnici v
případě, že přijímač
má přeplněnu vstupní frontu a nebo je
celkově přetížen. Výhodnější
je, aby při příštím přidělení
sběrnice vysílači tento přístroj
vyřizoval zprávy pro ostatní přístroje
a k zprávě pro přetížený
přístroj se vrátil až po vyřízení
ostatních zpráv nebo po určité době.
uL_Prq
(proceed request) označuje rámec za určený
k okamžitému zpracování. Tento rámec
by měl být příjemcem okamžitě
zpracován. Způsob zpracování závisí
na čísle služby Com a je závislý
na aplikaci. Obecně platí, že služby
vyžadující okamžité zpracování
zprávy mají číslo služby Com
³ 80h na rozdíl od služeb
pro příjem do vstupní fronty s Com <
80h. Pro některé služby se požaduje okamžitá
odpověď příjemce vysílači
rámcem s odpovědí. Jiné služby
předpokládají vyslání dalšího
rámce původním vysílačem. Tyto
zprávy musí být zpracovány okamžitě
pod přerušením a proto musí být
zpracovány rychle a zcela asynchronně s ostatními
aplikacemi. To je výhodné pro trasování
a inspekci běžících programů v
cílovém přístroji, pro vyčítání
krátké stavové informace z přístroje
a pro čtení typu přístroje. Příkladem
jsou zprávy přechod do krokovacího režimu,
provedení jednoho kroku a pokračování v
normálním běhu aplikace, které se
skládají pouze z jednoho rámce. Další
příklady jsou čtení typu přístroje,
stavové informace a paměti přístroje. V
těchto případech se po odvysílání
rámce vyžadujícího danou informaci očekává
přijetí rámce s odpovědí. Zápis
paměti naopak po vyslání rámce s
informacemi kam se bude zapisovat vyžaduje odvysílání
rámce se zapisovanými daty. Nemůže-li
příjemce požadovanou činnost provést,
rámec ignoruje. Předpokládá-li vysílač
odpověď, pak po neúspěšném
čekání prohlásí rámec za
nepotvrzený.
uL_Aap
(acknowledge and proceed request) vyžaduje shodnou činnost
jako uL_Prq. Před vlastní zpracováním
rámce příjemcem vyžaduje potvrzení
přijetí rámce a potvrzení schopnosti
okamžitě předat rámec službě
Com vysláním uL_ACK. Pokud rámec
nemůže být zpracován okamžitě,
například požadovanou činnost nelze
provést pod přerušením, je vysláno
uL_NAK.
Řídící
znaky
Tyto
znaky mají nastaven bit D8 a jsou přijímány
všemi přístroji, ohraničují rámce
a rozhodují o stavu obsazení sběrnice. Sběrnice
je obsazena po fázi arbitrace přístupu vysláním
cílové adresy s nastavenými bitem D8 a nulovým
D7. Sběrnice se uvolňuje vysláním vlastní
adresy s nastavenými bity D8 a D7 nebo při chybě
vysláním uL_Err.
DAdr 100h všeobecná
adresa
DAdr 101h
až 164h adresa cílového přístroje
uL_Beg 175h neadresný
počátek rámce, většinou odpovědi
uL_END 17Ch konec
rámce
uL_ARQ 17Ah konec
rámce a žádost o potvrzení
uL_PRQ 179h konec
s žádostí o okamžité zpracování
uL_AAP 176h konec
s žádostí o potvrzení a okamžité
zpracování
uL_ERR 17Fh chyba
bez uvolnění sběrnice
uL_ERR 1FFh chyba
s uvolněním sběrnice
Kódy
těchto znaků kromě cílové adresy
jsou voleny tak, aby jejich minimální Hammingova
vzdálenost byla rovna 2. V případě chyby
při přenosu znaku pouze v jednom bitu je tato chyba
rozpoznána a přenos je považován za chybný.
Při
přenosu potvrzení rámce se využívá
definovaných kódů s Hammingovou vzdáleností
rovnou 4, proto jsou uvedeny také v tomto odstavci přesto,
že mají nulový D8.
uL_ACK 019h potvrzení
rámce
uL_NAK 07Fh negativní
potvrzení rámce
uL_WAK 025h nepotvrzeno
a bude potřeba čekat
Přenos zprávy
Přenos
zprávy v síti mLan může
vyžadovat i více než přenos pouze jednoho
datového rámce. Může vyžadovat
potvrzení a nebo okamžité provedení služby,
které může vyžadovat přenos dalších
rámců. Specifikace dovoluje i velmi složitý
průběh zpracování zpráv přesto,
že většinou nejsou tyto vlastnosti používány
ani implementovány. Například je možná
konstrukce, kdy přístroj A upozorní
přístroj B na přijetí příštího
datového rámce speciálním způsobem
k tomuto účelu vytvořenou službou. Potom
jinou službou předá přístroji C
příkaz k vyslání určitých
dat přístroji B. Přístroj C
předá data přístroji B. B
potvrdí příjem dat poté převezme
sběrnici přístroj A, který uvolní
sběrnici. Tento postup umožní přístroji
A přenést data z C do přístroje
B aniž by musel celý datový blok načíst
a poté znovu vyslat. V stávajících
aplikacích však nebylo nutné takto složitá
schémata komunikace implementovat. Jestliže se nejedná
o přenosy kritické na čas a není nutno z
důvodů synchronizace dopravit zprávu více
přístrojům naráz je možné
docílit podobných výsledků přenosem
několika samostatných zpráv.
Aplikace
nebo zpracování předcházejících
zpráv vyžaduje přenos zprávy. Tuto
informaci uloží do výstupní fronty.
Přístroj,
který potřebuje vyslat zprávu, čeká
na uvolnění sběrnice. Pak provede připojení
na sběrnici. Pokud je tato fáze úspěšná
vyšle rámec. Pokud je to vyžadováno provede
se kontrola potvrzení rámce a přenos dalších
datových rámců, pokud to služba vyžaduje.
Pak je uvolněna sběrnice. Není-li detekována
chyba je zpráva označena jako provedená. V
opačném případu je zvýšeno
počitadlo nezdařených pokusů. Při
dosažení předdefinované hodnoty je zpráva
označena za nedoručenou a pokus o vyslání
se neopakuje.
Aplikace
může být upozorněna o provedení
zprávy, pokud to požaduje. Aplikace je vždy
informována o zjištěné chybě v
přenosu.
Každý
přístroj, který má být schopen
přijímat zprávy, musí mít
přidělenu vlastní adresu a musí
kontrolovat všechny znaky s nastaveným D8. Přijme-li
znak s nastaveným D8 a nulovým D7 rovný svojí
adrese nebo znak rovný všeobecné adrese, přejde
se do stavu naadresovaný a přijme datový rámec.
Není-li rámec úspěšně přijmut
(shodný XorSum a dostatek paměti), je ignorován
a v případě uL_ARQ nebo uL_AAP je
vysláno uL_NAK. V opačném případě
je rámec uložen do paměti. Je-li přijato
uL_ARQ, je rámec potvrzen uL_NAK. Není-li
požadováno provedení služby, přejde se
do stavu čekání na rámec s nastaveným
příznakem naadresovaný. V případě
uL_AAP je rámec potvrzen až po rozpoznání
služby. Po přijetí uL_ARQ nebo uL_AAP
je rámec okamžitě předán příslušné
službě. Ta provede požadovanou akci a může
čekat na další jí určený
datový rámec nebo vyslat rámec. Pro přijetí
dalšího rámce ve stavu naadresovaný jsou
rozšířeny rozpoznávané adresy o
adresu uL_Beg. Do počátečního
stavu čekání na rámec bez příznaku
naadresovaný se přístroj vrátí po
příjmu znaku s nastavenými bity D8 a D7. Pro
některé služby může být počátek
rámce s adresou uL_Beg povinný.
Arbitrace přístupu
k médiu
Toto
je jedna z nejsložitějších částí
každého komunikačního protokolu, který
připouští připojení více
rovnocenný přístrojů a nemá pevně
určeného mastera.
Nejjednodušší
na počet přenesených znaků je náhodný
přístup s příposlechem nosné a
detekcí kolizí. Tato metoda vyžaduje schopnost
rozpoznat kolizi. Zároveň při vysokém
zatížení sítě vede k snížení
kapacity.
Proto
jsou výhodnější postupy, kdy je dopředu
rozhodnuto, který přístroj má právo
vysílat. Toho lze docílit předáváním
oprávnění vysílat mezi přístroji.
K tomu je nutné vysílat speciální rámce
s předáním řízení. Při
ztrátě tohoto rámce v důsledku chyby
přenosu nebo výpadku zařízení, je
nutné vygenerovat nový. Zároveň je pro
každý přístroj nutné znát
svého následníka v logickém kruhu
předávání řízení.
Další
možností je definování přípravné
fáze před získáním oprávnění
vysílat (arbitrace), která zaručí, že
toto oprávnění získá pouze jeden
přístroj. Tato fáze spotřebuje sice
určitou část kapacity sběrnice, ale
nevyžaduje rozpoznávání kolizí ani
předávání oprávnění
vysílat. Tato možnost byla vybrána pro protokol
mLan. Zároveň byla doplněna
o částečné rotování
priority mezi přístroji. Toho je docíleno
určením minimálního času, po který
se nesmí přístroj začít
připojovat, v závislosti na adrese posledního
předcházejícího přístroje s
oprávněním vysílat.
Každý
přístroj, který má být schopen
samostatného vysílání zprávy, musí
trvale sledovat stav obsazenosti sběrnice. Přístroj
musí přijímat všechny znaky s nastaveným
D8. Je-li nastaven bit D7 je sběrnice považována
za uvolněnou, v opačném případě
za obsazenou. Podle toho je nastaven příznak
neobsazenosti sběrnice uLF_NB. Protože arbitrační
fáze je založena na vysílání znaků
000h bez nastaveného bitu D8, je nutné, aby přístroje
schopné vysílání zprávy, měli
po dobu nastavení příznaku uLF_NB povolen
i příjem znaků s nulovým D8. Po příjmu
jakéhokoliv znaku se příznak uLF_NB
znuluje a není již nutné přijímat
znaky s nulovým D8. Protože může dojít
k výpadku přístroje v době, kdy obsadil
sběrnici, je nutné definovat způsob jak obnovit
práci sběrnice. Všechny přístroje
mohou periodicky testovat aktivitu sběrnice funkcí
uL_STROKE. Tato funkce nesmí být znovu volána
dříve než po době odpovídající
vyslání 40 znaků. Maximální doba
mezi voláními není definovaná a pouze
ovlivňuje maximální dobu, po kterou nemusí
být daný přístroj schopen obsadit
sběrnici. Funkce uL_STROKE sleduje jestli byl mezi
jejími voláními přijat alespoň
jeden znak. V případě neaktivity sběrnice
nastaví příznak uLF_NB a při
dalším volání zaktivuje vysílací
systém přístroje. Protože fáze
arbitrace obsahuje čekání po dobu přenosu
minimálně 4 znaků s povoleným příjmem
všech znaků, nedojde ani v případě
nastavení uLF_NB v důsledku nepřijímání
znaků s nulovým D8 během komunikace mezi jinými
přístroji, ke kolizi. Během komunikace není
dovolena prodleva delší než přenos 3 znaků
(viz popis datového rámce) a tím je zaručeno
opětné vynulování uLF_NB. Tento
postup má výhodu, že komunikace nevyžaduje
alokaci čítače prodlevy. uL_STROKE může
být volána z libovolného časového
přerušení nebo z libovolné periodicky
volané funkce.
Vlastní
proces připojení začíná v okamžiku
detekce uvolnění sběrnice (změna uLF_NB
z 0 do 1) nebo po vložení zprávy do výstupní
fronty v době, kdy je nastaven uLF_NB. Nejdříve
je z adresy posledního sběrnici uvolňujícího
přístroje LAdr a vlastní adresy Adr
vypočítá dobu, po kterou testuje klid na
sběrnici, podle vzorce :
(LAdr
- Adr - 1) mod 16 + 4
Doba se
měří v době přenosu jednoho znaku.
Není-li známa LAdr nebo při chybě
na sběrnici musí tato doba odpovídat minimálně
přenosu 20 znaků. Je-li přijat libovolný
znak nebo detekována nízká úroveň
na sběrnici, je sběrnice prohlášena za
obsazenou a přístroj musí čekat na
uvolnění sběrnice.
Tento
postup zajišťuje rotaci priority mezi maximálně
16 přístroji. K následné kolizi by mohlo
dojít mezi přístroji s rozdílem adresy
dělitelným 16 nebo při současném
zapnutí dvou přístrojů. Konečné
jednoznačné rozhodnutí o právu vysílat
je provedeno vysíláním kombinace znaků
000h a prázdných intervalů. Tato kombinace je
pro každý přístroj dána jeho vlastní
adresou. Prázdný znak odpovídá odpojení
výstupního budiče. V této době je
udržováno napětí sběrnice ve stavu
odpovídajícímu logické jedničce
zakončovacími odpory, které mohou být v
každém přístroji. Pokud je v době
vysílání prázdného znaku
přístrojem detekována nízká
úroveň, znamená to, že došlo ke kolizi
snahy více přístrojů o připojení
a přístroj, který vysílal prázdný
znak nesmí v připojování pokračovat
a musí sběrnici považovat za obsazenou. Na začátku
vysílaní kombinace znaků je vyslán nulový
znak. Pak je vyslán 1 až 4 prázdné znaky
podle nejnižších dvou bitů vlastní
adresy. Poté je vyslán nulový znak. Vysílání
prodlevy a nulového znaku se opakuje ještě dvakrát
pro další bity vlastní adresy. Tento postup
zaručuje jednoznačné přidělení
sběrnice jednomu ze 64 přístrojů.
Vysílání nulového znaku odděleného
prodlevami umožňuje vzájemnou synchronizací
mezi přístroji, které mají delší
počáteční část arbitrační
kombinace shodnou i při nenulové době odezvy na
přerušení.
Systém
rozpoznávání jednotek a dynamického
přidělení adres
Aby
bylo možné zjistit, které přístroje
jsou připojeny k síti mLan,
je zavedena služba zjištění typu přístroje
uLCo_SID (send identification). Po přijetí rámce
s hodnotou Com rovnou uLCo_SID a zakončením
uL_PRQ nebo uL_AAP přístroj vyšle
rámec s textovým řetězcem zakončeným
znakem nula.
".mt
ZAP1 v 0.71 .uP 51x .dy\0"
Například
systém zapalování popisuje výše
uvedený řetězec. V řetězci jsou
jednotlivé části uvozeny znakem "."
a písmenným kódem. Poté může
následovat slovní popis. Funkci přístroje
popisuje ".mt" (sekce module type), v tomto případě
"ZAP1". Typ procesoru ".uP" je v
tomto případě "51x" (rodina
I8051 s vnější pamětí RAM). Příznak
".dy" možnost dynamického přidělení
adresy.
Systém
dynamického přidělení adresy umožňuje
jednoznačnou identifikaci každého připojeného
přístroje podle jeho 32 bitového výrobního
čísla. Přístroj může být
kdykoliv připojen do sítě a nemusí mít
nastavenu vlastní adresu. O přidělení
adres se stará server dynamických adres, který
zároveň monitoruje činnost přístrojů.
S využitím servisních protokolů je
možné do jedné sítě zapojit i více
těchto serverů. Pouze jeden z nich je však zvolen
za hlavní a pouze ten smí publikovat do sítě
svoji adresu a přidělovat adresy přístrojům.
Pouze při výpadku může začít
s přidělováním adres jeho náhradník.
Činnost
sítě s jedním serverem je založena na
cyklickém zjišťování stavu všech
přístrojů. V první fázi je vyslána
zpráva s jedním rámcem s Com rovným
uLCo_GST (get status) se všeobecnou adresou a podslužbou
0 zakončeným uL_PRQ. Poté jsou vysílány
zprávy jednotlivým přístrojům.
První rámec zprávy s Com rovným
uLCo_GST obsahující určení
podslužby 10h až 1Fh (pro rozlišení typu
zjišťovaných údajů - základní
údaje jsou 10h) a může obsahovat předpokládané
výrobní číslo přístroje.
Rámec je zakončen uL_PRQ nebo uL_AAP Přístroj
po přijetí této zprávy zkontroluje,
jestli odpovídá jeho výrobní číslo
číslu ve zprávě. V případě
rozdílu předpokládá, že se jeho
adresa kryje s adresou jiného přístroje, a proto
vynuluje svoji adresu a přejde do stavu hledání
nové volné adresy. Je-li výrobní číslo
v pořádku vyšle rámec s požadovanými
údaji. Tím je server informován o funkčnosti
přístroje a i o jeho základním stavu.
Přístroj přejde do stavu hledání
nové adresy také tehdy, nepřijme-li po dobu více
než tří cyklů dotazů rámec s
dotazem na jeho stav. To že není dotazován a na
síti je aktivní server dynamického přidělování
adres pozná podle toho, že přijme třikrát
rámec uLCo_GST s podslužbou 0 a ani jednou za tuto
dobu není dotazován na svůj stav.
Přístroj
ve stavu hledání nové adresy periodicky po
určité době vysílá na server, od
kterého přijmu zprávu uLCo_GST s
podslužbou 0, požadavek na zařazení do jeho
tabulky adres. Tento požadavek je uložen v rámci s
Com = uLCo_NCS (network controll services),
s podslužbou uLNCS_ARQ (address request), svým
výrobním číslem a zakončením
uL_END. Server zjistí, jestli již daný
přístroj nemá v tabulce připojených
přístrojů. Je-li to potřeba nalezne pro
přístroj novou volnou adresu a zařadí ho
do tabulky připojených přístrojů.
Nakonec oznámí přístroji zprávou s
rámcem s Com = uLCo_NCS, podslužbou
uLNCS_ASE (address set) a výrobním číslem
přístroje jeho novou adresu.
Pokud
bylo nutno vytvořit novou položku v tabulce připojených
přístrojů, je standardním serverem
vygenerován požadavek uLCo_SID pro zjištění
typu přístroje. Po zjištění typu
přístroje jsou informace o nově připojeném
přístroji dodány systému modelů
přístrojů. Tento systém se snaží
spojit položku z tabulky připojených přístrojů
s již existujícím modelem přístroje.
Není-li model nalezen je podle typu přístroje
".mt" vytvořen model nový.
Periodicky
zjišťovaný stav je též standardně
předáván do systému modelů
přístrojů. Dojde-li víckrát po
sobě k chybě při čtení stavu,
považuje se přístroj za vypnutý a je z
tabulky připojených přístrojů
vyřazen. O této skutečnosti je informován
i model přístroje. Ten vyhlásí chybu
komunikace s přístrojem.
Existují-li
záložní servery dynamického přidělení
adres mohou využívat pro tvorbu tabulky připojených
přístrojů zpráv uLCo_NCS s
podslužbou uLNCS_ASE, které jsou vysílány
s všeobecnou adresou.
Implementace
komunikace mLan
Implementace
komunikace mLan pro procesory 8051
Existují
dvě verze knihovny. Jedna zjednodušená pro
přístroje bez vnější paměti
označovaná jako pLan a plnohodnotná verze
knihovny označená uLan. Zde bude popsána verze
využívající vnější
paměť.
Požadavky
knihovny :
2
byte bitově adresovatelné vnitřní paměti
DATA
5
byte vnitřní paměti DATA pro přepínání
stacku v segmentu SER_STACK
3
kB paměti CODE
56
byte paměti XDATA pro proměnné a minimálně
1 kB paměti pro frontu
pro
některé služby je nutné sloučení
vnější paměti CODE a XDATA
banka
registrů RB1
sériové
rozhraní procesorů řady I8051 a časovač
pro generování přenosové rychlosti CT1
Jestliže
jsou do systému přidány další služby
pro rámce s uL_PRQ nebo uL_AAP, které
potřebují prostor na stacku větší
než 4 byte je potřeba zvětšit segment
SER_STACK.
Vlastní
předávání zpráv probíhá
přes vstupní a výstupní cyklickou frontu.
Funkce pro práci s frontami umožňují
otevření pouze jedné vstupní a výstupní
zprávy naráz. Počet zpráv ve frontách
je omezen pouze jejich celkovou délkou. Pro vysílání
krátkých zpráv generovaných asynchronními
událostmi (v přerušení) jsou k dispozici
vysokorychlostní buffery. Každý asynchronní
subsystém musí před voláním služeb
uložit ukazatel uL_SBP do pomocné paměti a
po skončení činnosti jeho hodnotu obnovit.
Vlastní
část knihovny, která se stará o příjem
a vysílání zpráv a rámců
běží jako samostatný paralelní
proces. Při příhodu přerušení
od sériového interface je uložen na stack obsah
registrů PSW a ACC. Poté je zaměněn obsah
ukazatele zásobníku s proměnnou v paměti
DATA na adrese SER_STACK+0. Je-li tato hodnota nulová
(po inicializaci) nebo bylo-li přerušení způsobeno
příjmem znaku uL_ERR o hodnotě 1FFh, je
provedena inicializace SP na hodnotu SER_STACK+1, aktivace
banky registrů RB1 a inicializace rutin pro příjem
a vysílání rámců. Není-li
chyba dojde pouze k aktivaci banky registrů RB1. V případě
úspěšného příjmu znaku je do
ACC uložen přijatý znak, do CY bit D8 znaku a
nastaven příznak AC. V případě, že
je přerušení vyvoláno ukončením
vysílání znaku, je příznak AC
znulován. Poté je provedena instrukce RET. Tím
je předáno řízení do místa,
které předtím způsobilo návrat z
rutiny přerušení voláním funkce
S_RET. Po vyvolání funkce S_RET je opět
vyměněna hodnota SP a proveden návrat z
přerušení do původního programu.
Tento postup umožňuje programovat funkce zajišťující
komunikaci jako podprogramy, které mohou volat funkci příjmu
znaku REC_CHR, funkci příjmu pouze řídících
znaků REC_CTR, funkci vyslání normálního
znaku SND_CHR, funkci vysílání
kontrolního znaku SND_CTR, funkce vyslání
prázdného znaku SND_SPC a funkce WFT_CHR.
Posledně jmenovaná funkce provádí
vysílání znaku s vypnutým výstupním
budičem. Není-li po dobu vysílání
jednoho prázdného znaku přijat znak, dojde k
přerušení od vysílače. Při
každém volání WTF_CHR je snížena
hodnota R0. Je-li nulová dojde ke skoku na rutinu chyby S_ERR,
která přeruší zpracování
rámce.
Základní
funkce knihovny lze volat přímo přes jejich
publikované symbolické jméno nebo přes
vektor uL_FNC na adrese 26h s číslem funkce v
registru R0. Všechny funkce, které mohou skončit s
chybou, nastavují příznak F0. Tyto funkce v
případě volání s nastaveným
F0 nejsou provedeny. To umožňuje provést sekvenci
volání více služeb a poté pouze
jednou zkontrolovat chybový příznak F0. Pro
zjednodušení označení vstupu vícebytové
hodnoty v několika registrech jsou zavedeny pseudoregistry R45
a R23. Méně významný byte je vždy v
registru s nižším číselným
označením. Totéž pro vícebytové
hodnoty v paměti, kde je nejméně významný
byte na nejnižší adrese.. Pro vstupní frontu
bude používána zkratka IB, pro výstupní
OB. Před spuštěním je potřeba
provést následující funkce voláním
uL_FNC s číslem služby v registru R0 :
1 Nastaví
rychlost 57.6 kBd/ACC
2 Nastaví
vlastní adresu na hodnotu ACC
3 Nastaví
počátek IB na R2´256
délku IB na R3 a délku OB na R4, R2=0 Þ
auto
4 Nastaví
uL_SBLE=R2 uL_SBCO=R3 uL_SBP=R45, R245=0 Þ
auto
5 Nastaví
skupinu podle ACC
uL_INIT 0 Spustí
u_Lan podle dříve nastavených parametrů
Pro
vysílání přes výstupní
frontu OB jsou definovány následující
funkce:
uL_O_OP 10h
Otevře výstupní zprávu pro přístroj
s Adr R4 s Com R5
uL_WR 11h
Zapíše R45 bytů z paměti XDATA @DP,
není-li dostatek místa, je nastaven příznak
F0, DP ukazuje za poslední zapsaný byte a R45
obsahuje počet bytů, které nemohly být
zapsány - Ruší R012345
uL_O_CL 12h
Uzavře výstupní zprávu a připraví
ji pro odeslání
uL_WRB 13h
Zapíše byte z @DP - Ruší R0123
uL_O_LN 14h
Zkontroluje místo ve frontě OB pro R45 bytů
a vrátí maximální možnou délku
dalšího zápisu v R45, při nedostatku
místa nastaví F0 - Ruší R012345
Pro
zpracování přijatých zpráv ze
vstupní fronty OB jsou definovány následující
funkce:
uL_I_OP 20h
Otevře vstupní zprávu vrací R4 SAdr
a R5 Com, pokud není zpráva v IB k
dispozici nastaví příznak F0
uL_RD 21h
Načte R45 bytů do paměti XDATA @DP, není-li
dostatek bytů v IB je nastaven příznak
F0, DP ukazuje za poslední přijatý znak a R45
obsahuje počet bytů, které nebyly přečteny
- Ruší R012345
uL_I_CL 22h
Uzavře vstupní zprávu, uvolní místo,
které zabírala ve frontě
uL_RDB 23h
Načte byte na @DP - Ruší R0123
uL_I_LN 24h
Zkontroluje jestli je v právě otevřené
vstupní zprávě ještě alespoň
R45 bytů ke čtení, není-li nastaví
F0, vrací R45 počet nepřečtených
byte - Ruší R012345
Pro
asynchronní vysílání zpráv s
vysokou prioritou jsou definovány následující
funkce:
uL_S_OP 30h
Otevře rychlý výstup zprávy pro Adr
R4 s Com R5, hledá volný buffer, nalezne-li ho
zapíše jeho adresu do uL_SBP a označí
ho za obsazený, v opačném případě
nastaví F0
uL_S_WR 31h
Zapíše R45 bytů z XDATA @DP - Ruší
R012345
uL_S_CL 32h
Uzavře rychlou výstupní zprávu a
připraví ji k odeslání
uL_O_DO 33h
Registrace vlastního bufferu rychlého výstupu
zprávy na adrese XDATA @R45, buffer musí obsahovat i
prázdný ukazatel na další buffer,
hlavičku zprávy a ostatní náležitosti
Pro
správnou funkci obnovení sběrnice při
chybě je nutné volat funkci uL_STR z časového
přerušení s frekvencí 2 až 25 Hz.
Popis
některých pro čtení přístupných
proměnných v paměti XDATA :
uL_ADR Vlastní
adresa přístroje
uL_GRP Skupina
přístroje pro některé služby
uL_SPD Dělitel
přenosové rychlosti
uL_HBIB Vyšší
byte počáteční adresy fronty IB,
nižší byte je vždy roven 0
uL_IB_L Délka
fronty IB v násobcích 256
uL_OB_L Délka
fronty OB v násobcích 256
uL_FORM Pro
použití aplikačním programem, druh
komunikace
uL_SBP Ukazatel
na právě používaný rychlý
buffer pro funkce uL_S_OP, uL_S_WR a uL_S_CL
uL_SA Zdrojová
adresa právě přijímaného rámce,
pro vysílání z výstupní fronty
naopak cílová adresa rámce
uL_CMD Právě
přijímaný nebo vysílaný příkaz
Následuje
popis uživateli přístupných příznaků
uLF_INE (IB
not empty) Nastaven po příjmu zprávy do IB,
upozorňuje na příchod zprávy, měl
by být nulován uživatelem před čtením
zpráv ze vstupní fronty
uLF_ERR Nastaven
při opakované chybě ve vysílání
zprávy, nuluje uživatel
Pokud
nejsou použity vektory v paměti RAM může
vnější program nabídnout knihovně
funkci uL_R_BU, která je volaná přímo
z přerušení po přijetí zprávy
do IB. Nabídnutá funkce uL_R_CO bude
volaná po přijetí zprávy s uL_PRQ
nebo uL_AAP.
Pokud jsou použity vektory pro přerušení a
služby v paměti RAM je možné přesměrovat
vektor základních funkcí mLan
V_uL_FNC = 26h. Přesměrováním
vektoru V_uL_ADD = 1EH je možné rozšířit
okamžité zpracování rámců v
interruptu mLan pro další
služby. Stav registrů v okamžiku skoku na vektor
V_uL_ADD :
ACC přijaté
číslo služby uL_CMD = Com
R0.0
= 1 nutné vyslat potvrzení
R0.1
= 1 požadavek na provedení služby v
přerušením
R0.3
= 1 data přijata do IB
XDATA
[R23] až [R67-1] přijmutá data
Reakce
na rozpoznané služby může obsahovat volání
NAK_CMD nebo ACK_CMD a poté čtení
dat z datové části rámce po byte voláním
S_R0FB a různá volání funkcí
příjmu a vysílání rámců
a znaků (SND_BEB .. SND_END | REC_BEG ..
REC_CME). Končit musí instrukcí
JMP S_WAITD.
Pokud
není služba rozpoznána musí se skočit
na adresu, na kterou skákal původně vektor
V_uL_ADD, nebo na standardní služby přes
V_uL_EADD.
S_R0FBV načte
jeden byte z přijatého rámce do R0, pro
správnou funkci je třeba zachovat R234567, při
přečtení posledního znaku je ACC = 0
jinak ACC ¹ 0
S_EQP porovná
R23 a R45, jsou-li rovné, je vráceno ACC = 0, což
znamená, že již nejsou další byte v
zpracovávaném rámci
Při
zpracování rámce s uL_PRQ nebo uL_AAP
mohou být volány následující
funkce :
ACK_CMD potvrzení
příjmu rámce s uL_AAP
NAK_CMD nepotvrzení
příjmu rámce s uL_AAP
Vyžaduje-li
to služba, může být přijat další
rámec voláním:
REC_BEG přijme
počátek rámce, nastaví uL_SA,
uL_CMD, vrací ACC = SAdr, R0 = Com,
R1 = XorSum počátku rámce
REC_CHR přijme
jeden znak, vrací v ACC přijatý znak a v CY
bit D8, ve volající funkci je nutné počítat
v registru R1 XorSum podle vzorce R1= (R1 xor ACC) + 1
REC_END tato
funkce musí být volána po návratu
funkce REC_CHR s nastavenými bity AC a CY, provede
příjem kontrolního znaku, došlo-li k
chybě a konec rámce požaduje potvrzení
(uL_ARQ nebo uL_AAP) je vysláno uL_NAK
a proveden skok na S_ERR, potvrzeny jsou pouze rámce
uL_ARQ, protože uL_AAP jsou potvrzeny až
rutinou, která je zpracuje, dojde-li k návratu z
funkce REC_CMD jsou v ACC i R0 vráceny příznaky
popsané výše při skoku na vektor V_uL_ADD
REC_CME skok
na tuto adresu způsobí přijímání
znaků a jejich ignorování až do zakončení
rámce, je-li požadavek na potvrzení vyšle
uL_NAK, poté dojde k aktivaci systému pro
příjem rámců, tento vektor by měl
být použit vždy, když jsou během
příjmu rámce přijata data, která
nelze zpracovat, nebo dojde-li k přeplnění
paměti pro příjem dat
Je-li
potřeba přijmout více znaků přímo
do paměti, lze místo několikanásobného
volání funkce REC_CHR volat následující
funkce :
REC_Bx přijímá
znaky do paměti XDATA od adresy R23 dokud nepřijme
znak s D8 = 1 nebo nedosáhne konce bufferu předaného
v R67, v registru R1 počítá XorSum, skončí-li
příjmem řídícího znaku
(D8 = 1) nastaví příznak CY a ACC obsahuje kód
znaku, R23 ukazuje za poslední přijatý znak,
mění pouze R1 a R23, registry R4 a R5 jsou využity
pro příjem do cyklických front, když R23
= R5×100h je do registrů
R23 uložena hodnota R4×100h,
pro příjem do lineárního necyklického
prostoru je nutno nastavit R4 = R5
REC_Bi přijímá
znaky do paměti IDATA, platí totéž co pro
funkci REC_Bx, využívá pouze registrů
R1, R2 a R6
Pro
vysílání rámce jsou k dispozici shodné
funkce, které místo příjmu vysílají
:
SND_BEB vyšle
počátek rámce, za Com dosadí
hodnotu z uL_CMD (Com posledního přijatého
rámce) s vynulovaným osmým bitem, adresu DAdr
nastaví na uL_BEG.
SND_CHC vyšle
jeden znak, na rozdíl od REC_CHR vypočítává
XorSum v R1
SND_END vyšle
zakončení rámce
SND_Bx vysílá
data z paměti XDATA, platí totéž co pro
REC_Bx
SND_Bi vysílá
data z paměti IDATA, platí totéž co pro
REC_Bi
Systém
přesměrování vektorů přerušení
a služeb obsahuje skoky v paměti EPROM na odpovídající
adresy v paměti RAM. V paměti RAM jsou potom skoky na
vlastní rutiny přerušení a služeb.
Tento postup umožňuje využít pro inicializaci
přístroje aplikaci v paměti EPROM. Poté
je možné komunikací mLan
nahrát novou verzi aplikace nebo i aplikaci zcela jinou. Ta je
poté spuštěna a přesměruje na sebe
vektory přerušení a služeb. Je-li to výhodné,
lze využít některé rutiny z původní
aplikace, například komunikaci. Aby byl tento systém
jednotný byla vytvořena knihovna PB_VEC. Pro
její funkci je nutné sloučení prostoru
pamětí XDATA a DATA. Knihovna převezme řízení
po resetování přístroje, nastaví
všechny vektory přerušení na instrukci IRET a
vektory služeb na RET. Poté předá řízení
na adresu RES_STAR. Vektory se mění funkcemi :
VEC_CLR provede
nastavení všech vektorů na adresy instrukcí
RET a IRET
VEC_SET nastaví
vektor s adresou v R4 na hodnotu DPTR, vrátí v R45
původní hodnotu vektoru
VEC_GET vrátí
v registrech R45 hodnotu vektoru s adresou předanou v R4
VEC_USR tato
funkce umožňuje vytvořit v paměti RAM
instrukci skoku s předdefinovanou adresou, slouží
především pro skok na původní
adresu změněného vektoru, v DPTR je jí
předána adresa tří byte v paměti
XDATA a v R45 je předána požadovaná
cílová adresa instrukce JMP, adresa těchto tří
byte je poté použita jako cílová adresa
skoku
Implementace
komunikace mLan pro počítače
PC
V
současné době je komunikace implementována
jako knihovna pro C nebo Pascal. Protože pracuje přímo
s hardwarem a přerušeními, je zatím
implementována pouze pro aplikace pod systémem MS-DOS.
Existuje verze schopná práce v chráněném
režimu pro programy napsané v prostředí
Turbo Pascal s využitím DPMI. Tyto programy mohou využít
i paměť nad magickou hranici 640kB. Požadovaný
hardware je buď základní rozhraní RS 232
přítomné na všech počítačích
nebo speciální karta s obvodem I80510 a rozhraním
RS 485. Rozhraní RS 232 je nutné doplnit o adaptér
úrovní a obousměrný budič sběrnice
RS 485. Adaptér byl realizován v krytu konektoru DB9
nebo DB25. Driver sítě automaticky zjistí
přítomnost adaptéru nebo I80510 a zvolí
správné rutiny pro základní operace
vysílání a příjmu.
Software
je rozvrstven do více úrovní. Pouze první
dvě úrovně jsou nutné ke komunikaci a
byly napsány jako samostatný driver v assembleru. V
dosavadních aplikacích je driver přilinkován
k vlastnímu programu, ale jeho koncepce umožňuje
samostatnou činnost a spolupráci i s více
programy i v preemptivním prostředí. Tyto
možnosti budou využity v budoucích implementacích.
Ostatní úrovně jsou nadstavby pro snadnou stavbu
aplikací v prostředí Turbo Vision.
Řízení
fyzického rozhraní. Jedná se o rutiny noint
(test nulovosti požadavku na přerušení), rec
(příjem 9bit znaku), send (vyslání
9bit znaku), wait_cx (čekání na příjem
znaku po dobu přenosu cx znaků), Connect (připojení
s arbitrací), wait (čekání po
dobu jednoho znaku) a rutina pro uvolnění rozhraní.
Tyto rutiny jsou součástí komunikačního
driveru a jsou definovány pro každé fyzické
rozhraní. Při inicializaci jsou po detekci rozhraní
vybrány příslušné rutiny. Pokud
rutiny čekají na přerušení, volají
S_reti, tato rutina přepne kontext zpět do
programu, který byl předtím přerušen,
obnoví jeho registry a provede návrat z přerušení.
Po příchodu přerušení uloží
registry přepne kontext pro komunikaci a vrátí
se do rutiny, která S_reti volala. Neobnovuje však
registry, to musí udělat až jednotlivé
rutiny příjmu a vysílání znaků
a čekání.
Další
část komunikačního driveru mLan
obsluhuje vysílání a příjem
rámců, zpracování zpráv, obsluhu
komunikačního bufferu a vyřizuje požadavky
aplikací a informuje je o zpracování jejich
zpráv. Protože v prostředí DOS a i Windows
není vůbec řešen problém atomické
(asynchronní) alokace paměti v přerušení
je pro komunikaci zaalokována paměť při
inicializaci. Paměť je rozdělena na 66 bytové
bloky. 64 byte slouží k uložení dat a 2 byte
slouží jako ukazatel na následující
blok nebo při hodnotě 0 jako konec řetězce
bloků. Na začátek jsou veškeré
bloky zřetězeny a adresa prvního je přiřazena
ukazateli na volné bloky. Dále jsou inicializovány
dva obousměrně zřetězené seznamy
zpráv. Do jednoho jsou zařazovány zprávy
určené k vysílání, do druhého
jsou přidávány přijaté zprávy
a je-li to požadováno, přesouvány
zpracované zprávy z prvního seznamu. Zpráva
se objeví v seznamu jako jeden blok paměti, jehož
prvních 32 obsahuje dopředný a zpětný
ukazatel na další zprávy a informace o příznacích
zpracování Flg, DAdr, SAdr, Com,
číslo připojené aplikace, informační
číslo pro aplikaci (číslo jejího
objektu), délku a inicializační řetězec,
jedná-li se o vícerámcovou zprávu.
Zbylých 32 byte obsahuje data zprávy. Je-li zpráva
delší než 32 byte jsou přidány další
64 bytové bloky pomocí ukazatelů na následující
bloky. Toto paměťové řešení
umožňuje atomickou alokaci bloků, není
nutno hledat volné bloky, změnu délky zprávy
během příjmu nebo při vyřizování
zprávy vyžadující příjem
datového rámce. Libovolný objekt libovolné
aplikace může kdykoliv i asynchronně požádat
o otevření vstupní nebo výstupní
zprávy, vložení nové výstupní
zprávy o zápis, čtení, prohledávání
zpráv atd..
Unita
uL_Com je již součástí komunikační
knihovny aplikace, umožňuje registraci aplikace v
driveru jako uživatele sítě objektem uL_User.
Vytváří komunikační objekty
uL_ObjDe. Každý objekt uL_ObjDe může
prohledávat seznamy zpráv nebo mít otevřenu
jednu zprávu. Objekt uL_User předává
informaci o provedení nebo chybě objektu uL_ObjDe,
který zprávu vložil do seznamu. Tyto informace
dostává přímo od komunikačního
driveru. Přijaté zprávy od přístrojů
jsou rozesílány uživatelům a komunikačním
objektům podle masek.
Unita
uL_Modul se stará o seznam připojených
přístrojů. Samostatně je schopna na
příkaz vložit informaci o přístroji
do seznamu, zjistit jeho popis, vymazat přístroj ze
seznamu, otestovat všechny přístroje na sběrnici.
O změně stavu přístrojů informuje
ostatní části systému. Zároveň
v součinnosti s unitou uL_Hex umožňuje
inspekci paměti a registrů přístrojů,
krokování a další pro vývoj vhodné
funkce.
Unita
uL_DyAdr definuje jeden komunikační objekt,
který se chová jako server dynamického
přiřazování adresy. Informace ukládá
do seznamu připojených přístrojů.
Získanou krátkou stavovou informaci z každého
přístroje periodicky předává
objektům, které jsou uvedeny v seznamu přístrojů.
Unita
uL_Instr vytváří model každého
přístroje ke každému výrobnímu
číslu. Je-li typ přístroje ".mt"
nalezen v databázi známých modelů, je
zavolána unita, která popisuje tento typ. Model je
informován o stavu přístroje a o jeho odpojení.
Unita se zároveň stará o oprávnění
zásahů do přístrojů a editace
modelů. Unita zároveň obsahuje základní
služby pro nastavování a čtení
hodnot parametrů a řízení přístroje.
Tato činnost je realizována další
standardní nadstavbou protokolu. Jedná se o objektovou
streamovou komunikaci, umožnující přenést
v podstatě jakákoliv data. Několik příkazů
a parametrů lze vyslat v jednom rámci. Do budoucna je
počítáno s jazykem popisujícím
jednotlivé přístrojem rozpoznávané
objekty a umožňujícím automatickou tvorbu
modelu i neznámého přístroje
zpřístupňujícího všechny
jeho funkce.
Další
úrovní jsou již modely jednotlivých
přístrojů a ostatní části
aplikace.
Vzhledem
k tomu, že se jedná o asi 250 kB zdrojových textů,
nebude zde systém podrobně popisován. Software
byl vytvořen pro firmu PiKRON a je jejím majetkem.