Archive #35333765

941 MBE ECU Knowledge Base




A wiki page to share knowledge about the 941 MBE ECU.



I'm happy to share knowledge about how to communicate with the 941.

1. Technical Details
2. Versions
3. Current diagnostic software solutions
4. Communication
5. Simple python program to query ECU


Asking the ECU for any info takes a few lines of Python.



1. Technical Details


Serial type MBE ECUs Pin Out & Related Wiring Information from SBD Motorsport

The 941 ECU has an 8-bit bus

Each 8 bit memory locaton can be used to store a value from 0-256 or 0x00 - 0xFF


2. Versions

[ Juddder]

The version number is an 8 digit code stored in the ECU EPROM and is referred to in the Original ECU Diagnostic software without the 3rd number (presumably to allow wildcard versions)

Known versions that are dumped are shown with the extra number in the brackets and the engine type at the end

  1. 9280240 = 928[x]0240 [v8]
  2. 9280270 = 928[1]0270 [v8]
  3. 9410034 = 941[x]0034 [v8]
  4. 9410035 = 941[1]0035 [v8]
  5. 9410090 = 941[x]0090 [s6]
  6. 9410100 = 941[x]0100 [s6]
  7. 9410101 = 941[3]0101 [s6]
  8. 9410101 = 941[3]0116 [s6]
I've noted the difference between the AJP V8 and S6 versions by checking how many Injectors the ECU diagnostics software is trying to monitor for each version - Two banks of 1357,2468 for the V8 and 123,456 for the S6

Later ECU software appears to have additional logging such as BuzzLogger, SpeedLogger, WaterLogger etc. including an OilLogger, even on the V8 at version #941[1]0035



3. Current diagnostic software solutions


...

4. Communication


...

5. Simple python program to query ECU


The current state of each ECU parameter (Throttle position, Lambda sensors, etc..) is stored in the ECU at a specific memory location.
The ECU Diagnostic Software simply queries and displays these memory locations.
Communication with the ECU is a simple serial connection. All you need to do is open a socket with the correct baud rate and you can freely query any memory location you like. So, to ask the ECU for the contents of a memory location, you just write the desired memory location on the socket are read the response.

There are some extra files bundled with the Original ECU diagnostic software.

If you look in one that ends in .ECF you will see something like this:
\#Title,legend,units,max,min,command,SamplingInterval
WaterTemp,WaterTemp, C, 130.0, -30,C0
Throttle1,Throttle1, %, 100.0, 9.48,9C
Throttle2,Throttle2, %, 100.0, 9.48,94

What that says is: Throttle 1 is a percentage value ranging from 9.48% to 100% and it is stored in memory location 9C.
Or WaterTemp is a value ranging from -30 to 130.0 and is stored in memory location C0.


So, if you connect to your ecu and ask it for the contents of WaterTemp memory location "C0" and it gives you "BD" it means that the water temperature is 88.6 degrees. There is a table of values to reverse lookup the values stored for water temp.

Here is some example python code, that queries the ECU for its serial number and current water temperature.
It is example code only.
#!/usr/bin/python

import sys
import time
import serial
import string

# configure the serial connection.
ser = serial.Serial(
port='/dev/ttyS0',
baudrate=4800,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS
)
ser.isOpen()

len = ser.inWaiting()
while len == 0:
len = ser.inWaiting()
if len == 0:
ser.write('\r')
time.sleep(0.1)
out = ser.read(len)
print "Serial Number of ECU:" + out

len = ser.inWaiting()
ser.write('\xC0') # Water Temp Op Code
while len == 0:
len = ser.inWaiting()
time.sleep(0.1)
out = ser.read(len)
while len !=0:
print "LOOK->%02X" %ord(out[len-1])
len -=1

sys.exit(0)