Modbus/README.md

74 lines
2.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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);
```