更新:

1、线圈寄存器的开关量配置完成;
2、本地按键操作时寄存器值能够正常跟随;
3、上位机发送指令时可以实现对应功能;
This commit is contained in:
吴俊潮 2025-06-11 10:13:22 +08:00
parent 8c6c7c3618
commit d2f454235e
8 changed files with 18316 additions and 18188 deletions

View File

@ -135,6 +135,7 @@ void scr_init_run(void)
{
menu_data.scr_init_flag = 1; //开机动画结束,只执行一次
menu_data.scr_now = SCREEN_MAIN; //开机动画结束后,默认进入主界面
set_coil_val(COIL_ADDR_SCREEN_SWITCH, 0);
init_step = 0;
}

View File

@ -643,7 +643,10 @@ void deal_data_save(void)
//出现过错误,未保存
tabdata.item3_page0_saveflag = 0;
}
set_item3_text(DATA_SAVE);
setting_items_check(ITEM_NONE, tabdata.item_cursor);
tabdata.item_cursor = ITEM_3;
setting_items_check(tabdata.item_cursor, ITEM_NONE);
//使能所有按键
key_config(KEY_ALL, KEY_STATUS_ENABLE);
@ -690,17 +693,17 @@ void deal_data_reset(void)
if(reset_cnt > 5)
{
reset_cnt = 0;
tabdata.item3_page0_resetflag = 2;
tabdata.item3_page0_resetflag = 2; //已复位
tabdata.item3_page0_saveflag = 0; //保存状态更改为“未保存”
//更新本页文本
//保存状态更改为“已保存”
tabdata.item3_page0_saveflag = 0;
set_item3_text(DATA_SAVE);
//选项卡与标题
//复位后语言可能发生改变,因此刷新选项卡与标题
setting_laguage_switch(tabdata.item3_page0_language);
title_item_refresh();
setting_items_page(ITEM_3, 1);
//通过modbus触发时需要刷新一下选项卡的内容
setting_items_check(ITEM_NONE, tabdata.item_cursor);
tabdata.item_cursor = ITEM_3;
setting_items_check(tabdata.item_cursor, ITEM_NONE);
//使能所有按键
key_config(KEY_ALL, KEY_STATUS_ENABLE);

View File

@ -99,14 +99,15 @@ void key_functions_main(void)
key_char2struct();
//加载菜单界面
lv_scr_load(guider_ui.screen_setting);
scr_setting_recover();
lv_scr_load(guider_ui.screen_setting);
lv_obj_clear_flag(guider_ui.screen_setting, LV_OBJ_FLAG_HIDDEN);
//隐藏主界面对象
lv_obj_add_flag(guider_ui.screen_main, LV_OBJ_FLAG_HIDDEN);
menu_data.scr_now = SCREEN_SETTING; //当前界面为详细设置菜单
set_coil_val(COIL_ADDR_SCREEN_SWITCH, 1);
}
break;

View File

@ -703,6 +703,7 @@ void key_functions_modbus(void)
lv_obj_del_async(guider_ui.screen_modbus_config);
menu_data.scr_now = SCREEN_SETTING;
set_coil_val(COIL_ADDR_SCREEN_SWITCH, 1);
//进入拓展功能选项卡
tabdata.item_cursor = ITEM_2;

View File

@ -38,10 +38,7 @@ void key_functions_setting(void)
lv_obj_add_flag(guider_ui.screen_setting, LV_OBJ_FLAG_HIDDEN);
menu_data.scr_now = SCREEN_MAIN;
//当前操作从“选项卡选择” 返回 至“主要功能”,按键配置同步更新
current_operation = MAIN_FUNCTION;
key_config_update(current_operation);
set_coil_val(COIL_ADDR_SCREEN_SWITCH, 0);
}
break;

View File

@ -8,6 +8,7 @@
#define COIL_ADDR_LIGHT 0x01
#define COIL_ADDR_CONFIG_SAVE 0x02
#define COIL_ADDR_CONFIG_RESET 0x03
#define COIL_ADDR_SCREEN_SWITCH 0x04
//自定义离散状态寄存器地址

View File

@ -412,10 +412,9 @@ void modbus_registers_update(void)
//线圈寄存器,读写
void modbus_reg_update_coil(void)
{
if( get_coil_val(COIL_ADDR_ON_OFF) != menu_data.io_on2off )
if( (get_coil_val(COIL_ADDR_ON_OFF) != menu_data.io_on2off)&&(get_coil_val(COIL_ADDR_ON_OFF) < 2) )
{
//进入此处说明线圈寄存器的值被上位机修改
if( menu_data.scr_now == SCREEN_MAIN )
{
//只有在主界面时,修改内容才生效
@ -429,12 +428,10 @@ void modbus_reg_update_coil(void)
}
}
if( get_coil_val(COIL_ADDR_LIGHT) != tabdata.item3_page0_lightflag )
if( (get_coil_val(COIL_ADDR_LIGHT) != tabdata.item3_page0_lightflag)&&(get_coil_val(COIL_ADDR_LIGHT) < 2) )
{
//进入此处说明线圈寄存器的值被上位机修改
tabdata.item3_page0_lightflag = get_coil_val(COIL_ADDR_LIGHT);
if(tabdata.item3_page0_lightflag)
{
LIGHT_ON;
@ -444,6 +441,91 @@ void modbus_reg_update_coil(void)
LIGHT_OFF;
}
}
if( (get_coil_val(COIL_ADDR_CONFIG_SAVE) == 1)&&(tabdata.item3_page0_saveflag == 0) )
{
if( (menu_data.scr_now == SCREEN_SETTING)&&(tabdata.item3_page0_resetflag != 1) )
{
//当前处于设置界面,并且未处于重置过程中,执行保存
tabdata.item3_page0_saveflag = 1;
}
else
{
//拒绝修改
set_coil_val(COIL_ADDR_CONFIG_SAVE, 0);
}
}
if( (get_coil_val(COIL_ADDR_CONFIG_RESET) == 1)&&(tabdata.item3_page0_resetflag == 0) )
{
if( (menu_data.scr_now == SCREEN_SETTING)&&(tabdata.item3_page0_saveflag != 1) )
{
//当前处于设置界面,并且未处于保存过程中,执行复位
tabdata.item3_page0_resetflag = 1;
}
else
{
//拒绝修改
set_coil_val(COIL_ADDR_CONFIG_RESET, 0);
}
}
if( get_coil_val(COIL_ADDR_SCREEN_SWITCH) != ( (uint8_t)menu_data.scr_now - 1 ) )
{
switch (menu_data.scr_now)
{
case SCREEN_INIT:
{
//拒绝修改,开机动画视作主界面
set_coil_val(COIL_ADDR_SCREEN_SWITCH, 0);
}
break;
case SCREEN_MAIN:
{
//切换至设置界面;
scr_setting_recover();
lv_scr_load(guider_ui.screen_setting);
lv_obj_clear_flag(guider_ui.screen_setting, LV_OBJ_FLAG_HIDDEN);
//隐藏主界面对象
lv_obj_add_flag(guider_ui.screen_main, LV_OBJ_FLAG_HIDDEN);
menu_data.scr_now = SCREEN_SETTING; //当前界面为详细设置菜单
set_coil_val(COIL_ADDR_SCREEN_SWITCH, 1);
}
break;
case SCREEN_SETTING:
{
//切换至主界面;
//加载主界面
if(!scr_main_set_flag)
{
scr_main_set_flag = 1;
setup_scr_screen_main(&guider_ui);
delay_cnt(200); //不加延时有概率卡死
}
scr_main_recover();
lv_scr_load(guider_ui.screen_main);
lv_obj_clear_flag(guider_ui.screen_main, LV_OBJ_FLAG_HIDDEN);
//隐藏设置界面对象
lv_obj_add_flag(guider_ui.screen_setting, LV_OBJ_FLAG_HIDDEN);
menu_data.scr_now = SCREEN_MAIN;
set_coil_val(COIL_ADDR_SCREEN_SWITCH, 0);
}
break;
default:
{
//拒绝修改,其他界面视作设置界面
set_coil_val(COIL_ADDR_SCREEN_SWITCH, 1);
}
break;
}
}
}
//离散输入寄存器,上位机只读
@ -460,9 +542,10 @@ void modbus_reg_update_input(void)
void set_coil_val(uint8_t addr, uint8_t bit_val)
{
if( (addr < COIL_ADD_MIN)||(addr > COIL_ADD_MAX)||(bit_val > 1) ) return;
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; //辅助计算的因子
@ -490,10 +573,11 @@ void set_coil_val(uint8_t addr, uint8_t bit_val)
uint8_t get_coil_val(uint8_t addr)
{
uint8_t result = 0;
if( (addr < COIL_ADD_MIN)||(addr > COIL_ADD_MAX) ) return;
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

File diff suppressed because it is too large Load Diff