更新:

1、modbus主站:完成了自定义超时时间的功能。
2、取消对DMA接收起始时刻的捕获,取消接收延迟的计算。
This commit is contained in:
吴俊潮 2025-05-15 15:12:47 +08:00
parent 9e46c548d9
commit af6d6fd969
11 changed files with 20574 additions and 16787 deletions

View File

@ -67,6 +67,12 @@ typedef enum
COLOR_BLACK COLOR_BLACK
}COLORS; }COLORS;
typedef enum
{
SIG_SLAVE = 0,
SIG_MASTER
}SIG_MODBUS_TYPE;
typedef struct typedef struct
{ {
ITEMS item_cursor; //选项卡游标,后续根据实际需求进行宏定义 ITEMS item_cursor; //选项卡游标,后续根据实际需求进行宏定义
@ -109,6 +115,8 @@ typedef struct
uint8_t hart_enable; //HART透传使能 uint8_t hart_enable; //HART透传使能
uint8_t bluetooth_enable; //蓝牙透传使能 uint8_t bluetooth_enable; //蓝牙透传使能
uint8_t modbus_enable; //MODBUS使能 uint8_t modbus_enable; //MODBUS使能
SIG_MODBUS_TYPE modbus_type; //SIG在modbus中作为主或从
uint16_t modbus_timeout_period; //SIG作为主设备时等待从设备响应的超时时间上限ms
//ITEMS_3 //ITEMS_3
uint8_t item3_page0_lightflag; //照明状态标志0熄灭1开启 uint8_t item3_page0_lightflag; //照明状态标志0熄灭1开启

View File

@ -20,6 +20,7 @@ extern int plot_ms_cnt;
extern int twk_1000ms_flag; extern int twk_1000ms_flag;
extern int twk_1000ms_cnt; extern int twk_1000ms_cnt;
extern int input_500ms_flag; extern int input_500ms_flag;
extern uint16_t sig2slave_current_tick;
void duty_tim3(void); void duty_tim3(void);
void duty_tim6(void); void duty_tim6(void);

View File

@ -46,6 +46,8 @@ void tab_data_init(void)
tabdata.hart_enable = 0; //HART默认使能状态 tabdata.hart_enable = 0; //HART默认使能状态
tabdata.bluetooth_enable = 0; //HART默认使能状态 tabdata.bluetooth_enable = 0; //HART默认使能状态
tabdata.modbus_enable = 0; //HART默认使能状态 tabdata.modbus_enable = 0; //HART默认使能状态
tabdata.modbus_type = SIG_SLAVE; //SIG默认作为从设备
tabdata.modbus_timeout_period = 1000; //默认超时时间为1000ms
//ITEMS_3部分内容位于EERPOM读取 //ITEMS_3部分内容位于EERPOM读取
tabdata.item3_page0_lightflag = 0; //照明状态标志0熄灭1开启 tabdata.item3_page0_lightflag = 0; //照明状态标志0熄灭1开启

View File

@ -18,6 +18,8 @@ int twk_1000ms_flag = 0;
int twk_1000ms_cnt = 0; int twk_1000ms_cnt = 0;
int input_500ms_flag = 0; int input_500ms_flag = 0;
int input_500ms_cnt = 0; int input_500ms_cnt = 0;
uint16_t sig2slave_previous_tick = 0;
uint16_t sig2slave_current_tick = 0;
void duty_tim3(void) void duty_tim3(void)
{ {
@ -62,6 +64,20 @@ void duty_tim6(void)
input_500ms_cnt = 0; input_500ms_cnt = 0;
input_500ms_flag = 1; input_500ms_flag = 1;
} }
if(sig2slave_step == 1)
{
sig2slave_current_tick++;
if(sig2slave_current_tick > tabdata.modbus_timeout_period)
{
HAL_UART_DMAStop(&huart2);
__HAL_UART_CLEAR_IDLEFLAG(&huart2);
sig2slave_current_tick = 0;
sig2slave_step++;
scom2_rs485.rx_flag = TRUE;
}
}
} }

View File

@ -3,17 +3,21 @@
#include "apps_gather.h" #include "apps_gather.h"
#define TRANSPARENT_WAIT 0 typedef enum
#define TRANSPARENT_RECIEVE_START 1 {
#define TRANSPARENT_RECIEVE_FINISHED 2 TRANSPARENT_WAIT = 0,
#define TRANSPARENT_TRANSMIT_END 3 TRANSPARENT_RECIEVE_START,
TRANSPARENT_RECIEVE_FINISHED,
TRANSPARENT_TRANSMIT_END
}TRANS_PROCESS;
extern uint32_t tick_start; extern uint32_t tick_start;
extern uint32_t tick_middle; extern uint32_t tick_middle;
extern uint32_t tick_end; extern uint32_t tick_end;
extern uint32_t trans_log_rx; extern uint32_t trans_log_rx;
extern uint32_t trans_log_tx; extern uint32_t trans_log_tx;
extern uint8_t st_flag; extern uint8_t sig2slave_step;
extern TRANS_PROCESS st_flag;
void parse_scom_485(st_scom *scom); void parse_scom_485(st_scom *scom);
@ -35,6 +39,7 @@ void trans_pc2ble(void);
void trans_modbus_pc2sig(void); void trans_modbus_pc2sig(void);
//SIG作为主设备向外发送数据之后等待从机应答持续一段时间超时时间无数据后停止接收并对收到的数据进行解析
void trans_modbus_sig2slave(void); void trans_modbus_sig2slave(void);
//DMA接收只有半满中断、空闲中断和完成溢出中断因此用以下函数尝试进行捕获 //DMA接收只有半满中断、空闲中断和完成溢出中断因此用以下函数尝试进行捕获

View File

@ -5,7 +5,7 @@ uint32_t tick_middle = 0;
uint32_t tick_end = 0; uint32_t tick_end = 0;
uint32_t trans_log_rx = 0; uint32_t trans_log_rx = 0;
uint32_t trans_log_tx = 0; uint32_t trans_log_tx = 0;
uint8_t st_flag = 0; TRANS_PROCESS st_flag = TRANSPARENT_WAIT;
//static void scom_485_send(UART_HandleTypeDef *huart, char *str) //static void scom_485_send(UART_HandleTypeDef *huart, char *str)
//{ //{
@ -154,7 +154,6 @@ void transparent_tim(void)
default: default:
break; break;
} }
} }
void trans_hart2pc(void) void trans_hart2pc(void)
@ -294,13 +293,82 @@ void trans_modbus_pc2sig(void)
} }
} }
uint8_t sig2slave_step = 0;
uint8_t sig2slave_data_length_total = 0;
uint8_t buffer_size_temp = BUFFER_SIZE;
void trans_modbus_sig2slave(void) void trans_modbus_sig2slave(void)
{ {
if (scom2_rs485.rx_flag == TRUE)
{
scom2_rs485.rx_flag = FALSE;
switch (sig2slave_step)
{
case 0:
{
//进入此处说明已经接收完成一部分数据,开始超时计时
//记录第一次接收到的数据长度
sig2slave_data_length_total = scom2_rs485.rx_len;
//修改剩余buff长度继续接收
buffer_size_temp -= scom2_rs485.rx_len;
HAL_UART_Receive_DMA(&huart2, scom2_rs485.rx_buff + sig2slave_data_length_total, buffer_size_temp);
sig2slave_step++;
}
break;
case 1:
{
//超时时间内再次收到数据,重新开始超时计时
sig2slave_current_tick = 0;
//本次收到的数据长度
uint8_t sig2slave_data_length_temp = buffer_size_temp - __HAL_DMA_GET_COUNTER(huart2.hdmarx);
//累计收到的数据长度
sig2slave_data_length_total += sig2slave_data_length_temp;
scom2_rs485.rx_len = sig2slave_data_length_total;
if(scom2_rs485.rx_len < BUFFER_SIZE)
{
//继续接收
buffer_size_temp -= sig2slave_data_length_temp;
HAL_UART_Receive_DMA(&huart2, scom2_rs485.rx_buff + sig2slave_data_length_total, buffer_size_temp);
}
}
break;
case 2:
{
//进入此处说明超时计时结束,对接收到的数据进行处理
//数据处理完成
sig2slave_step = 0;
sig_trans = TRANS_NONE;
memset(scom2_rs485.rx_buff, 0, scom2_rs485.rx_len);
scom2_rs485.rx_len = 0;
sig2slave_data_length_total = 0;
buffer_size_temp = BUFFER_SIZE;
HAL_UART_Receive_DMA(&huart2, scom2_rs485.rx_buff, BUFFER_SIZE);
}
break;
default:
break;
}
}
} }
void trans_start_capture(void) void trans_start_capture(void)
{ {
if( ( 1 <= (BUFFER_SIZE - __HAL_DMA_GET_COUNTER(huart1.hdmarx)) )&&( (BUFFER_SIZE - __HAL_DMA_GET_COUNTER(huart1.hdmarx)) <= 3) ) uint8_t data_len1 = BUFFER_SIZE - __HAL_DMA_GET_COUNTER(huart1.hdmarx);
uint8_t data_len2 = BUFFER_SIZE - __HAL_DMA_GET_COUNTER(huart2.hdmarx);
uint8_t data_len6 = BUFFER_SIZE - __HAL_DMA_GET_COUNTER(huart6.hdmarx);
if( (1 <= data_len1 )&&( data_len1 <= 3) )
{ {
if(tabdata.hart_enable) if(tabdata.hart_enable)
{ {
@ -312,7 +380,7 @@ void trans_start_capture(void)
} }
} }
if( ( 1 <= (BUFFER_SIZE - __HAL_DMA_GET_COUNTER(huart6.hdmarx)) )&&( (BUFFER_SIZE - __HAL_DMA_GET_COUNTER(huart6.hdmarx)) <= 3) ) if( (1 <= data_len2 )&&( data_len2 <= 3) )
{ {
if(tabdata.bluetooth_enable) if(tabdata.bluetooth_enable)
{ {
@ -324,7 +392,7 @@ void trans_start_capture(void)
} }
} }
if( ( 1 <= (BUFFER_SIZE - __HAL_DMA_GET_COUNTER(huart2.hdmarx)) )&&( (BUFFER_SIZE - __HAL_DMA_GET_COUNTER(huart2.hdmarx)) <= 3) ) if( (1 <= data_len6 )&&( data_len6 <= 3) )
{ {
if(tabdata.hart_enable||tabdata.bluetooth_enable||tabdata.modbus_enable) if(tabdata.hart_enable||tabdata.bluetooth_enable||tabdata.modbus_enable)
{ {
@ -374,8 +442,25 @@ uint8_t trans_enable_check(st_scom *scom)
else if(tabdata.modbus_enable) else if(tabdata.modbus_enable)
{ {
result = 1; result = 1;
switch (tabdata.modbus_type)
{
case SIG_SLAVE:
{
sig_trans = TRANS_MODBUS_PC_TO_SIG; sig_trans = TRANS_MODBUS_PC_TO_SIG;
} }
break;
case SIG_MASTER:
{
sig_trans = TRANS_MODBUS_SIG_TO_SLAVE;
}
break;
default:
break;
}
}
} }
return result; return result;

View File

@ -225,17 +225,18 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
//无通讯的情况下直接返回开启DMA时尝试对第1~3个字节的数据进行捕获 //无通讯的情况下直接返回开启DMA时尝试对第1~3个字节的数据进行捕获
if(sig_trans == TRANS_NONE) if(sig_trans == TRANS_NONE)
{ {
#if RX_DMA_ENABLE // #if RX_DMA_ENABLE
trans_start_capture(); // trans_start_capture();
#endif // #endif
return; return;
} }
HAL_TIM_Base_Stop(&htim2); HAL_TIM_Base_Stop(&htim2);
//DMA发送 //数据传输
transparent_tim(); transparent_tim();
__HAL_TIM_SET_COUNTER(&htim2, 0);
HAL_TIM_Base_Start(&htim2); HAL_TIM_Base_Start(&htim2);
} }

View File

@ -441,9 +441,9 @@ void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
tick_end = xTaskGetTickCountFromISR(); tick_end = xTaskGetTickCountFromISR();
//计算延迟捕获失败时清零速度过快小于1ms //计算延迟捕获失败时清零速度过快小于1ms
trans_log_rx = tick_middle - tick_start; //trans_log_rx = tick_middle - tick_start;
//if(trans_log_rx > 1000) trans_log_rx = 0;
trans_log_tx = tick_end - tick_middle; trans_log_tx = tick_end - tick_middle;
if(trans_log_rx > 1000) trans_log_rx = 0;
if(trans_log_tx > 1000) trans_log_tx = 0; if(trans_log_tx > 1000) trans_log_tx = 0;
//发送完成后将相关数组清零 //发送完成后将相关数组清零

File diff suppressed because one or more lines are too long

View File

@ -273,17 +273,17 @@
<Ww> <Ww>
<count>23</count> <count>23</count>
<WinNumber>1</WinNumber> <WinNumber>1</WinNumber>
<ItemText>trans_log_rx,0x0A</ItemText> <ItemText>st_flag,0x0A</ItemText>
</Ww> </Ww>
<Ww> <Ww>
<count>24</count> <count>24</count>
<WinNumber>1</WinNumber> <WinNumber>1</WinNumber>
<ItemText>trans_log_tx,0x0A</ItemText> <ItemText>trans_log_rx,0x0A</ItemText>
</Ww> </Ww>
<Ww> <Ww>
<count>25</count> <count>25</count>
<WinNumber>1</WinNumber> <WinNumber>1</WinNumber>
<ItemText>st_flag,0x0A</ItemText> <ItemText>trans_log_tx,0x0A</ItemText>
</Ww> </Ww>
</WatchWindow1> </WatchWindow1>
<WatchWindow2> <WatchWindow2>
@ -539,7 +539,7 @@
<Group> <Group>
<GroupName>Application/User/App/LCD</GroupName> <GroupName>Application/User/App/LCD</GroupName>
<tvExp>1</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel> <cbSel>0</cbSel>
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
@ -559,7 +559,7 @@
<Group> <Group>
<GroupName>Application/User/App/HART</GroupName> <GroupName>Application/User/App/HART</GroupName>
<tvExp>1</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel> <cbSel>0</cbSel>
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
@ -579,7 +579,7 @@
<Group> <Group>
<GroupName>Application/User/App/BLE</GroupName> <GroupName>Application/User/App/BLE</GroupName>
<tvExp>1</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel> <cbSel>0</cbSel>
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
@ -631,7 +631,7 @@
<Group> <Group>
<GroupName>Application/User/App/MUX_SIGNAL</GroupName> <GroupName>Application/User/App/MUX_SIGNAL</GroupName>
<tvExp>1</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel> <cbSel>0</cbSel>
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>

File diff suppressed because it is too large Load Diff