wie ihr vielleicht wisst beschäftige ich mich schon länger mit dem Thema SPS->Verbindung Märklin Digital (6021 oder/und CS2). Dazu hab ich eine Frage, in einem andern Thread hab ich ja gesagt, dass ich einen SPS-gesteuerten Sbhf plane bzw. baue. Anfangs wollte ich die Weichen direkt über eine digitale Ausgangskarte der SPS schalten, und zum Stoppen der Züge einfach den Strom im Gleis abstellen sobald der vorderste Zugteil eine vorbestimmte Position X erreicht hat, welche über einen Reedkontakt der SPS signalisiert dass der Zug am Haltepunkt angekommen ist.
Mittlerweile hab ich mich aber nebenher auch noch mit dem Thema http://stummiforum.de/viewtopic.php?f=21&t=68788 beschäftigt, dazu auch noch mit dem Einfließenlassen der Weichenstellungsrückmeldung ins SPS-Programm. Die Eingänge dafür sind schon integriert, jedoch ist noch das Problem, dass ich im Schattenbahnhof keinen Sichtkontakt zu den Zügen hab, und auch nicht will ,allenfalls mit ner Webcam zum ab und an mal gucken ob alles ok ist, aber im Großen und Ganzen solls von alleine laufen. Da das mit dem Anhalten der Züge durch stromlosmachen nicht so ganz das ist was ich mir vorgestellt hab, weil da immer das Problem auftauchen kann dass die Züge falsch rum losfahren.
Also hab ich mir gedacht, ich könnte doch versuchen die Züge mittels der SPS aktiv zu steuern, in dem ich direkt auf die gefahrene Geschwindigkeit einwirke und die entsprechenden Befehle über eine CAN-Karte und den CAN-Bus direkt in die CS2 einspeise, oder per Interface 6051 in die Control Unit 6021, und dann per Connect 60128 in die CS2. Da ist aber die Frage, wie sieht das CAN-Protokoll aus, und kann man überhaupt von außen mit ner Industriesteuerung da Signale drüberschicken? Also sowohl zum Schalten der Weichen, Steuern der Züge und der Rückmeldung der Weichenposition?
Wär nett wenn da einer was dazu schreiben könnte, insbesondere zur Anbindung der SPS an die 6021 (per Interface 6051) oder die CS2 (per Connect 60128).
Danke euch und Gruß
Gregor
Loks und Wagen ohne Kulissenführung, Pikoloks mit Smartdecoder und nicht maßstäbliche Wagen können mir gestohlen bleiben...
das zweite kenn ich, die Infos aber irgendwie nicht gefunden. Vom ersten hab ich auch schon gehört, ich wusste aber nicht mehr genau wo es ist auf der Märklin HP. Es überrascht mich aber dass die das so einfach veröffentlichen. Ein bisschen versteckt ists aber schon. Das mit dem CAN-Bus ist an sich für mich kein unbekanntes Gebiet, damit hab ich ja täglich zu tun beim Arbeiten. Nein es geht nicht um KFZ Allerdings durchschau ichs noch nicht so genau wie das mit dem CAN-Bus und der Moba funktionieren soll, bzw. welche Daten die SPS in welchem Format an die CS2 schicken muss damit sich da was tut, und wie die Rückmeldungen von der CS2 in der SPS ankommen.
Danke für die Links
Gruß Gregor
Loks und Wagen ohne Kulissenführung, Pikoloks mit Smartdecoder und nicht maßstäbliche Wagen können mir gestohlen bleiben...
das zweite kenn ich, die Infos aber irgendwie nicht gefunden. Vom ersten hab ich auch schon gehört, ich wusste aber nicht mehr genau wo es ist auf der Märklin HP. Es überrascht mich aber dass die das so einfach veröffentlichen. Ein bisschen versteckt ists aber schon. Das mit dem CAN-Bus ist an sich für mich kein unbekanntes Gebiet, damit hab ich ja täglich zu tun beim Arbeiten. Nein es geht nicht um KFZ Allerdings durchschau ichs noch nicht so genau wie das mit dem CAN-Bus und der Moba funktionieren soll, bzw. welche Daten die SPS in welchem Format an die CS2 schicken muss damit sich da was tut, und wie die Rückmeldungen von der CS2 in der SPS ankommen.
Danke für die Links
Gruß Gregor
Hallo Gregor, am einfachsten kommt man rein, wenn man die CS2 mit dem "anderen Gerät" also PC oder SPS verbindet, und einfach mal beobachtet, was die CS2 zum Beispiel beim Schalten einer Weiche macht, oder beim Schalten einer Funktion, oder beim Anfahren einer Lok.
Es ist übrigens keine CAN-Karte in der SPS erforderlich, wenn die eh schon Ethernet drin hat. Dann reicht es in der CS2 das CAN-Ethernet-Gateway zu aktivieren. Danach werden die Daten am CAN-Bus transparent auf dem Ethernet zugänglich. Umgekehrt nimmt die CS2 dann Pakete über UDP an, und legt sie auf ihren CAN-Bus.
Auf diese Art umgeht man auch das Problem der galvanischen Trennung elegant. Ethernet ist nicht galvanisch getrennt. Bei CAN müsste man da besonders drauf achten. (Wenn das nicht beachtet wird, gibts eventuell "vagabundierende" Ströme
Wie genau muss ich das innerhalb der SPS auf die Ethernetbuchse schicken? Als Wort oder Byte oder Doppelwort oder wie geht das?
Gruß
Ok also ausführlicher:
Auf dem CAN werden Datenpakete mit 29Bit Kennung, 4Bit Meldungslänge und bis zu 8Byte Daten verwendet. Auf dem Ethernet werden UDP-Pakete verwendet. Die bestehen aus einer Ziel-IP, aus einem Ziel-Port, und aus einer beliebigen Anzahl "Bytes" Die CS2 verpackt jedes CAN-Paket in ein UDP-Packet mit der Länge 13. Das sind dann 4+1+8=13 Bytes (siehe auch Seite 7 in der Doku)
Ich würde auf keinen Fall mit dem Senden anfangen ! (Zu VilLe Fählermüglichkaiten) Versuch zuerst mal ein Paket der CS2 aufzufangen
Dazu mußt du suchen, ob die SPS überhaupt UDP empfangen kann, und wie man dann den Port 15730 für den Empfang von Paketen einschaltet.
Ich hab das nicht mit einer SPS sondern mit einem PC gemacht. Aber wenn deine SPS Ethernet hat, und UDP kann, sollte das auch gehen.
Hallo Gregor, was verwendest Du denn für eine SPS?
Gruß Rainer
Hallo Rainer,
eine stinknormale 315er….wirds werden. Ich hab nur im Moment keine, da die die ich hatte nur von nem Kollege geliehen war zum Testen. Der braucht se jetzt aber wieder. Daher bin ich grad am Gucken nach ner eigenen, andauernd irgendwas leihen nervt ja irgendwie doch nur mit der Zeit, sowohl mich als auch den Besitzer…
Da gibts ja auch schon fertig programmierte Bausteine, ist ja praktisch.
Allerdings konnt ichs bisher nicht live testen, da ich immer noch keine CPU hab….
Ich hab mir das Programm mal runtergeladen von der Seite, allerdings werd ich da noch nicht ganz schlau draus, wie das mit den Sende- und Empfangsports der CS2 funktioniert….die CS2 sendet an den Port 15730 und empfängt mit 15731. In dem SPS Programm ist aber nur von einem Port die Rede…das wird ja denn so nicht gehen?
Ich glaub ich muss mir mal das was ronaldhelder geschrieben hat nochmal angucken.
Gruß Gregor
Loks und Wagen ohne Kulissenführung, Pikoloks mit Smartdecoder und nicht maßstäbliche Wagen können mir gestohlen bleiben...
Zitat von 218er... Ich hab mir das Programm mal runtergeladen von der Seite, allerdings werd ich da noch nicht ganz schlau draus, wie das mit den Sende- und Empfangsports der CS2 funktioniert….die CS2 sendet an den Port 15730 und empfängt mit 15731. In dem SPS Programm ist aber nur von einem Port die Rede…das wird ja denn so nicht gehen? ...
Vermutlich darfst Du 2 Verbindungen mit 2 Ids aufmachen. - in der SPS den Port15730 zum Empfangen - an den Port 15731 der CS23 zum Senden
Zitat von Rainer Vermutlich darfst Du 2 Verbindungen mit 2 Ids aufmachen. - in der SPS den Port15730 zum Empfangen - an den Port 15731 der CS23 zum Senden
Gruß Rainer
Wie genau meinst du das? So dass ich das ganze Programm quasi zweimal hab, das sich aber nur durch den Port unterscheidet?
Du schreibst da was von 2 lds? Was ist das lds? Oder heißt es ell oder iih, vor ds?
Gruß
Loks und Wagen ohne Kulissenführung, Pikoloks mit Smartdecoder und nicht maßstäbliche Wagen können mir gestohlen bleiben...
Also TypeID 0x10 (Gleisbox 60112 und 60113) mit SoftwareVersion 0x0127 und Geräte-UID 0x47432afe. Habe ich das soweit richtig verstanden?
Nun will ich den Hash berechnen. Laut CAN CS2 Protokoll Kapitel 1.2.4 soll ich den UID Hash wie folgt berechnen: 16 Bit High UID XOR 16 Bit Low der UID. Also 0100011101000011 XOR 0010101011111110 = 0110110110111101. Bit 9 - 7 müssen zwecks CS1 Unterscheidung durch 110 ersetzt werden, das ergibt 0110111100111101 bzw. 0x6F3D. Mitgelesen habe ich aber einen Hashwert von 0xbf6d. Wo liegt denn da bitte mein Denkfehler?
Wenn ich nun selber mit einem "Gerät" - z. B. einer Software via Ethernet (Kapitel 1.2.7) - mitreden will, suche ich mir dann aus dem Adressschema (Kapitel 1.3.1.2) eine als Privatanwender / Club eine Adresse im Bereich 0x1800 - 0x1BFF bzw. als Firma im Bereich 0x1C00 - 0x1FFF aus?
meiner Erinnerung nach - als ich das ebenfalls nachempfunden habe - werden die 2 Bytes des XOR-Ergebnisses gewechselt, bevor mit 0x110 die Bits 7..9 überschrieben werden. Steht aber nirgends.
Viele Grüße, Stephan __________________________________________________________________________ [60211{60128connected}+60215{GUI:4.2.13|GFP:3.81}+60216{GUI3:2.4.1(0)|GFP3:12.113}+CS3webApp] Insider seit 1993 - HeimatBf: MIST Wien - http://www.insider-stammtisch.net/
meiner Erinnerung nach - als ich das ebenfalls nachempfunden habe - werden die 2 Bytes des XOR-Ergebnisses gewechselt, bevor mit 0x110 die Bits 7..9 überschrieben werden. Steht aber nirgends.
Das ist das Ewige Problem mit Hi-Byte/Low-Byte -Order
ich bin neu hier im Forum und weiß nicht recht, ob ich diesen alten Thread wieder zum leben erwecken sollte, obwohl er vom Thema sehr gut passt, oder einen neuen eröffnen sollte. Ich schreibe erst einmal hier.
Also ich möchte mich auch mit dem CAN Protokoll beschäftigen. Dazu wurde mir erst einmal die MS2 und die Anschlussbox 60113 zur Verfügung gestellt. Erste Botschaften zwischen diesen Geräten konnte ich auch bereits belauschen. Nur leider ist mir die Berechnung der Kollisionsauflösung (Hashcode) der Meldungskennung, trotz des CAN CS2 Protokolls (Version 2) von Märklin unklar. Zwischen der MS 2 und der Anschlussbox sind in regelmäßigen Abständen zwei Nachrichten zu erkennen. ID: 30CF4B DIR: RX DLC: 0 Data:0 und ID: 31DB5E DIR: RX DLC: 8 Data: 47 43 99 9A 01 27 00 10 Nach meinen ersten Erkenntnissen müsste es sich dabei um den Ping des Teilnehmers handeln (Märklin Protokoll V2 Seite 41) Nun möchte ich gerne hiervon den Hash Code (Seite 6 des Protokolls) berechnen. Z.B. von der unteren Nachricht Dazu müssten doch erst einmal die 16 Bit High UID und die 16 Bit LOW UID XOR verknüpft werden. Also 47 43 XOR 99 9A. Ich erhalte demnach DED9 (in binärer Schreibweise 1101 1110 1101 1001) Die Bits 7 bis 9 werden ausgeblendet und die höherwertigen Bits 10 bis 15 um 3 Bits nach rechts verschoben. Die ersten 3 Bits erhalten den Wert "0" Es ergibt sich 0001 1010 1101 1001 (also in hexadezimaler Schreibweise 1BD9) Da der Wert 1BD9 ungleich DB5E ist, habe ich entweder ein Verständnisproblem der Beschreibung von Märklin oder mich einfach nur verrechnet.
Ich hoffe Ihr könnt mir helfen
@Bitnapper: Welches Programm hast du verwendet? Ich erhalte nur die ID, also die komplette Meldungskennung. Du hattest in deinem alten Beitrag bereits die Meldungskennung unterteilt in Priorität, Response und Hash angegeben. Ich gehe bisher einfach davon aus, dass meine fehlenden Bits der 29 Bit langen Meldungskennung "null" sind. Damit aber auch die Priorität null ist. Da bin ich mir aber auch unsicher, ob dass sein kann.
Zitat von [Tobi]Welches Programm hast du verwendet?
Das einzige "fertige" Programm zur Anzeige des CS2CAN-Nachrichtenaustausches, das ich kenne, ist CServer 2010 von Rainer Serwe.
Ich selber arbeite an einer Java-Bibliothek für die Kommunikation mit der CS2. Daher stammten auch meine Angaben hier im Thread. Davon habe ich allerdings noch nichts veröffentlicht, ist einfach noch zu experimentell.
Was nutzt Du? Vielleicht können wir Ideen austauschen oder sogar Quellcode...
ZitatIch erhalte nur die ID, also die komplette Meldungskennung. Du hattest in deinem alten Beitrag bereits die Meldungskennung unterteilt in Priorität, Response und Hash angegeben.
Das CS2CAN-Protokoll von Märklin ist proprietär, deshalb zeigt CAN-Standardsoftware die CS2-typische Aufteilung nicht an. Nach meinem Verständnis muss die Konvertierung von Standard-CAN nach CS2CAN so erfolgen:
Hier ist des Rätsels Lösung. - Hash hat die Aufgabe, anzuzeigen, dass es sich um gültige CS2-Befehle handelt. Dazu sind die Bits 7, 8 und 9 reserviert. Sie müssen das Bitmuster "110" enthalten.
- Jeder Absender soll seinen eigenen Hash verwenden. Wie er den generiert empfiehlt zwar Märklin, die Praxis zeigt aber, dass externe Software den universalen Hash „0x0300“ verwendet (so auch SDL und C2XH (welche auch ein CAN-Protokoll anzeigen können), evtl. auch TC und WDP).
- Beim Hashcode 0x0300 liegt entweder die UID 0x0000 oder 0xFFFF zugrunde, was also mit real existierender CS2/CAN-Hardware (MS1, CS1, ECoS, CS2, Detectoren) nicht kollidieren sollte.
In Deinem Beispiel kommt man vom gesendeten Hash 0xDB5E wie folgt zur UID:
1. UID wird ge-XOR-ed = 0x4347 XOR 0x9A99 = 0xD9DE
2. Es werden keine Bits verschoben (Faulheit), sondern einfach die Bits 7, 8 und 9 auf “110” gesetzt: (0xD9DE OR 0x0300) AND 0xFF7F = 0xDB5E = 0b1101 1011 0101 1110. Und das ist genau der Hash des Ping-Reply aus Deinem obigen Beispiel.
Auf das Einsparen der Bitverschiebung muß man erstmal kommen. Es bleibt festzuhalten: man kann vom Hashcode nicht auf die UID schließen, da nicht bekannt sein kann, wie der Teilnehmer seinen Hash erzeugt hatte und auch nicht bekannt ist, wie die überschriebenen bzw. verschobenen Bits vorher ausgesehen haben. Außerdem ist BIG Endian einzuhalten.
Zitat von BitnapperDas einzige "fertige" Programm zur Anzeige des CS2CAN-Nachrichtenaustausches, das ich kenne, ist CServer 2010 von Rainer Serwe.
Ich selber arbeite an einer Java-Bibliothek für die Kommunikation mit der CS2. Daher stammten auch meine Angaben hier im Thread. Davon habe ich allerdings noch nichts veröffentlicht, ist einfach noch zu experimentell.
Was nutzt Du? Vielleicht können wir Ideen austauschen oder sogar Quellcode...
Ich hab da auch schon fertigen Code.
Ich hab ein kleines System für einen ARM basierten Einplatinencomputer (BeagleBone Black) geschrieben, um eine Bridge zwischen CAN und Ethernet zu realisieren. Das System besteht aus mehreren Daemons, die per Socket miteinander kommunizieren. Damit kann ich beliebige Protokolle einfach durch einen weiteren Daemon integrieren. Mein BBB wird einfach an den CAN Bus (habe einen Startpunkt 2 des CDB Projekts) und an mein Ethernet angeschlossen. Die Software ist in C geschrieben.
Aktuell habe ich (u.a.) einen Encoder und Decoder für die MS2/CS2 CAN Nachrichten zur Gleisbox. Einen Tracer, der die CAN Nachrichten dekodiert ausgibt und einen CS2-Ethernet Client. Damit sieht mein BBB auf der Ethernet-Seite für die Märklin App wie eine CS2 aus. Mit dem System bin ich in der Lage, der Märklin APP eine Lokliste mit allen Fahrzeugen meiner MS2 zu geben und meine Loks mit der Märklin APP zu steuern.
Magnetartikel sind ungetestet, weil ich noch keine Dekoder eingebaut habe.
Ich hab damit schon alle hier angesprochenen Probleme wie Erzeugen des Hash, Kodieren und Dekodieren der Meldungskennung und Datenbytes gelöst. Die Encoder/Decoder sind schon komplett für sämtliche Nachrichten implementiert, soweit sie von Märklin dokumentiert sind. Encoder und Decoder sind in einer Lib zusammengefaßt und ich hab auch etwas Doku, wie das zu benutzen ist.
vielen Dank für eure Antworten. Leider bin ich noch totaler Anfänger auf diesem Gebiet. Daher verstehe ich nicht, wie du, Diego auf die XOR Verknüpfung von 0x4247 und 0x9A99 kommst. Ich dachte es müsste 0x4742 xor 9A99 sein. Könntest du mir bitte diesen Umstand genauer Erörtern?
Nach meinem Wissen müsste die hex. Zahl 4743999A bei BIG bzw. LITTLE Endian wie folgt gespeichert werden:
Big Endian: 47 43 99 9A Little Endian: 9A 99 43 47
Da hier der Big Endian vorliegt, müssten doch die Bytes intern folgende Inhalte enthalten: D-Byte 0: 47 D-Byte 1: 43 D-Byte 2: 99 D-Byte 3: 9A
Da ich wie gesagt noch Anfänger bin, möchte ich erst einmal das Protokoll einigermaßen verstehen, bis ich was programmieren kann. In der Hochschule habe ich derzeit die Möglichkeit den CAN Bus mit der Software CANoe zu belauschen, aber ich würde gerne auch verstehen was passiert. Daher die Fragen. (Ich studiere übrigens auch nicht Informatik, sondern Energietechnik)
Der nachfolgende Screenshot zeigt meine ausgelesene Daten
laut cs2CAN-Protokoll-2_0.pdf, Seite 41, befindet sich wie von Dir richtig angegeben für den Ping-Befehl 0x18 (CAN-ID 0x30) die „Absender-Geräte-UID“ in den Daten-Bytes D-Byte 0 (High) bis D-Byte 3 (Low). Ist also in Big Endian hinterlegt.
In Deinem Fall „47 43 99 9A“. Weiter oben hatte Stephan schon geschrieben in 2012
Zitat von TT800meiner Erinnerung nach - als ich das ebenfalls nachempfunden habe - werden die 2 Bytes des XOR-Ergebnisses gewechselt, bevor mit 0x110 die Bits 7..9 überschrieben werden. Steht aber nirgends.
Zitat von Andreas85Das ist das Ewige Problem mit Hi-Byte/Low-Byte -Order
Ich muß zugeben, dass ich diesen Bytewechsel vor dem XOR gemacht habe. Also hier nun korrigiert nach Stephan:
1. UID wird ge-XOR-ed = 0x4743 XOR 0x999A = 0xDED9
2. Bytereihenfolge ändern auf Little Endian liefert 0xD9DE
3. Es werden keine Bits verschoben (Faulheit), sondern einfach die Bits 7, 8 und 9 auf “110” gesetzt: (0xD9DE OR 0x0300) AND 0xFF7F = 0xDB5E = 0b1101 1011 0101 1110. Und das ist genau der Hash des Ping-Reply aus Deinem obigen Beispiel.
Entschuldige bitte meinen Rechenfehler. Sorry. Ob aber dieser Bytewechsel bei der Hash-Codierung Pflicht ist, weiss ich nicht. Wie gesagt, ich bevorzuge den Hashcode 0x0300 für meine Software.
wie ich bereits geschrieben habe studiere ich Energietechnik. Da ich mich bereits privat seit längerer Zeit mit Modelleisenbahnen beschäftige und das wohl auch das ein oder andere Mal in der Hochschule erwähnt habe, hat mir einer meiner Professoren vorgeschlagen, meine BA zur Ansteuerung einer Märklin Modelleisenbahn über den CAN Bus zu verfassen. Er möchte auf Grundlage der Erkenntnisse einen Laborversuch einrichten. Das Problem ist nur, dass ich als Energietechniker "nur" die Grundlagenvorlesungen zur Programmierung gehört habe. Zudem kenne ich das (Märklin-) CAN Protokoll nicht. Bevor ich mich für oder gegen die BA zu diesem Thema entscheide, möchte ich bereits einige Informationen sammeln bzw. für mich entscheiden, ob ich mir das überhaupt zutraue. Ich muss auch bedenken, dass mir nur 8 Wochen Bearbeitungszeit zur Verfügung stehen.
Um meine Entscheidung zu treffen, habe ich bereits jetzt Zugriff auf einen Computer (der Hochschule) mit CANoe. Alle Versuche die ich jetzt mit diesem Programm durchführe sind rein privat und sollen mich lediglich bei meiner Entscheidung unterstützen.
Das Programm CANoe ist von Vektor als Demoversion (nach Registrierung) frei verfügbar. Allerdings kann mit der Demoversion nicht auf einen realen Bus zugegriffen werden. Das lizenzierte Programm mit CAN Interface wird für eine private Person nicht erschwinglich sein. (Ich habe die Rechnungen gesehen!) Falls ich mich für diese BA entscheide und (oder) das Projekt privat fortführen möchte fragte ich bereits Bitnapper nach seinem Programm.
Sonst gehe ich nur Aushilfsjobs nach. (und das meist auch nur in den Semesterferien)
Vielen Dank an alle die mir bisher weitergeholfen haben!
Zitat von [Tobi]wie ich bereits geschrieben habe studiere ich Energietechnik. Da ich mich bereits privat seit längerer Zeit mit Modelleisenbahnen beschäftige und das wohl auch das ein oder andere Mal in der Hochschule erwähnt habe, hat mir einer meiner Professoren vorgeschlagen, meine BA zur Ansteuerung einer Märklin Modelleisenbahn über den CAN Bus zu verfassen. Er möchte auf Grundlage der Erkenntnisse einen Laborversuch einrichten. Das Problem ist nur, dass ich als Energietechniker "nur" die Grundlagenvorlesungen zur Programmierung gehört habe. Zudem kenne ich das (Märklin-) CAN Protokoll nicht. Bevor ich mich für oder gegen die BA zu diesem Thema entscheide, möchte ich bereits einige Informationen sammeln bzw. für mich entscheiden, ob ich mir das überhaupt zutraue. Ich muss auch bedenken, dass mir nur 8 Wochen Bearbeitungszeit zur Verfügung stehen.
So rein prinzipiell halt ich das nicht für zu anspruchsvoll. Du sollst ja keine komfortable Modellbahnsteuerung erstellen. Ich habe auf meinem BBB CAN Sockets. Von denene lese bzw. schreibe ich immer eine Struktur vom Typ "struct can_frame". Diese Struktur enthält die Felder "can_id", "can_dlc" und "data[8]". Der Aufbau jedes dieser Fehler ist in der Märklin Dokumentation beschrieben.
"can_dlc" gibt die anzahl Datenbytes an.
Welche Datenbytes zu setzen sind, ist für die meisten Nachrichten erklärt. Es ist so, daß oft Datentypen mit 32 oder 16 Bit auf die Datenbytes verteilt werden.
Die "can_id" setzt man mit etwas Bitshift zusammen.
Du kannst damit eine Funktion für das Erstellen des Hash oder für das Füllen eines CAN Frames mit 5-10 Zeilen erstellen. Also mit recht wenig Code.
calc_has.c berechnet den Has für eine voggebenen UID canexxx.c sind die Encoder für die einzelnen Märlin Nachrichten candxxx.c sind die Decoder für die einzelnen Märlin Nachrichten cs2_encode.c füllt einen CAN Frame
Dort unter libs/mr_can findest du die Bibliothek für die Encoder/Decoder.
Gut, ich muß zugeben, daß ich beruflich embedded systems unter Linux programmiere und damit entsprechend Erfahrung habe.