Мастер: коллбек вызывается и при таймауте
В коллбеке можно понять статус реквеста по hmodbus->RS_STATUS
This commit is contained in:
21
Inc/modbus.h
21
Inc/modbus.h
@@ -36,15 +36,26 @@
|
|||||||
#include "modbus.h"
|
#include "modbus.h"
|
||||||
|
|
||||||
MODBUS_FirstInit(&hmodbus1, &huart1, &htim3);
|
MODBUS_FirstInit(&hmodbus1, &huart1, &htim3);
|
||||||
MODBUS_Config(&hmodbus1, 0, 1000, MODBUS_MODE_MASTER); // - если нужны другие настройки, не из modbus_config.h
|
MODBUS_Config(&hmodbus1, 0, 1000, MODBUS_MODE_MASTER);
|
||||||
// Запрос на 1 ID, считать холдинг регистры с 0 адреса 10 штук
|
// Запрос на 1 ID, считать холдинг регистры с 0 адреса 10 штук
|
||||||
RS_MsgTypeDef msg = MB_REQUEST_READ_HOLDING_REGS(1, 0, 10);
|
RS_MsgTypeDef msg = MB_REQUEST_READ_HOLDING_REGS(1, 0, 10);
|
||||||
MODBUS_MasterRequest(&hmodbus1, &msg, &callback_func);
|
MODBUS_MasterRequest(&hmodbus1, &msg, &callback_func);
|
||||||
|
|
||||||
void callback_func(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_msg)
|
void callback_func(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_msg)
|
||||||
{
|
{
|
||||||
// modbus_msg содержит ответ от устройства
|
// MB_RespGet_... Чтобы достать нужные данные из ответа
|
||||||
}
|
if(hmodbus->RS_STATUS == RS_OK)
|
||||||
|
{
|
||||||
|
for(int addr = MODBUS_MSG.Addr; addr < MODBUS_MSG.Addr + MODBUS_MSG.Qnt; addr++)
|
||||||
|
{
|
||||||
|
uint16_t value;
|
||||||
|
if(MB_RespGet_RegisterValue(&MODBUS_MSG, addr, &value))
|
||||||
|
{
|
||||||
|
read_hold[i] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@endverbatim
|
@endverbatim
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -115,6 +115,10 @@ static int dummy;
|
|||||||
#ifndef RS_USER_VARS_NUMB
|
#ifndef RS_USER_VARS_NUMB
|
||||||
#define RS_USER_VARS_NUMB 0
|
#define RS_USER_VARS_NUMB 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef local_time
|
||||||
|
#define local_time() uwTick
|
||||||
|
#endif
|
||||||
/** @endcond */
|
/** @endcond */
|
||||||
|
|
||||||
|
|
||||||
@@ -141,9 +145,10 @@ typedef enum // RS_StatusTypeDef
|
|||||||
/*0x03*/ RS_ABORTED,
|
/*0x03*/ RS_ABORTED,
|
||||||
/*0x04*/ RS_BUSY,
|
/*0x04*/ RS_BUSY,
|
||||||
/*0x05*/ RS_SKIP,
|
/*0x05*/ RS_SKIP,
|
||||||
|
/*0x06*/ RS_TIMEOUT,
|
||||||
|
|
||||||
/*0x06*/ RS_COLLECT_MSG_ERR,
|
/*0x07*/ RS_COLLECT_MSG_ERR,
|
||||||
/*0x07*/ RS_PARSE_MSG_ERR,
|
/*0x08*/ RS_PARSE_MSG_ERR,
|
||||||
|
|
||||||
// reserved values
|
// reserved values
|
||||||
// /*0x00*/ RS_UNKNOWN_ERR = 0x00, ///< reserved for case, if no one error founded (nothing changed response from zero)
|
// /*0x00*/ RS_UNKNOWN_ERR = 0x00, ///< reserved for case, if no one error founded (nothing changed response from zero)
|
||||||
|
|||||||
11
README.md
11
README.md
@@ -123,12 +123,15 @@ ProjectRoot/
|
|||||||
void callback_func(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_msg)
|
void callback_func(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_msg)
|
||||||
{
|
{
|
||||||
// MB_RespGet_... Чтобы достать нужные данные из ответа
|
// MB_RespGet_... Чтобы достать нужные данные из ответа
|
||||||
for(int addr = MODBUS_MSG.Addr; addr < MODBUS_MSG.Addr + MODBUS_MSG.Qnt; addr++)
|
if(hmodbus->RS_STATUS == RS_OK)
|
||||||
{
|
{
|
||||||
uint16_t value;
|
for(int addr = MODBUS_MSG.Addr; addr < MODBUS_MSG.Addr + MODBUS_MSG.Qnt; addr++)
|
||||||
if(MB_RespGet_RegisterValue(&MODBUS_MSG, addr, &value))
|
|
||||||
{
|
{
|
||||||
read_hold[i] = value;
|
uint16_t value;
|
||||||
|
if(MB_RespGet_RegisterValue(&MODBUS_MSG, addr, &value))
|
||||||
|
{
|
||||||
|
read_hold[i] = value;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -348,16 +348,18 @@ void RS_UART_Handler(RS_HandleTypeDef *hRS)
|
|||||||
RS_Set_RX_End(hRS);
|
RS_Set_RX_End(hRS);
|
||||||
|
|
||||||
// Парсим наше сообщение
|
// Парсим наше сообщение
|
||||||
RS_StatusTypeDef parse_res = RS_Parse_Message(hRS, hRS->pMessagePtr, hRS->pBufferPtr);
|
hRS->RS_STATUS = RS_Parse_Message(hRS, hRS->pMessagePtr, hRS->pBufferPtr);
|
||||||
|
|
||||||
// Если сообещине принято корректно
|
// Если сообещине принято корректно
|
||||||
if(parse_res == RS_OK)
|
if(hRS->RS_STATUS == RS_OK)
|
||||||
{
|
{
|
||||||
RS_Timeout_Stop(hRS);
|
RS_Timeout_Stop(hRS);
|
||||||
|
|
||||||
hRS->lastPacketTick = uwTick;
|
hRS->lastPacketTick = local_time();
|
||||||
if(hRS->sRS_Mode < RS_MASTER_MODE_START)
|
if(hRS->sRS_Mode < RS_MASTER_MODE_START)
|
||||||
|
{
|
||||||
RS_Response(hRS, hRS->pMessagePtr); // отвечаем на запрос
|
RS_Response(hRS, hRS->pMessagePtr); // отвечаем на запрос
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(hRS->pCallback)
|
if(hRS->pCallback)
|
||||||
@@ -435,12 +437,20 @@ void RS_TIM_Handler(RS_HandleTypeDef *hRS)
|
|||||||
HAL_TIM_IRQHandler(hRS->htim);
|
HAL_TIM_IRQHandler(hRS->htim);
|
||||||
|
|
||||||
RS_Abort(hRS, ABORT_RS);
|
RS_Abort(hRS, ABORT_RS);
|
||||||
|
|
||||||
|
|
||||||
if(hRS->pMessagePtr->MbAddr == hRS->ID) // ошибка если таймаут по нашему сообщению
|
hRS->RS_STATUS = RS_TIMEOUT;
|
||||||
TrackerCnt_Err(hRS->rs_err);
|
|
||||||
|
if(hRS->sRS_Mode < RS_MASTER_MODE_START)
|
||||||
|
if(hRS->pMessagePtr->MbAddr == hRS->ID) // ошибка если таймаут по нашему сообщению
|
||||||
|
TrackerCnt_Err(hRS->rs_err);
|
||||||
|
|
||||||
if(hRS->sRS_Mode == RS_MASTER_REQUEST) {
|
if(hRS->sRS_Mode >= RS_MASTER_MODE_START)
|
||||||
// Мастер: таймаут ответа -> освобождаем для нового запроса
|
{ // Мастер: коллбек и освобождение для нового запроса
|
||||||
|
if(hRS->pCallback)
|
||||||
|
{
|
||||||
|
hRS->pCallback(hRS, hRS->pMessagePtr); // обрабатываем ответ
|
||||||
|
}
|
||||||
RS_Set_Free(hRS);
|
RS_Set_Free(hRS);
|
||||||
} else {
|
} else {
|
||||||
// Слейв: перезапускаем прием
|
// Слейв: перезапускаем прием
|
||||||
|
|||||||
Reference in New Issue
Block a user