Modbus 0.3
Библиотека Modbus для STM
Loading...
Searching...
No Matches
modbus.c
Go to the documentation of this file.
1/**
2*******************************************************************************
3* @file modbus.c
4* @brief Модуль для реализации MODBUS.
5*******************************************************************************
6* @details
7Файл содержит реализацию функций работы с Modbus.
8
9@section mbapi Функции и макросы
10
11### Инициализация:
12- MODBUS_FirstInit() — Инициализация Modbus (подключение UART, TIM)
13- MODBUS_Config() — Конфигурацмя Modbus (ID, Timeout).
14- MODBUS_SlaveStart() — Запуск Modbus как Slave.
15- MODBUS_MasterRequest() — Отправить запрос в MODBUS как Master.
16
17### Функции для работы с RS (UART):
18- RS_Parse_Message() / RS_Collect_Message() — Парсинг и сборка сообщения.
19- RS_Response() — Отправка ответа.
20******************************************************************************/
21#include "modbus.h"
22
23/* MODBUS HANDLES */
24RS_HandleTypeDef hmodbus1; ///< Default Handle for Modbus
25RS_MsgTypeDef MODBUS_MSG; ///< Default Message Struct for Modbus
26
27/* DEFINE DATA FOR MODBUS */
28MB_DataStructureTypeDef MB_DATA = {0};; ///< Coils & Registers
29
30static void MB_DefaultCallback(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_msg);
31
32//-------------------------------------------------------------------
33//-----------------------------FOR USER------------------------------
34/**
35 * @brief Инициализация периферии модбас.
36 * @param hmodbus Указатель на хендлер RS
37 * @param huart Указатель на хендлер UART
38 * @param htim Указатель на хендлер TIM
39 * @details Подключает хендлы периферии к hmodbus
40 * Конфигурация выставляется по умолчанию из modbus_config.h
41 */
42HAL_StatusTypeDef MODBUS_FirstInit(RS_HandleTypeDef *hmodbus, UART_HandleTypeDef *huart, TIM_HandleTypeDef *htim)
43{
44 if((hmodbus == NULL) || (huart == NULL))
45 {
46 return HAL_ERROR;
47 }
49 //-----------SETUP MODBUS-------------
50 // set up modbus: MB_RX_Size_NotConst and Timeout enable
51 hmodbus->ID = MODBUS_DEVICE_ID;
52 hmodbus->sRS_Timeout = MODBUS_TIMEOUT;
54
55 // INIT
56 hmodbus->RS_STATUS = RS_Init(hmodbus, huart, htim, 0);
57
59
60 if(hmodbus->RS_STATUS == RS_OK)
61 return HAL_OK;
62 else
63 return HAL_ERROR;
64}
65/**
66 * @brief Программная конфигурация модбас.
67 * @param hmodbus указатель на хендлер RS
68 * @param Timeout Время тишины между двумя байтами после которых перезапускается прием
69 * @param master Режим мастер (пока не сделан)
70 * @details Конфигурирует ID, таймаут и режим hmodbus
71 */
72HAL_StatusTypeDef MODBUS_Config(RS_HandleTypeDef *hmodbus, uint8_t ID, uint16_t Timeout, uint8_t master)
73{
74 if(hmodbus == NULL)
75 {
76 return HAL_ERROR;
77 }
78 if(!master)
79 {
80 if((ID < 1) || (ID > 247))
81 {
82 return HAL_ERROR;
83 }
84 hmodbus->ID = ID;
85 }
86 else
87 hmodbus->ID = 0;
88
89 hmodbus->sRS_Timeout = Timeout;
90 if(master)
91 hmodbus->sRS_Mode = RS_MASTER_REQUEST;
92 else
94
95 return HAL_OK;
96}
97
98/**
99 * @brief Запуск слейв модбас.
100 * @param hmodbus Указатель на хендлер RS.
101 * @param modbus_msg Указатель на структуру сообщения.
102 (NULL чтобы использовать дефолтную)
103 * @details Конфигурирует ID, таймаут и режим hmodbus
104 */
105HAL_StatusTypeDef MODBUS_SlaveStart(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_msg)
106{
107 if(hmodbus == NULL)
108 {
109 return HAL_ERROR;
110 }
111
112 if(hmodbus->sRS_Mode >= RS_MASTER_MODE_START)
113 {
114 return HAL_ERROR;
115 }
116
118
119 if(modbus_msg)
120 hmodbus->RS_STATUS = RS_Receive_IT(hmodbus, modbus_msg);
121 else
122 hmodbus->RS_STATUS = RS_Receive_IT(hmodbus, &MODBUS_MSG);
123
124 if(hmodbus->RS_STATUS == RS_OK)
125 return HAL_OK;
126 else
127 return HAL_ERROR;
128}
129
130/**
131 * @brief Реквест мастера модбас.
132 * @param hmodbus Указатель на хендлер RS.
133 * @param modbus_msg Указатель на структуру сообщения
134 * @details Конфигурирует ID, таймаут и режим hmodbus
135 */
136HAL_StatusTypeDef MODBUS_MasterRequest(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_msg, void (*pClbk)(RS_HandleTypeDef*, RS_MsgTypeDef*))
137{
138 if(hmodbus == NULL)
139 {
140 return HAL_ERROR;
141 }
142 if(modbus_msg == NULL)
143 {
144 return HAL_ERROR;
145 }
146 if(hmodbus->sRS_Mode < RS_MASTER_MODE_START)
147 {
148 return HAL_ERROR;
149 }
150
151 if(hmodbus->f.RS_Busy)
152 return HAL_BUSY;
153
154 if(pClbk) // если задан используем пользовательский коллбек
155 hmodbus->pCallback = (void (*)(void*, void*))(pClbk);
156 else // иначе дефолтный
157 hmodbus->pCallback = (void (*)(void*, void*))(&MB_DefaultCallback);
158
159 hmodbus->RS_STATUS = RS_Transmit_IT(hmodbus, modbus_msg);
160
161 if(hmodbus->RS_STATUS == RS_OK)
162 return HAL_OK;
163 else
164 return HAL_ERROR;
165}
166
167//-------------------------------------------------------------------
168//-----------------------------INTERNAL------------------------------
169
170/**
171 * @brief Дефолтный коллбек для мастера.
172 * @param hmodbus Указатель на хендлер RS
173 * @param modbus_msg Указатель на структуру сообщения
174 * @details В этот коллбек попадут все запросы, с NULL-коллбеком
175 */
176static void MB_DefaultCallback(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_msg)
177{
178 __NOP();
179 return;
180}
181
182
183/* Реализация функций из rs_message.c для протокола */
185{
186 if(hmodbus->sRS_Mode >= RS_MASTER_MODE_START)
187 {
188 return RS_ERR;
189 }
190 return MB_Slave_Response(hmodbus, modbus_msg);
191}
192
193RS_StatusTypeDef RS_Collect_Message(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_msg, uint8_t *modbus_uart_buff)
194{
195 if(hmodbus->sRS_Mode < RS_MASTER_MODE_START)
196 {
197 return MB_Slave_Collect_Message(hmodbus, modbus_msg, modbus_uart_buff);
198 }
199 else
200 {
201 return MB_Master_Collect_Message(hmodbus, modbus_msg, modbus_uart_buff);
202 }
203}
204
205RS_StatusTypeDef RS_Parse_Message(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_msg, uint8_t *modbus_uart_buff)
206{
207 if(hmodbus->sRS_Mode < RS_MASTER_MODE_START)
208 {
209 return MB_Slave_Parse_Message(hmodbus, modbus_msg, modbus_uart_buff);
210 }
211 else
212 {
213 return MB_Master_Parse_Message(hmodbus, modbus_msg, modbus_uart_buff);
214 }
215}
#define MODBUS_TIMEOUT
Таймаут в тиках таймера
#define MODBUS_DEVICE_ID
Адрес устройства в сети Modbus.
void MB_DeviceInentificationInit(void)
Инициализация идентификаторов.
void MB_DiagnosticsInit(void)
Инициализация диагностических счетчиков
Definition modbus_diag.c:22
HAL_StatusTypeDef MODBUS_MasterRequest(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_msg, void(*pClbk)(RS_HandleTypeDef *, RS_MsgTypeDef *))
Реквест мастера модбас.
Definition modbus.c:136
HAL_StatusTypeDef MODBUS_Config(RS_HandleTypeDef *hmodbus, uint8_t ID, uint16_t Timeout, uint8_t master)
Программная конфигурация модбас.
Definition modbus.c:72
HAL_StatusTypeDef MODBUS_SlaveStart(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_msg)
Запуск слейв модбас.
Definition modbus.c:105
HAL_StatusTypeDef MODBUS_FirstInit(RS_HandleTypeDef *hmodbus, UART_HandleTypeDef *huart, TIM_HandleTypeDef *htim)
Инициализация периферии модбас.
Definition modbus.c:42
RS_StatusTypeDef MB_Master_Collect_Message(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_msg, uint8_t *modbus_uart_buff)
Сбор сообщения в буфер UART в режиме мастер (фрейм мастера из msg -> uart).
RS_StatusTypeDef MB_Master_Parse_Message(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_msg, uint8_t *modbus_uart_buff)
Парс сообщения в режиме мастер (фрейм слейва из uart -> msg).
RS_MsgTypeDef MODBUS_MSG
Default Message Struct for Modbus.
Definition modbus.c:25
RS_StatusTypeDef MB_Slave_Collect_Message(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_msg, uint8_t *modbus_uart_buff)
Сбор сообщения в буфер UART в режиме слейв (фрейм слейва из msg -> uart).
RS_StatusTypeDef MB_Slave_Response(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_msg)
Ответ на сообщение в режиме слейва.
RS_StatusTypeDef MB_Slave_Parse_Message(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_msg, uint8_t *modbus_uart_buff)
Парс сообщения в режиме слейв (фрейм мастера из uart -> msg).
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_Transmit_IT(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg)
Начать передачу по прерываниям.
Definition rs_message.c:91
RS_StatusTypeDef RS_Parse_Message(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg, uint8_t *msg_uart_buff)
Пользовательская функция для парса сообщения из буфера UART.
Definition modbus.c:205
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
#define RS_MASTER_MODE_START
Начало режимов мастера (до него - режим слейв)
Definition rs_message.h:181
RS_StatusTypeDef RS_Init(RS_HandleTypeDef *hRS, UART_HandleTypeDef *huart, TIM_HandleTypeDef *htim, uint8_t *pRS_BufferPtr)
Инициалазация структуры RS_HandleTypeDef.
Definition rs_message.c:156
RS_HandleTypeDef hmodbus1
Default Handle for Modbus.
Definition modbus.c:24
#define RS_EnableReceive()
Функция изменения направления передачи на ПРИЕМ для RS-485.
Definition rs_message.h:150
@ RS_MASTER_REQUEST
Мастер с ручным запросом
Definition rs_message.h:187
@ RS_SLAVE_ALWAYS_WAIT
Слейв в постоянном ожидании
Definition rs_message.h:185
static void MB_DefaultCallback(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_msg)
Coils & Registers.
Definition modbus.c:176
Главный заголовочный файл Modbus библиотеки
Структура со всеми регистрами и коилами модбас
unsigned RS_Busy
1 - RS занят, 0 - RS свободен
Definition rs_message.h:204
Handle for RS communication.
Definition rs_message.h:228
uint8_t ID
ID хендла
Definition rs_message.h:230
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
Structure for modbus messsage.