311 lines
8.1 KiB
C
311 lines
8.1 KiB
C
#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;
|
|
}
|