matlab_23550/Inu/Src/main/uom_tools.c
2024-12-27 10:50:32 +03:00

150 lines
4.6 KiB
C

/*
* uom_tools.c
*
* Created on: 13 íîÿá. 2024 ã.
* Author: Evgeniy_Sokolov
*/
#include <edrk_main.h>
#include <params.h>
#include <params_alg.h>
#include <params_norma.h>
#include <params_pwm24.h>
#include <params_temper_p.h>
#include <project.h>
#include "IQmathLib.h"
#include "mathlib.h"
#include "CAN_Setup.h"
#include "uom_tools.h"
#pragma DATA_SECTION(uom_levels, ".slow_vars")
int uom_levels[9] = {0, 0, 15, 30, 45, 60, 75, 90, 100};
#pragma DATA_SECTION(iq_uom_levels, ".slow_vars")
_iq iq_uom_levels[9] = {_IQ(1.0), _IQ(1.0), _IQ(0.85), _IQ(0.7), _IQ(0.55), _IQ(0.4), _IQ(0.25), _IQ(0.1), _IQ(0.016)};
void update_uom(void)
{
// int index;
static _iq max_nominal_power = _IQ(MAX_ZADANIE_LIMIT_POWER*1000.0/(NORMA_MZZ*NORMA_MZZ));
static _iq super_max_nominal_power = _IQ(SUPER_MAX_ZADANIE_LIMIT_POWER*1000.0/(NORMA_MZZ*NORMA_MZZ));
static unsigned int prev_CAN_count_cycle_input_units = 0, c_data = 0;
unsigned int cur_can_cycle;
static FROM_ZADAT4IK zad = {0}, zad_w = {0};
static unsigned int temp_code = 0 , temp_code1 = 0, temp_code2 = 0, temp_code3 = 0;
cur_can_cycle = unites_can_setup.CAN_count_cycle_input_units[0];
if (prev_CAN_count_cycle_input_units != cur_can_cycle)
{
zad = edrk.from_zadat4ik;
temp_code = (zad.bits.UOM_READY_ACTIVE & 0x1) +
(zad.bits.UOM_LIMIT_1 & 0x1) << 1 +
(zad.bits.UOM_LIMIT_2 & 0x1) << 2 +
(zad.bits.UOM_LIMIT_3 & 0x1) << 3 ;
if (c_data == 0)
{
temp_code1 = temp_code;
c_data = 1;
}
else
if (c_data == 1)
{
temp_code2 = temp_code;
c_data = 2;
}
else
if (c_data == 2)
{
temp_code3 = temp_code;
c_data = 0;
}
}
prev_CAN_count_cycle_input_units = cur_can_cycle;
if ((temp_code1 == temp_code2) && (temp_code2 == temp_code3))
zad_w = zad;
edrk.from_uom.digital_line.bits.ready = zad_w.bits.UOM_READY_ACTIVE;
edrk.from_uom.digital_line.bits.level0 = zad_w.bits.UOM_LIMIT_1;
edrk.from_uom.digital_line.bits.level1 = zad_w.bits.UOM_LIMIT_2;
edrk.from_uom.digital_line.bits.level2 = zad_w.bits.UOM_LIMIT_3;
if (edrk.from_uom.digital_line.bits.ready && edrk.disable_uom==0)
{
edrk.from_uom.ready = 1;
//000 - 100
if (edrk.from_uom.digital_line.bits.level0 == 0 &&
edrk.from_uom.digital_line.bits.level1 == 0 &&
edrk.from_uom.digital_line.bits.level2 == 0 )
edrk.from_uom.code = 1;
//001 - 85
if (edrk.from_uom.digital_line.bits.level0 == 1 &&
edrk.from_uom.digital_line.bits.level1 == 0 &&
edrk.from_uom.digital_line.bits.level2 == 0 )
edrk.from_uom.code = 2;
//011 - 70
if (edrk.from_uom.digital_line.bits.level0 == 1 &&
edrk.from_uom.digital_line.bits.level1 == 1 &&
edrk.from_uom.digital_line.bits.level2 == 0 )
edrk.from_uom.code = 3;
//010 - 55
if (edrk.from_uom.digital_line.bits.level0 == 0 &&
edrk.from_uom.digital_line.bits.level1 == 1 &&
edrk.from_uom.digital_line.bits.level2 == 0 )
edrk.from_uom.code = 4;
//110 - 40
if (edrk.from_uom.digital_line.bits.level0 == 0 &&
edrk.from_uom.digital_line.bits.level1 == 1 &&
edrk.from_uom.digital_line.bits.level2 == 1 )
edrk.from_uom.code = 5;
//111 - 25
if (edrk.from_uom.digital_line.bits.level0 == 1 &&
edrk.from_uom.digital_line.bits.level1 == 1 &&
edrk.from_uom.digital_line.bits.level2 == 1 )
edrk.from_uom.code = 6;
//101 - 10
if (edrk.from_uom.digital_line.bits.level0 == 1 &&
edrk.from_uom.digital_line.bits.level1 == 0 &&
edrk.from_uom.digital_line.bits.level2 == 1 )
edrk.from_uom.code = 7;
//100 - 0
if (edrk.from_uom.digital_line.bits.level0 == 0 &&
edrk.from_uom.digital_line.bits.level1 == 0 &&
edrk.from_uom.digital_line.bits.level2 == 1 )
edrk.from_uom.code = 8;
}
else
{
edrk.from_uom.ready = 0;
edrk.from_uom.code = 0;
}
edrk.from_uom.iq_level_value = iq_uom_levels[edrk.from_uom.code];
if (edrk.from_uom.code<=1)
edrk.from_uom.iq_level_value_kwt = super_max_nominal_power;
else
edrk.from_uom.iq_level_value_kwt = _IQmpy(max_nominal_power,
edrk.from_uom.iq_level_value);
edrk.from_uom.level_value = uom_levels[edrk.from_uom.code];
}
//////////////////////////////////////////////////////////