更新:

1、modbus从站寄存器配置开发完成,待后续测试验证;
2、量程设定bug排查与修复;
This commit is contained in:
吴俊潮 2025-06-13 14:09:25 +08:00
parent abfadcaae2
commit 8e06ceee17
8 changed files with 17852 additions and 17755 deletions

View File

@ -7,6 +7,11 @@
#define LIGHT_OFF HAL_GPIO_WritePin(light_GPIO_Port, light_Pin, GPIO_PIN_RESET) #define LIGHT_OFF HAL_GPIO_WritePin(light_GPIO_Port, light_Pin, GPIO_PIN_RESET)
#define SAMPLE_INTERVAL_MAX 10000
#define PLOT_NUM_MIN 3
#define PLOT_NUM_MAX 20
//查看输入输出记录io -> 输入/输出page -> 指定页码 //查看输入输出记录io -> 输入/输出page -> 指定页码
void show_IO_log(uint8_t io, uint8_t page); void show_IO_log(uint8_t io, uint8_t page);

View File

@ -297,7 +297,10 @@ void runtime_show(void)
menu_data.runtime_minutes = 0; menu_data.runtime_minutes = 0;
menu_data.runtime_hours = 0; menu_data.runtime_hours = 0;
} }
InputReg[INPUT_ADDR_RUNTIME_SECOND] = 0x00FF & menu_data.runtime_seconds;
InputReg[INPUT_ADDR_RUNTIME_HOUR] = 0x00FF & menu_data.runtime_hours;
// 000000该字符串的长度大于8因此runtime_show应该分配大于8的内存 // 000000该字符串的长度大于8因此runtime_show应该分配大于8的内存
sprintf(menu_data.runtime_show, "%02d:%02d:%02d",menu_data.runtime_hours, menu_data.runtime_minutes, menu_data.runtime_seconds); sprintf(menu_data.runtime_show, "%02d:%02d:%02d",menu_data.runtime_hours, menu_data.runtime_minutes, menu_data.runtime_seconds);
lv_span_set_text(guider_ui.screen_main_spangroup_time_span, menu_data.runtime_show); lv_span_set_text(guider_ui.screen_main_spangroup_time_span, menu_data.runtime_show);
@ -339,37 +342,40 @@ void battery_show(void)
//正在充电,并且充电尚未结束时,循环播放动画 //正在充电,并且充电尚未结束时,循环播放动画
menu_data.battery_cnt = (menu_data.battery_cnt >= 5)?(0):(menu_data.battery_cnt + 1); menu_data.battery_cnt = (menu_data.battery_cnt >= 5)?(0):(menu_data.battery_cnt + 1);
lv_img_set_src(guider_ui.screen_main_animimg_battery, screen_main_animimg_battery_imgs[menu_data.battery_cnt]); lv_img_set_src(guider_ui.screen_main_animimg_battery, screen_main_animimg_battery_imgs[menu_data.battery_cnt]);
InputReg[INPUT_ADDR_BATTERY] = BAT_CAP_CHARGING;
} }
else else
{ {
//充电停止时,根据剩余电量显示对应帧 //充电停止时,根据剩余电量显示对应帧
InputReg[INPUT_ADDR_BATTERY] = 0x00FF & bat_cpa;
switch (bat_cpa) switch (bat_cpa)
{ {
case 0: case BAT_CAP_3:
{ {
menu_data.battery_cnt = 1; menu_data.battery_cnt = 1;
} }
break; break;
case 1: case BAT_CAP_3_25:
{ {
menu_data.battery_cnt = 2; menu_data.battery_cnt = 2;
} }
break; break;
case 3: case BAT_CAP_25_50:
{ {
menu_data.battery_cnt = 3; menu_data.battery_cnt = 3;
} }
break; break;
case 7: case BAT_CAP_50_75:
{ {
menu_data.battery_cnt = 4; menu_data.battery_cnt = 4;
} }
break; break;
case 15: case BAT_CAP_75:
{ {
menu_data.battery_cnt = 5; menu_data.battery_cnt = 5;
} }
@ -381,7 +387,6 @@ void battery_show(void)
} }
break; break;
} }
lv_img_set_src(guider_ui.screen_main_animimg_battery, screen_main_animimg_battery_imgs[menu_data.battery_cnt]); lv_img_set_src(guider_ui.screen_main_animimg_battery, screen_main_animimg_battery_imgs[menu_data.battery_cnt]);
} }
@ -784,17 +789,8 @@ void input_value_show(void)
//获取输入值 //获取输入值
pltdata.yreal_scd_value = mux2real(mux_signal.data_pv); pltdata.yreal_scd_value = mux2real(mux_signal.data_pv);
memcpy(InputReg + INPUT_ADDR_MUX_PV_L, &pltdata.yreal_scd_value, 2);
// if( MY_ABS(pltdata.yreal_scd_value - pltdata.yreal_scd_value_prv) < (float32)0.01) memcpy(InputReg + INPUT_ADDR_MUX_PV_H, &pltdata.yreal_scd_value + 16, 2);
// {
// //变化值过小的情况下不更新显示内容
// return;
// }
// else
// {
// //记录前一时刻的值,用于计算变化量
// pltdata.yreal_scd_value_prv = pltdata.yreal_scd_value;
// }
int32_t pvi = 0; int32_t pvi = 0;

View File

@ -250,7 +250,7 @@ void set_item1_value(ITEM_CONTENTS con, int8_t step)
{ {
tabdata.item1_page0_sample_interval += step * 100; tabdata.item1_page0_sample_interval += step * 100;
if( tabdata.item1_page0_sample_interval > 10000 ) tabdata.item1_page0_sample_interval = 10000; if( tabdata.item1_page0_sample_interval > SAMPLE_INTERVAL_MAX ) tabdata.item1_page0_sample_interval = SAMPLE_INTERVAL_MAX;
if( tabdata.item1_page0_sample_interval < MENU_TASK_PERIOD ) tabdata.item1_page0_sample_interval = MENU_TASK_PERIOD; if( tabdata.item1_page0_sample_interval < MENU_TASK_PERIOD ) tabdata.item1_page0_sample_interval = MENU_TASK_PERIOD;
} }
break; break;
@ -259,8 +259,8 @@ void set_item1_value(ITEM_CONTENTS con, int8_t step)
{ {
tabdata.item1_page0_plot_num += step; tabdata.item1_page0_plot_num += step;
if( tabdata.item1_page0_plot_num > 20 ) tabdata.item1_page0_plot_num = 20; if( tabdata.item1_page0_plot_num > PLOT_NUM_MAX ) tabdata.item1_page0_plot_num = PLOT_NUM_MAX;
if( tabdata.item1_page0_plot_num < 3 ) tabdata.item1_page0_plot_num = 3; if( tabdata.item1_page0_plot_num < PLOT_NUM_MIN ) tabdata.item1_page0_plot_num = PLOT_NUM_MIN;
} }
break; break;

View File

@ -23,6 +23,13 @@ extern uint8_t charging_flag;
//写命令 //写命令
#define WRITE_CMD 0xEA #define WRITE_CMD 0xEA
#define BAT_CAP_3 0
#define BAT_CAP_3_25 1
#define BAT_CAP_25_50 3
#define BAT_CAP_50_75 7
#define BAT_CAP_75 15
#define BAT_CAP_CHARGING 20
//I2C读取电池电量 //I2C读取电池电量
void read_battery(void); void read_battery(void);

View File

@ -82,6 +82,21 @@ void hold_deal_range_max(void);
//保持寄存器,处理量程修改事件,修改当前选择的物理量的量程下限 //保持寄存器,处理量程修改事件,修改当前选择的物理量的量程下限
void hold_deal_range_min(void); void hold_deal_range_min(void);
//保持寄存器,处理采样间隔修改事件
void hold_deal_sample_interval(void);
//保持寄存器,处理描点数量修改事件
void hold_deal_plot_counts(void);
//保持寄存器,处理输入曲线&图例颜色修改事件
void hold_deal_color_input(void);
//保持寄存器,处理输出曲线&图例颜色修改事件
void hold_deal_color_output(void);
//保持寄存器,处理语言选择事件
void hold_deal_language_select(void);
//输入寄存器,上位机只读 //输入寄存器,上位机只读
void modbus_reg_update_input(void); void modbus_reg_update_input(void);

View File

@ -35,6 +35,52 @@ void modbus_reg_update_coil(void)
coil_deal_screen_switch(); coil_deal_screen_switch();
} }
void set_coil_val(uint8_t addr, uint8_t bit_val)
{
if( (addr > COIL_ADD_MAX)||(bit_val > 1) ) return;
addr -= COIL_ADD_MIN;
if( addr > 200 ) return;
uint8_t pcoil = addr / 8; //数组的第几个元素, 0-7
uint8_t pbit = addr % 8; //元素的第几位, 0-7
uint8_t fac = 0; //辅助计算的因子
switch (bit_val)
{
case 0:
{
fac = ~(1 << pbit);
CoilState[pcoil] &= fac;
}
break;
case 1:
{
fac = 1 << pbit;
CoilState[pcoil] |= fac;
}
break;
default:
break;
}
}
uint8_t get_coil_val(uint8_t addr)
{
if( addr > COIL_ADD_MAX ) return 99;
addr -= COIL_ADD_MIN;
if( addr > 200 ) return 99;
uint8_t result = 0;
uint8_t pcoil = addr / 8; //数组的第几个元素, 0-7
uint8_t pbit = addr % 8; //元素的第几位, 0-7
result = 0x01 & (CoilState[pcoil] >> pbit);
return result;
}
void coil_deal_ON2OFF(void) void coil_deal_ON2OFF(void)
{ {
if( (get_coil_val(COIL_ADDR_ON_OFF) != menu_data.io_on2off)&&(get_coil_val(COIL_ADDR_ON_OFF) < 2) ) if( (get_coil_val(COIL_ADDR_ON_OFF) != menu_data.io_on2off)&&(get_coil_val(COIL_ADDR_ON_OFF) < 2) )
@ -281,7 +327,6 @@ int16_t rg_max = 0, rg_min = 0;
uint16_t phyunit_prv = 0; uint16_t phyunit_prv = 0;
uint8_t *p8low = 0, *p8up = 0; uint8_t *p8low = 0, *p8up = 0;
int16_t *p16low = 0, *p16up = 0; int16_t *p16low = 0, *p16up = 0;
int16_t neg_watch = 0;
void hold_deal_range_type(void) void hold_deal_range_type(void)
{ {
//发生变化时才执行以下操作 //发生变化时才执行以下操作
@ -323,8 +368,6 @@ void hold_deal_range_type(void)
rg_min = VOL[1].low; rg_min = VOL[1].low;
p16low = &tabdata.item0_page0_vlow[1]; p16low = &tabdata.item0_page0_vlow[1];
p16up = &tabdata.item0_page0_vup[1]; p16up = &tabdata.item0_page0_vup[1];
memcpy(&neg_watch, HoldReg + HOLD_ADDR_PHY_LOW, 2);
} }
break; break;
@ -386,10 +429,8 @@ void hold_deal_range_type(void)
memcpy(HoldReg + HOLD_ADDR_PHY_UP, &tabdata.item0_page1_TCup[p_temp], 2); memcpy(HoldReg + HOLD_ADDR_PHY_UP, &tabdata.item0_page1_TCup[p_temp], 2);
rg_max = TC[p_temp].up; rg_max = TC[p_temp].up;
rg_min = TC[p_temp].low; rg_min = TC[p_temp].low;
*p16low = tabdata.item0_page1_TClow[p_temp]; p16low = &tabdata.item0_page1_TClow[p_temp];
*p16up = tabdata.item0_page1_TCup[p_temp]; p16up = &tabdata.item0_page1_TCup[p_temp];
memcpy(&neg_watch, HoldReg + HOLD_ADDR_PHY_LOW, 2);
} }
break; break;
@ -399,10 +440,8 @@ void hold_deal_range_type(void)
memcpy(HoldReg + HOLD_ADDR_PHY_UP, &tabdata.item0_page2_RTDup, 2); memcpy(HoldReg + HOLD_ADDR_PHY_UP, &tabdata.item0_page2_RTDup, 2);
rg_max = RTD.up; rg_max = RTD.up;
rg_min = RTD.low; rg_min = RTD.low;
*p16low = tabdata.item0_page2_RTDlow; p16low = &tabdata.item0_page2_RTDlow;
*p16up = tabdata.item0_page2_RTDup; p16up = &tabdata.item0_page2_RTDup;
memcpy(&neg_watch, HoldReg + HOLD_ADDR_PHY_LOW, 2);
} }
break; break;
@ -413,6 +452,8 @@ void hold_deal_range_type(void)
HoldReg[HOLD_ADDR_PHY_UP] = 0; HoldReg[HOLD_ADDR_PHY_UP] = 0;
rg_max = 0; rg_max = 0;
rg_min = 0; rg_min = 0;
*p8low = 0;
*p8up = 0;
*p16low = 0; *p16low = 0;
*p16up = 0; *p16up = 0;
} }
@ -432,7 +473,7 @@ void hold_deal_range_max(void)
//*p8指向了需要修改的uint8*p16指向了需要修改的int16 //*p8指向了需要修改的uint8*p16指向了需要修改的int16
if( (HoldReg[HOLD_ADDR_PHY_UNIT] == 1)|(HoldReg[HOLD_ADDR_PHY_UNIT] == 5) ) if( (HoldReg[HOLD_ADDR_PHY_UNIT] == 1)|(HoldReg[HOLD_ADDR_PHY_UNIT] == 5) )
{ {
if( (*p8up == 0)|(*p8low == 0) ) return; if( (!p8up)|(!p8low) ) return;
uint8_t hold_temp8 = 0x00FF & HoldReg[HOLD_ADDR_PHY_UP]; uint8_t hold_temp8 = 0x00FF & HoldReg[HOLD_ADDR_PHY_UP];
@ -452,7 +493,7 @@ void hold_deal_range_max(void)
} }
else else
{ {
if( (*p16up == 0)|(*p16low == 0) ) return; if( (!p16up)|(!p16low) ) return;
int16_t hold_temp16 = 0; int16_t hold_temp16 = 0;
@ -483,7 +524,7 @@ void hold_deal_range_min(void)
if( (HoldReg[HOLD_ADDR_PHY_UNIT] == 1)|(HoldReg[HOLD_ADDR_PHY_UNIT] == 5) ) if( (HoldReg[HOLD_ADDR_PHY_UNIT] == 1)|(HoldReg[HOLD_ADDR_PHY_UNIT] == 5) )
{ {
if( (*p8up == 0)|(*p8low == 0) ) return; if( (!p8up)|(!p8low) ) return;
uint8_t hold_temp8 = 0x00FF & HoldReg[HOLD_ADDR_PHY_LOW]; uint8_t hold_temp8 = 0x00FF & HoldReg[HOLD_ADDR_PHY_LOW];
@ -503,7 +544,7 @@ void hold_deal_range_min(void)
} }
else else
{ {
if( (*p16up == 0)|(*p16low == 0) ) return; if( (!p16up)|(!p16low) ) return;
int16_t hold_temp16 = 0; int16_t hold_temp16 = 0;
@ -524,52 +565,84 @@ void hold_deal_range_min(void)
} }
} }
//保持寄存器,处理采样间隔修改事件
void hold_deal_sample_interval(void)
{
if( HoldReg[HOLD_ADDR_SAMPLE_INTERVAL] != tabdata.item1_page0_sample_interval )
{
if( (MENU_TASK_PERIOD <= HoldReg[HOLD_ADDR_SAMPLE_INTERVAL])&&(HoldReg[HOLD_ADDR_SAMPLE_INTERVAL] <= SAMPLE_INTERVAL_MAX) )
{
tabdata.item1_page0_sample_interval = HoldReg[HOLD_ADDR_SAMPLE_INTERVAL];
}
}
}
//保持寄存器,处理描点数量修改事件
void hold_deal_plot_counts(void)
{
if( HoldReg[HOLD_ADDR_PLOT_COUNTS] != (0x00FF & tabdata.item1_page0_plot_num) )
{
if( (PLOT_NUM_MIN <= HoldReg[HOLD_ADDR_PLOT_COUNTS])&&(HoldReg[HOLD_ADDR_PLOT_COUNTS] <= PLOT_NUM_MAX) )
{
tabdata.item1_page0_plot_num = HoldReg[HOLD_ADDR_PLOT_COUNTS];
if(menu_data.scr_now == SCREEN_MAIN)
{
scr_main_chart_update();
}
}
}
}
//保持寄存器,处理输入曲线&图例颜色修改事件
void hold_deal_color_input(void)
{
if( HoldReg[HOLD_ADDR_INPUT_COLOR] != (0x00FF & (uint8_t)tabdata.item1_page0_color_input) )
{
if( HoldReg[HOLD_ADDR_PLOT_COUNTS] <= 5 )
{
tabdata.item1_page0_color_input = (COLORS)HoldReg[HOLD_ADDR_PLOT_COUNTS];
if(menu_data.scr_now == SCREEN_MAIN)
{
scr_main_chart_update();
}
}
}
}
//保持寄存器,处理输出曲线&图例颜色修改事件
void hold_deal_color_output(void)
{
if( HoldReg[HOLD_ADDR_OUTPUT_COLOR] != (0x00FF & (uint8_t)tabdata.item1_page0_color_output) )
{
if( HoldReg[HOLD_ADDR_OUTPUT_COLOR] <= 5 )
{
tabdata.item1_page0_color_output = (COLORS)HoldReg[HOLD_ADDR_OUTPUT_COLOR];
if(menu_data.scr_now == SCREEN_MAIN)
{
scr_main_chart_update();
}
}
}
}
//保持寄存器,处理语言选择事件
void hold_deal_language_select(void)
{
if( HoldReg[HOLD_ADDR_LANGUAGE] != (0x00FF & (uint8_t)tabdata.item3_page0_language) )
{
if( HoldReg[HOLD_ADDR_LANGUAGE] <= 1 )
{
tabdata.item3_page0_language = (LANGUAGES)HoldReg[HOLD_ADDR_LANGUAGE];
setting_laguage_switch(tabdata.item3_page0_language);
}
}
}
//输入寄存器,上位机只读 //输入寄存器,上位机只读
void modbus_reg_update_input(void) void modbus_reg_update_input(void)
{} {}
void set_coil_val(uint8_t addr, uint8_t bit_val)
{
if( (addr > COIL_ADD_MAX)||(bit_val > 1) ) return;
addr -= COIL_ADD_MIN;
if( addr > 200 ) return;
uint8_t pcoil = addr / 8; //数组的第几个元素, 0-7
uint8_t pbit = addr % 8; //元素的第几位, 0-7
uint8_t fac = 0; //辅助计算的因子
switch (bit_val)
{
case 0:
{
fac = ~(1 << pbit);
CoilState[pcoil] &= fac;
}
break;
case 1:
{
fac = 1 << pbit;
CoilState[pcoil] |= fac;
}
break;
default:
break;
}
}
uint8_t get_coil_val(uint8_t addr)
{
if( addr > COIL_ADD_MAX ) return 99;
addr -= COIL_ADD_MIN;
if( addr > 200 ) return 99;
uint8_t result = 0;
uint8_t pcoil = addr / 8; //数组的第几个元素, 0-7
uint8_t pbit = addr % 8; //元素的第几位, 0-7
result = 0x01 & (CoilState[pcoil] >> pbit);
return result;
}

View File

@ -263,12 +263,12 @@
<Ww> <Ww>
<count>21</count> <count>21</count>
<WinNumber>1</WinNumber> <WinNumber>1</WinNumber>
<ItemText>neg_watch,0x0A</ItemText> <ItemText>p8up,0x0A</ItemText>
</Ww> </Ww>
<Ww> <Ww>
<count>22</count> <count>22</count>
<WinNumber>1</WinNumber> <WinNumber>1</WinNumber>
<ItemText>tim8_test_cnt,0x0A</ItemText> <ItemText>p8low,0x0A</ItemText>
</Ww> </Ww>
</WatchWindow1> </WatchWindow1>
<WatchWindow2> <WatchWindow2>

File diff suppressed because it is too large Load Diff