Introduction
The TSC1 message can be used in a variety of different ways to manage the desired engine speed/torque. When driving the vehicle, the TSC1 message is typically used in torque control mode so that the accelerator pedal directly adjusts the engine's fuel delivery to increase or decrease the torque delivered to the drivetrain. Think about when you are driving your car and come to a hill. You need to press the accelerator farther down to maintain the same speed while going uphill. This strategy works well for driving the vehicle, but it does not work very well for PTO operation, where maintaining a specific engine speed is more critical and the torque should automatically vary to maintain the desired engine speed. For stationary engine speed control operation, we use the TSC1 speed control strategy. With the speed control strategy, we send a CAN message with a 16-bit desired engine speed value, and the ECM will adjust torque/fueling to maintain the target speed.
Bits and Bytes
The desired control strategy is specified in the first two bits of the first data byte of the TSC1 message.
- 0b00: Disabled
- 0b01: Speed Control
- 0b10: Torque Control
- 0b11: Speed/Torque Limit
For stationary engine speed controls, we will always use 0b01 for speed control. Since we are not using any other bits in the first data byte, the remaining bits should all be set to 1. This makes our first data byte 0xFD when we want to control the engine speed and 0xFC when we do not wish to control engine speed.
The next bits we need to transmit are in the second and third data bytes, and these represent the desired engine speed represented as a 16-bit number scaled by .125 rpm/bit. For example, if we desire an engine speed of 1200 rpm, we need to transmit 9600 (decimal), or 1200 rpm / .125 rpm/bit. In hex, 9600 is represented as 0x2580. Since J1939 requires us to transmit LSB first (Little-Endian or Intel Ordering), data bytes D1 and D2 are sent as 0x80 and 0x25 respectively.
The last bits we need to adjust are in the fifth data byte. The first 3 bits are not used, so they will be set to 0b111. The remaining 5 bits are used to specify the purpose for the TSC1 speed control request. In our case, this is always set to 0b10 for PTO Governor. The result is 0b00010111, or 0x17.
Below is an example of some messages we can send to use the TSC1 engine speed control method for stationary engine speed control.
| Command | Message ID | DLC | D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 |
|---|---|---|---|---|---|---|---|---|---|---|
| OFF | 0x18000007 | 8 | FC | FF | FF | FF | FF | FF | FF | FF |
| 1200 RPM | 0x18000007 | 8 | FD | 25 | 80 | FF | 17 | FF | FF | FF |
| 1100 RPM | 0x18000007 | 8 | FD | 60 | 22 | FF | 17 | FF | FF | FF |
| 1000 RPM | 0x18000007 | 8 | FD | 40 | 1F | FF | 17 | FF | FF | FF |
| 900 RPM | 0x18000007 | 8 | FD | 20 | 1C | FF | 17 | FF | FF | FF |
| 800 RPM | 0x18000007 | 8 | FD | 00 | 19 | FF | 17 | FF | FF | FF |
Message Counter And Checksum
The message counter and checksum are used to detect problems with the ECU transmitting the TSC1 message for critical situations. The engine can decide to reject TSC1 messages if the message counter and checksum are not correctly transmitted. The counter increments by 1 for each message, counting from 0 to 7, then starting again at 0. The checksum is calculated using the message ID and data bytes of the TSC1 message. Most engines do not require the message counter and checksum when the TSC1 message is being used for stationary engine speed controls. If the transmitting ECU is using source address 0x07, which is reserved for the power takeoff, the message counter and checksum can just be set to unavailable.
Applications And Advantages
It turns out that most diesel engines used in vocational applications respond to TSC1 engine speed control commands, and they do so without any need for special programming. This is highly beneficial, as it a universal way to control engine speed across multiple chassis and engine types without requiring special engine programming software. The target engine speed values will need to be stored in the truck equipment's controller instead of programmed into the engine management computer, which in most cases is advantageous because it forgoes the need to purchase engine programming software, and perform the act of programming itself. When applied at scale, this can save quite a bit of time and money.