# Dokumentation der CAN-Nachrichten

URL: https://irs.systems/docs/cmm-2ch-3ch/can-messages

CMM-2CH und CMM-3CH können über CAN-FD gesteuert werden. Jeder Messkanal hat einen eigenen Mikrocontroller. Die nominale Baudrate beträgt 1 MBit/s, die Daten-Baudrate 4 MBit/s. Eine DBC-Datei ist auf der Download-Seite erhältlich.

## Aufbau der CAN-IDs

Die CAN-IDs sind nach folgendem Schema aufgebaut.

| Bit | Maske | Inhalt | Kommentar |
| --- | --- | --- | --- |
| 28 | `0x10000000` | Richtung | 0: PC an uC, 1: uC an PC |
| 27-20 | `0x0FF00000` | Kommando-ID | 0...255, siehe Abschnitt [Kommandos](/docs/cmm-2ch-3ch/can-messages#liste-der-can-kommandos) |
| 19-12 | `0x000FF000` | Modul-ID | „M“ = `0x4D` |
| 11-4 | `0x00000FF0` | Board-ID | 0...31 (über DIP-Schalter am CMM-2CH einstellbar), 255 = `0xFF` = Broadcast an alle Boards |
| 3-0 | `0x0000000F` | Kanal-ID | 0...2 (beim CMM-xCH fest verdrahtet), 15 = `0xF` = Broadcast an alle Kanäle |

Der jeweils höchste Wert für Board (`0xFF`) und Kanal (`0xF`) wird als Broadcast verwendet.
Zum Beispiel ist die ID `0x 0 00 4D 01 F` das Kommando „SetOnOff“ (= `0x01`) für alle Kanäle auf Board 1.

## Liste der CAN-Kommandos

Physikalische Werte werden immer als Float (32 Bit / Single Precision / LSB first) und in der Basiseinheit (V / A / sec / °C / ... ) übertragen.

### CAN-IDs zum Setzen und Abfragen registerartiger Werte

Get-ID und Response-ID sind gleich, da sie sich bereits im Richtungsbit 28 unterscheiden. Zur Verdeutlichung enthalten die Kommandowerte in der folgenden Tabelle das Richtungsbit.

| Set-ID | Get-ID | Response-ID | Kommando | DLC | Daten |
| --- | --- | --- | --- | --- | --- |
| - | - | `0x140` | CommandResponse | 2 | StatusCode (U8), Command (U8) |
| `0x001` | `0x041` | `0x141` | OnOff | 1 | OnOff [0/1] (U1) |
| `0x002` | - | - | OnOffSelected | 1 | EnableMask_Board (U8) |
| `0x003` | `0x043` | `0x143` | MinRange | 1 | MinRange (U8) |
| `0x004` | `0x044` | `0x144` | MinMaxAvg | 24 | CurrentMin [A] (float), CurrentAvg [A] (float), CurrentMax [A] (float), VoltageDropMax [V] (float), NoOfSamples (U32), RangeMin (U8), RangeMax (U8) |
| `0x005` | `0x045` | `0x145` | ChannelConfig | 5 | OnOffDefaultValue [0/1] (U1), MeasuredValuesInterval [sec] (float) |
| `0x006` | `0x046` | `0x146` | CanConfig | 3 | TxFrameFormat [Enum] (U8), NominalBaudrate [Enum] (U8), DataBaudrate [Enum] (U8) |
| `0x007` | `0x047` | `0x147` | LegacyConfig | 16 | LocalId (U32), LocalIdIsExt (U1), RemoteId (U32), RemoteIdIsExt (U1), LegacyCyclicId (U32), LegacyCyclicIdIsExt (U1), LegacyCyclicMessageEnable (U1) |
| - | `0x048` | `0x148` | Version | 12 | HardwareType (U8), FirmwareVersion (U16), CompileTimestamp (U32), WarningRegister (U16), HardwareVersion (U8) |
| - | `0x049` | `0x149` | SerialNumber | 12 | SerialNumber (String 12 Bytes) |
| `0x00A` | - | - | RestoreDefault | 0 | - |
| `0x00D` | `0x04D` | `0x14D` | DisableCalibration | 1 | DisableCalibration [0/1] (U1) |

### Statuscodes

| Code | Beschreibung |
| --- | --- |
| `0xA0` | Erfolgreich |
| `0xE0` | Unbekanntes Kommando |
| `0xE1` | Ungültiger DLC |
| `0xE2` | Parameter außerhalb des Wertebereichs |
| `0xE3` | Flash-Fehler |
| `0xE4` | Fehler bei der Flash-Verifizierung |
| `0xE5` | Kommando nicht zulässig |
| `0xE6` | Firmware passt nicht zur Hardware |
| `0xE7` | Datei nicht gefunden |

### Werte im WarningRegister

| Name | Wert |
| --- | --- |
| WARNING_CANRXFIFOFULL | `0x0001` |
| WARNING_CANTXFIFOFULL | `0x0002` |
| WARNING_CANBUSOFF | `0x0004` |
| WARNING_INVALIDCALIBRATION | `0x0008` |
| WARNING_DISABLEDCALIBRATION | `0x0010` |
| WARNING_ISOTPRXFIFOFULL | `0x0020` |

## Zyklische CAN-IDs uC -> PC

Physikalische Werte werden immer als Float (32 Bit / Single Precision / LSB first) und in der Basiseinheit (V / A / sec / °C / ... ) übertragen.

| Kommando-ID | Name | DLC | Daten |
| --- | --- | --- | --- |
| `0x180` | MeasuredValues | 12 | Current [A] (float), Range (U8), VoltageDrop [V] (float), OnOff [0/1] (U1) |
| `0x18E` | ErrorHandler | 48 | ErrorType (U8), FileNumber (U8), LineNumber (U16), weitere Informationen |
