Introduction to Modbus
Introduction to Modbus
What is Modbus?
Modbus is an industrial protocol standard that was created by Modicon, now Schneider
Electric, in the late 1970’s for communication among programmable logic controllers
(PLCs). Modbus remains the most widely available protocol for connecting industrial
devices. The Modbus protocol specification is openly published and use of the protocol
is royalty-free.
Modbus protocol is defined as a master/slave protocol, meaning a device operating as a
master will poll one or more devices operating as a slave. This means a slave device
cannot volunteer information; it must wait to be asked for it. The master will write data to
a slave device’s registers, and read data from a slave device’s registers. A register
address or register reference is always in the context of the slave’s registers.
The most commonly used form of Modbus protocol is RTU over RS-485. Modbus RTU
is a relatively simple serial protocol that can be transmitted via traditional UART
technology. Data is transmitted in 8-bit bytes, one bit at a time, at baud rates ranging
from 1200 bits per second (baud) to 115200 bits per second. The majority of Modbus
RTU devices only support speeds up to 38400 bits per second.
A Modbus RTU network has one Master and one or more Slaves. Each slave has a
unique 8-bit device address or unit number. Packets sent by the master include the
1|Page
address of the slave the message is intended for. The slave must respond only if its
address is recognized, and must respond within a certain time period or the master will
call it a "no response" error.
Each exchange of data consists of a request from the master, followed by a response
from the slave. Each data packet, whether request or response, begins with the device
address or slave address, followed by function code, followed by parameters defining
what is being asked for or provided. The exact formats of the request and response are
documented in detail in the Modbus protocol specification. The general outline of each
request and response is illustrated below.
Modbus data is most often read and written as "registers" which are 16-bit pieces of
data. Most often, the register is either a signed or unsigned 16-bit integer. If a 32-bit
integer or floating point is required, these values are actually read as a pair of registers.
The most commonly used register is called a Holding Register, and these can be read
or written. The other possible type is Input Register, which is read-only.
The exceptions to registers being 16 bits are the coil and the discrete input, which are
each 1 bit only. Coils can be read or written, while discrete inputs are read-only. Coils
are usually associated with relay outputs.
The type of register being addressed by a Modbus request is determined by the function
code. The most common codes include 3 for "read holding registers", and may read 1 or
more. Function code 6 is used to write a single holding register. Function code 16 is
used to write one or more holding registers.
2|Page
The "columns" in a Modbus device's "spread sheet" are more formally known as register
types. Register type may be a coil, a discrete input (aka status input), an input register,
or a holding register.
The "rows" in a Modbus device's "spread sheet" are simply the register number. Most
often, these start at 1 and count up sequentially. Some devices might not have a
register 1, and their first register may be number 100 for example. If the register number
does not exist in the slave device, it will send back an "oops" message properly known
as an exception. The exception provides an error code that says "no such register"
(exception code 2, illegal data address).
3|Page
entities in Ethernet based networking. In this context, the slave becomes the server and
the master becomes the client. There can be more than one client obtaining data from a
server. In Modbus terms, this means there can be multiple masters as well as multiple
slaves. Rather than defining master and slave on a physical device by device basis, it
now becomes the system designer’s responsibility to create logical associations
between master and slave functionality.
4|Page
The function codes most commonly recognized by Modbus devices are indicated in the
table below. This is only a subset of the codes available - several of the codes have
special applications that most often do not apply.
Modbus Function Codes Recognized by CSI Gateways
Function Code Register Type
1 Read Coil
2 Read Discrete Input
3 Read Holding Registers
4 Read Input Registers
5 Write Single Coil
6 Write Single Holding Register
15 Write Multiple Coils
16 Write Multiple Holding Registers
5|Page
Where do I Start for Communicating with My Modbus
Device?
Here are the first few things you need to find out:
Modbus RTU uses RS-485 or RS-232. Modbus TCP uses Ethernet. If you are looking
for a Control Solutions gateway, you will need to pick the model that matches the
electrical interface of the equipment you want to connect. If you are choosing a Control
Solutions I/O device, pick one that matches your network.
When using Control Solutions I/O devices (such as AddMe III) you will find this
information in the online help files that came with the device, or on our web site.
Modbus RTU requires that you know or define baud rate, character format (8 bits no
parity, etc), and slave ID (aka slave address, unit number, unit ID). A mis-match in any
of these will result in no communication.
Modbus TCP requires that you know or define IP addresses on the network. In some
cases, you also need unit ID's. Control Solutions Modbus TCP devices may use the unit
ID, or may ignore it, depending on the device and the application.
6|Page
b) Look at the numbers themselves. If you see the first register on the list having a
number 40001, that really tells you register #1, and it is a holding register. This form of
notation is often referred to as the old Modicon convention.
c) Look for a definition of function codes to be used. If you see a register #1, along with
notation telling you to use function codes 3 and 16, that also tells you it is holding
register #1.
IMPORTANT: Register 1 is address 0. Read on…
d) Do the numbers in your documentation refer to the register number or address?
Register #1 is address zero. If it is not clear whether your documentation refers to
register or address, and you are not getting the expected result, try plus or minus one
for register number. All Control Solutions products refer to register numbers in
configuration software or web pages. However, some manufacturers document their
devices showing address, not register numbers. When you have addresses, you must
add one when entering that register into configuration software from Control Solutions.
7|Page
Register types and reference ranges recognized with Modicon notation are as follows:
0x = Coil = 00001-09999
1x = Discrete Input = 10001-19999
3x = Input Register = 30001-39999
4x = Holding Register = 40001-49999
On occasion, it is necessary to access more than 10,000 of a register type. Based on
the original convention, there is another de facto standard that looks very similar.
Additional register types and reference ranges recognized with Modicon notation are as
follows:
0x = Coil = 000001-065535
1x = Discrete Input = 100001-165535
3x = Input Register = 300001-365535
4x = Holding Register = 400001-465535
When using the extended register referencing, it is mandatory that all register
references be exactly six digits. This is the only way Babel Buster will know the
difference between holding register 40001 and coil 40001. If coil 40001 is the target, it
must appear as 040001.
The wide data simply consists of two consecutive "registers" treated as a single wide
register. Floating point in 32-bit IEEE 754 standard, and 32-bit integer data, are widely
used. Although the convention of register pairs is widely recognized, agreement on
whether the high order or low order register should come first is not standardized. For
this reason, many devices, including all Control Solutions gateways, support a "swap"
option. This means you simply check the "swapped" option if the other device treats
wide data in the opposite order relative to Control Solutions default order. In some
cases, the “swap” option is more explicitly identified as “high order data is in first
register” or something to that effect.
Most Control Solutions Modbus products default to placing the high order register first,
or in the lower numbered register. This is known as "big endian", and is consistent with
Modbus protocol which is by definition big endian itself. The byte order for all 16-bit
values is most significant byte first.
8|Page
This is a commonly used notation for referencing individual bits in a register. This
particular example references (Modicon notation) register 40001, bit 7. Bits are
generally numbered starting at bit 0, which is the least significant or right most bit in the
field of 16 bits found in a Modbus register. If this style notation is used, you may see
40001:0 through 40001:15.
9|Page
Some Modbus devices also back two 8-bit values into a single 16-bit register. The two
values will typically be documented as “high byte” and “low byte” or simply have “H” and
“L” indicated. If you run into this scenario, the masking for bytes is as follows:
High byte mask = FF00
Low byte mask = 00FF
When the mask value in a Babel Buster gateway is more than just one bit, the mask is
still logically AND-ed with the data from the Modbus slave, and the entire resulting value
is right justified to produce an integer value of less than the original bit width of the
original register.
There have been a few instances of documenting packed bits in a 32-bit register.
Although Modbus protocol is strictly 16-bit registers, some implementations force you to
read pairs of registers. If your device documents 32 packed bits, then you would insert
0000 in front of each mask above, and the remainder of the list would be as follows:
B16/D16/bit 16 mask = 00010000
B17/D17/bit 17 mask = 00020000
B18/D18/bit 18 mask = 00040000
B19/D19/bit 19 mask = 00080000
B20/D20/bit 20 mask = 00100000
B21/D21/bit 21 mask = 00200000
B22/D22/bit 22 mask = 00400000
B23/D23/bit 23 mask = 00800000
B24/D24/bit 24 mask = 01000000
B25/D25/bit 25 mask = 02000000
B26/D26/bit 26 mask = 04000000
B27/D27/bit 27 mask = 08000000
B28/D28/bit 28 mask = 10000000
B29/D29/bit 29 mask = 20000000
B30/D30/bit 30 mask = 40000000
B31/D31/bit 31 mask = 80000000
10 | P a g e
Logically you can address over 250 devices; however, the RS-485 transceivers are not
capable of physically driving that many devices. Modbus protocol states that the limit is
32 devices, and most RS-485 transceivers will agree with this. Only if all devices on the
network have low load transceivers can you have more than 32 devices.
11 | P a g e