存档:Modbus主站功能基本完成
This commit is contained in:
parent
886a6da466
commit
d187e0de5e
|
@ -49,9 +49,6 @@ void main_data_init(void);
|
||||||
//绘图数据初始化
|
//绘图数据初始化
|
||||||
void plot_data_init(void);
|
void plot_data_init(void);
|
||||||
|
|
||||||
//界面复位
|
|
||||||
void menu_reset(void);
|
|
||||||
|
|
||||||
//开机动画
|
//开机动画
|
||||||
void scr_init_run(void);
|
void scr_init_run(void);
|
||||||
|
|
||||||
|
|
|
@ -88,48 +88,6 @@ void plot_data_init(void)
|
||||||
pltdata.yreal_scd_value_prv = 0; //前一时刻的输入测量值
|
pltdata.yreal_scd_value_prv = 0; //前一时刻的输入测量值
|
||||||
}
|
}
|
||||||
|
|
||||||
void menu_reset(void)
|
|
||||||
{
|
|
||||||
//界面复位
|
|
||||||
if(menu_data.scr_now == SCREEN_INIT)
|
|
||||||
{
|
|
||||||
//如果正处于开机动画中,立即返回。
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//加载初始界面
|
|
||||||
setup_scr_screen_init(&guider_ui);
|
|
||||||
scr_main_recover();
|
|
||||||
|
|
||||||
delay_cnt(200);
|
|
||||||
|
|
||||||
lv_scr_load(guider_ui.screen_init);
|
|
||||||
|
|
||||||
//释放内存
|
|
||||||
switch (menu_data.scr_now)
|
|
||||||
{
|
|
||||||
case SCREEN_MAIN:
|
|
||||||
{
|
|
||||||
lv_obj_add_flag(guider_ui.screen_main, LV_OBJ_FLAG_HIDDEN);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SCREEN_SETTING:
|
|
||||||
{
|
|
||||||
lv_obj_add_flag(guider_ui.screen_setting, LV_OBJ_FLAG_HIDDEN);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
//参数复位,内部会对menu_data.scr_now进行更改,因此放置于最后。
|
|
||||||
screen_data_init();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
uint8_t init_step = 0;
|
uint8_t init_step = 0;
|
||||||
uint8_t scr_main_set_flag = 0;
|
uint8_t scr_main_set_flag = 0;
|
||||||
void scr_init_run(void)
|
void scr_init_run(void)
|
||||||
|
@ -176,9 +134,8 @@ void scr_init_run(void)
|
||||||
lv_scr_load(guider_ui.screen_main);
|
lv_scr_load(guider_ui.screen_main);
|
||||||
scr_main_recover();
|
scr_main_recover();
|
||||||
|
|
||||||
//开机动画结束后,隐藏初始界面
|
//开机动画结束后,删除界面对象,异步删除,更加安全
|
||||||
//lv_obj_add_flag(guider_ui.screen_init, LV_OBJ_FLAG_HIDDEN);
|
lv_obj_del_async(guider_ui.screen_init);
|
||||||
lv_obj_del_async(guider_ui.screen_init); //异步删除,更加安全
|
|
||||||
|
|
||||||
init_step = 3;
|
init_step = 3;
|
||||||
}
|
}
|
||||||
|
|
|
@ -382,8 +382,6 @@ void trx_window_init(void)
|
||||||
lvobj_window_trx_nums[30] = guider_ui.screen_modbus_trx_num_36;
|
lvobj_window_trx_nums[30] = guider_ui.screen_modbus_trx_num_36;
|
||||||
lvobj_window_trx_nums[31] = guider_ui.screen_modbus_trx_num_37;
|
lvobj_window_trx_nums[31] = guider_ui.screen_modbus_trx_num_37;
|
||||||
|
|
||||||
memset(window_trx_num, 16, sizeof(window_trx_num));
|
|
||||||
|
|
||||||
char str_temp[8];
|
char str_temp[8];
|
||||||
for(uint8_t i = 0; i < 32; i++)
|
for(uint8_t i = 0; i < 32; i++)
|
||||||
{
|
{
|
||||||
|
|
|
@ -150,16 +150,6 @@ void physical_quantity_init(void)
|
||||||
|
|
||||||
void screen_run(void)
|
void screen_run(void)
|
||||||
{
|
{
|
||||||
//手动触发显示内容复位
|
|
||||||
if(menu_data.menu_reset_flag)
|
|
||||||
{
|
|
||||||
menu_reset();
|
|
||||||
|
|
||||||
menu_data.menu_reset_flag = 0;
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(menu_data.scr_init_flag == 0)
|
if(menu_data.scr_init_flag == 0)
|
||||||
{
|
{
|
||||||
//未播放过开机动画的情况下,播放开机动画
|
//未播放过开机动画的情况下,播放开机动画
|
||||||
|
|
|
@ -583,12 +583,12 @@ void key_functions_modbus(void)
|
||||||
{
|
{
|
||||||
lv_obj_clear_flag(guider_ui.screen_modbus_trx_window_data, LV_OBJ_FLAG_HIDDEN);
|
lv_obj_clear_flag(guider_ui.screen_modbus_trx_window_data, LV_OBJ_FLAG_HIDDEN);
|
||||||
|
|
||||||
|
trx_window_init();
|
||||||
|
|
||||||
window_trx_cursor = 0;
|
window_trx_cursor = 0;
|
||||||
window_trx_cursor_prv = 99;
|
window_trx_cursor_prv = 99;
|
||||||
trx_window_num_check(window_trx_cursor, window_trx_cursor_prv);
|
trx_window_num_check(window_trx_cursor, window_trx_cursor_prv);
|
||||||
|
|
||||||
trx_window_init();
|
|
||||||
|
|
||||||
current_operation = MODBUS_MASTER_TRX_MODIFY;
|
current_operation = MODBUS_MASTER_TRX_MODIFY;
|
||||||
key_config_update(current_operation);
|
key_config_update(current_operation);
|
||||||
}
|
}
|
||||||
|
@ -684,6 +684,14 @@ void key_functions_modbus(void)
|
||||||
{
|
{
|
||||||
case MODBUS_MASTER_CONFIG:
|
case MODBUS_MASTER_CONFIG:
|
||||||
{
|
{
|
||||||
|
//直接删除收发界面的内容
|
||||||
|
if(mod_trx_set_flag)
|
||||||
|
{
|
||||||
|
//加载过的情况下才能删除,否则会进入硬件错误中断
|
||||||
|
mod_trx_set_flag = 0;
|
||||||
|
lv_obj_del(guider_ui.screen_modbus_trx);
|
||||||
|
}
|
||||||
|
|
||||||
//加载设置界面的内容
|
//加载设置界面的内容
|
||||||
setup_scr_screen_setting(&guider_ui);
|
setup_scr_screen_setting(&guider_ui);
|
||||||
scr_setting_recover();
|
scr_setting_recover();
|
||||||
|
@ -691,14 +699,8 @@ void key_functions_modbus(void)
|
||||||
|
|
||||||
lv_scr_load(guider_ui.screen_setting); //加载菜单界面
|
lv_scr_load(guider_ui.screen_setting); //加载菜单界面
|
||||||
|
|
||||||
//删除modbus的相关内容,释放内存
|
//异步删除modbus配置的相关内容,释放内存
|
||||||
lv_obj_del_async(guider_ui.screen_modbus_config);
|
lv_obj_del_async(guider_ui.screen_modbus_config);
|
||||||
if(mod_trx_set_flag)
|
|
||||||
{
|
|
||||||
//加载过的情况下才能删除,否则会进入硬件错误中断
|
|
||||||
mod_trx_set_flag = 0;
|
|
||||||
lv_obj_del_async(guider_ui.screen_modbus_trx);
|
|
||||||
}
|
|
||||||
|
|
||||||
menu_data.scr_now = SCREEN_SETTING;
|
menu_data.scr_now = SCREEN_SETTING;
|
||||||
|
|
||||||
|
|
|
@ -541,14 +541,23 @@ void key_functions_setting(void)
|
||||||
}
|
}
|
||||||
else if( tabdata.modbus_type == SIG_MASTER)
|
else if( tabdata.modbus_type == SIG_MASTER)
|
||||||
{
|
{
|
||||||
|
//【主界面, 设置界面】共用一块内存空间,两者之间通过隐藏&显示切换
|
||||||
|
//【Modbus主站配置界面, Modbus主站收发界面】共用一块内存空间,两者之间通过隐藏&显示切换
|
||||||
|
//设置界面 -> Modbus主站配置界面时,立即删除主界面对象,异步删除设置界面,加载配置界面,切换至收发界面时再加载收发界面对象
|
||||||
|
//设置界面 <- Modbus主站配置界面时,立即删除收发界面对象,异步删除配置界面,加载设置界面,切换至主界面时再加载主界面对象
|
||||||
|
|
||||||
tabdata.content_focus = 0;
|
tabdata.content_focus = 0;
|
||||||
lv_obj_set_style_bg_color(guider_ui.screen_setting_label_31, lv_color_hex(COLOR_ITEMS_UNCHECKED), LV_PART_MAIN|LV_STATE_DEFAULT);
|
lv_obj_set_style_bg_color(guider_ui.screen_setting_label_31, lv_color_hex(COLOR_ITEMS_UNCHECKED), LV_PART_MAIN|LV_STATE_DEFAULT);
|
||||||
|
|
||||||
//跳转至modbus配置界面
|
//立即删除主界面的相关内容,释放内存
|
||||||
current_operation = MODBUS_MASTER_CONFIG;
|
if(scr_main_set_flag)
|
||||||
key_config_update(current_operation);
|
{
|
||||||
|
//加载过的情况下才能删除,否则会进入硬件错误中断。
|
||||||
|
scr_main_set_flag = 0;
|
||||||
|
lv_obj_del(guider_ui.screen_main);
|
||||||
|
}
|
||||||
|
|
||||||
//设置modbus配置界面和收发界面的内容
|
//设置modbus配置界面的内容
|
||||||
setup_scr_screen_modbus_config(&guider_ui);
|
setup_scr_screen_modbus_config(&guider_ui);
|
||||||
scr_modbus_config_recover();
|
scr_modbus_config_recover();
|
||||||
delay_cnt(200); //不加延时有概率卡死
|
delay_cnt(200); //不加延时有概率卡死
|
||||||
|
@ -557,14 +566,12 @@ void key_functions_setting(void)
|
||||||
|
|
||||||
menu_data.scr_now = SCREEN_MODBUS_MASTER_CONFIG;
|
menu_data.scr_now = SCREEN_MODBUS_MASTER_CONFIG;
|
||||||
|
|
||||||
//删除主界面和设置界面的相关内容,释放内存
|
//异步删除设置界面,更加安全
|
||||||
if(scr_main_set_flag)
|
lv_obj_del_async(guider_ui.screen_setting);
|
||||||
{
|
|
||||||
//加载过的情况下才能删除,否则会进入硬件错误中断
|
//当前操作变更为MODBUS主站配置
|
||||||
scr_main_set_flag = 0;
|
current_operation = MODBUS_MASTER_CONFIG;
|
||||||
lv_obj_del_async(guider_ui.screen_main); //异步删除,更加安全
|
key_config_update(current_operation);
|
||||||
}
|
|
||||||
lv_obj_del_async(guider_ui.screen_setting); //异步删除,更加安全
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -18,6 +18,7 @@ void duty_tim3(void)
|
||||||
freq_signal.over_cnt++;
|
freq_signal.over_cnt++;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void duty_tim6(void)
|
void duty_tim6(void)
|
||||||
{
|
{
|
||||||
//lv_tick_inc(1);
|
//lv_tick_inc(1);
|
||||||
|
@ -83,6 +84,90 @@ void duty_tim6(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
|
||||||
|
{
|
||||||
|
//记录发送完成的时间点
|
||||||
|
st_flag = TRANSPARENT_TRANSMIT_END;
|
||||||
|
tick_end = xTaskGetTickCountFromISR();
|
||||||
|
|
||||||
|
//计算延迟,捕获失败时清零(速度过快,小于1ms)
|
||||||
|
//trans_log_rx = tick_middle - tick_start;
|
||||||
|
//if(trans_log_rx > 1000) trans_log_rx = 0;
|
||||||
|
trans_log_tx = tick_end - tick_middle;
|
||||||
|
if(trans_log_tx > 1000) trans_log_tx = 0;
|
||||||
|
|
||||||
|
//发送完成后将相关数组清零
|
||||||
|
if(huart == &huart1)
|
||||||
|
{
|
||||||
|
//HART重新使能接收
|
||||||
|
HART_RTS(RTS_OFF);
|
||||||
|
|
||||||
|
memset(scom1_hart.tx_buff, 0, scom1_hart.tx_len);
|
||||||
|
scom1_hart.tx_len = 0;
|
||||||
|
|
||||||
|
//PC--->SIG--->HART,重新开启485的DMA
|
||||||
|
HAL_UART_Receive_DMA(&huart2, scom2_rs485.rx_buff, BUFFER_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(huart == &huart2)
|
||||||
|
{
|
||||||
|
memset(scom2_rs485.tx_buff, 0, scom2_rs485.tx_len);
|
||||||
|
scom2_rs485.tx_len = 0;
|
||||||
|
|
||||||
|
//开启对应的DMA
|
||||||
|
switch (sig_trans)
|
||||||
|
{
|
||||||
|
case TRANS_HART_TO_PC:
|
||||||
|
{
|
||||||
|
HAL_UART_Receive_DMA(&huart1, scom1_hart.rx_buff, BUFFER_SIZE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TRANS_BLE_TO_PC:
|
||||||
|
{
|
||||||
|
HAL_UART_Receive_DMA(&huart6, scom6_ble.rx_buff, BUFFER_SIZE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TRANS_MODBUS_PC_TO_SIG:
|
||||||
|
{
|
||||||
|
HAL_UART_Receive_DMA(&huart2, scom2_rs485.rx_buff, BUFFER_SIZE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TRANS_MODBUS_SIG_TO_SLAVE:
|
||||||
|
{
|
||||||
|
mod_master.tx_flag = TX_OK;
|
||||||
|
HAL_UART_Receive_DMA(&huart2, scom2_rs485.rx_buff, BUFFER_SIZE);
|
||||||
|
sig2slave_current_tick = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(huart == &huart6)
|
||||||
|
{
|
||||||
|
memset(scom6_ble.tx_buff, 0, scom6_ble.tx_len);
|
||||||
|
scom6_ble.tx_len = 0;
|
||||||
|
|
||||||
|
//PC--->SIG--->BLE,重新开启485的DMA
|
||||||
|
HAL_UART_Receive_DMA(&huart2, scom2_rs485.rx_buff, BUFFER_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
//通讯模式清空,等待下一次接收
|
||||||
|
sig_trans = TRANS_NONE;
|
||||||
|
|
||||||
|
//如果显示任务被挂起,则在此处释放(无DMA的情况)
|
||||||
|
if(screen_suspend_flag)
|
||||||
|
{
|
||||||
|
xTaskResumeFromISR(task_lcdHandle);
|
||||||
|
xTaskResumeFromISR(task_menuHandle);
|
||||||
|
screen_suspend_flag = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void delay_cnt(uint16_t cnt)
|
void delay_cnt(uint16_t cnt)
|
||||||
{
|
{
|
||||||
|
|
|
@ -22,7 +22,10 @@ typedef enum
|
||||||
RX_ERROR_OVERFLOW, //接收到的数据超出缓存区
|
RX_ERROR_OVERFLOW, //接收到的数据超出缓存区
|
||||||
RX_ERROR_WRONG_ID, //接收到的设备ID与目标ID不符
|
RX_ERROR_WRONG_ID, //接收到的设备ID与目标ID不符
|
||||||
RX_ERROR_WRONG_LENGTH, //数据长度不符
|
RX_ERROR_WRONG_LENGTH, //数据长度不符
|
||||||
RX_ERROR_WRONG_CMD //命令无效
|
RX_ERROR_INVALID_CMD, //命令字无效,不存在
|
||||||
|
RX_EEROR_WRONG_CMD, //应答的命令字与发送的不符
|
||||||
|
RX_ERROR_WRONG_DATA, //应答的数据与写入的不符
|
||||||
|
RX_ERROR_WRONG_NUM //应答的寄存器数量与发送的不符
|
||||||
}ERROR_NESSAGE_RX;
|
}ERROR_NESSAGE_RX;
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
#include "modbus_rtu.h"
|
#include "modbus_rtu.h"
|
||||||
|
|
||||||
uint8_t CoilState[(MAX_COIL_NUM + 7) / 8] = {0x00,0x00,0x00,0x00,0x00}; //线圈寄存器
|
uint8_t CoilState[(MAX_COIL_NUM + 7) / 8] = {0}; //线圈寄存器
|
||||||
uint8_t DisState[(MAX_DIS_NUM + 7) / 8] = {0x00,0x00,0x00,0x00,0x00,0x00}; //离散量寄存器
|
uint8_t DisState[(MAX_DIS_NUM + 7) / 8] = {0}; //离散量寄存器
|
||||||
uint16_t InputReg[MAX_INPUT_REG_NUM] = {0x0000,0x0000,0x0000,0x0000}; //输入寄存器
|
uint16_t InputReg[MAX_INPUT_REG_NUM] = {0}; //输入寄存器
|
||||||
uint16_t HoldReg[MAX_HOLD_REG_NUM] = {0, 0,0,0x00C8}; //保持寄存器
|
uint16_t HoldReg[MAX_HOLD_REG_NUM] = {0}; //保持寄存器
|
||||||
|
|
||||||
Var_Reg SamVarReg;
|
Var_Reg SamVarReg;
|
||||||
eMBException ex_message = MB_EX_NONE; //从设备返回的异常信息
|
eMBException ex_message = MB_EX_NONE; //从设备返回的异常信息
|
||||||
|
|
|
@ -21,13 +21,17 @@ void modbus_rtu_master_init(void)
|
||||||
mod_master.rx_flag = RX_NONE;
|
mod_master.rx_flag = RX_NONE;
|
||||||
mod_master.tx_flag = TX_NONE;
|
mod_master.tx_flag = TX_NONE;
|
||||||
memset(mod_master.result_display, 0, sizeof(mod_master.result_display));
|
memset(mod_master.result_display, 0, sizeof(mod_master.result_display));
|
||||||
|
|
||||||
|
memset(window_trx_num, 16, sizeof(window_trx_num));
|
||||||
}
|
}
|
||||||
|
|
||||||
void modbus_rtu_master_load(void)
|
void modbus_rtu_master_load(void)
|
||||||
{
|
{
|
||||||
|
//先清空之前的发送数据
|
||||||
|
memset(mod_master.data_tx, 0, sizeof(mod_master.data_tx));
|
||||||
|
|
||||||
mod_master.data_tx[0] = mod_master.target_id;
|
mod_master.data_tx[0] = mod_master.target_id;
|
||||||
mod_master.data_tx[1] = mod_master.command_code;
|
mod_master.data_tx[1] = mod_master.command_code;
|
||||||
memset(mod_master.data_rx, 0, sizeof(mod_master.data_rx));
|
|
||||||
mod_master.tx_error_message = TX_ERROR_NONE;
|
mod_master.tx_error_message = TX_ERROR_NONE;
|
||||||
|
|
||||||
switch (mod_master.data_tx[1])
|
switch (mod_master.data_tx[1])
|
||||||
|
@ -173,6 +177,11 @@ void modbus_rtu_master_load(void)
|
||||||
|
|
||||||
void modbus_rtu_master_send(void)
|
void modbus_rtu_master_send(void)
|
||||||
{
|
{
|
||||||
|
//先清空之间的接收数据与显示内容
|
||||||
|
memset(mod_master.data_rx, 0, sizeof(mod_master.data_rx));
|
||||||
|
memset(mod_master.result_display, 0, sizeof(mod_master.result_display));
|
||||||
|
lv_label_set_text(guider_ui.screen_modbus_trx_value_Rx, "");
|
||||||
|
|
||||||
if(mod_master.tx_error_message == TX_ERROR_NONE)
|
if(mod_master.tx_error_message == TX_ERROR_NONE)
|
||||||
{
|
{
|
||||||
mod_master.rx_flag = TX_WAITING;
|
mod_master.rx_flag = TX_WAITING;
|
||||||
|
@ -218,6 +227,14 @@ void modbus_rtu_master_analysis(void)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//返回的命令字与发送的命令字是否一致
|
||||||
|
if(mod_master.data_rx[1] != mod_master.command_code)
|
||||||
|
{
|
||||||
|
mod_master.rx_error_message = RX_EEROR_WRONG_CMD;
|
||||||
|
strcpy(mod_master.result_display, "ERROR: WRONG COMMAND");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
//收到的是异常响应
|
//收到的是异常响应
|
||||||
if(mod_master.data_rx[1] > 0x80)
|
if(mod_master.data_rx[1] > 0x80)
|
||||||
{
|
{
|
||||||
|
@ -242,6 +259,7 @@ void modbus_rtu_master_data_process(void)
|
||||||
//【从站地址】【功能码】【返回字节数n】【字节1~n】【CRC16校验低】【CRC16校验高】
|
//【从站地址】【功能码】【返回字节数n】【字节1~n】【CRC16校验低】【CRC16校验高】
|
||||||
case ReadCoilState:
|
case ReadCoilState:
|
||||||
{
|
{
|
||||||
|
//应答数据报的长度是否正确
|
||||||
if( mod_master.data_rx_len != (mod_master.data_rx[2] + 5) )
|
if( mod_master.data_rx_len != (mod_master.data_rx[2] + 5) )
|
||||||
{
|
{
|
||||||
mod_master.rx_error_message = RX_ERROR_WRONG_LENGTH;
|
mod_master.rx_error_message = RX_ERROR_WRONG_LENGTH;
|
||||||
|
@ -263,6 +281,7 @@ void modbus_rtu_master_data_process(void)
|
||||||
//【从站地址】【功能码】【返回字节数n】【字节1~n】【CRC16校验低】【CRC16校验高】
|
//【从站地址】【功能码】【返回字节数n】【字节1~n】【CRC16校验低】【CRC16校验高】
|
||||||
case ReadDisInputState:
|
case ReadDisInputState:
|
||||||
{
|
{
|
||||||
|
//应答数据报的长度是否正确
|
||||||
if( mod_master.data_rx_len != (mod_master.data_rx[2] + 5) )
|
if( mod_master.data_rx_len != (mod_master.data_rx[2] + 5) )
|
||||||
{
|
{
|
||||||
mod_master.rx_error_message = RX_ERROR_WRONG_LENGTH;
|
mod_master.rx_error_message = RX_ERROR_WRONG_LENGTH;
|
||||||
|
@ -284,6 +303,7 @@ void modbus_rtu_master_data_process(void)
|
||||||
//【从站地址】【功能码】【返回字节数】【字1~n高】【字1~n低】【CRC16校验低】【CRC16校验高】
|
//【从站地址】【功能码】【返回字节数】【字1~n高】【字1~n低】【CRC16校验低】【CRC16校验高】
|
||||||
case ReadHoldReg:
|
case ReadHoldReg:
|
||||||
{
|
{
|
||||||
|
//应答数据报的长度是否正确
|
||||||
if( mod_master.data_rx_len != (mod_master.data_rx[2] + 5) )
|
if( mod_master.data_rx_len != (mod_master.data_rx[2] + 5) )
|
||||||
{
|
{
|
||||||
mod_master.rx_error_message = RX_ERROR_WRONG_LENGTH;
|
mod_master.rx_error_message = RX_ERROR_WRONG_LENGTH;
|
||||||
|
@ -305,6 +325,7 @@ void modbus_rtu_master_data_process(void)
|
||||||
//【从站地址】【功能码】【返回字节数】【字1~n高】【字1~n低】【CRC16校验低】【CRC16校验高】
|
//【从站地址】【功能码】【返回字节数】【字1~n高】【字1~n低】【CRC16校验低】【CRC16校验高】
|
||||||
case ReadInputReg:
|
case ReadInputReg:
|
||||||
{
|
{
|
||||||
|
//应答数据报的长度是否正确
|
||||||
if( mod_master.data_rx_len != (mod_master.data_rx[2] + 5) )
|
if( mod_master.data_rx_len != (mod_master.data_rx[2] + 5) )
|
||||||
{
|
{
|
||||||
mod_master.rx_error_message = RX_ERROR_WRONG_LENGTH;
|
mod_master.rx_error_message = RX_ERROR_WRONG_LENGTH;
|
||||||
|
@ -326,6 +347,7 @@ void modbus_rtu_master_data_process(void)
|
||||||
//【从站地址】【功能码】【地址高】【地址低】【标志位高】【标志位低】【CRC16校验低】【CRC16校验高】
|
//【从站地址】【功能码】【地址高】【地址低】【标志位高】【标志位低】【CRC16校验低】【CRC16校验高】
|
||||||
case WriteSingleCoil:
|
case WriteSingleCoil:
|
||||||
{
|
{
|
||||||
|
//应答数据报的长度是否正确
|
||||||
if( mod_master.data_rx_len != 8 )
|
if( mod_master.data_rx_len != 8 )
|
||||||
{
|
{
|
||||||
mod_master.rx_error_message = RX_ERROR_WRONG_LENGTH;
|
mod_master.rx_error_message = RX_ERROR_WRONG_LENGTH;
|
||||||
|
@ -333,6 +355,14 @@ void modbus_rtu_master_data_process(void)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//应答数据报的标志位是否与发送的一致
|
||||||
|
if( (mod_master.data_rx[4] != mod_master.data_tx[4])||(mod_master.data_rx[5] != mod_master.data_tx[5]) )
|
||||||
|
{
|
||||||
|
mod_master.rx_error_message = RX_ERROR_WRONG_DATA;
|
||||||
|
strcpy(mod_master.result_display, "ERROR: WRONG DATA");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
//数据解析
|
//数据解析
|
||||||
sprintf(mod_master.result_display, "Address:0x%02x Command:0x%02x CoilAddress:0x%02x%02x Bits:0x%02x%02x", mod_master.data_rx[0], mod_master.data_rx[1], mod_master.data_rx[2], mod_master.data_rx[3], mod_master.data_rx[4], mod_master.data_rx[5]);
|
sprintf(mod_master.result_display, "Address:0x%02x Command:0x%02x CoilAddress:0x%02x%02x Bits:0x%02x%02x", mod_master.data_rx[0], mod_master.data_rx[1], mod_master.data_rx[2], mod_master.data_rx[3], mod_master.data_rx[4], mod_master.data_rx[5]);
|
||||||
}
|
}
|
||||||
|
@ -341,6 +371,7 @@ void modbus_rtu_master_data_process(void)
|
||||||
//【从站地址】【功能码】【地址高】【地址低】【数据高】【数据低】【CRC16校验低】【CRC16校验高】
|
//【从站地址】【功能码】【地址高】【地址低】【数据高】【数据低】【CRC16校验低】【CRC16校验高】
|
||||||
case WriteSingleReg:
|
case WriteSingleReg:
|
||||||
{
|
{
|
||||||
|
//应答数据报的长度是否正确
|
||||||
if( mod_master.data_rx_len != 8 )
|
if( mod_master.data_rx_len != 8 )
|
||||||
{
|
{
|
||||||
mod_master.rx_error_message = RX_ERROR_WRONG_LENGTH;
|
mod_master.rx_error_message = RX_ERROR_WRONG_LENGTH;
|
||||||
|
@ -348,6 +379,14 @@ void modbus_rtu_master_data_process(void)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//应答数据报的数据是否与发送的一致
|
||||||
|
if( (mod_master.data_rx[4] != mod_master.data_tx[4])||(mod_master.data_rx[5] != mod_master.data_tx[5]) )
|
||||||
|
{
|
||||||
|
mod_master.rx_error_message = RX_ERROR_WRONG_DATA;
|
||||||
|
strcpy(mod_master.result_display, "ERROR: WRONG DATA");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
//数据解析
|
//数据解析
|
||||||
sprintf(mod_master.result_display, "Address:0x%02x Command:0x%02x RegAddress:0x%02x%02x Data:0x%02x%02x", mod_master.data_rx[0], mod_master.data_rx[1], mod_master.data_rx[2], mod_master.data_rx[3], mod_master.data_rx[4], mod_master.data_rx[5]);
|
sprintf(mod_master.result_display, "Address:0x%02x Command:0x%02x RegAddress:0x%02x%02x Data:0x%02x%02x", mod_master.data_rx[0], mod_master.data_rx[1], mod_master.data_rx[2], mod_master.data_rx[3], mod_master.data_rx[4], mod_master.data_rx[5]);
|
||||||
}
|
}
|
||||||
|
@ -356,6 +395,7 @@ void modbus_rtu_master_data_process(void)
|
||||||
//【从站地址】【功能码】【地址高】【地址低】【数量高】【数量低】【CRC16校验低】【CRC16校验高】
|
//【从站地址】【功能码】【地址高】【地址低】【数量高】【数量低】【CRC16校验低】【CRC16校验高】
|
||||||
case WriteMultiCoil:
|
case WriteMultiCoil:
|
||||||
{
|
{
|
||||||
|
//应答数据报的长度是否正确
|
||||||
if( mod_master.data_rx_len != 8 )
|
if( mod_master.data_rx_len != 8 )
|
||||||
{
|
{
|
||||||
mod_master.rx_error_message = RX_ERROR_WRONG_LENGTH;
|
mod_master.rx_error_message = RX_ERROR_WRONG_LENGTH;
|
||||||
|
@ -363,6 +403,14 @@ void modbus_rtu_master_data_process(void)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//应答数据报的寄存器数量是否与发送的一致
|
||||||
|
if( (mod_master.data_rx[4] != mod_master.data_tx[4])||(mod_master.data_rx[5] != mod_master.data_tx[5]) )
|
||||||
|
{
|
||||||
|
mod_master.rx_error_message = RX_ERROR_WRONG_NUM;
|
||||||
|
strcpy(mod_master.result_display, "ERROR: WRONG NUMBER OF REGISTERS");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
//数据解析
|
//数据解析
|
||||||
sprintf(mod_master.result_display, "Address:0x%02x Command:0x%02x CoilAddress:0x%02x%02x Num:0x%02x%02x", mod_master.data_rx[0], mod_master.data_rx[1], mod_master.data_rx[2], mod_master.data_rx[3], mod_master.data_rx[4], mod_master.data_rx[5]);
|
sprintf(mod_master.result_display, "Address:0x%02x Command:0x%02x CoilAddress:0x%02x%02x Num:0x%02x%02x", mod_master.data_rx[0], mod_master.data_rx[1], mod_master.data_rx[2], mod_master.data_rx[3], mod_master.data_rx[4], mod_master.data_rx[5]);
|
||||||
}
|
}
|
||||||
|
@ -371,6 +419,7 @@ void modbus_rtu_master_data_process(void)
|
||||||
//【从站地址】【功能码】【地址高】【地址低】【数量高】【数量低】【CRC16校验低】【CRC16校验高】
|
//【从站地址】【功能码】【地址高】【地址低】【数量高】【数量低】【CRC16校验低】【CRC16校验高】
|
||||||
case WriteMultiReg:
|
case WriteMultiReg:
|
||||||
{
|
{
|
||||||
|
//应答数据报的长度是否正确
|
||||||
if( mod_master.data_rx_len != 8 )
|
if( mod_master.data_rx_len != 8 )
|
||||||
{
|
{
|
||||||
mod_master.rx_error_message = RX_ERROR_WRONG_LENGTH;
|
mod_master.rx_error_message = RX_ERROR_WRONG_LENGTH;
|
||||||
|
@ -378,6 +427,14 @@ void modbus_rtu_master_data_process(void)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//应答数据报的寄存器数量是否与发送的一致
|
||||||
|
if( (mod_master.data_rx[4] != mod_master.data_tx[4])||(mod_master.data_rx[5] != mod_master.data_tx[5]) )
|
||||||
|
{
|
||||||
|
mod_master.rx_error_message = RX_ERROR_WRONG_NUM;
|
||||||
|
strcpy(mod_master.result_display, "ERROR: WRONG NUMBER OF REGISTERS");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
//数据解析
|
//数据解析
|
||||||
sprintf(mod_master.result_display, "Address:0x%02x Command:0x%02x RegAddress:0x%02x%02x Num:0x%02x%02x", mod_master.data_rx[0], mod_master.data_rx[1], mod_master.data_rx[2], mod_master.data_rx[3], mod_master.data_rx[4], mod_master.data_rx[5]);
|
sprintf(mod_master.result_display, "Address:0x%02x Command:0x%02x RegAddress:0x%02x%02x Num:0x%02x%02x", mod_master.data_rx[0], mod_master.data_rx[1], mod_master.data_rx[2], mod_master.data_rx[3], mod_master.data_rx[4], mod_master.data_rx[5]);
|
||||||
}
|
}
|
||||||
|
@ -385,8 +442,8 @@ void modbus_rtu_master_data_process(void)
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
mod_master.rx_error_message = RX_ERROR_WRONG_CMD;
|
mod_master.rx_error_message = RX_ERROR_INVALID_CMD;
|
||||||
strcpy(mod_master.result_display, "ERROR: WRONG COMMAND");
|
strcpy(mod_master.result_display, "ERROR: INVALID COMMAND");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -434,89 +434,5 @@ void USART6_IRQHandler(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* USER CODE BEGIN 1 */
|
/* USER CODE BEGIN 1 */
|
||||||
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
|
|
||||||
{
|
|
||||||
//记录发送完成的时间点
|
|
||||||
st_flag = TRANSPARENT_TRANSMIT_END;
|
|
||||||
tick_end = xTaskGetTickCountFromISR();
|
|
||||||
|
|
||||||
//计算延迟,捕获失败时清零(速度过快,小于1ms)
|
|
||||||
//trans_log_rx = tick_middle - tick_start;
|
|
||||||
//if(trans_log_rx > 1000) trans_log_rx = 0;
|
|
||||||
trans_log_tx = tick_end - tick_middle;
|
|
||||||
if(trans_log_tx > 1000) trans_log_tx = 0;
|
|
||||||
|
|
||||||
//发送完成后将相关数组清零
|
|
||||||
if(huart == &huart1)
|
|
||||||
{
|
|
||||||
//HART重新使能接收
|
|
||||||
HART_RTS(RTS_OFF);
|
|
||||||
|
|
||||||
memset(scom1_hart.tx_buff, 0, scom1_hart.tx_len);
|
|
||||||
scom1_hart.tx_len = 0;
|
|
||||||
|
|
||||||
//PC--->SIG--->HART,重新开启485的DMA
|
|
||||||
HAL_UART_Receive_DMA(&huart2, scom2_rs485.rx_buff, BUFFER_SIZE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(huart == &huart2)
|
|
||||||
{
|
|
||||||
memset(scom2_rs485.tx_buff, 0, scom2_rs485.tx_len);
|
|
||||||
scom2_rs485.tx_len = 0;
|
|
||||||
|
|
||||||
//开启对应的DMA
|
|
||||||
switch (sig_trans)
|
|
||||||
{
|
|
||||||
case TRANS_HART_TO_PC:
|
|
||||||
{
|
|
||||||
HAL_UART_Receive_DMA(&huart1, scom1_hart.rx_buff, BUFFER_SIZE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TRANS_BLE_TO_PC:
|
|
||||||
{
|
|
||||||
HAL_UART_Receive_DMA(&huart6, scom6_ble.rx_buff, BUFFER_SIZE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TRANS_MODBUS_PC_TO_SIG:
|
|
||||||
{
|
|
||||||
HAL_UART_Receive_DMA(&huart2, scom2_rs485.rx_buff, BUFFER_SIZE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TRANS_MODBUS_SIG_TO_SLAVE:
|
|
||||||
{
|
|
||||||
mod_master.tx_flag = TX_OK;
|
|
||||||
HAL_UART_Receive_DMA(&huart2, scom2_rs485.rx_buff, BUFFER_SIZE);
|
|
||||||
sig2slave_current_tick = 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(huart == &huart6)
|
|
||||||
{
|
|
||||||
memset(scom6_ble.tx_buff, 0, scom6_ble.tx_len);
|
|
||||||
scom6_ble.tx_len = 0;
|
|
||||||
|
|
||||||
//PC--->SIG--->BLE,重新开启485的DMA
|
|
||||||
HAL_UART_Receive_DMA(&huart2, scom2_rs485.rx_buff, BUFFER_SIZE);
|
|
||||||
}
|
|
||||||
|
|
||||||
//通讯模式清空,等待下一次接收
|
|
||||||
sig_trans = TRANS_NONE;
|
|
||||||
|
|
||||||
//如果显示任务被挂起,则在此处释放(无DMA的情况)
|
|
||||||
if(screen_suspend_flag)
|
|
||||||
{
|
|
||||||
xTaskResumeFromISR(task_lcdHandle);
|
|
||||||
xTaskResumeFromISR(task_menuHandle);
|
|
||||||
screen_suspend_flag = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* USER CODE END 1 */
|
/* USER CODE END 1 */
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -258,16 +258,6 @@
|
||||||
<Ww>
|
<Ww>
|
||||||
<count>20</count>
|
<count>20</count>
|
||||||
<WinNumber>1</WinNumber>
|
<WinNumber>1</WinNumber>
|
||||||
<ItemText>window_trx_focus,0x0A</ItemText>
|
|
||||||
</Ww>
|
|
||||||
<Ww>
|
|
||||||
<count>21</count>
|
|
||||||
<WinNumber>1</WinNumber>
|
|
||||||
<ItemText>window_trx_cursor,0x0A</ItemText>
|
|
||||||
</Ww>
|
|
||||||
<Ww>
|
|
||||||
<count>22</count>
|
|
||||||
<WinNumber>1</WinNumber>
|
|
||||||
<ItemText>window_trx_num</ItemText>
|
<ItemText>window_trx_num</ItemText>
|
||||||
</Ww>
|
</Ww>
|
||||||
</WatchWindow1>
|
</WatchWindow1>
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue