Jump to content

Test-AC: Difference between revisions

From Teltonika Telematics Wiki
Tag: Manual revert
GTPGTM-11768 - draft
 
(17 intermediate revisions by the same user not shown)
Line 1: Line 1:
https://wiki.teltonika-gps.com/view/Template:FTX_Features
==Introduction==
=SECO Scenario=


===<u>Introduction</u>===
With a professional device lineup, telltale information (dashboard indicators) from heavy-duty vehicles can be read remotely to identify a variety of issues. New feature of Diagnostic Trouble Code (DTC) reading will help to narrow down the specific faults happening in vehicles.  
[[File:FTX SECO.png|right|500px]]


The purpose of Secure Engine Cut Off (SECO) is to bring a vehicle to a stop, in order to prevent unauthorized use. SECO disables the fuel pump, which would prevent the engine from continuing to run and stop the vehicle from being driven. For safety reasons, the system is designed to slow the vehicle down gradually in a controlled manner, ensuring that security measures do not compromise the driver’s or passengers’ safety. It is typically triggered by remote commands (SMS or GPRS) and is used for security or immobilization purposes.
With {{{model}}} you can read 2 types of DTC messages based on J1939 protocol:


===<u>Prerequisites</u>===
*DM1 – Communicates currently present faults
*At least one '''DOUT''' is available.
*DM2 – Reports stored faults
*'''SECO functionality''' should have DOUT control priority higher than '''Immobilizer''' scenario.


===<u>How It Works</u>===
{{{model}}} is able to read DM codes and pass them to the server in IO element. When active DM1 or DM2 messages appear on CAN line it is broadcasted very often – {{{model}}} device saves the codes into the internal memory and does not flood the server with irrelevant information – only new DTC codes are sent to the server.
Firstly, in order to safely slow down vehicle the systems toggles the relay, which is connected to fuel pump ('''GNSS Available'''). Secondly, at a safe speed, the system tuns on DOUT permanently in order to stop the vehicle ('''Speed Pulse'''). Last mode is activated in case no GNSS fix is available ('''GNSS Unavailable''').


'''Speed Pulse'''
==Functionality Description==


DOUT control starts when the vehicle speed goes below a configured speed threshold and remains below this threshold for a specified speed check period. As soon as that happens DOUT is activated.
This functionality is available from Firmware version '''03.01.02.rev.06''' or higher.


The timer will be reset if the vehicle speed increases above the configured speed threshold.
For proper functionality, the device requires ignition to be active. Source of ignition and voltage level can be selected from '''System''' tab.


'''GNSS Available'''
Ignition has to be active for at least 14 sec to start generating the DTC list. If ignition is turned off, the device will clean all DM1 and DM2 codes and functionality will not be working.


This mode requires a GNSS fix to be present before DOUT control begins.  
[[File:DTC_Ignition.png]]


DOUT pulsing starts when the vehicle speed drops below a configured speed pulse threshold and the speed remains below this threshold for a specified speed check period.  
After the device is connected to the Configurator, there will be '''DM1 / DM2''' tab made available. There is a configurable DM1 / DM2 Data source parameter. This parameter selects the CAN source based on which device will parse DM data from. Based on selected data source, device will also call a request for DTCs.


'''GNSS Unavailable'''
'''Note:''' The functionality is completely separated from the FMS source.


This mode is used when a GNSS fix is not available.
[[File:DTC Data source selection.png]]


In this mode, the system initiates DOUT control only if the vehicle is stationary, location data is unavailable, and the movement timeout condition is met.
*NONE – Device will not use any CAN as data source
*CAN1 – Device will use CAN1 as data source
*CAN2 – Device will use CAN2 as data source
*BOTH – Device will use CAN1 and CAN2 as data source


'''Note:''' If there is no GNSS fix available and “secoon” command is sent, the system waits for the movement timeout to be reached before activating the configured DOUT. This approach ensures that the vehicle is stationary prior to disabling the fuel supply.
Bellow '''Data source''' parameters there is a list of configurable IOs


=== <u> Parameters list </u>===
[[File:DTC Configurable IOs.png]]
<table class="nd-othertables_2" style="width:100%; border-collapse: collapse;">
<tr>
<th style="width:1%; vertical-align: middle; text-align: center;">PARAMETER NAME</th>
<th style="width:1%; vertical-align: middle; text-align: center;">PARAMETER ID (RELATED AVL ID)</th>
<th style="width:5%; vertical-align: middle; text-align: center;">DESCRIPTION</th>
<th style="width:6%; vertical-align: middle; text-align: center;">VALUES</th>
</tr>
<tr>


<td style="vertical-align: middle; text-align: center;"> SECO DOUT status </td>
„DTC DM1“ and “DTC DM2“ shows the last DTC that has been detected. „Active DM1 List“ and „Active DM2 List“ provides a list of all active DTCs for a given source.
<td style="vertical-align: middle; text-align: center;"> 396</td>
<td style="vertical-align: middle; text-align: center;"> SECO DOUT status. </td>
<td style="vertical-align: middle; text-align: left;">'''0''' = SECO DOUT is '''OFF''' <br> '''1''' = SECO DOUT is '''pulsing''' <br> '''2''' = SECO DOUT is '''ON''' </td>


</tr>
Example of generating DM1 / DM2 list: To register DM1 code, it is required to send a command using (pgn 0xFEFA). Device will first check if such DTC code exist in the system (MCUID and CAN Source has to be unique for each DTC). Otherwise, DTC will be rejected.
<tr>


<td style="vertical-align: middle; text-align: center;"> Priority </td>
[[File:DTC Configurator outputs.png]]
<td style="vertical-align: middle; text-align: center;"> 1039600 </td>
<td style="vertical-align: middle; text-align: center;"> Priority of how events are being sent to a server. For example, events with low priority are added to the periodical record, and events with high priority are sent immediately after they occur. </td>
<td style="vertical-align: middle; text-align: left;"> '''0''' = SECO  scenario is '''disabled''' <br> '''1''' = SECO scenario is '''low''' <br> '''2''' = SECO scenario is '''high''' <br>
</td>


</tr>  
<span style="color:green;">9D000301:<span style="color:blue;">01:<span style="color:red;">01
<tr>
*<span style="color:green;">9D000301</span> – DTC in hexadecimal format
*<span style="color:blue;">01</span> – MCU source that reported the DTC
*<span style="color:red;">01</span> – Device CAN source used (00 - CAN1, 01 - CAN2)


<td style="vertical-align: middle; text-align: center;"> Speed </td>
<span style="color:green;">9D000302:<span style="color:blue;">02:<span style="color:red;">01
<td style="vertical-align: middle; text-align: center;"> 12254 </td>
*<span style="color:green;">9D000302</span> – DTC in hexadecimal format
<td style="vertical-align: middle; text-align: center;"> Speed threshold at which the configured digital output (DOUT) will be activated. </td>
*<span style="color:blue;">02</span> – MCU source that reported the DTC
<td style="vertical-align: middle; text-align: left;"> Minimum value = '''0'''<br> Maximum value = '''255''' <br> Default value = '''10''' </td>
*<span style="color:red;">01</span> – Device CAN source used (00 - CAN1, 01 - CAN2)


</tr>
Based on configured „Priority“, „Event Only“ and „Operand“ device will add this parameter to record.
<tr>


<td style="vertical-align: middle; text-align: center;"> Speed pulse scenario </td>
[[File:DTC Terminal logs.png]]
<td style="vertical-align: middle; text-align: center;"> 12259 </td>
<td style="vertical-align: middle; text-align: center;">
Speed threshold at which the configured digital output (DOUT) will be toggled. </td>
<td style="vertical-align: middle; text-align: left;"> Minimum value = '''0'''<br> Maximum value = '''255''' <br>Default value = '''10''' </td>


</tr>
To remove one of the DTC from DM1 list, DM2 code (pgn 0xFEFB) is required. Device will check if the sent DTC code exists in the system (MCUID and CAN Source has to be unique for each DTC). If sent DTC does not exist in the system, it will be rejected.
<tr>


<td style="vertical-align: middle; text-align: center;">
Based on previous example, sending DTC 9D000301 with MCUID 01 on CAN2, device remove this DTC from the system, as the result, this DTC is removed from „Active DM1 List“ and added to the „Active DM2 List“.
Speed check period </td>
<td style="vertical-align: middle; text-align: center;"> 12255 </td>
<td style="vertical-align: middle; text-align: center;"> Time span during which speed must be lower than configured for output to activate (GNSS on). </td>
<td style="vertical-align: middle; text-align: left;">  Minimum value = '''0'''<br> Maximum value = '''65535''' <br>Default value = '''10''' </td>


</tr>
[[File:DTC Configurator outputs 2.png]]
<tr>


<td style="vertical-align: middle; text-align: center;">
Log example:
Movement timeout</td>
<td style="vertical-align: middle; text-align: center;"> 12256 </td>
<td style="vertical-align: middle; text-align: center;"> Duration after which the DOUT will be activated if no movement is detected and GNSS is off. </td>
<td style="vertical-align: middle; text-align: left;">  Minimum value = '''0'''<br> Maximum value = '''65535''' <br>Default value = '''30''' </td>


</tr>
[[File:DTC Terminal logs 2.png]]
<tr>


<td style="vertical-align: middle; text-align: center;">Eventual records</td>
That DTCs will be added to record and would be accessible on server. Data on server need to be converted from HEX to ASCII.
<td style="vertical-align: middle; text-align: center;"> 1039604</td>
<td style="vertical-align: middle; text-align: center;">Enables feature status sending only when the event happens (an eventual record). When disabled, feature status will be sent with both eventual and periodical records.</td>
<td style="vertical-align: middle; text-align: left;"> '''0''' = SECO status will be sent with both eventual and periodical records. <br> '''1''' = SECO status will be sent only when the event happens (an eventual record).</td>


</tr>
[[File:DTC Outputs from server.png]]
<tr>


<td style="vertical-align: middle; text-align: center;">Output control</td>
'''39443030303330323A30323A30313B''' -> (after conversion from hex to ANSCII) '''9D000302:02:01''';
<td style="vertical-align: middle; text-align: center;">12252</td>
<td style="vertical-align: middle; text-align: center;">
Digital output used for connection to fuel pump to gradually stop the vehicle. </td>
<td style="vertical-align: middle; text-align: left;"> '''0''' = DOUT control is disabled <br> '''1''' = DOUT1 is controlled <br> '''2''' = DOUT2 is controlled <br> '''3''' = DOUT3 is controlled <br> '''4''' = DOUT4 is controlled</td>


</tr>
'''39443030303330313A30313A30313B''' -> (after conversion from hex to ANSCII) '''9D000301:01:01''';
<tr>


<td style="vertical-align: middle; text-align: center;">Output pulse</td>
==Functionality Block Diagram==
<td style="vertical-align: middle; text-align: center;">12253</td>
Graphic representation of '''DM1''' and '''DM2''' functionality:
<td style="vertical-align: middle; text-align: center;">Pulse functionality adds additional output control which helps to slow down vehicle before fully disabling fuel pump.</td>
<td style="vertical-align: middle; text-align: left;"> '''0''' = Disabled <br> '''1''' = Enabled </td>


</tr>
[[File:DTC Functionality blok diagram.png]]
<tr>


<td style="vertical-align: middle; text-align: center;">
DOUT on duration</td>
<td style="vertical-align: middle; text-align: center;">12257</td>
<td style="vertical-align: middle; text-align: center;"> Duration for how long DOUT should be active.</td>
<td style="vertical-align: middle; text-align: left;"> Minimum value = '''10'''<br> Maximum value = '''5000''' <br>Default value = '''1000''' </td>


</tr>
==DM1 Lamp Status and Flash Signals==
<tr>


<td style="vertical-align: middle; text-align: center;">DOUT off duration</td>
The '''DM1 (Diagnostic Message 1)''' in the '''J1939''' protocol reports active '''Diagnostic Trouble Codes (DTCs)''' and controls vehicle warning indicators. It defines the behavior of the '''Malfunction Indicator Lamp (MIL)''' and other warning lamps, which can be off, on solid, or flashing, depending on the severity and priority of detected faults. Flashing typically signals a more urgent or severe condition, while a solid light indicates an active but less critical issue.
<td style="vertical-align: middle; text-align: center;">12258</td>
<td style="vertical-align: middle; text-align: center;"> A value in milliseconds, for how long DOUT should be inactive. </td>
<td style="vertical-align: middle; text-align: left;"> Minimum value = '''10'''<br> Maximum value = '''5000''' <br>Default value = '''1000''' </td>


</tr>
The first byte represents the status of four indicator lamps:
</table>


<!---For Template:FTX SMS/GPRS Commands--->
*'''PL (Protect Lamp)''' - DTC's indicate non-electronic subsystem issue.
{{#if: {{FTX Pin Support List|model={{{model}}}|pin=DOUT1}}{{FTX Pin Support List|model={{{model}}}|pin=DOUT2}}{{FTX Pin Support List|model={{{model}}}|pin=DOUT3}}
*'''AWL(Amber Warning Light)''' - DTC's indicate a non-critical issue that does not warrant stopping the vehicle.
|
===SECO Commands===
<table class="nd-othertables_2" style="width:100%; border-collapse: collapse;">
<tr>
<th style="width:20%; vertical-align: middle; text-align: left;">COMMAND</th>
<th style="width:45%; vertical-align: middle; text-align: left;">DESCRIPTION</th>
<th style="width:35%; vertical-align: middle; text-align: left;">SYNTAX EXAMPLE</th>
</tr>
<tr>
<td style="vertical-align: middle; text-align: left;">[[SMS/GPRS command - secooff|secooff]]</td>
<td style="vertical-align: middle; text-align: left;">Deactivate SECO scenario.</td>
<td style="vertical-align: middle; text-align: left;"><code>secooff</code></td>
</tr>
<tr>
<td style="vertical-align: middle; text-align: left;">[[SMS/GPRS command - secoon|secoon]]</td>
<td style="vertical-align: middle; text-align: left;">Activate SECO scenario.</td>
<td style="vertical-align: middle; text-align: left;"><code>secoon</code></td>
</tr>
</table>
}}


----
*'''RSL(Red Stop Lamp)''' - DTC's indicate a critical issue that warrants stopping the vehicle immediately.  
https://wiki.teltonika-gps.com/index.php?title=Template:FTX_Mobile_network


==Server settings== 
*'''MIL(Malfunction Indicator Lamp)''' - At least one DTC indicates emissions related issue.
[[File:FTX server settings.png|right|500x800px]]
===Primary server settings===
'''Domain'''
*Server or Domain address, either IP address or Domain can be written.
'''Port'''
*Server Port.
'''Data protocol'''
*TCP (Transmission control protocol) or UDP (User datagram protocol). Changing this parameter will alter how the device communicates. From the device side, TCP and UDP work almost the same, the only difference is that UDP doesn't need additional confirmation from the server side, that the data packet was received. TCP has that and uses more network data for the confirmation. The desired data transfer protocol can be selected through the configurator. For more information on the protocol differences of Teltonika devices, refer here [https://wiki.teltonika-gps.com/view/Teltonika_Data_Sending_Protocols]
----
'''New description added''' <br>
<span style="color:#00FF00;">'''Encryption'''
*TLS/DTLS are security protocols that protect information sent over a network by encrypting the data so only the intended recipient can read it. These Protocols help authenticate devices communicating with the server and ensure data integrity during transmission. TLS/DTLS encryption creates a secure, private connection so sensitive data can travel safely across networks.</span>


*Tp use TLS/DTLS encryption, server certificates must be uploaded via '''Teltonika Configurator Tool (TCT)''' or '''FOTA Web''' using '''Upload user TLS certificate''' task. For more information, refer to [[{{{model}}} Device status]].
Each lamp is encoded using 2 bits, allowing four possible states: '''off, on, slow flash, and fast flash'''. This compact encoding means all lamp states are conveyed within a single byte, with each pair of bits mapped to a specific lamp in a fixed order. These lamp states directly inform the operator about the severity and urgency of active faults.


*'''Note:''' Encryption is supported only for TCP/UDP data protocols. MQTT over TLS is not supported in the current implementation.
DM1 encodes warning lamp information in its first 2 bytes, combining both lamp status  and flash behavior. Each lamp is represented by two 2-bit fields—one in byte 1 (status) and one in byte 2 (flash).  


----
To decode, split each byte into 2-bit segments and map each pair to its corresponding lamp. The final behavior is determined by combining status and flash (e.g., ON + fast flash = rapidly blinking warning).
===Secondary server settings===
'''Mode'''
*Backup -  Records are sent to second server while main server is not available.  
*Duplicate - records are sent to both servers (main and second), records are deleted from Flash storage only if both servers confirmed that the records were received from device.


{| class="wikitable"
==Global and Manufacturer SPN Codes==
|+ Secondary server parameters
|-
! Parameter !! Parameter ID !! Values
|-
| Second server type || 2010 || 0 - Disable, 1 - Backup, 2 - Duplicate
|-
| Secondary server IP or DNS address || 2007 || String
|-
| Secondary server port || 2008 || Integer
|-
| Secondary server protocol || 2009 || 0 - TCP, 1 - UDP
|}


https://wiki.teltonika-gps.com/view/Template:FTX_Features
===Global-Level SPN codes===
=GNSS Fuel Counter=
[[File:FTX GNSS fuel counter.png|right|500px]]


===<u>Introduction</u>===
Standard codes are defined by the SAE J1939 standards and are recognized across all compliant vehicles and equipment. The SPNs for these codes fall within the range of '''1 to 24,324''' representing widely used parameters such as engine speed, coolant temperature, or oil pressure. FMI values are standardized, describing specific failure patterns such as high voltage, circuit open, or out-of-range conditions.
The Fuel Counter GNSS scenario provides fuel consumption estimation using GNSS-derived distance and user-configured fuel rate. It calculates the amount of fuel used by multiplying traveled distance by the average fuel rate and converting it to appropriate units. It is a software-based alternative when fuel flow sensors are not available.
===<u>How It Works</u>===
The scenario monitors GNSS data and updates fuel usage whenever valid  GNSS PVT(Position, Velocity, Time) messages are received and movement is detected. It also supports runtime reconfiguration to keep fuel usage parameters in sync with user changes.


*On device startup, the scenario:
Because they are standardized, these codes are universally interpretable by any compliant diagnostic tool without requiring manufacturer-specific references.
**Checks for a retained value of previously used fuel.
**If found, it restores this value and updates the corresponding I/O element.
**If no retained value is found, the system uses the current configuration parameter (user-defined or default), stores it in retained RAM for future startups, and updates the I/O element.


When GNSS messages are received, the scenario determines whether they represent a GNSS source event or position data, and, if valid movement is detected, updates both distance traveled and fuel consumption.
===Manufacturer-Level SPN codes===


If the scenario is enabled and the user modifies the average fuel usage parameter, it automatically detects any deviation between the configuration and the current I/O value and synchronizes them.
Manufacturer-level or proprietary codes are reserved for OEM-specific faults that are not defined in the J1939 standard. These allow manufacturers to monitor unique components, systems, or operational conditions that are specific to their equipment.
=== <u> Parameters list </u>===
<table class="nd-othertables_2" style="width:100%; border-collapse: collapse;">
<tr>
<th style="width:1%; vertical-align: middle; text-align: center;">PARAMETER NAME</th>
<th style="width:1%; vertical-align: middle; text-align: center;">PARAMETER ID (RELATED AVL ID)</th>
<th style="width:5%; vertical-align: middle; text-align: center;">DESCRIPTION</th>
<th style="width:6%; vertical-align: middle; text-align: center;">VALUES</th>
</tr>
<tr>


<td style="vertical-align: middle; text-align: center;"> Scenario priority </td>
The SPNs for proprietary codes typically occupy the high end of the 19-bit field, ranging from '''516,096 to 524,287'''. FMI values may be standard or custom, but the meaning of the SPN is defined by the manufacturer. Accurate interpretation requires access to OEM documentation, as these codes are not universally defined or interpretable.
<td style="vertical-align: middle; text-align: center;"> 1001200<br>(12)</td>
<td style="vertical-align: middle; text-align: center;">Priority of how events are being sent to a server. For example, events with low priority are added to the periodical record, and events with high priority are sent immediately after they occur.</td>
<td style="vertical-align: middle; text-align: left;"> Disable = '''0''' <br> Low priority = '''1''' <br> High priority = '''2''' </td>


</tr> 
==DM1/DM2 Message Structure==
<tr>


<td style="vertical-align: middle; text-align: center;"> Average consumption </td>
Each DM1/DM2 message is transmitted using the J1939 transport protocol when needed (multi-packet if the data exceeds 8 bytes), but can also fit within a single CAN frame when only one DTC is present. The message begins with a lamp status byte, followed by zero or more DTC entries, each occupying exactly 4 bytes.
<td style="vertical-align: middle; text-align: center;"> 11902 </td>
<td style="vertical-align: middle; text-align: center;">Average consumption presented in the technical documentation of the vehicle.</td>
<td style="vertical-align: middle; text-align: left;"> Minimum value = '''0.0'''<br> Maximum value = '''50.0''' <br> Default value = '''0.0''' </td>


</tr>
<tr>


<td style="vertical-align: middle; text-align: center;">
Fuel counter value</td>
<td style="vertical-align: middle; text-align: center;"> 11910 </td>
<td style="vertical-align: middle; text-align: center;">The initial fuel counter value in liters. Can be used to set the starting value or reset the current one.</td>
<td style="vertical-align: middle; text-align: left;"> Minimum value = '''0.0'''<br> Maximum value = '''4294967.2''' <br> Default value = '''0.0''' </td>


</tr>
Following the lamp status byte, the message contains one or more Diagnostic Trouble Codes (DTCs). Each DTC is encoded in a 4-byte structure that combines several fields into a compact binary format. The first 19 bits represent the Suspect Parameter Number (SPN), which identifies the specific parameter or component that is faulty. This value is split across the first three bytes in a non-linear way, requiring bit-level extraction rather than simple byte parsing.
</table>
 
The next 5 bits define the Failure Mode Identifier (FMI), which describes how the failure manifests (for example, data out of range, voltage too high, or signal erratic). Together, the SPN and FMI uniquely describe the nature of the fault.
 
After the FMI, a single bit is used for the SPN Conversion Method (CM). In modern systems, this bit is almost always set to 0, indicating the standard encoding method is used. A value of 1 indicates an alternative legacy encoding, which is rarely encountered but must still be handled correctly in robust implementations.
 
The final 7 bits of the 4-byte DTC structure represent the Occurrence Count (OC). This value indicates how many times the fault has been detected. It is typically capped at 127 and provides useful insight into whether a fault is intermittent or persistent.
 
When multiple DTCs are present, they are simply appended sequentially after the lamp status byte, each occupying 4 bytes. There is no explicit delimiter between DTCs; instead, the total message length determines how many are included. In multi-packet transmissions, this sequence continues seamlessly across transport protocol frames.
 
Practical Interpretation and DM1 vs DM2 Context
 
From an implementation perspective, decoding DM1 and DM2 messages requires careful bit extraction and reconstruction of the SPN, FMI, CM, and OC fields from each 4-byte DTC block. The lamp status byte must be interpreted separately before processing the DTC list.
 
The practical difference between DM1 and DM2 lies not in structure but in semantics. DM1 messages are typically broadcast periodically (for example, once per second) whenever active faults exist, making them essential for real-time monitoring and dashboards. In contrast, DM2 messages are only transmitted upon request and provide access to historical fault data that is no longer active but still stored in the ECU memory.
 
An important implementation detail is that DM1 messages may contain no DTCs, in which case only the lamp status byte is transmitted. This indicates that no active faults are present, and all lamps are typically off. However, the system must still correctly interpret this as a valid message rather than an error condition.
 
Another subtle but important aspect is that multiple ECUs on the same network can transmit their own DM1 messages independently. Each message is identified by its source address, meaning a complete diagnostic picture requires aggregating DM1 data across all nodes on the network.
 
In summary, the DM1/DM2 message structure is compact but highly information-dense. A single byte conveys overall system warning states, while each 4-byte DTC block encodes a complete fault description including what failed, how it failed, and how often it has occurred. Proper decoding requires precise bit-level handling, but once implemented, it provides a standardized and scalable way to monitor and diagnose vehicle systems across the entire J1939 network.

Latest revision as of 14:29, 26 March 2026

Introduction

With a professional device lineup, telltale information (dashboard indicators) from heavy-duty vehicles can be read remotely to identify a variety of issues. New feature of Diagnostic Trouble Code (DTC) reading will help to narrow down the specific faults happening in vehicles.

With {{{model}}} you can read 2 types of DTC messages based on J1939 protocol:

  • DM1 – Communicates currently present faults
  • DM2 – Reports stored faults

{{{model}}} is able to read DM codes and pass them to the server in IO element. When active DM1 or DM2 messages appear on CAN line it is broadcasted very often – {{{model}}} device saves the codes into the internal memory and does not flood the server with irrelevant information – only new DTC codes are sent to the server.

Functionality Description

This functionality is available from Firmware version 03.01.02.rev.06 or higher.

For proper functionality, the device requires ignition to be active. Source of ignition and voltage level can be selected from System tab.

Ignition has to be active for at least 14 sec to start generating the DTC list. If ignition is turned off, the device will clean all DM1 and DM2 codes and functionality will not be working.

After the device is connected to the Configurator, there will be DM1 / DM2 tab made available. There is a configurable DM1 / DM2 Data source parameter. This parameter selects the CAN source based on which device will parse DM data from. Based on selected data source, device will also call a request for DTCs.

Note: The functionality is completely separated from the FMS source.

  • NONE – Device will not use any CAN as data source
  • CAN1 – Device will use CAN1 as data source
  • CAN2 – Device will use CAN2 as data source
  • BOTH – Device will use CAN1 and CAN2 as data source

Bellow Data source parameters there is a list of configurable IOs

„DTC DM1“ and “DTC DM2“ shows the last DTC that has been detected. „Active DM1 List“ and „Active DM2 List“ provides a list of all active DTCs for a given source.

Example of generating DM1 / DM2 list: To register DM1 code, it is required to send a command using (pgn 0xFEFA). Device will first check if such DTC code exist in the system (MCUID and CAN Source has to be unique for each DTC). Otherwise, DTC will be rejected.

9D000301:01:01

  • 9D000301 – DTC in hexadecimal format
  • 01 – MCU source that reported the DTC
  • 01 – Device CAN source used (00 - CAN1, 01 - CAN2)

9D000302:02:01

  • 9D000302 – DTC in hexadecimal format
  • 02 – MCU source that reported the DTC
  • 01 – Device CAN source used (00 - CAN1, 01 - CAN2)

Based on configured „Priority“, „Event Only“ and „Operand“ device will add this parameter to record.

To remove one of the DTC from DM1 list, DM2 code (pgn 0xFEFB) is required. Device will check if the sent DTC code exists in the system (MCUID and CAN Source has to be unique for each DTC). If sent DTC does not exist in the system, it will be rejected.

Based on previous example, sending DTC 9D000301 with MCUID 01 on CAN2, device remove this DTC from the system, as the result, this DTC is removed from „Active DM1 List“ and added to the „Active DM2 List“.

Log example:

That DTCs will be added to record and would be accessible on server. Data on server need to be converted from HEX to ASCII.

39443030303330323A30323A30313B -> (after conversion from hex to ANSCII) 9D000302:02:01;

39443030303330313A30313A30313B -> (after conversion from hex to ANSCII) 9D000301:01:01;

Functionality Block Diagram

Graphic representation of DM1 and DM2 functionality:


DM1 Lamp Status and Flash Signals

The DM1 (Diagnostic Message 1) in the J1939 protocol reports active Diagnostic Trouble Codes (DTCs) and controls vehicle warning indicators. It defines the behavior of the Malfunction Indicator Lamp (MIL) and other warning lamps, which can be off, on solid, or flashing, depending on the severity and priority of detected faults. Flashing typically signals a more urgent or severe condition, while a solid light indicates an active but less critical issue.

The first byte represents the status of four indicator lamps:

  • PL (Protect Lamp) - DTC's indicate non-electronic subsystem issue.
  • AWL(Amber Warning Light) - DTC's indicate a non-critical issue that does not warrant stopping the vehicle.
  • RSL(Red Stop Lamp) - DTC's indicate a critical issue that warrants stopping the vehicle immediately.
  • MIL(Malfunction Indicator Lamp) - At least one DTC indicates emissions related issue.

Each lamp is encoded using 2 bits, allowing four possible states: off, on, slow flash, and fast flash. This compact encoding means all lamp states are conveyed within a single byte, with each pair of bits mapped to a specific lamp in a fixed order. These lamp states directly inform the operator about the severity and urgency of active faults.

DM1 encodes warning lamp information in its first 2 bytes, combining both lamp status and flash behavior. Each lamp is represented by two 2-bit fields—one in byte 1 (status) and one in byte 2 (flash).

To decode, split each byte into 2-bit segments and map each pair to its corresponding lamp. The final behavior is determined by combining status and flash (e.g., ON + fast flash = rapidly blinking warning).

Global and Manufacturer SPN Codes

Global-Level SPN codes

Standard codes are defined by the SAE J1939 standards and are recognized across all compliant vehicles and equipment. The SPNs for these codes fall within the range of 1 to 24,324 representing widely used parameters such as engine speed, coolant temperature, or oil pressure. FMI values are standardized, describing specific failure patterns such as high voltage, circuit open, or out-of-range conditions.

Because they are standardized, these codes are universally interpretable by any compliant diagnostic tool without requiring manufacturer-specific references.

Manufacturer-Level SPN codes

Manufacturer-level or proprietary codes are reserved for OEM-specific faults that are not defined in the J1939 standard. These allow manufacturers to monitor unique components, systems, or operational conditions that are specific to their equipment.

The SPNs for proprietary codes typically occupy the high end of the 19-bit field, ranging from 516,096 to 524,287. FMI values may be standard or custom, but the meaning of the SPN is defined by the manufacturer. Accurate interpretation requires access to OEM documentation, as these codes are not universally defined or interpretable.

DM1/DM2 Message Structure

Each DM1/DM2 message is transmitted using the J1939 transport protocol when needed (multi-packet if the data exceeds 8 bytes), but can also fit within a single CAN frame when only one DTC is present. The message begins with a lamp status byte, followed by zero or more DTC entries, each occupying exactly 4 bytes.


Following the lamp status byte, the message contains one or more Diagnostic Trouble Codes (DTCs). Each DTC is encoded in a 4-byte structure that combines several fields into a compact binary format. The first 19 bits represent the Suspect Parameter Number (SPN), which identifies the specific parameter or component that is faulty. This value is split across the first three bytes in a non-linear way, requiring bit-level extraction rather than simple byte parsing.

The next 5 bits define the Failure Mode Identifier (FMI), which describes how the failure manifests (for example, data out of range, voltage too high, or signal erratic). Together, the SPN and FMI uniquely describe the nature of the fault.

After the FMI, a single bit is used for the SPN Conversion Method (CM). In modern systems, this bit is almost always set to 0, indicating the standard encoding method is used. A value of 1 indicates an alternative legacy encoding, which is rarely encountered but must still be handled correctly in robust implementations.

The final 7 bits of the 4-byte DTC structure represent the Occurrence Count (OC). This value indicates how many times the fault has been detected. It is typically capped at 127 and provides useful insight into whether a fault is intermittent or persistent.

When multiple DTCs are present, they are simply appended sequentially after the lamp status byte, each occupying 4 bytes. There is no explicit delimiter between DTCs; instead, the total message length determines how many are included. In multi-packet transmissions, this sequence continues seamlessly across transport protocol frames.

Practical Interpretation and DM1 vs DM2 Context

From an implementation perspective, decoding DM1 and DM2 messages requires careful bit extraction and reconstruction of the SPN, FMI, CM, and OC fields from each 4-byte DTC block. The lamp status byte must be interpreted separately before processing the DTC list.

The practical difference between DM1 and DM2 lies not in structure but in semantics. DM1 messages are typically broadcast periodically (for example, once per second) whenever active faults exist, making them essential for real-time monitoring and dashboards. In contrast, DM2 messages are only transmitted upon request and provide access to historical fault data that is no longer active but still stored in the ECU memory.

An important implementation detail is that DM1 messages may contain no DTCs, in which case only the lamp status byte is transmitted. This indicates that no active faults are present, and all lamps are typically off. However, the system must still correctly interpret this as a valid message rather than an error condition.

Another subtle but important aspect is that multiple ECUs on the same network can transmit their own DM1 messages independently. Each message is identified by its source address, meaning a complete diagnostic picture requires aggregating DM1 data across all nodes on the network.

In summary, the DM1/DM2 message structure is compact but highly information-dense. A single byte conveys overall system warning states, while each 4-byte DTC block encodes a complete fault description including what failed, how it failed, and how often it has occurred. Proper decoding requires precise bit-level handling, but once implemented, it provides a standardized and scalable way to monitor and diagnose vehicle systems across the entire J1939 network.