добавил gui

This commit is contained in:
2026-06-25 17:25:41 +03:00
parent cdd8fc3f71
commit 41a50a1d1e
19 changed files with 5696 additions and 32 deletions

View File

@@ -1,4 +1,4 @@
/* USER CODE BEGIN Header */
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : main.c
@@ -434,9 +434,18 @@ void reinit_t_sens(void)
// sens[i].Init.InitParam.ROM = rom_address;
sens[i].Init.InitParam.Ind = i;
sens[i].Init.init_func = &Dallas_SensorInitByInd;
sens[i].Init.Resolution = DALLAS_CONFIG_9_BITS;
MB_DATA.HoldRegs.set_Temp[i] = sens[i].set_temp = 20.;
MB_DATA.HoldRegs.set_hyst[i] = sens[i].hyst = 1;
sens[i].Init.Resolution = DALLAS_CONFIG_9_BITS; sens[i].set_temp = 20.;
sens[i].hyst = 1;
MB_DATA.HoldRegs.set_Temp[i] = (uint16_t)(sens[i].set_temp * MB_ROOM_TEMP_SCALE);
MB_DATA.HoldRegs.set_hyst[i] = (uint16_t)(sens[i].hyst * MB_ROOM_TEMP_SCALE);
MB_DATA.HoldRegs.room_cfg[i].setpoint_x10 = MB_DATA.HoldRegs.set_Temp[i];
MB_DATA.HoldRegs.room_cfg[i].hysteresis_x10 = MB_DATA.HoldRegs.set_hyst[i];
MB_DATA.HoldRegs.room_cfg[i].valve_position_pct = 0;
MB_DATA.HoldRegs.room_cfg[i].valve_angle_max_deg = MB_ROOM_VALVE_ANGLE_MAX_DEFAULT;
MB_DATA.HoldRegs.room_cfg[i].mode = ROOM_MODE_AUTO;
MB_DATA.HoldRegs.room_cfg[i].command = ROOM_COMMAND_STOP;
MB_DATA.HoldRegs.room_cfg[i].location = 1;
MB_DATA.HoldRegs.room_cfg[i].apply = 0;
Dallas_AddNewSensors(&hdallas, &sens[i]);
}
@@ -503,6 +512,70 @@ FuncStat packStruct(MB_DataStructureTypeDef* MB_DATA, int sizeARR)
return FuncOK;
}
static uint16_t clamp_room_percent(uint16_t value)
{
return value > 100U ? 100U : value;
}
static void update_room_modbus(MB_DataStructureTypeDef* MB_DATA)
{
for (int i = 0; i < MAX_SENSE; i++)
{
MB_RoomInputRegsTypeDef* room = &MB_DATA->InRegs.room[i];
MB_RoomHoldingRegsTypeDef* cfg = &MB_DATA->HoldRegs.room_cfg[i];
uint16_t open_state = 0U;
uint16_t close_state = 0U;
uint16_t position_pct;
uint16_t angle_max;
if (cfg->valve_angle_max_deg == 0U)
{
cfg->valve_angle_max_deg = MB_ROOM_VALVE_ANGLE_MAX_DEFAULT;
}
if (i < 16)
{
open_state = (MB_DATA->Coils.relay_struct_on.all >> i) & 0x1U;
close_state = (MB_DATA->Coils.relay_struct_off.all >> i) & 0x1U;
}
position_pct = clamp_room_percent(cfg->valve_position_pct);
if (cfg->mode == ROOM_MODE_AUTO)
{
if (open_state)
{
position_pct = 100U;
}
else if (close_state)
{
position_pct = 0U;
}
}
cfg->valve_position_pct = position_pct;
angle_max = cfg->valve_angle_max_deg;
room->channel = (uint16_t)(i + 1);
room->location = cfg->location;
for (int reg = 0; reg < 4; reg++)
{
room->ds18b20_id[reg] = ((uint16_t)MB_DATA->InRegs.ID.DevAddr[i][reg * 2]) |
((uint16_t)MB_DATA->InRegs.ID.DevAddr[i][reg * 2 + 1] << 8);
}
room->temperature_x10 = (i < hdallas.onewire->RomCnt) ? (uint16_t)((int16_t)(sens[i].temperature * MB_ROOM_TEMP_SCALE)) : 0U;
room->setpoint_x10 = MB_DATA->HoldRegs.set_Temp[i];
room->hysteresis_x10 = MB_DATA->HoldRegs.set_hyst[i];
room->valve_position_pct = position_pct;
room->valve_angle_deg = (uint16_t)((position_pct * angle_max) / 100U);
room->valve_angle_max_deg = angle_max;
room->is_connected = (i < hdallas.onewire->RomCnt) ? (uint16_t)sens[i].isConnected : 0U;
room->valve_open = open_state;
room->valve_close = close_state;
room->mode = cfg->mode;
room->command_state = cfg->command;
room->reserved = 0U;
}
}
FuncStat Field_modbus(MB_DataStructureTypeDef* MB_DATA, Flags_TypeDef* flag)
{
@@ -516,15 +589,23 @@ FuncStat Field_modbus(MB_DataStructureTypeDef* MB_DATA, Flags_TypeDef* flag)
MB_DATA->Coils.init_param = 0;
for(int i = 0; i < hdallas.onewire->RomCnt; i++)
{
sens[i].set_temp = MB_DATA->HoldRegs.set_Temp[i];
sens[i].hyst = MB_DATA->HoldRegs.set_hyst[i];
{ if (MB_DATA->HoldRegs.room_cfg[i].apply)
{
MB_DATA->HoldRegs.set_Temp[i] = MB_DATA->HoldRegs.room_cfg[i].setpoint_x10;
MB_DATA->HoldRegs.set_hyst[i] = MB_DATA->HoldRegs.room_cfg[i].hysteresis_x10;
MB_DATA->HoldRegs.room_cfg[i].apply = 0U;
}
MB_DATA->HoldRegs.room_cfg[i].setpoint_x10 = MB_DATA->HoldRegs.set_Temp[i];
MB_DATA->HoldRegs.room_cfg[i].hysteresis_x10 = MB_DATA->HoldRegs.set_hyst[i];
sens[i].set_temp = ((float)MB_DATA->HoldRegs.set_Temp[i]) / MB_ROOM_TEMP_SCALE;
sens[i].hyst = ((float)MB_DATA->HoldRegs.set_hyst[i]) / MB_ROOM_TEMP_SCALE;
}
}
update_room_modbus(MB_DATA);
return FuncOK;
};
@@ -534,6 +615,31 @@ FuncStat value_control(void )
for(int i = 0; i < hdallas.onewire->RomCnt; i++)
{
if (i < 16 && MB_DATA.HoldRegs.room_cfg[i].mode == ROOM_MODE_MANUAL)
{
uint16_t manual_pct = clamp_room_percent(MB_DATA.HoldRegs.room_cfg[i].valve_position_pct);
if (MB_DATA.HoldRegs.room_cfg[i].command == ROOM_COMMAND_CLOSE)
{
manual_pct = 0U;
}
else if (MB_DATA.HoldRegs.room_cfg[i].command == ROOM_COMMAND_OPEN && manual_pct == 0U)
{
manual_pct = 100U;
}
MB_DATA.HoldRegs.room_cfg[i].valve_position_pct = manual_pct;
if (manual_pct > 0U)
{
MB_DATA.Coils.relay_struct_off.all &= ~(1 << i);
MB_DATA.Coils.relay_struct_on.all |= 1 << i;
}
else
{
MB_DATA.Coils.relay_struct_on.all &= ~(1 << i);
MB_DATA.Coils.relay_struct_off.all |= 1 << i;
}
continue;
}
if (sens[i].temperature < sens[i].set_temp - sens[i].hyst)
{