Voor het eerst probeer ik de CAN bus uit. Ik heb de MCP2515 daarvoor en een PIC24F. Het verzenden/ontvangen van gegevens over de bus heb ik inmiddels prima onder controle met 2 nodes. Fijn om te zien hoe eenvoudig CAN werkt.

Nu sta ik voor de keuze, zelf een protocol verzinnen om de data tussen mijn PCB's uit te wisselen, of een standaard aanhouden.

Nu ben ik vandaag de gehele dag wezen lezen naar CANopen maar het is me nog steeds onduidelijk. Daardoor heb ik nog geen idee waar ik mee moet beginnen om het te kunnen implementeren.
Met name de werking van de Object Dictionary. Voordat ik uitgebreid met mijn specifieke vragen erop in ga, weet iemand mij hier meer over te vertellen? Hoe ziet dit eruit in C?

En is het de moeite om te houden aan een standaard? Ik heb het gevoel dat als ik zelf een protocol verzin, dat ik binnen enkele dagen het e.e.a. wel goed werkende heb maar dat ik met CANopen zomaar nog een aantal weken moet werken.

Even over de toepassing;
Er zijn ca. 40 PCB's die events moeten genereren (schakelaars) en ca. 4 PCB's die deze events moeten oppakken. Dat is de basis. Daarbij moet er via de bus ook wat configuratie gedaan kunnen worden aan elk individuele PCB.

ik denk dat www.vscp.org misschien een goed alternatief kan zijn...

Het lijkt me wel zinvol om CANopen aan te houden; er is een library objecten voor het aansturen van I/O, het aansturen van bewegingen en nog veel meer.

CANopen is eigenlijk heel simpel; er zijn SDOs (service data objects) en PDOs (process data objects). Dit heeft niets met objecten in C te maken. Die objecten zijn simpelweg een adres en een datatype.

Ik begrijp van PDO's dat deze doorgaans verzonden worden door events. Wat ik me dan afvraag; over de CAN bus is het zo dat slechts één node in het netwerk een acknowledge dient te geven dat het bericht correct is overgekomen.

Ik kan me voorstellen dat er best nodes kunnen zijn die het bericht mogelijk verstoord binnen kunnen krijgen. Dit gaat dan ongemerkt, toch?

Stel bv. ik heb schakelaar A,B,C naast elkaar liggen en de uitgangen 100 meter verderop D,E,F die ook naast elkaar liggen.

Nu zend A een event (via tPDO) die bestemt is voor D. In de 100 meter kabellengte raakt de frame helaas verstoord. Dit wordt natuurlijk correct opgemerkt door D,E,F en doen verder niets met het frame want deze is ongeldig geworden.

Echter de naastliggende schakelaars B en C hebben het bericht wel goed ontvangen en geven een acknowledge.
De node A weet dan niet beter dan dat de frame correct op de bus is geplaatst en zal dus niet een re-transmit doen.
Lijkt me toch wel een onveilige situatie.

Dien je dit dan met SDO's te doen?

Indien ja, wat is dan nog het voordeel van de CAN bus t.o.v. een normale master-slave RS485 bus indien je garantie nodig hebt dat het bericht bij iedereen goed is overgekomen...

Van zodra een node een error op de bus detecteert zal hij de bus in error-status trekken (ik geloof 6 dominante bittijden). Op die manier weet de zender dat er iets fout gelopen is. Dit zijn natuurlijk CAN errors en geen errors op hoger niveau.

Het voordeel van een CAN bus tegenover RS485 is dat CAN multi-drop/multi-master is. Iedereen kan vrij op de bus "spreken", zolang aan het protocol voldaan wordt. Er is geen enkele master. RS485 moet je daisy chainen of een andere manier van collision-avoidance doen.

En het grote voordeel van CAN is en blijft dat het belangrijkste bericht altijd de arbitratie overleeft, en je, omdat het een multi-master bus is, niet alle deelnemers hoeft te pollen voor nieuwe data.

"het" alternatief voor zo'n arbitratie bij een multi-master bus is token ring, zoals ook bij Profibus gebruikt wordt. Begin daar maar eens aan; dat is geen blikje wormen meer, maar een olievat vol. Lange en onvoorspelbare vertragingen, geen prioriteiten op de bus, verloren tokens, dubbele tokens, zoeken naar busmasters, etc.

Het is onwaarschijnlijk dat het bericht onderweg verminkt wordt, terwijl de bus aan de kant van de zender er nog goed uitziet. Bij SDO's wordt, als ik me goed herinner, altijd een reactie verstuurd door de ontvanger, dus dan weet je wel zeker dat het goed aangekomen is.

Het idee van PDO's is, min of meer, dat de data op de bus gepubliceerd wordt, en iedereen die het nodig heeft, kan het gebruiken. Het bericht is niet aan een andere deelnemer geadresseerd, dus er is ook niemand die een reactie zou moeten sturen.

Dus een CAN transmitter zend een frame, één of meerdere nodes kunnen in de ACK ruimte reageren dat ze het goed hebben ontvangen. Dit houdt in dat in ieder geval één of meer nodes het bericht correct heeft ontvangen.

Indien er ook nodes zijn die het bericht onjuist hebben ontvangen, dan wordt er na de ACK. slot een error frame gegenereerd en zal de transmitter opnieuw het bericht doen toesturen.

De nodes die het bericht dan correct hadden ontvangen, zullen nu opnieuw de CAN frame ontvangen. Is dit zo?

[Bericht gewijzigd door willyp op (12%)]

Dat is ongeveer correct. Er wordt geen error frame gegenereerd na de ACK, maar gewoon als een node een error detecteert. Dit kan dus om op het even welk moment zijn. Meestal zal dit na de CRC zijn als een node detecteert dat deze niet overeenkomt. De zender kan zelf ook zo'n error frame genereren als hij bv. een recessieve bit verstuurd en er een dominante op de bus staat (na arbitratie). Hier is een mooie site over errors bij CAN: http://www.softing.com/home/en/industrial-automation/products/can-bus/…

Nu zou ik mij niet te veel zorgen maken om fouten op de CAN bus, tenzij je echt met kritieke zaken bezig bent. De CAN bus is namelijk zeer resistent tegen fouten.