Доработки и рефакторинг
This commit is contained in:
@@ -98,7 +98,7 @@ typedef enum
|
||||
* @code
|
||||
* // Пример: Запросили 10 coils с адреса 20, хотим узнать состояние coil 25
|
||||
* int coil_state;
|
||||
* if(MB_GetCoilState(&MODBUS_MSG, 25, &coil_state))
|
||||
* if(MB_RespGet_CoilState(&MODBUS_MSG, 25, &coil_state))
|
||||
* {
|
||||
* printf("Coil 25 state: %s\n", coil_state ? "ON" : "OFF");
|
||||
* }
|
||||
@@ -107,7 +107,7 @@ typedef enum
|
||||
* for(int addr = MODBUS_MSG.Addr; addr < MODBUS_MSG.Addr + MODBUS_MSG.Qnt; addr++)
|
||||
* {
|
||||
* int state;
|
||||
* if(MB_GetCoilState(&MODBUS_MSG, addr, &state))
|
||||
* if(MB_RespGet_CoilState(&MODBUS_MSG, addr, &state))
|
||||
* {
|
||||
* printf("Coil %d: %s\n", addr, state ? "ON" : "OFF");
|
||||
* }
|
||||
@@ -115,7 +115,7 @@ typedef enum
|
||||
* @endcode
|
||||
*/
|
||||
|
||||
int MB_GetCoilState(RS_MsgTypeDef *modbus_msg, uint16_t coil_addr, int *coil_state);
|
||||
int MB_RespGet_CoilState(RS_MsgTypeDef *modbus_msg, uint16_t coil_addr, int *coil_state);
|
||||
|
||||
/** MODBUS_REQ_COILS_API
|
||||
* @}
|
||||
|
||||
@@ -19,8 +19,8 @@
|
||||
#include "stm32f1xx_hal.h"
|
||||
|
||||
// Общие параметры
|
||||
#define MODBUS_DEVICE_ID 1 ///< девайс текущего устройства
|
||||
#define MODBUS_TIMEOUT 5000 ///< максимальнйы тайтаут MB в тиках таймера
|
||||
#define MODBUS_DEVICE_ID 1 // Адрес устройства в сети Modbus
|
||||
#define MODBUS_TIMEOUT 5000 // Таймаут в тиках таймера
|
||||
|
||||
// Строковые идентификаторы устройства
|
||||
#define MODBUS_VENDOR_NAME "NIO-12"
|
||||
@@ -34,14 +34,14 @@
|
||||
|
||||
// Периферия (опционально)
|
||||
#define mb_huart huart1 ///< Удобный дефайн для модбасовского uart
|
||||
#define mb_htim htim2 ///< Удобный дефайн для модбасовского таймера
|
||||
#define mb_htim htim3 ///< Удобный дефайн для модбасовского таймера
|
||||
//#define RS_EnableReceive() ///< Функция изменения направления передачи на ПРИЕМ для RS-485
|
||||
//#define RS_EnableTransmit() ///< Функция изменения направления передачи на ПЕРЕДАЧУ для RS-485
|
||||
|
||||
|
||||
// Модули modbus
|
||||
#define MODBUS_ENABLE_SLAVE ///< Включить обработку МАСТЕР режима
|
||||
#define MODBUS_ENABLE_MASTER ///< Включить обработку СЛЕЙВ режима
|
||||
#define MODBUS_ENABLE_SLAVE ///< Включить обработку СЛЕЙВ режима
|
||||
//#define MODBUS_ENABLE_MASTER ///< Включить обработку МАСТЕР режима
|
||||
|
||||
#define MODBUS_ENABLE_COILS ///< Включить обработку коилов
|
||||
#define MODBUS_ENABLE_HOLDINGS ///< Включить обработку регистров хранения
|
||||
|
||||
@@ -87,7 +87,7 @@ void MB_DeviceInentificationInit(void);
|
||||
* // Пример 1: Получить VendorName (ID = 0x00)
|
||||
* uint8_t length;
|
||||
* char vendor_name[64];
|
||||
* if(MB_FindObjectById(&MODBUS_MSG, 0x00, vendor_name, &length))
|
||||
* if(MB_RespGet_ObjectById(&MODBUS_MSG, 0x00, vendor_name, &length))
|
||||
* {
|
||||
* // получено
|
||||
* }
|
||||
@@ -96,12 +96,12 @@ void MB_DeviceInentificationInit(void);
|
||||
* uint8_t obj_id, obj_length;
|
||||
* char obj_data[256];
|
||||
*
|
||||
* int obj_count = MB_GetNumberOfObjects(&MODBUS_MSG);
|
||||
* int obj_count = MB_RespGet_NumberOfObjects(&MODBUS_MSG);
|
||||
* printf("Total objects: %d\n", obj_count);
|
||||
*
|
||||
* for(int i = 0; i < obj_count; i++)
|
||||
* {
|
||||
* if(MB_GetObjectByIndex(&MODBUS_MSG, i, &obj_id, obj_data, &obj_length))
|
||||
* if(MB_RespGet_ObjectByIndex(&MODBUS_MSG, i, &obj_id, obj_data, &obj_length))
|
||||
* {
|
||||
* // получено
|
||||
* }
|
||||
@@ -110,11 +110,11 @@ void MB_DeviceInentificationInit(void);
|
||||
*/
|
||||
|
||||
/* Получить количество объектов в сообщении */
|
||||
int MB_GetNumberOfObjects(RS_MsgTypeDef *modbus_msg);
|
||||
int MB_RespGet_NumberOfObjects(RS_MsgTypeDef *modbus_msg);
|
||||
/* Найти объект по ID в сообщении */
|
||||
int MB_FindObjectById(RS_MsgTypeDef *modbus_msg, uint8_t obj_id, char *obj_data, uint8_t *obj_length);
|
||||
int MB_RespGet_ObjectById(RS_MsgTypeDef *modbus_msg, uint8_t obj_id, char *obj_data, uint8_t *obj_length);
|
||||
/* Получить объект по индексу в сообщении */
|
||||
int MB_GetObjectByIndex(RS_MsgTypeDef *modbus_msg, int index, uint8_t *obj_id, char *obj_data, uint8_t *obj_length);
|
||||
int MB_RespGet_ObjectByIndex(RS_MsgTypeDef *modbus_msg, int index, uint8_t *obj_id, char *obj_data, uint8_t *obj_length);
|
||||
|
||||
|
||||
/** MODBUS_REQ_DEFID_API
|
||||
|
||||
@@ -66,13 +66,13 @@ void MB_DiagnosticsInit(void);
|
||||
* @code
|
||||
* Получить данные диагностики (значение счетчика)
|
||||
* uint16_t counter_value;
|
||||
* if(MB_GetDiagnosticResponse(&MODBUS_MSG, &counter_value))
|
||||
* if(MB_RespGet_Diagnostic(&MODBUS_MSG, &counter_value))
|
||||
* {
|
||||
* printf("Counter value: %d\n", counter_value);
|
||||
* }
|
||||
* @endcode
|
||||
*/
|
||||
int MB_GetDiagnosticResponse(RS_MsgTypeDef *modbus_msg, uint16_t *data);
|
||||
int MB_RespGet_Diagnostic(RS_MsgTypeDef *modbus_msg, uint16_t *data);
|
||||
/** MODBUS_REQ_DIAG_API
|
||||
* @}
|
||||
*/
|
||||
|
||||
@@ -83,7 +83,7 @@ RS_MsgTypeDef MB_REQUEST_READ_DEVICE_ID_SPECIFIC(uint8_t slave_addr, uint8_t obj
|
||||
* @code
|
||||
* // Пример: Запросили 10 регистров с адреса 100, хотим получить значение регистра 105
|
||||
* uint16_t reg_value;
|
||||
* if(MB_GetRegisterValue(&MODBUS_MSG, 105, ®_value))
|
||||
* if(MB_RespGet_RegisterValue(&MODBUS_MSG, 105, ®_value))
|
||||
* {
|
||||
* printf("Register 105 value: %d\n", reg_value);
|
||||
* }
|
||||
@@ -92,7 +92,7 @@ RS_MsgTypeDef MB_REQUEST_READ_DEVICE_ID_SPECIFIC(uint8_t slave_addr, uint8_t obj
|
||||
* for(int addr = MODBUS_MSG.Addr; addr < MODBUS_MSG.Addr + MODBUS_MSG.Qnt; addr++)
|
||||
* {
|
||||
* uint16_t value;
|
||||
* if(MB_GetRegisterValue(&MODBUS_MSG, addr, &value))
|
||||
* if(MB_RespGet_RegisterValue(&MODBUS_MSG, addr, &value))
|
||||
* {
|
||||
* printf("Register %d: %d\n", addr, value);
|
||||
* }
|
||||
@@ -100,7 +100,7 @@ RS_MsgTypeDef MB_REQUEST_READ_DEVICE_ID_SPECIFIC(uint8_t slave_addr, uint8_t obj
|
||||
* @endcode
|
||||
*/
|
||||
|
||||
int MB_GetRegisterValue(RS_MsgTypeDef *modbus_msg, uint16_t reg_addr, uint16_t *reg_value);
|
||||
int MB_RespGet_RegisterValue(RS_MsgTypeDef *modbus_msg, uint16_t reg_addr, uint16_t *reg_value);
|
||||
|
||||
|
||||
/** MODBUS_REQ_REGS_API
|
||||
|
||||
@@ -94,7 +94,7 @@ uint16_t MB_Read_Coil_Global(uint16_t Addr, MB_ExceptionTypeDef *Exception)
|
||||
* @param coil_state Указатель для состояния coil (1 - ON, 0 - OFF)
|
||||
* @return 1 - успех, 0 - ошибка или coil_addr вне диапазона запроса
|
||||
*/
|
||||
int MB_GetCoilState(RS_MsgTypeDef *modbus_msg, uint16_t coil_addr, int *coil_state)
|
||||
int MB_RespGet_CoilState(RS_MsgTypeDef *modbus_msg, uint16_t coil_addr, int *coil_state)
|
||||
{
|
||||
if(modbus_msg == NULL || coil_state == NULL)
|
||||
return 0;
|
||||
@@ -284,7 +284,7 @@ uint8_t MB_Write_Miltuple_Coils(RS_MsgTypeDef *modbus_msg)
|
||||
#else //MODBUS_ENABLE_COILS
|
||||
|
||||
|
||||
int MB_GetCoilState(RS_MsgTypeDef *modbus_msg, uint16_t coil_addr, int *coil_state) {return 0;}
|
||||
int MB_RespGet_CoilState(RS_MsgTypeDef *modbus_msg, uint16_t coil_addr, int *coil_state) {return 0;}
|
||||
MB_ExceptionTypeDef MB_Write_Coil_Global(uint16_t Addr, MB_CoilsOpTypeDef WriteVal) {return ILLEGAL_FUNCTION;}
|
||||
uint16_t MB_Read_Coil_Global(uint16_t Addr, MB_ExceptionTypeDef *Exception) {return 0;}
|
||||
uint8_t MB_Process_Read_Coils(RS_MsgTypeDef *modbus_msg) {return 0;}
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include "modbus_devid.h"
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @brief Check is address valid for certain array.
|
||||
* @param Addr Начальный адресс.
|
||||
|
||||
@@ -26,7 +26,7 @@ MB_DeviceIdentificationsTypeDef MB_DEVID; ///< Глобальная струк
|
||||
* @param modbus_msg Указатель на структуру сообщения
|
||||
* @return int Количество объектов
|
||||
*/
|
||||
int MB_GetNumberOfObjects(RS_MsgTypeDef *modbus_msg)
|
||||
int MB_RespGet_NumberOfObjects(RS_MsgTypeDef *modbus_msg)
|
||||
{
|
||||
if(modbus_msg == NULL)
|
||||
{
|
||||
@@ -49,7 +49,7 @@ int MB_GetNumberOfObjects(RS_MsgTypeDef *modbus_msg)
|
||||
* @param obj_length Указатель для длины объекта
|
||||
* @return int Найден ли объект (1 - да, 0 - нет)
|
||||
*/
|
||||
int MB_FindObjectById(RS_MsgTypeDef *modbus_msg, uint8_t obj_id, char *obj_data, uint8_t *obj_length)
|
||||
int MB_RespGet_ObjectById(RS_MsgTypeDef *modbus_msg, uint8_t obj_id, char *obj_data, uint8_t *obj_length)
|
||||
{
|
||||
if((modbus_msg == NULL) || (obj_data == NULL))
|
||||
return 0;
|
||||
@@ -100,7 +100,7 @@ int MB_FindObjectById(RS_MsgTypeDef *modbus_msg, uint8_t obj_id, char *obj_data,
|
||||
* @param obj_length Указатель для длины объекта
|
||||
* @return int Успешность получения (1 - получен, 0 - не найден)
|
||||
*/
|
||||
int MB_GetObjectByIndex(RS_MsgTypeDef *modbus_msg, int index, uint8_t *obj_id, char *obj_data, uint8_t *obj_length)
|
||||
int MB_RespGet_ObjectByIndex(RS_MsgTypeDef *modbus_msg, int index, uint8_t *obj_id, char *obj_data, uint8_t *obj_length)
|
||||
{
|
||||
if((modbus_msg == NULL) || (obj_data == NULL))
|
||||
return 0;
|
||||
@@ -674,9 +674,9 @@ void MB_DeviceInentificationInit(void)
|
||||
#else //MODBUS_ENABLE_DEVICE_IDENTIFICATIONS
|
||||
|
||||
/* Получить количество объектов в сообщении */
|
||||
int MB_GetNumberOfObjects(RS_MsgTypeDef *modbus_msg) {return 0;}
|
||||
int MB_FindObjectById(RS_MsgTypeDef *modbus_msg, uint8_t obj_id, char *obj_data, uint8_t *obj_length) {return 0;}
|
||||
int MB_GetObjectByIndex(RS_MsgTypeDef *modbus_msg, int index, uint8_t *obj_id, char *obj_data, uint8_t *obj_length) {return 0;}
|
||||
int MB_RespGet_NumberOfObjects(RS_MsgTypeDef *modbus_msg) {return 0;}
|
||||
int MB_RespGet_ObjectById(RS_MsgTypeDef *modbus_msg, uint8_t obj_id, char *obj_data, uint8_t *obj_length) {return 0;}
|
||||
int MB_RespGet_ObjectByIndex(RS_MsgTypeDef *modbus_msg, int index, uint8_t *obj_id, char *obj_data, uint8_t *obj_length) {return 0;}
|
||||
void MB_WriteSingleObjectToMessage(char *mbdata, unsigned *ind, MB_DeviceObjectTypeDef *obj) {}
|
||||
void MB_WriteObjectsToMessage(RS_MsgTypeDef *modbus_msg, unsigned maxidofobj) {}
|
||||
uint8_t MB_Process_Read_Device_Identifications(RS_MsgTypeDef *modbus_msg) {return 0;}
|
||||
|
||||
@@ -42,7 +42,7 @@ void MB_DiagnosticsInit(void)
|
||||
* @param data Указатель куда положить данные
|
||||
* @return 1 - успех, 0 - ошибка
|
||||
*/
|
||||
int MB_GetDiagnosticResponse(RS_MsgTypeDef *modbus_msg, uint16_t *data)
|
||||
int MB_RespGet_Diagnostic(RS_MsgTypeDef *modbus_msg, uint16_t *data)
|
||||
{
|
||||
if(modbus_msg == NULL || data == NULL)
|
||||
return 0;
|
||||
@@ -319,7 +319,7 @@ MB_DeviceModeTypeDef MB_GetDeviceMode(void)
|
||||
#else //MODBUS_ENABLE_DIAGNOSTICS
|
||||
|
||||
void MB_DiagnosticsInit(void) {}
|
||||
int MB_GetDiagnosticResponse(RS_MsgTypeDef *modbus_msg, uint16_t *data) {return 0;}
|
||||
int MB_RespGet_Diagnostic(RS_MsgTypeDef *modbus_msg, uint16_t *data) {return 0;}
|
||||
int MB_Diagnostics_WriteBit(int bit_num, int bit_state) {return 0;}
|
||||
int MB_Diagnostics_GetBit(int bit_num) {return 0;}
|
||||
uint8_t MB_Process_Diagnostics(RS_MsgTypeDef *modbus_msg) {return 0;}
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
* @param reg_value Указатель для значения регистра
|
||||
* @return 1 - успех, 0 - ошибка или reg_addr вне диапазона запроса
|
||||
*/
|
||||
int MB_GetRegisterValue(RS_MsgTypeDef *modbus_msg, uint16_t reg_addr, uint16_t *reg_value)
|
||||
int MB_RespGet_RegisterValue(RS_MsgTypeDef *modbus_msg, uint16_t reg_addr, uint16_t *reg_value)
|
||||
{
|
||||
if(modbus_msg == NULL || reg_value == NULL)
|
||||
return 0;
|
||||
@@ -486,7 +486,7 @@ RS_MsgTypeDef MB_REQUEST_READ_DEVICE_ID_SPECIFIC(uint8_t slave_addr, uint8_t obj
|
||||
#else
|
||||
RS_MsgTypeDef msg_dummy = {0};
|
||||
|
||||
int MB_GetRegisterValue(RS_MsgTypeDef *modbus_msg, uint16_t reg_addr, uint16_t *reg_value) {return 0;}
|
||||
int MB_RespGet_RegisterValue(RS_MsgTypeDef *modbus_msg, uint16_t reg_addr, uint16_t *reg_value) {return 0;}
|
||||
|
||||
RS_MsgTypeDef MB_REQUEST_READ_COILS(uint8_t slave_addr, uint16_t start_addr, uint16_t quantity) {return msg_dummy;}
|
||||
RS_MsgTypeDef MB_REQUEST_READ_DISCRETE_INPUTS(uint8_t slave_addr, uint16_t start_addr, uint16_t quantity) {return msg_dummy;}
|
||||
|
||||
115
README.md
115
README.md
@@ -3,7 +3,7 @@
|
||||
Библиотека реализует Modbus RTU Slave для STM32 с использованием HAL. Работает в прерываниях с детектированием конца фрейма по IDLE линии и таймаутами через прерывание таймера.
|
||||
|
||||
## Быстрый старт
|
||||
_Note: Здесь описано подключение просто архива c исходниками. Если надо подключить библиотеку как субмодуль: см. ветку release в этом репозитории._
|
||||
_Note: Здесь описано подключение просто архива c исходниками. Если надо подключить библиотеку как субмодуль: см. ветку **release** в этом репозитории._
|
||||
|
||||
### 1. Настройка периферии
|
||||
|
||||
@@ -55,37 +55,77 @@ void TIMx_IRQHandler(void)
|
||||
// Периферия
|
||||
#define mb_huart huart1 // Удобный дефайн для модбасовского UART
|
||||
#define mb_htim htim3 // Удобный дефайн для модбасовского таймера
|
||||
|
||||
// Модули modbus
|
||||
#define MODBUS_ENABLE_SLAVE ///< Включить обработку МАСТЕР режима
|
||||
//#define MODBUS_ENABLE_MASTER ///< Включить обработку СЛЕЙВ режима
|
||||
|
||||
#define MODBUS_ENABLE_COILS ///< Включить обработку коилов
|
||||
#define MODBUS_ENABLE_HOLDINGS ///< Включить обработку регистров хранения
|
||||
#define MODBUS_ENABLE_INPUTS ///< Включить обработку входных регистров
|
||||
#define MODBUS_ENABLE_DEVICE_IDENTIFICATIONS ///< Включить обработку идентификаторы устройства
|
||||
#define MODBUS_ENABLE_DIAGNOSTICS ///< Включить обработку диагностики модбас
|
||||
|
||||
```
|
||||
|
||||
### 4. Инициализация в коде
|
||||
|
||||
В `main()` после инициализации HAL:
|
||||
Чтобы настроить Slave-режим `main()` после инициализации HAL:
|
||||
|
||||
```c
|
||||
#include "modbus.h"
|
||||
|
||||
int main(void)
|
||||
{
|
||||
// Инициализация HAL
|
||||
HAL_Init();
|
||||
SystemClock_Config();
|
||||
MX_GPIO_Init();
|
||||
MX_USART1_UART_Init();
|
||||
MX_TIM3_Init();
|
||||
|
||||
// Инициализация Modbus
|
||||
MODBUS_SetupHardware(&hmodbus1, &mb_huart, &mb_htim);
|
||||
|
||||
// Запуск приема Modbus
|
||||
MODBUS_SlaveStart(&hmodbus1, &MODBUS_MSG);
|
||||
|
||||
while (1)
|
||||
{
|
||||
// Основной цикл
|
||||
}
|
||||
// Инициализация HAL
|
||||
HAL_Init();
|
||||
SystemClock_Config();
|
||||
MX_GPIO_Init();
|
||||
MX_USART1_UART_Init();
|
||||
MX_TIM3_Init();
|
||||
|
||||
// Инициализация Modbus
|
||||
MODBUS_FirstInit(&hmodbus1, &mb_huart, &mb_htim);
|
||||
MODBUS_Config(&hmodbus1, 1, 1000, MODBUS_MODE_SLAVE);
|
||||
|
||||
// Запуск приема Modbus
|
||||
MODBUS_SlaveStart(&hmodbus1, NULL);
|
||||
|
||||
while (1)
|
||||
{
|
||||
// Основной цикл
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Чтобы настроить Master-режим `main()` после инициализации HAL:
|
||||
|
||||
```c
|
||||
#include "modbus.h"
|
||||
|
||||
int main(void)
|
||||
{
|
||||
// Инициализация HAL
|
||||
HAL_Init();
|
||||
SystemClock_Config();
|
||||
MX_GPIO_Init();
|
||||
MX_USART1_UART_Init();
|
||||
MX_TIM3_Init();
|
||||
|
||||
// Инициализация Modbus
|
||||
MODBUS_FirstInit(&hmodbus1, &mb_huart, &mb_htim);
|
||||
MODBUS_Config(&hmodbus1, 0, 1000, MODBUS_MODE_MASTER);
|
||||
|
||||
// Запуск приема Modbus
|
||||
// Запрос на 1 ID, считать холдинг регистры с 0 адреса 10 штук
|
||||
RS_MsgTypeDef msg = MB_MASTER_READ_HOLDING_REGS(1, 0, 10);
|
||||
MODBUS_MasterRequest(&hmodbus1, &msg, &callback_func);
|
||||
void callback_func(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_msg)
|
||||
{
|
||||
// MB_RespGet_... Чтобы достать нужные данные из ответа
|
||||
}
|
||||
}
|
||||
```
|
||||
### 5. Настройка карты данных
|
||||
|
||||
В `modbus_data.h` настройте регистры и coils под ваше устройство:
|
||||
@@ -134,6 +174,7 @@ typedef struct
|
||||
|
||||
### 6. Доступ к данным в коде
|
||||
|
||||
В режиме слейва есть дефайны для удобного выставления Коилов. На случай если они не упакованы в битовые поля
|
||||
```c
|
||||
// Чтение входных регистров
|
||||
uint16_t temp = MB_DATA.InRegs.Temperature;
|
||||
@@ -151,6 +192,41 @@ if (MB_Read_Coil_Local(&MB_DATA.Coils, 2)) {
|
||||
}
|
||||
```
|
||||
|
||||
В режиме мастера есть функции для получения информации из ответа `MB_RespGet_...()`
|
||||
```c
|
||||
// Чтение регистров: Получить запрошенные регистры
|
||||
uint16_t value;
|
||||
if(MB_RespGet_RegisterValue(&MODBUS_MSG, 105, ®_value))
|
||||
{
|
||||
printf("Register 105 value: %d\n", reg_value);
|
||||
}
|
||||
// Чтение коилов: Получить запрошенные коилы
|
||||
int state;
|
||||
if(MB_RespGet_CoilState(&MODBUS_MSG, 25, &coil_state))
|
||||
{
|
||||
printf("Coil 25 state: %s\n", coil_state ? "ON" : "OFF");
|
||||
}
|
||||
// Чтение диагностики: Получить запрошенныую диагностику
|
||||
uint16_t counter_value;
|
||||
if(MB_RespGet_DiagnosticResponse(&MODBUS_MSG, &counter_value))
|
||||
{
|
||||
printf("Counter value: %d\n", counter_value);
|
||||
}
|
||||
// Чтение идентификаторов: Получить запрошенные идентификаторы
|
||||
uint8_t length;
|
||||
char vendor_name[64];
|
||||
if(MB_RespGet_ObjectById(&MODBUS_MSG, 0x00, vendor_name, &length))
|
||||
{
|
||||
printf("Vendor Name: %s (length: %d)\n", vendor_name, length);
|
||||
}
|
||||
|
||||
uint8_t obj_id, obj_length;
|
||||
char obj_data[64];
|
||||
if(MB_RespGet_ObjectByIndex(&MODBUS_MSG, 0x00, &obj_id, obj_data, &obj_length))
|
||||
{
|
||||
printf("First object - ID: 0x%02X, Data: %s\n", obj_id, obj_data);
|
||||
}
|
||||
```
|
||||
## Поддерживаемые функции Modbus
|
||||
|
||||
| Функция | Код | Описание |
|
||||
@@ -160,6 +236,7 @@ if (MB_Read_Coil_Local(&MB_DATA.Coils, 2)) {
|
||||
| Read Holding Registers | 0x03 | Чтение регистров хранения |
|
||||
| Write Single Coil | 0x05 | Запись одиночного coil |
|
||||
| Write Single Register | 0x06 | Запись одиночного регистра |
|
||||
| Diagnostics (Serial Line only) | 0x08 | Чтение диагностически и управление режимом работы |
|
||||
| Write Multiple Coils | 0x0F | Запись множественных coils |
|
||||
| Write Multiple Registers | 0x10 | Запись множественных регистров |
|
||||
| Read Device Identification | 0x2B | Чтение идентификации устройства |
|
||||
|
||||
@@ -61,7 +61,7 @@ int coil_state = 0;
|
||||
int coil_real_state = 0;
|
||||
void master_callback(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *msg)
|
||||
{
|
||||
if(MB_GetCoilState(msg, coil_to_toggle, &coil_real_state))
|
||||
if(MB_RespGet_CoilState(msg, coil_to_toggle, &coil_real_state))
|
||||
{
|
||||
coil_state = coil_real_state;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user