Мастер: коллбек вызывается и при таймауте
В коллбеке можно понять статус реквеста по hmodbus->RS_STATUS
This commit is contained in:
21
Inc/modbus.h
21
Inc/modbus.h
@@ -36,15 +36,26 @@
|
||||
#include "modbus.h"
|
||||
|
||||
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 штук
|
||||
RS_MsgTypeDef msg = MB_REQUEST_READ_HOLDING_REGS(1, 0, 10);
|
||||
MODBUS_MasterRequest(&hmodbus1, &msg, &callback_func);
|
||||
|
||||
void callback_func(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_msg)
|
||||
{
|
||||
// modbus_msg содержит ответ от устройства
|
||||
}
|
||||
void callback_func(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *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
|
||||
|
||||
|
||||
|
||||
@@ -115,6 +115,10 @@ static int dummy;
|
||||
#ifndef RS_USER_VARS_NUMB
|
||||
#define RS_USER_VARS_NUMB 0
|
||||
#endif
|
||||
|
||||
#ifndef local_time
|
||||
#define local_time() uwTick
|
||||
#endif
|
||||
/** @endcond */
|
||||
|
||||
|
||||
@@ -141,9 +145,10 @@ typedef enum // RS_StatusTypeDef
|
||||
/*0x03*/ RS_ABORTED,
|
||||
/*0x04*/ RS_BUSY,
|
||||
/*0x05*/ RS_SKIP,
|
||||
/*0x06*/ RS_TIMEOUT,
|
||||
|
||||
/*0x06*/ RS_COLLECT_MSG_ERR,
|
||||
/*0x07*/ RS_PARSE_MSG_ERR,
|
||||
/*0x07*/ RS_COLLECT_MSG_ERR,
|
||||
/*0x08*/ RS_PARSE_MSG_ERR,
|
||||
|
||||
// reserved values
|
||||
// /*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)
|
||||
{
|
||||
// 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;
|
||||
if(MB_RespGet_RegisterValue(&MODBUS_MSG, addr, &value))
|
||||
for(int addr = MODBUS_MSG.Addr; addr < MODBUS_MSG.Addr + MODBUS_MSG.Qnt; addr++)
|
||||
{
|
||||
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_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);
|
||||
|
||||
hRS->lastPacketTick = uwTick;
|
||||
hRS->lastPacketTick = local_time();
|
||||
if(hRS->sRS_Mode < RS_MASTER_MODE_START)
|
||||
{
|
||||
RS_Response(hRS, hRS->pMessagePtr); // отвечаем на запрос
|
||||
}
|
||||
else
|
||||
{
|
||||
if(hRS->pCallback)
|
||||
@@ -436,11 +438,19 @@ void RS_TIM_Handler(RS_HandleTypeDef *hRS)
|
||||
|
||||
RS_Abort(hRS, ABORT_RS);
|
||||
|
||||
if(hRS->pMessagePtr->MbAddr == hRS->ID) // ошибка если таймаут по нашему сообщению
|
||||
TrackerCnt_Err(hRS->rs_err);
|
||||
|
||||
if(hRS->sRS_Mode == RS_MASTER_REQUEST) {
|
||||
// Мастер: таймаут ответа -> освобождаем для нового запроса
|
||||
hRS->RS_STATUS = RS_TIMEOUT;
|
||||
|
||||
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_MODE_START)
|
||||
{ // Мастер: коллбек и освобождение для нового запроса
|
||||
if(hRS->pCallback)
|
||||
{
|
||||
hRS->pCallback(hRS, hRS->pMessagePtr); // обрабатываем ответ
|
||||
}
|
||||
RS_Set_Free(hRS);
|
||||
} else {
|
||||
// Слейв: перезапускаем прием
|
||||
|
||||
Reference in New Issue
Block a user