/**************************************************************************** * 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 ) };