[ boogi @ 03.04.2022. 19:32 ] @
Pozdrav,
Radim na projeku koji treba da sadrzi 5 Arduina Mega. Hardverska osnova komunikacije izmedju njih 5 su RS485 moduli.
Moje pitanje ili savjet je vezano za softverski dio.
Svaki od njih moze zapoceti komunikaciju tj poslati podatak koji ostali treba da razumiju i postupe u skladu sa podatkom. Najjednostavnije bi bilo to ostvariti putem Serial.print komande medjutim tu mi se otvaraju mnoga pitanja tipa da li su svi ostali ispravno "čuli" sta je "onaj koji govori" rekao.Sta ako je jedan cuo samo dio poruke ili je cuo citavu poruku ali nepravilno. Ili sta ako 2 nisu razumila poruku?
Ima li kakvo "gotovo rijesenje" da bi se moglo koristiti a da vodi brigu oko svih tih pojedinosti da svi dobiju poruku i da bude tacno prenjeta svima...
Boogi
[ bogdan.kecman @ 03.04.2022. 22:33 ] @
Citat:
boogi:
Svaki od njih moze zapoceti komunikaciju tj poslati podatak koji ostali treba da razumiju i postupe u skladu sa podatkom.


RS485 zahteva da moras da imas MASTER! mozes da napravis tzv. multimaster protokol a to se pravi tako sto imas jedan master i imas protokol po kome se nekom drugom dodeljuje da bude master po potrebi. Samim tim sto si napisao ovo pitanje odgovor je da ti ne umes da to implementiras. Multimaster RS485 je ultra kompleksan protokol sa "prosledjivanjem mastershipa" koji mora da implementira collision avoidance, collision detection, message send retry.. a ti pricas o serial.print :)

evo ti biblioteka koja podrzava sve to sto ti treba (concurrent multi drop / multi master) ... tu imas sve sto ti treba, a dal ces uspeti da se snadjes, ne znam, probaj .. realno lik je resio sve probleme samo je pitanje dal ces se ti snaci ... imas primere trebalo bi da ti je to dovoljno
[ veselinovic @ 04.04.2022. 05:51 ] @
Zavisi od kolicine podataka koji se salju, od frekvencije slanja ( tipa poruka od 100 B svaklih 100 ms)i od zahtijevanog vremena kasnjenja poruke.
Ako zahtijevi nisu prestrogi, konfigurises master i 4 slave arduina.
Kad Slave 2 hoce poslati poruku ka slave 3, ide ovako:
Master proziva jednog po jednog sa pitanjem imas li sta za mene?
Kad dodje do S2 on mu kaze imam i da poruku.
U zaglavlju poruke ce pisati salje Sl 2 prima Sl3.
Svi prime poruku ali je samo Sl3 procesuira, jer je njegova
U iducem koraku masrter pita Sl3 imas li sta, i on bi trebao odgovoriti Sl2 da je primio korektnu poruku.

[ boogi @ 04.04.2022. 18:36 ] @
Da...

Mozda nisam dao dovoljno informacija....
Generalno jedan arduino je vazan na relee i on je izvrsni a ostala 4 su upravljacka. Na svaki upravljacki je vezan po jedan LCD i par tastera za navigaciju kroz LCD i jedan taster SEL. Komunikacija pocinje onog momenta kada se pritisne taster SEL i taj na kome je pritisnut SEL salje info o svom stanju. Svi ostali treba da slusaju i promjene kod sebe stanje ( onaj sa releima da upali/ugasi oderdjene relee a ovi sa LCDovima da upisu u svoje registre da se prilikom listanja na njima to stanje vidi).
To bi izgledalo npr ovako.
RELE1 je off. RELE2 je off .... Kad na LCD1 promjenim RELE1 na ON, onaj sa releima ce upaliti rele1 a ostali sa LCDovima ce u meniju prikazati stanje relea1 kao ON.
Ovde generalno svi "sute" dok se ne pritisne negdje SEL. Duzina poruke je 20-30 bajtova. Sve ovo fino radi sa Serial.print. Problem nastaje onog momenta kada neki od njih nije "cuo" poruku. Na njemu se nece dogoditi promjena. Mogu napraviti da onaj koji je slao poruku "oslusne" u odredjenom vremenskom periodu ima li recimo nekakav zahtjev za ponovnim slanjem poruke pa da ponovo posalje poruku ali se problem realno moze desiti ako dvojica ne razumiju poruku pa obojica pokusaju poslati zahjev za ponovnim slanjem.Dolazi do koalizije .
Isto tako realno je nemoguce (u uslovima u kojim se koristi sve ovo )da se desi da se istovremeno na 2 LCDa pritisne u isto vrijeme SEL tako da ta mogucnost da dvojica pocnu se prenosom poruke je skoro nemoguca.

Bogdane, nisam uspio naci gdje mi je poslana biblioteka.

Jovane, tako nesto slicno sam u startu bio napravio ali mi se opet otvaralo pitanje sta ako neko ne razumije poruku ili slicno. Naravno da je lakse ako sam pitao npr treceg i on nije razumio. Reci ce "molim te ponovi" i obraca se masteru. Previse mi je bilo robusno to sto sam napisao pa sam razmisljao da to skratim na vec neko postojece rijesenje.

Hvala u svakom slucaju.
[ bogdan.kecman @ 04.04.2022. 19:28 ] @
pojeo ES link :( evo ti opet:

https://github.com/MichaelJonker/HardwareSerialRS485

a imas i ova dva:

https://github.com/adrav/rs485dom

https://github.com/AiratS/qiwi

Citat:

Generalno jedan arduino je vazan na relee i on je izvrsni a ostala 4 su upravljacka. Na svaki upravljacki je vezan po jedan LCD i par tastera za navigaciju kroz LCD i jedan taster SEL. Komunikacija pocinje onog momenta kada se pritisne taster SEL i taj na kome je pritisnut SEL salje info o svom stanju. Svi ostali treba da slusaju i promjene kod sebe stanje ( onaj sa releima da upali/ugasi oderdjene relee a ovi sa LCDovima da upisu u svoje registre da se prilikom listanja na njima to stanje vidi).


ne treba ti za to multimaster, cak stavise, multimaster je tu pogresan dizajn sistema.

taj "izvrsni" stavis da bude master i on u krug non stop pita 4 "upravljacka" nesto tipa "sta imate za mene" oni mu odgovore i on odradi sta ima da odradi... ne postoji razlog da imas drugi master tu

dakle nesto tipa ovoga ti je glavni loop

Code:

statechanged=0;
while(true)
  for (int i =0;i<4;i++) 
    statechanged = checkState(&state, statechanged, i);


a checkState bi bilo nesto tipa
Code:

uint8_t checkState(state_tp state, uint8_t statechanged, uint8_t idSlave){
  state_t stateRCV;
  msg = packRS485Message(state, statechanged, idSlave);
  stateRCV = sendRS485Message(msg);
  if (stateRCV.changed != 0) {
    memcpy(&stateRCV, state, sizeof(state_t));
    return 1;
  }
  return 0;
}


znaci u krug cimas jedan po jedan slave, ako bilo koji od njih vrate changed > 0 sto znaci da se tamo nesto desilo (neko je stisno neki taster, okrenuo neki tocak, senzor procitao neku vrednost) ti paket koji si dobio od njega zapamtis lokalno, a svaki put kada prozivas slave taj svoj paket saljes samom slave-u koji onda updateuje svoj ekran ... to ti je ovako ugrubo dalje od toga moras sam... ali realno master/master ovde ne treba, ne trebaju ti sa ekranima nikad nista da salju sami / da bilo sta iniciraju, master, taj koji radi nesto fizicki, on ce ih proziva sve i da distribuira sve podatke i uzima evente direkt sa njim onda kada moze (u krug non stop)

[ boogi @ 10.04.2022. 13:44 ] @
Bogdane hvala na sugestiji...

Definitivno vidim da ako hocu da znam pouzdano sta se desava moram imati master i slejvove....To sto si rekao za prozivanje i slanje promjene je odlicno i nesto tog tipa cu implementirati.

Meni opet ostaje nedoumica...npr situacija...na Slave 03 se dasila promjena. Master je prozivao 01 i 02 i na njima je samo updejtovao displej a od 01 i 02 nije imao povratnu info da se desila promjena. Kad je upitao 03 on je poslao odgovor masteru da ima promjena i poslao je podatke o promjeni. Master zbog XY razloga nije to razumio. Primio je nesto, zna da ceka odgovor od 03 ali nije ok ta info koja je stigla( nije odredjenog formata, nije odredjene duzine....). Sta u tom slucaju? Ja mogu ponovo prozvati 03 da posalje info. Sta ako opet master i drugi put ne raumije? Koliko puta master da ponavlja upit? Ili da ga ne ponavlja nego da odbaci info na prvu pa proziva dalje 04 , pa u sledecem krugu ponovo da isproziva 01, 02 pa kad dodje do 03 da mozda tad primi ok info.

Generalno nemam iskustva sa protokolima... kako se ponasaju kad dobiju "neispravan" paket.

Jos jednom hvala na pomoci.
[ bogdan.kecman @ 10.04.2022. 14:38 ] @
Citat:
boogi:
Kad je upitao 03 on je poslao odgovor masteru da ima promjena i poslao je podatke o promjeni. Master zbog XY razloga nije to razumio. Primio je nesto, zna da ceka odgovor od 03 ali nije ok ta info koja je stigla( nije odredjenog formata, nije odredjene duzine....). Sta u tom slucaju?


spominjao sam da jedna od stvari koja mora se napravi je "message send retry"
sta je fora svaki "master pita, slave odgovara" dogadjaj mora da bude siguran, znaci nema "nije rezumeo" :)
imas 2 nacina da resis to
1. na svaki poslati paket onaj koji je primio paket salje ACK sa CRC-om poruke koju je dobio - ovo tebi mislim da ne treba
2. poruka koja se salje uvek sadrzi svoj crc i proverava se samo na strani primaoca ... u tvom slucaju dovoljno da samo master radi proveru

tako da bi jedna iteracija (jedna komunikacija master-slaveX)

Code:


pocni:
master -> slave: paket [node:X, sender:master, paketTip:paketsastrukturompodataka, data:strukturasadrzaj, crccelogpaketa]
slave -> master: paket [node:master, sender:X, paketTip:odgovornastrukturu, primiook:true/false, imamizmenezatebe:strukturasadrzaj, crccelogpaketa]

ako je primiook true pici dalje, ako je false goto pocni:

ako je crccelogpaketa ok zavrsio si goto kraj:


master -> slave: paket [node:X, sender:master, paketTip:ponovi zadnji odgovor,crccelogpaketa]
slave -> master: paket [node:master, sender:X, paketTip:odgovornastrukturu, primiook:true/false, imamizmenezatebe:strukturasadrzaj, crccelogpaketa]

ako je primiook false ili je crc pogresan goto pocni:


kraj:


to ti je otprilike tako nekako ... mada sve ove biblioiteke imaju vec u sebi auto-retry i sve sto ti je potrebno da bi sigurno prebacio paket sa jednog na drugi node


Citat:
boogi:
Ja mogu ponovo prozvati 03 da posalje info. Sta ako opet master i drugi put ne raumije? Koliko puta master da ponavlja upit? Ili da ga ne ponavlja nego da odbaci info na prvu pa proziva dalje 04 , pa u sledecem krugu ponovo da isproziva 01, 02 pa kad dodje do 03 da mozda tad primi ok info.


to je tvoja odluka, sta zelis da se tada desi...
- mozes da radis retry beskonacno
- mozes da posle 10 (ili 3 ili 30 ili 100 ili ..) neuspesnih retry proglasis nodeX kao neispravan i vise ga ne prozivas do reseta uredjaja, smatras da je neispravan
- mozes da posle 10 (ili 3 ili ...) neuspesnih retry da proglasis celu spravu neispravnom, posaljes svim slave "momci prikazite veliku kitu na ekranu crkli smo"
- mozes da ... upalis alarm neki

realno sve je na tebi .. mozes da posle 10 neuspesnih retry samo ides dalje pa kad taj opet dodje na red opet probas 10 puta pa opet picis dalje ... to je tvoja odluka, mozda ti je slave1 ultra bitan a slave4 nebitan pa ako se sa slave1 desava problem zabodes celu masinu a slave4 ako se ne javlja samo ga otkacis da vise ne postoji...