Обновление

This commit is contained in:
cfif 2026-02-13 15:59:41 +03:00
parent a02c48d203
commit 792c9f5db5
5 changed files with 140 additions and 104 deletions

View File

@ -3,11 +3,21 @@
// //
#include "LinActuatorWork.h" #include "LinActuatorWork.h"
#define LOG_SIGN "Lin"
//#define LOG_SIGN "Lin"
#define LOGGER &env->slog.logger #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) { 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) { for (uint8_t i = 0; i < linTaskActuator->LIN_ISSR_ALL; ++i) {
linTaskActuator->linCommandActuator[i].POS = env->controllerData_local.POS[i]; linTaskActuator->linCommandActuator[i].POS = actuator_Command_Model_local->POS[i];
linTaskActuator->linCommandActuator[i].BUS_ADR = env->controllerData_local.BUS_ADR[i]; linTaskActuator->linCommandActuator[i].BUS_ADR = actuator_Command_Model_local->BUS_ADR[i];
linTaskActuator->linCommandActuator[i].MODE = env->controllerData_local.MODE[i]; linTaskActuator->linCommandActuator[i].MODE = actuator_Command_Model_local->MODE[i];
// Если команда выполнена // Если команда выполнена
if (linTaskActuator->linCommandActuator[i].COM == LIN_ACT_CFR_SUCCESSFUL) { if (linTaskActuator->linCommandActuator[i].COM == LIN_ACT_CFR_SUCCESSFUL) {
#if (LOG_LIN_ACTUATOR == 1) #if (LOG_LIN_ACTUATOR == 1)
LoggerInfoStatic(LOGGER, LOG_SIGN, "SUCCESSFUL COMMAND") // LoggerInfoStatic(LOGGER, LOG_SIGN, "SUCCESSFUL COMMAND")
#endif #endif
// Установка входной команды в LIN_ACT_CFR_NONE // Установка входной команды в 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].COM = actuator_Command_Model_local->COM[i];
linTaskActuator->linCommandActuator[i].Stall_SET = env->controllerData_local.Stall_SET[i]; linTaskActuator->linCommandActuator[i].Stall_SET = actuator_Command_Model_local->Stall_SET[i];
linTaskActuator->linCommandActuator[i].Lnoise_SET = env->controllerData_local.Lnoise_SET[i]; linTaskActuator->linCommandActuator[i].Lnoise_SET = actuator_Command_Model_local->Lnoise_SET[i];
linTaskActuator->linCommandActuator[i].Autos_SET = env->controllerData_local.Autos_SET[i]; linTaskActuator->linCommandActuator[i].Autos_SET = actuator_Command_Model_local->Autos_SET[i];
linTaskActuator->linCommandActuator[i].Speed_SET = env->controllerData_local.Speed_SET[i]; linTaskActuator->linCommandActuator[i].Speed_SET = actuator_Command_Model_local->Speed_SET[i];
linTaskActuator->linCommandActuator[i].Coils_Stop_SET = env->controllerData_local.Coils_Stop_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; actuator_Output_Model_local->in_CPOS_ALL_Ch0[i] = (int16_t) linTaskActuator->linStateActuator[i].CPOS_ALL;
env->controllerDataInput_local.in_Mode_Slave_Ch0[i] = (int8_t) linTaskActuator->linStateActuator[i].Mode_Slave; actuator_Output_Model_local->in_Act_Emrf_Slave_Ch0[i] = (int8_t) linTaskActuator->linStateActuator[i].Emrf_Slave;
env->controllerDataInput_local.in_Act_Err1_Supply_Ch0[i] = (int8_t) linTaskActuator->linStateActuator[i].Error1_Supply_Slave; actuator_Output_Model_local->in_Mode_Slave_Ch0[i] = (int8_t) linTaskActuator->linStateActuator[i].Mode_Slave;
env->controllerDataInput_local.in_Act_Err2_Communication_Ch0[i] = (int8_t) linTaskActuator->linStateActuator[i].Error2_Communication_Slave; actuator_Output_Model_local->in_Act_Err1_Supply_Ch0[i] = (int8_t) linTaskActuator->linStateActuator[i].Error1_Supply_Slave;
env->controllerDataInput_local.in_Act_Err3_Temperature_Ch0[i] = (int8_t) linTaskActuator->linStateActuator[i].Error3_Temperature_Slave; actuator_Output_Model_local->in_Act_Err2_Communication_Ch0[i] = (int8_t) linTaskActuator->linStateActuator[i].Error2_Communication_Slave;
env->controllerDataInput_local.in_Act_Err4_Permanent_Electrical_Ch0[i] = (int8_t) linTaskActuator->linStateActuator[i].Error4_Permanent_Electrical_Slave; actuator_Output_Model_local->in_Act_Err3_Temperature_Ch0[i] = (int8_t) linTaskActuator->linStateActuator[i].Error3_Temperature_Slave;
env->controllerDataInput_local.in_Act_Stall_Slave_Ch0[i] = linTaskActuator->linStateActuator[i].Stall_Slave; actuator_Output_Model_local->in_Act_Err4_Permanent_Electrical_Ch0[i] = (int8_t) linTaskActuator->linStateActuator[i].Error4_Permanent_Electrical_Slave;
env->controllerDataInput_local.in_Act_Reset_Ch0[i] = linTaskActuator->linStateActuator[i].Reset_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->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); osMutexRelease(linTaskActuator->access);
@ -65,7 +77,7 @@ void LinActuatorWork(tMma *env, tLinTaskActuator *linTaskActuator) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "DETECT COMMAND") LoggerInfoStatic(LOGGER, LOG_SIGN, "DETECT COMMAND")
#endif #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->ModelTask.triggerCommand = false;
env->isActuatorWorkBusy = true; env->isActuatorWorkBusy = true;
// начало --- ВЫХОД МОДЕЛИ ----------
// ВЫХОД МОДЕЛИ
memcpy(actuator_Command_Model_local, actuator_Command_Model_trigger_local, sizeof(ActuatorCmdBus));
// Сброс STALL в состоянии актуатор и локальном состоянии // Сброс 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)); memcpy(actuator_Output_Model_model, actuator_Output_Model_local, sizeof(ActuatorCmdBusInput));
rtDW.Busy_Ch0 = env->in_Busy_Ch0;
rtDW.Error_Connect_Ch0 = env->in_Error_Connect_Ch0;
osMutexRelease(env->ModelTask.access); osMutexRelease(env->ModelTask.access);
} }

View File

@ -6,7 +6,13 @@
#define HVAC_M7_LINACTUATORWORK_H #define HVAC_M7_LINACTUATORWORK_H
#include "MainModesArbiter_Private.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 #endif //HVAC_M7_LINACTUATORWORK_H

View File

@ -4,7 +4,7 @@
#include "MainModesArbiter_Private.h" #include "MainModesArbiter_Private.h"
#include "stdio.h" #include "stdio.h"
#include "fc7xxx_driver_rgm.h" #include "fc7xxx_driver_rgm.h"
#include "Model_actuator.h" #include "HVAC_model.h"
#include "LinActuatorWork.h" #include "LinActuatorWork.h"
#include "ADC_Temp_Table.h" #include "ADC_Temp_Table.h"
@ -187,7 +187,8 @@ void LoadDataInFromModel(tMma *env) {
if (env->adcTask1.ADC_isUpdate) { if (env->adcTask1.ADC_isUpdate) {
env->adcTask1.ADC_isUpdate = false; 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"); asm("nop");
// R1 = 91000 R2 = 16000 ((5 * (91000 + 16000)) / 16000 = 33.4375 В) // R1 = 91000 R2 = 16000 ((5 * (91000 + 16000)) / 16000 = 33.4375 В)
@ -248,7 +249,7 @@ static _Noreturn void Mma_Thread(tMma *env) {
Mma_InitStage(env); Mma_InitStage(env);
init_fast_lookup_table(ALG_STEINHART); init_fast_lookup_table(ALG_STEINHART);
// can_rx_message_type frame_data; can_rx_message_type frame_data;
// uint32_t step = 0; // uint32_t step = 0;
@ -261,7 +262,7 @@ static _Noreturn void Mma_Thread(tMma *env) {
LoadDataInFromModel(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) LoggerFormatInfo(LOGGER, LOG_TASK_ARB, "PWM (Rear Reserve) = %d", pwm4)
*/ */
LoadDataInFromModel(env); 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); GpioPinToggle(&env->gpios->led.LED_G);
SystemDelayMs(100);
/* /*
if (RGM_SRS_WAKEUP_MASK == (RGM->SRS & RGM_SRS_WAKEUP_MASK)) { 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]; uint8_t local[9];
tLinTaskActuator *linTaskActuator = &env->linTaskActuator2; tLinTaskActuator *linTaskActuator = &env->linTaskActuator1;
if (osMutexAcquire(linTaskActuator->access, 5000) == osOK) { 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].COM = LIN_ACT_CFR_INI;
linTaskActuator->linCommandActuator[0].BUS_ADR = 0; linTaskActuator->linCommandActuator[0].BUS_ADR = 0;
linTaskActuator->linCommandActuator[0].POS = 6000; linTaskActuator->linCommandActuator[0].POS = 2000;
++step; ++step;
break; break;
@ -402,19 +405,14 @@ static _Noreturn void Mma_Thread(tMma *env) {
//SystemDelayMs(10000); //SystemDelayMs(10000);
for (uint32_t i = 0; i < 100; ++i) { for (uint32_t i = 0; i < 100; ++i) {
// if (osMutexAcquire(env->adcTask1.access, 1000) == osOK) {
// if (env->adcTask1.ADC_isUpdate) {
if (osMutexAcquire(env->adcTask1.access, 1000) == osOK) { // env->adcTask1.ADC_isUpdate = false;
// VN7008AJ(env, "VN7008AJ_FrontLINActuatorPowerDriverAB",
if (env->adcTask1.ADC_isUpdate) { // env->adcTask1.ADC1_Data.VN7008AJ_FrontLINActuatorPowerDriverAB);
env->adcTask1.ADC_isUpdate = false; // }
// osMutexRelease(env->adcTask1.access);
VN7008AJ(env, "VN7008AJ_FrontLINActuatorPowerDriverAB", // }
env->adcTask1.ADC1_Data.VN7008AJ_FrontLINActuatorPowerDriverAB);
}
osMutexRelease(env->adcTask1.access);
}
SystemDelayMs(100); SystemDelayMs(100);
} }
@ -431,6 +429,19 @@ static _Noreturn void Mma_Thread(tMma *env) {
resetStall(linTaskActuator, local); 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].COM = LIN_ACT_CFR_INI;
linTaskActuator->linCommandActuator[0].BUS_ADR = 0; linTaskActuator->linCommandActuator[0].BUS_ADR = 0;
linTaskActuator->linCommandActuator[0].POS = 0; linTaskActuator->linCommandActuator[0].POS = 0;
@ -439,13 +450,24 @@ static _Noreturn void Mma_Thread(tMma *env) {
break; 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); resetStall(linTaskActuator, local);
linTaskActuator->linCommandActuator[0].COM = LIN_ACT_CFR_SET; linTaskActuator->linCommandActuator[0].COM = LIN_ACT_CFR_SET;
linTaskActuator->linCommandActuator[0].BUS_ADR = 0; 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].Stall_SET = 1;
linTaskActuator->linCommandActuator[0].Lnoise_SET = 0; linTaskActuator->linCommandActuator[0].Lnoise_SET = 0;
linTaskActuator->linCommandActuator[0].Autos_SET = 1; linTaskActuator->linCommandActuator[0].Autos_SET = 1;
@ -457,23 +479,19 @@ static _Noreturn void Mma_Thread(tMma *env) {
break; break;
} }
case 7: { case 9: {
//SystemDelayMs(10000); //SystemDelayMs(10000);
for (uint32_t i = 0; i < 100; ++i) { for (uint32_t i = 0; i < 100; ++i) {
// if (osMutexAcquire(env->adcTask1.access, 1000) == osOK) {
if (osMutexAcquire(env->adcTask1.access, 1000) == osOK) { // if (env->adcTask1.ADC_isUpdate) {
// env->adcTask1.ADC_isUpdate = false;
if (env->adcTask1.ADC_isUpdate) { // VN7008AJ(env, "VN7008AJ_FrontLINActuatorPowerDriverAB",
env->adcTask1.ADC_isUpdate = false; // env->adcTask1.ADC1_Data.VN7008AJ_FrontLINActuatorPowerDriverAB);
// }
VN7008AJ(env, "VN7008AJ_FrontLINActuatorPowerDriverAB", // osMutexRelease(env->adcTask1.access);
env->adcTask1.ADC1_Data.VN7008AJ_FrontLINActuatorPowerDriverAB); // }
}
osMutexRelease(env->adcTask1.access);
}
SystemDelayMs(100); SystemDelayMs(100);
} }
@ -487,29 +505,13 @@ static _Noreturn void Mma_Thread(tMma *env) {
break; break;
} }
case 8: { case 10: {
if (linTaskActuator->linStateActuator[7].CPOS_ALL >= 8000) { step = 0;
++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);
}
break; break;
} }
default: { default: {
} }
} }
} }
@ -517,12 +519,29 @@ static _Noreturn void Mma_Thread(tMma *env) {
} }
LoggerFormatInfo(LOGGER, LOG_TASK_ARB, "Step = %d", step) 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); uint16_t len = env->canPorts->Can0_IO.receive(env->canPorts->Can0_IO.env, 0, (uint8_t *)&frame_data, 1, 1000);

View File

@ -26,7 +26,7 @@
#include "AdcTasks.h" #include "AdcTasks.h"
#include "standby.h" #include "standby.h"
#include "Model_Task.h" #include "Model_Task.h"
#include "Model_actuator.h" #include "HVAC_model.h"
#include "CanUds.h" #include "CanUds.h"
#include "DiagnosticTask.h" #include "DiagnosticTask.h"
@ -80,13 +80,16 @@ typedef struct {
} thread; } 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; CmdBusADCData ADC_Data_Model_local;
// Входные данные (локальные) для модели // Выходные данные (локальные) для модели
ActuatorCmdBusInput controllerDataInput_local; ActuatorCmdBusInput actuator_Ch0_Input_Model_local_1;
uint8_t in_Busy_Ch0; ActuatorCmdBusInput actuator_Ch1_Input_Model_local_2;
uint8_t in_Error_Connect_Ch0; ActuatorCmdBusInput actuator_Ch2_Input_Model_local_3;
bool isActuatorWorkBusy; bool isActuatorWorkBusy;

View File

@ -138,11 +138,11 @@ static void Mma_InitSubSystems(tMma *env) {
Lin1_StartThread(&env->linTaskActuator1); Lin1_StartThread(&env->linTaskActuator1);
tLinData *linData2 = Lin2_Init(GetLin123CallbackHandler); 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); Lin2_StartThread(&env->linTaskActuator2);
tLinData *linData3 = Lin3_Init(GetLin123CallbackHandler); 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); Lin3_StartThread(&env->linTaskActuator3);