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

1289 lines
46 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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));
//READ_FC03_F04_ITEM(1, 5000);
//READ_FC03_F04_ITEM(1, test99+=10);
//2 动力电池组总电流
READ_FC03_F04_ITEM(2, bms_get_show_current());
//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 额定容量
READ_FC03_F04_ITEM(7, get_eeprom_data(kEep_RatedCapacity,kEepromDataType_Full) );
//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))
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;
case 3147: // 预充电压比例(%
case 3148: // 预充类型
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;
//kit_time_dly_ms(50);
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;
//kit_time_dly_ms(50);
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];
//kit_time_dly_ms(50);
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);
}
}
else
{
err = kBspMdEx_InvalidAddr;
}
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);
}