From e93242da70f1094ae7bdbe1cf58f945802a2bc1c Mon Sep 17 00:00:00 2001 From: Razvalyaev Date: Mon, 13 Jan 2025 16:58:59 +0300 Subject: [PATCH] =?UTF-8?q?#3=20=D0=B0=D0=BB=D0=B3=D0=BE=D1=80=D0=B8=D1=82?= =?UTF-8?q?=D0=BC=20=D0=B7=D0=B0=D0=BF=D1=83=D1=81=D0=BA=D0=B0=D0=B5=D1=82?= =?UTF-8?q?=D1=81=D1=8F=20=D0=B8=20=D0=B4=D0=B0=D0=B6=D0=B5=20=D1=87=D1=82?= =?UTF-8?q?=D0=BE-=D1=82=D0=BE=20=D1=81=D1=87=D0=B8=D1=82=D0=B0=D0=B5?= =?UTF-8?q?=D1=82=20=D0=BD=D0=BE=20=D0=BF=D0=BE=D0=BA=D0=B0=20=D0=BD=D0=B5?= =?UTF-8?q?=20=D1=84=D0=BE=D1=80=D0=BC=D0=B8=D1=80=D1=83=D0=B5=D1=82=20?= =?UTF-8?q?=D1=88=D0=B8=D0=BC.=20=D0=9F=D1=80=D0=BE=D1=81=D1=82=D0=BE=20?= =?UTF-8?q?=D1=81=D1=87=D0=B8=D1=82=D0=B0=D0=B5=D1=82=20=D0=B2=D1=80=D0=B5?= =?UTF-8?q?=D0=BC=D1=8F=20=D0=B2=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Inu/Src/N12_Xilinx/RS_Functions.h | 8 +- Inu/Src/main_matlab/DSP281x_Device.h | 1 + Inu/Src/main_matlab/init28335.c | 82 +++++- Inu/Src/main_matlab/init28335.h | 2 + Inu/Src/main_matlab/main_matlab.c | 90 +++++- Inu/Src/main_matlab/main_matlab.h | 3 +- Inu/Src/main_matlab/param.c | 53 ++++ Inu/Src/main_matlab/param.h | 16 + Inu/controller.c | 315 +------------------- Inu/controller.h | 15 +- Inu/param.c | 426 --------------------------- Inu/param.h | 41 --- inu_im_2wnd_3lvl.slx | Bin 80301 -> 80516 bytes run_mex.bat | 4 + 14 files changed, 255 insertions(+), 801 deletions(-) create mode 100644 Inu/Src/main_matlab/param.c create mode 100644 Inu/Src/main_matlab/param.h delete mode 100644 Inu/param.c delete mode 100644 Inu/param.h diff --git a/Inu/Src/N12_Xilinx/RS_Functions.h b/Inu/Src/N12_Xilinx/RS_Functions.h index df08ebe..e98725e 100644 --- a/Inu/Src/N12_Xilinx/RS_Functions.h +++ b/Inu/Src/N12_Xilinx/RS_Functions.h @@ -113,9 +113,9 @@ enum { CMD_RS232_LAST }; -enum { - false = 0, true - }; +//enum { +// false = 0, true +// }; #define RS_LEN_CMD CMD_RS232_LAST @@ -131,7 +131,7 @@ void resetup_rs_on_timeout_lost(int rsp); void resetup_rs(RS_DATA_STRUCT *rs_arr); void resetup_mpu_rs(RS_DATA_STRUCT *rs_arr); int test_rs_live(RS_DATA_STRUCT *rs_arr); -void RS_SetControllerLeading(RS_DATA_STRUCT *RS232_Arr,int bool); +void RS_SetControllerLeading(RS_DATA_STRUCT *RS232_Arr,int boool); void RS_SetAdrAnswerController(RS_DATA_STRUCT *RS232_Arr,int set_addr_answer); void SetCntrlAddr (int cntrl_addr,int cntrl_addr_for_all); diff --git a/Inu/Src/main_matlab/DSP281x_Device.h b/Inu/Src/main_matlab/DSP281x_Device.h index 557612b..23c0d11 100644 --- a/Inu/Src/main_matlab/DSP281x_Device.h +++ b/Inu/Src/main_matlab/DSP281x_Device.h @@ -1,3 +1,4 @@ #include "DSP2833x_Device.h" //#define int16 int +#define interrupt \ No newline at end of file diff --git a/Inu/Src/main_matlab/init28335.c b/Inu/Src/main_matlab/init28335.c index ed2e47a..756ee53 100644 --- a/Inu/Src/main_matlab/init28335.c +++ b/Inu/Src/main_matlab/init28335.c @@ -8,7 +8,6 @@ **************************************************************************/ -#include "def.h" #include "init28335.h" #define FREQ_TIMER_3 (FREQ_PWM*2) @@ -20,6 +19,7 @@ void init28335(void) { edrk_init_variables_matlab(); init_global_time_struct(FREQ_TIMER_3); + Init_Adc_Variables(); } //void init28335(void) @@ -45,6 +45,44 @@ void edrk_init_variables_matlab(void) init_ramp_all_zadanie(); init_all_limit_koeffs(); + + + control_station.array_cmd[CONTROL_STATION_TERMINAL_RS232][CONTROL_STATION_CMD_SET_IZAD] = NOMINAL_SET_IZAD; + control_station.array_cmd[CONTROL_STATION_TERMINAL_RS232][CONTROL_STATION_CMD_SET_KM] = 0; + control_station.array_cmd[CONTROL_STATION_TERMINAL_RS232][CONTROL_STATION_CMD_SET_U_ZARYAD] = NOMINAL_U_ZARYAD; + control_station.array_cmd[CONTROL_STATION_TERMINAL_RS232][CONTROL_STATION_CMD_SET_K_U_DISBALANCE] = NOMINAL_SET_K_U_DISBALANCE; + control_station.array_cmd[CONTROL_STATION_TERMINAL_RS232][CONTROL_STATION_CMD_SET_K_PLUS_U_DISBALANCE] = 0; + control_station.array_cmd[CONTROL_STATION_TERMINAL_RS232][CONTROL_STATION_CMD_SET_LIMIT_POWER] = NOMINAL_SET_LIMIT_POWER; + control_station.array_cmd[CONTROL_STATION_TERMINAL_RS232][CONTROL_STATION_CMD_UFCONST_VECTOR] = 1; + control_station.array_cmd[CONTROL_STATION_TERMINAL_RS232][CONTROL_STATION_CMD_SCALAR_FOC] = 0; + control_station.array_cmd[CONTROL_STATION_TERMINAL_RS232][CONTROL_STATION_CMD_ENABLE_ON_CHARGE] = 0; + control_station.array_cmd[CONTROL_STATION_TERMINAL_RS232][CONTROL_STATION_CMD_GO] = 1; + + control_station.array_cmd[CONTROL_STATION_TERMINAL_RS232][CONTROL_STATION_CMD_DISABLE_ON_PUMP] = 0; + control_station.array_cmd[CONTROL_STATION_TERMINAL_RS232][CONTROL_STATION_CMD_ENABLE_ON_CHARGE] = 0; + control_station.array_cmd[CONTROL_STATION_TERMINAL_RS232][CONTROL_STATION_CMD_DISABLE_ON_QTV] = 0; + control_station.array_cmd[CONTROL_STATION_TERMINAL_RS232][CONTROL_STATION_CMD_DISABLE_ON_UMP] = 0; + control_station.array_cmd[CONTROL_STATION_TERMINAL_RS232][CONTROL_STATION_CMD_MANUAL_DISCHARGE] = 0; + + control_station.array_cmd[CONTROL_STATION_TERMINAL_RS232][CONTROL_STATION_CMD_ROTOR_POWER] = 0; + control_station.array_cmd[CONTROL_STATION_TERMINAL_RS232][CONTROL_STATION_CMD_DISABLE_INTERRUPT_SYNC] = 0; + control_station.array_cmd[CONTROL_STATION_TERMINAL_RS232][CONTROL_STATION_CMD_DISABLE_INTERRUPT_TIMER2] = 0; + control_station.array_cmd[CONTROL_STATION_TERMINAL_RS232][CONTROL_STATION_CMD_STOP_LOGS] = 0; + + control_station.array_cmd[CONTROL_STATION_INGETEAM_PULT_RS485][CONTROL_STATION_CMD_SET_U_ZARYAD] = NOMINAL_U_ZARYAD; + control_station.array_cmd[CONTROL_STATION_MPU_SVU_CAN][CONTROL_STATION_CMD_SET_U_ZARYAD] = NOMINAL_U_ZARYAD; + + control_station.array_cmd[CONTROL_STATION_TERMINAL_RS232][CONTROL_STATION_CMD_WDOG_OFF] = 0; + + + for (int i = 0; i < CONTROL_STATION_CMD_LAST; i++) + control_station.array_cmd[CONTROL_STATION_TERMINAL_CAN][i] = control_station.array_cmd[CONTROL_STATION_TERMINAL_RS232][i]; + + + ramp_all_zadanie(2); + + set_zadanie_u_charge_matlab(); + init_Uin_rms(); } void edrk_init_matlab(void) @@ -64,4 +102,46 @@ void edrk_init_matlab(void) edrk.zadanie.iq_set_break_level = _IQ(NOMINAL_U_BREAK_LEVEL / NORMA_ACP); control_station.setup_time_detect_active[CONTROL_STATION_TERMINAL_RS232] = 50; +} + +void set_zadanie_u_charge_matlab(void) +{ + + // edrk.ZadanieU_Charge = edrk.ZadanieU_Charge_RS; + + // edrk.iq_ZadanieU_Charge = _IQ(edrk.ZadanieU_Charge/NORMA_ACP); + + if (edrk.zadanie.ZadanieU_Charge <= 100) + { + edrk.iqMIN_U_ZPT = _IQ(-50.0 / NORMA_ACP); + edrk.iqMIN_U_IN = _IQ(-50.0 / NORMA_ACP); + } + else + { + + edrk.iqMIN_U_ZPT = _IQ(edrk.zadanie.ZadanieU_Charge * MIN_U_PROC / NORMA_ACP); + edrk.iqMIN_U_IN = _IQ(edrk.zadanie.ZadanieU_Charge * MIN_U_PROC / NORMA_ACP); + + } + + if (edrk.zadanie.ZadanieU_Charge < LEVEL_DETECT_U_SMALL) + { + edrk.iqMAX_U_ZPT_Predzaryad = _IQ(edrk.zadanie.ZadanieU_Charge * MAX_U_PROC_SMALL / NORMA_ACP); + edrk.iqMAX_U_ZPT_Global = edrk.iqMAX_U_ZPT_Predzaryad + _IQ(ADD_U_MAX_GLOBAL_SMALL / NORMA_ACP); // +500V + + } + else + { + edrk.iqMAX_U_ZPT_Predzaryad = _IQ(edrk.zadanie.ZadanieU_Charge * MAX_U_PROC / NORMA_ACP); + edrk.iqMAX_U_ZPT_Global = edrk.iqMAX_U_ZPT_Predzaryad + _IQ(ADD_U_MAX_GLOBAL / NORMA_ACP); // +200V + + if (edrk.iqMAX_U_ZPT_Global > U_D_MAX_ERROR_GLOBAL) + edrk.iqMAX_U_ZPT_Global = U_D_MAX_ERROR_GLOBAL; + } + + edrk.iqMAX_U_ZPT = edrk.iqMAX_U_ZPT_Global;//_IQ(edrk.zadanie.ZadanieU_Charge*MAX_U_PROC/NORMA_ACP); + edrk.iqMAX_U_IN = _IQ(edrk.zadanie.ZadanieU_Charge * MAX_U_PROC / NORMA_ACP); + + edrk.zadanie.iq_set_break_level = _IQ(NOMINAL_U_BREAK_LEVEL / NORMA_ACP); + } \ No newline at end of file diff --git a/Inu/Src/main_matlab/init28335.h b/Inu/Src/main_matlab/init28335.h index f6abce1..3e59e12 100644 --- a/Inu/Src/main_matlab/init28335.h +++ b/Inu/Src/main_matlab/init28335.h @@ -7,4 +7,6 @@ void init28335(void); void edrk_init_matlab(void); void edrk_init_variables_matlab(void); +void set_zadanie_u_charge_matlab(void); +void init_Uin_rms(void); #endif //INIT28335 diff --git a/Inu/Src/main_matlab/main_matlab.c b/Inu/Src/main_matlab/main_matlab.c index 6b22dcd..eb2bc3f 100644 --- a/Inu/Src/main_matlab/main_matlab.c +++ b/Inu/Src/main_matlab/main_matlab.c @@ -1,15 +1,16 @@ -#include "DSP281x_Device.h" +#include "controller.h" +//#include "edrk_main.h" +//#include "vector.h" +//#include "vector_control.h" +// +//#include "xp_project.h" +//#include "xp_write_xpwm_time.h" +//#include "edrk_main.h" +//#include "vector.h" +//#include "vector_control.h" +//#include "v_rotor.h" -#include "edrk_main.h" -#include "vector.h" -#include "vector_control.h" -#include "xp_project.h" -#include "xp_write_xpwm_time.h" -#include "edrk_main.h" -#include "vector.h" -#include "vector_control.h" -#include "v_rotor.h" T_project project = {0}; @@ -20,6 +21,71 @@ FLAG f = FLAG_DEFAULTS; WRotorValues WRotor = WRotorValues_DEFAULTS; + + + +void mcu_simulate_step(void) +{ + int ff = 0; + static _iq Uzad1 = 0, Fzad = 0, Uzad2 = 0, Izad_out = 0, Uzad_from_master = 0; + _iq wd; + + if (edrk.flag_second_PCH == 0) { + wd = uf_alg.winding_displacement_bs1; + } + else { + wd = uf_alg.winding_displacement_bs2; + } + + //parse_parameters_from_all_control_station(); + + //ff = control_station.active_array_cmd[CONTROL_STATION_CMD_SET_ROTOR]; + //control_station.array_cmd[CONTROL_STATION_INGETEAM_PULT_RS485][CONTROL_STATION_CMD_SET_ROTOR] = ff; + //control_station.array_cmd[CONTROL_STATION_VPU_CAN][CONTROL_STATION_CMD_SET_ROTOR] = ff; + //control_station.array_cmd[CONTROL_STATION_ZADATCHIK_CAN][CONTROL_STATION_CMD_SET_ROTOR] = ff; + + //ff = control_station.active_array_cmd[CONTROL_STATION_CMD_SET_POWER]; + //control_station.array_cmd[CONTROL_STATION_INGETEAM_PULT_RS485][CONTROL_STATION_CMD_SET_POWER] = ff; + + + //if (control_station.active_array_cmd[CONTROL_STATION_CMD_ROTOR_POWER]) + //{ + // control_station.array_cmd[CONTROL_STATION_ZADATCHIK_CAN][CONTROL_STATION_CMD_SET_ROTOR] = 0; + // control_station.array_cmd[CONTROL_STATION_VPU_CAN][CONTROL_STATION_CMD_SET_ROTOR] = 0; + //} + //parse_analog_data_from_active_control_station_to_alg(); + + calc_norm_ADC_0(0); + + vectorControlConstId(edrk.zadanie.iq_power_zad_rmp, edrk.zadanie.iq_oborots_zad_hz_rmp, + WRotor.RotorDirectionSlow, WRotor.iqWRotorSumFilter, + edrk.Mode_ScalarVectorUFConst, + edrk.MasterSlave, edrk.zadanie.iq_Izad, wd, + edrk.master_theta, edrk.master_Iq, edrk.iq_power_kw_another_bs, + &edrk.tetta_to_slave, &edrk.Iq_to_slave, &edrk.P_to_master, + 0, 0); + + test_calc_vect_dq_pwm24_Ing(vect_control.iqTheta, vect_control.iqUdKm, vect_control.iqUqKm, + edrk.disable_alg_u_disbalance, + edrk.zadanie.iq_kplus_u_disbalance_rmp, edrk.zadanie.iq_k_u_disbalance_rmp, + filter.iqU_1_fast, filter.iqU_2_fast, + 0, + edrk.Uzad_max, + edrk.MasterSlave, + edrk.flag_second_PCH, + &edrk.Kplus, &edrk.Uzad_to_slave); + analog.PowerFOC = edrk.P_to_master; + Fzad = vect_control.iqFstator; + Izad_out = edrk.Iq_to_slave; +} + + + + + + + + void project_read_all_pbus2() { @@ -130,7 +196,9 @@ void WriteMemory(unsigned long addr, unsigned int data) //(*(volatile int *)( addr )) = data; } - +void func_unpack_answer_from_Ingeteam(unsigned int a) {} +void unpack_answer_from_MPU_SVU_CAN(unsigned int a) {} +int get_real_in_mbox(int a, int b) {} void start_pwm(void) { diff --git a/Inu/Src/main_matlab/main_matlab.h b/Inu/Src/main_matlab/main_matlab.h index f44848b..59a6c39 100644 --- a/Inu/Src/main_matlab/main_matlab.h +++ b/Inu/Src/main_matlab/main_matlab.h @@ -4,9 +4,8 @@ #include "edrk_main.h" +void mcu_simulate_step(void); void init_flag_a(void); - - diff --git a/Inu/Src/main_matlab/param.c b/Inu/Src/main_matlab/param.c new file mode 100644 index 0000000..24392f4 --- /dev/null +++ b/Inu/Src/main_matlab/param.c @@ -0,0 +1,53 @@ +/************************************************************************** + Description: Функции для приёма и выдачи параметров. + + Автор: Улитовский Д.И. + Дата последнего обновления: 2021.11.08 +**************************************************************************/ + +#include "param.h" + +int Unites[UNIT_QUA_UNITS][UNIT_LEN]; +int CAN_timeout[UNIT_QUA]; +RS_DATA_STRUCT rs_a = RS_DATA_STRUCT_DEFAULT, rs_b = RS_DATA_STRUCT_DEFAULT; + +// Изменяет значение параметра +void readInputParameters(const real_T *u) { + int nn = 0; + + iq_norm_ADC[0][0] = _IQ(u[nn++]/NORMA_ACP); + iq_norm_ADC[0][1] = _IQ(u[nn++]/NORMA_ACP); + iq_norm_ADC[0][2] = _IQ(u[nn++]/NORMA_ACP); + iq_norm_ADC[0][3] = _IQ(u[nn++]/NORMA_ACP); + iq_norm_ADC[0][4] = _IQ(u[nn++]/NORMA_ACP); + iq_norm_ADC[0][5] = _IQ(u[nn++]/NORMA_ACP); + iq_norm_ADC[0][6] = _IQ(u[nn++]/NORMA_ACP); + iq_norm_ADC[0][7] = _IQ(u[nn++]/NORMA_ACP); + + WRotor.iqWRotorSumFilter = _IQ(u[nn++] / PI2 / NORMA_FROTOR); + + u[nn++]; + + edrk.Go = u[nn++]; + + u[nn++]; + + edrk.Mode_ScalarVectorUFConst = ALG_MODE_FOC_OBOROTS; + + edrk.zadanie.iq_power_zad_rmp = _IQ(u[nn++]); + edrk.zadanie.iq_oborots_zad_hz_rmp = _IQ(u[nn++]); + + edrk.MasterSlave = MODE_MASTER; + edrk.master_theta; + edrk.master_Iq; + edrk.iq_power_kw_another_bs; + edrk.tetta_to_slave; + edrk.Iq_to_slave; + edrk.P_to_master; + + uf_alg.winding_displacement_bs1; +} //void input_param(unsigned short num, unsigned short val) + + +void writeOutputParameters(real_T* xD) { +} \ No newline at end of file diff --git a/Inu/Src/main_matlab/param.h b/Inu/Src/main_matlab/param.h new file mode 100644 index 0000000..713a32d --- /dev/null +++ b/Inu/Src/main_matlab/param.h @@ -0,0 +1,16 @@ +#include "simstruc.h" +#include "controller.h" + +#ifndef PARAM +#define PARAM + + +void readInputParameters(const real_T* u); + +extern int Unites[UNIT_QUA_UNITS][UNIT_LEN]; +extern int CAN_timeout[UNIT_QUA]; +extern RS_DATA_STRUCT rs_a; +extern RS_DATA_STRUCT rs_b; +extern _iq iq_norm_ADC[COUNT_ARR_ADC_BUF][16]; +#endif //PARAM + diff --git a/Inu/controller.c b/Inu/controller.c index cc5f471..ef0e290 100644 --- a/Inu/controller.c +++ b/Inu/controller.c @@ -12,6 +12,7 @@ #include "simstruc.h" #include "controller.h" #include "init28335.h" +#include "param.h" extern UMotorMeasure motor; @@ -54,68 +55,15 @@ int timers_pwm = 0; - -void readInputParameters(const real_T *u) { - // int t; - //// ВХОДЫ (begin) - //nn = 0; - //// аналоговые величины - //motor.udc1_ml = u[nn++];//В - //motor.udc2_ml = u[nn++];//В - - //motor.ia1_ml = u[nn++];//А - //motor.ib1_ml = u[nn++];//А - //motor.ic1_ml = u[nn++];//А - //motor.ia2_ml = u[nn++];//А - //motor.ib2_ml = u[nn++];//А - //motor.ic2_ml = u[nn++];//А - //motor.wm_ml = u[nn++];//рад/с - - //// управление (например, с ВУ) - //mst.faultReset = (unsigned short)u[nn++]; - //mst.start = (unsigned short)u[nn++]; - //mst.pzMode = (unsigned short)u[nn++]; - //mst.wmZz = u[nn++];//o.e. (от N_BAZ) - //mst.pmZz = u[nn++]*(P_NOM/S_BAZ);//o.e. (от S_BAZ) - //mst.wmLim = u[nn++];//o.e. (от N_BAZ) - //mst.pmLim = u[nn++]*(P_NOM/S_BAZ);//o.e. (от S_BAZ) - //mst.pIncrMaxTy = u[nn++]*TY*DECIM_PSI_WM_PM*(P_NOM/S_BAZ);//o.e. (от S_BAZ) - //mst.pDecrMaxTy = u[nn++]*TY*DECIM_PSI_WM_PM*(P_NOM/S_BAZ);//o.e. (от S_BAZ) - - //// - //mst.off_curr_pi = (unsigned short)u[nn++]; - //mst.only_one_km = (unsigned short)u[nn++]; - //mst.enable_compens_iq1_iq2 = (unsigned short)u[nn++]; - //mst.pi_iq_ki = u[nn++]; - //mst.pi_id_ki = u[nn++]; - //t = (unsigned short)u[nn++]; - //t = (unsigned short)u[nn++]; - //t = (unsigned short)u[nn++]; - //t = (unsigned short)u[nn++]; - //t = (unsigned short)u[nn++]; - - - //// параметры (например, с ПУ) - //paramNo = FIRST_WRITE_PAR_NUM; - //paramNew[paramNo++] = (unsigned short)u[nn++]; - //paramNew[paramNo++] = (unsigned short)u[nn++]; - - - //// ВХОДЫ (end) - - -} - - void processSFunctionIfChanged(SimStruct *S, int_T *iW) { // обрабатываем параметры S-Function каждый раз, когда они изменились if ( iW[0] == 1 ) { iW[0] = 0; - kkk = 0; - for ( lll = 0; lll < NPARAMS; lll++ ) { + int kkk = 0; + for (int lll = 0; lll < NPARAMS; lll++ ) { // определяем кол-во элементов в параметре - dimen = mxGetNumberOfElements(ssGetSFcnParam(S,lll)); + int dimen = mxGetNumberOfElements(ssGetSFcnParam(S,lll)); // обрабатываем параметр в зависимости от его размера if ( dimen > LEN_PARAM_MATR*2 ) { ssSetErrorStatus(S,"В параметре-массиве слишком много элементов"); @@ -125,7 +73,7 @@ void processSFunctionIfChanged(SimStruct *S, int_T *iW) { // запоминаем кол-во элементов параметра-матрицы paramMatrDimen = dimen; // запоминаем значения элементов параметра-матрицы - for ( mmm = 0; mmm < dimen; mmm++ ) + for (int mmm = 0; mmm < dimen; mmm++ ) paramMatr[mmm] = mxGetPr(ssGetSFcnParam(S,lll))[mmm]; } else { @@ -134,8 +82,8 @@ void processSFunctionIfChanged(SimStruct *S, int_T *iW) { } } // ПАРАМЕТРЫ (begin) - nn = 0; - dt = paramScal[nn++];//шаг дискретизации (всегда должен передаваться в S-function последним!) + int nn = 0; + double dt = paramScal[nn++];//шаг дискретизации (всегда должен передаваться в S-function последним!) // ПАРАМЕТРЫ (end) } //if ( iW[0] == 1 ) @@ -970,229 +918,10 @@ void simulateTripZoneSubmodule(void) { } -void writeOutputParameters(real_T *xD) { - -// // ВЫХОДЫ (begin) -// nn = 0; -// // Управление -// // ... INU1 -// xD[nn++] = ci1A_DT; -// xD[nn++] = ci2A_DT; -// xD[nn++] = ci1B_DT; -// xD[nn++] = ci2B_DT; -// -// xD[nn++] = ci3A_DT; -// xD[nn++] = ci4A_DT; -// xD[nn++] = ci3B_DT; -// xD[nn++] = ci4B_DT; -// -// xD[nn++] = ci5A_DT; -// xD[nn++] = ci6A_DT; -// xD[nn++] = ci5B_DT; -// xD[nn++] = ci6B_DT; -// // ... INU2 -// xD[nn++] = ci7A_DT; -// xD[nn++] = ci8A_DT; -// xD[nn++] = ci7B_DT; -// xD[nn++] = ci8B_DT; -// -// xD[nn++] = ci9A_DT; -// xD[nn++] = ci10A_DT; -// xD[nn++] = ci9B_DT; -// xD[nn++] = ci10B_DT; -// -// xD[nn++] = ci11A_DT; -// xD[nn++] = ci12A_DT; -// xD[nn++] = ci11B_DT; -// xD[nn++] = ci12B_DT; -// -// -//// выходы ацп для контроля -// xD[nn++] = udc1_ml; -// xD[nn++] = udc2_ml; -// xD[nn++] = udc3_ml; -// xD[nn++] = udc4_ml; -// -// xD[nn++] = idc1_ml; -// xD[nn++] = idc2_ml; -// xD[nn++] = idc3_ml; -// xD[nn++] = idc4_ml; -// -// xD[nn++] = _IQtoF(analog.iqIa1_1) * NORMA_ACP; -// xD[nn++] = _IQtoF(analog.iqIb1_1) * NORMA_ACP; -// xD[nn++] = _IQtoF(analog.iqIc1_1) * NORMA_ACP; -// xD[nn++] = _IQtoF(analog.iqIa2_1) * NORMA_ACP; -// xD[nn++] = _IQtoF(analog.iqIb2_1) * NORMA_ACP; -// xD[nn++] = _IQtoF(analog.iqIc2_1) * NORMA_ACP; -// -//// timers out -// -// xD[nn++] = timers_adc; -// xD[nn++] = timers_pwm; -// xD[nn++] = Tadc; -// xD[nn++] = dt; -// -// // Только для просмотра -// xD[nn++] = _IQtoF(rp.pmZ); -// xD[nn++] = _IQtoF(rs.wmZ); -// -// xD[nn++] = mst.start; -// xD[nn++] = inuWork; -// xD[nn++] = mst.pzMode; -// -// xD[nn++] = psi; -// xD[nn++] = rf.psiZ; -// -// xD[nn++] = wm; -// xD[nn++] = _IQtoF(vect_control.koeff_correct_Id);//rs.wmZ; -// xD[nn++] = _IQtoF(vect_control.iqFrot) * NORMA_FROTOR * 60.0 / N_BAZ;//csp.wmLimZi; -// -// xD[nn++] = pm*S_BAZ;///P_NOM; -// xD[nn++] = rp.pmZ*S_BAZ;///P_NOM; -// xD[nn++] = csp.pmLimZi*S_BAZ;///P_NOM; -// -// xD[nn++] = _IQtoF(analog.iqId1)* NORMA_ACP;//_IQtoF(vect_control.iqPzad); -// xD[nn++] = _IQtoF(analog.iqIq1)* NORMA_ACP;// * NORMA_ACP; -// xD[nn++] = _IQtoF(analog.iqId2)* NORMA_ACP;//_IQtoF(vect_control.iqUqCompensation1);// -// xD[nn++] = _IQtoF(analog.iqIq2)* NORMA_ACP; -// xD[nn++] = _IQtoF(vect_control.iqId_zad)* NORMA_ACP; -// xD[nn++] = _IQtoF(vect_control.iqIq_zad)* NORMA_ACP;//iqZ; -// -// xD[nn++] = me*M_BAZ/M_NOM; -// -// xD[nn++] = _IQtoF(vect_control.iqPzad) * NORMA_ACP * NORMA_ACP / 1000.0;; -// xD[nn++] = _IQtoF(vect_control.iqPizm) * NORMA_ACP * NORMA_ACP / 1000.0;; -// // xD[nn++] = sqrt(idZ*idZ + iqZ*iqZ); -// // xD[nn++] = IzLim; -// -// // xD[nn++] = EPwm2Regs.CMPA.half.CMPA;//xpwm_time.Ta0_0;//cc.yd1; -// // xD[nn++] = xpwm_time.Ta0_0; -// // xD[nn++] = xpwm_time.Ta0_1; -// // xD[nn++] = _IQtoF(cos_fi.cos_fi_nom);//cc.yd1; -// // xD[nn++] = _IQtoF(cos_fi.cos_fi_nom_squared);//cc.yq1; -// // xD[nn++] = _IQtoF(tetta_calc.k_t); -// xD[nn++] = _IQtoF(vect_control.iqUzad1);//cc.yd1; -// xD[nn++] = _IQtoF(vect_control.iqUzad2);//cc.yd1; -//// xD[nn++] = _IQtoF(vect_control.iqUdKm1Out);//cc.yq1; -//// xD[nn++] = _IQtoF(vect_control.iqUqKm1Out); -// -// xD[nn++] = _IQtoF(vect_control.iqUdKm1);//sqrt(cc.yd1*cc.yd1 + cc.yq1*cc.yq1); -// xD[nn++] = _IQtoF(vect_control.iqUqKm1);//sqrt(cc.yd2*cc.yd2 + cc.yq2*cc.yq2); -// xD[nn++] = _IQtoF(vect_control.iqUdKm2);//Y_LIM; -// xD[nn++] = _IQtoF(vect_control.iqUqKm2);//Y_LIM; -// -// -// xD[nn++] = _IQtoF(vect_control.iqUdKm1Out);//sqrt(cc.yd1*cc.yd1 + cc.yq1*cc.yq1); -// xD[nn++] = _IQtoF(vect_control.iqUqKm1Out);//sqrt(cc.yd2*cc.yd2 + cc.yq2*cc.yq2); -// xD[nn++] = _IQtoF(vect_control.iqUdKm2Out);//Y_LIM; -// xD[nn++] = _IQtoF(vect_control.iqUqKm2Out);//Y_LIM; -// -// xD[nn++] = _IQtoF(vect_control.k_modul_max);//Y_LIM; -// -// xD[nn++] = _IQtoF(vect_control.k_modul_max_def); -// xD[nn++] = _IQtoF(vect_control.maxUq1); -// xD[nn++] = _IQtoF(vect_control.maxUq2); -// xD[nn++] = _IQtoF(vect_control.Uq1Out); -// xD[nn++] = _IQtoF(vect_control.Uq2Out); -//// xD[nn++] = _IQtoF(vect_control.K_MODUL_MAX); -//// xD[nn++] = _IQtoF(vect_control.K_MODUL_MAX); -//// xD[nn++] = _IQtoF(vect_control.K_MODUL_MAX); -// -// -// // xD[nn++] = sqrt(cc.yd1*cc.yd1 + cc.yq1*cc.yq1); -// // xD[nn++] = sqrt(cc.yd2*cc.yd2 + cc.yq2*cc.yq2); -// // xD[nn++] = Y_LIM; -// // ВЫХОДЫ (end) -// -// -///////////////// new -// xD[nn++] = _IQtoF(f.iq_mzz_zad) * NORMA_ACP;// -// xD[nn++] = _IQtoF(pidPvect.OutMax) * NORMA_ACP; -// xD[nn++] = _IQtoF(pidPvect.OutMin) * NORMA_ACP; -// xD[nn++] = _IQtoF(pidPvect.Out) * NORMA_ACP; -// xD[nn++] = _IQtoF(vect_control.mzz_zad_int) * NORMA_ACP ; -// xD[nn++] = _IQtoF(filter.iqIm_1) * NORMA_ACP; -// xD[nn++] = _IQtoF(filter.iqIm_2) * NORMA_ACP; -// -// xD[nn++] = _IQtoF(vect_control.Pzad_rmp) * NORMA_ACP * NORMA_ACP / 1000.0; -// xD[nn++] = _IQtoF(f.iq_p_rampa) * NORMA_ACP * NORMA_ACP / 1000.0; -// xD[nn++] = _IQtoF(analog.iqPvsi1) * NORMA_ACP * NORMA_ACP / 1000.0; -// xD[nn++] = _IQtoF(analog.iqPvsi1) * NORMA_ACP * NORMA_ACP / 1000.0; -// -// xD[nn++] = _IQtoF(analog.iqW1) * NORMA_ACP * NORMA_ACP / 1000.0; -// xD[nn++] = _IQtoF(analog.iqW2) * NORMA_ACP * NORMA_ACP / 1000.0; -// xD[nn++] = _IQtoF(analog.iqW) * NORMA_ACP * NORMA_ACP / 1000.0; -// xD[nn++] = _IQtoF(filter.iqW1) * NORMA_ACP * NORMA_ACP / 1000.0; -// xD[nn++] = _IQtoF(filter.iqW2) * NORMA_ACP * NORMA_ACP / 1000.0; -// xD[nn++] = _IQtoF(filter.iqW) * NORMA_ACP * NORMA_ACP / 1000.0; -// -// -// -// xD[nn++] = _IQtoF(vect_control.iqFrot) * NORMA_FROTOR * 60.0; -// xD[nn++] = vect_control.flag_reverse;//_IQtoF(0); -// -// xD[nn++] = _IQtoF(vect_control.koeff_correct_Id); -// xD[nn++] = _IQtoF(cos_fi.cos_fi_nom); -// -// xD[nn++] = _IQtoF(filter.Fsl) * NORMA_FROTOR; -// -// xD[nn++] = _IQtoF(filter.iqIa1_1) * NORMA_ACP; -// xD[nn++] = _IQtoF(filter.iqIb1_1) * NORMA_ACP; -// xD[nn++] = _IQtoF(filter.iqIc1_1) * NORMA_ACP; -// -// xD[nn++] = _IQtoF(filter.iqIa2_1) * NORMA_ACP; -// xD[nn++] = _IQtoF(filter.iqIb2_1) * NORMA_ACP; -// xD[nn++] = _IQtoF(filter.iqIc2_1) * NORMA_ACP; -// -// xD[nn++] = _IQtoF(tetta_calc.Imds); -// xD[nn++] = _IQtoF(tetta_calc.tetta); -// -// xD[nn++] = _IQtoF(vect_control.Is) * NORMA_ACP; -// xD[nn++] = _IQtoF(vect_control.Ids) * NORMA_ACP; -// xD[nn++] = _IQtoF(vect_control.Id_ref_fw) * NORMA_ACP; -// xD[nn++] = _IQtoF(vect_control.Id_ref_1) * NORMA_ACP; -// xD[nn++] = _IQtoF(vect_control.Is_max) * NORMA_ACP; -// -// xD[nn++] = vect_control.flag_fw; -// -// xD[nn++] = _IQtoF(vect_control.ws_Iq1) * NORMA_ACP; -// xD[nn++] = _IQtoF(vect_control.ws_Id_filter1) * NORMA_ACP; -// xD[nn++] = _IQtoF(vect_control.ws_Id_filter2) * NORMA_ACP; -// -// xD[nn++] = _IQtoF(vect_control.ws_ws_t1) * NORMA_FROTOR; -// -// xD[nn++] = _IQtoF(analog.Fsl) * NORMA_FROTOR; -// xD[nn++] = _IQtoF(filter.Fsl) * NORMA_FROTOR; -// -// xD[nn++] = vect_control.tmp1; -// xD[nn++] = vect_control.tmp2; -// xD[nn++] = vect_control.tmp3; -// //xD[nn++] = _IQtoF(0) * NORMA_ACP; -// //xD[nn++] = _IQtoF(0) * NORMA_ACP; -// xD[nn++] = _IQtoF(0) * NORMA_ACP; -// -// -// -// xD[nn++] = _IQtoF(svgen_dq_1.Ta)*1000.0; -// xD[nn++] = _IQtoF(svgen_dq_1.Tb)*1000.0; -// xD[nn++] = _IQtoF(svgen_dq_1.Tc)*1000.0; -// -// xD[nn++] = _IQtoF(svgen_dq_2.Ta)*1000.0; -// xD[nn++] = _IQtoF(svgen_dq_2.Tb)*1000.0; -// xD[nn++] = _IQtoF(svgen_dq_2.Tc)*1000.0; -// - - - - -} - void controller(SimStruct *S, const real_T *u, real_T *xD, real_T *rW, int_T *iW) { - static _iq Uzad1 = 0, Fzad = 0, Uzad2 = 0, Izad_out = 0, Uzad_from_master = 0; - _iq wd; readInputParameters(u); processSFunctionIfChanged(S, iW); @@ -1213,33 +942,5 @@ void controller(SimStruct *S, const real_T *u, real_T *xD, real_T *rW, int_T *iW writeOutputParameters(xD); - if (edrk.flag_second_PCH == 0) { - wd = uf_alg.winding_displacement_bs1; - } - else { - wd = uf_alg.winding_displacement_bs2; - } - - vectorControlConstId(edrk.zadanie.iq_power_zad_rmp, edrk.zadanie.iq_oborots_zad_hz_rmp, - WRotor.RotorDirectionSlow, WRotor.iqWRotorSumFilter, - edrk.Mode_ScalarVectorUFConst, - edrk.MasterSlave, edrk.zadanie.iq_Izad, wd, - edrk.master_theta, edrk.master_Iq, edrk.iq_power_kw_another_bs, - &edrk.tetta_to_slave, &edrk.Iq_to_slave, &edrk.P_to_master, - 0, 1); - - test_calc_vect_dq_pwm24_Ing(vect_control.iqTheta, vect_control.iqUdKm, vect_control.iqUqKm, - edrk.disable_alg_u_disbalance, - edrk.zadanie.iq_kplus_u_disbalance_rmp, edrk.zadanie.iq_k_u_disbalance_rmp, - filter.iqU_1_fast, filter.iqU_2_fast, - 0, - edrk.Uzad_max, - edrk.MasterSlave, - edrk.flag_second_PCH, - &edrk.Kplus, &edrk.Uzad_to_slave); - analog.PowerFOC = edrk.P_to_master; - Fzad = vect_control.iqFstator; - Izad_out = edrk.Iq_to_slave; - - + mcu_simulate_step(); } //void controller(SimStruct ... diff --git a/Inu/controller.h b/Inu/controller.h index 3db497d..a16fe3b 100644 --- a/Inu/controller.h +++ b/Inu/controller.h @@ -1,3 +1,5 @@ +#include "DSP281x_Device.h" + #include "wrapper_inu.h" #include "def.h" #include "edrk_main.h" @@ -9,6 +11,10 @@ #include "v_rotor_22220.h" #include "v_pwm24_v2.h" #include "control_station.h" +#include "control_station_project.h" +#include "CAN_Setup.h" +#include "RS_Functions.h" +#include "master_slave.h" #include #include @@ -28,15 +34,6 @@ double paramScal[NPARAMS]; double paramMatr[LEN_PARAM_MATR*2]; int paramMatrDimen; -// Индекс входного и выходного массива, а также массива параметров -int nn; -// Шаг интегрирования -double dt; -// Для обработки параметров -int kkk, lll, mmm, dimen; - - - // Переменные, которые определены в controller.c (begin) //######################################################################### // Параметры diff --git a/Inu/param.c b/Inu/param.c deleted file mode 100644 index 4ebbffa..0000000 --- a/Inu/param.c +++ /dev/null @@ -1,426 +0,0 @@ -/************************************************************************** - Description: Функции для приёма и выдачи параметров. - - Автор: Улитовский Д.И. - Дата последнего обновления: 2021.11.08 -**************************************************************************/ - - -#include "def.h" -#include "param.h" - - -#pragma CODE_SECTION(input_param, "ramfuncs"); -#pragma CODE_SECTION(output_param, "ramfuncs"); - - -extern short test_param(void); -extern void process_sgm_parameters(void); - - -// Изменяет значение параметра -void input_param(unsigned short num, unsigned short val) { - switch ( num ) { - case 180://rf.PsiZ, %*10 от PSI_BAZ - if ( (val <= 2000) && (val != param[num]) ) { - param[num] = val; - rf.PsiZ = (float)val*0.001;//%*10 -> o.e. - eprom.writeRequestNumber += 1; - } - break; - case 200://offset.Ia1, ед. АЦП - if ( (val >= 1748) && (val <= 4096) && (val != param[num]) ) { - offset.Ia1 = param[num] = val; - eprom.writeRequestNumber += 1; - } - break; - case 201://offset.Ib1, ед. АЦП - if ( (val >= 1748) && (val <= 4096) && (val != param[num]) ) { - offset.Ib1 = param[num] = val; - eprom.writeRequestNumber += 1; - } - break; - case 202://offset.Ic1, ед. АЦП - if ( (val >= 1748) && (val <= 4096) && (val != param[num]) ) { - offset.Ic1 = param[num] = val; - eprom.writeRequestNumber += 1; - } - break; - case 203://offset.Udc1, ед. АЦП - if ( (val >= 1748) && (val <= 4096) && (val != param[num]) ) { - offset.Udc1 = param[num] = val; - eprom.writeRequestNumber += 1; - } - break; - case 206://offset.Ia2, ед. АЦП - if ( (val >= 1748) && (val <= 4096) && (val != param[num]) ) { - offset.Ia2 = param[num] = val; - eprom.writeRequestNumber += 1; - } - break; - case 207://offset.Ib2, ед. АЦП - if ( (val >= 1748) && (val <= 4096) && (val != param[num]) ) { - offset.Ib2 = param[num] = val; - eprom.writeRequestNumber += 1; - } - break; - case 208://offset.Ic2, ед. АЦП - if ( (val >= 1748) && (val <= 4096) && (val != param[num]) ) { - offset.Ic2 = param[num] = val; - eprom.writeRequestNumber += 1; - } - break; - case 209://offset.Udc2, ед. АЦП - if ( (val >= 1748) && (val <= 4096) && (val != param[num]) ) { - offset.Udc2 = param[num] = val; - eprom.writeRequestNumber += 1; - } - break; - case 210://cc.Kp, % - if ( (val <= 5000) && (val != param[num]) ) { - param[num] = val; - cc.Kp = (float)val*cc.KpOrig; - eprom.writeRequestNumber += 1; - } - break; - case 211://cc.Ki, % - if ( (val <= 5000) && (val != param[num]) ) { - param[num] = val; - cc.Ki = (float)val*cc.KiOrig; - eprom.writeRequestNumber += 1; - } - break; - case 212://cf.Kp, % - if ( (val <= 5000) && (val != param[num]) ) { - param[num] = val; - cf.Kp = (float)val*cf.KpOrig; - eprom.writeRequestNumber += 1; - } - break; - case 213://cf.Ki, % - if ( (val <= 5000) && (val != param[num]) ) { - param[num] = val; - cf.Ki = (float)val*cf.KiOrig; - eprom.writeRequestNumber += 1; - } - break; - case 214://csp.Kp, % - if ( (val <= 5000) && (val != param[num]) ) { - param[num] = val; - csp.Kp = (float)val*csp.KpOrig; - eprom.writeRequestNumber += 1; - } - break; - case 215://csp.Ki, % - if ( (val <= 5000) && (val != param[num]) ) { - param[num] = val; - csp.Ki = (float)val*csp.KiOrig; - eprom.writeRequestNumber += 1; - } - break; - case 220://protect.IacMax, % от IAC_SENS_MAX - if ( (val <= 99) && (val != param[num]) ) { - param[num] = val; - protect.IacMax = (short)(2047.*(float)val*0.01);//% -> ед. АЦП - protect.IacMin = -protect.IacMax; - eprom.writeRequestNumber += 1; - } - break; - case 221://protect.UdcMax, % от U_NOM - if ( (val <= 136) && (val != param[num]) ) { - param[num] = val; - protect.UdcMax = (float)val*0.01;//% -> o.e. - eprom.writeRequestNumber += 1; - } - break; - case 222://IzLim, % от I_BAZ - if ( (val <= 200) && (val != param[num]) ) { - param[num] = val; - IzLim = (float)val*0.01;//% -> o.e. - eprom.writeRequestNumber += 1; - } - break; - case 223://cf.IdLim, % от I_BAZ - if ( (val <= 200) && (val != param[num]) ) { - param[num] = val; - cf.IdLim = (float)val*0.01;//% -> o.e. - cf.IdLimNeg = cf.IdLim*(-0.4); - eprom.writeRequestNumber += 1; - } - break; - case 224://csp.IqLim, % от I_BAZ - if ( (val <= 200) && (val != param[num]) ) { - param[num] = val; - csp.IqLim = (float)val*0.01;//% -> o.e. - csp.IqLimNeg = -csp.IqLim; - eprom.writeRequestNumber += 1; - } - break; - case 225://protect.UdcMin, % от U_NOM - if ( (val <= 110) && (val != param[num]) ) { - param[num] = val; - protect.UdcMin = (float)val*0.01;//% -> o.e. - eprom.writeRequestNumber += 1; - } - break; - case 226://protect.WmMax, % от N_NOM - if ( (val <= 200) && (val != param[num]) ) { - param[num] = val; - protect.WmMax = (float)val*0.01;//% -> o.e. - eprom.writeRequestNumber += 1; - } - break; - case 228://rf.WmNomPsi, % от N_NOM - if ( (val <= 200) && (val != param[num]) ) { - param[num] = val; - rf.WmNomPsi = (float)val*0.01;//% -> o.e. - eprom.writeRequestNumber += 1; - } - break; - case 229://rf.YlimPsi, % от Y_LIM - if ( (val <= 101) && (val != param[num]) ) { - param[num] = val; - rf.YlimPsi = (float)val*0.01*Y_LIM;//% -> ед. счётчика таймера - eprom.writeRequestNumber += 1; - } - break; - case 231://protect.TudcMin, мс - if ( (val >= 1) && (val <= 8500) && (val != param[num]) ) { - param[num] = val; - protect.TudcMin = (unsigned short)((float)val*0.001/TY); - eprom.writeRequestNumber += 1; - } - break; - case 233://protect.TwmMax, мс - if ( (val >= 1) && (val <= 8500) && (val != param[num]) ) { - param[num] = val; - protect.TwmMax = (unsigned short)((float)val*0.001/TY); - eprom.writeRequestNumber += 1; - } - break; - case 244://rs.WlimIncr, мс - if ( (val >= 1) && (val != param[num]) ) { - param[num] = val; - // изм. на 1.0 за столько-то мс - rs.WlimIncr = 1.0*TY*DECIM_PSI_WM_PM/((float)val*0.001); - eprom.writeRequestNumber += 1; - } - break; - case 245://csp.IlimIncr, мс - if ( (val >= 1) && (val != param[num]) ) { - param[num] = val; - // изм. на I_BAZ за столько-то мс - csp.IlimIncr = 1.0*TY*DECIM_PSI_WM_PM/((float)val*0.001); - eprom.writeRequestNumber += 1; - } - break; - case 248://rp.PlimIncr, мс - if ( (val >= 1) && (val != param[num]) ) { - param[num] = val; - // изм. на 1.0 за столько-то мс - rp.PlimIncr = 1.0*TY*DECIM_PSI_WM_PM/((float)val*0.001); - eprom.writeRequestNumber += 1; - } - break; - case 269://KmeCorr, %*100 - if ( (val >= 5000) && (val <= 20000) && (val != param[num]) ) { - param[num] = val; - KmeCorr = (float)val*0.0001;//%*100 -> o.e. - eprom.writeRequestNumber += 1; - } - break; - case 285://Kudc, мс*10 - if ( (val >= 1) && (val <= 20000) && (val != param[num]) ) { - param[num] = val; - Kudc = (TY*10000.)/(float)val; - if ( Kudc > 1.0 ) - Kudc = 1.0; - eprom.writeRequestNumber += 1; - } - break; - case 286://Kwm, мс*10 - if ( (val >= 1) && (val <= 20000) && (val != param[num]) ) { - param[num] = val; - Kwm = (TY*10000.)/(float)val; - if ( Kwm > 1.0 ) - Kwm = 1.0; - eprom.writeRequestNumber += 1; - } - break; - case 288://rs.Kwmz, мс - if ( (val >= 1) && (val <= 20000) && (val != param[num]) ) { - param[num] = val; - rs.Kwmz = (TY*DECIM_PSI_WM_PM*1000.)/(float)val; - eprom.writeRequestNumber += 1; - } - break; - case 289://rf.Kpsiz, мс - if ( (val >= 1) && (val <= 20000) && (val != param[num]) ) { - param[num] = val; - rf.Kpsiz = (TY*DECIM_PSI_WM_PM*1000.)/(float)val; - eprom.writeRequestNumber += 1; - } - break; - case 290://Kme, мс - if ( (val >= 1) && (val <= 20000) && (val != param[num]) ) { - param[num] = val; - Kme = (TY*1000.)/(float)val; - eprom.writeRequestNumber += 1; - } - break; - case 292://rp.Kpmz, мс - if ( (val >= 1) && (val <= 20000) && (val != param[num]) ) { - param[num] = val; - rp.Kpmz = (TY*DECIM_PSI_WM_PM*1000.)/(float)val; - eprom.writeRequestNumber += 1; - } - break; - case 303://sgmPar.Rs, мкОм - if ( val != param[num] ) { - param[num] = val; - sgmPar.Rs = (float)val*1e-6;//мкОм -> Ом - eprom.writeRequestNumber += 1; - } - break; - case 304://sgmPar.Lls, мкГн*10 - if ( val != param[num] ) { - param[num] = val; - sgmPar.Lls = (float)val*1e-7;//мкГн*10 -> Гн - process_sgm_parameters(); - eprom.writeRequestNumber += 1; - } - break; - case 305://sgmPar.Rr, мкОм - if ( val != param[num] ) { - param[num] = val; - sgmPar.Rr = (float)val*1e-6;//мкОм -> Ом - process_sgm_parameters(); - eprom.writeRequestNumber += 1; - } - break; - case 306://sgmPar.Llr, мкГн*10 - if ( val != param[num] ) { - param[num] = val; - sgmPar.Llr = (float)val*1e-7;//мкГн*10 -> Гн - process_sgm_parameters(); - eprom.writeRequestNumber += 1; - } - break; - case 307://sgmPar.Lm, мкГн - if ( val != param[num] ) { - param[num] = val; - sgmPar.Lm = (float)val*1e-6;//мкГн -> Гн - process_sgm_parameters(); - eprom.writeRequestNumber += 1; - } - break; - default: - if ( num < PAR_NUMBER ) { - param[num] = val; - } - break; - } //switch ( num ) -} //void input_param(unsigned short num, unsigned short val) - - - -// Выдаёт значение параметра -unsigned short output_param(unsigned short num) { - static unsigned short output; - - switch ( num ) { - case 1: //udc1, o.e. -> o.e.*CONTROLLER_GAIN - if ( state == STATE_SHUTDOWN ) { - output = (unsigned short)(emerg.udc1*CONTROLLER_GAIN); - } - else { - output = (unsigned short)(out.udc1*CONTROLLER_GAIN); - } - break; - case 2: //udc2, o.e. -> o.e.*CONTROLLER_GAIN - if ( state == STATE_SHUTDOWN ) { - output = (unsigned short)(emerg.udc2*CONTROLLER_GAIN); - } - else { - output = (unsigned short)(out.udc2*CONTROLLER_GAIN); - } - break; - case 5: //iac1, o.e. -> o.e.*CONTROLLER_GAIN - if ( state == STATE_SHUTDOWN ) { - output = (unsigned short)(emerg.iac1*CONTROLLER_GAIN); - } - else { - output = (unsigned short)(out.iac1*CONTROLLER_GAIN); - } - break; - case 6: //iac2, o.e. -> o.e.*CONTROLLER_GAIN - if ( state == STATE_SHUTDOWN ) { - output = (unsigned short)(emerg.iac2*CONTROLLER_GAIN); - } - else { - output = (unsigned short)(out.iac2*CONTROLLER_GAIN); - } - break; - case 7: //me, o.e. -> (o.e. + CONTROLLER_BIAS)*CONTROLLER_GAIN - if ( state == STATE_SHUTDOWN ) { - if ( emerg.me > CONTROLLER_BIAS ) - output = (unsigned short)((CONTROLLER_BIAS + CONTROLLER_BIAS)*CONTROLLER_GAIN); - else if ( emerg.me > -CONTROLLER_BIAS ) - output = (unsigned short)((emerg.me + CONTROLLER_BIAS)*CONTROLLER_GAIN); - else - output = 0; - } - else { - if ( out.me > CONTROLLER_BIAS ) - output = (unsigned short)((CONTROLLER_BIAS + CONTROLLER_BIAS)*CONTROLLER_GAIN); - else if ( out.me > -CONTROLLER_BIAS ) - output = (unsigned short)((out.me + CONTROLLER_BIAS)*CONTROLLER_GAIN); - else - output = 0; - } - break; - case 8: //nm, o.e. -> (o.e. + CONTROLLER_BIAS)*CONTROLLER_GAIN - if ( state == STATE_SHUTDOWN ) { - if ( emerg.wm > CONTROLLER_BIAS ) - output = (unsigned short)((CONTROLLER_BIAS + CONTROLLER_BIAS)*CONTROLLER_GAIN); - else if ( emerg.wm > -CONTROLLER_BIAS ) - output = (unsigned short)((emerg.wm + CONTROLLER_BIAS)*CONTROLLER_GAIN); - else - output = 0; - } - else { - if ( out.wm > CONTROLLER_BIAS ) - output = (unsigned short)((CONTROLLER_BIAS + CONTROLLER_BIAS)*CONTROLLER_GAIN); - else if ( out.wm > -CONTROLLER_BIAS ) - output = (unsigned short)((out.wm + CONTROLLER_BIAS)*CONTROLLER_GAIN); - else - output = 0; - } - break; - case 9: //pm, o.e. -> (o.e. + CONTROLLER_BIAS)*CONTROLLER_GAIN - if ( state == STATE_SHUTDOWN ) { - if ( emerg.pm > CONTROLLER_BIAS ) - output = (unsigned short)((CONTROLLER_BIAS + CONTROLLER_BIAS)*CONTROLLER_GAIN); - else if ( emerg.pm > -CONTROLLER_BIAS ) - output = (unsigned short)((emerg.pm + CONTROLLER_BIAS)*CONTROLLER_GAIN); - else - output = 0; - } - else { - if ( out.pm > CONTROLLER_BIAS ) - output = (unsigned short)((CONTROLLER_BIAS + CONTROLLER_BIAS)*CONTROLLER_GAIN); - else if ( out.pm > -CONTROLLER_BIAS ) - output = (unsigned short)((out.pm + CONTROLLER_BIAS)*CONTROLLER_GAIN); - else - output = 0; - } - break; - case 10: //compound - output = faultNo + (inuWork<<7); - break; - default: - output = param[num]; - break; - } //switch ( num ) - return output; -} //unsigned short output_param(unsigned short num) diff --git a/Inu/param.h b/Inu/param.h deleted file mode 100644 index 9dc480e..0000000 --- a/Inu/param.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef PARAM -#define PARAM - -// Переменные, которые определены в param.c (begin) -//######################################################################### -unsigned short param[PAR_NUMBER]; -//######################################################################### -// Переменные, которые определены в param.c (end) - - - - -// Переменные, которые объявлены в param.c (begin) -//######################################################################### -extern volatile short state; -extern volatile short faultNo; -extern short onceFaultReset; -extern struct SgmPar sgmPar; -extern struct Offset offset; -extern float Kudc; -extern float Kwm; -extern short testParamFaultNo; -extern float IzLim; -extern float Kme; -extern struct Protect protect; -extern float KmeCorr; -extern volatile struct Out out; -extern volatile struct Emerg emerg; -extern struct Rf rf; -extern struct Rs rs; -extern struct Rp rp; -extern struct Cf cf; -extern struct Csp csp; -extern struct Cc cc; -// для передачи на ВУ -extern volatile short inuWork; -// для работы с EEPROM -extern struct Eprom eprom; -//######################################################################### -// Переменные, которые объявлены в param.c (end) -#endif //PARAM diff --git a/inu_im_2wnd_3lvl.slx b/inu_im_2wnd_3lvl.slx index a4592efc70993a85454a5d10e39d8c318628ae21..38a1ae1a387b31495632080a1f8aa930f0904c81 100644 GIT binary patch delta 22344 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 U>YuG#;RM2EL44TzBERkb16SPAxBvhE delta 22079 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