Veselinovicu, ukratko.
Sta treba da se uradi?
1. Master treba da na pocetku komunikacije izvrsi enumeraciju svih slave-ova
2. Dalje u toku komunikacije, master treba povremeno da izvrsi enumeraciju novih slave-ova, koji su naknadno dodati u sistem.
Kako se razlikuju slave-ovi?
1. Imaju ASCII ime, za koje nije garantovano da je jedinstveno
2. Imaju 48 bitni broj S_ID koji je jedinstven
Sta ce mater raditi kada identifikuje slave?
1. dodelice mu jedinstveni broj M_ID (recimo jedinstveni broj u opsegu 1..255), koji ce u masterovoj listi slave-ova biti povezan sa jedinstvenim identifkacionim brojem slave-a S_ID.
M_ID S_ID
1 0x442738
2 0x44274c
3 0x4429a7
...
Kako slave zna kada mu se master obraca?
1. dok nije identikovan, prati broadcast poruke, i poruke sa svojim jedinstvenim identifikacionim brojem S_ID (za dodeljivanje M_ID).
2. kada je identifkovan pa na dalje, prati poruke sa M_ID-om dodeljenim od strane mastera
Ako zelimo da koristimo vremenske slotove, treba da razmislimo koliko cemo vremenskih slotova da upotrebimo. Veliki broj slotova ce osakatiti komunikaciju.
Posto je jednoznacni identifikator S_ID duzine 48 bita, trebali bi da upotrebimo ogroman broj slotova (2^48), da bi se izbegle kolizije.
Ako vec ne mozemo da izbegnemo kolizije, treba da razmislimo kako se moze implementirati detekcija istih.
1. Detekcija kolizije od strane slave-a za vreme slanja, i prekid istog verovatno ne dolazi u obzir, posto mikrokontroleri i RS485 drajveri, nisu dizajnirani za ovu funkciju. Eventualno se moze pratiti stanje busa, pre pocetka slanja odgovora.
2. Preostaje detekcija od strane master-a, npr. primenom EDC-a, kao sto je CRC32, na osnovu koga moze sa odredjenom pouzdanoscu da odlici da li je odgovor koji je primljen od slave-a ispravan ili ne.
Zasto onda ne upotrebimo i vremenske slotove i detekciju kolizija?
Na pocetku komunikacije master salje komandu za enumeraciju, koja sadrzi n i s, koja znaci znaci da:
1. svaki slave koji do sada nije identifikovan od strane mastera (koji nema M_ID) treba da na osnovu s i S_ID pripremi hash vrednost duzine n bita
2. s je seed za izracunavanje hash-a
3. na raspolaganju ce biti 2^n slotova za odgovor
4. svaki slave koji do sada nije identifikovan od strane mastera (koji nema M_ID) treba da unutar vremenskog slota ciji je redni broj jednak izracunatoj hash vrednosti, posalje S_ID i EDC kod.
Ako master na pocetku konekcije posalje komandu za enumeraciju sa recimo n = 8, bice na raspolaganju 256 vremenskih slotova.
Nakon slanja komande za enumeraciju, master slusa odgovore, i pamti sve odgovore sa ispravnom kombinacijom S_ID i EDC.
Kada prodje vreme za sve vremenske slotove, master individualno kontaktira svaki od ovih slave-a putem zapamcenih S_ID-ova , i dodeljuje im jedinstveni M_ID. Ovde moze da se implementira dodatna kontrola.
Zatim master moze da ponovi proceduru par puta, pri tome menjajuci s, kako bi bilo moguce da se slave-ovi koji su prvi put imali istu hash vrednost raspare, i sledeci put okupiraju druge vremenske slotove.
Kada nakon slanja komande za enumeraciju, izostane odgovor za vreme trajanja svih vremenskih slotova, svi slave-ovi su identifikoavni.
Treba biti pametan i smisliti kako ce raditi hash funkcija koja za ulaz ima vrednost s, i S_ID, a za izlaz hash vrednost duzine n bita.
Dalje u komunikaciji, kada je ocekivani broj novih slave-ova u jedinici vremena mnogo manji nego na pocetku iste, master moze povremeno da zapocne proceduru enumeracije novih slave-ova sa n=2, n=4 itd, da bi se manje gusila komunikacija sa manjim brojem vremenskih slotova.
Ukoliko se neki slave resetuje, on ce se prilikom sledece enumeracije slave-ova ponovo javiti masteru, a master ce mu dodeliti isti M_ID (3), na osnovu S_ID-a (0x4429a7), koji ima u listi slave-ova.
[Ovu poruku je menjao scoolptor dana 19.08.2019. u 13:56 GMT+1]
People are the greatest asset.
The dedicated 5% that can compensate for the remaining 95%.