modbus_defines.h 4.23 KB
/****************************************************************************
 * Copyright (c) 2022 Priva B.V.
 ****************************************************************************/

#pragma once

/* Modbus Function codes as defined in the protocol standard */
enum class E_MB_FUNCTION_CODES
{
    E_MODBUS_FC_READ_COILS                  0x01,
    E_MODBUS_FC_READ_DISCRETE_INPUTS        0x02,
    E_MODBUS_FC_READ_HOLDING_REGISTERS      0x03,
    E_MODBUS_FC_READ_INPUT_REGISTERS        0x04,
    E_MODBUS_FC_WRITE_SINGLE_COIL           0x05,
    E_MODBUS_FC_WRITE_SINGLE_REGISTER       0x06,
    E_MODBUS_FC_READ_EXCEPTION_STATUS       0x07,
    E_MODBUS_FC_WRITE_MULTIPLE_COILS        0x0F,
    E_MODBUS_FC_WRITE_MULTIPLE_REGISTERS    0x10,
    E_MODBUS_FC_REPORT_SLAVE_ID             0x11,
    E_MODBUS_FC_MASK_WRITE_REGISTERS        0x16,
    E_MODBUS_FC_WRITE_AND_READ_REGISTERS    0x17
};

#define MODBUS_BROADCAST_ADDRESS            0

/* Modbus Application Protocol V1.1b ( Chapter 6 section 1 page 12 )
 * Quantity of Coils to read ( 2 bytes ): 1 to 2000 ( 0x7D0 )
 * ( chapter 6 section 11 page 29 )
 * Quantity of Coils to write ( 2 bytes ): 1 to 1968 ( 0x7B0 )
 */
#define MODBUS_MAX_READ_BITS                2000
#define MODBUS_MAX_WRITE_BITS               1968

/* Modbus Application Protocol V1.1b ( Chapter 6 section 3 page 12 )
 * Quantity of Registers to read ( 2 bytes ): 1 to 125 ( 0x7D )
 * ( chapter 6 section 12 page 31 )
 * Quantity of Registers to write ( 2 bytes ): 1 to 123 ( 0x7B ) 
 * ( chapter 6 section 17 page 38 )
 * Quantity of Registers to write in R/W registers ( 2 bytes ) 1 to 123 ( 0x79 )
 */
#define MODBUS_MAX_READ_REGISTERS           125
#define MODBUS_MAX_WRITE_REGISTERS          123
#define MODBUS_MAX_WR_WRITE_REGISTERS       121
#define MODBUS_MAX_WR_READ_REGISTERS        125

/* The MODBUS PDU is 256 bytes maximum. Therefore MODBUS PDU for serial line
 * communication = 256 - Server address ( 1 byte ) - CRC ( 2 bytes ) = 253 bytes
 */
#define MODBUS_MAX_PDU_LENGTH               253

/* Consequently :
 * - RTU MODBUS_ADU = 253 bytes + Server address ( 1 byte ) + CRC ( 2 bytes ) = 256
 *   bytes
 * - TCP MODBUS ADU = 253 bytes + MBAP ( 7 bytes ) = 260 bytes
 * so the maximum of both backends is 260 bytes. This size can be used to allocate
 * an array of bytes to store responses and it will be compatible with the two
 * backends.
 */
#define MODBUS_MAX_ADU_LENGTH               260

/* Random number to avoid errno conflicts */
#define MODBUS_ENOBASE                 31428571

/* Protocol exceptions */
enum class E_MODBUS_EXCEPTIONS
{
    MODBUS_EXCEPTION_ILLEGAL_FUNCTION       0x01,
    MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS,
    MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE,
    MODBUS_EXCEPTION_SLAVE_OR_SERVER_FAILURE,
    MODBUS_EXCEPTION_ACKNOWLEDGE,
    MODBUS_EXCEPTION_SLAVE_OR_SERVER_BUSY,
    MODBUS_EXCEPTION_NEGATIVE_ACKNOWLEDGE,
    MODBUS_EXCEPTION_MEMORY_PARITY,
    MODBUS_EXCEPTION_NOT_DEFINED,
    MODBUS_EXCEPTION_GATEWAY_PATH,
    MODBUS_EXCEPTION_GATEWAY_TARGET,
    MODBUS_EXCEPTION_MAX
};

/* MODBUS Error codes */
#define EMBXILFUN  ( MODBUS_ENOBASE + MODBUS_EXCEPTION_ILLEGAL_FUNCTION )
#define EMBXILADD  ( MODBUS_ENOBASE + MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS )
#define EMBXILVAL  ( MODBUS_ENOBASE + MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE )
#define EMBXSFAIL  ( MODBUS_ENOBASE + MODBUS_EXCEPTION_SLAVE_OR_SERVER_FAILURE )
#define EMBXACK    ( MODBUS_ENOBASE + MODBUS_EXCEPTION_ACKNOWLEDGE )
#define EMBXSBUSY  ( MODBUS_ENOBASE + MODBUS_EXCEPTION_SLAVE_OR_SERVER_BUSY )
#define EMBXNACK   ( MODBUS_ENOBASE + MODBUS_EXCEPTION_NEGATIVE_ACKNOWLEDGE )
#define EMBXMEMPAR ( MODBUS_ENOBASE + MODBUS_EXCEPTION_MEMORY_PARITY )
#define EMBXGPATH  ( MODBUS_ENOBASE + MODBUS_EXCEPTION_GATEWAY_PATH )
#define EMBXGTAR   ( MODBUS_ENOBASE + MODBUS_EXCEPTION_GATEWAY_TARGET )

/* Native modbus error codes */
#define EMBBADCRC       ( EMBXGTAR + 1 )
#define EMBBADDATA      ( EMBXGTAR + 2 )
#define EMBBADEXC       ( EMBXGTAR + 3 )
#define EMBUNKEXC       ( EMBXGTAR + 4 )
#define EMBMDATA        ( EMBXGTAR + 5 )
#define EMBBADSLAVE     ( EMBXGTAR + 6 )

/* Recovery Modes */
enum class MODBUS_ERROR_RECOVERY_MODE
{
    MODBUS_ERROR_RECOVERY_NONE      = 0,
    MODBUS_ERROR_RECOVERY_LINK      = ( 1 << 1 ),
    MODBUS_ERROR_RECOVERY_PROTOCOL  = ( 1 << 2 )
};