@@ -40,23 +40,23 @@
////////////////////---MODBUS MESSAGE DEFINES---/////////////////////
//-------------DEFINES FOR STRUCTURE----------------
/* defines for structure of modbus message */
#define ID_ Transaction_size 2 ///< size of (ID_ Transaction)
#define ID_ Protocol_size 2 ///< size of (ID_ Protocol)
#define PDU_ Len_size 2 ///< size of (PDU Length)
#define TransactionID _size 2 ///< size of (Transaction ID )
#define ProtocolID _size 2 ///< size of (Protocol ID )
#define PDULength _size 2 ///< size of (PDU Length)
#define MbAddr_SIZE 1 ///< size of (Slave Addr)
#define Func_Code_SIZE 1 ///< size of (Function Code)
#define Addr_SIZE 2 ///< size of (Address)
#define Qnt_SIZE 2 ///< size of (Quantity)
#define ByteCnt_SIZE 1 ///< size of (Byte Count)
#define DATA_SIZE 125 ///< maximum number of data: DWORD (NOT MESSAGE SIZE)
#define CRC_SIZE 2 ///< size of (MB_ CRC) in bytes
#define CRC_SIZE 2 ///< size of (Mb CRC) in bytes
#ifndef MODBUS_PROTOCOL_TCP
/** @brief Size of whole RTU message */
#define INFO_SIZE_MAX (MbAddr_SIZE+Func_Code_SIZE+Addr_SIZE+Qnt_SIZE+ByteCnt_SIZE)
#else
/** @brief Size of whole TCP message */
#define INFO_SIZE_MAX (ID_ Transaction_size+ID_ Protocol_size+PDU_ Len_size+MbAddr_SIZE+Func_Code_SIZE+Addr_SIZE+Qnt_SIZE)
#define INFO_SIZE_MAX (TransactionID _size+ProtocolID _size+PDULength _size+MbAddr_SIZE+Func_Code_SIZE+Addr_SIZE+Qnt_SIZE)
#endif
/** @brief Size of first part of message that will be received
@@ -66,100 +66,104 @@ first receive info part of message, than defines size of rest message*/
/** @brief Size of buffer: max size of whole message */
#define MSG_SIZE_MAX (INFO_SIZE_MAX + DATA_SIZE*2 + CRC_SIZE) // max possible size of message
/** @brief Structure for modbus exception codes */
/**
* @brief Enum for modbus exception codes
* @details Prefix ET for Error Type
*/
typedef enum //MB_ExceptionTypeDef
{
// reading
NO_ERRORS = 0x00, ///< no errors
ILLEGAL_FUNCTION = 0x01, ///< Принятый код функции не может быть обработан
ILLEGAL_DATA_ADDRESS = 0x02, ///< Адрес данных, указанный в запросе, недоступен
ILLEGAL_DATA_VALUE = 0x03, ///< Значение, содержащееся в поле данных запроса, является недопустимой величиной
SLAVE_DEVICE_FAILURE = 0x04, ///< Невосстанавливаемая ошибка имела место, пока ведомое устройство пыталось выполнить затребованное действие
// ACKNOWLEDGE = 0x05, ///< idk
// SLAVE_DEVICE_BUSY = 0x06, ///< idk
// MEMORY_PARITY_ERROR = 0x08, ///< idk
ET_ NO_ERRORS = 0x00, ///< no errors
ET_ ILLEGAL_FUNCTION = 0x01, ///< Принятый код функции не может быть обработан
ET_ ILLEGAL_DATA_ADDRESS = 0x02, ///< Адрес данных, указанный в запросе, недоступен
ET_ ILLEGAL_DATA_VALUE = 0x03, ///< Значение, содержащееся в поле данных запроса, является недопустимой величиной
ET_ SLAVE_DEVICE_FAILURE = 0x04, ///< Невосстанавливаемая ошибка имела место, пока ведомое устройство пыталось выполнить затребованное действие
// ET_ ACKNOWLEDGE = 0x05, ///< idk
// ET_ SLAVE_DEVICE_BUSY = 0x06, ///< idk
// ET_ MEMORY_PARITY_ERROR = 0x08, ///< idk
}MB_ExceptionTypeDef;
#define ERR_VALUES_START 0x80U ///< from this value starts error func codes
/** @brief Structure for modbus func codes */
#define FC_ ERR_VALUES_START 0x80U ///< from this value starts error func codes
/**
* @brief Enum for modbus func codes
* @details Prefix FC for Function Code
*/
typedef enum //MB_FunctonTypeDef
{
/* COMMANDS */
// reading
MB _R_COILS = 0x01, ///< Чтение битовых ячеек
MB _R_DISC_IN = 0x02, ///< Чтение дискретных входов
FC _R_COILS = 0x01, ///< Чтение битовых ячеек
//FC _R_DISC_IN = 0x02, ///< Чтение дискретных входов
#ifndef MODBUS_SWITCH_COMMAND_R_IN_REGS_AND_R_HOLD_REGS
MB _R_HOLD_REGS = 0x03, ///< Чтение входных регистров
MB _R_IN_REGS = 0x04, ///< Чтение регистров хранения
FC _R_HOLD_REGS = 0x03, ///< Чтение входных регистров
FC _R_IN_REGS = 0x04, ///< Чтение регистров хранения
#else
MB _R_HOLD_REGS = 0x04, ///< Чтение входных регистров
MB _R_IN_REGS = 0x03, ///< Чтение регистров хранения
FC _R_HOLD_REGS = 0x04, ///< Чтение входных регистров
FC _R_IN_REGS = 0x03, ///< Чтение регистров хранения
#endif
// writting
MB _W_COIL = 0x05, ///< Запись битовой ячейки
MB _W_HOLD_REG = 0x06, ///< Запись одиночного регистра
MB _W_COILS = 0x0F, ///< Запись нескольких битовых ячеек
MB _W_HOLD_REGS = 0x10, ///< Запись нескольких регистров
FC _W_COIL = 0x05, ///< Запись битовой ячейки
FC _W_HOLD_REG = 0x06, ///< Запись одиночного регистра
FC _W_COILS = 0x0F, ///< Запись нескольких битовых ячеек
FC _W_HOLD_REGS = 0x10, ///< Запись нескольких регистров
MB _R_DIAGNOSTIC = 0x08, ///< Чтение диагностической информации устройства
MB _R_DEVICE_INFO = 0x2B, ///< Чтение информации о б устройстве
FC _R_DIAGNOSTICS = 0x08, ///< Чтение диагностической информации устройства
FC _R_DEVICE_ID = 0x2B, ///< Чтение информации о б устройстве
/* ERRORS */
// error reading
MB _ERR_R_COILS = MB _R_COILS + ERR_VALUES_START, ///< Ошибка чтения битовых ячеек
MB _ERR_R_DISC_IN = MB _R_DISC_IN + ERR_VALUES_START, ///< Ошибка чтения дискретных входов
MB _ERR_R_IN_REGS = MB _R_IN_REGS + ERR_VALUES_START, ///< Ошибка чтения регистров хранения
MB _ERR_R_HOLD_REGS = MB _R_HOLD_REGS + ERR_VALUES_START, ///< Ошибка чтения входных регистров
FC _ERR_R_COILS = FC _R_COILS + FC_ ERR_VALUES_START, ///< Ошибка чтения битовых ячеек
//FC _ERR_R_DISC_IN = FC _R_DISC_IN + FC_ ERR_VALUES_START, ///< Ошибка чтения дискретных входов
FC _ERR_R_IN_REGS = FC _R_IN_REGS + FC_ ERR_VALUES_START, ///< Ошибка чтения регистров хранения
FC _ERR_R_HOLD_REGS = FC _R_HOLD_REGS + FC_ ERR_VALUES_START, ///< Ошибка чтения входных регистров
// error writting
MB _ERR_W_COIL = MB _W_COIL + ERR_VALUES_START, ///< Ошибка записи битовой ячейки
MB _ERR_W_HOLD_REG = MB _W_HOLD_REG + ERR_VALUES_START, ///< Ошибка записи одиночного регистра
MB _ERR_W_COILS = MB _W_COILS + ERR_VALUES_START, ///< Ошибка записи нескольких битовых ячеек
MB _ERR_W_HOLD_REGS = MB _W_HOLD_REGS + ERR_VALUES_START, ///< Ошибка записи нескольких регистров
FC _ERR_W_COIL = FC _W_COIL + FC_ ERR_VALUES_START, ///< Ошибка записи битовой ячейки
FC _ERR_W_HOLD_REG = FC _W_HOLD_REG + FC_ ERR_VALUES_START, ///< Ошибка записи одиночного регистра
FC _ERR_W_COILS = FC _W_COILS + FC_ ERR_VALUES_START, ///< Ошибка записи нескольких битовых ячеек
FC _ERR_W_HOLD_REGS = FC _W_HOLD_REGS + FC_ ERR_VALUES_START, ///< Ошибка записи нескольких регистров
MB _ERR_R_DIAGNOSTIC = MB _R_DIAGNOSTIC + ERR_VALUES_START, ///< Ошибка чтения диагностической информации устройства
MB_ERR_R_DEVICE_INFO = MB _R_DEVICE_INFO + ERR_VALUES_START, ///< Ошибка чтения информации о б устройстве
FC _ERR_R_DIAGNOSTIC = FC _R_DIAGNOSTICS + FC_ ERR_VALUES_START, ///< Ошибка чтения диагностической информации устройства
MB_FC_ ERR_R_DEVICE_INFO = FC _R_DEVICE_ID + FC_ ERR_VALUES_START, ///< Ошибка чтения информации о б устройстве
}MB_FunctonTypeDef;
/** @brief Structure for MEI func codes */
/** @brief Enum for MEI func codes */
typedef enum //MB_FunctonTypeDef
{
MEI_DEVICE_IDENTIFICATIONS = 0x0E,
}MB_MEITypeDef;
/** @brief Structure for comformity */
/**
* @brief Enum for Read Device Id codes
* @details Prefix RID for Read ID
*/
typedef enum //MB_FunctonTypeDef
{
MB _BASIC_IDENTIFICATIONS = 0x01, /*!< @brief Basic Device Identifications.
RID _BASIC_IDENTIFICATIONS = 0x01, /*!< @brief Basic Device Identifications.
@details All objects of this category are mandatory:
VendorName,Product code, and revision number */
VendorName, Product code, and revision number */
MB _REGULAR_IDENTIFICATIONS = 0x02, /*!< @brief Regular Device Identifications.
RID _REGULAR_IDENTIFICATIONS = 0x02, /*!< @brief Regular Device Identifications.
@details The device provides additional and optional
identifications and description data objects */
MB _EXTENDED_IDENTIFICATIONS = 0x03, /*!< @brief Extended Device Identifications.
RID _EXTENDED_IDENTIFICATIONS = 0x03, /*!< @brief Extended Device Identifications.
@details The device provides additional and optional
identifications and description private data about the physical
device itself. All of these data are device dependent. */
MB _SPEDIFIC_IDENTIFICATIONS = 0x04, /*!< @brief Specific Device Identifications.
RID _SPEDIFIC_IDENTIFICATIONS = 0x04, /*!< @brief Specific Device Identifications.
@details The device provides one specific identifications object. */
/* ERRORS */
MB_ERR_BASIC_IDENTIFICATIONS = MB_BASIC_IDENTIFICATIONS + ERR_VALUES_START,
MB_ERR_REGULAR_IDENTIFICATIONS = MB_REGULAR_IDENTIFICATIONS + ERR_VALUES_START,
MB_ERR_EXTENDED_IDENTIFICATIONS = MB_REGULAR_IDENTIFICATIONS + ERR_VALUES_START,
MB_ERR_SPEDIFIC_IDENTIFICATIONS = MB_REGULAR_IDENTIFICATIONS + ERR_VALUES_START,
}MB_ConformityTypeDef;
}ReadDevId;
/** @brief Structure for deciv e identifications message type */
/** @brief Structure for devic e identifications message type */
typedef struct
{
MB_MEITypeDef MEI_Type; ///< MEI Type assigned number for Device Identifications Interface
MB_ConformityTypeDef ReadDevId;
MB_ConformityTypeDef Conformity;
ReadDevId ReadDevId;
uint8_t Conformity; ///< Identification conformity level of the device and type of supported access @ref MODBUS_DEVICE_CONFORMITY
uint8_t MoreFollows;
uint8_t NextObjId;
uint8_t NumbOfObj;
@@ -170,22 +174,22 @@ typedef struct
typedef struct // RS_MsgTypeDef
{
#ifdef MODBUS_PROTOCOL_TCP
uint16_t ID_ Transaction; ///< Modbus TCP: ID Transaction
uint16_t ID_ Protocol; ///< Modbus TCP: ID Protocol
uint16_t PDU_ Length; ///< Modbus TCP: PDU_ Length
uint16_t TransactionID ; ///< Modbus TCP: ID Transaction
uint16_t ProtocolID ; ///< Modbus TCP: ID Protocol
uint16_t PDULength; ///< Modbus TCP: PDU Length
#endif
uint8_t MbAddr; ///< Modbus Slave Address
MB_FunctonTypeDef Func_ Code; ///< Modbus Function Code
MB_FunctonTypeDef FuncCode; ///< Modbus Function Code
MB_DevIdMsgTypeDef DevId; ///< Read Device Identifications Header struct
uint16_t Addr; ///< Modbus Address of data
uint16_t Qnt; ///< Quantity of modbus data
uint8_t ByteCnt; ///< Quantity of bytes of data in message to transmit/receive
uint16_t DATA [DATA_SIZE]; ///< Modbus Data
uint16_t MbData [DATA_SIZE]; ///< Modbus Data
MB_ExceptionTypeDef Except_Code; ///< Exception Code for the command
uint16_t MB_ CRC; ///< Modbus CRC
uint16_t Mb CRC; ///< Modbus CRC
}RS_MsgTypeDef;
//--------------------------------------------------
extern RS_MsgTypeDef MODBUS_MSG;
@@ -306,4 +310,4 @@ MB_ExceptionTypeDef MB_DefineCoilsAddress(uint16_t **pCoils, uint16_t Addr, uint
#endif //__MODBUS_CORE_H_
/** MODBUS_INTERNAL
* @}
*/
*/