更新:

1、保持寄存器基本验证完成;
2、HART通讯:删除终止位判断;
This commit is contained in:
吴俊潮 2025-06-17 15:41:53 +08:00
parent dd24e054a0
commit e5a2c352ec
8 changed files with 16855 additions and 16777 deletions

View File

@ -20,7 +20,7 @@ void duty_tim3(void);
void duty_tim6(void); void duty_tim6(void);
void delay_cnt(uint16_t cnt); void delay_cnt(uint16_t cnt);
void wu_delay_us(__IO uint32_t delay); void systick_delay_us(__IO uint32_t delay);

View File

@ -422,12 +422,12 @@ void set_nixie_cube_sign(uint8_t on2off, uint8_t sg)
{ {
case IO_INPUT: case IO_INPUT:
{ {
menu_data.sign_flag_in = sg;
switch (sg) switch (sg)
{ {
case SIGN_NULL: case SIGN_NULL:
{ {
//熄灭显示NULL //熄灭显示NULL
menu_data.sign_flag_in = 0;
lv_img_set_src(guider_ui.screen_main_ani_in_sign, screen_main_ani_in_sign_imgs[0]); lv_img_set_src(guider_ui.screen_main_ani_in_sign, screen_main_ani_in_sign_imgs[0]);
} }
break; break;
@ -435,7 +435,6 @@ void set_nixie_cube_sign(uint8_t on2off, uint8_t sg)
case SIGN_MINUS: case SIGN_MINUS:
{ {
//显示减号(负) //显示减号(负)
menu_data.sign_flag_in = 1;
lv_img_set_src(guider_ui.screen_main_ani_in_sign, screen_main_ani_in_sign_imgs[1]); lv_img_set_src(guider_ui.screen_main_ani_in_sign, screen_main_ani_in_sign_imgs[1]);
} }
break; break;
@ -462,20 +461,19 @@ void set_nixie_cube_sign(uint8_t on2off, uint8_t sg)
case IO_OUTPUT: case IO_OUTPUT:
{ {
menu_data.sign_flag_out = sg;
switch (sg) switch (sg)
{ {
case 0: case SIGN_NULL:
{ {
//熄灭负号 //熄灭负号
menu_data.sign_flag_out = 0;
lv_img_set_src(guider_ui.screen_main_ani_out_sign, screen_main_ani_out_sign_imgs[0]); lv_img_set_src(guider_ui.screen_main_ani_out_sign, screen_main_ani_out_sign_imgs[0]);
} }
break; break;
case 1: case SIGN_MINUS:
{ {
//显示负号 //显示负号
menu_data.sign_flag_out = 1;
lv_img_set_src(guider_ui.screen_main_ani_out_sign, screen_main_ani_out_sign_imgs[1]); lv_img_set_src(guider_ui.screen_main_ani_out_sign, screen_main_ani_out_sign_imgs[1]);
} }
break; break;
@ -504,18 +502,27 @@ void set_nixie_cube(uint8_t io_slc, uint8_t pos, int32_t num)
{ {
case 99: case 99:
{ {
if( (num < 0)&&(menu_data.sign_flag_in == 0) ) if(input_overflow_flag > SIGN_MINUS)
{
//出现溢出时,显示溢出标志
set_nixie_cube_sign(IO_INPUT, input_overflow_flag);
}
else
{
//未发生溢出时,如果有溢出标志则清除
if(menu_data.sign_flag_in > SIGN_MINUS) set_nixie_cube_sign(IO_INPUT, SIGN_NULL);
if( (num < 0)&&(menu_data.sign_flag_in != SIGN_MINUS) )
{ {
//出现负数并且没有显示负号时 //出现负数并且没有显示负号时
set_nixie_cube_sign(IO_INPUT, 1); set_nixie_cube_sign(IO_INPUT, SIGN_MINUS);
} }
else if(( (num >= 0)&&(menu_data.sign_flag_in == 1) )) else if(( (num >= 0)&&(menu_data.sign_flag_in != SIGN_NULL) ))
{ {
//数值为非负数,但仍然显示负号时 //数值为非负数,但仍然显示负号时
set_nixie_cube_sign(IO_INPUT, 0); set_nixie_cube_sign(IO_INPUT, SIGN_NULL);
}
} }
if(input_overflow_flag > 1) set_nixie_cube_sign(IO_INPUT, input_overflow_flag);
//负数转正数 //负数转正数
num = ( num >= 0 )?(num):(0 - num); num = ( num >= 0 )?(num):(0 - num);

View File

@ -176,7 +176,7 @@ void delay_cnt(uint16_t cnt)
} }
#define CPU_FREQUENCY_MHZ 165.888 // STM32时钟主频 #define CPU_FREQUENCY_MHZ 165.888 // STM32时钟主频
void wu_delay_us(__IO uint32_t delay) void systick_delay_us(__IO uint32_t delay)
{ {
int last, curr, val; int last, curr, val;
int temp; int temp;

View File

@ -48,11 +48,11 @@ void eeprom_spi_writebyte(uint8_t wrt_data)
EEPROM_MOSI_L; EEPROM_MOSI_L;
} }
wu_delay_us(10); // 空等待 systick_delay_us(10); // 空等待
EEPROM_SCLK_H; //CPHA=0 EEPROM_SCLK_H; //CPHA=0
wu_delay_us(10); // 空等待 systick_delay_us(10); // 空等待
} }
EEPROM_SCLK_L; EEPROM_SCLK_L;
@ -68,11 +68,11 @@ uint8_t eeprom_spi_readbyte(void)
EEPROM_SCLK_L; EEPROM_SCLK_L;
wu_delay_us(10); // 空等待 systick_delay_us(10); // 空等待
EEPROM_SCLK_H; EEPROM_SCLK_H;
wu_delay_us(10); // 空等待 systick_delay_us(10); // 空等待
if(EEPROM_MISO) if(EEPROM_MISO)
{ {
@ -100,13 +100,13 @@ uint8_t SPI_WriteReadByte(uint8_t data)
data = (data << 1); data = (data << 1);
EEPROM_SCLK_H; EEPROM_SCLK_H;
wu_delay_us(5); // 空等待 systick_delay_us(5); // 空等待
if(EEPROM_MISO) if(EEPROM_MISO)
{ {
data |= 0x01; data |= 0x01;
} }
EEPROM_SCLK_L; EEPROM_SCLK_L;
wu_delay_us(5); // 空等待 systick_delay_us(5); // 空等待
} }
return(data); return(data);

View File

@ -55,51 +55,51 @@ void hart_communicate(st_scom *scom)
//DEVICE <---SIG---> PC //DEVICE <---SIG---> PC
//将来自设备的HART数据装载至com485_tx将comhart_tx的HART数据发送至设备 //将来自设备的HART数据装载至com485_tx将comhart_tx的HART数据发送至设备
void transparent_hart(st_scom *scom) // void transparent_hart(st_scom *scom)
{ // {
if (scom != &scom1_hart) return; // if (scom != &scom1_hart) return;
HART_RTS(RTS_OFF); // HART_RTS(RTS_OFF);
//来自HART设备的数据是否接收完成 // //来自HART设备的数据是否接收完成
if (scom->rx_flag == TRUE) // if (scom->rx_flag == TRUE)
{ // {
scom->rx_flag = FALSE; // scom->rx_flag = FALSE;
//接收到的数据是否符合HART数据报符合则写入485的tx准备发送至上位机 // //接收到的数据是否符合HART数据报符合则写入485的tx准备发送至上位机
if ((scom->rx_buff[0] == 0xff) && (scom->rx_buff[1] == 0xff) && (scom->rx_buff[scom->rx_len - 1] == 0xAA)) // if ((scom->rx_buff[0] == 0xff) && (scom->rx_buff[1] == 0xff) && (scom->rx_buff[scom->rx_len - 1] == 0xAA))
{ // {
//SIG -> PC // //SIG -> PC
memcpy(scom2_rs485.tx_buff, scom->rx_buff, sizeof(scom->rx_buff)); // memcpy(scom2_rs485.tx_buff, scom->rx_buff, sizeof(scom->rx_buff));
scom2_rs485.tx_len = scom->rx_len; // scom2_rs485.tx_len = scom->rx_len;
scom2_rs485.tx_flag = TRUE; // scom2_rs485.tx_flag = TRUE;
} // }
//清空缓存区,等待新的数据 // //清空缓存区,等待新的数据
memset(scom->rx_buff, 0, sizeof(scom->rx_buff)); // memset(scom->rx_buff, 0, sizeof(scom->rx_buff));
scom->rx_len = 0; // scom->rx_len = 0;
} // }
//来自上位机的数据是否准备完毕 // //来自上位机的数据是否准备完毕
if (scom->tx_flag == TRUE) // if (scom->tx_flag == TRUE)
{ // {
scom->tx_flag = FALSE; // scom->tx_flag = FALSE;
HART_RTS(RTS_ON); // HART_RTS(RTS_ON);
vTaskDelay(15); // vTaskDelay(15);
//将tx中的数据发送至HART设备 // //将tx中的数据发送至HART设备
hart_send(&huart1, scom->tx_buff); // hart_send(&huart1, scom->tx_buff);
HART_RTS(RTS_OFF); // HART_RTS(RTS_OFF);
//清空缓存区,等待新的数据 // //清空缓存区,等待新的数据
memset(scom->tx_buff, 0, sizeof(scom->tx_buff)); // memset(scom->tx_buff, 0, sizeof(scom->tx_buff));
scom->tx_len = 0; // scom->tx_len = 0;
xTaskResumeFromISR(task_lcdHandle); // xTaskResumeFromISR(task_lcdHandle);
xTaskResumeFromISR(task_menuHandle); // xTaskResumeFromISR(task_menuHandle);
screen_suspend_flag = 0; // screen_suspend_flag = 0;
} // }
} // }

View File

@ -79,7 +79,9 @@ void trans_hart2pc(void)
scom1_hart.rx_flag = FALSE; scom1_hart.rx_flag = FALSE;
//接收到的数据是否符合HART数据报符合则写入485的tx准备发送至上位机 //接收到的数据是否符合HART数据报符合则写入485的tx准备发送至上位机
if ((scom1_hart.rx_buff[0] == 0xff) && (scom1_hart.rx_buff[1] == 0xff) && (scom1_hart.rx_buff[scom1_hart.rx_len - 1] == 0xAA)) // if ((scom1_hart.rx_buff[0] == 0xff) && (scom1_hart.rx_buff[1] == 0xff) && (scom1_hart.rx_buff[scom1_hart.rx_len - 1] == 0xAA))
// {
if ((scom1_hart.rx_buff[0] == 0xff) && (scom1_hart.rx_buff[1] == 0xff))
{ {
memcpy(scom2_rs485.tx_buff, scom1_hart.rx_buff, scom1_hart.rx_len); memcpy(scom2_rs485.tx_buff, scom1_hart.rx_buff, scom1_hart.rx_len);
scom2_rs485.tx_len = scom1_hart.rx_len; scom2_rs485.tx_len = scom1_hart.rx_len;
@ -106,7 +108,9 @@ void trans_pc2hart(void)
{ {
scom2_rs485.rx_flag = FALSE; scom2_rs485.rx_flag = FALSE;
if ((scom2_rs485.rx_buff[0] == 0xff) && (scom2_rs485.rx_buff[1] == 0xff) && (scom2_rs485.rx_buff[scom2_rs485.rx_len - 1] == 0xaa)) // if ((scom2_rs485.rx_buff[0] == 0xff) && (scom2_rs485.rx_buff[1] == 0xff) && (scom2_rs485.rx_buff[scom2_rs485.rx_len - 1] == 0xaa))
// {
if ( (scom2_rs485.rx_buff[0] == 0xff) && (scom2_rs485.rx_buff[1] == 0xff) )
{ {
//接收到的数据是否符合HART数据报符合则写入HART的tx准备发送至HART设备 //接收到的数据是否符合HART数据报符合则写入HART的tx准备发送至HART设备
memcpy(scom1_hart.tx_buff, scom2_rs485.rx_buff, scom2_rs485.rx_len); memcpy(scom1_hart.tx_buff, scom2_rs485.rx_buff, scom2_rs485.rx_len);
@ -120,11 +124,10 @@ void trans_pc2hart(void)
scom1_hart.tx_flag = FALSE; scom1_hart.tx_flag = FALSE;
HART_RTS(RTS_ON); HART_RTS(RTS_ON);
wu_delay_us(10000); systick_delay_us(10000);
//将tx中的数据发送至HART设备 //将tx中的数据发送至HART设备
HAL_UART_Transmit_DMA(&huart1, scom1_hart.tx_buff, scom1_hart.tx_len); HAL_UART_Transmit_DMA(&huart1, scom1_hart.tx_buff, scom1_hart.tx_len);
} }
//清空缓存区,等待新的数据 //清空缓存区,等待新的数据

View File

@ -226,6 +226,16 @@ void modbus_reg_update_hold(void)
hold_deal_range_max(); hold_deal_range_max();
hold_deal_range_min(); hold_deal_range_min();
hold_deal_sample_interval();
hold_deal_plot_counts();
hold_deal_color_input();
hold_deal_color_output();
hold_deal_language_select();
} }
void hold_deal_set_work_mode(void) void hold_deal_set_work_mode(void)
@ -490,6 +500,11 @@ void hold_deal_range_max(void)
} }
} }
} }
else
{
//拒绝修改
HoldReg[HOLD_ADDR_PHY_UP] = range_max_prv;
}
} }
else else
{ {
@ -511,6 +526,11 @@ void hold_deal_range_max(void)
} }
} }
} }
else
{
//拒绝修改
HoldReg[HOLD_ADDR_PHY_UP] = range_max_prv;
}
} }
} }
@ -541,6 +561,11 @@ void hold_deal_range_min(void)
} }
} }
} }
else
{
//拒绝修改
HoldReg[HOLD_ADDR_PHY_LOW] = range_min_prv;
}
} }
else else
{ {
@ -549,9 +574,9 @@ void hold_deal_range_min(void)
int16_t hold_temp16 = 0; int16_t hold_temp16 = 0;
memcpy(&hold_temp16, HoldReg + HOLD_ADDR_PHY_LOW, 2); memcpy(&hold_temp16, HoldReg + HOLD_ADDR_PHY_LOW, 2);
if( ((uint8_t)rg_min <= hold_temp16)&&(hold_temp16 <= *p16up) ) if( (rg_min <= hold_temp16)&&(hold_temp16 <= *p16up) )
{ {
*p16up = hold_temp16; *p16low = hold_temp16;
if(menu_data.scr_now == SCREEN_MAIN) if(menu_data.scr_now == SCREEN_MAIN)
{ {
@ -562,6 +587,11 @@ void hold_deal_range_min(void)
} }
} }
} }
else
{
//拒绝修改
HoldReg[HOLD_ADDR_PHY_LOW] = range_min_prv;
}
} }
} }
@ -574,6 +604,11 @@ void hold_deal_sample_interval(void)
{ {
tabdata.item1_page0_sample_interval = HoldReg[HOLD_ADDR_SAMPLE_INTERVAL]; tabdata.item1_page0_sample_interval = HoldReg[HOLD_ADDR_SAMPLE_INTERVAL];
} }
else
{
//拒绝修改
HoldReg[HOLD_ADDR_SAMPLE_INTERVAL] = tabdata.item1_page0_sample_interval;
}
} }
} }
@ -584,13 +619,21 @@ void hold_deal_plot_counts(void)
{ {
if( (PLOT_NUM_MIN <= HoldReg[HOLD_ADDR_PLOT_COUNTS])&&(HoldReg[HOLD_ADDR_PLOT_COUNTS] <= PLOT_NUM_MAX) ) if( (PLOT_NUM_MIN <= HoldReg[HOLD_ADDR_PLOT_COUNTS])&&(HoldReg[HOLD_ADDR_PLOT_COUNTS] <= PLOT_NUM_MAX) )
{ {
tabdata.item1_page0_plot_num = HoldReg[HOLD_ADDR_PLOT_COUNTS]; tabdata.item1_page0_plot_num = 0x00FF & HoldReg[HOLD_ADDR_PLOT_COUNTS];
if(menu_data.scr_now == SCREEN_MAIN) if(menu_data.scr_now == SCREEN_MAIN)
{ {
//更新显示模式,强制归零后自动恢复显示值(曲线只有在显示值变化时才刷新,于是在此处手动发生变化)
scr_main_chart_update(); scr_main_chart_update();
pltdata.y_pri_value = 0;
pltdata.y_scd_value = 0;
} }
} }
else
{
//拒绝修改
HoldReg[HOLD_ADDR_PLOT_COUNTS] = 0x00FF & tabdata.item1_page0_plot_num;
}
} }
} }
@ -599,15 +642,20 @@ void hold_deal_color_input(void)
{ {
if( HoldReg[HOLD_ADDR_INPUT_COLOR] != (0x00FF & (uint8_t)tabdata.item1_page0_color_input) ) if( HoldReg[HOLD_ADDR_INPUT_COLOR] != (0x00FF & (uint8_t)tabdata.item1_page0_color_input) )
{ {
if( HoldReg[HOLD_ADDR_PLOT_COUNTS] <= 5 ) if( HoldReg[HOLD_ADDR_INPUT_COLOR] <= 5 )
{ {
tabdata.item1_page0_color_input = (COLORS)HoldReg[HOLD_ADDR_PLOT_COUNTS]; tabdata.item1_page0_color_input = (COLORS)HoldReg[HOLD_ADDR_INPUT_COLOR];
if(menu_data.scr_now == SCREEN_MAIN) if(menu_data.scr_now == SCREEN_MAIN)
{ {
scr_main_chart_update(); scr_main_chart_update();
} }
} }
else
{
//拒绝修改
HoldReg[HOLD_ADDR_INPUT_COLOR] = 0x00FF & (uint8_t)tabdata.item1_page0_color_input;
}
} }
} }
@ -625,6 +673,11 @@ void hold_deal_color_output(void)
scr_main_chart_update(); scr_main_chart_update();
} }
} }
else
{
//拒绝修改
HoldReg[HOLD_ADDR_OUTPUT_COLOR] = 0x00FF & (uint8_t)tabdata.item1_page0_color_output;
}
} }
} }
@ -639,6 +692,11 @@ void hold_deal_language_select(void)
setting_laguage_switch(tabdata.item3_page0_language); setting_laguage_switch(tabdata.item3_page0_language);
} }
else
{
//拒绝修改
HoldReg[HOLD_ADDR_LANGUAGE] = 0x00FF & (uint8_t)tabdata.item3_page0_language;
}
} }
} }

File diff suppressed because it is too large Load Diff