更新:
1、多信号输入输出的驱动逻辑调整; 2、寄存器配置相关函数封装; 3、当前进度:保持寄存器设置工作模式与设定值完成;
This commit is contained in:
parent
2781b76a7a
commit
71996c93db
|
@ -40,7 +40,8 @@
|
|||
"app_screen_setting_trans.h": "c",
|
||||
"key_functions_main.h": "c",
|
||||
"eeprom_spi.h": "c",
|
||||
"math.h": "c"
|
||||
"math.h": "c",
|
||||
"modbus_register_process.h": "c"
|
||||
},
|
||||
"C_Cpp.errorSquiggles": "disabled",
|
||||
"idf.pythonInstallPath": "F:\\Espressif\\tools\\idf-python\\3.11.2\\python.exe",
|
||||
|
|
|
@ -78,6 +78,7 @@ extern const lv_img_dsc_t * screen_main_ani_out_sign_imgs[3];
|
|||
#include "modbus_rtu.h"
|
||||
#include "modbus_rtu_master.h"
|
||||
#include "scr_setting_progam_out.h"
|
||||
#include "modbus_register_process.h"
|
||||
|
||||
extern PHYSICAL_QUANTITY VOL[2]; //电压,VOL[0]-V, VOL[1]-mV
|
||||
extern PHYSICAL_QUANTITY CUR; //电流,mA
|
||||
|
|
|
@ -18,8 +18,8 @@ typedef enum
|
|||
typedef enum
|
||||
{
|
||||
CURRENT_MA = 0, //电流mA
|
||||
VOLTAGE_MV, //电压mV
|
||||
VOLTAGE_V, //电压V
|
||||
VOLTAGE_MV, //电压mV
|
||||
RESISTANT_OHM, //电阻Ω
|
||||
FREQUENCE_KHZ, //频率KHz
|
||||
TC_K, //热电偶K
|
||||
|
|
|
@ -1095,7 +1095,6 @@ void set_working_mode(SIG_FUNCTIONS mode, SIG_FUNCTIONS_TYPE type)
|
|||
menu_data.io_on2off = IO_OFF;
|
||||
io_on2off_status(); //更新ON/OFF/IN/OUT状态指示
|
||||
|
||||
|
||||
//数码管输入显示置零
|
||||
set_nixie_cube(IO_INPUT, 99, 0);
|
||||
|
||||
|
@ -1110,6 +1109,8 @@ void set_working_mode(SIG_FUNCTIONS mode, SIG_FUNCTIONS_TYPE type)
|
|||
menu_data.io_cursor_prv = 3;
|
||||
set_cursor_position();
|
||||
|
||||
HoldReg[HOLD_ADDR_SET_WORK_MODE] = (uint8_t)type + 1 + 14 * menu_data.io_mode;
|
||||
|
||||
switch (mode)
|
||||
{
|
||||
//电流
|
||||
|
@ -1172,14 +1173,6 @@ void set_working_mode(SIG_FUNCTIONS mode, SIG_FUNCTIONS_TYPE type)
|
|||
|
||||
switch (type)
|
||||
{
|
||||
case VOLTAGE_MV:
|
||||
{
|
||||
lv_label_set_text(guider_ui.screen_main_label_unit, "mV");
|
||||
|
||||
up2down_update(tabdata.item0_page0_vlow[1], tabdata.item0_page0_vup[1]);
|
||||
}
|
||||
break;
|
||||
|
||||
case VOLTAGE_V:
|
||||
{
|
||||
lv_label_set_text(guider_ui.screen_main_label_unit, "V");
|
||||
|
@ -1188,6 +1181,14 @@ void set_working_mode(SIG_FUNCTIONS mode, SIG_FUNCTIONS_TYPE type)
|
|||
}
|
||||
break;
|
||||
|
||||
case VOLTAGE_MV:
|
||||
{
|
||||
lv_label_set_text(guider_ui.screen_main_label_unit, "mV");
|
||||
|
||||
up2down_update(tabdata.item0_page0_vlow[1], tabdata.item0_page0_vup[1]);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -208,18 +208,18 @@ void sig_channel_select(uint8_t io, SIG_FUNCTIONS_TYPE type)
|
|||
}
|
||||
break;
|
||||
|
||||
case VOLTAGE_MV:
|
||||
{
|
||||
mux_signal.channel = CH7_IN_MVOL;
|
||||
}
|
||||
break;
|
||||
|
||||
case VOLTAGE_V:
|
||||
{
|
||||
mux_signal.channel = CH6_IN_VOL;
|
||||
}
|
||||
break;
|
||||
|
||||
case VOLTAGE_MV:
|
||||
{
|
||||
mux_signal.channel = CH7_IN_MVOL;
|
||||
}
|
||||
break;
|
||||
|
||||
case RESISTANT_OHM:
|
||||
{
|
||||
//与热电阻一致
|
||||
|
@ -303,18 +303,18 @@ void sig_channel_select(uint8_t io, SIG_FUNCTIONS_TYPE type)
|
|||
}
|
||||
break;
|
||||
|
||||
case VOLTAGE_MV:
|
||||
{
|
||||
mux_signal.channel = CH1_OUT_VOL_MV;
|
||||
}
|
||||
break;
|
||||
|
||||
case VOLTAGE_V:
|
||||
{
|
||||
mux_signal.channel = CH0_OUT_VOL_V;
|
||||
}
|
||||
break;
|
||||
|
||||
case VOLTAGE_MV:
|
||||
{
|
||||
mux_signal.channel = CH1_OUT_VOL_MV;
|
||||
}
|
||||
break;
|
||||
|
||||
case RESISTANT_OHM:
|
||||
{
|
||||
mux_signal.channel = CH4_OUT_RES;
|
||||
|
@ -393,7 +393,6 @@ void sig_channel_select(uint8_t io, SIG_FUNCTIONS_TYPE type)
|
|||
}
|
||||
|
||||
//更新设定值(根据ON\OFF状态)
|
||||
|
||||
void sig_sv_update(void)
|
||||
{
|
||||
if(progout_data.process == PROGOUT_WAITING)
|
||||
|
@ -426,6 +425,10 @@ void sig_sv_update(void)
|
|||
set_output( mux2real(mux_signal.data_sv) );
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t mcpy_temp = (uint32_t)mux2real(mux_signal.data_sv);
|
||||
HoldReg[HOLD_ADDR_MUX_SV_H] = mcpy_temp >> 16;
|
||||
HoldReg[HOLD_ADDR_MUX_SV_L] = mcpy_temp & 0x0000FFFF;
|
||||
}
|
||||
|
||||
//数据转换,将输入热电偶电压值转换为实际温度值℃
|
||||
|
|
|
@ -318,9 +318,9 @@ void key_functions_main(void)
|
|||
|
||||
case SIG_VOLTAGE:
|
||||
{
|
||||
cursor_temp = (uint8_t)menu_data.output_mode_type;
|
||||
cursor_temp = (uint8_t)menu_data.input_mode_type;
|
||||
cursor_temp = (cursor_temp == 1)?(2):(1);
|
||||
menu_data.output_mode_type = (SIG_FUNCTIONS_TYPE)cursor_temp;
|
||||
menu_data.input_mode_type = (SIG_FUNCTIONS_TYPE)cursor_temp;
|
||||
|
||||
set_working_mode(menu_data.input_mode, menu_data.input_mode_type);
|
||||
}
|
||||
|
|
|
@ -3,35 +3,6 @@
|
|||
|
||||
#include "apps_gather.h"
|
||||
|
||||
//自定义线圈寄存器地址
|
||||
#define COIL_ADDR_ON_OFF 0x00
|
||||
#define COIL_ADDR_LIGHT 0x01
|
||||
#define COIL_ADDR_CONFIG_SAVE 0x02
|
||||
#define COIL_ADDR_CONFIG_RESET 0x03
|
||||
#define COIL_ADDR_SCREEN_SWITCH 0x04
|
||||
|
||||
//自定义离散状态寄存器地址
|
||||
|
||||
//自定义保持寄存器地址
|
||||
#define HOLD_ADDR_SET_WORK_MODE 0x00
|
||||
#define HOLD_ADDR_MUX_PV_L 0x01
|
||||
#define HOLD_ADDR_MUX_PV_H 0x02
|
||||
#define HOLD_ADDR_PHY_UNIT 0x03
|
||||
#define HOLD_ADDR_PHY_UP 0x04
|
||||
#define HOLD_ADDR_PHY_LOW 0x05
|
||||
#define HOLD_ADDR_SAMPLE_INTERVAL 0x06
|
||||
#define HOLD_ADDR_PLOT_COUNTS 0x07
|
||||
#define HOLD_ADDR_INPUT_COLOR 0x08
|
||||
#define HOLD_ADDR_OUTPUT_COLOR 0x09
|
||||
#define HOLD_ADDR_LANGUAGE 0x0A
|
||||
|
||||
//自定义输入寄存器地址
|
||||
#define INPUT_ADDR_BATTERY 0x00
|
||||
#define INPUT_ADDR_RUNTIME_SECOND 0x01
|
||||
#define INPUT_ADDR_RUNTIME_HOUR 0x02
|
||||
#define INPUT_ADDR_MUX_SV_L 0x03
|
||||
#define INPUT_ADDR_MUX_SV_H 0x04
|
||||
|
||||
typedef enum
|
||||
{
|
||||
TRANSPARENT_WAIT = 0,
|
||||
|
@ -72,25 +43,5 @@ void trans_start_capture(void);
|
|||
|
||||
uint8_t trans_enable_check(st_scom *scom);
|
||||
|
||||
//处理modbus寄存器值的更新与写入
|
||||
void modbus_registers_update(void);
|
||||
|
||||
//线圈寄存器,读写
|
||||
void modbus_reg_update_coil(void);
|
||||
|
||||
//离散输入寄存器,上位机只读
|
||||
void modbus_reg_update_dis(void);
|
||||
|
||||
//保持寄存器,读写
|
||||
void modbus_reg_update_hold(void);
|
||||
|
||||
//输入寄存器,上位机只读
|
||||
void modbus_reg_update_input(void);
|
||||
|
||||
//设置线圈寄存器,输入参数:地址、标志位
|
||||
void set_coil_val(uint8_t addr, uint8_t bit_val);
|
||||
|
||||
//获取线圈值,应对上位机修改线圈的情况
|
||||
uint8_t get_coil_val(uint8_t addr);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -0,0 +1,72 @@
|
|||
#ifndef _MODBUS_REGISTER_PROCESS_H_
|
||||
#define _MODBUS_REGISTER_PROCESS_H_
|
||||
|
||||
#include "apps_gather.h"
|
||||
|
||||
//自定义线圈寄存器地址
|
||||
#define COIL_ADDR_ON_OFF 0x00
|
||||
#define COIL_ADDR_LIGHT 0x01
|
||||
#define COIL_ADDR_CONFIG_SAVE 0x02
|
||||
#define COIL_ADDR_CONFIG_RESET 0x03
|
||||
#define COIL_ADDR_SCREEN_SWITCH 0x04
|
||||
|
||||
//自定义离散状态寄存器地址
|
||||
|
||||
//自定义保持寄存器地址
|
||||
#define HOLD_ADDR_SET_WORK_MODE 0x00
|
||||
#define HOLD_ADDR_MUX_SV_L 0x01
|
||||
#define HOLD_ADDR_MUX_SV_H 0x02
|
||||
#define HOLD_ADDR_PHY_UNIT 0x03
|
||||
#define HOLD_ADDR_PHY_UP 0x04
|
||||
#define HOLD_ADDR_PHY_LOW 0x05
|
||||
#define HOLD_ADDR_SAMPLE_INTERVAL 0x06
|
||||
#define HOLD_ADDR_PLOT_COUNTS 0x07
|
||||
#define HOLD_ADDR_INPUT_COLOR 0x08
|
||||
#define HOLD_ADDR_OUTPUT_COLOR 0x09
|
||||
#define HOLD_ADDR_LANGUAGE 0x0A
|
||||
|
||||
//自定义输入寄存器地址
|
||||
#define INPUT_ADDR_BATTERY 0x00
|
||||
#define INPUT_ADDR_RUNTIME_SECOND 0x01
|
||||
#define INPUT_ADDR_RUNTIME_HOUR 0x02
|
||||
#define INPUT_ADDR_MUX_PV_L 0x03
|
||||
#define INPUT_ADDR_MUX_PV_H 0x04
|
||||
|
||||
//处理modbus寄存器值的更新与写入
|
||||
void modbus_registers_update(void);
|
||||
|
||||
//线圈寄存器,读写
|
||||
void modbus_reg_update_coil(void);
|
||||
|
||||
void coil_deal_ON2OFF(void);
|
||||
|
||||
void coil_deal_light(void);
|
||||
|
||||
void coil_deal_save(void);
|
||||
|
||||
void coil_deal_reset(void);
|
||||
|
||||
void coil_deal_screen_switch(void);
|
||||
|
||||
//离散输入寄存器,上位机只读
|
||||
void modbus_reg_update_dis(void);
|
||||
|
||||
//保持寄存器,读写
|
||||
void modbus_reg_update_hold(void);
|
||||
|
||||
void hold_deal_set_work_mode(void);
|
||||
|
||||
void hold_deal_muxsv(void);
|
||||
|
||||
//输入寄存器,上位机只读
|
||||
void modbus_reg_update_input(void);
|
||||
|
||||
//设置线圈寄存器,输入参数:地址、标志位
|
||||
void set_coil_val(uint8_t addr, uint8_t bit_val);
|
||||
|
||||
//获取线圈值,应对上位机修改线圈的情况
|
||||
uint8_t get_coil_val(uint8_t addr);
|
||||
|
||||
#endif
|
||||
|
||||
|
|
@ -393,207 +393,4 @@ uint8_t trans_enable_check(st_scom *scom)
|
|||
return result;
|
||||
}
|
||||
|
||||
//处理modbus寄存器值的更新与写入
|
||||
void modbus_registers_update(void)
|
||||
{
|
||||
//线圈寄存器
|
||||
modbus_reg_update_coil();
|
||||
|
||||
//离散状态寄存器
|
||||
modbus_reg_update_dis();
|
||||
|
||||
//保持寄存器
|
||||
modbus_reg_update_hold();
|
||||
|
||||
//输入寄存器
|
||||
modbus_reg_update_input();
|
||||
}
|
||||
|
||||
//线圈寄存器,读写
|
||||
void modbus_reg_update_coil(void)
|
||||
{
|
||||
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 )
|
||||
{
|
||||
//只有在主界面时,修改内容才生效
|
||||
menu_data.io_on2off = get_coil_val(COIL_ADDR_ON_OFF);
|
||||
io_on2off_status();
|
||||
}
|
||||
else
|
||||
{
|
||||
//拒绝修改内容
|
||||
set_coil_val(COIL_ADDR_ON_OFF, menu_data.io_on2off);
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
else
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//离散输入寄存器,上位机只读
|
||||
void modbus_reg_update_dis(void)
|
||||
{}
|
||||
|
||||
//保持寄存器,读写
|
||||
uint16_t work_mode_pv = 0;
|
||||
void modbus_reg_update_hold(void)
|
||||
{
|
||||
work_mode_pv = 1 + (uint16_t)menu_data.input_mode_type + (menu_data.io_mode == IO_OUTPUT) * 15;
|
||||
if( HoldReg[HOLD_ADDR_SET_WORK_MODE] != work_mode_pv )
|
||||
{
|
||||
if(menu_data.scr_now == SCREEN_MAIN)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//输入寄存器,上位机只读
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -0,0 +1,310 @@
|
|||
#include "modbus_register_process.h"
|
||||
|
||||
//处理modbus寄存器值的更新与写入
|
||||
void modbus_registers_update(void)
|
||||
{
|
||||
//线圈寄存器
|
||||
modbus_reg_update_coil();
|
||||
|
||||
//离散状态寄存器
|
||||
modbus_reg_update_dis();
|
||||
|
||||
//保持寄存器
|
||||
modbus_reg_update_hold();
|
||||
|
||||
//输入寄存器
|
||||
modbus_reg_update_input();
|
||||
}
|
||||
|
||||
//线圈寄存器,读写
|
||||
void modbus_reg_update_coil(void)
|
||||
{
|
||||
//主界面的ON&OFF控制
|
||||
coil_deal_ON2OFF();
|
||||
|
||||
//照明控制
|
||||
coil_deal_light();
|
||||
|
||||
//配置保存
|
||||
coil_deal_save();
|
||||
|
||||
//配置复位
|
||||
coil_deal_reset();
|
||||
|
||||
//屏幕切换:主界面<->设置界面
|
||||
coil_deal_screen_switch();
|
||||
}
|
||||
|
||||
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( menu_data.scr_now == SCREEN_MAIN )
|
||||
{
|
||||
//只有在主界面时,修改内容才生效
|
||||
menu_data.io_on2off = get_coil_val(COIL_ADDR_ON_OFF);
|
||||
io_on2off_status();
|
||||
}
|
||||
else
|
||||
{
|
||||
//拒绝修改内容
|
||||
set_coil_val(COIL_ADDR_ON_OFF, menu_data.io_on2off);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void coil_deal_light(void)
|
||||
{
|
||||
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;
|
||||
}
|
||||
else
|
||||
{
|
||||
LIGHT_OFF;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void coil_deal_save(void)
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void coil_deal_reset(void)
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void coil_deal_screen_switch(void)
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//离散输入寄存器,上位机只读
|
||||
void modbus_reg_update_dis(void)
|
||||
{}
|
||||
|
||||
//保持寄存器,读写
|
||||
void modbus_reg_update_hold(void)
|
||||
{
|
||||
hold_deal_set_work_mode();
|
||||
}
|
||||
|
||||
void hold_deal_set_work_mode(void)
|
||||
{
|
||||
uint16_t work_mode_pv = (menu_data.io_mode == IO_INPUT)*( (uint16_t)menu_data.input_mode_type + 1 ) + \
|
||||
(menu_data.io_mode == IO_OUTPUT)*( (uint16_t)menu_data.output_mode_type + 15 );
|
||||
|
||||
if( (HoldReg[HOLD_ADDR_SET_WORK_MODE] != work_mode_pv)&&(0 < HoldReg[HOLD_ADDR_SET_WORK_MODE])&&(HoldReg[HOLD_ADDR_SET_WORK_MODE] <= 28) )
|
||||
{
|
||||
if(menu_data.scr_now == SCREEN_MAIN)
|
||||
{
|
||||
SIG_FUNCTIONS iom;
|
||||
SIG_FUNCTIONS_TYPE iomt;
|
||||
|
||||
iomt = (SIG_FUNCTIONS_TYPE)( HoldReg[HOLD_ADDR_SET_WORK_MODE] - 1 - 14 * (HoldReg[HOLD_ADDR_SET_WORK_MODE] > 14) );
|
||||
switch (iomt)
|
||||
{
|
||||
case 0:
|
||||
iom = SIG_CURRENT;
|
||||
break;
|
||||
|
||||
case 1:
|
||||
{}
|
||||
//break;
|
||||
|
||||
case 2:
|
||||
iom = SIG_VOLTAGE;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
iom = SIG_RESISTANT;
|
||||
break;
|
||||
|
||||
case 4:
|
||||
iom = SIG_FREQUENCE;
|
||||
break;
|
||||
|
||||
case 13:
|
||||
iom = SIG_RTD;
|
||||
break;
|
||||
|
||||
default:
|
||||
iom = SIG_TC;
|
||||
break;
|
||||
}
|
||||
|
||||
if(HoldReg[HOLD_ADDR_SET_WORK_MODE] > 14)
|
||||
{
|
||||
menu_data.io_mode = IO_OUTPUT;
|
||||
menu_data.output_mode = iom;
|
||||
menu_data.output_mode_type = iomt;
|
||||
}
|
||||
else
|
||||
{
|
||||
menu_data.io_mode = IO_INPUT;
|
||||
menu_data.input_mode = iom;
|
||||
menu_data.input_mode_type = iomt;
|
||||
}
|
||||
set_working_mode(iom, iomt);
|
||||
}
|
||||
else
|
||||
{
|
||||
//拒绝修改
|
||||
HoldReg[HOLD_ADDR_SET_WORK_MODE] = work_mode_pv;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void hold_deal_muxsv(void)
|
||||
{
|
||||
float32 real_hold = (HoldReg[HOLD_ADDR_MUX_SV_H] << 16) + HoldReg[HOLD_ADDR_MUX_SV_L];
|
||||
if( real2mux(real_hold) != mux_signal.data_sv )
|
||||
{
|
||||
if( menu_data.scr_now == SCREEN_MAIN )
|
||||
{
|
||||
mux_signal.data_sv = real2mux(real_hold);
|
||||
}
|
||||
else
|
||||
{
|
||||
//拒绝修改
|
||||
uint32_t mcpy_temp = (uint32_t)mux2real(mux_signal.data_sv);
|
||||
HoldReg[HOLD_ADDR_MUX_SV_H] = mcpy_temp >> 16;
|
||||
HoldReg[HOLD_ADDR_MUX_SV_L] = mcpy_temp & 0x0000FFFF;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//输入寄存器,上位机只读
|
||||
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;
|
||||
}
|
|
@ -129,19 +129,22 @@ uint8_t mux_set_flag = 0;
|
|||
void mux_signal_switch(st_mux_signal *mux_signal)
|
||||
{
|
||||
//只有频道和设定值改变时才执行设定操作(不影响回采和输入采集)
|
||||
if( (mux_signal->channel != ch_prv)||(mux_signal->data_sv != sv_prv) )
|
||||
{
|
||||
ch_prv = mux_signal->channel;
|
||||
sv_prv = mux_signal->data_sv;
|
||||
mux_set_flag = 1;
|
||||
}
|
||||
else
|
||||
if( (mux_signal->channel == ch_prv)&&(mux_signal->data_sv == sv_prv) )
|
||||
{
|
||||
mux_set_flag = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
mux_set_flag = 1;
|
||||
if((mux_signal->channel != ch_prv))
|
||||
{
|
||||
//通道改变时切换通道
|
||||
HC138_SEL_CH(mux_signal->channel);
|
||||
ch_prv = mux_signal->channel;
|
||||
}
|
||||
|
||||
//切换通道
|
||||
HC138_SEL_CH(mux_signal->channel);
|
||||
if(mux_signal->data_sv != sv_prv) sv_prv = mux_signal->data_sv;
|
||||
}
|
||||
|
||||
//执行通道对应的功能
|
||||
switch (mux_signal->channel)
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -765,6 +765,11 @@
|
|||
<FileType>1</FileType>
|
||||
<FilePath>..\App\MODBUS\Src\modbus_rtu_master.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>modbus_register_process.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\App\MODBUS\Src\modbus_register_process.c</FilePath>
|
||||
</File>
|
||||
</Files>
|
||||
</Group>
|
||||
<Group>
|
||||
|
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue