Domanda sul protocollo usato nelle reti CAN

Jul 04, 2024 Last reply: 2 anni fa 3 Replies

Se non vado errato, nelle reti CAN i messaggi non sono diretti ad un determinato destinatario tramite un indirizzo univoco del dispositivo sulla rete.



Se non ho capito male, sono dei messaggi etichettati in base al loro contenuto e che possono essere letti da qualsiasi dispositivo sulla rete sia interessato a quel contenuto.



Faccio un esempio del piffero. C'è una centralina che misura la pressione delle gomme e che invia questo dato ogni 5 minuti sul bus. Il messaggio è del tipo: "PRESSIONE GOMMA ANTERIORE SX 2.3bar". Sulla rete possono esserci più dispositivi che magari sono interessati a questo dato e che leggono contemporaneamente il messaggio, senza che il messaggio debba essere trasmesso più volte ad ogni singolo destinatario.



Ho capito bene?



Se è così, non mi è chiaro come funziona il controllo degli errori, in particolare come si può essere sicuri che il messaggio sia arrivato correttamente a TUTTI i nodi della rete interessati.



Arriva un ACK da ogni dispositivo interessato? Se sì, il nodo sorgente deve sapere quanti ACK deve ricevere per archiviare il messaggio come correttamente inviato?



Qualcuno ha voglia di illuminarmi?


Un bel giorno pozz digitò:

Tutto corretto. Si può aggiungere che tipicamente un certo ID è inviato soltanto da un nodo sul bus, per cui in un certo senso l'ID identifica anche il mittente di un messaggio. Però questa è solo una convenzione, non è fissato dallo standard CAN. Se due nodi inviano contemporaneamente un messaggio con lo stesso ID, "vincerà" quello che per primo dopo l'ID manderà uno 0 (perché sarà il primo che manderà un bit dominante, che corrisponde a 0, e quindi l'altro nodo abortirà l'invio). Per lo stesso motivo si dice che gli ID più bassi hanno priorità maggiore: se due nodi inviano contemporaneamente un messaggio, quello con l'ID più basso forzerà per primo il bus dominante e bloccherà l'altro.

Non si può essere sicuri. E' sufficiente che un qualsiasi nodo (anche un nodo che poi ignorerà quel messaggio) risponda positivamente forzando il bit ack come dominante, affinché la trasmissione sia considerata un successo dal nodo che trasmette.

L'acknowledge hardware della CAN serve solo per rilevare fault elettrici. Se ti serve un "vero" acknowledge, devi usare protocolli che stanno sopra al livello fisico-dati della CAN, come ad esempio CANOpen. Con quello ogni nodo ha anche un indirizzo, puoi mandare messaggi broadcast, puoi richiedere un acknowledge (sotto forma di un altro messaggio CAN), eccetera.

Il 04/07/2024 15:28, dalai lamah ha scritto:

Sì, è sensato.

Per poi inviarlo in un secondo momento, immagino.

Sì, questo mi è chiaro.

Fammi capire, quindi l'ACK viene inviato da *tutti* i nodi della rete che ricevono il messaggio e non solo da quello che effettivamente lo processa? E chiaramente la sovrapposizione di ACK viene visto sempre come un unico ACK dal nodo trasmittente.

Immaginavo fosse più complicato.

"pozz" ha scritto nel messaggio news:v66f55$2lskp$ snipped-for-privacy@dont-email.me...

perche' l'ACK e' generato a livello hardware, e' il controller che lo genera, non il software che decodifica/utilizza il messaggio. esiste anche l' "error frame", ossia una serie di 6 bit dominanti che il controller puo' trasmettere quando non capisce il messaggio, nel senso che la trama o il crc sono sbagliati.

formatting link
per quanto riguarda l'indirizzamento, esiste il protocollo CanOpen, molto usato in ambiente industriale, che non e' altro che uno strato software che si basa su bus can, in cui nel message ID viene codificato l'indirizzo della periferica permettendo un uso del bus can come rete master/slave. ovviamente tutti i nodi devono essere CanOpen perche' funzioni.
formatting link

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required