更新:

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 MY_ABS(pa) ( ( (pa) >= 0 )?( (pa) ):( 0 - (pa) ) )
#define MUX_TASK_PERIOD 50 //多通道输入输出任务周期
#define LVGL_TASK_PERIOD 5 //LVGL任务周期 #define LVGL_TASK_PERIOD 5 //LVGL任务周期
#define MENU_TASK_PERIOD 300 //显示内容设置周期 #define MENU_TASK_PERIOD 300 //显示内容设置周期
#define BLE_TASK_PERIOD 10 //蓝牙任务周期 #define BLE_TASK_PERIOD 100 //蓝牙任务周期
#define HART_TASK_PERIOD 10 //HART任务周期 #define HART_TASK_PERIOD 100 //HART任务周期
#define RS485_TASK_PERIOD 10 //485任务周期 #define RS485_TASK_PERIOD MUX_TASK_PERIOD //485任务周期
#define MUX_TASK_PERIOD 50 //多通道输入输出任务周期
//屏幕显示 //屏幕显示
void screen_run(void); void screen_run(void);

View File

@ -253,8 +253,8 @@ typedef struct
//ITEMS_0 //ITEMS_0
SIG_FUNCTIONS_TYPE item0_page0_vunit; //电压单位 SIG_FUNCTIONS_TYPE item0_page0_vunit; //电压单位
int16_t item0_page0_vup[2]; //电压上限 int16_t item0_page0_vup[2]; //电压上限, 0:V1:mV
int16_t item0_page0_vlow[2]; //电压下限 int16_t item0_page0_vlow[2]; //电压下限, 0:V1:mV
uint8_t item0_page0_cup; //电流上限 uint8_t item0_page0_cup; //电流上限
uint8_t item0_page0_clow; //电流下限 uint8_t item0_page0_clow; //电流下限
int16_t item0_page0_rup; //电阻上限 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"); 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) switch (menu_data.io_mode)
{ {
case IO_OUTPUT: case IO_OUTPUT:
@ -874,6 +878,10 @@ void io_on2off_status(void)
{ {
lv_label_set_text(guider_ui.screen_main_label_ONOFF, "OFF"); 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) switch (menu_data.io_mode)
{ {
case IO_OUTPUT: case IO_OUTPUT:
@ -1103,6 +1111,43 @@ void set_working_mode(SIG_FUNCTIONS mode, SIG_FUNCTIONS_TYPE type)
switch (mode) 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: case SIG_VOLTAGE:
{ {
@ -1149,43 +1194,6 @@ void set_working_mode(SIG_FUNCTIONS mode, SIG_FUNCTIONS_TYPE type)
} }
break; 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: case SIG_RESISTANT:
{ {

View File

@ -603,7 +603,6 @@ void scr_setting_run(void) //详细设置界面
//处理复位事件 //处理复位事件
deal_data_reset(); deal_data_reset();
} }
//执行保存功能 //执行保存功能
@ -612,6 +611,10 @@ void deal_data_save(void)
{ {
if(tabdata.item3_page0_saveflag == 1) if(tabdata.item3_page0_saveflag == 1)
{ {
//D2位置1
//CoilState[0] |= 0x04;
set_coil_val(COIL_ADDR_CONFIG_SAVE, 1);
if(save_step == 0) if(save_step == 0)
{ {
save_step = 1; save_step = 1;
@ -648,7 +651,12 @@ void deal_data_save(void)
save_step = 0; 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) if(tabdata.item3_page0_resetflag == 1)
{ {
//D3位置1
//CoilState[0] |= 0x08;
set_coil_val(COIL_ADDR_CONFIG_RESET, 1);
if(reset_step == 0) if(reset_step == 0)
{ {
reset_step = 1; 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 else
{ {
//播放过开机动画之后,跳转至界面 //播放过开机动画之后,跳转至指定界面
switch (menu_data.scr_now) switch (menu_data.scr_now)
{ {
case SCREEN_MAIN: case SCREEN_MAIN:
@ -202,6 +202,12 @@ void sig_channel_select(uint8_t io, SIG_FUNCTIONS_TYPE type)
{ {
switch (type) switch (type)
{ {
case CURRENT_MA:
{
mux_signal.channel = CH8_IN_CUR;
}
break;
case VOLTAGE_MV: case VOLTAGE_MV:
{ {
mux_signal.channel = CH7_IN_MVOL; mux_signal.channel = CH7_IN_MVOL;
@ -214,12 +220,6 @@ void sig_channel_select(uint8_t io, SIG_FUNCTIONS_TYPE type)
} }
break; break;
case CURRENT_MA:
{
mux_signal.channel = CH8_IN_CUR;
}
break;
case RESISTANT_OHM: case RESISTANT_OHM:
{ {
//与热电阻一致 //与热电阻一致
@ -297,6 +297,12 @@ void sig_channel_select(uint8_t io, SIG_FUNCTIONS_TYPE type)
{ {
switch (type) switch (type)
{ {
case CURRENT_MA:
{
mux_signal.channel = CH2_OUT_CUR;
}
break;
case VOLTAGE_MV: case VOLTAGE_MV:
{ {
mux_signal.channel = CH1_OUT_VOL_MV; mux_signal.channel = CH1_OUT_VOL_MV;
@ -309,12 +315,6 @@ void sig_channel_select(uint8_t io, SIG_FUNCTIONS_TYPE type)
} }
break; break;
case CURRENT_MA:
{
mux_signal.channel = CH2_OUT_CUR;
}
break;
case RESISTANT_OHM: case RESISTANT_OHM:
{ {
mux_signal.channel = CH4_OUT_RES; 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; tabdata.item3_page0_lightflag = 0;
LIGHT_OFF; LIGHT_OFF;
//D1位置0
//CoilState[0] &= 0xFD;
set_coil_val(COIL_ADDR_LIGHT, 0);
} }
else else
{ {
tabdata.item3_page0_lightflag = 1; tabdata.item3_page0_lightflag = 1;
LIGHT_ON; LIGHT_ON;
//D1位置1
CoilState[0] |= 0x02;
set_coil_val(COIL_ADDR_LIGHT, 1);
} }
} }
break; break;

View File

@ -3,6 +3,34 @@
#include "apps_gather.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 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 typedef enum
{ {
TRANSPARENT_WAIT = 0, TRANSPARENT_WAIT = 0,
@ -43,4 +71,25 @@ void trans_start_capture(void);
uint8_t trans_enable_check(st_scom *scom); 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 #endif

View File

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

View File

@ -392,3 +392,114 @@ uint8_t trans_enable_check(st_scom *scom)
return result; 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; freq_signal->capture_cnt = 0;
__HAL_TIM_SET_COUNTER(&htim3, 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->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->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; *data_pv = freq_signal->freq;
freq_signal->over_cnt = 0; 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); dac_set_voltage(&mux_signal->data_sv);
fun_proc_adc1_dma(&mux_signal->data_pv); fun_proc_adc1_dma(&mux_signal->data_pv);
break; break;
case CH1_OUT_VOL_MV: case CH1_OUT_VOL_MV:
dac8552_operation(NULL, &mux_signal->data_sv); dac8552_operation(NULL, &mux_signal->data_sv);
fun_get_sig16132_ch(4, &mux_signal->data_pv); fun_get_sig16132_ch(4, &mux_signal->data_pv);
break; break;
case CH2_OUT_CUR: case CH2_OUT_CUR:
dac8552_operation(&mux_signal->data_sv, NULL); dac8552_operation(&mux_signal->data_sv, NULL);
fun_get_sig16132_ch(7, &mux_signal->data_pv); fun_get_sig16132_ch(7, &mux_signal->data_pv);
break; break;
case CH3_OUT_FRE: case CH3_OUT_FRE:
{ {
if(tabdata.hart_enable == 0) if(tabdata.hart_enable == 0)
@ -158,31 +163,38 @@ void mux_signal_switch(st_mux_signal *mux_signal)
} }
} }
break; break;
case CH4_OUT_RES: case CH4_OUT_RES:
fun_dac7811_operate(&mux_signal->data_sv); fun_dac7811_operate(&mux_signal->data_sv);
break; break;
case CH5_EMPTY: case CH5_EMPTY:
break; break;
case CH6_IN_VOL: case CH6_IN_VOL:
fun_get_sig16132_ch(2, &mux_signal->data_pv); fun_get_sig16132_ch(2, &mux_signal->data_pv);
// fun_rn7302_operate(CH0_IN_VOL, &mux_signal->data_pv); // fun_rn7302_operate(CH0_IN_VOL, &mux_signal->data_pv);
break; break;
case CH7_IN_MVOL: case CH7_IN_MVOL:
fun_get_sig16132_ch(3, &mux_signal->data_pv); fun_get_sig16132_ch(3, &mux_signal->data_pv);
// fun_rn7302_operate(CH0_IN_VOL, &mux_signal->data_pv); // fun_rn7302_operate(CH0_IN_VOL, &mux_signal->data_pv);
break; break;
case CH8_IN_CUR: case CH8_IN_CUR:
fun_get_sig16132_ch(5, &mux_signal->data_pv); fun_get_sig16132_ch(5, &mux_signal->data_pv);
// fun_rn7302_operate(CH1_IN_CUR, &mux_signal->data_pv); // fun_rn7302_operate(CH1_IN_CUR, &mux_signal->data_pv);
break; break;
case CH9_IN_FRE: case CH9_IN_FRE:
fun_get_freq(&freq_signal, &mux_signal->data_pv); fun_get_freq(&freq_signal, &mux_signal->data_pv);
break; break;
case CH10_IN_RTD: case CH10_IN_RTD:
fun_get_sig16132_ch(CH10_IN_RTD, &mux_signal->data_pv); fun_get_sig16132_ch(CH10_IN_RTD, &mux_signal->data_pv);
// fun_rn7302_operate(CH3_IN_RTD, &mux_signal->data_pv); // fun_rn7302_operate(CH3_IN_RTD, &mux_signal->data_pv);
break; break;
case CH11_IN_TC: case CH11_IN_TC:
ads1220_operation(CH11_IN_TC, &mux_signal->data_pv); ads1220_operation(CH11_IN_TC, &mux_signal->data_pv);
// fun_rn7302_operate(CH3_IN_RTD, &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 */ /* Infinite loop */
for (;;) for (;;)
{ {
//该任务用于设置HART芯片所需频率、驱动验证
if(tabdata.hart_enable == 1) if(tabdata.hart_enable == 1)
{ {
if(fre_set != 460800) if(fre_set != 460800)
@ -259,6 +260,7 @@ void start_task_ble(void const * argument)
/* Infinite loop */ /* Infinite loop */
for (;;) for (;;)
{ {
//该任务用于蓝牙设备初始化、驱动验证
if( ble_init() == 1 ) if( ble_init() == 1 )
{ {
if(tabdata.bluetooth_enable == 1) if(tabdata.bluetooth_enable == 1)
@ -293,11 +295,16 @@ void start_rs485(void const * argument)
/* Infinite loop */ /* Infinite loop */
for (;;) for (;;)
{ {
//该任务用于处理寄存器的数值的读写、当前通讯状态的更新
if( !(tabdata.bluetooth_enable||tabdata.hart_enable||tabdata.modbus_enable) ) if( !(tabdata.bluetooth_enable||tabdata.hart_enable||tabdata.modbus_enable) )
{ {
sig_trans = TRANS_NONE; sig_trans = TRANS_NONE;
} }
//更新modbus的寄存器值
modbus_registers_update();
osDelay(RS485_TASK_PERIOD); osDelay(RS485_TASK_PERIOD);
} }
/* USER CODE END start_rs485 */ /* USER CODE END start_rs485 */

File diff suppressed because it is too large Load Diff