{"id":5134,"date":"2019-09-20T10:00:24","date_gmt":"2019-09-20T09:00:24","guid":{"rendered":"https:\/\/www.purplemeanie.co.uk\/?p=5134"},"modified":"2025-01-31T13:08:16","modified_gmt":"2025-01-31T13:08:16","slug":"ecu-diagnostics-part-13-2-obd-ii","status":"publish","type":"post","link":"https:\/\/purplemeanie.co.uk\/index.php\/2019\/09\/20\/ecu-diagnostics-part-13-2-obd-ii\/","title":{"rendered":"ECU Diagnostics &#8211; part 13.2 : OBD-II"},"content":{"rendered":"\n<p>The OBD-II diagnostic protocol is well defined and information about it can be found&nbsp;in <a href=\"https:\/\/en.wikipedia.org\/wiki\/On-board_diagnostics#OBD-II_diagnostic_data_available\">On-board Diagnostics<\/a>. It&#8217;s a mish-mash of many diffrerent standards, both physical and electrical, that I&#8217;ll refer to as OBD-II. There&#8217;s also a complete breakdown of the Services and PIDs (see below) that can be found in <a href=\"https:\/\/en.wikipedia.org\/wiki\/OBD-II_PIDs\">On-board Diagnostic PIDs<\/a>.<\/p>\n\n\n\n<p>I&#8217;ll talk a little bit about the protocol here but the main point of this post is to say what OBD-II data the Catheram MBE 9A4 ECU supports and what that looks like on the CAN bus.<\/p>\n\n\n\n<p>OBD-II can be broken down into three main data types:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Services (previously called &#8220;modes&#8221;),<\/li><li>Parameter IDentifiers (PIDs) and,<\/li><li>OBD-II data<\/li><\/ul>\n\n\n\n<p>You can find all the relevant standards defined in the first link above&#8230; but many of them are behind a pay-wall. So unless you&#8217;re prepared to pay for the documents then you have to glean what you can from Google searches like I did.<\/p>\n\n\n\n<p>Fundamentally, the bog-standard OBD-II diagnostic protocol uses a single CAN bus frame (max 8 bytes, but usually less), to request, and then get a response, for a single data value (variable) from the car&#8217;s ECU. It is a request response protocol, meaning a scanner, or active device, requests a data value and the ECU responds with the result. Both request and response take up one CAN bus frame.<\/p>\n\n\n\n<p>The basics of the protocol request and response are as follow:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>OBD-II CAN Bus Request Frame<\/td><td>&nbsp;<\/td><td>&nbsp;<\/td><td>&nbsp;<\/td><td>&nbsp;<\/td><\/tr><tr><td>Byte 0<\/td><td>Byte 1<\/td><td>Byte 2<\/td><td>Byte 3<\/td><td>Byte 4<\/td><td>Byte 5<\/td><td>Byte 6<\/td><td>Byte 7<\/td><\/tr><tr><td>LENGTH<\/td><td>SERVICE ID<\/td><td>Data 0<\/td><td>Data 1<\/td><td>Data 2<\/td><td>Data 3<\/td><td>Data 4<\/td><td>Data 5<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>OBD-II CAN Bus Response Frame<\/td><td>&nbsp;<\/td><td>&nbsp;<\/td><td>&nbsp;<\/td><td>&nbsp;<\/td><\/tr><tr><td>Byte 0<\/td><td>Byte 1<\/td><td>Byte 2<\/td><td>Byte 3<\/td><td>Byte 4<\/td><td>Byte 5<\/td><td>Byte 6<\/td><td>Byte 7<\/td><\/tr><tr><td>LENGTH<\/td><td>SERVICE ID + 0x40<\/td><td>Data 0<\/td><td>Data 1<\/td><td>Data 2<\/td><td>Data 3<\/td><td>Data 4<\/td><td>Data 5<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>The important points here, from a 9A4 perspective, are:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>LENGTH: First byte of request or response is the number of additional bytes in the message. Note that this is &#8220;additional&#8221; bytes, in addition to the length byte itself. So, for instance a request for engine coolant temp (PID = 0x05, byte 2) and service ID of 0x01 (byte 1) requires a length of 2, i.e. two bytes (Service ID + PID) in addition to the length byte (byte 0).<\/li><li>SERVICE ID: See <a href=\"https:\/\/en.wikipedia.org\/wiki\/On-board_diagnostics#OBD-II_diagnostic_data_available\">OBD-II<\/a> and <a href=\"https:\/\/en.wikipedia.org\/wiki\/OBD-II_PIDs\">OBD-II PIDs<\/a> for a list of possible service ID&#8217;s. I&#8217;ve only verified that a 9A4 only responds to a service ID of 1 so far<\/li><li>SERVICE ID + 0x40: When responding to a request, 0x40 is added to the service ID, so a request with service ID of 0x01 will get a response service ID of 0x41.<\/li><li>The ECU always responds with 8 bytes (seems to pad with 0xff)<\/li><li>9A4 ECU responds with a CAN ID of 0x18daf101<\/li><li>Only 15 PIDs are supported by our ECUs, see below for a list<\/li><\/ul>\n\n\n\n<p>An example request and response for coolant temp might be:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>OBD-II CAN Bus Request Frame : Coolant Temp<\/td><td>&nbsp;<\/td><td>&nbsp;<\/td><\/tr><tr><td>Byte 0<\/td><td>Byte 1<\/td><td>Byte 2<\/td><td>Byte 3<\/td><td>Byte 4<\/td><td>Byte 5<\/td><td>Byte 6<\/td><td>Byte 7<\/td><\/tr><tr><td>0x02<\/td><td>0x01<\/td><td>0x05<\/td><td>&nbsp;<\/td><td>&nbsp;<\/td><td>&nbsp;<\/td><td>&nbsp;<\/td><td>&nbsp;<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>&#8230; and the response:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>OBD-II CAN Bus Response Frame : Coolant Temp<\/td><td>&nbsp;<\/td><td>&nbsp;<\/td><\/tr><tr><td>Byte 0<\/td><td>Byte 1<\/td><td>Byte 2<\/td><td>Byte 3<\/td><td>Byte 4<\/td><td>Byte 5<\/td><td>Byte 6<\/td><td>Byte 7<\/td><\/tr><tr><td>0x03<\/td><td>0x41<\/td><td>0x05<\/td><td>0x3d<\/td><td>&nbsp;<\/td><td>&nbsp;<\/td><td>&nbsp;<\/td><td>&nbsp;<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>We can see here that the ECU responded with a coolant temperature of 0x3d. We then need to refer to the offset and scaling algorithm found again&nbsp;<a href=\"https:\/\/en.wikipedia.org\/wiki\/OBD-II_PIDs\">here<\/a>. For a PID of 0x05, Coolant Temp, the formula is ( Result-40 ), i.e.<\/p>\n\n\n\n<p>Coolant Temp = 0x3d &#8211; 40 = 61 -40 = 21 C&nbsp;<\/p>\n\n\n\n<p>There&#8217;s not a lot of resolution there, just an integer. That&#8217;s one of the reason&#8217;s we might like to use either of the MBE Broadcast or MBE ISOTP diagnostic protocols, with the later providing a lot more detail.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">PID Discovery<\/h3>\n\n\n\n<p>With all these PIDs documented in the standard and cars not having to support them all, there needs to be a way of figuring out what each car can is capable of responding with. This is done with PIDs 0x01, 0x20, 0x40, 0x60, 0x80, 0xA0 and 0xc0.<\/p>\n\n\n\n<p>When a request is made to each of these PIDs, the ECU responds with a bit-field showing which of the next 32 (0x20) PIDs are supported in the 4 data bytes returned in the response, including whether the next+1 set of 32 PIDs are supported at all.<\/p>\n\n\n\n<p>So for our ECUs we get the following communication at the start of a scanning cycle:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">1672 16.267925833 0x18db33f1 02 01 00 ff ff ff ff ff\n1673 16.269274940 0x18daf101 06 41 00 d8 36 80 19 ff\n1724 16.776437588 0x18db33f1 02 01 20 ff ff ff ff ff\n1726 16.778090875 0x18daf101 06 41 20 20 00 20 01 ff\n1777 17.284954491 0x18db33f1 02 01 40 ff ff ff ff ff\n1778 17.287421616 0x18daf101 06 41 40 40 10 00 00 ff<\/pre>\n\n\n\n<p>Decoding that a bit, we can see that the 9A4 ECU supports:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">PID=0x00 ->; 0x01-0x20: 0xd8368019\nPID=0x20 ->; 0x21-0x40: 0x20002001\nPID=0x40 ->; 0x41-0x60: 0x40100000<\/pre>\n\n\n\n<p>And if we unwrangle all the bits then we&#8217;re shown that these ECUs support the following PIDs (definitions reproduced from Wikipedia):<\/p>\n\n\n\n<figure class=\"wp-block-table wikitable is-style-stripes\"><table class=\"has-fixed-layout\"><tbody><tr><th>PID<br>(hex)<\/th><th>Data bytes returned<\/th><th>Description<\/th><th>Min value<\/th><th>Max value<\/th><th>Units<\/th><th>Formula<sup id=\"cite_ref-formula_3-0\" class=\"reference\"><\/sup><\/th><\/tr><tr><td><tt>00<\/tt><\/td><td>4<\/td><td>PIDs supported [01 &#8211; 20]<\/td><td>&nbsp;<\/td><td>&nbsp;<\/td><td>&nbsp;<\/td><td>Bit encoded<\/td><\/tr><tr><td>&nbsp;<\/td><td>4<\/td><td>Monitor status since DTCs cleared.&nbsp;<\/td><td>&nbsp;<\/td><td>&nbsp;<\/td><td>&nbsp;<\/td><td>Bit encoded<\/td><\/tr><tr><td><tt>02<\/tt><\/td><td>2<\/td><td>Freeze DTC<\/td><td>&nbsp;<\/td><td>&nbsp;<\/td><td>&nbsp;<\/td><td>&nbsp;<\/td><\/tr><tr><td><tt>04<\/tt><\/td><td>1<\/td><td>Calculated engine load<\/td><td>0<\/td><td>100<\/td><td>%<\/td><td><span class=\"mwe-math-element\"><img decoding=\"async\" class=\"mwe-math-fallback-image-inline\" src=\"https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/fc99c415c98567a5cdeb872702a0a464ec96e736\" alt=\"{\\displaystyle {\\tfrac {100}{255}}A}\" aria-hidden=\"true\"><\/span> (or <span class=\"mwe-math-element\"><img decoding=\"async\" class=\"mwe-math-fallback-image-inline\" src=\"https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/fbfed15e4a146aae94855b30193bc2cd3b0003cd\" alt=\"{\\displaystyle {\\tfrac {A}{2.55}}}\" aria-hidden=\"true\"><\/span>)<\/td><\/tr><tr><td><tt>05<\/tt><\/td><td>1<\/td><td>Engine coolant temperature<\/td><td>-40<\/td><td>215<\/td><td>\u00b0C<\/td><td><span class=\"mwe-math-element\"><img decoding=\"async\" class=\"mwe-math-fallback-image-inline\" src=\"https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/e1670b1d3833de94e5fdd711c232885f9f9dd855\" alt=\"{\\displaystyle A-40}\" aria-hidden=\"true\"><\/span><\/td><\/tr><tr><td><tt>0B<\/tt><\/td><td>1<\/td><td>Intake manifold absolute pressure<\/td><td>0<\/td><td>255<\/td><td>kPa<\/td><td><span class=\"mwe-math-element\"><img decoding=\"async\" class=\"mwe-math-fallback-image-inline\" src=\"https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/7daff47fa58cdfd29dc333def748ff5fa4c923e3\" alt=\"A\" aria-hidden=\"true\"><\/span><\/td><\/tr><tr><td><tt>0C<\/tt><\/td><td>2<\/td><td>Engine RPM<\/td><td>0<\/td><td>16,383.75<\/td><td>rpm<\/td><td><span class=\"mwe-math-element\"><img decoding=\"async\" class=\"mwe-math-fallback-image-inline\" src=\"https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/b60c934a88e81eecc676ed1499ebbdd7f05e69a2\" alt=\"{\\displaystyle {\\frac {256A+B}{4}}}\" aria-hidden=\"true\"><\/span><\/td><\/tr><tr><td><tt>0E<\/tt><\/td><td>1<\/td><td>Timing advance<\/td><td>-64<\/td><td>63.5<\/td><td>\u00b0 before TDC<\/td><td><span class=\"mwe-math-element\"><img decoding=\"async\" class=\"mwe-math-fallback-image-inline\" src=\"https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/cb92a47f5f1b49757d92b43a6cfdd2fa3a743d78\" alt=\"{\\displaystyle {\\frac {A}{2}}-64}\" aria-hidden=\"true\"><\/span><\/td><\/tr><tr><td><tt>0F<\/tt><\/td><td>1<\/td><td>Intake air temperature<\/td><td>-40<\/td><td>215<\/td><td>\u00b0C<\/td><td><span class=\"mwe-math-element\"><img decoding=\"async\" class=\"mwe-math-fallback-image-inline\" src=\"https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/e1670b1d3833de94e5fdd711c232885f9f9dd855\" alt=\"{\\displaystyle A-40}\" aria-hidden=\"true\"><\/span><\/td><\/tr><tr><td><tt>11<\/tt><\/td><td>1<\/td><td>Throttle position<\/td><td>0<\/td><td>100<\/td><td>%<\/td><td><span class=\"mwe-math-element\"><img decoding=\"async\" class=\"mwe-math-fallback-image-inline\" src=\"https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/fc99c415c98567a5cdeb872702a0a464ec96e736\" alt=\"{\\displaystyle {\\tfrac {100}{255}}A}\" aria-hidden=\"true\"><\/span><\/td><\/tr><tr><td><tt>1C<\/tt><\/td><td>1<\/td><td>OBD standards this vehicle conforms to<\/td><td>&nbsp;<\/td><td>&nbsp;<\/td><td>&nbsp;<\/td><td>Bit encoded<\/td><\/tr><tr><td><tt>1D<\/tt><\/td><td>1<\/td><td>Oxygen sensors present (in 4 banks)<\/td><td>&nbsp;<\/td><td>&nbsp;<\/td><td>&nbsp;<\/td><td>Similar to PID 13, but [A0..A7] == [B1S1, B1S2, B2S1, B2S2, B3S1, B3S2, B4S1, B4S2]<\/td><\/tr><tr><td><tt>20<\/tt><\/td><td>4<\/td><td>PIDs supported [21 &#8211; 40]<\/td><td>&nbsp;<\/td><td>&nbsp;<\/td><td>&nbsp;<\/td><td>Bit encoded<\/td><\/tr><tr><td><tt>23<\/tt><\/td><td>2<\/td><td><a class=\"mw-redirect\" title=\"Fuel rail\" href=\"https:\/\/en.wikipedia.org\/wiki\/Fuel_rail\">Fuel Rail<\/a> Gauge Pressure (diesel, or gasoline direct injection)<\/td><td>0<\/td><td>655,350<\/td><td>kPa<\/td><td><span class=\"mwe-math-element\"><img decoding=\"async\" class=\"mwe-math-fallback-image-inline\" src=\"https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/959a0ee87c68142f35f7b72002a9e6ef56a00d65\" alt=\"{\\displaystyle 10(256A+B)}\" aria-hidden=\"true\"><\/span><\/td><\/tr><tr><td><tt>33<\/tt><\/td><td>1<\/td><td>Absolute Barometric Pressure<\/td><td>0<\/td><td>255<\/td><td>kPa<\/td><td><span class=\"mwe-math-element\"><img decoding=\"async\" class=\"mwe-math-fallback-image-inline\" src=\"https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/7daff47fa58cdfd29dc333def748ff5fa4c923e3\" alt=\"A\" aria-hidden=\"true\"><\/span><\/td><\/tr><tr><td><tt>40<\/tt><\/td><td>4<\/td><td>PIDs supported [41 &#8211; 60]<\/td><td>&nbsp;<\/td><td>&nbsp;<\/td><td>&nbsp;<\/td><td>Bit encoded<\/td><\/tr><tr><td><tt>42<\/tt><\/td><td>2<\/td><td>Control module voltage<\/td><td>0<\/td><td>65.535<\/td><td>V<\/td><td><span class=\"mwe-math-element\"><img decoding=\"async\" class=\"mwe-math-fallback-image-inline\" src=\"https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/f6946793127fb1c89ec53cde14b75335f6bdec98\" alt=\"{\\displaystyle {\\frac {256A+B}{1000}}}\" aria-hidden=\"true\"><\/span><\/td><\/tr><tr><td><tt>4C<\/tt><\/td><td>1<\/td><td>Commanded throttle actuator<\/td><td>0<\/td><td>100<\/td><td>%<\/td><td><span class=\"mwe-math-element\"><img decoding=\"async\" class=\"mwe-math-fallback-image-inline\" src=\"https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/6add03fcd60435debf27f6d476d05ed1f5c1051e\" alt=\"{\\displaystyle {\\frac {100}{255}}A}\" aria-hidden=\"true\"><\/span><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Example OBD-II Communications<\/h3>\n\n\n\n<p>Here&#8217;s one full cycle of output that my scanner pulled from my car. Obviously, the scanner is attempting to show &#8220;real time&#8221; data and so repeatedly sends requests for each of the data values that the ECU supports, then repeats again and again to give the impression of &#8220;real time&#8221; output.<\/p>\n\n\n\n<p>Here&#8217;s the Raw CAN bus frames first, followed by what Wireshark decodes the packets as.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#    Time         CAN ID     Data\n1891 18.384234117 0x18db33f1 02 01 02 ff ff ff ff ff\n1892 18.386480284 0x18daf101 04 41 02 22 26 ff ff ff\n1948 18.932752338 0x18db33f1 02 01 04 ff ff ff ff ff\n1949 18.933708266 0x18daf101 03 41 04 00 ff ff ff ff\n2004 19.480255834 0x18db33f1 02 01 05 ff ff ff ff ff\n2006 19.482689349 0x18daf101 03 41 05 3d ff ff ff ff\n2061 20.029324990 0x18db33f1 02 01 0b ff ff ff ff ff\n2062 20.031880206 0x18daf101 03 41 0b c8 ff ff ff ff\n2118 20.578419385 0x18db33f1 02 01 0c ff ff ff ff ff\n2119 20.581109100 0x18daf101 04 41 0c 00 00 ff ff ff\n2175 21.127303969 0x18db33f1 02 01 0e ff ff ff ff ff\n2176 21.128371192 0x18daf101 03 41 0e 80 ff ff ff ff\n2231 21.674841186 0x18db33f1 02 01 0f ff ff ff ff ff\n2233 21.676107628 0x18daf101 03 41 0f 38 ff ff ff ff\n2288 22.222260164 0x18db33f1 02 01 11 ff ff ff ff ff\n2289 22.224313834 0x18daf101 03 41 11 39 ff ff ff ff\n2345 22.771129266 0x18db33f1 02 01 1c ff ff ff ff ff\n2346 22.773691168 0x18daf101 03 41 1c 06 ff ff ff ff\n2402 23.320629505 0x18db33f1 02 01 1d ff ff ff ff ff\n2403 23.323019928 0x18daf101 03 41 1d 01 ff ff ff ff\n2459 23.869724288 0x18db33f1 02 01 23 ff ff ff ff ff\n2460 23.872168914 0x18daf101 04 41 23 00 f0 ff ff ff\n2515 24.419230119 0x18db33f1 02 01 33 ff ff ff ff ff\n2517 24.421439008 0x18daf101 03 41 33 00 ff ff ff ff\n2572 24.968236310 0x18db33f1 02 01 42 ff ff ff ff ff\n2573 24.969567270 0x18daf101 04 41 42 2d ad ff ff ff\n2629 25.516453162 0x18db33f1 02 01 4c ff ff ff ff ff\n2630 25.518540406 0x18daf101 06 41 4c 00 ff ff ff ff<\/pre>\n\n\n\n<p>&#8230; and here&#8217;s how Wireshark decodes those raw CAN bus frames:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#    Time         ID         Info\n1891 18.384234117 [18db33f1] Freeze DTC\n1892 18.386480284 [18daf101] Freeze DTC: &lt; 22 26 &gt;\n1948 18.932752338 [18db33f1] Calculated engine load\n1949 18.933708266 [18daf101] Calculated engine load: 0.00 %\n2004 19.480255834 [18db33f1] Engine coolant temperature\n2006 19.482689349 [18daf101] Engine coolant temperature: 21 \u00b0C\n2061 20.029324990 [18db33f1] Intake manifold absolute pressure\n2062 20.031880206 [18daf101] Intake manifold absolute pressure: 200 kPa\n2118 20.578419385 [18db33f1] Engine RPM\n2119 20.581109100 [18daf101] Engine RPM: 0.00 rpm\n2175 21.127303969 [18db33f1] Timing advance\n2176 21.128371192 [18daf101] Timing advance: 0.00 \u00b0BTDC\n2231 21.674841186 [18db33f1] Intake air temperature\n2233 21.676107628 [18daf101] Intake air temperature: 16 \u00b0C\n2288 22.222260164 [18db33f1] Throttle position\n2289 22.224313834 [18daf101] Throttle position: 22.35 %\n2345 22.771129266 [18db33f1] OBD standards\n2346 22.773691168 [18daf101] OBD standards: EOBD\n2402 23.320629505 [18db33f1] Oxygen sensors present (4 banks)\n2403 23.323019928 [18daf101] Oxygen sensors present (4 banks): Bank1 sensors: 1 , Bank2 sensors: None, Bank3 sensors: None, Bank4 sensors: None\n2459 23.869724288 [18db33f1] Fuel Rail Gauge Pressure\n2460 23.872168914 [18daf101] Fuel Rail Gauge Pressure: 2400 kPa\n2515 24.419230119 [18db33f1] Absolute Barometric Pressure\n2517 24.421439008 [18daf101] Absolute Barometric Pressure: 0 kPa\n2572 24.968236310 [18db33f1] Control module voltage\n2573 24.969567270 [18daf101] Control module voltage: 11.693 V\n2629 25.516453162 [18db33f1] Commanded throttle actuator\n2630 25.518540406 [18daf101] Commanded throttle actuator: 00<\/pre>\n\n\n\n<p>So, the MBE 94A&#8217;s support the OBD-II diagnostic protocol. It&#8217;s not a huge amount of info that can be gleaned from the car, just 15 data points, but it&#8217;s more than is available from the default MBE Broadcast protocol.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The OBD-II diagnostic protocol is well defined and information about it can be found&nbsp;in On-board Diagnostics. It&#8217;s a mish-mash of many diffrerent standards, both physical and electrical, that I&#8217;ll refer to as OBD-II. There&#8217;s also a complete breakdown of the Services and PIDs (see below) that can be found in On-board Diagnostic PIDs. I&#8217;ll talk [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[51,20],"tags":[34],"class_list":["post-5134","post","type-post","status-publish","format-standard","hentry","category-caterham-blog","category-ecu-diagnostics","tag-ecu-diagnostics"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p8yl38-1kO","jetpack-related-posts":[{"id":5112,"url":"https:\/\/purplemeanie.co.uk\/index.php\/2019\/09\/20\/ecu-diagnostics-part-13-three-diagnostic-protocols-in-the-mbe-9a4-ecu\/","url_meta":{"origin":5134,"position":0},"title":"ECU Diagnostics &#8211; part 13 : Three Diagnostic Protocols in the MBE 9A4 ECU","author":"John Martin","date":"September 20, 2019","format":false,"excerpt":"This one's just a short post to introduce the next three posts. In our investigations of the MBE 9A4 ECU we've found three different diagnostics protocols supported on the OBD port. The following three posts will summarise what we've learnt about each protocol and will be updated with new information\u2026","rel":"","context":"In &quot;Caterham Blog&quot;","block_context":{"text":"Caterham Blog","link":"https:\/\/purplemeanie.co.uk\/index.php\/category\/caterham-blog\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":4726,"url":"https:\/\/purplemeanie.co.uk\/index.php\/2019\/08\/31\/ecu-diagnostics-part-1-introduction\/","url_meta":{"origin":5134,"position":1},"title":"ECU Diagnostics &#8211; part 1 : Introduction","author":"John Martin","date":"August 31, 2019","format":false,"excerpt":"So here we go for a marathon series of posts. I'll update this page with links to the completed posts as they come along... IntroductionECUs, OBD and CANTest SetupWireshark Patching and OBD-II ResultsThe Correlator Dead-EndReading MaterialECU Maps and MappingEasimap uses ISOTP (sort of)The Easimap Protocol TheoryDecoding EC2 FilesLogic Analyzer on\u2026","rel":"","context":"In &quot;Caterham Blog&quot;","block_context":{"text":"Caterham Blog","link":"https:\/\/purplemeanie.co.uk\/index.php\/category\/caterham-blog\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":4765,"url":"https:\/\/purplemeanie.co.uk\/index.php\/2019\/08\/31\/ecu-diagnostics-part-2-ecu-obd-and-can\/","url_meta":{"origin":5134,"position":2},"title":"ECU Diagnostics \u2013 part 2 : ECU, OBD and CAN","author":"John Martin","date":"August 31, 2019","format":false,"excerpt":"ECU Caterhams, like all modern cars, have an Engine Control Unit (ECU) - a black box full of electronics, controlled by a microprocessor that manages how the engine runs. \u00a0And because it has a microprocessor it means it runs some software to control everything. It also connects to a bunch\u2026","rel":"","context":"In &quot;Caterham Blog&quot;","block_context":{"text":"Caterham Blog","link":"https:\/\/purplemeanie.co.uk\/index.php\/category\/caterham-blog\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/purplemeanie.co.uk\/wp-content\/uploads\/2019\/08\/9A4.jpg?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":4782,"url":"https:\/\/purplemeanie.co.uk\/index.php\/2019\/09\/07\/ecu-diagnostics-part-4-wireshark-patching-and-obd-ii-results\/","url_meta":{"origin":5134,"position":3},"title":"ECU Diagnostics &#8211; part 4 : Wireshark Patching and OBD-II Results","author":"John Martin","date":"September 7, 2019","format":false,"excerpt":"When Wireshark first appeared, it was called Ethereal... and its motto was: \"Sniffing the glue that holds the internet together\" Wireshark sniffs the packet-glue that holds the internet together and is one of the most influential pieces of open source software there is.\u00a0 That's a pretty bold statement and I\u2026","rel":"","context":"In &quot;Caterham Blog&quot;","block_context":{"text":"Caterham Blog","link":"https:\/\/purplemeanie.co.uk\/index.php\/category\/caterham-blog\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/purplemeanie.co.uk\/wp-content\/uploads\/2019\/08\/cano7-OBD-II-working.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/purplemeanie.co.uk\/wp-content\/uploads\/2019\/08\/cano7-OBD-II-working.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/purplemeanie.co.uk\/wp-content\/uploads\/2019\/08\/cano7-OBD-II-working.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/purplemeanie.co.uk\/wp-content\/uploads\/2019\/08\/cano7-OBD-II-working.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/purplemeanie.co.uk\/wp-content\/uploads\/2019\/08\/cano7-OBD-II-working.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/purplemeanie.co.uk\/wp-content\/uploads\/2019\/08\/cano7-OBD-II-working.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":5119,"url":"https:\/\/purplemeanie.co.uk\/index.php\/2019\/09\/20\/ecu-diagnostics-part-13-1-mbe-broadcast\/","url_meta":{"origin":5134,"position":4},"title":"ECU Diagnostics &#8211; part 13.1 : MBE-Broadcast","author":"John Martin","date":"September 20, 2019","format":false,"excerpt":"The simplest of the three Caterham OBD port diagnostic protocols we know about is what I've called MBE-Broadcast. As soon as the car is put into ignition switch position 2, the ECU starts to spit out a this stream of data on the CAN bus. Unlike the OBD-II protocol and\u2026","rel":"","context":"In &quot;Caterham Blog&quot;","block_context":{"text":"Caterham Blog","link":"https:\/\/purplemeanie.co.uk\/index.php\/category\/caterham-blog\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/purplemeanie.co.uk\/wp-content\/uploads\/2019\/09\/Fig-8.-MBE-Broadcast-Protocol-e1597310343226.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/purplemeanie.co.uk\/wp-content\/uploads\/2019\/09\/Fig-8.-MBE-Broadcast-Protocol-e1597310343226.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/purplemeanie.co.uk\/wp-content\/uploads\/2019\/09\/Fig-8.-MBE-Broadcast-Protocol-e1597310343226.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/purplemeanie.co.uk\/wp-content\/uploads\/2019\/09\/Fig-8.-MBE-Broadcast-Protocol-e1597310343226.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":5192,"url":"https:\/\/purplemeanie.co.uk\/index.php\/2019\/09\/20\/ecu-diagnostics-part-14-software-framework-mbe-py\/","url_meta":{"origin":5134,"position":5},"title":"ECU Diagnostics &#8211; part 14 : Software Framework mbe.py","author":"John Martin","date":"September 20, 2019","format":false,"excerpt":"This is hopefully a reasonably short post about the software framework I've developed to help read sensor data from the MBE 9A4 ECU. The software is written in Python 3 and is available here: Caterham-OBD. However, I'm going to talk about using one file only which is mbe.py.\u00a0 The idea\u2026","rel":"","context":"In &quot;Caterham Blog&quot;","block_context":{"text":"Caterham Blog","link":"https:\/\/purplemeanie.co.uk\/index.php\/category\/caterham-blog\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/purplemeanie.co.uk\/index.php\/wp-json\/wp\/v2\/posts\/5134","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/purplemeanie.co.uk\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/purplemeanie.co.uk\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/purplemeanie.co.uk\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/purplemeanie.co.uk\/index.php\/wp-json\/wp\/v2\/comments?post=5134"}],"version-history":[{"count":1,"href":"https:\/\/purplemeanie.co.uk\/index.php\/wp-json\/wp\/v2\/posts\/5134\/revisions"}],"predecessor-version":[{"id":10694,"href":"https:\/\/purplemeanie.co.uk\/index.php\/wp-json\/wp\/v2\/posts\/5134\/revisions\/10694"}],"wp:attachment":[{"href":"https:\/\/purplemeanie.co.uk\/index.php\/wp-json\/wp\/v2\/media?parent=5134"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/purplemeanie.co.uk\/index.php\/wp-json\/wp\/v2\/categories?post=5134"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/purplemeanie.co.uk\/index.php\/wp-json\/wp\/v2\/tags?post=5134"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}