Добавлены таймауты CAN

This commit is contained in:
cfif 2026-08-27 17:51:36 +03:00
parent 4da836da77
commit b6c7dd4821
5 changed files with 75 additions and 40 deletions

View File

@ -55,16 +55,6 @@ static const CAN_MonitorEntry_t g_can_monitors[] = {
#define CAN_MONITOR_COUNT (sizeof(g_can_monitors) / sizeof(g_can_monitors[0])) #define CAN_MONITOR_COUNT (sizeof(g_can_monitors) / sizeof(g_can_monitors[0]))
// Функция поиска монитора по CAN ID
static FrameMonitor_t* FindMonitorByCanId(uint32_t can_id) {
for (uint32_t i = 0; i < CAN_MONITOR_COUNT; i++) {
if (g_can_monitors[i].can_id == can_id) {
return g_can_monitors[i].monitor;
}
}
return NULL; // Не найден
}
void CanSpamReceiver_Init(tCanSpamReceiver *env, void CanSpamReceiver_Init(tCanSpamReceiver *env,
tSerialPortFrameIO *ioCanFrame, tSerialPortFrameIO *ioCanFrame,
tLoggerInterface *logger) { tLoggerInterface *logger) {
@ -79,10 +69,8 @@ void CanSpamReceiver_Init(tCanSpamReceiver *env,
} }
// VIN // VIN
FrameMonitor_t *vin_mon = FindMonitorByCanId(VEH_VIN_CANID); FrameMonitor_t *vin_mon = g_can_monitors[CAN_IDX_VEH_VIN].monitor;
if (vin_mon != NULL) { vin_mon->timeout_cycle = 45000; // 45 секунд для VIN
vin_mon->timeout_cycle = 45000; // 45 секунд
}
/* /*
env->ccu_candb_rx_LOCAL_HVAC_VIN = osMessageQueueNew(1, 17, NULL); env->ccu_candb_rx_LOCAL_HVAC_VIN = osMessageQueueNew(1, 17, NULL);

View File

@ -11,6 +11,41 @@
#include "LoggerInterface.h" #include "LoggerInterface.h"
#include "crc32_m7.h" #include "crc32_m7.h"
// Индексы таблицы g_can_monitors
typedef enum {
CAN_IDX_ESC_04, // 0
CAN_IDX_EMS_VEH, // 1
CAN_IDX_BCM_POWERTRAIN, // 2
CAN_IDX_EMS_VEH_02, // 3
CAN_IDX_BCM_EEM, // 4
CAN_IDX_DMFR_MSG1, // 5
CAN_IDX_DMFL_MSG1, // 6
CAN_IDX_TM_STAT, // 7
CAN_IDX_TM_CP, // 8
CAN_IDX_HVC_CCU_STATUS_MSG, // 9
CAN_IDX_BCM_VEH_STATE, // 10
CAN_IDX_EMS_HVC_REQ_MSG, // 11
CAN_IDX_HVC_ERR_STATUS_MSG, // 12
CAN_IDX_BCM_CLIMATIC_DATA, // 13
CAN_IDX_VCU_CCU_REQ, // 14
CAN_IDX_ESC_08, // 15
CAN_IDX_SMFL_STATUS, // 16
CAN_IDX_SMFR_STATUS, // 17
CAN_IDX_SMRL_STATUS, // 18
CAN_IDX_SMRR_STATUS, // 19
CAN_IDX_SDM_CMD, // 20
CAN_IDX_VEH_VIN, // 21
CAN_IDX_OCUFL_MSG, // 22
CAN_IDX_OCUFR_MSG, // 23
CAN_IDX_OCURL_MSG, // 24
CAN_IDX_OCURR_MSG, // 25
CAN_IDX_DW_STATE, // 26
CAN_IDX_FIU_CCU1, // 27
CAN_IDX_FIU_CCU2, // 28
CAN_IDX_FIU_CCU3, // 29
} CAN_MonitorIndex_t;
typedef struct { typedef struct {

View File

@ -861,6 +861,12 @@ static _Noreturn void ModelTask_Thread(tModelTask *env) {
//начало--------------------------------------------------ВЫХОД МОДЕЛИ ДЛЯ CAN------------------------------------------ //начало--------------------------------------------------ВЫХОД МОДЕЛИ ДЛЯ CAN------------------------------------------
memcpy(&env->ccu_candb_tx.CCU_Errors, &rtY.CCU_Errors_model, sizeof(env->ccu_candb_tx.CCU_Errors)); memcpy(&env->ccu_candb_tx.CCU_Errors, &rtY.CCU_Errors_model, sizeof(env->ccu_candb_tx.CCU_Errors));
//начало--------------------------------------------------ВЫХОД МОДЕЛИ ДЛЯ DTC------------------------------------------
memcpy(env->dtc_state_error, rtY.dtc_state_error_model, sizeof(env->dtc_state_error));
set_Dtc_state(env->diagnostic, &env->ccu_candb_tx.CCU_Errors, env->dtc_state_error, env->GET_HVAC_VIN);
//конец--------------------------------------------------ВЫХОД МОДЕЛИ ДЛЯ DTC-------------------------------------------
memcpy(&env->ccu_candb_tx.CCU_Stat1, &rtY.CCU_Stat1_model, sizeof(env->ccu_candb_tx.CCU_Stat1)); memcpy(&env->ccu_candb_tx.CCU_Stat1, &rtY.CCU_Stat1_model, sizeof(env->ccu_candb_tx.CCU_Stat1));
memcpy(&env->ccu_candb_tx.CCU_Stat2, &rtY.CCU_Stat2_model, sizeof(env->ccu_candb_tx.CCU_Stat2)); memcpy(&env->ccu_candb_tx.CCU_Stat2, &rtY.CCU_Stat2_model, sizeof(env->ccu_candb_tx.CCU_Stat2));
memcpy(&env->ccu_candb_tx.CCU_HVC_Req_Msg, &rtY.CCUCAN_HVC_REQ_MSG_MODEL, memcpy(&env->ccu_candb_tx.CCU_HVC_Req_Msg, &rtY.CCUCAN_HVC_REQ_MSG_MODEL,
@ -1000,11 +1006,6 @@ static _Noreturn void ModelTask_Thread(tModelTask *env) {
CanUdsInput_Set_Model(env->canUds); CanUdsInput_Set_Model(env->canUds);
//конец--------------------------------------------------ВЫХОД МОДЕЛИ ДЛЯ UDS------------------------------------------- //конец--------------------------------------------------ВЫХОД МОДЕЛИ ДЛЯ UDS-------------------------------------------
//начало--------------------------------------------------ВЫХОД МОДЕЛИ ДЛЯ DTC------------------------------------------
memcpy(env->dtc_state_error, rtY.dtc_state_error_model, sizeof(env->dtc_state_error));
set_Dtc_state(env->diagnostic, env->dtc_state_error, env->GET_HVAC_VIN);
//конец--------------------------------------------------ВЫХОД МОДЕЛИ ДЛЯ DTC-------------------------------------------
env->isRunning = true; env->isRunning = true;
osMutexRelease(env->access); osMutexRelease(env->access);
} else { } else {

View File

@ -17,7 +17,6 @@ void Diagnostic_Init(tDiagnostic *env, tLoggerInterface *logger) {
env->access = osMutexNew(NULL); env->access = osMutexNew(NULL);
env->timeoutDTC[DTC_VIN_INVALID_CONFIG] = SystemGetMs() + 45000;
// for (uint8_t i = 0; i < COUNT_DTC_CODE_ERROR; ++i) { // for (uint8_t i = 0; i < COUNT_DTC_CODE_ERROR; ++i) {
@ -150,26 +149,40 @@ void set_NoBitsDTC(tDiagnostic *env, bool noBitsDTC) {
} }
} }
void set_Dtc_state(tDiagnostic *env, uint8_t *dtc_state_error_model, char *VIN) { static bool isVINError(char *VIN) {
if (VIN == NULL) {
return false; // NULL — не ошибка (ещё нет данных)
}
// Пустой VIN (нули) — ещё не собран → НЕ ошибка
if (memcmp(VIN, "00000000000000000", 17) == 0) {
return false; // НЕ ошибка!
}
// Проверка на совпадение с эталоном
if (memcmp(VIN, statusData.ecu.Vehicle_Identification, 17) == 0) {
return false; // Валидный - не ошибка
}
// VIN собран, но не совпадает с эталоном - ОШИБКА
return true;
}
void set_Dtc_state(tDiagnostic *env, CCU_Errors_t *CCU_Errors, uint8_t *dtc_state_error_model, char *VIN) {
if (osMutexAcquire(env->access, 5000) == osOK) { if (osMutexAcquire(env->access, 5000) == osOK) {
bool errorVIN = false; bool vin_timeout = ccu_candb_error_rx.VEH_VIN;
int result = memcmp(VIN, statusData.ecu.Vehicle_Identification, 17); bool vin_error = isVINError(VIN);
if (result != 0) {
errorVIN = true;
} else {
result = memcmp(VIN, "00000000000000000", 17);
if (result == 0) { // DTC = 1 только если:
errorVIN = true; // - VIN собран, но невалидный
} else { // - ИЛИ таймаут (сообщение VIN вообще не приходит)
errorVIN = false; if (vin_error || vin_timeout) {
}
}
if ((errorVIN) && (SystemGetMs() > env->timeoutDTC[DTC_VIN_INVALID_CONFIG])) {
dtc_state_error_model[DTC_VIN_INVALID_CONFIG] = 1; dtc_state_error_model[DTC_VIN_INVALID_CONFIG] = 1;
CCU_Errors->CCU_VinRecordErr_Stat = 1;
} else {
dtc_state_error_model[DTC_VIN_INVALID_CONFIG] = 0;
CCU_Errors->CCU_VinRecordErr_Stat = 0;
} }
memcpy(dtc_state_error, dtc_state_error_model, sizeof(dtc_state_error)); memcpy(dtc_state_error, dtc_state_error_model, sizeof(dtc_state_error));

View File

@ -7,6 +7,7 @@
#include <cmsis_os.h> #include <cmsis_os.h>
#include "LoggerInterface.h" #include "LoggerInterface.h"
#include "ccu_candb-binutil.h"
typedef struct { typedef struct {
@ -20,14 +21,11 @@ typedef struct {
bool isNoBitsDTC; bool isNoBitsDTC;
uint32_t timeoutDTC[127];
} tDiagnostic; } tDiagnostic;
void Diagnostic_Init(tDiagnostic *env, tLoggerInterface *logger); void Diagnostic_Init(tDiagnostic *env, tLoggerInterface *logger);
void set_NoBitsDTC(tDiagnostic *env, bool noBitsDTC); void set_Dtc_state(tDiagnostic *env, CCU_Errors_t *CCU_Errors, uint8_t *dtc_state_error_model, char *VIN);
void set_Dtc_state(tDiagnostic *env, uint8_t *dtc_state_error_model, char *VIN);
uint32_t diagnostic_ClearDiagnosticInformation_14(tDiagnostic *env); uint32_t diagnostic_ClearDiagnosticInformation_14(tDiagnostic *env);
uint32_t diagnostic_UDS_ReadDTCInformation_19_count(tDiagnostic *env, tDiagnosticDTC *diagnosticDTC); uint32_t diagnostic_UDS_ReadDTCInformation_19_count(tDiagnostic *env, tDiagnosticDTC *diagnosticDTC);