更新:

1、寄存器配置地址封装为宏定义;
2、额外编写的操作线圈寄存器数值的函数;
3、本地交互与上位机交互应当分开,目前进度:线圈寄存器上位机交互,主界面开关和照明控制完成;
This commit is contained in:
吴俊潮 2025-06-09 16:52:10 +08:00
parent 6a6cd5eee2
commit 8c6c7c3618
12 changed files with 18568 additions and 18352 deletions

View File

@ -92,12 +92,13 @@ extern SIG_TRANSMISSION sig_trans; //通讯模式
//绝对值计算
#define MY_ABS(pa) ( ( (pa) >= 0 )?( (pa) ):( 0 - (pa) ) )
#define MUX_TASK_PERIOD 50 //多通道输入输出任务周期
#define LVGL_TASK_PERIOD 5 //LVGL任务周期
#define MENU_TASK_PERIOD 300 //显示内容设置周期
#define BLE_TASK_PERIOD 10 //蓝牙任务周期
#define HART_TASK_PERIOD 10 //HART任务周期
#define RS485_TASK_PERIOD 10 //485任务周期
#define MUX_TASK_PERIOD 50 //多通道输入输出任务周期
#define BLE_TASK_PERIOD 100 //蓝牙任务周期
#define HART_TASK_PERIOD 100 //HART任务周期
#define RS485_TASK_PERIOD MUX_TASK_PERIOD //485任务周期
//屏幕显示
void screen_run(void);

View File

@ -253,8 +253,8 @@ typedef struct
//ITEMS_0
SIG_FUNCTIONS_TYPE item0_page0_vunit; //电压单位
int16_t item0_page0_vup[2]; //电压上限
int16_t item0_page0_vlow[2]; //电压下限
int16_t item0_page0_vup[2]; //电压上限, 0:V1:mV
int16_t item0_page0_vlow[2]; //电压下限, 0:V1:mV
uint8_t item0_page0_cup; //电流上限
uint8_t item0_page0_clow; //电流下限
int16_t item0_page0_rup; //电阻上限

View File

@ -846,6 +846,10 @@ void io_on2off_status(void)
{
lv_label_set_text(guider_ui.screen_main_label_ONOFF, "ON");
//D0位置1
//CoilState[0] |= 0x01;
set_coil_val(COIL_ADDR_ON_OFF, 1);
switch (menu_data.io_mode)
{
case IO_OUTPUT:
@ -874,6 +878,10 @@ void io_on2off_status(void)
{
lv_label_set_text(guider_ui.screen_main_label_ONOFF, "OFF");
//D0位置0
//CoilState[0] &= 0xFE;
set_coil_val(COIL_ADDR_ON_OFF, 0);
switch (menu_data.io_mode)
{
case IO_OUTPUT:
@ -1103,6 +1111,43 @@ void set_working_mode(SIG_FUNCTIONS mode, SIG_FUNCTIONS_TYPE type)
switch (mode)
{
//电流
case SIG_CURRENT:
{
switch (tabdata.item3_page0_language)
{
case MENU_SIMPLYFY_CHINESE:
{
lv_label_set_text(guider_ui.screen_main_label_Mode, "电流");
}
break;
case MENU_ENGLISH:
{
lv_label_set_text(guider_ui.screen_main_label_Mode, "Cur");
}
break;
default:
break;
}
switch (type)
{
case CURRENT_MA:
{
lv_label_set_text(guider_ui.screen_main_label_unit, "mA");
up2down_update(tabdata.item0_page0_clow, tabdata.item0_page0_cup);
}
break;
default:
break;
}
}
break;
//电压
case SIG_VOLTAGE:
{
@ -1149,43 +1194,6 @@ void set_working_mode(SIG_FUNCTIONS mode, SIG_FUNCTIONS_TYPE type)
}
break;
//电流
case SIG_CURRENT:
{
switch (tabdata.item3_page0_language)
{
case MENU_SIMPLYFY_CHINESE:
{
lv_label_set_text(guider_ui.screen_main_label_Mode, "电流");
}
break;
case MENU_ENGLISH:
{
lv_label_set_text(guider_ui.screen_main_label_Mode, "Cur");
}
break;
default:
break;
}
switch (type)
{
case CURRENT_MA:
{
lv_label_set_text(guider_ui.screen_main_label_unit, "mA");
up2down_update(tabdata.item0_page0_clow, tabdata.item0_page0_cup);
}
break;
default:
break;
}
}
break;
//电阻
case SIG_RESISTANT:
{

View File

@ -603,7 +603,6 @@ void scr_setting_run(void) //详细设置界面
//处理复位事件
deal_data_reset();
}
//执行保存功能
@ -612,6 +611,10 @@ void deal_data_save(void)
{
if(tabdata.item3_page0_saveflag == 1)
{
//D2位置1
//CoilState[0] |= 0x04;
set_coil_val(COIL_ADDR_CONFIG_SAVE, 1);
if(save_step == 0)
{
save_step = 1;
@ -648,7 +651,12 @@ void deal_data_save(void)
save_step = 0;
}
}
}
else
{
//D2位置0
//CoilState[0] &= 0xFB;
set_coil_val(COIL_ADDR_CONFIG_SAVE, 0);
}
}
@ -658,6 +666,10 @@ void deal_data_reset(void)
{
if(tabdata.item3_page0_resetflag == 1)
{
//D3位置1
//CoilState[0] |= 0x08;
set_coil_val(COIL_ADDR_CONFIG_RESET, 1);
if(reset_step == 0)
{
reset_step = 1;
@ -697,6 +709,12 @@ void deal_data_reset(void)
}
}
}
else
{
//D3位置0
//CoilState[0] &= 0xF7;
set_coil_val(COIL_ADDR_CONFIG_RESET, 0);
}
}

View File

@ -157,7 +157,7 @@ void screen_run(void)
}
else
{
//播放过开机动画之后,跳转至界面
//播放过开机动画之后,跳转至指定界面
switch (menu_data.scr_now)
{
case SCREEN_MAIN:
@ -202,6 +202,12 @@ void sig_channel_select(uint8_t io, SIG_FUNCTIONS_TYPE type)
{
switch (type)
{
case CURRENT_MA:
{
mux_signal.channel = CH8_IN_CUR;
}
break;
case VOLTAGE_MV:
{
mux_signal.channel = CH7_IN_MVOL;
@ -214,12 +220,6 @@ void sig_channel_select(uint8_t io, SIG_FUNCTIONS_TYPE type)
}
break;
case CURRENT_MA:
{
mux_signal.channel = CH8_IN_CUR;
}
break;
case RESISTANT_OHM:
{
//与热电阻一致
@ -297,6 +297,12 @@ void sig_channel_select(uint8_t io, SIG_FUNCTIONS_TYPE type)
{
switch (type)
{
case CURRENT_MA:
{
mux_signal.channel = CH2_OUT_CUR;
}
break;
case VOLTAGE_MV:
{
mux_signal.channel = CH1_OUT_VOL_MV;
@ -309,12 +315,6 @@ void sig_channel_select(uint8_t io, SIG_FUNCTIONS_TYPE type)
}
break;
case CURRENT_MA:
{
mux_signal.channel = CH2_OUT_CUR;
}
break;
case RESISTANT_OHM:
{
mux_signal.channel = CH4_OUT_RES;

View File

@ -342,11 +342,19 @@ void set_item3_value(ITEM_CONTENTS con, int8_t step)
{
tabdata.item3_page0_lightflag = 0;
LIGHT_OFF;
//D1位置0
//CoilState[0] &= 0xFD;
set_coil_val(COIL_ADDR_LIGHT, 0);
}
else
{
tabdata.item3_page0_lightflag = 1;
LIGHT_ON;
//D1位置1
CoilState[0] |= 0x02;
set_coil_val(COIL_ADDR_LIGHT, 1);
}
}
break;

View File

@ -3,6 +3,34 @@
#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 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,
@ -43,4 +71,25 @@ 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

View File

@ -15,19 +15,19 @@
#define WriteMultiReg 0x10 //写多个保持寄存器
#define COIL_ADD_MIN 0x00
#define COIL_ADD_MAX 0x64
#define COIL_ADD_MAX 0x0F
#define MAX_COIL_NUM ((COIL_ADD_MAX) - (COIL_ADD_MIN) + 1)
#define DIS_ADD_MIN 0x00
#define DIS_ADD_MAX 0x64
#define DIS_ADD_MAX 0x0F
#define MAX_DIS_NUM ((DIS_ADD_MAX) - (DIS_ADD_MIN) + 1)
#define INPUT_REG_ADD_MIN 0x00
#define INPUT_REG_ADD_MAX 0x64
#define INPUT_REG_ADD_MAX 0x0F
#define MAX_INPUT_REG_NUM ((INPUT_REG_ADD_MAX) - (INPUT_REG_ADD_MIN) + 1)
#define HOLD_REG_ADD_MIN 0x00
#define HOLD_REG_ADD_MAX 0x64
#define HOLD_REG_ADD_MAX 0x0F
#define MAX_HOLD_REG_NUM ((HOLD_REG_ADD_MAX) - (HOLD_REG_ADD_MIN) + 1)
#define BROADCAST_ADDRESS 0x00

View File

@ -392,3 +392,114 @@ 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 )
{
//进入此处说明线圈寄存器的值被上位机修改
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 )
{
//进入此处说明线圈寄存器的值被上位机修改
tabdata.item3_page0_lightflag = get_coil_val(COIL_ADDR_LIGHT);
if(tabdata.item3_page0_lightflag)
{
LIGHT_ON;
}
else
{
LIGHT_OFF;
}
}
}
//离散输入寄存器,上位机只读
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)
{
if( (addr < COIL_ADD_MIN)||(addr > COIL_ADD_MAX)||(bit_val > 1) ) return;
addr -= COIL_ADD_MIN;
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)
{
uint8_t result = 0;
if( (addr < COIL_ADD_MIN)||(addr > COIL_ADD_MAX) ) return;
addr -= COIL_ADD_MIN;
uint8_t pcoil = addr / 8; //数组的第几个元素, 0-7
uint8_t pbit = addr % 8; //元素的第几位, 0-7
result = 0x01 & (CoilState[pcoil] >> pbit);
return result;
}

View File

@ -55,8 +55,10 @@ void fun_get_freq(st_freq_signal *freq_signal, float *data_pv)
{
freq_signal->capture_cnt = 0;
__HAL_TIM_SET_COUNTER(&htim3, 0);
freq_signal->duty_time = freq_signal->capture_buf[1] + freq_signal->over_cnt * 60000 - freq_signal->capture_buf[0];
freq_signal->freq = 1000000 / freq_signal->duty_time;
// freq_signal->duty_time = freq_signal->capture_buf[1] + freq_signal->over_cnt * 60000 - freq_signal->capture_buf[0];
// freq_signal->freq = 1000000 / freq_signal->duty_time;
freq_signal->duty_time = freq_signal->capture_buf[1] + freq_signal->over_cnt * 65535 - freq_signal->capture_buf[0];
freq_signal->freq = 82944000 / freq_signal->duty_time;
*data_pv = freq_signal->freq;
freq_signal->over_cnt = 0;
}
@ -140,14 +142,17 @@ void mux_signal_switch(st_mux_signal *mux_signal)
dac_set_voltage(&mux_signal->data_sv);
fun_proc_adc1_dma(&mux_signal->data_pv);
break;
case CH1_OUT_VOL_MV:
dac8552_operation(NULL, &mux_signal->data_sv);
fun_get_sig16132_ch(4, &mux_signal->data_pv);
break;
case CH2_OUT_CUR:
dac8552_operation(&mux_signal->data_sv, NULL);
fun_get_sig16132_ch(7, &mux_signal->data_pv);
break;
case CH3_OUT_FRE:
{
if(tabdata.hart_enable == 0)
@ -158,31 +163,38 @@ void mux_signal_switch(st_mux_signal *mux_signal)
}
}
break;
case CH4_OUT_RES:
fun_dac7811_operate(&mux_signal->data_sv);
break;
case CH5_EMPTY:
break;
case CH6_IN_VOL:
fun_get_sig16132_ch(2, &mux_signal->data_pv);
// fun_rn7302_operate(CH0_IN_VOL, &mux_signal->data_pv);
break;
case CH7_IN_MVOL:
fun_get_sig16132_ch(3, &mux_signal->data_pv);
// fun_rn7302_operate(CH0_IN_VOL, &mux_signal->data_pv);
break;
case CH8_IN_CUR:
fun_get_sig16132_ch(5, &mux_signal->data_pv);
// fun_rn7302_operate(CH1_IN_CUR, &mux_signal->data_pv);
break;
case CH9_IN_FRE:
fun_get_freq(&freq_signal, &mux_signal->data_pv);
break;
case CH10_IN_RTD:
fun_get_sig16132_ch(CH10_IN_RTD, &mux_signal->data_pv);
// fun_rn7302_operate(CH3_IN_RTD, &mux_signal->data_pv);
break;
case CH11_IN_TC:
ads1220_operation(CH11_IN_TC, &mux_signal->data_pv);
// fun_rn7302_operate(CH3_IN_RTD, &mux_signal->data_pv);

View File

@ -212,6 +212,7 @@ void start_task_hart(void const * argument)
/* Infinite loop */
for (;;)
{
//该任务用于设置HART芯片所需频率、驱动验证
if(tabdata.hart_enable == 1)
{
if(fre_set != 460800)
@ -259,6 +260,7 @@ void start_task_ble(void const * argument)
/* Infinite loop */
for (;;)
{
//该任务用于蓝牙设备初始化、驱动验证
if( ble_init() == 1 )
{
if(tabdata.bluetooth_enable == 1)
@ -293,11 +295,16 @@ void start_rs485(void const * argument)
/* Infinite loop */
for (;;)
{
//该任务用于处理寄存器的数值的读写、当前通讯状态的更新
if( !(tabdata.bluetooth_enable||tabdata.hart_enable||tabdata.modbus_enable) )
{
sig_trans = TRANS_NONE;
}
//更新modbus的寄存器值
modbus_registers_update();
osDelay(RS485_TASK_PERIOD);
}
/* USER CODE END start_rs485 */

File diff suppressed because it is too large Load Diff