Looking for Mercedes CLK500 (W209, 2003) CAN XML File for RealDash

I’m setting up RealDash for my 2003 Mercedes CLK500 (W209) and plan to use a CAN analyzer to read signals from the vehicle’s CAN bus. I’m particularly interested in data like RPM, speed, temperature, turn signals, high beams, and various other signals.

If anyone has a complete CAN XML file or DBC file that covers all these signals (or more), I’d really appreciate your help.

If no one has this file, I’d appreciate any directions or suggestions on how I can create this XML file myself using my Seed Studio CAN analyzer. Any guidance on reverse engineering the CAN messages or tools/software that would help me in this process would be very helpful.

Thanks in advance for any assistance!

if need free - i recoment ask Telegram: Contact @candecoder

also i can get order as poffesional and write XML & Skin for your CAR

Hi Falcon_S,

Thank you for your response! I’m definitely interested in having a professional XML file created for my CLK500. Could you let me know how much it would cost for the XML file?

Also, could you please clarify which signals would be included in the XML file? For example, I’m specifically looking for signals like:

  • RPM

  • Speed

  • Temperature

  • Turn signals

  • High/low beams

  • Check engine light

  • Airbag (SRS) indicator

  • Battery voltage signal

  • Oil signal

  • Fuel level

At the moment, I’m getting some signals through the OBD-II port, but they are a little laggy, especially the RPM. This is why I’m planning to use a CAN analyzer for faster and more accurate data.

Regarding the skin, if by “skin” you mean the design for the cluster, I already have my design ready, so I just need the XML file for the CAN signals.

I can do a range of work for you, as well as an apartment (connector to connector) so is the software solution.

I’m not sure if we’re going to break the rules of this forum. My proposal is to be discussed in the Telegram messenger Telegram: Contact @falcons_s

The problem:

  • I’ve successfully identified the RPM frame ID as 0x312. I’ve tried various XML configurations based on the information I’ve gathered, but when applied, the RPM gauge either sticks at maximum, doesn’t respond properly, or is highly inaccurate.
  • I’ve experimented with different offsets and conversion formulas but haven’t been able to get the RPM working accurately.

What I’ve done:

  • I captured CAN data from my vehicle and cross-referenced it with the signals I’m seeing.
  • I’ve used the following XML configuration for the RPM signal, but it still doesn’t work correctly:
<?xml version="1.0" encoding="utf-8"?>
<RealDashCAN version="2">
    <frames>
        <frame id="0x312" size="8">
            <value targetId="37" offset="1" length="2" conversion="V*4"></value>
        </frame>
    </frames>
</RealDashCAN>

The result is that the RPM gauge either sits at maximum or fluctuates between 1,000 and 2,000 RPM, regardless of the actual engine RPM.

My setup:

  • I’m using a CAN analyzer to gather data directly from my car’s CAN bus, specifically from the engine signals.
  • I’ve also tried OBD-II data, which works but is too slow for real-time response. I want to use the CAN data for faster and more responsive results.

What I need help with:

  • Can anyone provide insight into what offsets, length, or conversion I should be using specifically for the Mercedes CLK 500’s RPM signal?
  • Are there any recommended configurations for CAN signal mapping or troubleshooting steps I should follow to get more accurate results?
  • Is there a way to optimize handling multiple CAN signals and merging them into RealDash for better performance?

Any guidance or suggestions would be greatly appreciated. Thank you!

Don’t know if this is going to help or just mess up more, but I did found 2010 Mercedes e350 CAN DBC file. I used my.realdash.net to convert the DBC into XML. I do not know if this has any similarities with your vehicle, and if it does, you do have to change the ‘name’ attributes to ‘valueId’ attributes in order to actually use this file.

<?xml version="1.0" encoding="UTF-8"?>
<RealDashCAN version="2">
  <frames>
    <frame id="0x3">
      <value name="COUNTER" startbit="55" bitcount="4" endianness="big"/>
      <value name="CHECKSUM" offset="7" length="1" endianness="big"/>
      <value name="STEER_RATE" startbit="19" bitcount="12" signed="true" endianness="big" conversion="V*0.5"/>
      <value name="STEER_SENSOR_STEER_DIRECTION" startbit="4" bitcount="1" units="bit"/>
      <value name="STEER_ANGLE" startbit="3" bitcount="12" signed="true" endianness="big" conversion="V*-0.5"/>
    </frame>
    <frame id="0x5">
      <value name="COUNTER" startbit="55" bitcount="4" endianness="big"/>
      <value name="CHECKSUM" offset="7" length="1" endianness="big"/>
      <value name="BRAKE_MODULE_BRAKE_HOLD" startbit="2" bitcount="1" units="bit"/>
      <value name="BRAKE_POSITION" startbit="17" bitcount="10" endianness="big"/>
      <value name="BRAKE_MODULE_DRIVER_BRAKE" startbit="4" bitcount="1" units="bit"/>
      <value name="BRAKE_MODULE_COMPUTER_BRAKE" startbit="10" bitcount="1" units="bit"/>
      <value name="BRAKE_MODULE_BRAKE_PRESSED" startbit="0" bitcount="1" units="bit"/>
    </frame>
    <frame id="0x45">
      <value name="COUNTER" startbit="55" bitcount="4" endianness="big"/>
      <value name="STEERING_WHEEL_BUTTONS" offset="4" length="2"/>
      <value name="DRIVER_CONTROLS_LEFT_BLINKER" startbit="16" bitcount="1" units="bit"/>
      <value name="DRIVER_CONTROLS_RIGHT_BLINKER" startbit="17" bitcount="1" units="bit"/>
      <value name="DRIVER_CONTROLS_HIGHBEAM_TOGGLE" startbit="18" bitcount="1" units="bit"/>
      <value name="DRIVER_CONTROLS_HIGHBEAM_MOMENTARY" startbit="19" bitcount="1" units="bit"/>
      <value name="DRIVER_CONTROLS_CRUISE_CONTROL_CANCEL" startbit="0" bitcount="1" units="bit"/>
      <value name="DRIVER_CONTROLS_CRUISE_CONTROL_RESUME" startbit="1" bitcount="1" units="bit"/>
      <value name="DRIVER_CONTROLS_CRUISE_CONTROL_ACCEL_HIGH" startbit="2" bitcount="1" units="bit"/>
      <value name="DRIVER_CONTROLS_CRUISE_CONTROL_DECEL_HIGH" startbit="3" bitcount="1" units="bit"/>
      <value name="DRIVER_CONTROLS_CRUISE_CONTROL_ACCEL_LOW" startbit="4" bitcount="1" units="bit"/>
      <value name="DRIVER_CONTROLS_CRUISE_CONTROL_DECEL_LOW" startbit="5" bitcount="1" units="bit"/>
      <value name="CHECKSUM" offset="7" length="1" endianness="big"/>
      <value name="SET_ME_XFF" offset="1" length="1" endianness="big"/>
    </frame>
    <frame id="0x201">
      <value name="COUNTER" startbit="55" bitcount="4" endianness="big"/>
      <value name="WHEEL_ENCODER_2" offset="1" length="1" endianness="big"/>
      <value name="WHEEL_ENCODER_3" offset="2" length="1" endianness="big"/>
      <value name="WHEEL_ENCODER_4" offset="3" length="1" endianness="big"/>
      <value name="CHECKSUM" offset="7" length="1"/>
      <value name="WHEEL_ENCODER_1" offset="0" length="1" endianness="big"/>
    </frame>
    <frame id="0x105" endianness="big">
      <value name="COUNTER" startbit="55" bitcount="4"/>
      <value name="CHECKSUM" offset="7" length="1"/>
      <value name="ENGINE_RPM" startbit="4" bitcount="5"/>
      <value name="GAS_PEDAL" offset="4" length="1"/>
      <value name="COMBINED_GAS" offset="3" length="1"/>
    </frame>
    <frame id="0x283">
      <value name="DOOR_SENSORS_BRAKE_PRESSED" startbit="27" bitcount="1" units="bit"/>
      <value name="DOOR_SENSORS_DOOR_OPEN_FR" startbit="3" bitcount="1" units="bit"/>
      <value name="DOOR_SENSORS_DOOR_OPEN_RL" startbit="5" bitcount="1" units="bit"/>
      <value name="DOOR_SENSORS_DOOR_OPEN_RR" startbit="7" bitcount="1" units="bit"/>
      <value name="DOOR_SENSORS_DOOR_OPEN_FL" startbit="1" bitcount="1" units="bit"/>
      <value name="DOOR_SENSORS_DOOR_CLOSED_FL" startbit="0" bitcount="1" units="bit"/>
      <value name="DOOR_SENSORS_DOOR_CLOSED_FR" startbit="2" bitcount="1" units="bit"/>
      <value name="DOOR_SENSORS_DOOR_CLOSED_RL" startbit="4" bitcount="1" units="bit"/>
      <value name="DOOR_SENSORS_DOOR_CLOSED_RR" startbit="6" bitcount="1" units="bit"/>
    </frame>
    <frame id="0x375">
      <value name="SEATBELT_SENSORS_SEATBELT_DRIVER_LATCHED" startbit="16" bitcount="1" units="bit"/>
      <value name="SEATBELT_SENSORS_SEATBELT_PASSENGER_LATCHED" startbit="18" bitcount="1" units="bit"/>
    </frame>
    <frame id="0x101">
      <value name="COUNTER" startbit="55" bitcount="4" endianness="big"/>
      <value name="CHECKSUM" offset="7" length="1" endianness="big"/>
      <value name="CRUISE_CONTROL_NEW_SIGNAL_1" startbit="6" bitcount="1" units="bit"/>
      <value name="CRUISE_CONTROL_CRUISE_DISABLED" startbit="23" bitcount="1" units="bit"/>
      <value name="SET_ME_X002" offset="4" length="1" endianness="big"/>
      <value name="SET_ME_X00" offset="3" length="1" endianness="big"/>
      <value name="SET_ME_X003" offset="5" length="1" endianness="big"/>
      <value name="CRUISE_CONTROL_SET_ME_1" startbit="5" bitcount="1" units="bit"/>
      <value name="CRUISE_CONTROL_CRUISE_ACCELERATING" startbit="22" bitcount="1" units="bit"/>
      <value name="LONGITUDINAL_ACCEL_REQUEST" offset="1" length="1" signed="true" endianness="big"/>
    </frame>
    <frame id="0x104" endianness="big">
      <value name="COUNTER" startbit="55" bitcount="4"/>
      <value name="CHECKSUM" offset="7" length="1"/>
      <value name="SET_ME_X00" offset="5" length="1"/>
      <value name="SET_ME_XFF" offset="3" length="1"/>
      <value name="SET_ME_X02" offset="2" length="1"/>
      <value name="SET_ME_XFF2" offset="4" length="1"/>
      <value name="NEW_SIGNAL_1" startbit="7" bitcount="4"/>
    </frame>
    <frame id="0xE" endianness="big">
      <value name="STEER_TORQUE" offset="1" length="1"/>
      <value name="COUNTER" startbit="55" bitcount="4"/>
      <value name="CHECKSUM" offset="7" length="1"/>
    </frame>
    <frame id="0x378">
      <value name="CRUISE_CONTROL3_NEW_SIGNAL_2" startbit="7" bitcount="1" units="bit"/>
      <value name="CRUISE_CONTROL3_NEW_SIGNAL_1" startbit="38" bitcount="1" units="bit"/>
      <value name="CRUISE_CONTROL3_NEW_SIGNAL_5" startbit="32" bitcount="1" units="bit"/>
      <value name="CRUISE_CONTROL3_CRUISE_DISABLED" startbit="36" bitcount="1" units="bit"/>
      <value name="CRUISE_CONTROL3_CRUISE_ENABLED" startbit="34" bitcount="1" units="bit"/>
      <value name="SET_ME_X003" offset="5" length="1" endianness="big"/>
      <value name="SET_ME_X004" offset="7" length="1" endianness="big"/>
      <value name="SET_ME_X002" offset="3" length="1" endianness="big"/>
      <value name="SET_ME_X00" offset="2" length="1" endianness="big"/>
      <value name="CRUISE_SET_SPEED" offset="1" length="1" endianness="big" units="mph"/>
      <value name="CRUISE_CONTROL3_CRUISE_SPEED_CHANGE" startbit="55" bitcount="1" units="bit"/>
    </frame>
    <frame id="0x133">
      <value name="POWER_SEATS_DRIVER_FORWARD" startbit="0" bitcount="1" units="bit"/>
      <value name="POWER_SEATS_DRIVER_BACK" startbit="1" bitcount="1" units="bit"/>
    </frame>
    <frame id="0x6D">
      <value name="GEAR_LEVER_PARK_BUTTON" startbit="12" bitcount="1" units="bit"/>
      <value name="GEAR_LEVER_NEUTRAL_UP" startbit="9" bitcount="1" units="bit"/>
      <value name="GEAR_LEVER_NEUTRAL_DOWN" startbit="10" bitcount="1" units="bit"/>
      <value name="GEAR_LEVER_DRIVE" startbit="11" bitcount="1" units="bit"/>
      <value name="GEAR_LEVER_REVERSE" startbit="8" bitcount="1" units="bit"/>
      <value name="COUNTER" startbit="23" bitcount="4" endianness="big"/>
      <value name="CHECKSUM" offset="3" length="1" endianness="big"/>
    </frame>
    <frame id="0x73">
      <value targetId="200" bitcount="4"/>
    </frame>
    <frame id="0x203">
      <value name="WHEEL_SPEEDS_WHEEL_MOVING_FR" startbit="22" bitcount="1" units="bit"/>
      <value name="WHEEL_SPEEDS_WHEEL_MOVING_RL" startbit="38" bitcount="1" units="bit"/>
      <value name="WHEEL_SPEEDS_WHEEL_MOVING_FL" startbit="6" bitcount="1" units="bit"/>
      <value name="WHEEL_SPEEDS_WHEEL_MOVING_RR" startbit="54" bitcount="1" units="bit"/>
      <value name="WHEEL_SPEED_FL" startbit="2" bitcount="11" endianness="big" units="mph" conversion="V*0.0375"/>
      <value name="WHEEL_SPEED_FR" startbit="18" bitcount="11" endianness="big" units="mph" conversion="V*0.0375"/>
      <value name="WHEEL_SPEED_RL" startbit="34" bitcount="11" endianness="big" units="mph" conversion="V*0.0375"/>
      <value name="WHEEL_SPEED_RR" startbit="50" bitcount="11" endianness="big" units="mph" conversion="V*0.0375"/>
    </frame>
  </frames>
</RealDashCAN>

Can you share the original DBC file? Very interested in that!

Separately, I can tell from the CAN IDs that your file is a protocol for Mercedes called PTCAN. For @Dachi_z 's CLK, he will need a protocol called MBus. There are many similarities, but none of the CAN IDs line up. I will try to get a file here that will help with this setup greatly.

EDIT: the forum will not allow me to add on a .txt file. Trying other methods

w203_w209 CAN C ENGLISH.txt.xml (40.9 KB)

This is not an XML file. Remove that extension, and it should display properly.

First Code (Offset = 0, Length = 2)

<?xml version="1.0" encoding="utf-8"?>
<RealDashCAN version="2">
    <frames>
        <frame id="0x0308">
            <value targetId="37" offset="0" length="2" units="RPM"></value>
        </frame>
    </frames>
</RealDashCAN>

Description:
When I use this code with offset 0 and length 2, the RPM signal is displayed in RealDash, but it doesn’t behave correctly. The RPM value flips up every 250 RPM, meaning the gauge does not move smoothly. Instead, it jumps from one value to the next in increments of 250, such as going from 1000 RPM to 1250 RPM without showing any values in between. This suggests that the 2-bit length is not enough to capture the finer RPM increments, leading to these large jumps.


Second Code (Offset = 8, Length = 16)

<?xml version="1.0" encoding="utf-8"?>
<RealDashCAN version="2">
    <frames>
        <frame id="0x0308">
            <value targetId="37" offset="8" length="16" units="RPM"></value>
        </frame>
    </frames>
</RealDashCAN>

Description:
This code uses the correct offset of 8 bits and a length of 16 bits according to the DBC file for the NMOT (RPM) signal. However, when I use this configuration, the RPM signal does not work at all in RealDash. Nothing is displayed, and the RPM gauge does not update.


Question:

What is the problem?

  • Why does the correct offset (8 bits) and length (16 bits) configuration not work, while the incorrect configuration with offset 0 and length 2 works but only displays RPM in large jumps of 250?

Code:

<?xml version="1.0" encoding="utf-8"?>
<RealDashCAN version="2">
    <frames>
        <frame id="0x0308" endianness="big">
            <value targetId="37" startbit="8" bitcount="16" units="RPM"></value>
        </frame>
    </frames>
</RealDashCAN>

Text:

I haven’t tested this code yet with endianness and using startbit and bitcount instead of offset and length. I’ll test it tomorrow.

What do you think—could my code not be working because I didn’t use endianness? And also, do I have to use the words startbit and bitcount instead of offset and length?

Offset 0 is totally different data in the CAN stream, that’s why. You just lost 8 bits of data for RPM, and grabbed the upper 8. Your error was actually 255 rpm, not 250.

<?xml version="1.0" encoding="utf-8"?>
<RealDashCAN version="2">
    <frames>
        <frame id="0x0308">
            <value targetId="37" offset="8" length="16" units="RPM"></value>
        </frame>
    </frames>
</RealDashCAN>

The problem is that the offset is set to 8 and the length to 16, but it’s not working, Do you know how I can fix this?

offset and length in RealDash CAN XML are in bytes, so offset=“8” will overshoot all bytes in the frame and then tries to read 16 bytes.

1 Like

Use this below. Tested and works, and contains the most common items you need to get started.

	<!-- CAN ID 0x308, Engine Parameters  RPM -->
	<frame id="776">
      <!-- PARAMETERS FOR 'value' -->
      <!-- 'targetId' links value to RealDash input, see RealDash manuals www for a complete list -->
      <!-- OR -->
      <!-- 'name' links value to RealDash input, input appears in 'ECU Specific' input category -->

      <!-- 'units' is used for post calculations, "F", "mph", "psi", "bit" which need to be specified for dashboard conversions to work properly -->
      <!-- 'offset' byte offset of the value in frame -->
      <!-- 'length' value length in bytes -->
      <!-- 'startbit' the index of the first bit of the value -->
      <!-- 'bitcount' number of bits used by the value -->
      <!-- 'endianess' the endianess of value (big | little [default]). This is only valid if 'length' parameter is set to at least 2 bytes.  -->
      <!-- 'rangeMin' and 'rangeMax' if 'name' is used instead of 'targetId', this is the recommended value range in RealDash editor -->
      <!-- 'initialValue' if this parameter is present, its value is written to CAN after connection has been made to the CAN bus -->
      <!-- 'conversion' if omitted, value is read 'as-is'. Otherwise variables 'B0', 'B1', 'B2', 'B3', 'V' and 'ID#' can be used within conversion formula, where:
                      B0 is first byte in value, B1 second byte, and so on
                      V is the actual incoming value (composed of frame bytes, based on offset, length, startbit and bitcount)
                      examples;
                      conversion="V/10" - result is incoming value / 10
                      conversion="B0+15*(B1-43)" - result is 'first byte + 15 * (second byte - 43)
                      conversion="V+ID200-74.3" - result is incoming value + 'Body Electronics->Gear' - 74.3 -->

      <!-- 1st CAN frame, RPM, MAP, CLT, TPS -->
      <value targetId="37" units="RPM" offset="1" length="2" endianess="big" ></value>  

    </frame>

	<!-- CAN ID 0x200, TCU Parameters  VSS -->      
    <frame id="0512">
	  <value targetId="64" units="mph" offset="2" length="2" conversion="((V/10)/3)*1.111" endianess="big"></value>
    </frame>

	<!-- CAN ID 0x408, Engine Parameters  Fuel Level-->
    <frame id="1032">
	  <value targetId="170" units="%" offset="0" length="1" endianess="big"></value>
    </frame>

	<!-- CAN ID 0x608, Engine Parameters  ECT & IAT-->
    <frame id="1544">
	  <value targetId="14" units="°C" offset="0" length="1" conversion="(V*2)" endianess="big"></value>
	  <value targetId="27" units="°C" offset="1" length="1" conversion="(V*2)" endianess="big"></value>
    </frame>
2 Likes

Thank you everyone for your help.

I’m having trouble with configuring the parking brake indicator in RealDash. Here are the details:

  • CAN ID: 0x240
  • Original Offset: 35 bits
  • Original Length: 1 bit

Here’s the code I’ve been trying:

<frame id="576">
  <!-- Parking Brake Indicator -->
  <value targetId="164" units="bit" offset="4" length="1" endianess="big"></value>
</frame>

The parking brake indicator still doesn’t work, and I’ve tried various methods, including using startbit and bitcount.

Also, could you please tell me how I should handle offsets when they aren’t divisible by 8? For example, when the offset is 16, I set it to offset = 2, but I’m unsure how to proceed when the offset doesn’t divide evenly.

Thanks again for your help!

Take a screenshot from CAN Monitor and highlight the byte and values that changes with parking brake.


So frame 0x240 5th byte changes from 0x00 to 0x10 when parking brake is on. Lets analyse:

We can get to 5th byte on the frame with offset=“4” length=“1”. As we are working with single byte, endianness has no effect at all.

<frame id="0x240">
  <!-- Parking Brake Indicator -->
  <value targetId="164" offset="4" length="1"></value>
</frame>

Next lets analyse the byte value 0x10. Hex value 0x10 is in binary 0001 0000, so we can see that fifth bit changes to 1 when parking brake is on. Since we are interested of only one bit, we mark units=“bit” and use conversion to shift bits to the right to make 5th bit to be the first one:

<frame id="0x240">
  <!-- Parking Brake Indicator -->
  <value targetId="164" offset="4" length="1" units="bit" conversion="V>>4"></value>
</frame>

When you use units=“bit”, only the LSB (Least Significant Bit, rightmost bit) is used to read value being 0 or 1 (off/on). Hence in conversion we shift our 5th bit 4 positions to the right to make it the LSB.

2 Likes

Thank you, everyone, for your help! My RealDash is working perfectly. The refresh rate is incredibly high, and everything is running smoothly!

2 Likes

Hello, I need your help. I’m using a Seed Studio CAN analyzer and can read the CAN C bus without issues, but I’m having trouble with the CAN B bus due to high voltage.

The CAN B bus shows the following voltages:

  • CAN H active: 0.65V, dormant: 0.025V
  • CAN L active: 4.65V, dormant: 11.0V

I need access to the CAN B bus because my turn signals (left and right) are controlled through it, and I want to capture this data for my RealDash setup. I know CAN C operates at 500 kbps, but CAN B runs at 83.3 kbps.

I believe RealDash doesn’t support 83.3 kbps. Does anyone know how I can read this frequency using the Seed Studio CAN analyzer? Are there any settings or workarounds to handle CAN B data?

Thanks in advance for any advice!