forked from gary/BCU
2
0
Fork 0
BCU/app/stm32fxxx_app/protocol/protocol_modbus_bcu.c

1301 lines
46 KiB
C
Raw Normal View History

2024-11-26 15:52:49 +08:00
#include "drv_rtc.h"
#include "drv_uart.h"
#include "kit_data.h"
#include "kit_debug.h"
#include "kit_macro.h"
#include "bsp_modbus.h"
//#include "bms_bmu.h"
#include "iso_check.h"
#include "soc_calculate.h"
#include "sop_calculate.h"
#include "version_manager.h"
#include "dido_manager.h"
#include "fault_manager.h"
#include "flash_manager.h"
#include "comm_manager.h"
#include "hv_adc_manager.h"
#include "eeprom_manager.h"
#include "signal_manager.h"
#include "statistic_manager.h"
#include "bmu_manager.h"
#include "protocol_comm.h"
//#include "bms_app.h"
#include "ucos_ii.h"
struct{
uint16_t req_bcu_num;//请求单体信息分簇地址
uint16_t on_off_cmd;//高压上下电指令
uint16_t sys_time;//系统时间
uint16_t ac_err; //空调故障
}bcu_holding_reg;
struct tm telnet_time;
uint16_t bcu_total_msg_fill(uint16_t start_addr, uint8_t reg_num, uint8_t *buf)
{
// static uint16_t test99 = 0;
uint16_t index, data, i;
uint32_t addr = 0,temp_soe;
uint16_t relay_status_temp = 0,sw_status = 0;
uint32_t AccChgCap,AccChgEnergy,AccDisCap,AccDisEnergy,AccChgTime,AccDisTime;
uint16_t bms_stu = 0;
if(bms_get_run_status() == kRunStatus_Init)
{
bms_stu = 0;
}
else if(bms_get_run_status() == kRunStatus_Standby)
{
bms_stu |= 0x1;
}
else if(bms_get_run_status() == kRunStatus_Chg)
{
bms_stu |= 0x2;
}
else if(bms_get_run_status() == kRunStatus_Dis)
{
bms_stu |= 0x3;
}
if(bms_get_signal(kSignalIdx_ForbidChg) == kSignalStatus_High)
{
bms_stu |= 0x10;
}
if(bms_get_signal(kSignalIdx_ForbidDis) == kSignalStatus_High)
{
bms_stu |= 0x20;
}
temp_soe = (uint32_t)bms_get_soc()*get_eeprom_data(kEep_RatedCapacity, kEepromDataType_Full)/100*bms_get_statistic_data(kStatisticData_TotalVolt);
temp_soe /= (uint32_t)get_eeprom_data(kEep_RatedCapacity, kEepromDataType_Full)* get_eeprom_data(kEep_RatedTotalVolt, kEepromDataType_Full)/100;
//获取累计充电容量
AccChgCap = bms_get_cumulate_data(kCumulateData_AccChgCap);
//累计充电电量
AccChgEnergy = bms_get_cumulate_data(kCumulateData_AccChgEnergy);
//累计放电容量
AccDisCap = bms_get_cumulate_data(kCumulateData_AccDisCap);
//累计放电电量
AccDisEnergy = bms_get_cumulate_data(kCumulateData_AccDisEnergy);
//累计充电时间
AccChgTime = bms_get_cumulate_data(kCumulateData_AccChgTime);
//累计放电时间
AccDisTime = bms_get_cumulate_data(kCumulateData_AccDisTime);
//继电器状态
for(i = 0;i < 10;i++)
{
relay_status_temp |= bms_get_do_status_by_idx(i) << i;
}
//开关量输入状态
for(i = 0;i < kSignalIdx_DiEnd;i++)
{
sw_status |= (uint16_t)(bms_get_signal((SignalIdx)i)) << i;
}
for(index = start_addr; index < start_addr + reg_num; index++)
{
READ_FC03_F04_BEGIN();
//1 动力电池组总电压
READ_FC03_F04_ITEM(1, bms_get_statistic_data(kStatisticData_TotalVolt));
2025-02-06 15:08:48 +08:00
//READ_FC03_F04_ITEM(1, 5000);
2024-11-26 15:52:49 +08:00
//READ_FC03_F04_ITEM(1, test99+=10);
//2 动力电池组总电流
2025-02-12 15:02:26 +08:00
READ_FC03_F04_ITEM(2, bms_get_show_current());
2024-11-26 15:52:49 +08:00
//3 SOC
//READ_FC03_F04_ITEM(3,get_eeprom_data(kEep_SOC,kEepromDataType_Full) / 100);
READ_FC03_F04_ITEM(3, bms_get_soc() / 100);
//4 SOH
READ_FC03_F04_ITEM(4, bms_get_soh() / 100);
//5 SOE
READ_FC03_F04_ITEM(5, bms_get_soc() / 100);
//6 额定总压
READ_FC03_F04_ITEM(6, get_eeprom_data(kEep_RatedTotalVolt,kEepromDataType_Full));
//7 额定容量
2025-02-12 15:02:26 +08:00
READ_FC03_F04_ITEM(7, get_eeprom_data(kEep_RatedCapacity,kEepromDataType_Full) );
2024-11-26 15:52:49 +08:00
//8 剩余容量
READ_FC03_F04_ITEM(8, (uint32_t)bms_get_soc()*get_eeprom_data(kEep_RatedCapacity, kEepromDataType_Full)/10000);
//9 额定电量
READ_FC03_F04_ITEM(9, get_eeprom_data(kEep_RatedCapacity, kEepromDataType_Full)*get_eeprom_data(kEep_RatedTotalVolt, kEepromDataType_Full)/10000);
//10 剩余电量
READ_FC03_F04_ITEM(10, (uint32_t)bms_get_soc() * get_eeprom_data(kEep_RatedCapacity, kEepromDataType_Full)/10000*get_eeprom_data(kEep_RatedTotalVolt, kEepromDataType_Full)/10000);
//11 从机总数
READ_FC03_F04_ITEM(11, bms_get_bmu_num());
//12 在线从机总数
READ_FC03_F04_ITEM(12, bms_get_bmu_online_num());
//13 电池总数
READ_FC03_F04_ITEM(13, get_eeprom_data(kEep_CellNum, kEepromDataType_Full));
//14 在线电池总数
READ_FC03_F04_ITEM(14, bms_get_statistic_data(kStatisticData_OnlineCellNum));
//15 温感总数
READ_FC03_F04_ITEM(15, get_eeprom_data(kEep_TempNum, kEepromDataType_Full));
//16 在线温感总数
READ_FC03_F04_ITEM(16, bms_get_statistic_data(kStatisticData_OnlineTempNum));
//17 最大允许放电电流
READ_FC03_F04_ITEM(17, bms_get_sop_data(kSopData_DisCur));
//18 最大允许放电功率
READ_FC03_F04_ITEM(18, (uint32_t)bms_get_sop_data(kSopData_DisCur)*get_eeprom_data(kEep_RatedTotalVolt, kEepromDataType_Full)/10000);
//19 最大允许充电电流
READ_FC03_F04_ITEM(19, bms_get_sop_data(kSopData_ChgCur));
//20 最大允许充电功率
READ_FC03_F04_ITEM(20, (uint32_t)bms_get_sop_data(kSopData_ChgCur)*get_eeprom_data(kEep_RatedTotalVolt, kEepromDataType_Full)/10000);
//21 正极绝缘阻值
READ_FC03_F04_ITEM(21, bms_get_iso_data(kIsoData_PosRes));
//22 负极绝缘阻值
READ_FC03_F04_ITEM(22, bms_get_iso_data(kIsoData_NegRes));
//23 平均电压
READ_FC03_F04_ITEM(23, bms_get_statistic_data(kStatisticData_AvgVolt));
//24 最大压差
READ_FC03_F04_ITEM(24, bms_get_statistic_data(kStatisticData_VoltDiff));
//25 最高单体电压
READ_FC03_F04_ITEM(25, bms_get_statistic_data(kStatisticData_MaxVolt));
//26 最高单体电压从机号
READ_FC03_F04_ITEM(26, bms_get_statistic_data(kStatisticData_MaxVoltBmuIdx) + 1);
//27 最高单体电压编号
READ_FC03_F04_ITEM(27, bms_get_statistic_data(kStatisticData_MaxVoltIdx) + 1);
//28 最低单体电压
READ_FC03_F04_ITEM(28, bms_get_statistic_data(kStatisticData_MinVolt));
//29 最低单体电压从机号
READ_FC03_F04_ITEM(29, bms_get_statistic_data(kStatisticData_MinVoltBmuIdx) + 1);
//30 最低单体电压编号
READ_FC03_F04_ITEM(30, bms_get_statistic_data(kStatisticData_MinVoltIdx) + 1);
//31 平均温度
READ_FC03_F04_ITEM(31, bms_get_statistic_data(kStatisticData_AvgTemp));
//32 最大温差
READ_FC03_F04_ITEM(32, bms_get_statistic_data(kStatisticData_TempDiff));
//33 最高单体温度
READ_FC03_F04_ITEM(33, bms_get_statistic_data(kStatisticData_MaxTemp));
//34 最高单体温度从机号
READ_FC03_F04_ITEM(34, bms_get_statistic_data(kStatisticData_MaxTempBmuIdx) + 1);
//35 最高单体温度编号
READ_FC03_F04_ITEM(35, bms_get_statistic_data(kStatisticData_MaxTempIdx) + 1);
//36 最低单体温度
READ_FC03_F04_ITEM(36, bms_get_statistic_data(kStatisticData_MinTemp));
//37 最低单体温度从机号
READ_FC03_F04_ITEM(37, bms_get_statistic_data(kStatisticData_MinTempBmuIdx) + 1);
//38 最低单体温度编号
READ_FC03_F04_ITEM(38, bms_get_statistic_data(kStatisticData_MinTempIdx) + 1);
//39 日充电容量
READ_FC03_F04_ITEM(39, (uint16_t)bms_get_cumulate_data(kCumulateData_DayChgCap));
//40 日充电电量
READ_FC03_F04_ITEM(40, (uint16_t)bms_get_cumulate_data(kCumulateData_DayChgEnergy));
//41 日放电容量
READ_FC03_F04_ITEM(41, (uint16_t)bms_get_cumulate_data(kCumulateData_DayDisCap));
//42 日放电电量
READ_FC03_F04_ITEM(42, (uint16_t)bms_get_cumulate_data(kCumulateData_DayDisEnergy))
//43 日充电时间 todo
READ_FC03_F04_ITEM(43, (uint16_t)bms_get_cumulate_data(kCumulateData_DayChgTime));
//44 日放电时间 todo
READ_FC03_F04_ITEM(44, (uint16_t)bms_get_cumulate_data(kCumulateData_DayDisTime));
//45 累计充电容量高位
READ_FC03_F04_ITEM(45, (uint16_t)(AccChgCap >> 16));
//46 累计充电容量低位
READ_FC03_F04_ITEM(46, (uint16_t)(AccChgCap));
//47 累计充电电量高位
READ_FC03_F04_ITEM(47, (uint16_t)(AccChgEnergy >> 16));
//48 累计充电电量低位
READ_FC03_F04_ITEM(48, (uint16_t)(AccChgEnergy));
//49 累计放电容量高位
READ_FC03_F04_ITEM(49, (uint16_t)(AccDisCap >> 16));
//50 累计放电容量低位
READ_FC03_F04_ITEM(50, (uint16_t)(AccDisCap));
//51 累计放电电量高位
READ_FC03_F04_ITEM(51, (uint16_t)(AccDisEnergy >> 16));
//52 累计放电电量低位
READ_FC03_F04_ITEM(52, (uint16_t)(AccDisEnergy))
//53 累计充电时间高位
READ_FC03_F04_ITEM(53, (uint16_t)(AccChgTime >> 16));
//54 累计充电时间低位
READ_FC03_F04_ITEM(54, (uint16_t)(AccChgTime));
//55 累计放电时间高位
READ_FC03_F04_ITEM(55, (uint16_t)(AccDisTime >> 16))
//56 累计放电时间低位
READ_FC03_F04_ITEM(56, (uint16_t)(AccDisTime))
//57 BCU工作状态 todo
READ_FC03_F04_ITEM(57, bms_stu);
//58 总负继电器状态
READ_FC03_F04_ITEM(58, bms_get_do_status_by_type(kDoType_Negative));
//59 总正继电器状态
READ_FC03_F04_ITEM(59, bms_get_do_status_by_type(kDoType_Positive));
//60 放电继电器状态
READ_FC03_F04_ITEM(60, bms_get_do_status_by_type(kDoType_Dis));
//61 充电继电器状态
READ_FC03_F04_ITEM(61, bms_get_do_status_by_type(kDoType_Chg));
//62 预充继电器状态
READ_FC03_F04_ITEM(62, bms_get_do_status_by_type(kDoType_PreChg));
//63 继电器状态
READ_FC03_F04_ITEM(63, relay_status_temp);
//64 开关量状态
READ_FC03_F04_ITEM(64, sw_status);
//65 故障状态
READ_FC03_F04_ITEM(65, bms_get_max_fault_level());
//66 故障1~8等级 todo
READ_FC03_F04_ITEM(66, bms_get_fault_bit(0));
//67 故障9~16等级 todo
READ_FC03_F04_ITEM(67, bms_get_fault_bit(1));
//68 故障17~24等级 todo
READ_FC03_F04_ITEM(68, bms_get_fault_bit(2));
//69 故障25~32等级 todo
READ_FC03_F04_ITEM(69, bms_get_fault_bit(3));
//70 故障33~40等级 todo
READ_FC03_F04_ITEM(70, bms_get_fault_bit(4));
//71 故障41~48等级 todo
READ_FC03_F04_ITEM(71, bms_get_fault_bit(5));
//72 故障49~56等级 todo
READ_FC03_F04_ITEM(72, bms_get_fault_bit(6));
//73 故障57~64等级 todo
READ_FC03_F04_ITEM(73, bms_get_fault_bit(7));
//74 电池系统循环次数 todo
READ_FC03_F04_ITEM(74, bms_get_cycle());
//75 最大允许充电单体电压 todo
READ_FC03_F04_ITEM(75, get_eeprom_data(kEep_FullChgVolt, kEepromDataType_Full));
//76 最小允许放电单体电压 todo
READ_FC03_F04_ITEM(76, get_eeprom_data(kEep_FullDisVolt, kEepromDataType_Full));
//77 最大允许充电总压
READ_FC03_F04_ITEM(77, get_eeprom_data(kEep_ChgHTVoltHTAlarm1, kEepromDataType_Full));
//78 最小允许放电总压
READ_FC03_F04_ITEM(78, get_eeprom_data(kEep_DisLTVoltHTAlarm1, kEepromDataType_Full));
//79 软件版本号高位
READ_FC03_F04_ITEM(79, (uint16_t)(DEVICE_SW_VERSION >> 16))
//80 软件版本号低位
READ_FC03_F04_ITEM(80, (uint16_t)(DEVICE_SW_VERSION))
//81 修订版本号
READ_FC03_F04_ITEM(81, DEVICE_SW_BUILD_VER);
//82 硬件版本号
READ_FC03_F04_ITEM(82, DEVICE_HW_VERSION);
//83 采样总压
READ_FC03_F04_ITEM(83, bms_get_high_volt(kHvType_Bat))
//84 一级故障故障位1~16
READ_FC03_F04_ITEM(84,bms_get_fault_single_bit(0 , kFaultLevel_First))
//85 一级故障故障位17~32
READ_FC03_F04_ITEM(85,bms_get_fault_single_bit(1 , kFaultLevel_First))
//86 一级故障故障位33~48
READ_FC03_F04_ITEM(86,bms_get_fault_single_bit(2 , kFaultLevel_First))
//87 一级故障故障位49~64
READ_FC03_F04_ITEM(87,bms_get_fault_single_bit(3 , kFaultLevel_First))
//88 二级故障故障位1~16
READ_FC03_F04_ITEM(88,bms_get_fault_single_bit(0 , kFaultLevel_Second))
//89 二级故障故障位17~32
READ_FC03_F04_ITEM(89,bms_get_fault_single_bit(1 , kFaultLevel_Second))
//90 二级故障故障位33~48
READ_FC03_F04_ITEM(90,bms_get_fault_single_bit(2 , kFaultLevel_Second))
//91 二级故障故障位49~64
READ_FC03_F04_ITEM(91,bms_get_fault_single_bit(3 , kFaultLevel_Second))
//92 三级故障故障位1~16
READ_FC03_F04_ITEM(92,bms_get_fault_single_bit(0 , kFaultLevel_Third))
//93 三级故障故障位17~32
READ_FC03_F04_ITEM(93,bms_get_fault_single_bit(1 , kFaultLevel_Third))
//94 三级故障故障位33~48
READ_FC03_F04_ITEM(94,bms_get_fault_single_bit(2 , kFaultLevel_Third))
//95 三级故障故障位49~64
READ_FC03_F04_ITEM(95,bms_get_fault_single_bit(3 , kFaultLevel_Third))
//96 BCU状态机
READ_FC03_F04_ITEM(96,bms_stu & 0x0F)
//97 充电状态
READ_FC03_F04_ITEM(97,(bms_stu & 0x10) >> 4)
//98 放电状态
READ_FC03_F04_ITEM(98,(bms_stu & 0x20) >> 5)
//99 高压闭合状态
READ_FC03_F04_ITEM(99,(bms_stu & 0x40) >> 6)
//100 风扇状态
READ_FC03_F04_ITEM(100,(bms_stu & 0x80) >> 7)
//101 总告警
READ_FC03_F04_ITEM(101,bms_get_max_fault_level() == kFaultLevel_First || bms_get_max_fault_level() == kFaultLevel_Second)
//102 总故障
READ_FC03_F04_ITEM(102,bms_get_max_fault_level() == kFaultLevel_Third)
//103 BCU地址
READ_FC03_F04_ITEM(103,get_eeprom_data(kEep_DevAddr_SlaverNum, kEepromDataType_High))
//104 BCU主回路状态
READ_FC03_F04_ITEM(104,bms_get_circuit_status(kCircuitType_Main))
//105 BCU回路闭合指令
READ_FC03_F04_ITEM(105,bms_get_circuit_cmd_status())
//106 BCU是否允许闭合主回路
READ_FC03_F04_ITEM(106,(bms_is_circuit_allow() == true))
//107 T1温度
READ_FC03_F04_ITEM(107,bms_get_en_temp((EnTemp)(kEnTemp_T1)))
//108 T2温度
READ_FC03_F04_ITEM(108,bms_get_en_temp((EnTemp)(kEnTemp_T2)))
//109 T3温度
READ_FC03_F04_ITEM(109,bms_get_en_temp((EnTemp)(kEnTemp_T3)))
//109 T4温度
READ_FC03_F04_ITEM(110,bms_get_en_temp((EnTemp)(kEnTemp_T4)))
//120 休眠状态
READ_FC03_F04_ITEM(120,bms_get_signal(kSignalIdx_StandbySleep))
2025-02-06 15:08:48 +08:00
2024-11-26 15:52:49 +08:00
READ_FC03_F04_END();
WRITE_BT_INT16U(buf, addr, data);
}
return addr;
}
void bcu_cell_volt_msg_fill(uint8_t *buf)
{
uint16_t temp,i,j;
uint32_t addr = 0;
//1000 电池总数
temp = bms_get_statistic_data(kStatisticData_OnlineCellNum);
WRITE_BT_INT16U(buf, addr, temp);
for(i = 0; i < bms_get_bmu_num(); i++)
{
for(j = 0; j < bms_get_bmu_data(i, kBmuData_CellNum); j++)
{
temp = bms_get_cell_volt_by_bmu(i, j);
WRITE_BT_INT16U(buf, addr, temp);
}
}
}
void bcu_cell_temperature_msg_fill(uint8_t *buf)
{
uint16_t temp,i,j;
uint32_t addr = 0;
//1600 温感总数
temp = bms_get_statistic_data(kStatisticData_OnlineTempNum);
WRITE_BT_INT16U(buf, addr, temp);
for(i = 0; i < bms_get_bmu_num(); i++)
{
for(j = 0; j < bms_get_bmu_data(i, kBmuData_TempNum); j++)
{
temp = bms_get_cell_temp_by_bmu(i, j);
WRITE_BT_INT16U(buf, addr, temp);
}
}
}
uint16_t bcu_holding_data_fill(uint16_t start_addr, uint8_t reg_num, uint8_t *buf)
{
uint16_t index, data;
uint32_t addr = 0;
int32_t year, month, day, hour, min, sec;
drv_rtc_get_date(&year, &month, &day);
drv_rtc_get_time(&hour, &min, &sec);
for(index = start_addr; index < start_addr + reg_num; index++)
{
READ_FC03_F04_BEGIN();
//1 高压上下电指令
READ_FC03_F04_ITEM(3000, bcu_holding_reg.on_off_cmd);
//2 系统时间
READ_FC03_F04_ITEM(3001, bcu_holding_reg.sys_time);
//3 空调故障信号
READ_FC03_F04_ITEM(3002, 0);
//4 年
READ_FC03_F04_ITEM(3003, year);
//5 月
READ_FC03_F04_ITEM(3004, month);
//6 日
READ_FC03_F04_ITEM(3005, day);
//7 时
READ_FC03_F04_ITEM(3006, hour);
//8 分
READ_FC03_F04_ITEM(3007, min);
//9 秒
READ_FC03_F04_ITEM(3008, sec);
READ_FC03_F04_END();
WRITE_BT_INT16U(buf, addr, data);
}
return addr;
}
void bcu_holding_data_fill_msg(uint8_t *buf)
{
uint16_t temp;
uint32_t addr = 0;
//3000 高压上下电指令
temp = bcu_holding_reg.on_off_cmd;
WRITE_BT_INT16U(buf, addr, temp);
//3001 系统时间
temp = bcu_holding_reg.sys_time;
WRITE_BT_INT16U(buf, addr, temp);
//3002 空调故障
temp = bcu_holding_reg.ac_err;
WRITE_BT_INT16U(buf, addr, temp);
//3003 系统时间
temp = telnet_time.tm_year + 1900;
WRITE_BT_INT16U(buf, addr, temp);
//3004
temp = telnet_time.tm_mon + 1;
WRITE_BT_INT16U(buf, addr, temp);
//3005
temp = telnet_time.tm_mday;
WRITE_BT_INT16U(buf, addr, temp);
//3006
temp = telnet_time.tm_hour;
WRITE_BT_INT16U(buf, addr, temp);
//3007
temp = telnet_time.tm_min;
WRITE_BT_INT16U(buf, addr, temp);
//3008
temp = telnet_time.tm_sec;
WRITE_BT_INT16U(buf, addr, temp);
}
#include "kit_time.h"
uint16_t bcu_total_cfg_fill(uint16_t start_addr, uint8_t reg_num, uint8_t *buf)
{
uint16_t address = 0,data = 0;
int32_t year,mon,day,hour,min,sec;
uint32_t addr = 0;
//drv_rtc_get_date(&year, &mon, &day);
//drv_rtc_get_time(&hour, &min, &sec);
for(address = start_addr; address < start_addr + reg_num; address++)
{
switch(address)
{
case 3000:
data = get_eeprom_data(kEep_DevAddr_SlaverNum,kEepromDataType_Low);
break;
case 3001:
case 3002:
data = get_eeprom_data(kEep_CellNum + address - 3001, kEepromDataType_Full);
break;
case 3003:
data = get_eeprom_data(kEep_Standby_LowVoltSleepDly, kEepromDataType_Full);
break;
case 3004:
case 3005:
//data = get_eeprom_data(kEep_HeatStartTemp + address - 3004 , kEepromDataType_Full);
data = get_eeprom_data(kEep_HeatOn_OffTemp,(EepromDataType)(1 -(address % 2)));
break;
case 3006: //制冷开启温度(℃)
case 3007: //制冷关闭温度(℃)
//data = get_eeprom_data(kEep_HeatStartTemp + address - 3004 , kEepromDataType_Full);
data = get_eeprom_data(kEep_CoolOn_OffTemp,(EepromDataType)(1 -(address % 2)));
break;
case 3008: //额定容量
data = get_eeprom_data(kEep_RatedCapacity,kEepromDataType_Full);
break;
case 3009:
case 3010:
data = get_eeprom_data(kEep_InterCanProtocol_Baudrate, (EepromDataType)(1 - (address % 2)));
break;
case 3011: //485_1波特率 485_1校验位
case 3012:
data = get_eeprom_data(kEep_InterCanProtocol_Baudrate, (EepromDataType)(1 - (address % 2)));
break;
case 3013: //485_1设备地址
case 3014: //485_1设备协议
data = get_eeprom_data(kEep_InterRS485_SlaveID_Protocol, (EepromDataType)(address % 2));
break;
case 3015: //485_1波特率 485_1校验位
case 3016:
data = get_eeprom_data(kEep_Exter485_2Parity_Baudrate, (EepromDataType)(1 - (address % 2)));
break;
case 3017: //485_1设备地址
case 3018: //485_1设备协议
data = get_eeprom_data(kEep_ExterRS485_1SlaveID_Protocol, (EepromDataType)(address % 2));
break;
case 3019: //485_2波特率 485_2校验位
case 3020:
data = get_eeprom_data(kEep_Exter485_2Parity_Baudrate, (EepromDataType)(1 - (address % 2)));
break;
case 3021: //485_2设备地址
case 3022: //485_2设备协议
data = get_eeprom_data(kEep_ExterRS485_2SlaveID_Protocol, (EepromDataType)(address % 2));
break;
case 3023: //电流传感器1类型
case 3030: //电流传感器2类型
data = get_eeprom_data(kEep_CurSensor2_1Type, (EepromDataType)(1 - (address % 2)));
break;
case 3024: //霍尔摆幅电压mV
data = get_eeprom_data(kEep_HallSwingVolt, kEepromDataType_Full);
break;
case 3025: //电流传感器1量程A
case 3032: //电流传感器2量程A
data = get_eeprom_data(kEep_CurSensor2_1Range, (EepromDataType)(1 - (address % 2)));
break;
case 3026: //电流传感器1方向
case 3033: //电流传感器2方向
data = get_eeprom_data(kEep_CurSensor2_1Dir, (EepromDataType)(1 - (address % 2)));
break;
case 3027: //电流传感器1滤波A
case 3034: //电流传感器2滤波A
data = get_eeprom_data(kEep_ZeroFilter2_1Filter, (EepromDataType)(1 - (address % 2)));
break;
case 3028: //电流传感器1偏移AA
case 3035: //电流传感器2偏移AA
data = get_eeprom_data(kEep_CurSensor2_1Offset, (EepromDataType)(1 - (address % 2)));
break;
case 3029: //霍尔1矫正增益
data = get_eeprom_data(kEep_Shunt1CaliGain, kEepromDataType_Full);
break;
case 3036: //霍尔2矫正增益
data = get_eeprom_data(kEep_Shunt2CaliGain, kEepromDataType_Full);
break;
case 3037: //分流器额定电压(mV)
case 3038: //充电电流方向
data = get_eeprom_data(kEep_ChgCurDir_ShuntRatedVolt, (EepromDataType)(1 - (address % 2)));
break;
case 3039: //目标电流
data = get_eeprom_data(kEep_TargetCurrent, kEepromDataType_Full);
break;
case 3040: //循环次数
case 3041: //SOC设置
case 3042: //SOE设置
case 3043: //日充放电累计时间
case 3044: //日放电累计容量L
case 3045: //日放电累计容量H
case 3046: //日放电电量L
case 3047: //日放电电量H
case 3048: //日充电电电量L
case 3049: //日充电电电量H
case 3050: //日充电累计时间L
case 3051: //日充电累计时间H
case 3052: //日充电电电量L
case 3053: //日充电电电量H
case 3054: //放电累计时间L
case 3055: //放电累计时间H
case 3056: //放电累计容量L
case 3057: //放电累计容量H
case 3058: //放电累计电量L
case 3059: //放电累计电量H
case 3060: //充电累计时间L
case 3061: //充电累计时间H
case 3062: //充电累计容量L
case 3063: //充电累计容量H
case 3064: //放电累计电量L
case 3065: //放电累计电量H
case 3066: //下电时间L
case 3067: //下电时间H
data = get_eeprom_data(kEep_CycleTimes + address - 3040, kEepromDataType_Full);
break;
case 3068: //SOC满放校准电压mV
case 3069: //SOC满充校准电压mV
data = get_eeprom_data(kEep_FullDisVolt + address - 3068, kEepromDataType_Full);
break;
case 3070: //SOC满放校准平均电压mV
case 3071: //SOC满充校准平均电压mV
data = get_eeprom_data(kEep_FullDisAvgVolt + address - 3070, kEepromDataType_Full);
break;
case 3072: //SOC过充校准总压电压值
case 3073: //SOC过放校准总压电压值
data = get_eeprom_data(kEep_FullChgTotalVolt + address - 3072, kEepromDataType_Full);
break;
case 3074: //SOC过充校准总压电压值
data = get_eeprom_data(kEep_ForbidChgRelVolt, kEepromDataType_Full);
break;
case 3075: //SOC过放校准总压电压值
data = get_eeprom_data(kEep_ForbidDisRelVolt, kEepromDataType_Full);
break;
case 3076: //禁放释放时间min
case 3077: //禁充释放时间min
data = get_eeprom_data(kEep_ForbidDisRelDelay + address - 3076, kEepromDataType_Full);
break;
case 3078: // OCV表索引
case 3079: // SOP表索引
data = get_eeprom_data(kEep_Sop_OcvIndex, (EepromDataType)(address % 2));
break;
case 3080: // OCV静置时间h
case 3081: // OCV静置电流A
data = get_eeprom_data(kEep_OcvStandbyCur_Time, (EepromDataType)(address % 2));
break;
case 3082: // OCV禁校上限%
case 3083: // OCV禁校下限%
data = get_eeprom_data(kEep_OcvDisRangeLower_Upper, (EepromDataType)(address % 2));
break;
case 3084: // SOC上限%
case 3085: // SOC下限%
data = get_eeprom_data(kEep_SOCRunMax_Min, (EepromDataType)(1 - (address % 2)));
break;
case 3086: // 额定总压V
case 3087: // 请求充电电压V
data = get_eeprom_data(kEep_RatedTotalVolt + address - 3086, kEepromDataType_Full);
break;
case 3088: // 额定充电电流AA
case 3089: // 额定放电电流AV
data = get_eeprom_data(kEep_RatedChgCur + address - 3088, kEepromDataType_Full);
break;
case 3090: // 额定充电功率(kw)(kw)
case 3091: // 额定放电功率(kw)
data = get_eeprom_data(kEep_RatedChgPower + address - 3090, kEepromDataType_Full);
break;
case 3092: // 充电末端一段降流电压V
case 3093: // 充电末端二段降流电压V
data = get_eeprom_data(kEep_ChgFstCurDownVolt + address - 3092, kEepromDataType_Full);
break;
case 3094: // 充电末端一段降流系数
case 3095: // 充电末端二段降流系数
data = get_eeprom_data(kEep_ChgSnd_FstCurDownRate, (EepromDataType)(address % 2));
break;
case 3096: // 充放电模式
data = get_eeprom_data(kEep_ChgDisMode_HighVoltStrategy, kEepromDataType_High);
break;
case 3097: // 目标电压
data = get_eeprom_data(kEep_TargetVolt, kEepromDataType_Full);
break;
case 3098: // 高压控制策略
data = get_eeprom_data(kEep_ChgDisMode_HighVoltStrategy, kEepromDataType_Low);
break;
case 3099: // 放电上电自检故障L
case 3100: // 放电上电自检故障H
case 3101: // 充电上电自检故障L
case 3102: // 充电上电自检故障H
data = get_eeprom_data(kEep_DisSelfFaultLow + address - 3099, kEepromDataType_Full);
break;
case 3103:// 绝缘使能
data = get_eeprom_data(kEep_InsuPeriod_Enable, kEepromDataType_Low);
break;
case 3104:// 上下电模式
data = get_eeprom_data(kEep_ChgDisChangeBasis_RelayOnOffMode, kEepromDataType_Low);
break;
case 3105: //上下电模式
case 3106: // DO2控制
case 3107: // DO3控制
case 3108: // DO4控制
case 3109: // DO5控制
case 3110: // DO6控制
case 3111: // DO7控制
case 3112: // DO8控制
data = get_eeprom_data(kEep_Relay2_1Type + (address - 3105)/ 2 , (EepromDataType)(1 - (address % 2)));
break;
case 3113: // DO1类型
case 3114: // DO2类型
case 3115: // DO3类型
case 3116: // DO4类型
case 3117: // DO5类型
case 3118: // DO6类型
case 3119: // DO7类型
case 3120: // DO8类型
data = get_eeprom_data(kRelay2_1ForceCtrlStatus + (address - 3113) / 2 , (EepromDataType)(1 - (address % 2)));
break;
case 3121: // DI1控制
case 3122: // DI2控制
case 3123: // DI3控制
case 3124: // DI4控制
case 3125: // DI5控制
case 3126: // DI6控制
case 3127: // DI7控制
case 3128: // DI8控制
data = get_eeprom_data(kEep_Di2_1Type + (address - 3121) / 2 , (EepromDataType)(1 - (address % 2)));
break;
case 3129: // DI1类型
case 3130: // DI2类型
case 3131: // DI3类型
case 3132: // DI4类型
case 3133: // DI5类型
case 3134: // DI6类型
case 3135: // DI7类型
case 3136: // DI8类型
data = get_eeprom_data(kEep_Di2_1Polarity + (address - 3129) / 2 , (EepromDataType)(1 - (address % 2)));
break;
case 3137: // DO1故障检测源
case 3138: // DO2故障检测源
case 3139: // DO3故障检测源
case 3140: // DO4故障检测源
case 3141: // DO5故障检测源
case 3142: // DO6故障检测源
case 3143: // DO7故障检测源
case 3144: // DO8故障检测源
data = get_eeprom_data(kEep_DO2_DO1_ErrSrc + (address - 3137) / 2 , (EepromDataType) (1 - (address % 2)));
break;
case 3145: // 预充次数
case 3146: // 预充超时时间s
data = get_eeprom_data(kEep_PreChgTimeout_Count , (EepromDataType)(1 - (address % 2)));
break;
2025-02-15 19:57:30 +08:00
case 3147: // 预充电压比例(%
case 3148: // 预充类型
2024-11-26 15:52:49 +08:00
data = get_eeprom_data(kEep_PreChgVoltType_Rate , (EepromDataType)(1 - (address % 2)));
break;
case 3149: // 系统时间s
data = 0;
//drv_rtc_set_tick(bcu_holding_reg.sys_time);
break;
case 3150: // 系统时间s
data = year;
break;
case 3151: // 系统时间s
data = mon;
break;
case 3152: // 系统时间s
data = day;
break;
case 3153: // 系统时间s
data = hour;
break;
case 3154: // 系统时间s
data = min;
break;
case 3155: // 系统时间s
data = sec;
break;
case 3156: // 系统复位
//data = get_eeprom_data(kEep_IsSoftReset , kEepromDataType_Full);
data = 0;
break;
case 3157: // 均衡开启电压mv
case 3158: // 均衡关闭电压mvmv
data = get_eeprom_data(kEep_DataBanlenceStartVolt + address - 3157 , kEepromDataType_Full);
break;
case 3159: // 均衡开启压差mvmv
case 3160: // 均衡关闭压差mvmv
data = get_eeprom_data(kEep_BalanceOpenVolDiff_CloseVolDiff , (EepromDataType) (1 - (address % 2)));
break;
case 3161: // 均衡路数
data = get_eeprom_data(kEep_BalanceNum , kEepromDataType_Full);
break;
case 3162: // 均衡时间
data = get_eeprom_data(kEep_BalanceTime , kEepromDataType_Full);
break;
case 3163: // DO9控制
case 3164: // DO10控制
data = get_eeprom_data(kEep_Relay10_9Type + (address - 3163)/ 2 , (EepromDataType)(1 - (address % 2)));
break;
case 3165: // DO9类型
case 3166: // DO10类型
data = get_eeprom_data(kRelay10_9ForceCtrlStatus + (address - 3165) / 2 , (EepromDataType) (1 - (address % 2)));
break;
case 3167: // DO9故障源
case 3168: // DO10故障源
data = get_eeprom_data(kEep_DO10_DO9_ErrSrc + (address - 3167) / 2 , (EepromDataType) (1 - (address % 2)));
break;
default:
break;
}
WRITE_BT_INT16U(buf, addr, data);
}
return addr;
}
static uint8_t fill_buf[1000];
BspMdExCode bcu_modbus_485_0x03_fun(uint16_t start_addr, uint16_t reg_num, uint8_t *buf, uint16_t *len)
{
BspMdExCode err = kBspMdEx_None;
2025-02-06 15:08:48 +08:00
//kit_time_dly_ms(50);
2024-11-26 15:52:49 +08:00
if((start_addr >= 3000) && (start_addr + reg_num <= 3169))
{
*len = bcu_total_cfg_fill(start_addr, reg_num, buf);
}
else if((start_addr >= 4000) && ((start_addr + reg_num ) <= 4999))
{
hmi_fill_modbus_cfg(fill_buf);
*len = reg_num << 1;
kit_copy_buf(buf, &fill_buf[(start_addr - 4000) << 1], *len);
}
else
{
err = kBspMdEx_InvalidAddr;
}
return err;
}
BspMdExCode bcu_modbus_485_0x04_fun(uint16_t start_addr, uint16_t reg_num, uint8_t *buf, uint16_t *len)
{
BspMdExCode err = kBspMdEx_None;
2025-02-06 15:08:48 +08:00
//kit_time_dly_ms(50);
2024-11-26 15:52:49 +08:00
if((start_addr + reg_num ) <= 200)
{
*len = bcu_total_msg_fill(start_addr, reg_num, buf);
}
else if((start_addr >= 1000) && ((start_addr + reg_num ) <= 1500))
{
bcu_cell_volt_msg_fill(fill_buf);
*len = reg_num << 1;
kit_copy_buf(buf, &fill_buf[(start_addr - 1000) << 1], *len);
}
else if((start_addr >= 1600) && ((start_addr + reg_num ) <= 2100))
{
bcu_cell_temperature_msg_fill(fill_buf);
*len = reg_num << 1;
kit_copy_buf(buf, &fill_buf[(start_addr - 1600) << 1], *len);
}
else if((start_addr >= 5000) && ((start_addr + reg_num ) <= 5699))
{
bms_fill_gate_read_data(fill_buf);
*len = reg_num << 1;
kit_copy_buf(buf, &fill_buf[(start_addr - 5000) << 1], *len);
}
else
{
err = kBspMdEx_InvalidAddr;
}
return err;
}
void bcu_data_set_0x06_msg(uint16_t address,uint16_t data)
{
uint16_t factor = 1000;
switch(address)
{
case 3000:
bsp_eeprom_save_data(kEep_DevAddr_SlaverNum,data,kEepromDataType_Low);
break;
case 3001:
case 3002:
bsp_eeprom_save_data(kEep_CellNum + address - 3001,data,kEepromDataType_Full);
break;
case 3003:
bsp_eeprom_save_data(kEep_Standby_LowVoltSleepDly,data,kEepromDataType_Full);
break;
case 3004:
case 3005:
bsp_eeprom_save_data(kEep_HeatOn_OffTemp,data,(EepromDataType)(1 -(address % 2)));
break;
case 3006: //制冷开启温度(℃)
case 3007: //制冷关闭温度(℃)
bsp_eeprom_save_data(kEep_CoolOn_OffTemp,data,(EepromDataType)(1 -(address % 2)));
break;
case 3008: //额定容量
bsp_eeprom_save_data(kEep_RatedCapacity,data,kEepromDataType_Full);
break;
case 3009:
case 3010:
bsp_eeprom_save_data(kEep_InterCanProtocol_Baudrate,data,(EepromDataType)(1 - (address % 2)));
break;
case 3011: //485_1波特率 485_1校验位
case 3012:
bsp_eeprom_save_data(kEep_InterCanProtocol_Baudrate,data,(EepromDataType)(1 - (address % 2)));
break;
case 3013: //485_1设备地址
case 3014: //485_1设备协议
bsp_eeprom_save_data(kEep_InterRS485_SlaveID_Protocol,data,(EepromDataType)(address % 2));
break;
case 3015: //485_1波特率 485_1校验位
case 3016:
bsp_eeprom_save_data(kEep_Exter485_2Parity_Baudrate,data,(EepromDataType)(1 - (address % 2)));
break;
case 3017: //485_1设备地址
case 3018: //485_1设备协议
bsp_eeprom_save_data(kEep_ExterRS485_1SlaveID_Protocol,data,(EepromDataType)(address % 2));
break;
case 3019: //485_2波特率 485_2校验位
case 3020:
bsp_eeprom_save_data(kEep_Exter485_2Parity_Baudrate,data,(EepromDataType)(1 - (address % 2)));
break;
case 3021: //485_2设备地址
case 3022: //485_2设备协议
bsp_eeprom_save_data(kEep_ExterRS485_2SlaveID_Protocol,data,(EepromDataType)(address % 2));
break;
case 3023: //电流传感器1类型
case 3030: //电流传感器2类型
bsp_eeprom_save_data(kEep_CurSensor2_1Type,data,(EepromDataType)(1 - (address % 2)));
break;
case 3024: //霍尔摆幅电压mV
bsp_eeprom_save_data(kEep_HallSwingVolt,data,kEepromDataType_Full);
break;
case 3025: //电流传感器1量程A
case 3032: //电流传感器2量程A
bsp_eeprom_save_data(kEep_CurSensor2_1Range,data,(EepromDataType)(1 - (address % 2)));
break;
case 3026: //电流传感器1方向
case 3033: //电流传感器2方向
bsp_eeprom_save_data(kEep_CurSensor2_1Dir,data,(EepromDataType)(1 - (address % 2)));
break;
case 3027: //电流传感器1滤波A
case 3034: //电流传感器2滤波A
bsp_eeprom_save_data(kEep_ZeroFilter2_1Filter,data,(EepromDataType)(1 - (address % 2)));
break;
case 3028: //电流传感器1偏移AA
case 3035: //电流传感器2偏移AA
bsp_eeprom_save_data(kEep_CurSensor2_1Offset,data,(EepromDataType)(1 - (address % 2)));
break;
case 3029: //霍尔1矫正增益
bsp_eeprom_save_data(kEep_Shunt1CaliGain,data,kEepromDataType_Full);
break;
case 3036: //霍尔2矫正增益
bsp_eeprom_save_data(kEep_Shunt2CaliGain,data,kEepromDataType_Full);
break;
case 3037: //分流器额定电压(mV)
case 3038: //充电电流方向
bsp_eeprom_save_data(kEep_ChgCurDir_ShuntRatedVolt,data,(EepromDataType)(1 - (address % 2)));
break;
case 3039: //目标电流
if (KIT_ABS(bms_get_current()) != 0)
{
factor = (uint32_t)data * 1000 / KIT_ABS(bms_get_current()); // 扩大1000倍
}
bsp_eeprom_set_data(kEep_TargetCurrent, data, kEepromDataType_Full);
if ((factor > 900) && (factor < 1100))
{
bsp_eeprom_save_data(kEep_Hall1CalFactor, factor, kEepromDataType_Full);
}
else
{
bsp_eeprom_save_data(kEep_Hall1CalFactor, 1000, kEepromDataType_Full);
}
bsp_eeprom_save_data(kEep_TargetCurrent,data,kEepromDataType_Full);
break;
case 3040: //循环次数
bms_set_cycle(data);
bsp_eeprom_save_data(kEep_CycleTimes, data,kEepromDataType_Full);
break;
case 3041: //SOC设置
bms_set_soc(data);
bsp_eeprom_save_data(kEep_SOC, data,kEepromDataType_Full);
break;
case 3042: //SOE设置 //soc就是soe暂时替换
bms_set_soc(data);
break;
case 3043: //日充放电累计时间
case 3044: //日放电累计容量L
case 3045: //日放电累计容量H
case 3046: //日放电电量L
case 3047: //日放电电量H
case 3048: //日充电电电量L
case 3049: //日充电电电量H
case 3050: //日充电累计时间L
case 3051: //日充电累计时间H
case 3052: //日充电电电量L
case 3053: //日充电电电量H
case 3054: //放电累计时间L
case 3055: //放电累计时间H
case 3056: //放电累计容量L
case 3057: //放电累计容量H
case 3058: //放电累计电量L
case 3059: //放电累计电量H
case 3060: //充电累计时间L
case 3061: //充电累计时间H
case 3062: //充电累计容量L
case 3063: //充电累计容量H
case 3064: //放电累计电量L
case 3065: //放电累计电量H
case 3066: //下电时间L
case 3067: //下电时间H
bsp_eeprom_save_data(kEep_DayChg_DisTime + address - 3043,data,kEepromDataType_Full);
break;
case 3068: //SOC满充校准电压mV
case 3069: //SOC满放校准电压mV
bsp_eeprom_save_data(kEep_FullDisVolt + address - 3068,data,kEepromDataType_Full);
break;
case 3070: //SOC满充校准平均电压mV
case 3071: //SOC满放校准平均电压mV
bsp_eeprom_save_data(kEep_FullDisAvgVolt + address - 3070,data,kEepromDataType_Full);
break;
case 3072: //SOC过充校准总压电压值
case 3073: //SOC过放校准总压电压值
bsp_eeprom_save_data(kEep_FullChgTotalVolt + address - 3072,data,kEepromDataType_Full);
break;
case 3074: //SOC过充校准总压电压值
bsp_eeprom_save_data(kEep_ForbidChgRelVolt,data,kEepromDataType_Full);
break;
case 3075: //SOC过放校准总压电压值
bsp_eeprom_save_data(kEep_ForbidDisRelVolt,data,kEepromDataType_Full);
break;
case 3076: //禁放释放时间min
case 3077: //禁充释放时间min
bsp_eeprom_save_data(kEep_ForbidDisRelDelay + address - 3076,data,kEepromDataType_Full);
break;
case 3078: // OCV表索引
case 3079: // SOP表索引
bsp_eeprom_save_data(kEep_Sop_OcvIndex,data, (EepromDataType)(address % 2));
break;
case 3080: // OCV静置时间h
case 3081: // OCV静置电流A
bsp_eeprom_save_data(kEep_OcvStandbyCur_Time,data,(EepromDataType)(address % 2));
break;
case 3082: // OCV禁校上限%
case 3083: // OCV禁校下限%
bsp_eeprom_save_data(kEep_OcvDisRangeLower_Upper,data, (EepromDataType)(address % 2));
break;
case 3084: // SOC上限%
case 3085: // SOC下限%
bsp_eeprom_save_data(kEep_SOCRunMax_Min,data, (EepromDataType)(1 - (address % 2)));
break;
case 3086: // 额定总压V
case 3087: // 请求充电电压V
bsp_eeprom_save_data(kEep_RatedTotalVolt + address - 3086,data, kEepromDataType_Full);
break;
case 3088: // 额定充电电流AA
case 3089: // 额定放电电流AV
bsp_eeprom_save_data(kEep_RatedChgCur + address - 3088,data, kEepromDataType_Full);
break;
case 3090: // 额定充电功率(kw)(kw)
case 3091: // 额定放电功率(kw)
bsp_eeprom_save_data(kEep_RatedChgPower + address - 3090,data, kEepromDataType_Full);
break;
case 3092: // 充电末端一段降流电压V
case 3093: // 充电末端二段降流电压V
bsp_eeprom_save_data(kEep_ChgFstCurDownVolt + address - 3092,data, kEepromDataType_Full);
break;
case 3094: // 充电末端一段降流系数
case 3095: // 充电末端二段降流系数
bsp_eeprom_save_data(kEep_ChgSnd_FstCurDownRate,data, (EepromDataType)(address % 2));
break;
case 3096: // 充放电模式
bsp_eeprom_save_data(kEep_ChgDisMode_HighVoltStrategy,data, kEepromDataType_High);
break;
case 3097: // 目标电压
bsp_eeprom_save_data(kEep_TargetVolt,data, kEepromDataType_Full);
break;
case 3098: // 高压控制策略
bsp_eeprom_save_data(kEep_ChgDisMode_HighVoltStrategy,data, kEepromDataType_Low);
break;
case 3099: // 放电上电自检故障L
case 3100: // 放电上电自检故障H
case 3101: // 充电上电自检故障L
case 3102: // 充电上电自检故障H
bsp_eeprom_save_data(kEep_DisSelfFaultLow + address - 3099,data, kEepromDataType_Full);
break;
case 3103:// 绝缘使能
bsp_eeprom_save_data(kEep_InsuPeriod_Enable,data, kEepromDataType_Low);
break;
case 3104:// 上下电模式
bsp_eeprom_save_data(kEep_ChgDisChangeBasis_RelayOnOffMode,data, kEepromDataType_Low);
break;
case 3105: // Do1
case 3106: // DO2控制
case 3107: // DO3控制
case 3108: // DO4控制
case 3109: // DO5控制
case 3110: // DO6控制
case 3111: // DO7控制
case 3112: // DO8控制
bsp_eeprom_save_data(kEep_Relay2_1Type + ((address - 3105) / 2) ,data, (EepromDataType)(1 - (address % 2)));
break;
case 3113: // DO1类型
case 3114: // DO2类型
case 3115: // DO3类型
case 3116: // DO4类型
case 3117: // DO5类型
case 3118: // DO6类型
case 3119: // DO7类型
case 3120: // DO8类型
bms_force_crtl_do_status((DoType)(address - 3113), (DoCtrlStatus)data);
bsp_eeprom_save_data(kRelay2_1ForceCtrlStatus + (address - 3113) / 2 ,data, (EepromDataType)(1 - (address % 2)));
break;
case 3121: // DI1控制
case 3122: // DI2控制
case 3123: // DI3控制
case 3124: // DI4控制
case 3125: // DI5控制
case 3126: // DI6控制
case 3127: // DI7控制
case 3128: // DI8控制
bsp_eeprom_save_data(kEep_Di2_1Type + (address - 3121) / 2 ,data, (EepromDataType)(1 - (address % 2)));
break;
case 3129: // DI1类型
case 3130: // DI2类型
case 3131: // DI3类型
case 3132: // DI4类型
case 3133: // DI5类型
case 3134: // DI6类型
case 3135: // DI7类型
case 3136: // DI8类型
bsp_eeprom_save_data(kEep_Di2_1Polarity + (address - 3129) / 2 ,data, (EepromDataType)(1 - (address % 2)));
break;
case 3137: // DO1故障检测源
case 3138: // DO2故障检测源
case 3139: // DO3故障检测源
case 3140: // DO4故障检测源
case 3141: // DO5故障检测源
case 3142: // DO6故障检测源
case 3143: // DO7故障检测源
case 3144: // DO8故障检测源
bsp_eeprom_save_data(kEep_DO2_DO1_ErrSrc + (address - 3137) / 2 ,data,(EepromDataType) (1 - (address % 2)));
break;
case 3145: // 预充次数
case 3146: // 预充超时时间s
bsp_eeprom_save_data(kEep_PreChgTimeout_Count ,data, (EepromDataType)(1 - (address % 2)));
break;
case 3147: // HV电压比例%
case 3148: // 预充电压比例(%
bsp_eeprom_save_data(kEep_PreChgVoltType_Rate ,data, (EepromDataType)(1 - (address % 2)));
break;
case 3149: // 系统时间s
bcu_holding_reg.sys_time = data;
drv_rtc_set_tick(bcu_holding_reg.sys_time);
break;
case 3156: // 系统复位
//bsp_eeprom_save_data(kEep_IsSoftReset ,data, kEepromDataType_Full);
if(data == 1)
{
bms_soft_reset_save(kSoftReset_CmdCtrl, NULL, 0);
drv_misc_reset_mcu();
}
break;
case 3157: // 均衡开启电压mv
case 3158: // 均衡关闭电压mvmv
bsp_eeprom_save_data(kEep_DataBanlenceStartVolt + address - 3157 ,data, kEepromDataType_Full);
break;
case 3159: // 均衡开启压差mvmv
case 3160: // 均衡关闭压差mvmv
bsp_eeprom_save_data(kEep_BalanceOpenVolDiff_CloseVolDiff ,data,(EepromDataType) (1 - (address % 2)));
break;
case 3161: // 均衡路数
bsp_eeprom_save_data(kEep_BalanceNum ,data,kEepromDataType_Full);
break;
case 3162: // 均衡时间
bsp_eeprom_save_data(kEep_BalanceTime , data, kEepromDataType_Full);
break;
case 3163: // DO9控制
case 3164: // DO10控制
bsp_eeprom_save_data(kEep_Relay10_9Type + (address - 3163) / 2,data,(EepromDataType)(1 - (address % 2)));
break;
case 3165: // DO9类型
case 3166: // DO10类型
bms_force_crtl_do_status((DoType)(address - 3165 + 8), (DoCtrlStatus)data);
bsp_eeprom_save_data(kRelay10_9ForceCtrlStatus + (address - 3165) / 2 ,data, (EepromDataType)(1 - (address % 2)));
case 3167: // DO9故障源
case 3168: // DO10故障源
bsp_eeprom_save_data(kEep_DO10_DO9_ErrSrc + (address - 3167) / 2 ,data, (EepromDataType)(1 - (address % 2)));
break;
default:
break;
}
}
//gary add 高压上下电指令 20240710
void bcu_data_set_0x06_on_of_msg(uint16_t address,uint16_t data)
{
//uint16_t factor = 1000;
switch(address)
{
case 3200:
if(get_eeprom_data(kEep_ChgDisChangeBasis_RelayOnOffMode,kEepromDataType_Low) == kRunCtrl_Cmd)
{
if(data == 0)
{
bms_set_circuit_cmd_status(kCircuitStatus_Off);
}
else if(data == 1)
{
bms_set_circuit_cmd_status(kCircuitStatus_On);
}
}
break;
//预留
case 3201:
case 3202:
case 3203:
case 3204:
break;
default:
break;
}
return;
}
BspMdExCode bcu_modbus_485_0x06_fun(uint16_t start_addr, uint16_t reg_num, uint8_t *buf, uint16_t *len)
{
BspMdExCode err = kBspMdEx_None;
uint16_t data;
data = (buf[0] << 8) + buf[1];
2025-02-06 15:08:48 +08:00
//kit_time_dly_ms(50);
2024-11-26 15:52:49 +08:00
if((start_addr >= 3000) && (start_addr <= 3149))
{
bcu_data_set_0x06_msg(start_addr, data);
*len = reg_num << 1;
}
else if((start_addr >= 3157) && (start_addr <= 3169))
{
bcu_data_set_0x06_msg(start_addr, data);
*len = reg_num << 1;
}
else if((start_addr >= 3200) && (start_addr <= 3204))
{
bcu_data_set_0x06_on_of_msg(start_addr, data);
*len = reg_num << 1;
}
else if((start_addr >= 4000) && (start_addr <= 4999))
{
hmi_write_modbus_cfg(start_addr - 4000, data);
*len = reg_num << 1;
}
else if((start_addr >= 5700) && (start_addr <= 5999))
{
data = (buf[1] << 8) + buf[0];
data = bms_set_gate_write_data(start_addr - 5700, data);
bsp_eeprom_save_data(start_addr - 5700 + kEep_GateDataStart, data, kEepromDataType_Full);
*len = reg_num << 1;
}
else
{
err = kBspMdEx_InvalidAddr;
}
return err;
}
void bcu_modbus_set_time_to_bms_msg(uint8_t *buf)
{
uint16_t addr = 0, tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec;
tm_year = READ_BT_INT16U(buf, addr);
tm_mon = READ_BT_INT16U(buf,addr);
tm_mday = READ_BT_INT16U(buf,addr);
tm_hour = READ_BT_INT16U(buf,addr);
tm_min = READ_BT_INT16U(buf,addr);
tm_sec = READ_BT_INT16U(buf,addr);
drv_rtc_set_time(tm_hour, tm_min, tm_sec);
drv_rtc_set_date(tm_year, tm_mon, tm_mday);
}
BspMdExCode bcu_modbus_485_0x10_fun(uint16_t start_addr, uint16_t reg_num, uint8_t *buf, uint16_t *len)
{
uint8_t fill_buf[12],i = 0;
uint16_t data;
BspMdExCode err = kBspMdEx_None;
if((start_addr >= 3150)&&(start_addr <= 3155))
{
kit_copy_buf(&fill_buf[start_addr - 3150], &buf[0], 6 * 2);
bcu_modbus_set_time_to_bms_msg((uint8_t *)fill_buf);
}
else if((start_addr >= 3000) && (start_addr <= 3161))
{
for(i = 0; i < reg_num;i++)
{
data = (buf[i * 2] << 8) + buf[i * 2 + 1];
bcu_data_set_0x06_msg(start_addr + i, data);
}
}
2025-02-25 14:58:14 +08:00
//@wangk , 2-25, add 0x10function(4000~4449)
else if((start_addr >= 4000) && (start_addr <= 4449))
{
uint16_t *reg_data = (uint16_t *)buf;
for (uint16_t i = 0; i < reg_num; i++)
{
uint16_t reg_value = (reg_data[i] >> 8) | (reg_data[i] << 8);
uint16_t offset_addr = start_addr - 4000 + i;
hmi_write_modbus_cfg(offset_addr, reg_value);
2025-02-25 14:58:14 +08:00
}
}
2024-11-26 15:52:49 +08:00
else
{
2025-02-25 14:58:14 +08:00
err = kBspMdEx_InvalidAddr;
2024-11-26 15:52:49 +08:00
}
return err;
}
void protocol_modbus_bcu_init(void * const mb_item,uint16_t addr)
{
bsp_modbus_set_slaver_addr((ModbusItem *)mb_item, addr);
register_modbus_fun((ModbusItem *)mb_item, kModbusFun_0x03, bcu_modbus_485_0x03_fun);
register_modbus_fun((ModbusItem *)mb_item, kModbusFun_0x04, bcu_modbus_485_0x04_fun);
register_modbus_fun((ModbusItem *)mb_item, kModbusFun_0x06, bcu_modbus_485_0x06_fun);
register_modbus_fun((ModbusItem *)mb_item, kModbusFun_0x10, bcu_modbus_485_0x10_fun);
}