From 792c9f5db5c30e054b4b24ba845cc6c0e49c7c63 Mon Sep 17 00:00:00 2001 From: cfif Date: Fri, 13 Feb 2026 15:59:41 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LinActuatorWork.c | 82 +++++++++++---------- LinActuatorWork.h | 8 ++- MainModesArbiter.c | 135 ++++++++++++++++++++--------------- MainModesArbiter.h | 15 ++-- MainModesArbiter_InitStage.c | 4 +- 5 files changed, 140 insertions(+), 104 deletions(-) diff --git a/LinActuatorWork.c b/LinActuatorWork.c index 5e6633f..d44b0c5 100644 --- a/LinActuatorWork.c +++ b/LinActuatorWork.c @@ -3,11 +3,21 @@ // #include "LinActuatorWork.h" -#define LOG_SIGN "Lin" + +//#define LOG_SIGN "Lin" #define LOGGER &env->slog.logger +// actuator_Command_Model_local - Выход модели (команды для актуаторов) ЛОКАЛЬНО +// actuator_Command_Model_trigger_local - Выход модели (команды для актуаторов) ЗАХВАТ +// actuator_Output_Model_local - Вход модели (состояния актуаторов) ЛОКАЛЬНЫЙ +// actuator_Output_Model_model - Вход модели (состояния актуаторов) МОДЕЛИ -void LinActuatorWork(tMma *env, tLinTaskActuator *linTaskActuator) { +void LinActuatorWork(tMma *env, tLinTaskActuator *linTaskActuator, + ActuatorCmdBus *actuator_Command_Model_local, + ActuatorCmdBus *actuator_Command_Model_trigger_local, + ActuatorCmdBusInput *actuator_Output_Model_local, + ActuatorCmdBusInput *actuator_Output_Model_model, + char *LOG_SIGN) { if (osMutexAcquire(linTaskActuator->access, 5000) == osOK) { @@ -16,41 +26,43 @@ void LinActuatorWork(tMma *env, tLinTaskActuator *linTaskActuator) { for (uint8_t i = 0; i < linTaskActuator->LIN_ISSR_ALL; ++i) { - linTaskActuator->linCommandActuator[i].POS = env->controllerData_local.POS[i]; - linTaskActuator->linCommandActuator[i].BUS_ADR = env->controllerData_local.BUS_ADR[i]; - linTaskActuator->linCommandActuator[i].MODE = env->controllerData_local.MODE[i]; + linTaskActuator->linCommandActuator[i].POS = actuator_Command_Model_local->POS[i]; + linTaskActuator->linCommandActuator[i].BUS_ADR = actuator_Command_Model_local->BUS_ADR[i]; + linTaskActuator->linCommandActuator[i].MODE = actuator_Command_Model_local->MODE[i]; // Если команда выполнена if (linTaskActuator->linCommandActuator[i].COM == LIN_ACT_CFR_SUCCESSFUL) { #if (LOG_LIN_ACTUATOR == 1) - LoggerInfoStatic(LOGGER, LOG_SIGN, "SUCCESSFUL COMMAND") +// LoggerInfoStatic(LOGGER, LOG_SIGN, "SUCCESSFUL COMMAND") #endif // Установка входной команды в LIN_ACT_CFR_NONE - env->controllerData_local.COM[i] = LIN_ACT_CFR_NONE; + actuator_Command_Model_local->COM[i] = LIN_ACT_CFR_NONE; } - linTaskActuator->linCommandActuator[i].COM = env->controllerData_local.COM[i]; - linTaskActuator->linCommandActuator[i].Stall_SET = env->controllerData_local.Stall_SET[i]; - linTaskActuator->linCommandActuator[i].Lnoise_SET = env->controllerData_local.Lnoise_SET[i]; - linTaskActuator->linCommandActuator[i].Autos_SET = env->controllerData_local.Autos_SET[i]; - linTaskActuator->linCommandActuator[i].Speed_SET = env->controllerData_local.Speed_SET[i]; - linTaskActuator->linCommandActuator[i].Coils_Stop_SET = env->controllerData_local.Coils_Stop_SET[i]; + linTaskActuator->linCommandActuator[i].COM = actuator_Command_Model_local->COM[i]; + linTaskActuator->linCommandActuator[i].Stall_SET = actuator_Command_Model_local->Stall_SET[i]; + linTaskActuator->linCommandActuator[i].Lnoise_SET = actuator_Command_Model_local->Lnoise_SET[i]; + linTaskActuator->linCommandActuator[i].Autos_SET = actuator_Command_Model_local->Autos_SET[i]; + linTaskActuator->linCommandActuator[i].Speed_SET = actuator_Command_Model_local->Speed_SET[i]; + linTaskActuator->linCommandActuator[i].Coils_Stop_SET = actuator_Command_Model_local->Coils_Stop_SET[i]; - env->controllerDataInput_local.in_CPOS_ALL_Ch0[i] = (int16_t) linTaskActuator->linStateActuator[i].CPOS_ALL; - env->controllerDataInput_local.in_Act_Emrf_Slave_Ch0[i] = (int8_t) linTaskActuator->linStateActuator[i].Emrf_Slave; - env->controllerDataInput_local.in_Mode_Slave_Ch0[i] = (int8_t) linTaskActuator->linStateActuator[i].Mode_Slave; - env->controllerDataInput_local.in_Act_Err1_Supply_Ch0[i] = (int8_t) linTaskActuator->linStateActuator[i].Error1_Supply_Slave; - env->controllerDataInput_local.in_Act_Err2_Communication_Ch0[i] = (int8_t) linTaskActuator->linStateActuator[i].Error2_Communication_Slave; - env->controllerDataInput_local.in_Act_Err3_Temperature_Ch0[i] = (int8_t) linTaskActuator->linStateActuator[i].Error3_Temperature_Slave; - env->controllerDataInput_local.in_Act_Err4_Permanent_Electrical_Ch0[i] = (int8_t) linTaskActuator->linStateActuator[i].Error4_Permanent_Electrical_Slave; - env->controllerDataInput_local.in_Act_Stall_Slave_Ch0[i] = linTaskActuator->linStateActuator[i].Stall_Slave; - env->controllerDataInput_local.in_Act_Reset_Ch0[i] = linTaskActuator->linStateActuator[i].Reset_Slave; + // Заполнение данных ВХОДЫ МОДЕЛИ + actuator_Output_Model_local->in_CPOS_ALL_Ch0[i] = (int16_t) linTaskActuator->linStateActuator[i].CPOS_ALL; + actuator_Output_Model_local->in_Act_Emrf_Slave_Ch0[i] = (int8_t) linTaskActuator->linStateActuator[i].Emrf_Slave; + actuator_Output_Model_local->in_Mode_Slave_Ch0[i] = (int8_t) linTaskActuator->linStateActuator[i].Mode_Slave; + actuator_Output_Model_local->in_Act_Err1_Supply_Ch0[i] = (int8_t) linTaskActuator->linStateActuator[i].Error1_Supply_Slave; + actuator_Output_Model_local->in_Act_Err2_Communication_Ch0[i] = (int8_t) linTaskActuator->linStateActuator[i].Error2_Communication_Slave; + actuator_Output_Model_local->in_Act_Err3_Temperature_Ch0[i] = (int8_t) linTaskActuator->linStateActuator[i].Error3_Temperature_Slave; + actuator_Output_Model_local->in_Act_Err4_Permanent_Electrical_Ch0[i] = (int8_t) linTaskActuator->linStateActuator[i].Error4_Permanent_Electrical_Slave; + actuator_Output_Model_local->in_Act_Stall_Slave_Ch0[i] = linTaskActuator->linStateActuator[i].Stall_Slave; + actuator_Output_Model_local->in_Act_Reset_Ch0[i] = linTaskActuator->linStateActuator[i].Reset_Slave; } env->isActuatorWorkBusy = setBusy(linTaskActuator); - env->in_Error_Connect_Ch0 = linTaskActuator->error_connect; - env->in_Busy_Ch0 = linTaskActuator->busy; + // Заполнение данных ВХОДЫ МОДЕЛИ + actuator_Output_Model_local->Error_Connect_Ch0 = linTaskActuator->error_connect; + actuator_Output_Model_local->Busy_Ch0 = linTaskActuator->busy; } osMutexRelease(linTaskActuator->access); @@ -65,7 +77,7 @@ void LinActuatorWork(tMma *env, tLinTaskActuator *linTaskActuator) { LoggerInfoStatic(LOGGER, LOG_SIGN, "DETECT COMMAND") #endif // - env->in_Busy_Ch0 = 1; + actuator_Output_Model_local->Busy_Ch0 = 1; } // Если прията команда и актуатор не занят @@ -74,24 +86,20 @@ void LinActuatorWork(tMma *env, tLinTaskActuator *linTaskActuator) { env->ModelTask.triggerCommand = false; env->isActuatorWorkBusy = true; + // начало --- ВЫХОД МОДЕЛИ ---------- + + // ВЫХОД МОДЕЛИ + memcpy(actuator_Command_Model_local, actuator_Command_Model_trigger_local, sizeof(ActuatorCmdBus)); + // Сброс STALL в состоянии актуатор и локальном состоянии - resetStall(linTaskActuator, (uint8_t *) env->controllerDataInput_local.in_Act_Stall_Slave_Ch0); + resetStall(linTaskActuator, (uint8_t *) actuator_Output_Model_local->in_Act_Stall_Slave_Ch0, LOG_SIGN); - // ВЫХОД МОДЕЛИ (АКТУАТОР) - //memcpy(&env->rtY_local.Out1, &controllerData, sizeof(rtY.Out1)); - memcpy(&env->controllerData_local, &controllerData, sizeof(ActuatorCmdBus)); - - // Копирование команд - for (uint8_t i = 0; i < linTaskActuator->LIN_ISSR_ALL; ++i) { - env->controllerData_local.COM[i] = env->ModelTask.numCommand[i]; - } + // конец --- ВЫХОД МОДЕЛИ ---------- } // ВХОДЫ МОДЕЛИ - memcpy(&rtDW.controllerDataInput, &env->controllerDataInput_local, sizeof(rtDW.controllerDataInput)); - rtDW.Busy_Ch0 = env->in_Busy_Ch0; - rtDW.Error_Connect_Ch0 = env->in_Error_Connect_Ch0; + memcpy(actuator_Output_Model_model, actuator_Output_Model_local, sizeof(ActuatorCmdBusInput)); osMutexRelease(env->ModelTask.access); } diff --git a/LinActuatorWork.h b/LinActuatorWork.h index 57319b0..fa26ce2 100644 --- a/LinActuatorWork.h +++ b/LinActuatorWork.h @@ -6,7 +6,13 @@ #define HVAC_M7_LINACTUATORWORK_H #include "MainModesArbiter_Private.h" +#include "HVAC_model_types.h" -void LinActuatorWork(tMma *env, tLinTaskActuator *linTaskActuator); +void LinActuatorWork(tMma *env, tLinTaskActuator *linTaskActuator, + ActuatorCmdBus *actuator_Command_Model_local, + ActuatorCmdBus *actuator_Command_Model_trigger_local, + ActuatorCmdBusInput *actuator_Output_Model_local, + ActuatorCmdBusInput *actuator_Output_Model_model, + char *LOG_SIGN); #endif //HVAC_M7_LINACTUATORWORK_H diff --git a/MainModesArbiter.c b/MainModesArbiter.c index 034aaef..f888b1a 100644 --- a/MainModesArbiter.c +++ b/MainModesArbiter.c @@ -4,7 +4,7 @@ #include "MainModesArbiter_Private.h" #include "stdio.h" #include "fc7xxx_driver_rgm.h" -#include "Model_actuator.h" +#include "HVAC_model.h" #include "LinActuatorWork.h" #include "ADC_Temp_Table.h" @@ -187,7 +187,8 @@ void LoadDataInFromModel(tMma *env) { if (env->adcTask1.ADC_isUpdate) { env->adcTask1.ADC_isUpdate = false; - memcpy(&env->ADC_Data_Model_local.VN7008AJ_DIAG_FrontLINActuatorPowerDriverAB, &env->adcTask1.ADC1_Data, sizeof(env->adcTask1.ADC1_Data)); + memcpy(&env->ADC_Data_Model_local.VN7008AJ_DIAG_FrontLINActuatorPowerDriverAB, &env->adcTask1.ADC1_Data, + sizeof(env->adcTask1.ADC1_Data)); asm("nop"); // R1 = 91000 R2 = 16000 ((5 * (91000 + 16000)) / 16000 = 33.4375 В) @@ -248,7 +249,7 @@ static _Noreturn void Mma_Thread(tMma *env) { Mma_InitStage(env); init_fast_lookup_table(ALG_STEINHART); -// can_rx_message_type frame_data; + can_rx_message_type frame_data; // uint32_t step = 0; @@ -261,7 +262,7 @@ static _Noreturn void Mma_Thread(tMma *env) { LoadDataInFromModel(env); -// ModelTask_StartThread(&env->ModelTask); + ModelTask_StartThread(&env->ModelTask); /* @@ -302,14 +303,16 @@ static _Noreturn void Mma_Thread(tMma *env) { LoggerFormatInfo(LOGGER, LOG_TASK_ARB, "PWM (Rear Reserve) = %d", pwm4) */ LoadDataInFromModel(env); -// LinActuatorWork(env, &env->linTaskActuator1); + LinActuatorWork(env, &env->linTaskActuator1, + &env->actuator_Ch0_Command_Model_local_1, + &env->ModelTask.triggerActuatorCmdBus_1, + &env->actuator_Ch0_Input_Model_local_1, + &rtDW.Actuator_Ch0_Status_Model, "Ln1 "); - SystemDelayMs(100); + SystemDelayMs(50); GpioPinToggle(&env->gpios->led.LED_G); - SystemDelayMs(100); - /* if (RGM_SRS_WAKEUP_MASK == (RGM->SRS & RGM_SRS_WAKEUP_MASK)) { @@ -335,7 +338,7 @@ static _Noreturn void Mma_Thread(tMma *env) { /* uint8_t local[9]; - tLinTaskActuator *linTaskActuator = &env->linTaskActuator2; + tLinTaskActuator *linTaskActuator = &env->linTaskActuator1; if (osMutexAcquire(linTaskActuator->access, 5000) == osOK) { @@ -365,7 +368,7 @@ static _Noreturn void Mma_Thread(tMma *env) { linTaskActuator->linCommandActuator[0].COM = LIN_ACT_CFR_INI; linTaskActuator->linCommandActuator[0].BUS_ADR = 0; - linTaskActuator->linCommandActuator[0].POS = 6000; + linTaskActuator->linCommandActuator[0].POS = 2000; ++step; break; @@ -402,19 +405,14 @@ static _Noreturn void Mma_Thread(tMma *env) { //SystemDelayMs(10000); for (uint32_t i = 0; i < 100; ++i) { - - - if (osMutexAcquire(env->adcTask1.access, 1000) == osOK) { - - if (env->adcTask1.ADC_isUpdate) { - env->adcTask1.ADC_isUpdate = false; - - VN7008AJ(env, "VN7008AJ_FrontLINActuatorPowerDriverAB", - env->adcTask1.ADC1_Data.VN7008AJ_FrontLINActuatorPowerDriverAB); - } - - osMutexRelease(env->adcTask1.access); - } +// if (osMutexAcquire(env->adcTask1.access, 1000) == osOK) { +// if (env->adcTask1.ADC_isUpdate) { +// env->adcTask1.ADC_isUpdate = false; +// VN7008AJ(env, "VN7008AJ_FrontLINActuatorPowerDriverAB", +// env->adcTask1.ADC1_Data.VN7008AJ_FrontLINActuatorPowerDriverAB); +// } +// osMutexRelease(env->adcTask1.access); +// } SystemDelayMs(100); } @@ -431,6 +429,19 @@ static _Noreturn void Mma_Thread(tMma *env) { resetStall(linTaskActuator, local); + linTaskActuator->linCommandActuator[0].COM = LIN_ACT_CFR_MOD; + linTaskActuator->linCommandActuator[0].BUS_ADR = 0; + linTaskActuator->linCommandActuator[0].MODE = LIN_MODE_STOP; + ++step; + + break; + } + + + case 6: { + + resetStall(linTaskActuator, local); + linTaskActuator->linCommandActuator[0].COM = LIN_ACT_CFR_INI; linTaskActuator->linCommandActuator[0].BUS_ADR = 0; linTaskActuator->linCommandActuator[0].POS = 0; @@ -439,13 +450,24 @@ static _Noreturn void Mma_Thread(tMma *env) { break; } - case 6: { + case 7: { + resetStall(linTaskActuator, local); + + linTaskActuator->linCommandActuator[0].COM = LIN_ACT_CFR_MOD; + linTaskActuator->linCommandActuator[0].BUS_ADR = 0; + linTaskActuator->linCommandActuator[0].MODE = LIN_MODE_NORMAL; + ++step; + + break; + } + + case 8: { resetStall(linTaskActuator, local); linTaskActuator->linCommandActuator[0].COM = LIN_ACT_CFR_SET; linTaskActuator->linCommandActuator[0].BUS_ADR = 0; - linTaskActuator->linCommandActuator[0].POS = 6000; + linTaskActuator->linCommandActuator[0].POS = 2000; linTaskActuator->linCommandActuator[0].Stall_SET = 1; linTaskActuator->linCommandActuator[0].Lnoise_SET = 0; linTaskActuator->linCommandActuator[0].Autos_SET = 1; @@ -457,23 +479,19 @@ static _Noreturn void Mma_Thread(tMma *env) { break; } - case 7: { + case 9: { //SystemDelayMs(10000); for (uint32_t i = 0; i < 100; ++i) { - - if (osMutexAcquire(env->adcTask1.access, 1000) == osOK) { - - if (env->adcTask1.ADC_isUpdate) { - env->adcTask1.ADC_isUpdate = false; - - VN7008AJ(env, "VN7008AJ_FrontLINActuatorPowerDriverAB", - env->adcTask1.ADC1_Data.VN7008AJ_FrontLINActuatorPowerDriverAB); - } - - osMutexRelease(env->adcTask1.access); - } +// if (osMutexAcquire(env->adcTask1.access, 1000) == osOK) { +// if (env->adcTask1.ADC_isUpdate) { +// env->adcTask1.ADC_isUpdate = false; +// VN7008AJ(env, "VN7008AJ_FrontLINActuatorPowerDriverAB", +// env->adcTask1.ADC1_Data.VN7008AJ_FrontLINActuatorPowerDriverAB); +// } +// osMutexRelease(env->adcTask1.access); +// } SystemDelayMs(100); } @@ -487,29 +505,13 @@ static _Noreturn void Mma_Thread(tMma *env) { break; } - case 8: { - if (linTaskActuator->linStateActuator[7].CPOS_ALL >= 8000) { - ++step; - } - - - if (osMutexAcquire(env->adcTask1.access, 1000) == osOK) { - - if (env->adcTask1.ADC_isUpdate) { - env->adcTask1.ADC_isUpdate = false; - - VN7008AJ(env, "VN7008AJ_FrontLINActuatorPowerDriverAB", - env->adcTask1.ADC1_Data.VN7008AJ_FrontLINActuatorPowerDriverAB); - } - - osMutexRelease(env->adcTask1.access); - } - - + case 10: { + step = 0; break; } default: { + } } } @@ -517,12 +519,29 @@ static _Noreturn void Mma_Thread(tMma *env) { } LoggerFormatInfo(LOGGER, LOG_TASK_ARB, "Step = %d", step) - */ +/* + frame_data.id_type = FLEXCAN_ID_STD; + frame_data.dlc = 1; + env->canPorts->Can1_IO.transmit(env->canPorts->Can1_IO.env, frame_data.data, frame_data.dlc, 0x123, frame_data.id_type, 1000); +*/ +/* + uint16_t len = env->canPorts->Can1_IO.receive(env->canPorts->Can1_IO.env, 0, (uint8_t *)&frame_data, 1, 1000); + if (len > 0) { + env->canPorts->Can1_IO.transmit(env->canPorts->Can1_IO.env, frame_data.data, frame_data.dlc, frame_data.standard_id, frame_data.id_type, 1000); + } +*/ +/* + uint16_t len = env->canPorts->Can0_IO.receive(env->canPorts->Can0_IO.env, 0, (uint8_t *)&frame_data, 1, 1000); + + if (len > 0) { + env->canPorts->Can0_IO.transmit(env->canPorts->Can0_IO.env, frame_data.data, frame_data.dlc, 0x123, frame_data.id_type, 1000); + } +*/ /* uint16_t len = env->canPorts->Can0_IO.receive(env->canPorts->Can0_IO.env, 0, (uint8_t *)&frame_data, 1, 1000); diff --git a/MainModesArbiter.h b/MainModesArbiter.h index aa0cbc5..0b5d7a3 100644 --- a/MainModesArbiter.h +++ b/MainModesArbiter.h @@ -26,7 +26,7 @@ #include "AdcTasks.h" #include "standby.h" #include "Model_Task.h" -#include "Model_actuator.h" +#include "HVAC_model.h" #include "CanUds.h" #include "DiagnosticTask.h" @@ -80,13 +80,16 @@ typedef struct { } thread; // Входные данные (локальные) для модели - ActuatorCmdBus controllerData_local; + ActuatorCmdBus actuator_Ch0_Command_Model_local_1; + ActuatorCmdBus actuator_Ch1_Command_Model_local_2; + ActuatorCmdBus actuator_Ch2_Command_Model_local_3; + CmdBusADCData ADC_Data_Model_local; - // Входные данные (локальные) для модели - ActuatorCmdBusInput controllerDataInput_local; - uint8_t in_Busy_Ch0; - uint8_t in_Error_Connect_Ch0; + // Выходные данные (локальные) для модели + ActuatorCmdBusInput actuator_Ch0_Input_Model_local_1; + ActuatorCmdBusInput actuator_Ch1_Input_Model_local_2; + ActuatorCmdBusInput actuator_Ch2_Input_Model_local_3; bool isActuatorWorkBusy; diff --git a/MainModesArbiter_InitStage.c b/MainModesArbiter_InitStage.c index 1553545..2fe7772 100644 --- a/MainModesArbiter_InitStage.c +++ b/MainModesArbiter_InitStage.c @@ -138,11 +138,11 @@ static void Mma_InitSubSystems(tMma *env) { Lin1_StartThread(&env->linTaskActuator1); tLinData *linData2 = Lin2_Init(GetLin123CallbackHandler); - Lin_2_Init(&env->linTaskActuator2, linData2, &env->linPorts->lin2_Io, 6, &env->slog.logger); + Lin_2_Init(&env->linTaskActuator2, linData2, &env->linPorts->lin2_Io, 9, &env->slog.logger); Lin2_StartThread(&env->linTaskActuator2); tLinData *linData3 = Lin3_Init(GetLin123CallbackHandler); - Lin_3_Init(&env->linTaskActuator3, linData3, &env->linPorts->lin3_Io, 8, &env->slog.logger); + Lin_3_Init(&env->linTaskActuator3, linData3, &env->linPorts->lin3_Io, 9, &env->slog.logger); Lin3_StartThread(&env->linTaskActuator3);