Modbus 0.3
Библиотека Modbus для STM
Loading...
Searching...
No Matches
modbus_core.h
Go to the documentation of this file.
1/**
2*******************************************************************************
3* @file modbus_core.h
4* @brief Ядро Modbus протокола - определения и структуры
5*******************************************************************************
6@addtogroup MODBUS_INTERNAL Modbus Internal Tools
7@ingroup MODBUS
8@brief Внутренние штуки библиотеки
9@{
10*******************************************************************************
11* @details
12Базовые определения для реализации Modbus RTU устройства:
13- Структуры сообщений Modbus
14Коды функций и исключений
15Константы размеров полей
16Вспомогательные макросы
17
18@section msg Структура сообщения:
19[ADDR][FUNC][DATA...][CRC]
20- Адрес: 1 байт
21- Функция: 1 байт
22- Данные: переменной длины
23- CRC: 2 байта
24
25******************************************************************************/
26#ifndef __MODBUS_CORE_H_
27#define __MODBUS_CORE_H_
28
29#include "modbus_config.h"
30#include "modbus_data.h"
31#include "__crc_algs.h"
32#include "__modbus_compat.h"
33
34/**
35 * @addtogroup MODBUS_MESSAGE_DEFINES Modbus Message Tools
36 * @ingroup MODBUS
37 * @brief Определения протокола модбас
38 * @{
39 */
40
41/////////////////////////////////////////////////////////////////////
42////////////////////---MODBUS MESSAGE DEFINES---/////////////////////
43//-------------DEFINES FOR STRUCTURE----------------
44/* defines for structure of modbus message */
45#define TransactionID_size 2 ///< size of (Transaction ID)
46#define ProtocolID_size 2 ///< size of (Protocol ID)
47#define PDULength_size 2 ///< size of (PDU Length)
48#define MbAddr_SIZE 1 ///< size of (Slave Addr)
49#define Func_Code_SIZE 1 ///< size of (Function Code)
50#define Addr_SIZE 2 ///< size of (Address)
51#define Qnt_SIZE 2 ///< size of (Quantity)
52#define ByteCnt_SIZE 1 ///< size of (Byte Count)
53#define DATA_SIZE 125 ///< maximum number of data: DWORD (NOT MESSAGE SIZE)
54#define CRC_SIZE 2 ///< size of (MbCRC) in bytes
55
56#ifndef MODBUS_PROTOCOL_TCP
57/** @brief Size of whole RTU message */
58#define INFO_SIZE_MAX (MbAddr_SIZE+Func_Code_SIZE+Addr_SIZE+Qnt_SIZE+ByteCnt_SIZE)
59#else
60/** @brief Size of whole TCP message */
61#define INFO_SIZE_MAX (TransactionID_size+ProtocolID_size+PDULength_size+MbAddr_SIZE+Func_Code_SIZE+Addr_SIZE+Qnt_SIZE)
62#endif
63
64/** @brief Size of first part of message that will be received
65first receive info part of message, than defines size of rest message*/
66#define RX_FIRST_PART_SIZE INFO_SIZE_MAX
67
68/** @brief Size of buffer: max size of whole message */
69#define MSG_SIZE_MAX (INFO_SIZE_MAX + DATA_SIZE*2 + CRC_SIZE) // max possible size of message
70
71/**
72 * @brief Enum for modbus exception codes
73 * @details Prefix ET for Error Type
74 */
75typedef enum //MB_ExceptionTypeDef
76{
77 // reading
78 ET_NO_ERRORS = 0x00, ///< no errors
79 ET_ILLEGAL_FUNCTION = 0x01, ///< Принятый код функции не может быть обработан
80 ET_ILLEGAL_DATA_ADDRESS = 0x02, ///< Адрес данных, указанный в запросе, недоступен
81 ET_ILLEGAL_DATA_VALUE = 0x03, ///< Значение, содержащееся в поле данных запроса, является недопустимой величиной
82 ET_SLAVE_DEVICE_FAILURE = 0x04, ///< Невосстанавливаемая ошибка имела место, пока ведомое устройство пыталось выполнить затребованное действие
83// ET_ACKNOWLEDGE = 0x05, ///< idk
84// ET_SLAVE_DEVICE_BUSY = 0x06, ///< idk
85// ET_MEMORY_PARITY_ERROR = 0x08, ///< idk
87
88#define FC_ERR_VALUES_START 0x80U ///< from this value starts error func codes
89/**
90 * @brief Enum for modbus func codes
91 * @details Prefix FC for Function Code
92 */
93typedef enum //MB_FunctonTypeDef
94{
95 /* COMMANDS */
96 // reading
97 FC_R_COILS = 0x01, ///< Чтение битовых ячеек
98 FC_R_DISC_IN = 0x02, ///< Чтение дискретных входов
99#ifndef MODBUS_SWITCH_COMMAND_R_IN_REGS_AND_R_HOLD_REGS
100 FC_R_HOLD_REGS = 0x03, ///< Чтение входных регистров
101 FC_R_IN_REGS = 0x04, ///< Чтение регистров хранения
102#else
103 FC_R_HOLD_REGS = 0x04, ///< Чтение входных регистров
104 FC_R_IN_REGS = 0x03, ///< Чтение регистров хранения
105#endif
106
107 // writting
108 FC_W_COIL = 0x05, ///< Запись битовой ячейки
109 FC_W_HOLD_REG = 0x06, ///< Запись одиночного регистра
110 FC_W_COILS = 0x0F, ///< Запись нескольких битовых ячеек
111 FC_W_HOLD_REGS = 0x10, ///< Запись нескольких регистров
112
113 FC_R_DIAGNOSTICS = 0x08, ///< Чтение диагностической информации устройства
114 FC_R_DEVICE_ID = 0x2B, ///< Чтение информации об устройстве
115
116 /* ERRORS */
117 // error reading
118 FC_ERR_R_COILS = FC_R_COILS + FC_ERR_VALUES_START, ///< Ошибка чтения битовых ячеек
119 FC_ERR_R_DISC_IN = FC_R_DISC_IN + FC_ERR_VALUES_START, ///< Ошибка чтения дискретных входов
120 FC_ERR_R_IN_REGS = FC_R_IN_REGS + FC_ERR_VALUES_START, ///< Ошибка чтения регистров хранения
121 FC_ERR_R_HOLD_REGS = FC_R_HOLD_REGS + FC_ERR_VALUES_START, ///< Ошибка чтения входных регистров
122
123 // error writting
124 FC_ERR_W_COIL = FC_W_COIL + FC_ERR_VALUES_START, ///< Ошибка записи битовой ячейки
125 FC_ERR_W_HOLD_REG = FC_W_HOLD_REG + FC_ERR_VALUES_START, ///< Ошибка записи одиночного регистра
126 FC_ERR_W_COILS = FC_W_COILS + FC_ERR_VALUES_START, ///< Ошибка записи нескольких битовых ячеек
127 FC_ERR_W_HOLD_REGS = FC_W_HOLD_REGS + FC_ERR_VALUES_START, ///< Ошибка записи нескольких регистров
128
129 FC_ERR_R_DIAGNOSTIC = FC_R_DIAGNOSTICS + FC_ERR_VALUES_START, ///< Ошибка чтения диагностической информации устройства
130 FC_ERR_R_DEVICE_INFO = FC_R_DEVICE_ID + FC_ERR_VALUES_START, ///< Ошибка чтения информации об устройстве
132
133/** @brief Enum for MEI func codes */
134typedef enum //MB_FunctonTypeDef
135{
136 MEI_DEVICE_IDENTIFICATIONS = 0x0E,
138
139/**
140 * @brief Enum for Read Device Id codes
141 * @details Prefix RID for Read ID
142 */
143typedef enum //MB_FunctonTypeDef
144{
145 RID_BASIC_IDENTIFICATIONS = 0x01, /*!< @brief Basic Device Identifications.
146 @details All objects of this category are mandatory:
147 VendorName, Product code, and revision number */
148
149 RID_REGULAR_IDENTIFICATIONS = 0x02, /*!< @brief Regular Device Identifications.
150 @details The device provides additional and optional
151 identifications and description data objects */
152
153 RID_EXTENDED_IDENTIFICATIONS = 0x03, /*!< @brief Extended Device Identifications.
154 @details The device provides additional and optional
155 identifications and description private data about the physical
156 device itself. All of these data are device dependent. */
157
158 RID_SPEDIFIC_IDENTIFICATIONS = 0x04, /*!< @brief Specific Device Identifications.
159 @details The device provides one specific identifications object. */
160
161}ReadDevId;
162
163/** @brief Structure for device identifications message type */
164typedef struct
165{
166 MB_MEITypeDef MEI_Type; ///< MEI Type assigned number for Device Identifications Interface
167 ReadDevId ReadDevId;
168 uint8_t Conformity; ///< Identification conformity level of the device and type of supported access @ref MODBUS_DEVICE_CONFORMITY
169 uint8_t MoreFollows;
170 uint8_t NextObjId;
171 uint8_t NumbOfObj;
173
174
175/** @brief Structure for modbus messsage */
176typedef struct // RS_MsgTypeDef
177{
178#ifdef MODBUS_PROTOCOL_TCP
179 uint16_t TransactionID; ///< Modbus TCP: ID Transaction
180 uint16_t ProtocolID; ///< Modbus TCP: ID Protocol
181 uint16_t PDULength; ///< Modbus TCP: PDU Length
182#endif
183
184 uint8_t MbAddr; ///< Modbus Slave Address
185 MB_FunctonTypeDef FuncCode; ///< Modbus Function Code
186 MB_DevIdMsgTypeDef DevId; ///< Read Device Identifications Header struct
187 uint16_t Addr; ///< Modbus Address of data
188 uint16_t Qnt; ///< Quantity of modbus data
189 uint8_t ByteCnt; ///< Quantity of bytes of data in message to transmit/receive
190
191 uint16_t MbData[DATA_SIZE]; ///< Modbus Data
192 MB_ExceptionTypeDef Except_Code; ///< Exception Code for the command
193
194 uint16_t MbCRC; ///< Modbus CRC
196//--------------------------------------------------
198////////////////////---MODBUS MESSAGE DEFINES---/////////////////////
199
200
201
202/////////////////////////////////////////////////////////////////////
203////////////////////---MODBUS FUNCTION DEFINES---////////////////////
204
205/**
206 * @brief Macros to set pointer to 16-bit array
207 * @param _arr_ - массив регистров (16-бит).
208 */
209#define MB_Set_Arr16_Ptr(_arr_) ((uint16_t*)(&(_arr_)))
210/**
211 * @brief Macros to set pointer to register
212 * @param _parr_ - массив регистров.
213 * @param _addr_ - Номер регистра (его индекс) от начала массива _arr_.
214 */
215#define MB_Set_Register_Ptr(_parr_, _addr_) ((uint16_t *)(_parr_)+(_addr_))
216
217/**
218 * @brief Макрос для установки указателя на регистр, содержащий запрашиваемый коил
219 * @param _parr_ - массив коилов.
220 * @param _coil_ - Номер коила от начала массива _arr_.
221 * @note Используется вместе с @ref MB_Set_Coil_Mask
222 @code Пояснение выражений
223 - (_coil_/16) - индекс регистра, в котором содержится коил по адресу _coil_
224
225Визуальный пример: 30 коил будет в 30/16 = 1 регистре (индексация с 0)
226 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxCx
227 |register[0]----| |register[1]----|
228 |skip this------| |get this-------|
229 |shift to 14 bit|
230 @endcode
231 */
232#define MB_Set_Coil_Reg_Ptr(_parr_, _coil_) ((uint16_t *)(_parr_)+((_coil_)/16))
233/**
234 * @brief Макрос для установки маски, чтобы выделить запрашиваемый коил из регистра
235 * @param _coil_ - Номер коила от начала массива _arr_.
236 * @note Используется вместе с @ref MB_Set_Coil_Reg_Ptr
237 @code Пояснение выражений
238 - (16*(_coil_/16) - сколько коилов нужно пропустить. прим. (16*30/16) - первые 16 коилов находятся вне регистра
239 - _coil_-(16*(_coil_/16)) - сдвинуть бит на место запрашиваемого коила в регистре
240
241 Визуальный пример: 30 коил будет регистре[1], на 14 бите:
242 register = 30/16 = 1
243 bit = 30 - (16*30/16) = 30 - 16 = 14
244
245 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxCx
246 |register[0]----| |register[1]----|
247 |skip this------| |get this-------|
248 |shift to 14 bit|
249 @endcode
250 */
251#define MB_Set_Coil_Mask(_coil_) (1 << ( _coil_ - (16*((_coil_)/16)) ))
252
253/** GENERAL_MODBUS_STUFF
254 * @}
255 */
256
257
258//------------------OTHER DEFINES-------------------
259#define RegisterType_Holding 0
260#define RegisterType_Input 1
261#define RegisterType_Discrete 2
262// create hadnles and settings for uart, tim, rs with _modbus_ name
263//--------------------------------------------------
264
265#ifndef Divide_Up
266/**
267 * @brief Calc dividing including remainder
268 * @param _val_ - делимое.
269 * @param _div_ - делитель.
270 * @details Если результат деления без остатка: он возвращается как есть
271 Если с остатком - округляется вверх
272 */
273//#define Divide_Up(_val_, _div_) (((_val_)%(_div_))? (_val_)/(_div_)+1 : (_val_)/_div_) /* через тернарный оператор */
274#define Divide_Up(_val_, _div_) ((_val_ - 1) / _div_) + 1 /* через мат выражение */
275#endif
276
277#ifndef ByteSwap16
278/**
279 * @brief Swap between Little Endian and Big Endian
280 * @param v - Переменная для свапа.
281 * @return v (new) - Свапнутая переменная.
282 * @details Переключения между двумя типами хранения слова: HI-LO байты и LO-HI байты.
283 */
284#define ByteSwap16(v) (((v&0xFF00) >> (8)) | ((v&0x00FF) << (8)))
285#endif
286////////////////////---MODBUS MESSAGE DEFINES---/////////////////////
287
288
289/////////////////////////////////////////////////////////////////////
290/////////////////////////---FUNCTIONS---/////////////////////////////
291
292/**
293 * @addtogroup MODBUS_CMD_PROCESS_FUNCTIONS
294 * @{
295 */
296
297/* Реализация этих функций лежит в modbus_data.c */
298
299/* Check is address valid for certain array */
300MB_ExceptionTypeDef MB_Check_Address_For_Arr(uint16_t Addr, uint16_t Qnt, uint16_t R_ARR_ADDR, uint16_t R_ARR_NUMB);
301/* Define Address Origin for Input/Holding Registers */
302MB_ExceptionTypeDef MB_DefineRegistersAddress(uint16_t **pRegs, uint16_t Addr, uint16_t Qnt, uint8_t RegisterType);
303/* Define Address Origin for coils */
304MB_ExceptionTypeDef MB_DefineCoilsAddress(uint16_t **pCoils, uint16_t Addr, uint16_t Qnt, uint16_t *start_shift, uint8_t WriteFlag);
305/** MODBUS_CMD_PROCESS_FUNCTIONS
306 * @}
307 */
308
309
310
311/////////////////////////---FUNCTIONS---/////////////////////////////
312#endif //__MODBUS_CORE_H_
313/** MODBUS_INTERNAL
314 * @}
315 */
Модуль для совместимости библиотеки MODBUS.
MB_ExceptionTypeDef MB_DefineRegistersAddress(uint16_t **pRegs, uint16_t Addr, uint16_t Qnt, uint8_t RegisterType)
Define Address Origin for Input/Holding Registers.
MB_ExceptionTypeDef MB_Check_Address_For_Arr(uint16_t Addr, uint16_t Qnt, uint16_t R_ARR_ADDR, uint16_t R_ARR_NUMB)
Check is address valid for certain array.
MB_ExceptionTypeDef MB_DefineCoilsAddress(uint16_t **pCoils, uint16_t Addr, uint16_t Qnt, uint16_t *start_shift, uint8_t WriteFlag)
Define Address Origin for coils.
MB_FunctonTypeDef
Enum for modbus func codes.
Definition modbus_core.h:94
MB_ExceptionTypeDef
Enum for modbus exception codes.
Definition modbus_core.h:76
ReadDevId
Enum for Read Device Id codes.
RS_MsgTypeDef MODBUS_MSG
Default Message Struct for Modbus.
Definition modbus.c:25
#define FC_ERR_VALUES_START
from this value starts error func codes
Definition modbus_core.h:88
MB_MEITypeDef
Enum for MEI func codes.
#define DATA_SIZE
maximum number of data: DWORD (NOT MESSAGE SIZE)
Definition modbus_core.h:53
@ FC_ERR_R_DEVICE_INFO
Ошибка чтения информации об устройстве
@ FC_W_HOLD_REG
Запись одиночного регистра
@ FC_ERR_W_HOLD_REG
Ошибка записи одиночного регистра
@ FC_R_DEVICE_ID
Чтение информации об устройстве
@ FC_R_COILS
Чтение битовых ячеек
Definition modbus_core.h:97
@ FC_R_DISC_IN
Чтение дискретных входов
Definition modbus_core.h:98
@ FC_W_COILS
Запись нескольких битовых ячеек
@ FC_ERR_W_HOLD_REGS
Ошибка записи нескольких регистров
@ FC_ERR_R_DISC_IN
Ошибка чтения дискретных входов
@ FC_ERR_R_COILS
Ошибка чтения битовых ячеек
@ FC_R_IN_REGS
Чтение регистров хранения
@ FC_W_COIL
Запись битовой ячейки
@ FC_ERR_R_DIAGNOSTIC
Ошибка чтения диагностической информации устройства
@ FC_R_DIAGNOSTICS
Чтение диагностической информации устройства
@ FC_ERR_W_COIL
Ошибка записи битовой ячейки
@ FC_ERR_R_HOLD_REGS
Ошибка чтения входных регистров
@ FC_ERR_R_IN_REGS
Ошибка чтения регистров хранения
@ FC_R_HOLD_REGS
Чтение входных регистров
@ FC_ERR_W_COILS
Ошибка записи нескольких битовых ячеек
@ FC_W_HOLD_REGS
Запись нескольких регистров
@ ET_ILLEGAL_DATA_VALUE
Значение, содержащееся в поле данных запроса, является недопустимой величиной
Definition modbus_core.h:81
@ ET_NO_ERRORS
no errors
Definition modbus_core.h:78
@ ET_SLAVE_DEVICE_FAILURE
Невосстанавливаемая ошибка имела место, пока ведомое устройство пыталось выполнить затребованное дейс...
Definition modbus_core.h:82
@ ET_ILLEGAL_FUNCTION
Принятый код функции не может быть обработан
Definition modbus_core.h:79
@ ET_ILLEGAL_DATA_ADDRESS
Адрес данных, указанный в запросе, недоступен
Definition modbus_core.h:80
@ RID_REGULAR_IDENTIFICATIONS
Regular Device Identifications.
@ RID_SPEDIFIC_IDENTIFICATIONS
Specific Device Identifications.
@ RID_BASIC_IDENTIFICATIONS
Basic Device Identifications.
@ RID_EXTENDED_IDENTIFICATIONS
Extended Device Identifications.
Конфигурационные параметры Modbus устройства
Определения структур данных Modbus устройства
Structure for device identifications message type.
uint8_t Conformity
Identification conformity level of the device and type of supported access MODBUS_DEVICE_CONFORMITY.
MB_MEITypeDef MEI_Type
MEI Type assigned number for Device Identifications Interface.
Structure for modbus messsage.
MB_FunctonTypeDef FuncCode
Modbus Function Code.
uint16_t Qnt
Quantity of modbus data.
uint8_t MbAddr
Modbus Slave Address.
MB_ExceptionTypeDef Except_Code
Exception Code for the command.
uint16_t MbCRC
Modbus CRC.
MB_DevIdMsgTypeDef DevId
Read Device Identifications Header struct.
uint8_t ByteCnt
Quantity of bytes of data in message to transmit/receive.
uint16_t MbData[DATA_SIZE]
Modbus Data.
uint16_t Addr
Modbus Address of data.