Modbus 0.3
Библиотека Modbus для STM
Loading...
Searching...
No Matches
rs_message.h
Go to the documentation of this file.
1/**
2*******************************************************************************
3* @file rs_message.h
4* @brief Библиотека обмена сообщениями по RS-интерфейсу
5*******************************************************************************
6@defgroup RS_TOOLS RS Tools
7@brief Всякое для работы по UART/RS
8@{
9*******************************************************************************
10* @details
11Универсальная библиотека для работы с последовательными протоколами (Modbus, Custom)
12через UART в режиме прерываний с поддержкой таймаутов.
13
14@section posibility Основные возможности:
15- Прием/передача в прерываниях
16- Обработка IDLE линии для определения конца фрейма
17- Таймауты приема через TIM
18- Гибкая настройка размера сообщений
19
20@section usage Использование:
211. Определить структуру сообщения и размеры буфера
222. Реализовать weak-функции обработки сообщений
233. Добавить вызовы RS_UART_Handler/RS_TIM_Handler в прерывания
244. Инициализировать через RS_Init() и запустить прием RS_Receive_IT()
25
26@section features Особенности:
27- Буфер: RS_Buffer[MSG_SIZE_MAX] Общий для приема/передачи
28- Состояния: отслеживается через флаги в RS_HandleTypeDef
29- Таймауты: контролируют максимальное время ожидания фрейма
30******************************************************************************/
31#ifndef __RS_LIB_H_
32#define __RS_LIB_H_
33
34#include "modbus_core.h"
35
36/////////////////////////////////////////////////////////////////////
37////////////////////////////---DEFINES---////////////////////////////
38/* Check that all defines required by RS are defined */
39#ifndef MSG_SIZE_MAX
40#error Define MSG_SIZE_MAX (Maximum size of message). This is necessary to create buffer for UART.
41#endif
42
43/**
44 * @cond Заглушки и внутренний недокументированный стаф
45 */
46
47/* Clear message-uart buffer */
48#define RS_Clear_Buff(_buff_) for(int i=0; i<MSG_SIZE_MAX;i++) _buff_[i] = NULL
49
50/* Set/Reset flags */
51#define RS_Set_Free(_hRS_) _hRS_->f.RS_Busy = 0
52#define RS_Set_Busy(_hRS_) _hRS_->f.RS_Busy = 1
53
54#define RS_Set_RX_Flags(_hRS_) _hRS_->f.RX_Busy = 1; _hRS_->f.RX_Done = 0;
55#define RS_Set_RX_Active_Flags(_hRS_) _hRS_->f.RX_Ongoing = 1
56
57
58#define RS_Set_TX_Flags(_hRS_) _hRS_->f.TX_Busy = 1; _hRS_->f.TX_Done = 0
59
60#define RS_Reset_RX_Active_Flags(_hRS_) _hRS_->f.RX_Ongoing = 0; _hRS_->f.RX_Continue = 0;
61#define RS_Reset_RX_Flags(_hRS_) RS_Reset_RX_Active_Flags(_hRS_); _hRS_->f.RX_Busy = 0; _hRS_->f.RX_Done = 0;
62#define RS_Reset_TX_Flags(_hRS_) _hRS_->f.TX_Busy = 0; _hRS_->f.TX_Done = 0
63
64#define RS_Set_RX_End_Flag(_hRS_) _hRS_->f.RX_Done = 1;
65#define RS_Set_TX_End_Flag(_hRS_) _hRS_->f.TX_Done = 1
66
67#define RS_Set_RX_End(_hRS_) RS_Reset_RX_Flags(_hRS_); RS_Set_RX_End_Flag(_hRS_)
68#define RS_Set_TX_End(_hRS_) RS_Reset_TX_Flags(_hRS_); RS_Set_TX_End_Flag(_hRS_)
69
70/* Clear all RS stuff */
71#define RS_Clear_All(_hRS_) RS_Clear_Buff(_hRS_->pBufferPtr); RS_Reset_RX_Flags(_hRS_); RS_Reset_TX_Flags(_hRS_);
72
73//#define MB_Is_RX_Busy(_hRS_) ((_hRS_->huart->gState&HAL_USART_STATE_BUSY_RX) == HAL_USART_STATE_BUSY_RX)
74//#define MB_Is_TX_Busy(_hRS_) ((_hRS_->huart->gState&HAL_USART_STATE_BUSY_RX) == HAL_USART_STATE_BUSY_TX)
75#define RS_Is_RX_Busy(_hRS_) (_hRS_->f.RX_Busy == 1)
76#define RS_Is_TX_Busy(_hRS_) (_hRS_->f.TX_Busy == 1)
77
78
79#ifndef RS_USER_VARS_NUMB
80#define RS_USER_VARS_NUMB 0
81#endif
82
83#ifndef local_time
84#define local_time() uwTick
85#endif
86/** @endcond */
87
88
89/**
90 * @addtogroup RS_DEBUG Tools for debug RS/UART/TIM
91 * @ingroup RS_TOOLS
92 * @brief Дефайны для отладки периферии
93 * @{
94 */
95
96#ifndef RS_USER_VARS_NUMB
97#define RS_USER_VARS_NUMB 0 ///< Количество переменных в @ref TrackerTypeDef
98#endif
99
100/**
101 * @brief Тип структуры для счетчиков-переменных
102 * @param num_user_vars Есть возмоность добавления num_user_vars количества пользовательскиъх переменных
103 */
104#define TrackerTypeDef(num_user_vars) void *
105/** @brief Инкрементировать переменную - успешных событий */
106#define TrackerCnt_Ok(_cntstruct_)
107/** @brief Инкрементировать переменную - ошибок */
108#define TrackerCnt_Err(_cntstruct_)
109/** @brief Инкрементировать переменную - предупреждений */
110#define TrackerCnt_Warn(_cntstruct_)
111
112
113
114#ifndef printf_rs
115/** @brief Printf обычных событий RS/UART/TIM */
116#define printf_rs(...)
117#endif
118
119#ifndef printf_rs_err
120/** @brief Printf ошибок RS/UART/TIM */
121#define printf_rs_err(...)
122#endif
123
124
125#ifndef RS_TIM_Handler_ENTER
126/** @brief Действия при заходе в прерывания таймера */
127#define RS_TIM_Handler_ENTER()
128#endif
129#ifndef RS_TIM_Handler_EXIT
130/** @brief Действия при выходе из прерывания таймера */
131#define RS_TIM_Handler_EXIT()
132#endif
133
134#ifndef RS_UART_Handler_ENTER
135/** @brief Действия при заходе в прерывания UART */
136#define RS_UART_Handler_ENTER()
137#endif
138#ifndef RS_UART_Handler_EXIT
139/** @brief Действия при выходе из прерывания UART */
140#define RS_UART_Handler_EXIT()
141#endif
142/** RS_TOOLS
143 * @}
144 */
145
146
147
148// направление передачи rs485
149#ifndef RS_EnableReceive
150#define RS_EnableReceive() ///< Функция изменения направления передачи на ПРИЕМ для RS-485
151#endif
152#ifndef RS_EnableTransmit
153#define RS_EnableTransmit() ///< Функция изменения направления передачи на ПЕРЕДАЧУ для RS-485
154#endif
155////////////////////////////---DEFINES---////////////////////////////
156
157
158
159/////////////////////////////////////////////////////////////////////
160///////////////////////---STRUCTURES & ENUMS---//////////////////////
161//------------------ENUMERATIONS--------------------
162/** @brief Enums for respond CMD about RS status */
163typedef enum // RS_StatusTypeDef
164{
165 /* IN-CODE STATUS (start from 0x01, and goes up)*/
166 /*0x01*/ RS_OK = 0x01,
167 /*0x02*/ RS_ERR,
168 /*0x03*/ RS_ABORTED,
169 /*0x04*/ RS_BUSY,
170 /*0x05*/ RS_SKIP,
171 /*0x06*/ RS_TIMEOUT,
172
173 /*0x07*/ RS_COLLECT_MSG_ERR,
174 /*0x08*/ RS_PARSE_MSG_ERR,
175
176 // reserved values
177// /*0x00*/ RS_UNKNOWN_ERR = 0x00, ///< reserved for case, if no one error founded (nothing changed response from zero)
179
180
181#define RS_MASTER_MODE_START 0x3 ///< Начало режимов мастера (до него - режим слейв)
182/** @brief Enums for RS Modes */
183typedef enum // RS_ModeTypeDef
184{
185 RS_SLAVE_ALWAYS_WAIT = 0x01, ///< Слейв в постоянном ожидании
186 RS_RESERVED = 0x02, ///< резерв
187 RS_MASTER_REQUEST = 0x03, ///< Мастер с ручным запросом
188 //RS_MASTER_POLLING = 0x04, ///< Мастер с опросом в фоновом режиме
190
191/** @brief Enums for Abort modes */
192typedef enum // RS_AbortTypeDef
193{
194 ABORT_TX = 0x01, ///< Отменить передачу
195 ABORT_RX = 0x02, ///< Отменить прием
196 ABORT_RX_TX = 0x03, ///< Отменить прием и передачу
197 ABORT_RS = 0x04, ///< Отменить любую работу UART в целом
199
200//-----------STRUCTURE FOR HANDLE RS------------
201/** @brief Struct for flags RS */
202typedef struct
203{
204 unsigned RS_Busy:1; ///< 1 - RS занят, 0 - RS свободен
205 unsigned RX_Ongoing:1; ///< 1 - Прием данных в активном состоянии, 0 - Ожидаем начало приема данных
206
207 unsigned RX_Busy:1; ///< 1 - Режим приема активен, 0 - Прием не активен
208 unsigned TX_Busy:1; ///< 1 - Режим передачи активен, 0 - Прием не активен
209
210 unsigned RX_Done:1; ///< 1 - Прием закончен, 0 - Прием еще в процессе или не инициализирован
211 unsigned TX_Done:1; ///< 1 - Передача закончена, 0 - Передача еще в процессе или не инициализирована
212
213 // Выставление следующие флагов определяет пользователь
214 unsigned RX_Continue:1; ///< 0 - Продолжить принимать, 0 - Начать прием сначала
215 unsigned MessageHandled:1; ///< 1 - Обработка запроса успешна, 0 - Обработка запроса в процессе или ошибка
216 unsigned EchoResponse:1; ///< 1 - Ответить эхом, 0 - Ответить своим сообщением
217 unsigned DeferredResponse:1; ///< 1 - Не начинать передачу в IT, 0 - Ответить в прерывании
218 unsigned DataUpdated:1; ///< 1 - Данные были обновлены
220
221
222
223/**
224 * @brief Handle for RS communication.
225 * @note Prefixes: h - handle, s - settings, f - flag
226 */
227typedef struct // RS_HandleTypeDef
228{
229 /* MESSAGE */
230 uint8_t ID; ///< ID хендла
231 RS_MsgTypeDef *pMessagePtr; ///< Указатель на структуру протокола
232 uint8_t *pBufferPtr; ///< Указатеь на буфер UART
233 int32_t RS_Message_Size; ///< size of whole message, not only data
234
235 /* HANDLERS and SETTINGS */
236 UART_HandleTypeDef *huart; ///< Хендл UART
237 TIM_HandleTypeDef *htim; ///< Хендл TIM
238 RS_ModeTypeDef sRS_Mode; ///< Настройка: слейв/мастер @ref RS_ModeTypeDef
239 uint16_t sRS_Timeout; ///< Настройка: Таймаут в тиках таймера
240 void (*pCallback)(void*, void*); ///< Указатель на коллбек: принят ответ в режиме мастер
241
242 /* FLAGS */
243 RS_FlagsTypeDef f; ///< Флаги для контроля приема/передачи
244
245 /* RS STATUS */
246 uint32_t lastPacketTick; ///< Время последнего принятого пакета
247 RS_StatusTypeDef RS_STATUS; ///< Статус RS
248
252
253
254///////////////////////---STRUCTURES & ENUMS---//////////////////////
255
256
257/////////////////////////////////////////////////////////////////////
258///////////////////////////---FUNCTIONS---///////////////////////////
259//----------------FUNCTIONS FOR PROCESSING MESSAGE-------------------
260/*--------------------Defined by users purposes--------------------*/
261/* Пользовательская функция для ответа на запрос по UART */
263
264/* Пользовательская функция для обработки принятого ответа по UART */
265__weak RS_StatusTypeDef RS_Response_Callback(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg);
266
267/* Пользовательская функция для сбора сообщения в буфер UART */
268RS_StatusTypeDef RS_Collect_Message(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg, uint8_t *msg_uart_buff);
269
270/* Пользовательская функция для парса сообщения из буфера UART */
271RS_StatusTypeDef RS_Parse_Message(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg, uint8_t *msg_uart_buff);
272
273
274//-------------------------GENERAL FUNCTIONS-------------------------
275/*-----------------Should be called from main code-----------------*/
276/* Начать прием по прерываниям */
278
279/* Начать передачу по прерываниям */
281
282/* Инициалазация структуры @ref RS_HandleTypeDef */
283RS_StatusTypeDef RS_Init(RS_HandleTypeDef *hRS, UART_HandleTypeDef *huart, TIM_HandleTypeDef *htim, uint8_t *pRS_BufferPtr);
284
285/* Отменить прием/передачу RS/UART */
287//-------------------------GENERAL FUNCTIONS-------------------------
288
289
290//-------------------------------------------------------------------
291//--------------------CALLBACK/HANDLER FUNCTIONS---------------------
292/* Обработчик для начала приема */
294/* Обработчик для начала передачи */
296/* UART TX Callback: коллбек после окончания передачи */
298/* Обработчик прерывания UART */
300/* Обработчик прерывания TIM */
302/* Запуск таймаута приема. */
304/* Остановка таймаута приема. */
306/* Обновление (сброс) таймаута приема. */
308//--------------------CALLBACK/HANDLER FUNCTIONS---------------------
309///////////////////////////---FUNCTIONS---///////////////////////////
310
311/** RS_TOOLS
312 * @}
313 */
314
315#endif // __RS_LIB_H_
#define RS_USER_VARS_NUMB
Количество переменных в TrackerTypeDef.
Definition rs_message.h:97
#define TrackerTypeDef(num_user_vars)
Тип структуры для счетчиков-переменных
Definition rs_message.h:104
RS_ModeTypeDef
Enums for RS Modes.
Definition rs_message.h:184
RS_StatusTypeDef RS_Receive_IT(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg)
Начать прием по прерываниям.
Definition rs_message.c:43
RS_StatusTypeDef RS_Collect_Message(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg, uint8_t *msg_uart_buff)
Пользовательская функция для сбора сообщения в буфер UART.
Definition modbus.c:193
RS_StatusTypeDef RS_Timeout_Stop(RS_HandleTypeDef *hRS)
Остановка таймаута приема.
Definition rs_message.c:491
RS_StatusTypeDef RS_Abort(RS_HandleTypeDef *hRS, RS_AbortTypeDef AbortMode)
Отменить прием/передачу RS/UART.
Definition rs_message.c:193
void RS_TIM_Handler(RS_HandleTypeDef *hRS)
Обработчик прерывания TIM.
Definition rs_message.c:433
RS_StatusTypeDef RS_Transmit_IT(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg)
Начать передачу по прерываниям.
Definition rs_message.c:91
RS_StatusTypeDef RS_Handle_Transmit_Start(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg)
Обработчик для начала передачи.
Definition rs_message.c:269
RS_StatusTypeDef RS_Parse_Message(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg, uint8_t *msg_uart_buff)
Пользовательская функция для парса сообщения из буфера UART.
Definition modbus.c:205
RS_StatusTypeDef RS_UART_TxCpltCallback(RS_HandleTypeDef *hRS)
UART TX Callback: коллбек после окончания передачи.
Definition rs_message.c:300
RS_StatusTypeDef
Enums for respond CMD about RS status.
Definition rs_message.h:164
RS_StatusTypeDef RS_Response(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg)
Пользовательская функция для ответа на запрос по UART.
Definition modbus.c:184
RS_StatusTypeDef RS_Init(RS_HandleTypeDef *hRS, UART_HandleTypeDef *huart, TIM_HandleTypeDef *htim, uint8_t *pRS_BufferPtr)
Инициалазация структуры RS_HandleTypeDef.
Definition rs_message.c:156
void RS_UART_Handler(RS_HandleTypeDef *hRS)
Обработчик прерывания UART.
Definition rs_message.c:320
RS_StatusTypeDef RS_Handle_Receive_Start(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg)
Обработчик для начала приема.
Definition rs_message.c:237
RS_AbortTypeDef
Enums for Abort modes.
Definition rs_message.h:193
RS_StatusTypeDef RS_Timeout_Start(RS_HandleTypeDef *hRS)
Запуск таймаута приема.
Definition rs_message.c:471
RS_StatusTypeDef RS_Timeout_Update(RS_HandleTypeDef *hRS)
Обновление (сброс) таймаута приема.
Definition rs_message.c:509
RS_HandleTypeDef hmodbus1
Default Handle for Modbus.
Definition modbus.c:24
@ RS_MASTER_REQUEST
Мастер с ручным запросом
Definition rs_message.h:187
@ RS_RESERVED
резерв
Definition rs_message.h:186
@ RS_SLAVE_ALWAYS_WAIT
Слейв в постоянном ожидании
Definition rs_message.h:185
@ ABORT_RS
Отменить любую работу UART в целом
Definition rs_message.h:197
@ ABORT_TX
Отменить передачу
Definition rs_message.h:194
@ ABORT_RX_TX
Отменить прием и передачу
Definition rs_message.h:196
@ ABORT_RX
Отменить прием
Definition rs_message.h:195
Ядро Modbus протокола - определения и структуры
Struct for flags RS.
Definition rs_message.h:203
unsigned RX_Continue
0 - Продолжить принимать, 0 - Начать прием сначала
Definition rs_message.h:214
unsigned RX_Busy
1 - Режим приема активен, 0 - Прием не активен
Definition rs_message.h:207
unsigned RX_Done
1 - Прием закончен, 0 - Прием еще в процессе или не инициализирован
Definition rs_message.h:210
unsigned DataUpdated
1 - Данные были обновлены
Definition rs_message.h:218
unsigned EchoResponse
1 - Ответить эхом, 0 - Ответить своим сообщением
Definition rs_message.h:216
unsigned DeferredResponse
1 - Не начинать передачу в IT, 0 - Ответить в прерывании
Definition rs_message.h:217
unsigned TX_Done
1 - Передача закончена, 0 - Передача еще в процессе или не инициализирована
Definition rs_message.h:211
unsigned TX_Busy
1 - Режим передачи активен, 0 - Прием не активен
Definition rs_message.h:208
unsigned RS_Busy
1 - RS занят, 0 - RS свободен
Definition rs_message.h:204
unsigned MessageHandled
1 - Обработка запроса успешна, 0 - Обработка запроса в процессе или ошибка
Definition rs_message.h:215
unsigned RX_Ongoing
1 - Прием данных в активном состоянии, 0 - Ожидаем начало приема данных
Definition rs_message.h:205
Handle for RS communication.
Definition rs_message.h:228
uint8_t ID
ID хендла
Definition rs_message.h:230
uint8_t * pBufferPtr
Указатеь на буфер UART.
Definition rs_message.h:232
uint32_t lastPacketTick
Время последнего принятого пакета
Definition rs_message.h:246
int32_t RS_Message_Size
size of whole message, not only data
Definition rs_message.h:233
RS_MsgTypeDef * pMessagePtr
Указатель на структуру протокола
Definition rs_message.h:231
void(* pCallback)(void *, void *)
Указатель на коллбек: принят ответ в режиме мастер
Definition rs_message.h:240
RS_FlagsTypeDef f
Флаги для контроля приема/передачи
Definition rs_message.h:243
RS_ModeTypeDef sRS_Mode
Настройка: слейв/мастер RS_ModeTypeDef.
Definition rs_message.h:238
RS_StatusTypeDef RS_STATUS
Статус RS.
Definition rs_message.h:247
uint16_t sRS_Timeout
Настройка: Таймаут в тиках таймера
Definition rs_message.h:239
UART_HandleTypeDef * huart
Хендл UART.
Definition rs_message.h:236
TIM_HandleTypeDef * htim
Хендл TIM.
Definition rs_message.h:237
Structure for modbus messsage.