update modbus

This commit is contained in:
2026-02-09 17:55:33 +08:00
parent 270141591e
commit fb4e311fbe
22 changed files with 4279 additions and 2075 deletions

View File

@@ -8,6 +8,7 @@
#include "bsp_Uart.h"
#include "bsp_74HC4067.h"
#include "bsp_Flash.h"
#include "app_leakage.h"
#include "proto_print.h"
#include "proto_modbus_lib.h"
@@ -15,7 +16,8 @@
#define TDLAS_MODBUS_ID (0xe8)
#define TDLAS_DATA_ENDIAN (LITTLE_ENDIAN) /*<2A><><EFBFBD>ô<EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD>*/
#define PROTO_TDLAS_GET_CURR_DATA_START_ADDR (20000)
#define PROTO_LEAKAGE_READ_DATA_NUM (14) /*<2A><>ȡһ<C8A1><D2BB><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
#define PROTO_TDLAS_GET_CURR_DATA_START_ADDR (0x0000)
#define PROTO_TDLAS_SET_ZERO_CALIB_START_ADDR (12)
#define PROTO_TDLAS_SET_SPAN_CALIB_START_ADDR (13)
#define PROTO_TDLAS_GET_RESET_START_ADDR (0x0000)
@@ -147,7 +149,7 @@ static void proto_tdlas_control_fac_calib_data_get(u8 ch)
static void proto_tdlas_tx_curr_data_get(void)
{
u16 addr = PROTO_TDLAS_GET_CURR_DATA_START_ADDR;
u8 len = Usr_Flash.FlashData.modbus_read_reg_num;
u8 len = PROTO_LEAKAGE_READ_DATA_NUM;
modbus_lib_data_read(p_sensor->modbus_id,addr,len,proto_tdlas_send);
}
@@ -316,8 +318,8 @@ static void proto_tdlas_rx_task(u8 *p_data,u16 len,void *other_data)
u8 modbus_id,cmd;
u16 check_crc16,modbus_crc16;
u16 *p_u16_temp;
u16 i;
u8 *p_rx_valid;
u16 i,ch;
u8 *p_rx_valid,temp_value;
proto_tdlas_sys_t *p_sensor_sys;
p_sensor_sys = &p_sensor->sys[p_sensor->sensor_index];
@@ -337,7 +339,7 @@ static void proto_tdlas_rx_task(u8 *p_data,u16 len,void *other_data)
check_crc16 = p_data[len-2] << 8 | p_data[len-1];
if(modbus_id != p_sensor->modbus_id) return ;
if(cmd != 0x04 && cmd != 0x06 && cmd != 0x10 && cmd != 0x41) return ;
if(cmd != 0x03 && cmd != 0x06 && cmd != 0x10 && cmd != 0x41) return ;
modbus_crc16 = modbus_lib_crc16(p_data,len-2);
modbus_crc16 = (modbus_crc16 >> 8) | (modbus_crc16 << 8);
@@ -348,6 +350,10 @@ static void proto_tdlas_rx_task(u8 *p_data,u16 len,void *other_data)
{
p_rx_valid = &p_data[6];
}
u8 byte_count = p_data[3];
p_rx_valid = &p_data[3];
rx_uart = (bsp_uart_t *)other_data;
p_sensor_sys->tx_time_out_count = 0;
@@ -361,11 +367,98 @@ static void proto_tdlas_rx_task(u8 *p_data,u16 len,void *other_data)
}break;
case PROTO_TDLAS_SYS_STATE_CURR_DATA_GET:
{
p_u16_temp = (u16 *)&(gas_data[p_sensor->sensor_index]);
for(i=0;i<Usr_Flash.FlashData.modbus_read_reg_num;i++)
{
p_u16_temp[i] = p_rx_valid[i * 2] << 8 | p_rx_valid[i * 2 + 1];
}
/*<2A><><EFBFBD>㵱ǰ<E3B5B1><EFBFBD><E8B1B8><EFBFBD><EFBFBD>*/
u8 device_global_idx = p_sensor->sensor_index;
if(device_global_idx >= APP_LEAKAGE_SUB_DEVICE_NUM)
{
break;
}
/*ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
for(ch = 0;ch < APP_LEAKAGE_SUB_DEVICE_CH_NUM;ch++)
{
p_leakage->sub_device_data[device_global_idx].ch_data[ch].state = 0;
p_leakage->sub_device_data[device_global_idx].ch_data[ch].state = 0;
}
if(byte_count >=28)
{
ch = 0;
temp_value = (p_rx_valid[0] << 8) | p_rx_valid[1];
if(temp_value == 1) {
p_leakage->sub_device_data[device_global_idx].ch_data[ch].state |=
APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE;
}
temp_value = (p_rx_valid[2] << 8) | p_rx_valid[3];
if(temp_value == 1) {
p_leakage->sub_device_data[device_global_idx].ch_data[ch].state |=
APP_LEAKAGE_SUB_DEVICE_STATE_OPEN;
}
temp_value = (p_rx_valid[4] << 8) | p_rx_valid[5];
p_leakage->sub_device_data[device_global_idx].ch_data[ch].distance = temp_value *0.01;
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0x0003*/
temp_value = (p_rx_valid[6] << 8) | p_rx_valid[7];
p_leakage->sub_device_data[device_global_idx].heartbeat = temp_value & 0xFF;
/*ͨ<><CDA8>2<EFBFBD><32>0x0004-0x0006*/
ch = 1;
temp_value = (p_rx_valid[8] << 8) | p_rx_valid[9];
if(temp_value == 1) {
p_leakage->sub_device_data[device_global_idx].ch_data[ch].state |=
APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE;
}
temp_value = (p_rx_valid[10] << 8) | p_rx_valid[11];
if(temp_value == 1) {
p_leakage->sub_device_data[device_global_idx].ch_data[ch].state |=
APP_LEAKAGE_SUB_DEVICE_STATE_OPEN;
}
temp_value = (p_rx_valid[12] << 8) | p_rx_valid[13];
p_leakage->sub_device_data[device_global_idx].ch_data[ch].distance = temp_value *0.01;
/*<2A><><EFBFBD><EFBFBD>ģʽ<C4A3><CABD>0x0007*/
temp_value = (p_rx_valid[14] << 8) | p_rx_valid[15];
p_leakage->sub_device_data[device_global_idx].test_mode = temp_value & 0xFF;
/*ͨ<><CDA8>3<EFBFBD><33>0x0008-0x000A*/
ch = 2;
temp_value = (p_rx_valid[16] << 8) | p_rx_valid[17];
if(temp_value == 1) {
p_leakage->sub_device_data[device_global_idx].ch_data[ch].state |=
APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE;
}
temp_value = (p_rx_valid[18] << 8) | p_rx_valid[19];
if(temp_value == 1) {
p_leakage->sub_device_data[device_global_idx].ch_data[ch].state |=
APP_LEAKAGE_SUB_DEVICE_STATE_OPEN;
}
temp_value = (p_rx_valid[20] << 8) | p_rx_valid[21];
p_leakage->sub_device_data[device_global_idx].ch_data[ch].distance = temp_value *0.01;
/* ͨ<><CDA8>4<EFBFBD><34>0x000B-0x000D*/
ch = 3;
temp_value = (p_rx_valid[22] << 8) | p_rx_valid[23];
if(temp_value == 1) {
p_leakage->sub_device_data[device_global_idx].ch_data[ch].state |=
APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE;
}
temp_value = (p_rx_valid[24] << 8) | p_rx_valid[25];
if(temp_value == 1) {
p_leakage->sub_device_data[device_global_idx].ch_data[ch].state |=
APP_LEAKAGE_SUB_DEVICE_STATE_OPEN;
}
temp_value = (p_rx_valid[26] << 8) | p_rx_valid[27];
p_leakage->sub_device_data[device_global_idx].ch_data[ch].distance = temp_value *0.01;
}
}break;
case PROTO_TDLAS_SYS_STATE_ZERO_CALIB:
{