74 lines
2.7 KiB
Markdown
74 lines
2.7 KiB
Markdown
# Modbus: подключение и использование
|
||
Это вариант голого (bare) modbus, где вся инициализация скинута на CubeMX
|
||
|
||
## Настройка
|
||
|
||
1. Подключите обработчики прерываний **UART** и **TIM** в свои IRQ обработчики после HAL-обработчиков:
|
||
|
||
```c
|
||
#include "rs_message.h"
|
||
|
||
void USARTx_IRQHandler(void)
|
||
{
|
||
HAL_UART_IRQHandler(&huart);
|
||
RS_UART_Handler(&modbus1);
|
||
}
|
||
|
||
void TIMx_IRQHandler(void)
|
||
{
|
||
HAL_TIM_IRQHandler(&htim);
|
||
RS_TIM_Handler(&modbus1);
|
||
}
|
||
```
|
||
|
||
2. Настройте `modbus_config.h`:
|
||
|
||
```c
|
||
// MODBUS PARAMS
|
||
#define MODBUS_DEVICE_ID 1 ///< девайс текущего устройства
|
||
#define MODBUS_TIMEOUT 5000 ///< максимальнйы тайтаут MB в тиках таймера
|
||
|
||
// PERIPH FUNCTIONS AND HANDLERS
|
||
#define RS_UART_Init MX_USART1_UART_Init
|
||
#define RS_UART_DeInit HAL_UART_MspDeInit
|
||
#define RS_TIM_Init MX_TIM3_Init
|
||
#define RS_TIM_DeInit HAL_TIM_Base_MspDeInit
|
||
#define rs_huart huart1
|
||
#define rs_htim htim3
|
||
```
|
||
3. Для инициализации Modbus добавьте:
|
||
|
||
```c
|
||
#include "rs_message.h"
|
||
|
||
MODBUS_FirstInit();
|
||
```
|
||
|
||
4. Настройка регистров и коилов
|
||
|
||
Все данные объединены в общую структуру устройства `MB_DataStructureTypeDef`, которая содержит:
|
||
|
||
- Входные регистры (`InRegs`) - 16-битные регистры только для чтения
|
||
- Коилы (`Coils`) - 1-битовые коилы для чтения/записи
|
||
- Регистры хранения (`HoldRegs`) - 16-битные регистры для чтения/записи
|
||
|
||
Пример настройки `Input Registers`:
|
||
|
||
```c
|
||
typedef struct //MB_DataInRegsTypeDef
|
||
{
|
||
uint16_t ForwardVoltage;
|
||
uint16_t ReversePeakVoltage;
|
||
}MB_DataInRegsTypeDef;
|
||
|
||
// DEFINES FOR INPUT REGISTERS ARRAYS
|
||
#define R_INPUT_ADDR 0 // начальный адресс инпут регистров
|
||
#define R_INPUT_QNT 2 // количество инпут регистров
|
||
```
|
||
Аналогично с `Hodling Registers` и `Coils` (в коилах только желательно использовать битовые поля)
|
||
|
||
5. Для запуска Modbus вызовите:
|
||
```c
|
||
RS_Receive_IT(&hmodbus1, &MODBUS_MSG);
|
||
```
|