Modbus RTU Unplugged – An introduction to Modbus RTU Addressing, Function Codes and Modbus RTU Networking
Modbus RTU is an open, serial (RS-232 or RS-485) protocol derived from the Master/Slave architecture. It is a widely accepted protocol due to its ease of use and reliability. Modbus RTU is widely used within Building Management Systems (BMS) and Industrial Automation Systems (IAS). This wide acceptance is due in large part to MODBUS RTU’s ease of use.
MODBUS RTU messages are a simple 16-bit CRC (Cyclic-Redundant Checksum). The simplicity of these messages is to ensure reliability. Due to this simplicity, the basic 16-bit MODBUS RTU register structure can be used to pack in floating point, tables, ASCII text, queues, and other unrelated data.
MODBUS is considered an application layer messaging protocol, providing Master/Slave communication between devices connected together through buses or networks. On the OSI model, MODBUS is positioned at level 7. MODBUS is intended to be a request/reply protocol and delivers services specified by function codes. The function codes of MODBUS are elements of MODBUS’ request/reply PDUs (Protocol Data Unit).
In order to build the MODBUS application data unit, the client must initiate a MODBUS transaction. It is the function which informs the server as to which type of action to perform. The format of a request initiated by a Master is established by the MODBUS application protocol. The function code field is then coded into one byte. Only codes within the range of 1 through 255 are considered valid, with 128-255 being reserved for exception responses. When the Master sends a message to the Slave, it is the function code field which informs the server of what type of action to perform.
To define multiple actions, some functions will have sub-function codes added to them. For instance, the Master is able to read the ON/OFF states of a group of discreet outputs or inputs. It could also read/write the data contents of a group of MODBUS registers. When the Master receives the Slave response, the function code field is used by the Slave to indicate either an error-free response or an exception response. The Slave echoes to the request of the initial function code in the case of a normal response.
Data Object Properties
MODBUS RTU packets are only intended to send data; they do not have the capability to send parameters such as point name, resolution, units, etc. If the ability to send such parameters is needed, one should investigate a BACnet, EtherNet/IP, or other modern protocols.
MODBUS RTU versus Other Protocols
Despite the limitations of MODBUS RTU, there are still many good reasons as to why it is still a contender among other industrial automation protocols. For one, MODBUS RTU is much easier to implement than newer protocols and is a dominant force in the market place. MODBUS RTU also requires significantly less memory. To implement MODBUS RTU, you can fit the necessary size of 2Kb on a small 8-bit CPU or PIC processor, whereas with BACnet and EtherNet/IP, you may require 30-100Kb of memory.
MODBUS RTU Address Requirements
Standard MODBUS RTU node addresses are 1-254, with 0 being reserved for broadcast messages and write only. However the 0 address is rarely used due to the fact that there is no confirmation that the message was properly received at the slave node. This doesn’t have much affect if your physical layer is RS-232 as only one node can be implemented anyway. RS-485 limits the number of nodes to 32, though some drivers will allow you to extend the amount.
The difference between MODBUS RTU and MODBUS TCP
The most basic difference between MODBUS RTU and MODBUS TCP (Also known as MODBUS IP, MODBUS EtherNet, and MODBUS TCP/IP) is that MODBUS TCP runs on an Ethernet physical layer and Modbus RTU is a serial level protocol. Modbus TCP also uses a 6 byte header to allow routing.
Bit Structure in the Byte
The Bit of least importance is sent and received first. All devices within the network must interpret each transmitted byte analogously in this manner. There are no methods for automated recognition of baud rates is not assigned and the same baud rate must be utilized by the Server as well as all clients connected to the bus. No specific baud rate is specified by the MODBUS: typical baud rates are 9600 or 19200.
A transmitted Byte is coded as: 8 Bit binary value, hexadecimal 0 – 9 and A – F. The least significant Bit is sent and received first
MODBUS RTU Memory Map
|Modbus RTU |
|Modbus Coils||Bits, binary values, flags||00001|
|Digital Inputs||Binary inputs||10001|
|Analog Inputs||Binary inputs||30001|
|Modbus Registers||Analog values, variables||40001|
The difference between MODBUS RTU and MODBUS/ASCII
There are two basic transmission modes found in serial MODBUS connections, ASCII and RTU. These transmission modes determine the way in which the MODBUS messages are coded. In ASCII format, the messages are readable, whereas in RTU the messages are in binary coding and cannot be read while monitoring. The trade-off is that the RTU messages are a smaller size, which allows for more data exchange in the same time span. One should be aware that all nodes within one MODBUS network must be of the same transmission mode, meaning MODBUS ASCII cannot communicate with MODBUS RTU and vice versa.
In MODBUS/ASCII, messages are encoded with hexadecimal value, represented with comprehensive ASCII characters. The characters used for this encoding are 0…9 and A…F. For every byte of information, two communication-bytes are used because every communication-byte can only define 4 bits in the hexadecimal system. MODBUS RTU, however, exchanges data in binary format where each byte of data is coded in one communication-byte.
The MODBUS messages on a serial connection are not broadcast in plain format. They are constructed in a way that allows receivers an easy way to detect the beginning and end of a message. The characters start and end a frame when in ASCII mode. To flag the start of a message, a colon ‘:’ is used, and each message is ended with a CR/LF combination. MODBUS RTU uses a different method. In RTU, framing is constructed by measuring gaps of silence on the communication line. Before each message, there must be a minimum gap of 3.5 characters. To prepare for new messages, the receiver clears the buffer when a gap of 1.5 characters is detected. One of the main differences between MODBUS/ASCII and MODBUS RTU is that ASCII allows gaps between the bytes of a message with a maximum length of 1 second. With MODBUS RTU, continuous streams of messages must be sent.
Properties of Modbus/ASCII and Modbus/RTU
|Characters||ASCII 0…9 and A..F||Binary 0…255|
|Error check||LRC Longitudinal Redundancy Check||CRC Cyclic Redundancy Check|
|Frame start||character ‘:‘||3.5 chars silence|
|Frame end||characters CR/LF||3.5 chars silence|
|Gaps in message||1 sec||1.5 times char length|