Moin,
ich habe ein MGL RDAC Steuergerät. Es liest analog Sensoren aus und gibt
diese dann über CAN weiter.
Manual gibt es hier:
https://www.mglavionics.co.za/Docs/RDAC%20XG%20INSTALLATION%20MANUAL.pdf
CAN Protokoll gibt es hier:
https://www.mglavionics.co.za/Docs/MGL%20CAN%20Protocol.pdf
Nun versuche ich gerade, dieses Gerät über einen Arduino auszulesen, was
auch (mehr oder weniger) erfolgreich ist.
Mit meinem Sketch (Standard Arduino CAN Receiver Beispiel), erhalte ich
Messages in der Konsole. Das erste was mich etwas irritierte war, dass
die IDs a nstatt wie im CAN Manual 1, 2, 3 etc. waren, 0x212, 0x215
etc.sind. Jedoch stimmt es mit dem Schema im Manual überein (0x212
ändert sich beim Anschluss des Thermocouples und 0x217 ist nur 4 Bytes
groß).
Daher habe ich dies erst einmal auf mein rudimentäres Verständnis für
CAN geschoben.
Nun habe ich an den TC1 eingang eine Spannungsquelle mit 24,9mV
angeschlossen. Laut Manual soll dies ~600°C ergeben.
So wie ich gesehen habe, setzt sich die Temperatur aus Byte 0 und Byte 1
von ID2 zusammen (Seite 12 im Manual).
Ich habe also im Sketch einen Filter für ID 0x212 eingefügt, was auch
funktioniert hat.
Als nächstes habe ich den Sketch etwas modifiziert und die ersten beiden
Bytes zusammen geshiftet. Allerdings klappt das nicht so ganz wie ich es
mir vorgestellt habe (Wert stimmt nicht). Kann mir jemand sagen, wo ich
den Fehler gemacht habe?
Ausschnitt aus "Loop"
1 | Serial.print("packet with id 0x");
|
2 | Serial.print(CAN.packetId(), HEX);
|
3 |
|
4 | if (CAN.packetRtr()) {
|
5 | Serial.print(" and requested length ");
|
6 | Serial.println(CAN.packetDlc());
|
7 | } else {
|
8 | Serial.print(" and length ");
|
9 | Serial.println(packetSize);
|
10 |
|
11 | // only print packet data for non-RTR packets
|
12 | //CAN.readBytes(CanB, 8);
|
13 | while (CAN.available()) {
|
14 | for (int i = 0; i < packetSize; i++) {
|
15 | CanB[i] = CAN.read();
|
16 | Serial.print(CanB[i]);
|
17 | Serial.print(" ");
|
18 | }
|
19 |
|
20 | }
|
21 | Serial.print("First complete Val: ");
|
22 | int16_t r = (CanB[1]<<8) | CanB[0];
|
23 | Serial.println(r);
|
24 | }
|
25 |
|
26 | Serial.println();
|
27 | }
|
Dies ergibt dann jedoch folgendes:
1 | Received packet with id 0x212 and length 8
|
2 | 16 255 0 0 0 0 0 0 First complete Val: -240
|
3 |
|
4 | Received packet with id 0x212 and length 8
|
5 | 15 255 0 0 0 0 0 0 First complete Val: -241
|
6 |
|
7 | Received packet with id 0x212 and length 8
|
8 | 15 255 0 0 0 0 0 0 First complete Val: -241
|
Grüße
Patrick