Volba sběrnice pro modulární systém

Ľahko, použil som Exel :slight_smile:

Napríklad:

32B má správa od Mastra a aj od Slave spolu. Napríklad pre fiktívny jednoduchý, ale účinný bajtovo orientovaný protokol Master pošle správu:

  • 1B adresa Slave, (MSB smer vysielania M->S/S->M) a 7b adresa Slave
  • 2B subadresa s 1b príkazom WR/RD (2^15 adries z vnútorného priestoru Slave)
  • 1B počet bajtov ktoré sa majú preniesť, napríklad 20B
  • 2B CRC

Slave mu odpovie napríklad že:

  • 1B to som ja, oslovený Slave. Keďže sa jedná o prvý bajt správy, musí tu byť taká hodnota, ktorú iný Slaave nebude považovať za správu pre seba. To že sa jedná o začiatok správy je jasné, lebo sa pred týmto bajtom nejaký čas nič nevysielalo. Napríklad tie 2ms.

  • 2B posielam Ti nejaké moje vnútorné status bity, napríklad či som nebol náhodou reštartovaný, alebo či nemám nejaký interný problém z niektorou z periférií, ale kľudne tu môžu byť trvalo aj stavy nejakých vstupov a alarmy. Netreba kvôli nim potom robiť extra komunikácie.

  • 1B posielam Ti toľko bajtov kolko si chel, nie že by si nevedel, ale pre veľmi silnú kontrolu a ak by sa náhodou bajty preháňali cez I2C zbernicu, Master musí vedieť koľko bajtov si má načítať.

  • 20B požadovaných údajov

  • 2B CRC

Koniec správy sa pozná napríklad v MODBUSe tak, že po dobu 3,5 násobku trvania prenosu bajtu sa nič neprijme. To samozrejme nebráni počítať čas od posledného vysielania presne od ukončenia príjmu posledného bajtu.

Pre rýchlosť 19200Bd a 8N1 je čas bezpečne považovaný za ukončenie vysielania daný 3,5 * 10/19200 = 1,82ms.

Alebo bude protokol orientovaný ako ASCII (ale priepustnosť bude menej ako polovičná a dátovo ešte menej) a potom
MASTER:

  • 1B úvodný znak, napríklad ‘m’ , akože vysiela Master
  • 2 ASCII znaky adresa Slave napríklad “2F”
  • 4 ASCII znaky subadresa a príkaz napríklad “2AC7”
  • 2 ASCII znaky počet, napríklad “02”
  • 4ASCII znaky CRC
  • 0x0d ako koncový znak správy
    spolu 14 bajtov

SLAVE:

  • 1B úvodný znak, napríklad ‘s’ , akože vysiela Slave
  • 2 ASCII znaky adresa Slave
  • 4 ASCII znaky status bity
  • 2 ASCII znaky počet
  • 4 ASCII znaky pre požadované dva dátové bajty
  • 4ASCII znaky CRC
  • 0x0d ako koncový znak
    spolu 18 bajtov

Spolu je to v rámci jednej transakcie 32B. Predpoklad je, že medzi dvoma vysielaniami bude ťažko medzera kratšia ako 2ms už len kvôli spracovaniu údajov na strane Slave, alebo pri príprave novej transakcie na strane Mastra. Niekedy to môže byť viac niekedy menej. Ale ako priemer je to dobrý odhad.

Dokonca sa v niektorých systémoch nastavuje koľko času od príjmu posledného bajtu sa nesmie začať vysielanie a čas sa pohybuje okolo 5-100ms. Je to kvôli prepnutiu RS485 ale aj kvôli rôznym RF modemom staršej výroby, ktoré sa môžu na komunikačnej trase vyskytovať a ktoré automaticky transparentne prenášajú dáta a ktoré potrebujú na prepnutie ďaleko viac času ako rýchla RS485-ka.

Takže

1 transakcia, dve vyslané správy.
Čas oneskorenia 2x2ms. nikdy nemôže byť čas spracovania a prípravy správy nulový.
rýchlosť 19200Bd. Jeden bit sa bude vysielať 1/19200.

Pre 8E2 sa bude pre jeden bajt vysielať 12 bitov (start, 8 data, parita 2 stop). To je 625us.
32B* 625us = 20ms
20ms + 2x2ms = 24ms

Do sekundy prenesiem 41,67správy, čo je cca 42 správ.

Pre 8N1 to bude 32*10/19200 + 0,004= 48,39 správy, čo je približne 48 správ.

Ale v každej správe prenášam hore dole 32B.
Takže pre 8E2 to bude cca 42*32=1344B (1,34kB)
a pre 8N1 to bude cca 1536B (1,54kB)

Údaje v mojom predchádzajúcom príspevku sú o niečo väčšie, lebo čas na spracovanie mám nastavený o niečo kratší ako 2ms a nechcelo sa mi to kvôli príspevku všetko prepočítavať, ale rádovo to sedí.

Koľko je z tých prenesených bajtov skutočne užitočných, to už závisí na voľbe protokolu

Tu uvažovaný ASCII protokol je dobre spracovateľný a čitateľný “po ceste”, no z 32B sa preniesú iba 2B užitočných údajov. To je výťažnosť 100*2/32 = 6,25% v tomto konkrétnom prípade.

Pre binárny protokol je to už lepšie, lebo tam je percento užitočných údajov 100 * 20/32 = 62,5% v tomto konkrétnom prípade. Čím bude balík údajov väčší, tým bude efektivita vyššia no dostupnosť údajov z rôznych staníc bude horšia, lebo sa na ne zriedkavejšie dostane.

Takže si to stačí dať pre rôzne rýchlosti, veľkosti správ a prenosové nastavenia jednoducho do Exelu a je to. Nemám čas po sebe všetko kontrolovať, tak snáď som v tom celom nenarobil veľa chýb :slight_smile:

Zo všetkého je tiež vidieť, že naháňanie sa za vyššou prenosovou rýchlosťou a´la Ethernet nemá až taký efekt na množstvo skutočne prenesených dát.

Uvažujme reálne pre bežnú prenosovú transakciu tých 32B pre ovládanie domácej či priemyslenej automatizácie. Samozrejme je to iné pri streamovaní hudby či obrazu. Ale bavíme sa o ovládaní relátok, sledovaní stavov, teplôt a tak podobne.

1000ms/4ms = 250prenesených správ za sekundu i keby prenost trval nekonečne krátko. Prakticky viac nie a to je len cca 5,2x viac ako pri rýchlosti 19200Bd 8N1

pre 115200Bd a 8N1 je priepustnosť 32B transakcií
čistý čas jednej transakcie 32*10/115200Bd = 2,78ms
Čas aj so spracovaním údajov je 2,78ms + 2ms+2ms = 6,77ms

To je maximálne 148 správ za sekundu, čo je len 3x viac ako pri 19200Bd

pre 1MBb je to 231 transakcii, čo je len 4,8x viac ale nároky na prenosovú rýchlosť sú 52x vyššie.

To znamená, že ak sa nepracuje s DMA tak prerušenie kvôli prijatiu ďalšieho bajtu je až 52x častejšie. Ak sa náhodou v MCU vykonáva niečo čo musí zakázať prerušenie, ľahko hrozí strata bajtu.

DMA tiež nie je samospasiteľné, lebo tak či tak treba chodiť ten bufer sledovať. Ak sa to robí občas, narastajú prestoje a z 2ms oneskorenia odpovede môže byť ľahko ďaleko dlhší čas, čím zas ďalej degraduje výhoda použitia vysokej prenosovej rýchlosti.

Z hľadiska kompromisu zvyšovanie rýchlosti nad 57600/115200 už nič podstatné neprináša. Skôr hrozí zle prijatá správa pre nie dostatočne rýchle spracovanie prerušenia od UARTU v MCU bez DMA, prípadne pre zákmity na hranách signálu pre odrazy na vedení, či zvýšená citlivosť na rušenie.

V dnešných hw UARTOCH sa stred bitu testuje 3krát (napríklad ATmega1284P) a za prijatú hodnotu sa považuje prevládajúca hodnota.
Čas medzi vzorkami je 1/16 alebo 1/8 času trvania bitu. Pre 19200Bd je to 3,25us alebo 6,5us. Ak rušenie trvá kratšie ako tento čas, automaticky sa vyfiltruje.
Rušivý impulz od prepätia v čase trvania 8/20us (EN 62305, ochrana pred prepätím) zasiahne maximálne pol prenášaného bitu.

Pri rýchlosti 115200Bd je to už však 0,54us či 1,08us. To sú časy, kedy jednak už odrazy na vedení pri nie dostatočneu impedančnému prispôsobeniu môžu svojimi zákmitmi spôsobiť zlé načítanie hodnoty bitu v jeho strede a rušivý impulz 8/20us vie náhodne rozhodiť stavy bitov až vo vyše troch prenášaných bajtoch. Náhoda, že pri rozhodení bude sedieť aj parita je oproti 19200Bd značná. Tam jeden impulz rozhodí maximálne bit. Samozrejme, sú aj iné druhy rušenia, nie iba odrazy na vedení a jednotlivý impulz. No vždy ide o pravdepodobnosť a o to, čo skutočne od prenosu požadujem.