MODBUS Application Protocol Specification V1.
1b3 Modbus
Note: It is desirable to manage a time out in order not to indefinitely wait for an answer which will perhaps
never arrive.
The size of the MODBUS PDU is limited by the size constraint inherited from the first
MODBUS implementation on Serial Line network (max. RS485 ADU = 256 bytes).
Therefore:
MODBUS PDU for serial line communication = 256 - Server address (1 byte) - CRC (2
bytes) = 253 bytes.
Consequently:
RS232 / RS485 ADU = 253 bytes + Server address (1 byte) + CRC (2 bytes) = 256 bytes.
TCP MODBUS ADU = 253 bytes + MBAP (7 bytes) = 260 bytes.
The MODBUS protocol defines three PDUs. They are :
MODBUS Request PDU, mb_req_pdu
MODBUS Response PDU, mb_rsp_pdu
MODBUS Exception Response PDU, mb_excep_rsp_pdu
The mb_req_pdu is defined as:
mb_req_pdu = {function_code, request_data}, where
function_code = [1 byte] MODBUS function code,
request_data = [n bytes] This field is function code dependent and usually
contains information such as variable references,
variable counts, data offsets, sub-function codes etc.
The mb_rsp_pdu is defined as:
mb_rsp_pdu = {function_code, response_data}, where
function_code = [1 byte] MODBUS function code
response_data = [n bytes] This field is function code dependent and usually
contains information such as variable references,
variable counts, data offsets, sub-function codes, etc.
The mb_excep_rsp_pdu is defined as:
mb_excep_rsp_pdu = {exception-function_code, request_data}, where
exception-function_code = [1 byte] MODBUS function code + 0x80
exception_code = [1 byte] MODBUS Exception Code Defined in table
"MODBUS Exception Codes" (see section 7 ).
4.2 Data Encoding
MODBUS uses a ‘big-Endian’ representation for addresses and data items. This means
that when a numerical quantity larger than a single byte is transmitted, the most significant
byte is sent first. So for example
Register size value
16 - bits 0x1234 the first byte sent is 0x12 then 0x34
Note: For more details, see [1] .
April 26, 2012 [Link] 5/50
MODBUS Application Protocol Specification V1.1b3 Modbus
4.3 MODBUS Data model
MODBUS bases its data model on a series of tables that have distinguishing characteristics.
The four primary tables are:
Primary tables Object type Type of Comments
access This type of data can be provided by an I/O system.
Discretes Input Single bit Read-Only
This type of data can be alterable by an application
Coils Single bit Read-Write program.
This type of data can be provided by an I/O system
Input Registers 16-bit word Read-Only
This type of data can be alterable by an application
Holding Registers 16-bit word Read-Write program.
The distinctions between inputs and outputs, and between bit -addressable and word-
addressable data items, do not imply any application behavior. It is perfectly acceptable, and
very common, to regard all four tables as overlaying one another, if this is the most natural
interpretation on the target machine in question.
For each of the primary tables, the protocol allows individual selection of 65536 data items,
and the operations of read or write of those items are designed to span multiple consecutive
data items up to a data size limit which is dependent on the transaction function code.
It’s obvious that all the data handled via MODBUS (bits, registers) must be located in device
application memory. But physical address in memory should not be confused with data
reference. The only requirement is to link data reference with physical address.
MODBUS logical reference numbers, which are used in MODBUS funct ions, are unsigned
integer indices starting at zero.
Implementation examples of MODBUS model
The examples below show two ways of organizing the data in device. There are different
organizations possible, but not all are described in this document. Each de vice can have its
own organization of the data according to its application
Example 1 : Device having 4 separate blocks
The example below shows data organization in a device having digital and analog, inputs and
outputs. Each block is separate because dat a from different blocks have no correlation. Each
block is thus accessible with different MODBUS functions.
Device application memory
MODBUS access
Input Discrete
Coils MODBUS Request
Input Registers
Holding
Registers
MODBUS SERVER DEVICE
Figure 6 MODBUS Data Model with separate block
April 26, 2012 [Link] 6/50
MODBUS Application Protocol Specification V1.1b3 Modbus
Example 2: Device having only 1 block
In this example, the device has only 1 data block. The same data can be reached via several
MODBUS functions, either via a 16 bit access or via an access bit.
Device application memory
MODBUS access
Input Discrete
R
W
Coils MODBUS Request
R
Input Registers
W
Holding
Registers
MODBUS SERVER DEVICE
Figure 7 MODBUS Data Model with only 1 block
4.4 MODBUS Addressing model
The MODBUS application protocol defines precisely PDU addressing rules.
In a MODBUS PDU each data is addressed from 0 to 65535.
It also defines clearly a MODBUS data model composed of 4 blocks that comprises several
elements numbered from 1 to n.
In the MODBUS data Model each element within a data block is numbered from 1 to n.
Afterwards the MODBUS data model has to be bound to the device application ( IEC -61131
object, or other application model).
The pre-mapping between the MODBUS data model and the device application is totally
vendor device specific.
April 26, 2012 [Link] 7/50
MODBUS Application Protocol Specification V1.1b3 Modbus
Device application MODBUS data model MODBUS PDU addresses
Read input 0
1
Discrete Input .
.
.
1
Coils . Read coils 4
5
.
1 Read Registers 1
Input Registers 2
.
1
.
Holding Registers
. Read Registers 54
55
Mapping
Application specific MODBUS Standard
Figure 8 MODBUS Addressing model
The previous figure shows that a MODBUS data numbered X is addressed in the MODBUS
PDU X-1.
4.5 Define MODBUS Transaction
The following state diagram describes the generic processing of a MODBUS transaction in
server side.
April 26, 2012 [Link] 8/50
MODBUS Application Protocol Specification V1.1b3 Modbus
V
Wait for a MB
indication [Receive MB indication]
Validate function
code
[invalid]
ExeptionCode = 1
[valid]
Validate data
Address
ExceptionCode = 2 [invalid]
[valid]
Validate data
value
[invalid]
ExceptionCode = 3
[valid]
Execute MB
function
ExceptionCode = 4, 5, 6 [invalid]
[valid]
Send Modbus
Exception
Send Modbus
Response
Response
Figure 9 MODBUS Transaction state diagram
Once the request has been processed by a server, a MODBUS response using the
adequate MODBUS server transaction is built.
Depending on the result of the processing two types of response are built :
A positive MODBUS response :
the response function code = the request function code
A MODBUS Exception response ( see section 7 ):
the objective is to provide to the client relevant information concerning the
error detected during the processing ;
the exception function code = the request function code + 0x80 ;
an exception code is provided to indicate the reason of the error.
April 26, 2012 [Link] 9/50
MODBUS Application Protocol Specification V1.1b3 Modbus
5 Function Code Categories
There are three categories of MODBUS Functions codes. They are :
PublicFunction Codes
Are well defined function codes ,
guaranteed to be unique,
validated by the [Link] community,
publicly documented
have available conformance test,
includes both defined public assigned function codes as well as unassigned function
codes reserved for future use.
User-Defined Function Codes
there are two ranges of user-defined function codes, i.e. 65 to 72 and from 100 to 110
decimal.
user can select and implement a function code that is not supported by the
specification.
there is no guarantee that the use of the selected function code will be unique
if the user wants to re-position the functionality as a public function code, he must
initiate an RFC to introduce the change into the public category and to have a new
public function code assigned.
MODBUS Organization, Inc expressly reserves the right to develop the proposed RFC.
Reserved Function Codes
Function Codes currently used by some companies for legacy products and that
are not available for public use.
Informative Note: The reader is asked refer to Annex A (Informative) MODBUS
RESERVED FUNCTION CODES, SUBCODES AND MEI TYPES.
127
PUBLIC function codes
110
User Defined Function codes
100
PUBLIC function codes
72
User Defined Function codes
65
PUBLIC function codes
1
Figure 10 MODBUS Function Code Categories
April 26, 2012 [Link] 10/50
MODBUS Application Protocol Specification V1.1b3 Modbus
5.1 Public Function Code Definition
Function Codes
code Sub (hex) Section
code
Physical Discrete Read Discrete Inputs 02 02 6.2
Inputs
Read Coils 01 01 6.1
Bit Internal Bits
access Or Write Single Coil 05 05 6.5
Physical coils Write Multiple Coils 15 0F 6.11
Data Physical Input Read Input Register 04 04 6.4
Access Registers
Read Holding Registers 03 03 6.3
16 bits Write Single Register 06 06 6.6
Internal Registers
access
Or Write Multiple Registers 16 10 6.12
Physical Output Read/Write Multiple Registers 23 17 6.17
Registers Mask Write Register 22 16 6.16
Read FIFO queue 24 18 6.18
Read File record 20 14 6.14
File record access Write File record 21 15 6.15
Read Exception status 07 07 6.7
Diagnostic 08 00-18,20 08 6.8
Diagnostics Get Com event counter 11 OB 6.9
Get Com Event Log 12 0C 6.10
Report Server ID 17 11 6.13
Read device Identification 43 14 2B 6.21
Other Encapsulated Interface 43 13,14 2B 6.19
Transport
CANopen General Reference 43 13 2B 6.20
6 Function codes descriptions
6.1 01 (0x01) Read Coils
This function code is used to read from 1 to 2000 contiguous status of coils in a remote
device. The Request PDU specifies the starting address, i.e. the address of the first coil
specified, and the number of coils. In the PDU Coils are addressed starting at zero. Therefore
coils numbered 1-16 are addressed as 0-15.
The coils in the response message are packed as one coil per bit of the data field. Status is
indicated as 1= ON and 0= OFF. The LSB of the first data byte contains the output addressed
in the query. The other coils follow toward the high order end of this byte, and from low order
to high order in subsequent bytes.
If the returned output quantity is not a multiple of eight, the remaining bits in the final data
byte will be padded with zeros (toward the high order end of the byte). The Byte Count field
specifies the quantity of complete bytes of data.
Request
Function code 1 Byte 0x01
Starting Address 2 Bytes 0x0000 to 0xFFFF
Quantity of coils 2 Bytes 1 to 2000 (0x7D0)
Response
Function code 1 Byte 0x01
Byte count 1 Byte N*
Coil Status n Byte n = N or N+1
April 26, 2012 [Link] 11/50
MODBUS Application Protocol Specification V1.1b3 Modbus
*N = Quantity of Outputs / 8, if the remainder is different of 0 N = N+1
Error
Function code 1 Byte Function code + 0x80
Exception code 1 Byte 01 or 02 or 03 or 04
Here is an example of a request to read discrete outputs 20 –38:
Request Response
Field Name (Hex) Field Name (Hex)
Function 01 Function 01
Starting Address Hi 00 Byte Count 03
Starting Address Lo 13 Outputs status 27-20 CD
Quantity of Outputs Hi 00 Outputs status 35-28 6B
Quantity of Outputs Lo 13 Outputs status 38-36 05
The status of outputs 27–20 is shown as the byte value CD hex, or binary 1100 1101. Output
27 is the MSB of this byte, and output 20 is the LSB.
By convention, bits within a byte are shown with the MSB to the left, and the LSB to the right.
Thus the outputs in the first byte are ‘27 through 20’, from left to right. The next byte has
outputs ‘35 through 28’, left to right. As the bits are transmitted serially, they flow from LSB to
MSB: 20 . . . 27, 28 . . . 35, and so on.
In the last data byte, the status of outputs 38-36 is shown as the byte value 05 hex, or binary
0000 0101. Output 38 is in the sixth bit position from the left, and output 36 is the LSB of this
byte. The five remaining high order bits are zero filled.
Note: The five remaining bits (toward the high order end) are zero filled.
ENTRY
MB Server receives mb_req_pdu
NO
Function code
supported
YES
ExceptionCode = 01
NO
0x0001 Quantity of Outputs 0x07D0
YES
ExceptionCode = 03
NO Starting Address == OK
AND
Starting Address + Quantity of Outputs == OK
YES
ExceptionCode = 02
Request Processing
NO
ReadDiscreteOutputs == OK
YES
ExceptionCode = 04
MB Server Sends mb_rsp
MB Server Sends mb_exception_rsp EXIT
Figure 11: Read Coils state diagram
6.2 02 (0x02) Read Discrete Inputs
This function code is used to read from 1 to 2000 contiguous status of discrete inputs in a
remote device. The Request PDU specifies the starting address, i.e. the address of the first
April 26, 2012 [Link] 12/50
MODBUS Application Protocol Specification V1.1b3 Modbus
input specified, and the number of inputs. In the PDU Discrete Inputs a re addressed starting
at zero. Therefore Discrete inputs numbered 1-16 are addressed as 0-15.
The discrete inputs in the response message are packed as one input per bit of the data field.
Status is indicated as 1= ON; 0= OFF. The LSB of the first data byt e contains the input
addressed in the query. The other inputs follow toward the high order end of this byte, and
from low order to high order in subsequent bytes.
If the returned input quantity is not a multiple of eight, the remaining bits in the final d ata byte
will be padded with zeros (toward the high order end of the byte). The Byte Count field
specifies the quantity of complete bytes of data.
Request
Function code 1 Byte 0x02
Starting Address 2 Bytes 0x0000 to 0xFFFF
Quantity of Inputs 2 Bytes 1 to 2000 (0x7D0)
Response
Function code 1 Byte 0x02
Byte count 1 Byte N*
Input Status N* x 1 Byte
*N = Quantity of Inputs / 8 if the remainder is different of 0 N = N+1
Error
Error code 1 Byte 0x82
Exception code 1 Byte 01 or 02 or 03 or 04
Here is an example of a request to read discrete inputs 197 – 218:
Request Response
Field Name (Hex) Field Name (Hex)
Function 02 Function 02
Starting Address Hi 00 Byte Count 03
Starting Address Lo C4 Inputs Status 204-197 AC
Quantity of Inputs Hi 00 Inputs Status 212-205 DB
Quantity of Inputs Lo 16 Inputs Status 218-213 35
The status of discrete inputs 204–197 is shown as the byte value AC hex, or binary 1010
1100. Input 204 is the MSB of this byte, and input 197 is the LSB.
The status of discrete inputs 218–213 is shown as the byte value 35 hex, or binary 0011 0101.
Input 218 is in the third bit position from the left, and input 213 is the LSB.
Note: The two remaining bits (toward the high order end) are zero filled.
April 26, 2012 [Link] 13/50
MODBUS Application Protocol Specification V1.1b3 Modbus
ENTRY
MB Server receives mb_req_pdu
NO
Function code
supported
YES
ExceptionCode = 01
NO
0x0001 Quantity of Inputs 0x07D0
YES
ExceptionCode = 03
NO Starting Address == OK
AND
Starting Address + Quantity of Inputs == OK
YES
ExceptionCode = 02
Request Processing
NO
ReadDiscreteInputs == OK
ExceptionCode = 04 YES
MB Server Sends mb_rsp
MB Server Sends mb_exception_rsp EXIT
Figure 12: Read Discrete Inputs state diagram
April 26, 2012 [Link] 14/50
MODBUS Application Protocol Specification V1.1b3 Modbus
6.3 03 (0x03) Read Holding Registers
This function code is used to read the contents of a contiguous block of holding registers in a
remote device. The Request PDU specifies the starting r egister address and the number of
registers. In the PDU Registers are addressed starting at zero. Therefore registers numbered
1-16 are addressed as 0-15.
The register data in the response message are packed as two bytes per register, with the
binary contents right justified within each byte. For each register, the first byte contains the
high order bits and the second contains the low order bits.
Request
Function code 1 Byte 0x03
Starting Address 2 Bytes 0x0000 to 0xFFFF
Quantity of Registers 2 Bytes 1 to 125 (0x7D)
Response
Function code 1 Byte 0x03
Byte count 1 Byte 2 x N*
Register value N* x 2 Bytes
*N = Quantity of Registers
Error
Error code 1 Byte 0x83
Exception code 1 Byte 01 or 02 or 03 or 04
Here is an example of a request to read registers 108 – 110:
Request Response
Field Name (Hex) Field Name (Hex)
Function 03 Function 03
Starting Address Hi 00 Byte Count 06
Starting Address Lo 6B Register value Hi (108) 02
No. of Registers Hi 00 Register value Lo (108) 2B
No. of Registers Lo 03 Register value Hi (109) 00
Register value Lo (109) 00
Register value Hi (110) 00
Register value Lo (110) 64
The contents of register 108 are shown as the two byte values of 02 2B hex, or 555 decimal.
The contents of registers 109–110 are 00 00 and 00 64 hex, or 0 and 100 decimal,
respectively.
April 26, 2012 [Link] 15/50
MODBUS Application Protocol Specification V1.1b3 Modbus
ENTRY
MB Server receives mb_req_pdu
NO
Function code
supported
YES
ExceptionCode = 01
NO
0x0001 Quantity of Registers 0x007D
YES
ExceptionCode = 03
NO Starting Address == OK
AND
Starting Address + Quantity of Registers == OK
YES
ExceptionCode = 02
Request Processing
NO
ReadMultipleRegisters == OK
ExceptionCode = 04 YES
MB Server Sends mb_rsp
MB Server Sends mb_exception_rsp EXIT
Figure 13: Read Holding Registers state diagram
6.4 04 (0x04) Read Input Registers
This function code is used to read from 1 to 125 contiguous input registers in a remote device.
The Request PDU specifies the starting register address and the number of registers. In the
PDU Registers are addressed starting at zero. Therefore input registers n umbered 1-16 are
addressed as 0-15.
The register data in the response message are packed as two bytes per register, with the
binary contents right justified within each byte. For each register, the first byte contains the
high order bits and the second contains the low order bits.
Request
Function code 1 Byte 0x04
Starting Address 2 Bytes 0x0000 to 0xFFFF
Quantity of Input Registers 2 Bytes 0x0001 to 0x007D
Response
Function code 1 Byte 0x04
Byte count 1 Byte 2 x N*
Input Registers N* x 2 Bytes
*N = Quantity of Input Registers
Error
Error code 1 Byte 0x84
Exception code 1 Byte 01 or 02 or 03 or 04
Here is an example of a request to read input register 9:
Request Response
Field Name (Hex) Field Name (Hex)
Function 04 Function 04
Starting Address Hi 00 Byte Count 02
Starting Address Lo 08 Input Reg. 9 Hi 00
Quantity of Input Reg. Hi 00 Input Reg. 9 Lo 0A
April 26, 2012 [Link] 16/50
MODBUS Application Protocol Specification V1.1b3 Modbus
Quantity of Input Reg. Lo 01
The contents of input register 9 are shown as the two byte values of 00 0A hex, or 10 decimal.
ENTRY
MB Server receives mb_req_pdu
NO
Function code
supported
YES
ExceptionCode = 01
NO
0x0001 Quantity of Registers 0x007D
YES
ExceptionCode = 03
NO Starting Address == OK
AND
Starting Address + Quantity of Registers == OK
YES
ExceptionCode = 02
Request Processing
NO
ReadInputRegisters == OK
ExceptionCode = 04 YES
MB Server Sends mb_rsp
MB Server Sends mb_exception_rsp EXIT
Figure 14: Read Input Registers state diagram
6.5 05 (0x05) Write Single Coil
This function code is used to write a single output to either ON or OFF in a remote device.
The requested ON/OFF state is specified by a constant in the request data field. A value of FF
00 hex requests the output to be ON. A value of 00 00 requests it to be OFF. All other values
are illegal and will not affect the output.
The Request PDU specifies the address of the coil to be forced. Coils are addressed starting
at zero. Therefore coil numbered 1 is addressed as 0. The requested ON/OFF state is
specified by a constant in the Coil Value field. A value of 0XFF00 requests the coil to be ON.
A value of 0X0000 requests the coil to be off. All other values are illegal and will not affect the
coil.
The normal response is an echo of the request, returned after the coil state has been written.
Request
Function code 1 Byte 0x05
Output Address 2 Bytes 0x0000 to 0xFFFF
Output Value 2 Bytes 0x0000 or 0xFF00
Response
Function code 1 Byte 0x05
Output Address 2 Bytes 0x0000 to 0xFFFF
April 26, 2012 [Link] 17/50
MODBUS Application Protocol Specification V1.1b3 Modbus
Output Value 2 Bytes 0x0000 or 0xFF00
Error
Error code 1 Byte 0x85
Exception code 1 Byte 01 or 02 or 03 or 04
Here is an example of a request to write Coil 173 ON:
Request Response
Field Name (Hex) Field Name (Hex)
Function 05 Function 05
Output Address Hi 00 Output Address Hi 00
Output Address Lo AC Output Address Lo AC
Output Value Hi FF Output Value Hi FF
Output Value Lo 00 Output Value Lo 00
April 26, 2012 [Link] 18/50