Internet Draft                                                   D. Dube
draft-dube-modbus-applproto-00.txt                           J. Camerini
Category: Informational                        Schneider Automation Inc.
                                                                May 2002

                     MODBUS Application Protocol


Status of this Memo
===================

This document is an Internet-Draft and is in full conformance with
all provisions of Section 10 of RFC2026.

Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF), its areas, and its working groups.  Note that
other groups may also distribute working documents as Internet-
Drafts.

Internet-Drafts are draft documents valid for a maximum of six months
and may be updated, replaced, or obsoleted by other documents at any
time.  It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress."

The list of current Internet-Drafts can be accessed at http://
www.ietf.org/ietf/1id-abstracts.txt.

The list of Internet-Draft Shadow Directories can be accessed at
http://www.ietf.org/shadow.html.

This Internet-Draft will expire on November 10, 2002.


Copyright Notice
================

Copyright (C) 2002 The Internet Society.  All Rights Reserved.

Abstract
========

MODBUS is an application layer messaging protocol, positioned at level
7 of the OSI model. MODBUS provides client/server communication between
devices connected on different types of buses or networks. MODBUS is a
confirmed service protocol and offers many services specified by
function codes.  MODBUS function codes are elements of MODBUS
Request/Reply PDUs. The objective of this document is to describe the
function codes used within the framework of MODBUS/TCP transactions.





Dube & Camerini               Informational                     [Page 1]


RFC 3xxx                MODBUS Application Protocol             May 2002


Comments
========

Please send comments to Dennis Dube at dennis.dube@modicon.com


Table of Contents
=================

   1.  Overview  ....................................................  2
       1.1  Abbreviations  ..........................................  2
   2.  MODBUS/TCP Protocol Specification  ...........................  2
       2.1  MODBUS PDU Structure  ...................................  3
       2.2  MODBUS Data Encoding  ...................................  6
       2.3  MODBUS Data Model  ......................................  6
       2.4  MODBUS/TCP Transactions  ................................  7
   3.  Function Code Categories  ....................................  8
       3.1  Assigned Public Function Codes  .........................  9
   4.  Function Code Definitions   .................................. 10
       4.1  Read Coil Status 01 (0x01)  ............................. 10
       4.2  Read Discrete Inputs 02 (0x02)  ......................... 11
       4.3  Read Holding Registers 03 (0x03)  ....................... 12
       4.4  Read Input Registers 04 (0x04)  ......................... 13
       4.5  Force Single Coil 05 (0x05)  ............................ 14
       4.6  Write Single Register 06 (0x06)  ........................ 15
       4.7  Force Multiple Coils 15 (0x0F)  ......................... 16
       4.8  Write Multiple Registers 16 (0x10)  ..................... 17
       4.9  Read File Record 20/6 (0x14/0x06)  ...................... 18
       4.10  Write File Record 21/6 (0x15/0x06)  .................... 19
       4.11  Mask Write Register 22 (0x16)  ......................... 21
       4.12  Read/Write Holding Registers 23 (0x17)  ................ 22
       4.13  Read Device Identification 43/14 (0x2B/0x0E)  .......... 23
   5.  Acknowledgements  ............................................ 27
   6.  Security Considerations  ..................................... 27
   7.  References   ................................................. 27
   8.  AuthorÆs Addresses  .......................................... 27
   Appendix A : Full Copyright Statement  ........................... 28


1.  Overview

MODBUS is an application layer messaging protocol for client/server
communication. MODBUS exists on different communication stacks.
This RFC describes MODBUS/TCP.

                        MB/TCP Protocol Stack
                        ---------------------



Dube & Camerini               Informational                     [Page 2]


RFC 3xxx                MODBUS Application Protocol             May 2002


                LAYER              PROTOCOL
            ------------    ------------------
                Application        MODBUS
                Transport          TCP
                Network            IP
                Link               Ethernet II & IEEE 802.3
                Physical           10BaseT & 100BaseT


1.1  Abbreviations

        ADU     Application Data Unit
        HMI     Human Machine Interface
        IETF    Internet Engineering Task Force
        I/O     Input/Output
        IP      Internet Protocol
        MAC     Medium Access Control
        MB      MODBUS Protocol
        MBAP    MODBUS Application Protocol
        PDU     Protocol Data Unit
        PLC     Programmable Logic Controller
        TCP     Transport Control Protocol

2.0  MODBUS/TCP Protocol Specification

     This section presents the elements of the MODBUS/TCP Protocol which
     include :
        * MODBUS/TCP PDU Structure
        * MODBUS Data Encoding
        * MODBUS Data Model
        * MODBUS Transactions

The focus and scope of the entire section is the application layer.

2.1     MODBUS/TCP PDU Structure

The MODBUS protocol defines a simple protocol data unit (PDU)independent
of the underlying communication layers. The mapping of MODBUS protocol
on specific buses or networks can introduce some additional framing
fields. The application data unit (ADU) for MODBUS is defined as the
MODBUS PDU plus any framing fields. The ADU for MODBUS is defined as :


     |-----------------------  ADU  ----------------------------|

     |   Header  |  Function Code  |  Data        | Error Check |

                 |-----------  PDU ---------------|


Dube & Camerini               Informational                     [Page 3]


RFC 3xxx                MODBUS Application Protocol             May 2002


                            Figure 1  MODBUS ADU

The MODBUS/TCP ADU is defined as :

      |------------------  ADU  ------------------------|

      |    MBAP Header   |   Function Code   |   Data   |

                         |-----------  PDU  ------------|


                            Figure 2  MODBUS/TCP ADU


A MODBUS/TCP ADU includes an MBAP header and a MODBUS PDU, and is defined as:

    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |        Inv_id                 |          Proto_id             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |         length                |Unit Identifer |  MODBUS PDU   |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


The MBAP header is 7 bytes long, and includes the following fields :

    inv_id  -  [ 2 bytes] invocation identification used for
               transaction pairing

    proto_id - [2 bytes] is always 0 for MODBUS services. Other
               values are reserved for further extensions.

    length - [2 bytes] The length field is a byte count of the
             remaining fields and includes the dst_id and data fields.

    unit_id - [1 byte] The unit identifier is used to identify a
              remote server located on a non-TCP/IP network.

All MODBUS/TCP ADUs are sent via TCP on registered  system port 502.

The service portion of the MODBUS Application Protocol is the MODBUS
PDU that contains 2 fields :

    func_code - [1 byte] MODBUS function code

    data - [n bytes] This field is function code dependent and
           usually contains information such as variable references,


Dube & Camerini               Informational                     [Page 4]


RFC 3xxx                MODBUS Application Protocol             May 2002


           variable counts, data offsets, sub-function codes etc.

The size of the MODBUS/TCP ADU is limited by the size constraint
inherited from the first MODBUS implementations on Serial Line networks, eg the max. MODBUS/RS485 ADU = 256 bytes. Therefore, the
MODBUS/TCP ADU is 256 and consequently the MODBUS/TCP PDU  = 256 û 7 (length of MBAP Header) = 249 bytes max.

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 :

    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 :

        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 :

    mb_excep_rsp_pdu = { function_code, request_data),      where

        function_code - [1 byte] MODBUS function code + 0x80

        exception_code - [1 byte] MODBUS Exception Code Defined in table
                         below.


Code    Name            Meaning
----    --------        ------------
01    ILLEGAL FUNCTION  The function code received in the request


Dube & Camerini               Informational                     [Page 5]


RFC 3xxx                MODBUS Application Protocol             May 2002


                        is not an allowable action for the server.

02    ILLEGAL DATA      The data address received in the request
      ADDRESS           is not an allowable address for the server.

03    ILLEGAL DATA      A value contained in the request data
      VALUE             field is not an allowable value for server.

04    SERVER FAILURE    An unrecoverable error occurred when the
                        server attempted to perform the requested
                        action.

05    ACKNOWLEDGE       The server has accepted the request and is
                        processing it. However a long duration of time
                        will be required to finish. This response is
                        returned to prevent a timeout error from
                        occurring at the client. The client must use
                        some polling technique to determine when the
                        processing of the request is completed.

06    SERVER BUSY       The server is engaged in processing a
                        longûduration program command. The client
                        should retransmit the message later when the
                        server is free.

08    MEMORY PARITY     Specialized use in conjunction with function
      ERROR             codes 20 and 21 and reference type 6. Indicates
                        that the extended file area failed to pass a
                        consistency check. The server attempted to read
                        extended memory, but detected a parity error in
                        the memory. The client can retry the request,
                        but service may be required on the server
                        device.

0A    GATEWAY  PATH     Specialized use in conjunction with gateways.
      UNAVAILABLE       Indicates that the gateway was unable to
                        allocate an internal communication path from the
                        input port to the output port for processing the
                        request. Usually means that the gateway is
                        misconfigured or overloaded.

0B    GATEWAY  TARGET   Specialized use in conjunction with gateways.
      DEVICE FAILED TO  Indicates that no response was obtained from the
      RESPOND           target device. Usually means that the device is
                        not present on the network.

255   EXTENDED          Indicates the mb_exception_rsp_pdu contains
      EXCEPTION         extended exception information. A subsequent


Dube & Camerini               Informational                     [Page 6]


RFC 3xxx                MODBUS Application Protocol             May 2002


      RESPONSE          two-byte length field indicates the size in
                        bytes of the function code specific exception
                        information.


2.2 MODBUS 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

Some function codes can use other encoding rules, However in this case
the encoding rule has to be described explicitly.

Please see RFC 791, Appendix B, for a detailed description of the
default data encoding and transmission order.


2.3 MODBUS Data Model

MODBUS bases its data model on a series of indexed register files that
have distinguishing characteristics. The four primary register file types are:

Register Type          Data Type    Access      Comments

Discrete Input         single bit   read-only   data from I/O system
Discrete Output(Coils) single bit   read-write  data from application
Input Registers        16-bit word  read-only   data from I/O system
Holding Registers      16-bit word  read-write  data from application

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 register files as overlaying one another, if this is
the most natural interpretation on the target machine in question.

For each of the primary register files, 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.

Data handled via MODBUS (bits, registers, etc) is usually located in
device application memory, however physical addresses in memory should
not be confused with MODBUS data references. A device is only required


Dube & Camerini               Informational                     [Page 7]


RFC 3xxx                MODBUS Application Protocol             May 2002


to link MODBUS data references with physical addresses.

MODBUS logical reference numbers, which are used in MODBUS functions,
are unsigned integer indices starting at zero.


2.4 MODBUS/TCP Transactions

MODBUS is a confirmed service protocol and consequently MODBUS/TCP
transactions are request/response pairs of PDUs. Two scenarios are
possible, ie after sending a mb_req_pdu to the MODBUS server, the
MODBUS client will receive either a normal mb_rsp_pdu or a
mb_excep_rsp_pdu in return .

                Client                  Server
                --------                ---------
                mb_req_pdu  ----->
                                <----- mb_rsp_pdu

                             or

                mb_req_pdu  ----->
                                <----- mb_excep_rsp_pdu


The following pseudo code describes the processing of a mb_req_pdu
received by a MODBUS server.

        wait      wait until a mb_req_pdu is received

        parse     Check mb_req_pdu
                  if function code is invalid then go to excep_01
                  if data address is invalid then go to excep_02
                  if data values are invalid then go to excep_03

        run       Execute function
                  if function code does not execute OK then go to
                                                        excep_run
                  send mb_rsp_pdu
                  go to wait

        excep_01  send mb_excep_rsp_pdu with exception code 1
                  go to wait

        excep_02  send mb_excep_rsp_pdu with exception code 2
                  go to wait

        excep_03  send mb_excep_rsp_pdu with exception code 3


Dube & Camerini               Informational                     [Page 8]


RFC 3xxx                MODBUS Application Protocol             May 2002


                  go to wait

        excep_run send mb_excep_rsp_pdu with an execution exception code
                  go to wait

For an exception response, the server returns a function code that is
the original function code plus 0x80, ie with its most significant bit
set to 1.

Client transaction timeout handling and mb_req_pdu retry mechanisms are
not inherently part of the MODBUS protocol although many client
applications implement such mechanisms.


3. Function Code Categories

There are 3 categories of MODBUS Function Codes, ie
    1. Public Function Codes
    2. User-Defined Function Codes
    3. Reserved Function Codes

The set of Public Function Codes is actually a union of 2 sets of
function codes. They are :
    1. Assigned Function Codes, described in this RFC
    2. Unassigned Function Codes, set aside for future assignment.

Public Function Codes

    * are well defined function codes ,
    * guaranteed to be unique,
    * validated by the modbus.org community,
    * publicly documented at modbus.org,
    * have available conformance tests,
    * are publicly documented by means of this IETF RFC for the MODBUS
      Application Protocol,
    * include both assigned function codes as well as unassigned
      function codes reserved for future use.

User-Defined Function Codes

    * There are two defined ranges of user-defined function codes, ie
    * 65   to 72   decimal (0x41 to 0x58), and
    * 100 to 110 decimal (0x64 to 0x6E).
    * The user can select and implement a function code without any
      approval from modbus.org.
    * There is no guarantee that the use of the selected function code
      will be unique.



Dube & Camerini               Informational                     [Page 9]


RFC 3xxx                MODBUS Application Protocol             May 2002


Reserved Function Codes

    * are currently in use in various products,
    * are not considered part of the set of Public Function Codes,
    * are not assignable as Public Function Codes.


3.1 Assigned Public Function Codes


Data Access
    Bit Access
    Function Name                 Function Code
    --------------------          -------------
    Read Discrete Inputs          02 (0x02)
    Read Coil Status              01 (0x01)
    Force Single Coil             05 (0x05)
    Force Multiple Coils          15(0x0F)

    16-bit Word Access
    Function Name                 Function Code
    --------------------          -------------
    Read Input Registers          04 (0x04)
    Read Holding Registers        03(0x03)
    Write Single Register         06(0x06)
    Write Multiple Registers      16(0x11)
    Read/Write Holding Registers  23(0x17)
    Mask Write Holding Register   22(0x16)


File Record Access
    Function Name          Function Code    Sub-Function Code
    --------------------   -------------    -----------------
    Read File Record       20(0x14)         06(0x06)
    Write File Record      21(0x15)         06(0x06)


Encapsulated Interface
    Function Name          Function Code    MEI Type
    -----------------      -------------    ---------
    Read Device            43(0x2B)         14(0x0E)
    Identification


4. Public Function Code Definitions

4.1 Read Coil Status 01 (0x01)



Dube & Camerini               Informational                    [Page 10]


RFC 3xxx                MODBUS Application Protocol             May 2002


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, ie the address of the first coil specified, and the number of
coils. Coils are addressed starting at zero. Therefore coils 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 PDU

    Function Code       1 byte          01 (0x01)
    Starting Address    2 bytes         0x0000 to 0xFFFF
    No. of Coils        2 bytes         1 to 2000 (0x7D0)

Response PDU

    Function Code       1 byte          01(0x01)
    Byte Count          1 byte          N*
    Coil Status         n bytes         n = N or N+1

    *N = Quantity of Outputs / 8, if the remainder is different than 0
         then N = N+1

Here is an example of a request to read coils 20û38:

    Request               hex     Response              hex

    Function Code         01      Function Code         01
    Starting Address Hi   00      Byte Count            03
    Starting Address Lo   13      Coil Status 27-20     CD
    No. of Coils Hi       00      Coil Status 35-28     6B
    No. of Coils Lo       13      Coil 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.




Dube & Camerini               Informational                    [Page 11]


RFC 3xxx                MODBUS Application Protocol             May 2002


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.


4.2 Read Discrete Inputs 02 (0x02)

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, ie the address of the first input specified, and the
number of inputs. Inputs are addressed starting at zero. Therefore
inputs 1-16 are addressed as 0-15.

The status of 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 byte 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 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 PDU

    Function Code       1 byte          02 (0x02)
    Starting Address    2 bytes         0x0000 to 0xFFFF
    No. of Inputs       2 bytes         1 to 2000 (0x7D0)

Response PDU

    Function Code       1 byte          01(0x01)
    Byte Count          1 byte          N*
    Input Status        n bytes         n = N or N+1

    *N = Quantity of Outputs / 8, if the remainder is greater than of 0
         then N = N+1

Here is an example of a request to read inputs 197 - 218:



Dube & Camerini               Informational                    [Page 12]


RFC 3xxx                MODBUS Application Protocol             May 2002


    Request               hex       Response                hex

    Function Code         02        Function Code           02
    Starting Address Hi   00        Byte Count              03
    Starting Address Lo   C5        Input Status 204-197    AC
    No. of Inputs Hi      00        Input Status 212-205    DB
    No. of Inputs Lo      16        Input Status 218-213    35

The status of 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 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. The two remaining high order bits are zeo
filled.

4.3 Read Holding Registers 03 (0x03)

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 register address and the number of registers. Registers are
addressed starting at zero. Therefore registers 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 PDU

    Function Code           1 byte      03 (0x03)
    Starting Address        2 bytes     0x0000 to 0xFFFF
    No. Holdings Registers  2 bytes     1 to approx 125 (0x7D)

Response PDU

    Function Code           1 byte      03(0x03)
    Byte Count              1 byte      2 x N*
    Register Values         n bytes     n = 2 x N

    *N = Number of Registers

Here is an example of a request to read registers 108-110:

    Request               hex      Response                  hex



Dube & Camerini               Informational                    [Page 13]


RFC 3xxx                MODBUS Application Protocol             May 2002


    Function Code         03       Function Code             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.

4.4 Read Input Registers 04 (0x04)

This function code is used to read from 1 to approx. 125 contiguous
input registers in a remote device. The Request PDU specifies the
starting register address and the number of registers. Registers are
addressed starting at zero. Therefore input registers 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 PDU

    Function Code            1 byte       04 (0x04)
    Starting Address         2 bytes      0x0000 to 0xFFFF
    No. Input Registers      2 bytes      1 to approx 125 (0x7D)

Response PDU

    Function Code            1 byte       04(0x04)
    Byte Count               1 byte       2 x N*
    Input Register Values    n bytes      n = 2 x N

    *N = Number of Registers

Here is an example of a request to read input register 9:

    Request                 hex      Response               hex

    Function Code           04       Function Code          04
    Starting Address Hi     00       Byte Count             02
    Starting Address Lo     08       Value Register 9 Hi    00


Dube & Camerini               Informational                    [Page 14]


RFC 3xxx                MODBUS Application Protocol             May 2002


    No. Input Registers Hi  00       Value Register 9 Lo    0A
    No. Input Registers Lo  01

The contents of input register 9 are shown as the two byte values of 00
0A h ex, or 10 decimal.


4.5 Force Single Coil 05 (0x05)

This function code is used to force a single coil 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 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 that is returned after
the coil state has been set.

Request PDU

    Function Code       1 byte            05 (0x05)
    Coil Address        2 bytes           0x0000 to 0xFFFF
    Coil Value          2 bytes           0x0000 or 0xFF00

Response PDU

    Function Code       1 byte            05 (0x05)
    Coil Address        2 bytes           0x0000 to 0xFFFF
    Coil Value          2 bytes           0x0000 or 0xFF00

Here is an example of a request to force coil 173 ON:

    Request             hex         Response                hex

    Function Code       05          Function Code           05
    Coil Address Hi     00          Coil Address Hi         00
    Coil Address Lo     AC          Coil Address Lo         AC
    Coil Value Hi       FF          Coil Value Hi           FF
    Coil Value Lo       00          Coil Value Lo           00


Dube & Camerini               Informational                    [Page 15]


RFC 3xxx                MODBUS Application Protocol             May 2002


4.6 Write Single Register 06 (0x06)

This function code is used to write a single holding register in a
remote device.

The Request PDU specifies the address of the register to be written.
Registers are addressed starting at zero. Therefore register 1 is
addressed as 0.

The normal response is an echo of the request, returned after the
register contents have been written.

Request PDU

    Function Code       1 byte            06 (0x06)
    Register Address    2 bytes           0x0000 to 0xFFFF
    Register Value      2 bytes           0x0000 to 0xFFFF

Response PDU

    Function Code       1 byte            06 (0x06)
    Register Address    2 bytes           0x0000 to 0xFFFF
    Register Value      2 bytes           0x0000 to 0xFFFF

Here is an example of a request to write register 2 to 0x0003.

    Request              hex     Response                 hex

    Function Code         06      Function Code            06
    Register Address Hi   00      Register Address Hi      00
    Register Address Lo   01      Register Address Lo      01
    Register Value Hi     00      Register Value Hi        00
    Register Value Lo     03      Register Value Lo        03



4.7 Force Multiple Coils  15 (0x0F)

This function code is used to force each coil in a sequence of coils to
either ON or OFF in a remote device. The Request PDU specifies the coil
references to be forced. Coils are addressed starting at zero.
Therefore coil 1 is addressed as 0.

The requested ON/OFF states are specified by contents of the request
data field. A logical '1' in a bit position of the field requests the
corresponding output to be ON. A logical '0' requests it to be OFF.

The normal response returns the function code, starting address, and


Dube & Camerini               Informational                    [Page 16]


RFC 3xxx                MODBUS Application Protocol             May 2002


quantity of coils forced.


Request PDU

    Function Code       1 byte            15 (0x0F)
    Starting Address    2 bytes           0x0000 to 0xFFFF
    Quantity of coils   2 bytes           0x0001 to 0x07B0
    Byte Count          1 byte            n
    Output value        n x 1 byte        value

Response PDU

    Function Code       1 byte            15 (0x0F)
    Starting Address    2 bytes           0x0000 to 0xFFFF
    Quantity of coilsq  2 bytes           0x0001 to 0x07B0

Here is an example of a request to force a series of 10 coils starting
at coil 20:

The request data contents are two bytes: CD 01 hex (1100 1101 0000 0001
binary). The binary bits correspond to the outputs are:

     Bit :  1   1   0   0   1  1   0   1   0  0  0  0  0  0  0  1
     Coil:  27  26  25  24  23 22  21  20  û  û  û  û  û  û  29 28

The first byte transmitted (CD hex) addresses outputs 27-20, with the
least significant bit addressing the lowest output (20) in this set.
The next byte transmitted (01 hex) addresses outputs 29-28, with the
least significant bit addressing the lowest output (28) in this set.
Unused bits in the last data byte should be zeroûfilled.

    Request                 hex     Response               hex

    Function Code           0F      Function Code          0F
    Coil Address Hi         00      Coil Address Hi        00
    Coil Address Lo         13      Coil Address Lo        13
    Quantity of Coils Hi    00      Quantity of Coil Hi    00
    Quantity of Coils Lo    0A      Quantity of Coil Lo    0A
    Byte Count              02
    Outputs Value Hi        CD
    Outputs Value Lo        01


4.8  Write Multiple Registers 16  (0x10)

This function code is used to write a block of contiguous registers (1
to approx. 120 registers) in a remote device.


Dube & Camerini               Informational                    [Page 17]


RFC 3xxx                MODBUS Application Protocol             May 2002


The requested written values are specified in the request data field.
Data is packed as two bytes per register.

The normal response returns the function code, starting address, and
quantity of registers written.


Request PDU

    Function Code       1 byte            16 (0x10)
    Starting Address    2 bytes           0x0000 to 0xFFFF
    No. of registers    2 bytes           0x0001 to approx 0x0078
    Byte Count          1 byte            2 x n
    Registers value     n x 2 bytes       value

Response PDU

    Function Code       1 byte            15 (0x0F)
    Starting Address    2 bytes           0x0000 to 0xFFFF
    No. of registers    2 bytes           0x0001 to approx 0x0078


Here is an example of a request to write two registers starting at 2 to
00 0A and 01 02 hex:

    Request               hex     Response              hex

    Function Code         10      Function Code         10
    Starting Address Hi   00      Starting Address Hi   00
    Starting Address Lo   01      Starting Address Lo   01
    No. of Registers Hi   00      No. of Registers Hi   00
    No. of Registers Lo   02      No. of Registers Lo   02
    Byte Count            04
    Register Value Hi     00
    Register Value Lo     0A
    Register Value Hi     01
    Register Value Lo     02


4.9  Read File Record 20 / 6 (0x14 / 0x06 )

This function code is used to perform a file record read. All Request
Data Lengths are provided in terms of number of bytes and all Record
Lengths are provided in terms of the number of 16-bit words.

A file is an organization of records. Each file contains 10000 records,
addressed 0000 to 9999 decimal or 0x0000 to 0x270F. For example, record
12 is addressed as 12.


Dube & Camerini               Informational                    [Page 18]


RFC 3xxx                MODBUS Application Protocol             May 2002


The function can read multiple groups of references. The groups can be
separated, ie non-contiguous, but the references within each group must
be sequential.

Each group is defined in a separate æsub-requestÆ field that contains 7
bytes:
    The Reference Type: 1 byte (must be specified as 6)
    The File Number: 2 bytes (1 to 10, 0x0001 to 0x000A)
    The Starting Record Number within the file: 2 bytes
    The Length of the Record to be read: 2 bytes.

The quantity of words to be read, combined with all other fields in the
expected response, must not exceed the allowable length of MODBUS
messages: 256 bytes.

The normal response is a series of æsub-responsesÆ, one for each æsub-
requestÆ. The byte count field is the total combined count of bytes in
all æsub-responsesÆ. In addition, each æsub-responseÆ contains a field
that shows its own byte count.

Request PDU

    Function Code                   1 byte      20 (0x14)
    Request Data Length             1 byte      0x07 to 0xF5 bytes
    Reference Type, SubReq x        1 byte      6
    File Number, SubReq x           2 bytes     0x0000 to 0xFFFF
    Record Number, SubReq x         2 bytes     0x0000 to 0xFFFF
    Record Length, SubReq x         2 bytes     0x0000 to 0xFFFF words
    Reference Type, SubReq x+1      1 byte      6
        ......

Response PDU

    Function Code                   1 byte       20(0x14)
    Response Data Length            1 byte       0x07 to 0xF5 bytes
    File Response Length, SubReq x  1 byte       0x07 to 0xF5 bytes
    Reference Type, SubReq x        1 byte       6
    Record Data, SubReq x           Nx2 bytes
    File Response Length,SubReqx+1  1 byte
    Reference Type, SubReq x+1      1 byte       6
       ........

Here is an example of a request to read one file record from a remote
device:
    it consists of two words from file 4, starting at record 1
    (address 0001).

    Request              hex        Response               hex


Dube & Camerini               Informational                    [Page 19]


RFC 3xxx                MODBUS Application Protocol             May 2002


    Function Code        14         Function Code          10
    Request Data Length  07         Response Data Length   06
    Reference Type       06         File Response Length   05
    File Number Hi       00         Reference Type         06
    File Number Lo       04         Record Data Hi         0D
    Record Number Hi     00         Record Data Lo         FE
    Record Number Lo     01         Record Data Hi         00
    Record Length Hi     00         Record Data Lo         20
    Record Length Lo     02



4.10  Write File Record 21 / 6 (0x15 / 0x06 )

This function code is used to perform a file record write. All Request
Data Lengths are provided in terms of number of bytes and all Record
Lengths are provided in terms of the number of 16-bit words.

A file is an organization of records. Each file contains 10000 records,
addressed 0000 to 9999 decimal or 0x0000 to 0x270F. For example, record
12 is addressed as 12.

The function can write multiple groups of references. The groups can be
separate, ie nonûcontiguous, but the references within each group must
be sequential.

Each group is defined in a separate æsub-requestÆ field that contains 7
bytes plus the data:
    The Reference Type: 1 byte (must be specified as 6)
    The File Number: 2 bytes (1 to 10, hex 0001 to 000A)
    The Starting Record Number within the file: 2 bytes
    The Length of the Record to be written: 2 bytes
    The Data to be written: 2 bytes per register.

The quantity of words to be written, combined with all other fields in
the request, must not exceed the allowable length of MODBUS messages:
256 bytes.

The normal response is an echo of the request.

Request PDU

    Function Code               1 byte          21 (0x15)
    Request Data Length         1 byte          0x07 to 0xF5 bytes
    Reference Type, SubReq x    1 byte          6
    File Number, SubReq x       2 bytes         0x0000 to 0xFFFF
    Record Number, SubReq x     2 bytes         0x0000 to 0xFFFF
    Record Length, SubReq x     2 bytes         0x0000 to 0xFFFF words


Dube & Camerini               Informational                    [Page 20]


RFC 3xxx                MODBUS Application Protocol             May 2002


    Record Data, SubReq x       n x 2 bytes
    Reference Type, SubReq x+1  1 byte          6
        .........

Response PDU

    Function Code               1 byte          21 (0x15)
    Response Data Length        1 byte          0x07 to 0xF5 bytes
    Reference Type, SubReq x    1 byte          6
    File Number, SubReq x       2 bytes         0x0000 to 0xFFFF
    Record Number, SubReq x     2 bytes         0x0000 to 0xFFFF
    Record Length, SubReq x     2 bytes         0x0000 to 0xFFFF words
    Record Data, SubReq x       n x 2 bytes
    Reference Type, SubReq x+1  1 byte          6
        ..........

Here is an example of a request to write one file record to a remote
device:
    The group consists of three words in file 4, starting at record 7
    (address 0007).

    Request              hex        Response                hex

    Function Code        15         Function Code           15
    Request Data Length  0D         Response Data Length    0D
    Reference Type       06         Reference Type          06
    File Number Hi       00         File Number Hi          00
    File Number Lo       04         File Number Lo          04
    Record Number Hi     00         Record Number Hi        00
    Record Number Lo     07         Record Number Lo        07
    Record Length Hi     00         Record Length Hi        00
    Record Length Lo     03         Record Length Lo        03
    Record Data Hi       06         Record Data Hi          06
    Record Data Lo       01         Record Data Lo          01
    Record Data Hi       03         Record Data Hi          03
    Record Data Lo       02         Record Data Lo          02
    Record Data Hi       04         Record Data Hi          04
    Record Data Lo       01         Record Data Lo          01


4.11   Mask Write Register 22  (0x16  )

This function code is used to modify the contents of a specified
holding register using a combination of an AND mask, an OR mask, and
the holding register's current contents. The function can be used to
set or clear individual bits in the register.

The request specifies the holding register to be written, the data to


Dube & Camerini               Informational                    [Page 21]


RFC 3xxx                MODBUS Application Protocol             May 2002


be used as the AND mask, and the data to be used as the OR mask.
Registers are addressed starting at zero. Therefore registers 1-16 are
addressed as 0-15.

The functionÆs algorithm is:
    Result = (Current Contents AND And_Mask) OR (Or_Mask AND And_Mask)

For example:
                            Hex    Binary
    Current Contents =      12     0001 0010
    And_Mask =              F2     1111 0010
    Or_Mask =               25     0010 0101
    And_Mask =              0D     0000 1101

    Result =                17     0001 0111

Note that if the Or_Mask value is zero, the result is simply the
logical ANDing of the current contents and And_Mask. If the And_Mask
value is zero, the result is equal to the Or_Mask value. The contents
of the register can be read with the Read Holding Register function
(function code 03).

The normal response is an echo of the request. The response is returned
after the register has been written.

Request PDU

    Function Code       1 byte            22 (0x16)
    Reference Address   2 bytes           0x0000 to 0xFFFF
    And_Mask            2 bytes           0x0000 to 0xFFFF
    Or_Mask             2 bytes           0x0000 to 0xFFFF

Response PDU

    Function Code       1 byte            22 (0x16)
    Reference Address   2 bytes           0x0000 to 0xFFFF
    And_Mask            2 bytes           0x0000 to 0xFFFF
    Or_Mask             2 bytes           0x0000 to 0xFFFF

Here is an example of a Mask Write to register 5 in a remote device,
using the above mask values.

    Request             hex         Response              hex

    Function Code       16          Function Code         16
    Ref. Address Hi     00          Ref. Address Hi       00
    Ref. Address Lo     04          Ref. Address Lo       04
    And_Mask Hi         00          And_Mask Hi           00


Dube & Camerini               Informational                    [Page 22]


RFC 3xxx                MODBUS Application Protocol             May 2002


    And_Mask Lo         F2          And_Mask Lo           F2
    Or_Mask Hi          00          Or_Mask Hi            00
    Or_Mask Lo          25          Or_Mask Lo            25



4.12  Read/Write Holding Registers 23 (0x17  )

This function code performs a combination of one read operation and one
write operation in a single MODBUS transaction.

Holding registers are addressed starting at zero. Therefore holding
registers 1-16 are addressed as 0-15.

The request specifies the starting address and number of holding
registers to be read as well as the starting address,  number of
holding registers, and the data to be written. The byte count specifies
the number of bytes to follow in the write data field.

The normal response contains the data from the group of registers that
were read. The byte count field specifies the quantity of bytes to
follow in the read data field.

Request PDU

    Function Code             1 byte            23 (0x17)
    Read Starting Address     2 bytes           0x0000 to 0xFFFF
    Quantity to read          2 bytes           0x0001 to  approx 0x76
    Write Starting Address    2 bytes           0x0000 to 0xFFFF
    Quantity to write         2 bytes           0x0001 to  approx 0x76
    Write byte count          1 byte            2 x N*
    Write registers value     N* x 2 bytes


Response PDU

    Function Code             1 byte            03(0x03)
    Byte Count                1 byte            2 x N*
    Read Register Values      N*  x 2 bytes

    *N = Number of Registers

Here is an example of a request to read six registers starting at
register 4, and to write three registers starting at register 15:

    Request                  hex        Response              hex

    Function Code            17         Function Code         17


Dube & Camerini               Informational                    [Page 23]


RFC 3xxx                MODBUS Application Protocol             May 2002


    Read Starting Addr Hi    00         Byte Count            0C
    Read Starting Addr Lo    04         Register 4 Data Hi    02
    Quantity to Read Hi      00         Register 4 Data Lo    2B
    Quantity to Read Lo      06         Register 5 Data Hi    00
    Write Starting Addr Hi   00         Register 5 Data Lo    00
    Write Starting Addr Lo   0F         Register 6 Data Hi    00
    Quantity to Write Hi     00         Register 6 Data Lo    64
    Quantity to Write Lo     03         Register 7 Data Hi    00
    Write Byte count         06         Register 7 Data Lo    54
    Write Reg15 Data Hi      00         Register 8 Data Hi    01
    Write Reg 15 Data Lo     FF         Register 8 Data Lo    02
    Write Reg 16 Data Hi     00         Register 9 Data Hi    01
    Write Reg16 Data Lo      FF         Register 9 Data Lo    03
    Write Reg 17 Data Hi     00
    Write Reg 17 Data Lo     FF


4.13  Read Device Identification 43/14  (0x2B / 0E  )

This function code allows reading the identification and additional
information relative to the physical and functional description of a
remote device.

The Read Device Identification interface is modeled as an address space
composed of a set of addressable data elements. The data elements are
called objects and an object Id identifies them.

The interface consists of 3 categories of objects :

Basic Device Identification.
    All objects of this category are mandatory, ie
        VendorName, Product Code, and Revision Number.

Regular Device Identification.
    In addition to Basic Device Identification, the device provides
    additional and optional identification and description data objects.
    All of the objects of this category are defined in the standard but
    their implementation is optional.

Extended Device Identification.
    In addition to Regular Device Identification, the device provides
    additional and optional identification and description of private
    data. All of these data are device dependent.

Object Id     Object Name          Type         M/O        Category
...................................................................
0x00          VendorName           ASCIIString  Mandatory  Basic
0x01          ProductCode          ASCIIString  Mandatory  Basic


Dube & Camerini               Informational                    [Page 24]


RFC 3xxx                MODBUS Application Protocol             May 2002


0x02          MajorMinorRevision   ASCIIString  Mandatory  Basic
0x03          VendorUrl            ASCIIString  Optional   Regular
0x03          ProductName          ASCIIString  Optional   Regular
0x04          VendorUrl            ASCIIString  Optional   Regular
0x05          UserApplicationName  ASCIIString  Optional   Regular
0x07 .. 0x7F  Reserved
0x80 .. 0xFF  Product dependent                 Optional   Extended

A Modbus Encapsulated Interface assigned number 14 identifies the Read
Identification request. Four access types are defined:

    01 : request  to get the basic device identification (stream
         access)
    02 : request to get the regular device identification (stream
         access)
    03 : request to get the  extended device identification (stream
         access)
    04 : request to get one specific identification object (individual
         access)

In the case where the identification data does not fit into a single
response, several request/response transactions may be required. The
Object Id byte gives the identification of the first object to obtain.
For the first transaction, the client must set the Object Id to 0 to
obtain the start of the device identification data. For the following
transactions, the client must set the Object Id to the value returned
by the server in its previous response.

If the Object Id does not match any known object, the server responds
as if object 0 were pointed out (restart at the beginning).

In case of an individual access: ReadDevId code 04, the Object Id in
the request gives the identification of the object to obtain.

If the Object Id does not match any known object, the server returns an
exception response with exception code = 02 (Illegal data address).

The normal response contains the following information :

    ReadDevId Code      Same as request ReadDevId code : 01, 02, 03 or
                        04
    Conformity Level    Identification conformity level of the device
                        and type of supported access
                        01 : basic identification (stream access only)
                        02 : regular identification (stream access only)
                        03 : extended identification (stream access
                                                      only)
                        81 : basic identification (stream access and


Dube & Camerini               Informational                    [Page 25]


RFC 3xxx                MODBUS Application Protocol             May 2002


                            individual access)
                        82 : regular identification (stream access and
                             individual access)
                        83 : extended identification (stream access and
                             individual access)
    More Follows        In case of ReadDevId codes 01, 02 or 03 (stream
                        access), If the identification data doesn't fit
                        into a single response, several request/response
                        transactions may be required.
                        00 : no more Object are available
                        FF : other identification Object are available
                             and further Modbus transactions are
                             required.
                        In case of ReadDevId code 04 (individual
                        access), this field must be set to 00.
    Next Object Id      If "MoreFollows = FF", identification of the
                        next Object to be asked for. if "MoreFollows =
                        00", must be set to 00 (useless)
    Number Of Objects   Number of identification Object returned in the
                        response (for an individual access, Number Of
                        Objects = 1)
    Object0.Id          Identification of the first Object returned in
                        the PDU (stream access) or the requested Object
                        (individual access)
    Object0.Length      Length of the first Object in bytes
    Object0.Value       Value of the first Object (Object0.Length bytes)
       ...
    ObjectN.Id          Identification of the last Object (within the
                        response)
    ObjectN.Length      Length of the last Object in bytes
    ObjectN.Value       Value of the last Object (ObjectN.Length bytes)


Request PDU

    Function Code       1 byte            43 (0x2B)
    MEI Type            1 byte            0x0E
    Read ID code        1 byte            01/02/03/04
    Object ID           1 byte            0x00 to 0xFF

Response PDU

    Function Code       1 byte            43 (0x2B)
    MEI Type            1 byte            0x0E
    Read ID code        1 byte            01/02/03/04
    Conformity level    1 byte
    More follows        1 byte            00 / FF
    Next Object Id      1 byte


Dube & Camerini               Informational                    [Page 26]


RFC 3xxx                MODBUS Application Protocol             May 2002


    Number of objects   1 byte
    Object ID x         1 byte
    Object length x     1 byte
    Object value x      1 byte
    Object ID x+1       1 byte
    Object length x+1   1 byte
    Object value x+1    1 byte
      ........

Example of a Read Device Identification request for "Basic device
identification". In this example all information are sent in one
response PDU.


    Request             hex       Response                hex

    Function Code       2B        Function Code           2B
    MEI Type            0E        MEI Type                0E
    Read Id Code        01        Register Id code        01
    Object Id           00        Conformity level        01
                                  More follows            00
                                  Next Object Id          00
                                  Number of object        03
                                  Object ID               00
                                  Object Length           16
                                  Object Value  "company identification"
                                  Object ID               01
                                  Object Length           0C
                                  Object Value            "product code"
                                  Object ID               02
                                  Object Length           07
                                  Object Value            "version"


5.  Acknowledgments

This document is the result of a collaboration of members of the MODBUS
Community located at www.modbus.org.


6.  Security Considerations

This RFC does not discuss security issues and is not believed to raise
any security issues not already endemic to MODBUS communications. Since
MODBUS/TCP is based on TCP/IP, it is not inherently secure.


7.  References


Dube & Camerini               Informational                    [Page 27]


RFC 3xxx                MODBUS Application Protocol             May 2002


    [RFC 791]   Internet Protocol, Sep81 DARpa


8.  Authors' Addresses

       Dennis Dub‰
       Schneider Automation Inc.
       1 High St.
       N. Andover, MA 01845-2699
       USA

       Phone : 978-975-2891
       Email : dennis.dube@modicon.com


       Jacques Camerini
       Schneider Automation S.A.
       245, route des Lucioles B.P
       147 F-06903
       Sophia-Antipolis, France

       Phone : 33 4 92 38 2045
       Email : jacques.camerini@modicon.com



























Dube & Camerini               Informational                    [Page 28]


RFC 3xxx                MODBUS Application Protocol             May 2002



APPENDIX A - Full Copyright Statement

Copyright (C) The Internet Society (2002).  All Rights Reserved.

This document and translations of it may be copied and furnished to
others, and derivative works that comment on or otherwise explain it or
assist in its implementation may be prepared, copied, published and
distributed, in whole or in part, without restriction of any
kind, provided that the above copyright notice and this paragraph are
included on all such copies and derivative works.  However, this
document itself may not be modified in any way, such as by removing the
copyright notice or references to the Internet Society or other
Internet organizations, except as needed for the  purpose of developing
Internet standards in which case the procedures for copyrights defined
in the Internet Standards process must be followed, or as required to
translate it into languages other than
English.

The limited permissions granted above are perpetual and will not be
revoked by the Internet Society or its successors or assigns.

This document and the information contained herein is provided on an
"AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.




This Internet-Draft will expire on November 10, 2002.

















Dube & Camerini               Informational                    [Page 29]