358 lines
9.4 KiB
C
358 lines
9.4 KiB
C
#include "modbus_485.h"
|
||
|
||
uint32_t tick_start = 0;
|
||
uint32_t tick_middle = 0;
|
||
uint32_t tick_end = 0;
|
||
//uint32_t trans_log_rx = 0;
|
||
uint32_t trans_log_tx = 0;
|
||
TRANS_PROCESS st_flag = TRANSPARENT_WAIT;
|
||
|
||
|
||
void parse_scom_485(st_scom *scom)
|
||
{
|
||
if ((scom == &scom2_rs485) && (scom->rx_flag == TRUE))
|
||
{
|
||
scom->rx_flag = FALSE;
|
||
if ((scom->rx_buff[0] == 0xff) && (scom->rx_buff[1] == 0xff) && (scom->rx_buff[scom->rx_len - 1] == 0xaa))
|
||
{
|
||
vTaskDelay(10);
|
||
HAL_UART_Transmit(&huart2, scom->rx_buff, scom->rx_len, 0xFFFF);
|
||
}
|
||
scom->rx_len = 0;
|
||
}
|
||
}
|
||
|
||
void transparent_tim(void)
|
||
{
|
||
switch (sig_trans)
|
||
{
|
||
case TRANS_NONE:
|
||
{}
|
||
break;
|
||
|
||
case TRANS_HART_TO_PC:
|
||
{
|
||
trans_hart2pc();
|
||
}
|
||
break;
|
||
|
||
case TRANS_PC_TO_HART:
|
||
{
|
||
trans_pc2hart();
|
||
}
|
||
break;
|
||
|
||
case TRANS_BLE_TO_PC:
|
||
{
|
||
trans_ble2pc();
|
||
}
|
||
break;
|
||
|
||
case TRANS_PC_TO_BLE:
|
||
{
|
||
trans_pc2ble();
|
||
}
|
||
break;
|
||
|
||
case TRANS_MODBUS_PC_TO_SIG:
|
||
{
|
||
trans_modbus_pc2sig();
|
||
}
|
||
break;
|
||
|
||
case TRANS_MODBUS_SIG_TO_SLAVE:
|
||
{
|
||
trans_modbus_sig2slave();
|
||
}
|
||
break;
|
||
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
|
||
void trans_hart2pc(void)
|
||
{
|
||
//来自HART设备的数据是否接收完成
|
||
if (scom1_hart.rx_flag == TRUE)
|
||
{
|
||
scom1_hart.rx_flag = FALSE;
|
||
|
||
//接收到的数据是否符合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))
|
||
{
|
||
memcpy(scom2_rs485.tx_buff, scom1_hart.rx_buff, scom1_hart.rx_len);
|
||
scom2_rs485.tx_len = scom1_hart.rx_len;
|
||
scom2_rs485.tx_flag = TRUE;
|
||
}
|
||
|
||
if(scom2_rs485.tx_flag == TRUE)
|
||
{
|
||
scom2_rs485.tx_flag = FALSE;
|
||
|
||
//将数据发送至上位机
|
||
HAL_UART_Transmit_DMA(&huart2, scom2_rs485.tx_buff, scom2_rs485.tx_len);
|
||
}
|
||
|
||
//清空缓存区,等待新的数据
|
||
memset(scom1_hart.rx_buff, 0, scom1_hart.rx_len);
|
||
scom1_hart.rx_len = 0;
|
||
}
|
||
}
|
||
|
||
void trans_pc2hart(void)
|
||
{
|
||
if (scom2_rs485.rx_flag == TRUE)
|
||
{
|
||
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))
|
||
{
|
||
//接收到的数据是否符合HART数据报,符合则写入HART的tx,准备发送至HART设备
|
||
memcpy(scom1_hart.tx_buff, scom2_rs485.rx_buff, scom2_rs485.rx_len);
|
||
scom1_hart.tx_len = scom2_rs485.rx_len;
|
||
scom1_hart.tx_flag = TRUE;
|
||
}
|
||
|
||
//来自上位机的数据是否准备完毕
|
||
if (scom1_hart.tx_flag == TRUE)
|
||
{
|
||
scom1_hart.tx_flag = FALSE;
|
||
HART_RTS(RTS_ON);
|
||
|
||
wu_delay_us(10000);
|
||
|
||
//将tx中的数据发送至HART设备
|
||
HAL_UART_Transmit_DMA(&huart1, scom1_hart.tx_buff, scom1_hart.tx_len);
|
||
|
||
}
|
||
|
||
//清空缓存区,等待新的数据
|
||
memset(scom2_rs485.rx_buff, 0, scom2_rs485.rx_len);
|
||
scom2_rs485.rx_len = 0;
|
||
}
|
||
}
|
||
|
||
void trans_ble2pc(void)
|
||
{
|
||
if( ble_init() == 0 ) return;
|
||
|
||
if (scom6_ble.rx_flag == TRUE)
|
||
{
|
||
scom6_ble.rx_flag = FALSE;
|
||
|
||
//将接收到的数据存入485的tx,准备发送至上位机
|
||
memcpy(scom2_rs485.tx_buff, scom6_ble.rx_buff, scom6_ble.rx_len);
|
||
scom2_rs485.tx_len = scom6_ble.rx_len;
|
||
scom2_rs485.tx_flag = TRUE;
|
||
|
||
if(scom2_rs485.tx_flag == TRUE)
|
||
{
|
||
scom2_rs485.tx_flag = FALSE;
|
||
|
||
//将数据发送至上位机
|
||
HAL_UART_Transmit_DMA(&huart2, scom2_rs485.tx_buff, scom2_rs485.tx_len);
|
||
}
|
||
|
||
//清空缓存区,等待新的数据
|
||
memset(scom6_ble.rx_buff, 0, scom6_ble.rx_len);
|
||
scom6_ble.rx_len = 0;
|
||
}
|
||
}
|
||
|
||
void trans_pc2ble(void)
|
||
{
|
||
if (scom2_rs485.rx_flag == TRUE)
|
||
{
|
||
scom2_rs485.rx_flag = FALSE;
|
||
|
||
//将接收到的数据存入BLE的tx,准备发送至蓝牙设备
|
||
memcpy(scom6_ble.tx_buff, scom2_rs485.rx_buff, scom2_rs485.rx_len);
|
||
scom6_ble.tx_len = scom2_rs485.rx_len;
|
||
scom6_ble.tx_flag = TRUE;
|
||
|
||
//来自上位机的数据是否准备完毕
|
||
if (scom6_ble.tx_flag == TRUE)
|
||
{
|
||
scom6_ble.tx_flag = FALSE;
|
||
|
||
//将tx中的数据发送至蓝牙设备
|
||
HAL_UART_Transmit_DMA(&huart6, scom6_ble.tx_buff, scom6_ble.tx_len);
|
||
}
|
||
|
||
//清空缓存区,等待新的数据
|
||
memset(scom2_rs485.rx_buff, 0, scom2_rs485.rx_len);
|
||
scom2_rs485.rx_len = 0;
|
||
}
|
||
}
|
||
|
||
void trans_modbus_pc2sig(void)
|
||
{
|
||
if (scom2_rs485.rx_flag == TRUE)
|
||
{
|
||
scom2_rs485.rx_flag = FALSE;
|
||
|
||
modbus_process_rtu();
|
||
|
||
if(scom2_rs485.tx_flag == TRUE)
|
||
{
|
||
scom2_rs485.tx_flag = FALSE;
|
||
|
||
//将数据发送至上位机
|
||
HAL_UART_Transmit_DMA(&huart2, scom2_rs485.tx_buff, scom2_rs485.tx_len);
|
||
}
|
||
|
||
//清空缓存区,等待新的数据
|
||
memset(scom2_rs485.rx_buff, 0, scom2_rs485.rx_len);
|
||
scom2_rs485.rx_len = 0;
|
||
}
|
||
}
|
||
|
||
uint8_t sig2slave_step = 0;
|
||
uint8_t sig2slave_data_length_total = 0;
|
||
uint8_t buffer_size_temp = BUFFER_SIZE;
|
||
void trans_modbus_sig2slave(void)
|
||
{
|
||
if (scom2_rs485.rx_flag == TRUE)
|
||
{
|
||
scom2_rs485.rx_flag = FALSE;
|
||
|
||
switch (sig2slave_step)
|
||
{
|
||
case 0:
|
||
{
|
||
//进入此处说明已经接收完成一部分数据,重新开始超时计时,发送标志复位
|
||
mod_master.tx_flag = TX_NONE;
|
||
sig2slave_current_tick = 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:
|
||
{
|
||
if(mod_master.rx_error_message != RX_ERROR_TIMEOUT)
|
||
{
|
||
//进入此处说明收到了数据,并且超时计时期间内未收到新的数据
|
||
modbus_rtu_master_analysis();
|
||
}
|
||
else
|
||
{
|
||
strcpy(mod_master.result_display, "ERROR: TIMEOUT");
|
||
}
|
||
//在屏幕上显示 mod_master.result_display 字符串
|
||
lv_label_set_text(guider_ui.screen_modbus_trx_value_Rx, mod_master.result_display);
|
||
|
||
//数据传输状态复位
|
||
sig2slave_step = 0;
|
||
sig_trans = TRANS_NONE;
|
||
|
||
//数据处理完成后,情况接收数据
|
||
memset(scom2_rs485.rx_buff, 0, scom2_rs485.rx_len);
|
||
scom2_rs485.rx_len = 0;
|
||
|
||
//DMA连续接收参数复位
|
||
sig2slave_data_length_total = 0;
|
||
buffer_size_temp = BUFFER_SIZE;
|
||
|
||
HAL_UART_Receive_DMA(&huart2, scom2_rs485.rx_buff, BUFFER_SIZE);
|
||
}
|
||
break;
|
||
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
uint8_t trans_enable_check(st_scom *scom)
|
||
{
|
||
uint8_t result = 0;
|
||
|
||
if( scom == &scom1_hart )
|
||
{
|
||
if(tabdata.hart_enable)
|
||
{
|
||
result = 1;
|
||
sig_trans = TRANS_HART_TO_PC;
|
||
}
|
||
}
|
||
|
||
if( scom == &scom6_ble )
|
||
{
|
||
if(tabdata.bluetooth_enable)
|
||
{
|
||
result = 1;
|
||
sig_trans = TRANS_BLE_TO_PC;
|
||
}
|
||
}
|
||
|
||
if( scom == &scom2_rs485 )
|
||
{
|
||
if(tabdata.hart_enable)
|
||
{
|
||
result = 1;
|
||
sig_trans = TRANS_PC_TO_HART;
|
||
}
|
||
else if(tabdata.bluetooth_enable)
|
||
{
|
||
result = 1;
|
||
sig_trans = TRANS_PC_TO_BLE;
|
||
}
|
||
else if(tabdata.modbus_enable)
|
||
{
|
||
result = 1;
|
||
|
||
switch (tabdata.modbus_type)
|
||
{
|
||
case SIG_SLAVE:
|
||
{
|
||
sig_trans = TRANS_MODBUS_PC_TO_SIG;
|
||
}
|
||
break;
|
||
|
||
case SIG_MASTER:
|
||
{
|
||
sig_trans = TRANS_MODBUS_SIG_TO_SLAVE;
|
||
}
|
||
break;
|
||
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
return result;
|
||
}
|
||
|
||
|