Добавлено автоотключение polling, если модбас больше не приходит

This commit is contained in:
Razvalyaev 2025-09-12 13:14:12 +03:00
parent b024569ca4
commit 43ac7e90fc
3 changed files with 221 additions and 196 deletions

View File

@ -3,7 +3,7 @@
CANEmu_HandleTypeDef hcanemu;
uint32_t mbox;
CANEmu_HandleTypeDef hcanemu;
int disable_poll_timeout = 1000;
int flag_manual = 0;
int transmit_prev = 0;
@ -41,55 +41,60 @@ void CAN_SendFrame(CANEmu_HandleTypeDef *canemu)
void CANEmu_Working(CANEmu_HandleTypeDef *canemu)
{
if(flag_manual == 0)
{
canemu->start_poll = MB_DATA.Coils.START_POLLING;
canemu->transmit = MB_DATA.Coils.START_SINGLE_FRAME;
canemu->period_ms = MB_DATA.HoldRegs.CAN_PERIOD;
if(canemu->period_ms < CAN_MIN_PERIOD)
{
canemu->period_ms = CAN_MIN_PERIOD;
}
// can message
canemu->header.IDE = MB_DATA.Coils.HEADER_IDE;
canemu->header.RTR = MB_DATA.Coils.HEADER_RTR;
canemu->bitrate_bps = (uint32_t)MB_DATA.HoldRegs.CAN_BITRATE_KBPS*1000;
canemu->header.ExtId = ((uint32_t)MB_DATA.HoldRegs.CAN_ID_HI << 16) | MB_DATA.HoldRegs.CAN_ID_LO;
canemu->header.StdId = canemu->header.ExtId;
canemu->header.DLC = (uint8_t)MB_DATA.HoldRegs.CAN_DLC & 0xF;
canemu->data[0] = (uint8_t)MB_DATA.HoldRegs.CAN_DATA_0;
canemu->data[1] = (uint8_t)MB_DATA.HoldRegs.CAN_DATA_1;
canemu->data[2] = (uint8_t)MB_DATA.HoldRegs.CAN_DATA_2;
canemu->data[3] = (uint8_t)MB_DATA.HoldRegs.CAN_DATA_3;
canemu->data[4] = (uint8_t)MB_DATA.HoldRegs.CAN_DATA_4;
canemu->data[5] = (uint8_t)MB_DATA.HoldRegs.CAN_DATA_5;
canemu->data[6] = (uint8_t)MB_DATA.HoldRegs.CAN_DATA_6;
canemu->data[7] = (uint8_t)MB_DATA.HoldRegs.CAN_DATA_7;
// errors
canemu->errors.bit.FF_SRS = MB_DATA.Coils.FLIP_SRS;
canemu->errors.bit.FF_IDE = MB_DATA.Coils.FLIP_IDE;
canemu->errors.bit.FF_RTR = MB_DATA.Coils.FLIP_RTR;
canemu->errors.bit.FF_R1 = MB_DATA.Coils.FLIP_R1;
canemu->errors.bit.FF_R0 = MB_DATA.Coils.FLIP_R0;
canemu->errors.bit.MSGID = MB_DATA.Coils.FLIP_MSGID_BIT;
canemu->errors.bit.DATA = MB_DATA.Coils.FLIP_DATA_BIT;
canemu->errors.bit.CRC_ERR = MB_DATA.Coils.FLIP_CRC_BIT;
canemu->errors.bit.STUFF_BITS = MB_DATA.Coils.DISABLE_STUFF_BITS;
}
uint32_t tick_now = HAL_GetTick();
if(flag_manual == 0)
{
if(tick_now - hmodbus1.lastRxTick > disable_poll_timeout)
MB_DATA.Coils.START_POLLING = 0;
canemu->start_poll = MB_DATA.Coils.START_POLLING;
canemu->transmit = MB_DATA.Coils.START_SINGLE_FRAME;
canemu->period_ms = MB_DATA.HoldRegs.CAN_PERIOD;
if(canemu->period_ms < CAN_MIN_PERIOD)
{
canemu->period_ms = CAN_MIN_PERIOD;
}
// can message
canemu->header.IDE = MB_DATA.Coils.HEADER_IDE;
canemu->header.RTR = MB_DATA.Coils.HEADER_RTR;
canemu->bitrate_bps = (uint32_t)MB_DATA.HoldRegs.CAN_BITRATE_KBPS*1000;
canemu->header.ExtId = ((uint32_t)MB_DATA.HoldRegs.CAN_ID_HI << 16) | MB_DATA.HoldRegs.CAN_ID_LO;
canemu->header.StdId = canemu->header.ExtId;
canemu->header.DLC = (uint8_t)MB_DATA.HoldRegs.CAN_DLC & 0xF;
canemu->data[0] = (uint8_t)MB_DATA.HoldRegs.CAN_DATA_0;
canemu->data[1] = (uint8_t)MB_DATA.HoldRegs.CAN_DATA_1;
canemu->data[2] = (uint8_t)MB_DATA.HoldRegs.CAN_DATA_2;
canemu->data[3] = (uint8_t)MB_DATA.HoldRegs.CAN_DATA_3;
canemu->data[4] = (uint8_t)MB_DATA.HoldRegs.CAN_DATA_4;
canemu->data[5] = (uint8_t)MB_DATA.HoldRegs.CAN_DATA_5;
canemu->data[6] = (uint8_t)MB_DATA.HoldRegs.CAN_DATA_6;
canemu->data[7] = (uint8_t)MB_DATA.HoldRegs.CAN_DATA_7;
// errors
canemu->errors.bit.FF_SRS = MB_DATA.Coils.FLIP_SRS;
canemu->errors.bit.FF_IDE = MB_DATA.Coils.FLIP_IDE;
canemu->errors.bit.FF_RTR = MB_DATA.Coils.FLIP_RTR;
canemu->errors.bit.FF_R1 = MB_DATA.Coils.FLIP_R1;
canemu->errors.bit.FF_R0 = MB_DATA.Coils.FLIP_R0;
canemu->errors.bit.MSGID = MB_DATA.Coils.FLIP_MSGID_BIT;
canemu->errors.bit.DATA = MB_DATA.Coils.FLIP_DATA_BIT;
canemu->errors.bit.CRC_ERR = MB_DATA.Coils.FLIP_CRC_BIT;
canemu->errors.bit.STUFF_BITS = MB_DATA.Coils.DISABLE_STUFF_BITS;
CAN_Init(canemu);
if(canemu->start_poll)
{
canemu->transmit = 0;
HAL_Delay(canemu->period_ms);
CAN_SendFrame(canemu);
}
else if((canemu->transmit == 1) && (transmit_prev == 0))
{
CAN_SendFrame(canemu);
}
transmit_prev = canemu->transmit;
}
CAN_Init(canemu);
if(canemu->start_poll)
{
canemu->transmit = 0;
HAL_Delay(canemu->period_ms);
CAN_SendFrame(canemu);
}
else if((canemu->transmit == 1) && (transmit_prev == 0))
{
CAN_SendFrame(canemu);
}
transmit_prev = canemu->transmit;
}

View File

@ -59,8 +59,8 @@
#define RS_Reset_RX_Flags(_hRS_) RS_Reset_RX_Active_Flags(_hRS_); _hRS_->f.RX_Busy = 0; _hRS_->f.RX_Done = 0; _hRS_->f.RX_Half = 0
#define RS_Reset_TX_Flags(_hRS_) _hRS_->f.TX_Busy = 0; _hRS_->f.TX_Done = 0
#define RS_Set_RX_End_Flag(_hRS_) _hRS_->f.RX_Done = 1;
#define RS_Set_TX_End_Flag(_hRS_) _hRS_->f.TX_Done = 1
#define RS_Set_RX_End_Flag(_hRS_) _hRS_->f.RX_Done = 1; _hRS_->lastRxTick = uwTick;
#define RS_Set_TX_End_Flag(_hRS_) _hRS_->f.TX_Done = 1; _hRS_->lastTxTick = uwTick;
#define RS_Set_RX_End(_hRS_) RS_Reset_RX_Flags(_hRS_); RS_Set_RX_End_Flag(_hRS_)
#define RS_Set_TX_End(_hRS_) RS_Reset_TX_Flags(_hRS_); RS_Set_TX_End_Flag(_hRS_)
@ -186,6 +186,8 @@ typedef struct // RS_HandleTypeDef
/* RS STATUS */
RS_StatusTypeDef RS_STATUS; ///< RS status
uint32_t lastRxTick;
uint32_t lastTxTick;
}RS_HandleTypeDef;
extern RS_HandleTypeDef hmodbus1;

File diff suppressed because one or more lines are too long