Zkušenost programování master-slave s využitím RS-485

Ahoj,

ráda bych se zeptal,zdali někdo má zkušenost s komunikací jednoho master-u s dvěma a více slave-y s využitím sběrnice RS-485. Zají má mě jaká je filozofie komunikace. Nejlepší by by nějaký příklad, odkaz na literaturu, nebo rovnu nějaká vaše práce.

Díky za rady

:arrow_right: administrator: přejmenováno z "Zkušenost programování master-slave"

Skusenosti bohate.

Dnes je asi najlepsie si nastudovat definiciu MODBUS a to bud ASCII, alebo RTU

popis je napriklad:

modbus.org/docs/Modbus_over_ … _V1_02.pdf

jedna sa o celkom dobry protokol a hlavne je standartom.

Inak sprava od mastra by mala mat strukturu

  • koho volam: 1B adresa SLAVE
  • co od neho chcem: RD/WR - priznak, moze byt sucastou subadresy
  • odkial, alebo kam to chcem: subadresa 1 alebo 2B-ova, podla rozsahu komunikacie
  • data, ak zapisujem
  • nejaka kontrola, CHS, alebo CRC

Slave ma odpovedat

  • <adresa Slave, aby mal master istotu, ze komunikuje so spravnym slave, ale nemusi>
  • data, ak je RD zo Slave
  • nejaka kontrola, CHS, alebo CRC

ak sa rozhodnes pouzit ASCII protokol, t.j. kazdy bajt tejto struktury budes prenasat ako dva ASCII znaky, nezabudni na zaciatok navrhnut nejaky start znak, napriklad ‘:’, alebo ‘m’ - akoze vysiela master. A na koniec vyslat aspon 0x0d. Slave tak velmi jednoducho identifikuju zaciatok i koniec spravy

Slave by mal VZDY odpovedat, i ked sa mu posielali data aby bola kontrola, ci spravu vobec v poriadku dostal.

Mozes si vymysliet nieco vlastne, ale ten MODBUS je celkom v pohode. Ma trochu viac moznosti, ale predsa nemusis vyuzit vsetky jeho prikazy.

:arrow_right: administrator: přiloženy externí soubory
Modbus_over_serial_line_V1_02.pdf (319 KB)

Osobne jsem pouzival 9-bit uart.

1.B adresa, 9-bit uart, 9.bit určuje, že jde o adresu
přepnutí určeného slave na příjem bez ohledu na 9.bit
2.B prikaz, obsahuje počet bytů zprávy
dalsi data
posledni XOR vsech predeslych mimo adresy
slave se zpátky přepne na detekci 9.bitu

9-bit uart ma tu vyhodu, ze vetsina řadičů lze nakonfigurovat tak, že pokud ma 9.bit spravnou hodnotu, tak procesor zareaguje jinak si provozu nevšímá. Není to pak třeba řešit SW, ten zajímá jen 1.B s adresou a teprve kdyz patří jemu, přepne se na příjem bez ohledu na 9.bit a přijímá další data.

Je vhodné si také vyhradit “broadcast” adresu, za níž obsažené příkazy/data zpracují všichni slave. To je důležité např. pro synchronizaci. Běžným provozem všem řekneš, co mají dělat a na určitý broadcast to teprve provedou, je-li třeba aby to provedli současně.

Tak nějakou práci zveřenit nemohu. To by mě zaměstnavatel hnal svinským krokem, ale nějaké zkušenosti prozradit mohu.
Komunikace master-slave tedy česky mluvčí-posluchač je takovým nejjednodušším učebnicovým příkladem komunikace např. na linkách RS485. Master se ptá, slave mu odpovídá. Je v podstatě jedno, jaký formát datového rámce zvolíš, protože tento způsob komunikace má řadu nevýhod, jako je malá propustnost dat. Mezi hlavní nevýhodu patří to, že slave nemůže samovolně vysílat data, musí čekat, až se ho master zeptá a master musí pokorně čekat na odpověď slave. I přesto se hojně požívá.

Velmi důležité je, aby zařízení na sběrnici správně identifikovaly datové pakety. K tomu slouží např. 9. bit, jež je nahozen pouze u 1. byte, kterým je zpravidla adresa. Tím je také označen jeho začátek. Lze též použít nějaký znak, který ovšem nesmí být použit nikde uvnitř paketu. Pokud je potřeba přenést hodnotu shodnou s tímto znakem, nahrazuje se sekvení dvou jiných znaků. Též lze použít časové prodlevy mezi znaky. Paket je rozpoznán, když před ním je X ms trvající mezera.
Před tímto způsobem varuji, neboť může vést ke komplikacím zvlášte u implementací na PC. PC není schopno dodržovat stanovené mezery a protokol je pak nestabilní. Pakety se modou rozpadnou na více částí z nichž některé ke smůle mohou dávat smysl pro naslouchající zařízení.

Druhou neméně důležitou věcí je test integrity přijatého paketu. Může být na trase porušen a je třeba to nějak zjistit. Proto se používá v nejjednoduším případě kontrolní součet. Pro velké pakety a časté rušení je bezzubý. Nutno přidávat pak rámcový paritní bit, nebo CRC. Tyto metody však odhalí pouze chybu, maximálně ji lokalizují, ale nedokážo ji opravit a musí se paket opakovat. V případech velkého rušení nebo při velkých rychlostech by se pakety časo opakovaly a proto je výhodnější použít např. Hammingovy samoopravné kódy, které dokáží nejen identifikovat chybu, ale taky ji opravit. Čím větší je zabezpečení dat, tím více se musí přenést redundantních byteů takže je něco za něco.

Vlastní stavba paketu už může být jakkoli rozmanitá, ale nevhodný formát povede ke komplikaci při zpracování. Např. není-li v hlavičce paketu udaná délka na začátku, naslouchající zařízení jej nemůže odmítnou, má-li malý nebo zaplněný buffer. Dobré je, když hlavička obsahuje adresáta i odesilatele. Je to výhodné pro diagnostiku. Z odposlechnutých paketů lze snadno odvodit kdo s kým komunikuje. Také je dobré, když je v paketu rozlišeno, zda jde o povel mastera nebo odpověď slave. Pozor, nelze se spokojit pouze s rozlišením dle adresy, porotože naslouchající slave nemusí znát adresu mastera ani odpovídajícího slave a tak by paradoxně mohlo dojík k tomu, že na odpověď slave bude reagovat jiný slave, který ji bude interpretovat jako povel.

A jěště něco k hardware RS485. Probíral jsem se mnoha datasheety od předních výrobů jako je Texas Instruments, Maxim , Analog Devices a nejvíce informací jsem našel v aplikačních poznámkach 1. jmenovaného. Nicméně jde o jakési vodítko, nikoliv konečné zaručené řešení. Používání transilů (TVS) sice chrání odbvody, ale také limitují přenost dat při rozdílném potenciálu a dokáží ho i znemožnit. Někde použivájí unipolární transily, které bohužel limitůjí záporná napětí ačkoli je obvod schopen je zpracovávat do -7V.