Modbus 0.3
Библиотека Modbus для STM
Loading...
Searching...
No Matches
modbus_master.h
Go to the documentation of this file.
1/**
2*******************************************************************************
3* @file modbus_master.h
4* @brief Главный заголовочный файл Modbus библиотеки
5*******************************************************************************
6@addtogroup MODBUS_MASTER Modbus master funtions
7@ingroup MODBUS_CMD_PROCESS_FUNCTIONS
8@brief Функции для работы в режиме Master
9*******************************************************************************
10* @details
11Модуль реализации Modbus в режиме мастер
12******************************************************************************/
13#ifndef __MODBUS_MASTER_H_
14#define __MODBUS_MASTER_H_
15
16#include "rs_message.h"
17
18/**
19 * @addtogroup MODBUS_REQUEST_MSG API for Master Requests
20 * @ingroup MODBUS_FUNCTIONS
21 * @brief API для формирования фрейма-запроса в режиме мастер
22 * @details Примеры использования:
23 * @code
24 * // Чтение 10 holding registers начиная с адреса 0
25 * RS_MsgTypeDef read_msg = MB_REQUEST_READ_HOLDING_REGS(1, 0, 10);
26 *
27 * // Запись одного coil
28 * RS_MsgTypeDef write_coil_msg = MB_REQUEST_WRITE_SINGLE_COIL(1, 5, 1);
29 *
30 * // Диагностический запрос
31 * RS_MsgTypeDef diag_msg = MB_REQUEST_RETURN_BUS_MESSAGE_COUNT(1);
32 *
33 * // Идентификация устройства
34 * RS_MsgTypeDef dev_id_msg = MB_REQUEST_READ_DEVICE_ID_BASIC(1);
35 * @endcode
36 * @{
37 */
38
39//---------КЛАССИЧЕСКИЕ ДАННЫЕ-----------
40RS_MsgTypeDef MB_REQUEST_READ_COILS(uint8_t slave_addr, uint16_t start_addr, uint16_t quantity);
41RS_MsgTypeDef MB_REQUEST_READ_DISCRETE_INPUTS(uint8_t slave_addr, uint16_t start_addr, uint16_t quantity);
42RS_MsgTypeDef MB_REQUEST_READ_HOLDING_REGS(uint8_t slave_addr, uint16_t start_addr, uint16_t quantity);
43RS_MsgTypeDef MB_REQUEST_READ_INPUT_REGS(uint8_t slave_addr, uint16_t start_addr, uint16_t quantity);
44RS_MsgTypeDef MB_REQUEST_WRITE_SINGLE_COIL(uint8_t slave_addr, uint16_t coil_addr, uint8_t value);
45RS_MsgTypeDef MB_REQUEST_WRITE_SINGLE_REG(uint8_t slave_addr, uint16_t reg_addr, uint16_t value);
46RS_MsgTypeDef MB_REQUEST_WRITE_MULTIPLE_COILS(uint8_t slave_addr, uint16_t start_addr, uint16_t quantity, uint8_t *coils_data);
47RS_MsgTypeDef MB_REQUEST_WRITE_MULTIPLE_REGS(uint8_t slave_addr, uint16_t start_addr, uint16_t quantity, uint16_t *regs_data);
48
49//---------ДИАГНОСТИЧЕСКИЕ ДАННЫЕ-----------
50RS_MsgTypeDef MB_REQUEST_DIAGNOSTIC_QUERY(uint8_t slave_addr, uint16_t sub_function, uint16_t data);
51RS_MsgTypeDef MB_REQUEST_RETURN_QUERY_DATA(uint8_t slave_addr);
52RS_MsgTypeDef MB_REQUEST_RESTART_COMMUNICATIONS(uint8_t slave_addr, uint16_t data);
53RS_MsgTypeDef MB_REQUEST_RETURN_DIAGNOSTIC_REGISTER(uint8_t slave_addr);
54RS_MsgTypeDef MB_REQUEST_FORCE_LISTEN_ONLY_MODE(uint8_t slave_addr);
55RS_MsgTypeDef MB_REQUEST_CLEAR_COUNTERS_AND_DIAGNOSTIC_REGISTER(uint8_t slave_addr);
56RS_MsgTypeDef MB_REQUEST_RETURN_BUS_MESSAGE_COUNT(uint8_t slave_addr);
57RS_MsgTypeDef MB_REQUEST_RETURN_BUS_COMMUNICATION_ERROR_COUNT(uint8_t slave_addr);
58RS_MsgTypeDef MB_REQUEST_RETURN_SLAVE_EXCEPTION_ERROR_COUNT(uint8_t slave_addr);
59RS_MsgTypeDef MB_REQUEST_RETURN_SLAVE_MESSAGE_COUNT(uint8_t slave_addr);
60RS_MsgTypeDef MB_REQUEST_RETURN_SLAVE_NO_RESPONSE_COUNT(uint8_t slave_addr);
61RS_MsgTypeDef MB_REQUEST_RETURN_SLAVE_NAK_COUNT(uint8_t slave_addr);
62RS_MsgTypeDef MB_REQUEST_RETURN_SLAVE_BUSY_COUNT(uint8_t slave_addr);
63RS_MsgTypeDef MB_REQUEST_RETURN_BUS_CHARACTER_OVERRUN_COUNT(uint8_t slave_addr);
64
65//---------ИДЕНТИФИКАТОРЫ МОДБАС-----------
66RS_MsgTypeDef MB_REQUEST_READ_DEVICE_ID_BASIC(uint8_t slave_addr);
67RS_MsgTypeDef MB_REQUEST_READ_DEVICE_ID_REGULAR(uint8_t slave_addr);
68RS_MsgTypeDef MB_REQUEST_READ_DEVICE_ID_EXTENDED(uint8_t slave_addr);
69RS_MsgTypeDef MB_REQUEST_READ_DEVICE_ID_SPECIFIC(uint8_t slave_addr, uint8_t object_id);
70/** MODBUS_REQUEST_MSG
71 * @}
72 */
73
74
75/**
76 * @addtogroup MODBUS_REGS_API API for Registers
77 * @ingroup MODBUS_REQUEST_MSG
78 * @brief API для чтения регистров из ответа в режиме мастер
79 * @details Примеры использования:
80 *
81 * @code
82 * // Пример: Запросили 10 регистров с адреса 100, хотим получить значение регистра 105
83 * uint16_t reg_value;
84 * if(MB_RespGet_RegisterValue(modbus_msg, 105, &reg_value))
85 * {
86 * printf("Register 105 value: %d\n", reg_value);
87 * }
88 *
89 * // Пример: Получить все запрошенные регистры
90 * uint16_t reg_value[125];
91 * MB_RespGet_RegisterAll(modbus_msg)
92 * @endcode
93 * @{
94 */
95/* Получить значение ВСЕХ регистров в ответе */
96int MB_RespGet_RegisterAll(RS_MsgTypeDef *modbus_msg, uint16_t *reg_arr);
97/* Получить значение регистра в ответе по его адресу */
98int MB_RespGet_RegisterValue(RS_MsgTypeDef *modbus_msg, uint16_t reg_addr, uint16_t *reg_value);
99
100
101/** MODBUS_REQ_REGS_API
102 * @}
103 */
104
105
106/**
107 * @addtogroup MODBUS_REQ_COILS_API API for Coils
108 * @ingroup MODBUS_REQUEST_MSG
109 * @brief API для чтения coils из ответа в режиме мастер
110 * @details Примеры использования:
111 *
112 * @code
113 * // Пример: Запросили 10 coils с адреса 20, хотим узнать состояние coil 25
114 * int coil_state;
115 * if(MB_RespGet_CoilState(modbus_msg, 25, &coil_state))
116 * {
117 * printf("Coil 25 state: %s\n", coil_state ? "ON" : "OFF");
118 * }
119 *
120 * // Пример: Получить состояние всех запрошенных coils
121 * for(int addr = MODBUS_MSG.Addr; addr < MODBUS_MSG.Addr + MODBUS_MSG.Qnt; addr++)
122 * {
123 * int state;
124 * if(MB_RespGet_CoilState(modbus_msg, addr, &state))
125 * {
126 * printf("Coil %d: %s\n", addr, state ? "ON" : "OFF");
127 * }
128 * }
129 * @endcode
130 * @{
131 */
132/* Получить состояние ВСЕХ coil в ответе */
133int MB_RespGet_CoilAll(RS_MsgTypeDef *modbus_msg, int *coil_arr);
134/* Получить состояние coil в ответе по его адресу */
135int MB_RespGet_CoilState(RS_MsgTypeDef *modbus_msg, uint16_t coil_addr, int *coil_state);
136
137/** MODBUS_REQ_COILS_API
138 * @}
139 */
140
141
142/**
143 * @addtogroup MODBUS_REQ_DEFID_API API for Device Identifications
144 * @ingroup MODBUS_REQUEST_MSG
145 * @brief API для чтения идентификторов из ответа в режиме мастер
146 * @details Примеры использования:
147 *
148 * @code
149 * // Пример 1: Получить VendorName (ID = 0x00)
150 * uint8_t length;
151 * char vendor_name[64];
152 * if(MB_RespGet_ObjectById(modbus_msg, 0x00, vendor_name, &length))
153 * {
154 * // получено
155 * }
156 *
157 * // Пример 2: Перебрать все объекты в сообщении
158 * uint8_t obj_id, obj_length;
159 * char obj_data[256];
160 *
161 * int obj_count = MB_RespGet_NumberOfObjects(modbus_msg);
162 * printf("Total objects: %d\n", obj_count);
163 *
164 * for(int i = 0; i < obj_count; i++)
165 * {
166 * if(MB_RespGet_ObjectByIndex(modbus_msg, i, &obj_id, obj_data, &obj_length))
167 * {
168 * // получено
169 * }
170 * }
171 * @endcode
172 * @{
173 */
174
175/* Получить количество объектов в сообщении */
177/* Найти объект по ID в сообщении */
178int MB_RespGet_ObjectById(RS_MsgTypeDef *modbus_msg, uint8_t obj_id, char *obj_data, uint8_t *obj_length);
179/* Получить объект по индексу в сообщении */
180int MB_RespGet_ObjectByIndex(RS_MsgTypeDef *modbus_msg, int index, uint8_t *obj_id, char *obj_data, uint8_t *obj_length);
181
182
183/** MODBUS_REQ_DEFID_API
184* @}
185*/
186
187
188
189/**
190 * @addtogroup MODBUS_REQ_DIAG_API API for Diagnostics
191 * @ingroup MODBUS_REQUEST_MSG
192 * @brief API для чтения диагностической информации из ответа в режиме мастер
193 * @details Примеры использования:
194 *
195 * @code
196 * // Получить данные диагностики (значение счетчика)
197 * uint16_t counter_value;
198 * if(MB_RespGet_Diagnostic(modbus_msg, &counter_value))
199 * {
200 * printf("Counter value: %d\n", counter_value);
201 * }
202 * @endcode
203 * @{
204 */
205
206/* Получить */
207int MB_RespGet_Diagnostic(RS_MsgTypeDef *modbus_msg, uint16_t *data);
208
209/** MODBUS_REQ_DIAG_API
210 * @}
211 */
212
213
214
215
216
217/**
218 * @addtogroup MODBUS_MASTER
219 * @{
220 */
221
222/* Сбор сообщения в буфер UART в режиме мастер (фрейм мастера из msg -> uart) */
223RS_StatusTypeDef MB_Master_Collect_Message(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_msg, uint8_t *modbus_uart_buff);
224/* Парс сообщения в режиме мастер (фрейм слейва из uart -> msg) */
225RS_StatusTypeDef MB_Master_Parse_Message(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_msg, uint8_t *modbus_uart_buff);
226
227/** MODBUS_MASTER
228 * @}
229 */
230
231#endif //__MODBUS_MASTER_H_
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).
int MB_RespGet_RegisterValue(RS_MsgTypeDef *modbus_msg, uint16_t reg_addr, uint16_t *reg_value)
Получить значение регистра в ответе по его адресу
int MB_RespGet_RegisterAll(RS_MsgTypeDef *modbus_msg, uint16_t *reg_arr)
Получить значение ВСЕХ регистров в ответе
int MB_RespGet_CoilAll(RS_MsgTypeDef *modbus_msg, int *coil_arr)
Получить состояние ВСЕХ coil в ответе
int MB_RespGet_CoilState(RS_MsgTypeDef *modbus_msg, uint16_t coil_addr, int *coil_state)
Получить состояние coil в ответе по его адресу
int MB_RespGet_ObjectById(RS_MsgTypeDef *modbus_msg, uint8_t obj_id, char *obj_data, uint8_t *obj_length)
Найти объект по ID в сообщении
int MB_RespGet_NumberOfObjects(RS_MsgTypeDef *modbus_msg)
Получить количество объектов в сообщении
int MB_RespGet_ObjectByIndex(RS_MsgTypeDef *modbus_msg, int index, uint8_t *obj_id, char *obj_data, uint8_t *obj_length)
Получить объект по индексу в сообщении
int MB_RespGet_Diagnostic(RS_MsgTypeDef *modbus_msg, uint16_t *data)
Получить данные диагностики из сообщения (MbData[1])
RS_MsgTypeDef MB_REQUEST_WRITE_SINGLE_REG(uint8_t slave_addr, uint16_t reg_addr, uint16_t value)
Сформировать запрос на запись одного регистра
RS_MsgTypeDef MB_REQUEST_WRITE_SINGLE_COIL(uint8_t slave_addr, uint16_t coil_addr, uint8_t value)
Сформировать запрос на запись одного коила
RS_MsgTypeDef MB_REQUEST_READ_HOLDING_REGS(uint8_t slave_addr, uint16_t start_addr, uint16_t quantity)
Сформировать запрос на чтение холдинг регистров
RS_MsgTypeDef MB_REQUEST_READ_INPUT_REGS(uint8_t slave_addr, uint16_t start_addr, uint16_t quantity)
Сформировать запрос на чтение инпут регистров
RS_MsgTypeDef MB_REQUEST_READ_DISCRETE_INPUTS(uint8_t slave_addr, uint16_t start_addr, uint16_t quantity)
Сформировать запрос на чтение дискретных регистров
RS_MsgTypeDef MB_REQUEST_WRITE_MULTIPLE_COILS(uint8_t slave_addr, uint16_t start_addr, uint16_t quantity, uint8_t *coils_data)
Сформировать запрос на запись нескольких регистров
RS_MsgTypeDef MB_REQUEST_WRITE_MULTIPLE_REGS(uint8_t slave_addr, uint16_t start_addr, uint16_t quantity, uint16_t *regs_data)
Сформировать запрос на запись нескольких коилов
RS_MsgTypeDef MB_REQUEST_READ_COILS(uint8_t slave_addr, uint16_t start_addr, uint16_t quantity)
Сформировать запрос на чтение коилов
RS_StatusTypeDef
Enums for respond CMD about RS status.
Definition rs_message.h:164
Библиотека обмена сообщениями по RS-интерфейсу
Handle for RS communication.
Definition rs_message.h:228
Structure for modbus messsage.