JAPAEL – Jarda Pavlíček Elektronika

Sběr dat, řídící jednotky, drony, roboty …

BAZbus: jednoduchý textový protokol pro RS‑485 – technická specifikace

BAZbus je jednoduchý textový protokol pro komunikaci s malými zařízeními na poloduplexní sběrnici RS‑485. Tento článek slouží jako praktická referenční specifikace: má umožnit napsat vlastní zařízení, ovládací program nebo převodník. Jeho návrhovou prioritou je možnost poslat příkaz ručně v obyčejném sériovém terminálu – bez binárního editoru, počítání CRC a speciální knihovny.

Nejde o náhradu Modbusu pro obecné průmyslové nasazení. BAZbus je určený zejména pro malý počet jednoduchých zařízení. Jeho jednoduchost má své výhody i záměrná omezení.

1. Fyzická linka a rámování

VlastnostHodnota
MédiumRS‑485, poloduplex
Sériová linka19 200 baudů, 8 datových bitů, bez parity, 1 stop bit (8N1)
KódováníASCII
Oddělovač / synchronizaceCR (0x0D), LF (0x0A), případně CRLF
Kontrolní součetŽádný
Hranice rámcůPodle znaků, nikoli podle časových mezer

Příkaz se skládá z ukončení předchozího řádku, vykřičníku, jednoznakové adresy, čísla příkazu a volitelného parametru. Ukončuje se koncem řádku. Na začátku příkazu je důležitý úvodní konec řádku: přijímač tím může opustit rozpracovanou či poškozenou zprávu a znovu se synchronizovat.

[CR|LF] ! <adresa> <příkaz> [ = <hodnota> ] [CR|LF]
Příklad (zobrazené znaky): !36=36000
Příklad (odeslané bajty): \n!36=36000\n

Zápis výše je schematický; mezery kolem jednotlivých částí nejsou součástí zprávy. Parser má rozumět řádkům ukončeným CR, LF i CRLF, aby bylo možné použít běžné terminály v Linuxu i Windows. Úvodní CR/LF je synchronizační znak, ne součást příkazu.

Protože se zpráva dokončuje koncem řádku, lze příkaz psát po jednotlivých znacích, libovolně pomalu. BAZbus nepoužívá protokolové časové mezery ani timeouty pro detekci rámce. Aplikace, která čeká na odpověď, si ovšem může z praktických důvodů stanovit vlastní časový limit.

2. Adresování

Adresa je jeden ASCII znak, nikoli desítkové číslo. Prakticky se používají 1, 2, … 9, dále a, b a podobně. Výchozí adresa nového zařízení je 1. Speciální je pouze *, které označuje broadcast. Ostatní znaky mohou být adresou (samozřejmě s ohledem na nutnost jednoznačného rámování).

!14 zařízení '1', příkaz 4
!24 zařízení '2', příkaz 4
!*4 všechna zařízení, příkaz 4

Na broadcast reagují všechna připojená zařízení. Je to výhodné například pro současné zahájení měření na více teploměrech: !*4. Odpovědi více zařízení se ale mohou elektricky překrývat. Broadcast proto používej hlavně pro operace, u nichž společná odpověď není nutná; pokud chceš odpověď, zařízení adresuj jednotlivě. Hvězdička pomůže také při práci se samostatně připojeným zařízením, jehož aktuální adresu neznáš.

3. Číslo příkazu a parametr: GET / SET

Po adrese následuje desítkově zapsané číslo příkazu (bez oddělovače). Je-li uvedeno =, následuje hodnota pro zápis. Bez rovnítka jde u příkazů podporujících čtení/zápis o čtení aktuální hodnoty.

!36 přečti hodnotu příkazu 6 na zařízení '3'
!36=36000 nastav hodnotu příkazu 6 na zařízení '3'

Formát hodnoty a odpovědi je definovaný příkazem konkrétního zařízení. Nelze předpokládat, že každá odpověď bude desetinné číslo nebo že každý příkaz bude podporovat obě operace. Některé příkazy pouze provedou akci a odpoví OK.

4. Společné příkazy a kompatibilita

Zpětná kompatibilita je důležitá: při návrhu nového firmwaru se nesmí měnit význam již používaných společných příkazů. Zvláštní význam mají především:

PříkazVýznamPoznámka
1INIT / identifikaceVrací adresu, název a verzi zařízení; může vrátit další diagnostické údaje.
4Zahájení měřeníVyhrazený význam. Používá se i broadcastem !*4; nepřiděluj jej jiné funkci.
OstatníPodle typu zařízeníNapříklad příkaz 6 může u jednoho zařízení ovládat časovaný výstup, zatímco u jiného čítač.

INIT: příkaz 1

Základ odpovědi na INIT je <adresa>:<název a verze>:<volitelné informace>. Adresa v odpovědi se v existujících zařízeních posílá jako dvouciferná hexadecimální hodnota ASCII kódu adresního znaku. Tedy 31 označuje znak 1, 32 znak 2 a 33 znak 3.

$ ./cquery $DEV '!31'
33:Cerpadlo 1.0:

Třetí pole je volitelné a nemusí mít obecný strojově parsovatelný význam. U zařízení s teplotními čidly se v něm často vypisuje seznam nalezených 1‑Wire ROM ID. Díky tomu může nadřazený systém poznat, zda jsou čidla vůbec připojená a kolik jich zařízení právě našlo.

$ ./cquery $DEV '!21'
32:Teplomer 2.0:0:28a88f540f0000ce,1:283428e700000026,2:287c78540f000021,3:28de50dc0600009e,

Indexy 0 až 3 jsou zde indexy teplotních čidel. 1‑Wire není dokonale spolehlivá: čidla mohou dočasně chybět nebo trvale selhat. V praxi se proto inicializace / objevování čidel opakuje a výsledek se porovnává s očekávaným počtem. Konkrétní počet pokusů a postup při nenalezení čidla jsou věcí nadřazené aplikace.

Start měření: příkaz 4

Příkaz 4 znamená spustit měření. U DS18B20 zahájí převod teploty, na který je potřeba počkat před následným vyčtením výsledků. Může být zaslán všem zařízením současně:

$ ./cquery $DEV '!24'
OK
$ ./cquery $DEV '!25'
0:08.5,1:34.1,2:36.0,3:23.4,

V tomto příkladu čte zařízení 2 příkazem 5 čtyři teploty. Příkaz 5 a formát jeho výsledku jsou vlastnosti tohoto teploměru, nikoliv automaticky každého zařízení BAZbus.

5. Časově omezené ovládání výstupů

V praxi se pro akční členy používá další důležitý návrhový princip: nezapínat nic navždy. Nadřazený systém nepředpokládá spolehlivost komunikace ani vlastní nepřetržitý provoz. Namísto trvalého ON pošle dobu sepnutí a příkaz pravidelně obnovuje.

$ ./cquery $DEV '!36=36000'
$ ./cquery $DEV '!36'
00000

V uvedeném zařízení je 6 příkaz pro časované sepnutí ventilátoru. Parametr je v desetinách sekundy: 36000 znamená 3 600 s, tedy jednu hodinu. Stejný princip dovoluje krátké impulzy, například 5 znamená 0,5 s pro elektrický zámek, pokud tak dané zařízení příkaz implementuje.

Opakované odeslání téhož časovaného příkazu má obnovit časový interval, nikoli k němu znovu přičítat další čas. Pokud řídicí systém přestane příkazy obnovovat, výstup po uplynutí času vypne samotné zařízení. Čtení bez = vrací aktuální stav či hodnotu podle implementace; z ukázky 00000 lze říct, že časování právě není aktivní, nikoli univerzálně určit, zda jiné zařízení vrací zbývající nebo posledně nastavený čas.

Tohle pravidlo časovaného ovládání je osvědčená aplikační konvence, ne univerzální význam příkazu 6 pro všechna zařízení.

6. EEPROM a číselné formáty

V referenčním firmwaru se příkazy 100 + N používají k přístupu do buňky EEPROM N. Buňka 0 uchovává adresní znak. Proto čtení adresy zařízení 3 vypadá následovně:

$ ./cquery $DEV '!3100'
33

Odpověď 33 je hexadecimální ASCII kód znaku 3, nikoli desetinná třiatřicítka jako adresa sběrnice. Protokol nemá univerzální datový typ odpovědi: EEPROM se čte jako HEX, některé čítače jako DEC, identifikace a teploty jako text. Implementace musí formát znát z dokumentace konkrétního příkazu. Zápis adresy do EEPROM se může projevit až po dalším načtení adresy firmwarem.

7. Praktické použití z Linuxu

Pro práci z příkazové řádky se používá nástroj cquery, kterému se předá sériové zařízení a čitelný příkaz. $DEV zde označuje cestu k sériovému portu (například /dev/ttyACM0).

$ ./cquery $DEV '!24'
OK
$ ./cquery $DEV '!25'
0:08.5,1:34.1,2:36.0,3:23.4,
$ ./cquery $DEV '!21'
32:Teplomer 2.0:0:28a88f540f0000ce,1:283428e700000026,2:287c78540f000021,3:28de50dc0600009e,

Samotnou komunikaci lze zkoušet i v obyčejném terminálu nastaveném na 19200 8N1. Při implementaci programu nezapomeň na úvodní synchronizační konec řádku a korektní převzetí řízení poloduplexního RS‑485 převodníku při vysílání a příjmu.

8. Pravidla pro novou implementaci

  • Přijímej ASCII řádky s CR, LF i CRLF; po konci řádku hledej !, pak jediný adresní znak a desetinné číslo příkazu.
  • Před odeslaným příkazem pošli konec řádku jako synchronizaci přijímače.
  • Vyhodnoť příkaz jen tehdy, odpovídá-li adresa vlastní adrese nebo *. Pamatuj, že při broadcastu mohou současně odpovídat více zařízení.
  • Respektuj společný význam 1 (INIT) a 4 (start měření), i když pro dané zařízení nemá měření smysl; nepřiděluj příkazu 4 jinou operaci.
  • Rozlišuj GET (bez rovnítka) a SET (s rovnítkem) tam, kde je příkaz podporuje. Nepředpokládej stejný formát všech odpovědí.
  • U akčních členů preferuj bezpečné, časově omezené požadavky opakovatelné bez kumulace času; definuj jejich jednotku a chování GET.
  • Nepředpokládej CRC ani zaručené doručení. Opakování příkazů, ověření výsledků a bezpečný stav při výpadku musí zajistit aplikace a zařízení.

9. Co BAZbus úmyslně nedělá

BAZbus nemá kontrolní součet. Poškozený, ale syntakticky platný příkaz tedy může projít bez odhalení – u ovládání výstupů s tím musí návrh počítat. Protokol ani neslibuje automatické opakování, doručení právě jednou či arbitráž odpovědí více zařízení. Nemá časově definované mezery mezi bajty jako Modbus RTU; jednotlivé aplikace mohou mít vlastní timeout pro čekání na odpověď, ale není to součást rámování BAZbusu.

Je to vědomý kompromis: příkaz lze napsat ručně a přečíst očima, aniž by člověk musel ručně počítat kontrolní součet. V systému, který vyžaduje silnou integritu dat nebo bezpečnostní garance, to nemusí být správná volba.

10. Poznámka ke kompatibilitě a rozsahu této specifikace

Společná pravidla popsaná výše jsou formát linky, adresování, synchronizace a význam používaných společných příkazů 1 a 4. Seznamy čidel, čísla 5, 6, 100+N, obsah EEPROM, chybové kódy a přesná podoba hodnot vycházejí z konkrétních existujících firmware a nejsou automaticky univerzální. Například starší Elektromer 2.0 používal příkaz 6 pro 16bitový čítač impulzů, kdežto zařízení pro ventilátor jej používá pro časování výstupu. Při psaní převodníku nebo nového zařízení proto vždy zdokumentuj také jeho vlastní mapu příkazů.

Tato specifikace popisuje ověřené používané konvence. Detaily, které zde nejsou definované – například délka maximální odpovědi, přesné timeouty hostitelského programu, zpracování chybných bajtů nebo chování neznámých příkazů v různých verzích firmware – se nemají domýšlet jako univerzální vlastnost BAZbusu.

Published by

Zanechat odpověď