Understanding BMW's ZCS System
Anyone who has ever performed a retrofit on a BMW will be familiar with the concept of the Vehicle Order (VO) or Fahrzeugbestellung (FA). For the uninitiated, this is a string of alpha-numeric codes reflect exactly with which options that car left the factory.
These codes are also responsible for setting default values for modules. For example, if a car is equipped with a Sports Automatic Transmission, it will contain $205 in the VO, which will dictate that the default settings of the transmission module (EGS) activate the Sport+ and Launch control functionality in the car.
Finally, it is important to understand that modification of the VO/FA alone does not do anything. If you change the VO and don’t code the affected modules, there will be no change on the car.
In most cars, it is easy to modify the VO – it is a simple matter of removing the unnecessary codes or adding the required ones.
However, for older BMWs, such as the E46 3-series (and its contemporaries), BMW used a different, less straightforward system called the ZCS. ZCS (roughly translating to Central Key in German) is comprised of three linked strings of hexadecimal. The principle is the same – the ZCS dictates the configuration of the car, determining the defaults of each module.
Luckily, we can use a few bits of knowledge to help us on our way. I will walk you through an example to help understand the process.
You will need:
BMW Interface (ICOM or K+DCAN cable)
BMW Standard Tools (specifically, NCS Expert)
BMW Daten files for your vehicle (usually included with a BMW Standard Tools installation)
Changing the ZCS on a 2000 BMW 528i (E39) – Manual Swap
Before we begin, we need to understand how the ZCS is calculated on this car. To do that, we can navigate to the E39 ZST file. This is found at C:\NCSEXPER\DATEN\E39\E39ZST.000. Open this file in a text editor (like Notepad).
Step 1. Determine the Model Code of our car.
To determine the model code, we can check the VIN. Characters 4-7 on our example are DD63. A quick search of that gives us the following result:
A helpful thing to know is that certain models (like our E39) designate the transmission as part of the model itself. The automatic 528i is written here as the 528iA. For example, if we search for the string 528i Limousine US, we get the model code of DD53. Note – Limousine refers to Sedan.
Step 2. Get the current ZCS values from the car.
Now it is time to pull the current ZCS from the car. We connect the car to our computer, start NCS Expert, and load a profile.
First, we want to query one of the ECUs in the car, so we will use the ZCS/FA f. ECU to choose E39 > KMB. KMB is one of three “master” modules on the E39. You can also use IKE or EWS.
Once the car’s VIN and module list populate into NCS Expert, click Enter ZCS. If necessary, confirm the chassis and click OK when the VIN is displayed.
Let’s copy those into a text editor and save them – just in case.
The GM, SA, and VN values shown here also contain a final checksum digit. Luckily, NCS Expert can calculate new checksums if necessary.
Step 3. Calculate the new ZCS.
Most of the time, BMW option codes guide the configuration of the car. Often an automatic transmission is an option code (specifically, $205). However, if we search the E39ZST.000 file for “205,” the only reference found is to a tire size.
In that case, we need to find where else that option may be specified. Luckily, we already found it before in step 1. There is no option code specified for the automatic as the model code already determines which transmission the vehicle has.
To calculate the new values, we need to examine the differences between the GM, SA, and VN strings for the two model codes.
As shown in the table above, the only difference between the two models is the third character of the GM value. The zero values show us that no other difference exists between the ZCS of a 528i and 528iA.
If we return to our car’s original ZCS, we can see that without the final checksum digit, the GM value is 5C630000. After we change the third character to 5 – and delete the checksum digits for each of the three values, we wind up with the below ZCS:
GM: 5C530000
SA: 00000C1005835474
VN: 004D50E880
Note again that the only affected value was the GM string.
Step 4. Enter the new ZCS and apply it to the car.
Once we enter the new ZCS values into the Enter ZCS screen, we can click “Calculate checksum” and select OK.
Now, it is time to load the new ZCS into the master modules. For an E39, those are, once again the IKE, KMB, and EWS.
To begin, we choose Process ECU and select KMB. Once there, click Change Job, then ZCS_SCHREIBEN. This step writes the ZCS to the selected master module. Again, until we actually code the module, this step has no effect.
Once the ZCS job finishes, we need to select Change Job, then SG_CODIEREN. Now, the system will reference the new ZCS, set the default values of the module accordingly, and then restart the module. In the case of the KMB (cluster), we will see the transmission indicator screen go dark. Once that is the case, we know that the coding was a success.
Before getting too excited, there are still a few quick actions remaining. First, the remaining master modules need to have the ZCS loaded to them. Select them with Change ECU and run the ZCS_SCHREIBEN job again.
Once that is complete, you can code any necessary remaining modules with SG_CODIEREN, and they will be coded with values for a manual vehicle. For a transmission swap, it is necessary to run SG_CODIEREN on EWS, DSC, KMB, and IKE. For good measure, you can code every module, but it’s not completely necessary.
Other helpful information
In our E39 example, the model code is the driver for the transmission selection. But what if we’re working with a different chassis or option code?
Here is an abbreviated example on the E53 X5.
Quick example – Remove air suspension (coil-over retrofit)
On the E53 X5, a popular modification is to replace the failure-prone air suspension with springs and shocks.
To do so, we follow the steps as outlined above to get the current ZCS and open the E53ZST.000 file to find the option.
Now, we again look for the identifier of that option. We see that on the 8th character of the SA string, there is a 4. That means, to remove the option, we need to subtract 4 from that position on our current ZCS.
Remember that these are hex values, which use base 16.
The order is 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F. If the current value in position 8 is A, for example, the new value would be A – 4, which equals 6.
Once you’ve generated your new value, delete and generate the checksums, load the ZCS, and code the affected modules to default values. If you are deleting something which has an associated module, you will also need to disconnect the module.