Files
2026-08-25 17:30:40 +08:00

1700 lines
58 KiB
C
Raw Permalink 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.
/**
******************************************************************************
* @file global.h
* @author Jerry Cai
* @version V2.1
* @date 19-April-2022
* @brief This file contains all the functions prototypes for the GPIO
* firmware library.
******************************************************************************
* @attention
*
*
******************************************************************************
*/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __GLOBAL_H
#define __GLOBAL_H
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "AFE_SH3673520.h"
//特殊功能选择
#define Key_PressLong 0 //按钮 0:短按模式 1:长按模式
#define Key_PressRST 0 //按钮复位 0:禁用 1:启用
#define Addr_SetAuto 1 //地址 0:手动分配 1:全自动分配地址
#define DO2_Warm 0 //充电低温触发打开加热继电器 0:禁用 1:启用
//三选一小板
#define BLE_Conn 1
#define WIFI_Conn 0
#define LTE_Conn 0
//6.3.LW的100A/150A版,AFE采样电阻是9个1mΩ,对应9倍
//6.3.LW的200A版,AFE采样电阻是18个1mΩ,对应18倍
//20020SF_V1.0采样电阻是18个1mΩ,对应18倍
//同步修改的有AFE电流保护参数,还有默认增益系数
#define AFE_Multiple 18
//参数改动涉及①Flash存储参数、②AFE写入参数、③SDWA默认参数、④特殊限流值
//达到充电过压报警后,发逆变器的充电限流(*个数):100A对应20A150A对应30A200A对应40A
#define Inv_curlimit 400
//在Flash占用地址长度
#define AFE_MCU_LEN 52 //bmsMem参数
#define PARAMEM_LEN 32*6 //paraMem参数 485地址:0x00-0x6F
#define HOSTMEM_LEN 32*5 //4G连接参数 485地址:0x20-0x8F
//EEPROM数据_IAP标志
#define EE_IAP 0x00,0x01,1 //IAP定位标志用的值(在用户程序里不启用)
#define EE_IAP_NEW1 0x02,0xFF,1 //IAP新位置1
#define EE_IAP_NEW2 0x03,0xFF,1 //IAP新位置2
#define EE_OTA_FINE 0x00,0xFF,1 //4G远程升级完成标志
//EEPROM数据_OTA升级标志
#define EE_OTA_FINE 0x00,0xFF,1 //4G远程升级完成标志
//EEPROM数据_不可初始化
#define EE_ADDR 0x00,0x00,1 //485通信地址
#define EE_IAP 0x00,0x01,1 //IAP定位标志用的值(在用户程序里不启用)
#define EE_LANG 0x00,0x02,1 //屏幕语言 0:英文 1:中文
#define EE_NO_UV 0x00,0x03,1 //在“欠压复位”前的欠压保护值
#define EE_ASSIGN 0x00,0x04,2 //自动分配的随机队列标志
#define EE_CALI_ZERO 0x00,0x08,4 //零点校准
#define EE_CALI_GAIN 0x00,0x0C,4 //增益校准
#define EE_Screen 0x00,0x10,1 //屏幕号
#define EE_Hardware 0x00,0x12,3 //硬件版本号
#define EE_Software 0x00,0x18,4 //软件版本号
#define EE_BMS_SN 0x00,0x20,10 //BMS SN号,外加一个crc8校验码 9字节+1CRC
#define EE_PACK_SN 0x00,0x30,16 //PACK SN号,外加一个crc8校验码 15字节(开放到最大)+1CRC
#define EE_OTA_FINE 0x00,0xFF,1 //4G远程升级完成标志
//EEPROM数据_备用数据
#define EE_TIME_BACKUP 0x01,0x00,6 //每次开机,若时间异常则录入该备份时间
#define EE_TIME_OCV 0x01,0x10,4 //每次开机,读取该值判断是否该执行OCV校准
//EEPROM数据_特殊按钮初始化
#define EE_NCC 0x02,0x00,2 //额定容量
#define EE_SOC 0x02,0x02,1 //电量SOC
#define EE_PROTOCOL 0x02,0x03,1 //协议
#define EE_CUMULI 0x02,0x04,2 //累积容量
#define EE_CYCLE 0x02,0x06,2 //循环次数
#define EE_SOH 0x02,0x08,1 //健康系数
#define EE_CUMULI_2 0x02,0x14,2 //累积容量(备份)
#define EE_CYCLE_2 0x02,0x16,2 //循环次数(备份)
#define EE_IAP_NEW1 0x02,0xFF,1 //IAP新位置1
//EEPROM数据_特殊功能需要
#define EE_FCC 0x03,0x00,8 //满充容量,单位mAS
#define EE_FCC_TIME 0x03,0x08,4 //校准满充容量的起始时间
#define EE_UNSUB 0x03,0x0F,1 //取消绑定原主题标志
#define EE_IAP_NEW2 0x03,0xFF,1 //IAP新位置2
//EEPROM数据_ParaMem有效数据_升级初始化
#define EE_PARA_ALL 0x04,0x00,PARAMEM_LEN //ParaMem当前范围
//EEPROM数据_报警记录相关
#define EE_SOE_INF 0x08,0x00,8 //报警记录信息(总):当前序号、当前记录地址、当前记录总数
#define EE_SOE_NUM 0x08,0x04,4 //当前序号
//EEPROM数据_报警记录,位置根据变量adrh,adrl决定
#define EE_SOE adrh,adrl,64
//EEPROM def - SOE extend cell17~20 voltage(6 bytes per record, addr=0x2900+index*6)
#define EE_SOE_EXT adrh,adrl,6
//EEPROM数据处理_清空扇区
#define EE_CLEAR adrh,adrl,64
//EEPROM clear - SOE extend cell17~20 voltage
#define EE_CLEAR_EXT adrh,adrl,6
#define BIT0 (0x1<<0)
#define BIT1 (0x1<<1)
#define BIT2 (0x1<<2)
#define BIT3 (0x1<<3)
#define BIT4 (0x1<<4)
#define BIT5 (0x1<<5)
#define BIT6 (0x1<<6)
#define BIT7 (0x1<<7)
#define BIT8 (0x1<<8)
#define BIT9 (0x1<<9)
#define BIT10 (0x1<<10)
#define BIT11 (0x1<<11)
#define BIT12 (0x1<<12)
#define BIT13 (0x1<<13)
#define BIT14 (0x1<<14)
#define BIT15 (0x1<<15)
#define CAN_TIMEOUT_COUNT 5000
#define SLEEP_MON_CNT 6000*(paraMem.sleep_min_disable&0x7FFF) //60*100个10ms=1min
#define SLEEP2_MON_CNT 6000*(paraMem.sleep2_min_disable&0x7FFF) //60*100个10ms=1min
#define UVOff_MON_CNT 30000 //5*60*100个10ms=5分钟
#define FCCCALI_MON_CNT 6000*(paraMem.cali_min_disable&0x7FFF) //60*100个10ms=1min
#define sleep2Vol paraMem.sleep2_vol //休眠方案2对应休眠电压,单位1mV
#define AddrMax 20
#define ProtocolSum 24 //实际存储协议数量
#define ProtocolIdxSum 40 //协议对应序号范围
/*三选一小板,状态/保护/报警的标志位*/
//状态
#define ChargeStatus ((bmsMem.bStatus3 & BIT7) != 0)
#define DischargeStatus ((bmsMem.bStatus3 & BIT6) != 0)
#define PreChargeStatus ((bmsMem.bStatus3 & BIT5) != 0)
#define ChgMosStatus ((bmsMem.bStatus3 & BIT1) != 0)
#define DsgMosStatus ((bmsMem.bStatus3 & BIT0) != 0)
#define PchgMosStatus ((bmsMem.bStatus3 & BIT2) != 0)
#define ChgLimitStatus ((bmsMem.balanceStatus & BIT4) != 0)
#define BalanceStatus ((bmsMem.balanceStatus & BIT0) != 0)
//特殊状态
#define LockOCC ((bmsMem.balanceStatus & BIT10) != 0)
#define LockOCD1 ((bmsMem.balanceStatus & BIT9) != 0)
#define LockOCD2 ((bmsMem.balanceStatus & BIT8) != 0)
#define LockSP ((bmsMem.balanceStatus & BIT6) != 0)
#define LockSC ((bmsMem.balanceStatus & BIT7) != 0)
#define ChgMosFault ((bmsMem.bStatus2 & BIT7) != 0)
#define DsgMosFault ((bmsMem.bStatus2 & BIT6) != 0)
#define DOStatus ((bmsMem.temperaStatus & BIT7) != 0)
#define ForceOffUV ((bmsMem.balanceStatus & BIT5) != 0)
//电压保护
#define PackOV ((bmsMem.bStatus1 & BIT8) != 0)
#define PackUV ((bmsMem.bStatus1 & BIT9) != 0)
#define CellOV ((bmsMem.bStatus1 & BIT0) != 0)
#define CellUV ((bmsMem.bStatus1 & BIT1) != 0)
#define PF ((bmsMem.bStatus1 & BIT6) != 0)
#define L0V ((bmsMem.bStatus3 & BIT3) != 0)
//电流保护
#define OCC ((bmsMem.bStatus1 & BIT4) != 0) || ((bmsMem.temperaStatus & BIT4) != 0)
#define OCD1 ((bmsMem.bStatus1 & BIT2) != 0) || ((bmsMem.temperaStatus & BIT5) != 0)
#define OCD2 ((bmsMem.bStatus1 & BIT3) != 0) || ((bmsMem.bStatus1 & BIT10) != 0)
#define SP ((bmsMem.bStatus1 & BIT5) != 0)
#define SC ((bmsMem.bStatus2 & BIT4) != 0)
//温度保护
#define McuOTC ((bmsMem.temperaStatus & BIT0) != 0)
#define McuOTD ((bmsMem.temperaStatus & BIT1) != 0)
#define McuUTC ((bmsMem.temperaStatus & BIT2) != 0)
#define McuUTD ((bmsMem.temperaStatus & BIT3) != 0)
#define AmbientOTC ((bmsMem.temperaStatus & BIT8) != 0)
#define AmbientOTD ((bmsMem.temperaStatus & BIT9) != 0)
#define AmbientUTC ((bmsMem.temperaStatus & BIT10) != 0)
#define AmbientUTD ((bmsMem.temperaStatus & BIT11) != 0)
#define MosOTC ((bmsMem.bStatus2 & BIT1) != 0)
#define MosOTD ((bmsMem.bStatus2 & BIT3) != 0)
#define MosUTC ((bmsMem.bStatus2 & BIT0) != 0)
#define MosUTD ((bmsMem.bStatus2 & BIT2) != 0)
//电压报警
#define PackOVWarning ((bmsMem.bStatus3 & BIT10) != 0)
#define PackUVWarning ((bmsMem.bStatus3 & BIT11) != 0)
#define CellOVWarning ((bmsMem.bStatus3 & BIT8) != 0)
#define CellUVWarning ((bmsMem.bStatus3 & BIT9) != 0)
//电流报警
#define OCCWarning ((bmsMem.bStatus3 & BIT12) != 0)
#define OCDWarning ((bmsMem.bStatus3 & BIT13) != 0)
//温度报警
#define McuOTCWarning ((bmsMem.bStatus2 & BIT12) != 0)
#define McuOTDWarning ((bmsMem.bStatus2 & BIT13) != 0)
#define McuUTCWarning ((bmsMem.bStatus2 & BIT14) != 0)
#define McuUTDWarning ((bmsMem.bStatus2 & BIT15) != 0)
#define AmbientOTCWarning ((bmsMem.temperaStatus & BIT12) != 0)
#define AmbientOTDWarning ((bmsMem.temperaStatus & BIT13) != 0)
#define AmbientUTCWarning ((bmsMem.temperaStatus & BIT14) != 0)
#define AmbientUTDWarning ((bmsMem.temperaStatus & BIT15) != 0)
#define MosOTCWarning ((bmsMem.bStatus2 & BIT8) != 0)
#define MosOTDWarning ((bmsMem.bStatus2 & BIT9) != 0)
#define MosUTCWarning ((bmsMem.bStatus2 & BIT10) != 0)
#define MosUTDWarning ((bmsMem.bStatus2 & BIT11) != 0)
/*三选一小板,公共常量*/
#define SETPARA_SUM 34 //可写参数总个数
#define GETPARA_SUM 34 //可读参数总个数
/*三选一小板,公共变量*/
extern char BMS_SN[10]; //9Byte
extern char PACK_SN[16]; //1~15Byte
extern char FirmwareVersion[11];//"4.00.00.00" 7~10Byte
extern char HardwareVersion[6]; //"6.3.L" 5Byte
extern char ScreenVersion[6]; //"03513" 5Byte
extern const char* Status[2]; //0对应false, 1对应true
extern char params_str[600]; //原始数据字符串
extern const char* putSrvc_reply_namestr; //写服务的名字字符串
extern const char* putSrvc_reply_str; //写服务的字符串格式
extern uint8_t putSrvc_reply_flg; //写服务回复标志 接收到ID号,就要以ID号的格式返回
extern const char* setPara_reply_name[SETPARA_SUM]; //写属性的名字字符串
extern uint16_t setPara_reply_temp[SETPARA_SUM]; //写属性的数值
extern uint8_t setPara_reply_pm[SETPARA_SUM]; //数值的正负 0:正数 1:负数 2true 3false
extern uint8_t setPara_reply_flg; //写属性回复标志 1:回复成功 0xAA:设备无所有要写的属性 0xBB:值不在范围,设备拒绝执行
extern uint8_t setPara_reply_num; //写属性回复个数
extern const char* getPara_reply_name[GETPARA_SUM]; //读属性的名字字符串
extern uint16_t getPara_reply_temp[GETPARA_SUM]; //读属性的数值
extern uint8_t getPara_reply_pm[GETPARA_SUM]; //数值的正负 0:正数 1:负数 2true 3false
extern uint8_t getPara_reply_flg; //读属性回复标志 1:回复成功 0xAA:设备无所有要读的属性
extern uint8_t getPara_reply_num; //读属性回复个数
extern uint8_t protocol_reply_flg; //协议在回复内容里的标志
extern uint8_t protocol_reply_index; //协议在回复内容里的位置
extern uint8_t RTC_UpdateFlag; //起始点刷新标志位,用以刷新休眠和欠压强制复位的时间
extern uint8_t LTE_WarmDelay; //4G模块开机等待时间
#define ResendTime 2
extern uint8_t LTE_ResendDelay; //4G模块对当前指令无回复,重试等待倒计时
#define WaitRxTime 2
extern uint8_t LTE_WaitRxDelay; //4G模块对当前指令无回复,重新发送等待倒计时
extern uint8_t LTE_WaitRxFlg; //已执行过的标志
extern uint8_t incident_flag; //4G上报_要执行上报事件的标志
extern uint8_t incident_DataFlg; //4G上报_要上报发生事件时的数据的标志 2:保护 1:其他 0:不用记录
extern const char* incident_str;
extern uint8_t incident_len;
extern uint32_t incident_time;
/*变量*/
extern uint8_t curLimitFlag;
extern uint8_t bDSGING; //放电状态标记
extern uint8_t bCHGING; //充电状态标记
extern uint8_t bSTANDBY; //待机状态标记
extern uint8_t modbusFaaRxFlg; //CADC零点校准数据接收正确标记
extern uint8_t modbusFbbRxFlg; //CADC增益校准数据接收正确标记
extern uint8_t modbus1FaaRxFlg; //CADC零点校准数据接收正确标记
extern uint8_t modbus1FbbRxFlg; //CADC增益校准数据接收正确标记
extern uint8_t protocol; //逆变器通信协议
extern CanTxMsg TxMessage[20];
extern CanRxMsg RxMessage;
extern uint8_t TxMailBox[20];
extern uint8_t CAN_SendCount;
extern int16_t TemperatureAverage; // 平均温度
extern int16_t TemperatureMax; // 最高温度
extern int16_t TemperatureMin; // 最低温度
extern uint16_t TemperatureMaxIndex; // 最高温度序号
extern uint16_t TemperatureMinIndex; // 最低温度序号
extern uint16_t ncc_Ah; //额定容量,单位1Ah
extern uint16_t fcc_Ah; //满充容量,单位1Ah
extern uint16_t rcc_Ah; //剩余容量,单位1Ah
extern uint16_t oldrcc_Ah;//用于比较得出增长的值,单位1Ah
extern uint8_t dsg_forbidFlg; //禁放标志,SOC小于10%的时候启用
extern uint8_t chg_forbidFlg; //禁充标志,SOC大于100%的时候启用
extern uint8_t chg_forceFlg; //强充标志,SOC小于10%的时候启用
extern uint16_t RequestFlag; //充放电允许位
extern uint32_t timecount; //当前计时s
extern uint8_t sleep_flag; //休眠执行标志位
extern uint8_t sleep_enableflag;//开启休眠功能标志位
extern uint32_t sleeptimecount; //休眠计时起点s
extern uint32_t sleep2timecount; //休眠2计时起点s
extern uint32_t uvofftimecount; //关闭欠压功能后的计时起点
extern uint16_t uvofftime; //关闭欠压功能的倒计时数
extern uint32_t ocvtimecount; //开路电压法的计时起点
extern uint32_t ocvtime; //开路电压法的倒计时数
extern uint8_t OCV_Wait_flag; //允许OCV校准走倒计时的标志
extern uint8_t OCV_CaliSOC_flag;//允许执行OCV校准获取当前电压对应soc的标志
extern uint8_t Cali_Soc_Flag;
extern uint16_t CaliSocMoniCount;
extern uint8_t TSC_Flag; //判断是真短路,要关闭预充的标志,显示“真短路保护”
extern uint8_t tscTimeCount;
extern uint8_t PCHG_Flag; //开启预充功能的标志,不会随短路保护消失而恢复
extern uint8_t pchgTimeCount;
extern uint32_t loadvol;
extern uint8_t LSEErrFlag; //外部低频晶振有问题的标志,需要让屏幕的时间不再显示
extern uint32_t sleep_Moni_Count;
extern uint32_t sleep2_Moni_Count;
extern uint16_t uvoff_Moni_Count;
extern uint16_t CTRL_Order; //上位机[临时]控制MOS关闭指令
extern uint8_t modbusCurDev; //主机当前的轮询对象,这里用来给屏幕轮询有个断点
extern uint8_t ConfigData_Index; //上位机求取数据对应地址
extern uint8_t Online_Flag; //上位机求某从机数据,主机代发后收到回复的标志,=1才对上位机进行回复
extern uint8_t scr_WrZero_Flg; //屏幕写零点校准
extern uint8_t scr_WrGain_Flg; //屏幕写增益校准
//extern uint8_t language; //屏幕语言
extern uint8_t scr_RdData_Index;//屏幕显示数据的地址,默认是自身addr,只有addr=1可以变化为其他地址
extern uint8_t scr_RdRecord_Flg;//屏幕只可以查看自身记录;当记录更新/清空/收到清空指令/进记录页面/上下翻动时,才会读EEPROM更新一次屏幕记录内容
extern uint8_t sdwa_WrAddr; //屏幕通过主机写从机地址的值
extern uint8_t sdwa_WrAddr_Flg; //屏幕通过主机写从机地址的标志 0不在写 1尝试中 2成功 3失败
#if Addr_SetAuto
extern uint8_t assignAddr_State; //按钮分配地址的状态 0未开始 1进行中 2结束
extern uint8_t assignAddr_Step; //自动分配地址当前步骤
extern uint8_t assignAddr_relay; //主机开机后延时2s再开始通信,等待地址变化
extern uint8_t assignAddr_485num; //分配地址后的在线个数,若存在从机才进行下发队列标志
extern uint16_t assignAddr_random; //主机完成分配后生成的随机数(AddrMax+1~65535),用来识别队列
extern uint8_t assignAddr_WrIndex_Flg; //主机执行下发队列标志数的标志
#endif
extern uint8_t cumuliCapClear_flag; //当上位机写入循环次数时,会清空累积容量
extern uint8_t OnlineNum; //BMS正常工作数量
extern uint8_t chg_curLimitNum; //充电限流置0的个数,SOC大于100%的时候启用
extern uint8_t dsg_curLimitNum; //放电限流置0的个数,SOC小于10%的时候启用
extern uint8_t chg_cur0Num; //因报警触发充电限流40A时,出现保护限流0A的个数
extern uint16_t cell_OV; //单体过压值
extern uint16_t cell_UV; //单体欠压值
extern uint16_t cell_OVR; //单体过压释放值
extern uint16_t cell_UVR; //单体欠压释放值
extern uint8_t chg_curlimitFlg; //充电限流(固定40A)的标志,出现总体过压或单体过压的时候启用
extern uint8_t ClearEE[4]; //用于清空存在EEPROM的计时起点
extern uint8_t tmpWrFCC[8]; //用于写入满充容量值
extern uint32_t fcc; //满充容量,单位mAS
extern uint8_t fcc_CaliStartFlag; //当开始充电时,如果此时SOC=0/1%,开始计时
extern uint32_t fcc_Calitimecount; //校准满充容量的计时起点
extern uint32_t fcc_Calitime; //校准满充容量的倒计时数,超过则不可更新
extern uint32_t fcc_Cali_Moni_Count;//在晶振异常时,也能在中间不关机时进行校准
extern uint8_t PollStop_flag; //主机暂停发送轮询的标志位
extern uint8_t PollStop_count; //主机暂停发送轮询的倒计时,再次收到则清零,30s
extern uint8_t protocolSwitchFail; //选择的协议不存在的标志
extern uint8_t protocolNum;
extern char protocolStrings[ProtocolSum][16];
extern uint8_t PCHG_startFlag; //开机预充标志 0:没执行 1:已完成
extern uint8_t TSC_detectFlag; //不开启预充时,AFE短路发生后,判断是否是真短路的标志
extern uint8_t sc_OccurFlag; //浪涌短路出现过的标志
extern int16_t cellVol[20]; //20串电压
extern int16_t cellVoltageMax;
extern int16_t cellVoltageMin;
extern uint8_t MOS_Close_Flg; //需要控制MOS全关的标志
extern uint8_t sc_close_flag; //控制浪涌短路保护关闭的标志
//Wh版屏幕需要
extern uint16_t cumuliCapacity; //累积容量,单位0.1Ah
/*IAP_V3.0*/
extern uint8_t IAP_Run; //执行程序时是否正常的标志
/*IAP_V3.0*/
extern char BMS_SN[10]; //9Byte
extern char PACK_SN[16]; //1~15Byte
extern char FirmwareVersion[11];//"4.00.00.00" 7~10Byte
extern char HardwareVersion[6]; //"6.3.L" 5Byte
extern char ScreenVersion[6]; //"03513" 5Byte
#if Key_PressLong
extern uint8_t ON_confirm_flg; //程序运行后,先确认开机 1:按键按下2s确认开机 2:确认开机后按键松开,可以监测下一次按键按下以判断复位和重启
extern uint8_t RST_confirm_flg; //按钮按下后,通过时长判断执行复位
extern uint8_t OFF_confirm_flg; //按钮按下后,通过时长判断确认断开电源维持,等按钮松开就关机
extern uint8_t power_old; //如果是正常工作时重启,保持开机
extern uint8_t power_state; //电源脚输出 0:应输出低,1:应输出高
#endif
extern uint8_t curLimit_ctrlFlag; //执行限流开/关的标志 0:关限流 1:开限流
extern uint8_t ClearArray_Flag; //在定时器函数中,执行清空队列标志的标志
extern uint8_t Screen_RevFlg;
extern uint8_t Screen_RevCount;
extern uint8_t Screen_RevHandlerFlg; //在主函数执行分析处理
extern uint8_t MODBUS_RevFlg;
extern uint8_t MODBUS_RevCount;
extern uint8_t MODBUS1_RevFlg;
extern uint8_t MODBUS1_RevCount;
/*三选一模块*/
#if BLE_Conn
extern uint8_t BLE_RevFlg;
extern uint8_t BLE_RevCount;
#endif
#if WIFI_Conn
extern uint8_t WIFI_RevFlg;
extern uint8_t WIFI_RevCount;
#endif
#if LTE_Conn
#define event_pub 0xA0
#define srvc_pub 0xA1
#define setPara_pub 0xA2
#define getPara_pub 0xA3
extern uint8_t LTE_RevFlg;
extern uint8_t LTE_RevCount;
extern uint8_t LTE_PinRST_Flag;
extern uint8_t MQTT_RST_flag; //重启MQTT服务 0xAA:多次重启失败
extern uint8_t MQTT_RST_step; //执行步骤 0~2:退出MQTT服务
extern uint8_t LTE_LINK_flag; //已连接到服务器的标志
extern uint8_t LTE_UNSUB_Flag;//需要先取消绑定的标志
extern uint8_t MQTT_START_flag; //执行连接MQTT服务器的标志
extern uint8_t MQTT_READY_flag; //MQTT执行正常通信流程的标志
extern uint8_t MQTT_timed_count; //定时上报[属性]的倒计时
extern uint8_t LTE_status; //执行内容
extern uint8_t LTE_step; //执行步骤
extern uint8_t LTE_sleep_flag; //4G也进入休眠标志
extern uint8_t pre_sleep_flag; //休眠前置标志
extern uint8_t pre_sleep_waitCnt; //休眠前置操作等待完成计数,若持续1min未执行结束,也直接跳到休眠最后一步:关闭4G
extern uint32_t sleepOn_time; //启动休眠时间
extern uint32_t sleepOff_time; //退出休眠时间
//屏幕显示对应特殊
extern uint8_t LTE_rssi; //信号强度
extern uint8_t LTE_Onlineflag; //4G模块联网标志 0:未联网 1:已联网 0xAA:错误,尝试重新联网解决
extern uint8_t LTEStatus_flg; //要传状态的标志
extern char LTEStatus_str[41]; //4G状态文本
//OTA升级所需调用
#define ERR_timeEnd2 60/2 //持续ERR后重启计数,因遇到ERR会2s后再发报文,所以/2 1min
#define LTE_Send LTE_printf
#define LTE_RX_BUF_LEN 1000 //接收的最大长度
#define LTE_TX_BUF_LEN 2000 //发送的最大长度
extern char LTE_Rx_Buf[LTE_RX_BUF_LEN];
extern char LTE_Tx_Buf[LTE_TX_BUF_LEN];
extern uint16_t LTE_Rx_BufIndex;
extern uint8_t CRESET_flag; //重启 0xAA:多次重启失败
extern uint8_t CRESET_step; //执行步骤 0~2:退出MQTT服务 3:重启
#define ask_lbs 0
#define ask_lbs_step1 0
//OTA升级
extern uint8_t LTE_OTA_Flag; //4G升级标志 1:收到升级相关报文
extern uint8_t LTE_OTA_fineFlag; //4G升级完成上报标志(上线后先上报升级完成) 0xAA:升级成功 0xBB:维持原程序
extern uint8_t OTAfine_WrFlg; //更新OTA升级成功/失败标志的标志 0xAA:更新到0 0xBB:更新到0xBB
#endif
//global
typedef union
{
uint8_t b8[2];
uint16_t b16;
}BYTE2;
//because false can be 1 2 3..., so true =0
typedef enum
{
FALSE = 1,
TRUE = 0,
} BOOL_STATE;
//
typedef struct
{
uint8_t l0v :1; //低压禁止充电
uint8_t deltavol:1; //压差保护
uint8_t packuvp :1; //电池组欠压保护
uint8_t packuvw :1; //
uint8_t pakcovp :1;
uint8_t pakcovw :1;
uint8_t celluvp :1;
uint8_t celluvw :1;
uint8_t cellovp :1;
uint8_t cellovw :1;
uint8_t rsvd :6;
}VOLTAGE_STATUS;
typedef union
{
VOLTAGE_STATUS bits;
uint16_t halfword;
}UNION_VOLTAGE_STATUS;
//
typedef struct
{
uint8_t sc :1; //
uint8_t ocd2p :1; //
uint8_t ocd1p :1; //
uint8_t ocdw :1; //
uint8_t occp :1;
uint8_t occw :1;
uint8_t dhg :1;
uint8_t chg :1;
uint8_t rsvd :8;
}CURRENT_STATUS;
typedef union
{
CURRENT_STATUS bits;
uint16_t halfword;
}UNION_CURRENT_STATUS;
//
typedef struct
{
uint8_t utdp :1; //放电低温保护
uint8_t utdw :1; //放电低温报警
uint8_t otdp :1; //放电高温保护
uint8_t otdw :1; //放电高温报警
uint8_t utcp :1; //充电低温保护
uint8_t utcw :1; //充电低温报警
uint8_t otcp :1; //充电高温保护
uint8_t otcw :1; //充电高温报警
uint8_t rsvd :8;
}TEMPERA_STATUS1;
typedef union
{
TEMPERA_STATUS1 bits;
uint16_t halfword;
}UNION_TEMPERA_STATUS1;
//
typedef struct
{
uint8_t T6_utp :1; //T6低温保护
uint8_t T6_utw :1; //T6低温报警
uint8_t T6_otp :1; //T6高温保护
uint8_t T6_otw :1; //T6高温报警
uint8_t T5_utp :1; //T5低温保护
uint8_t T5_utw :1; //T5低温报警
uint8_t T5_otp :1; //T5高温保护
uint8_t T5_otw :1; //T5高温报警
uint8_t T4_utp :1; //T4低温保护
uint8_t T4_utw :1; //T4低温报警
uint8_t T4_otp :1; //T4高温保护
uint8_t T4_otw :1; //T4高温报警
uint8_t rsvd :4;
}TEMPERA_STATUS2;
typedef union
{
TEMPERA_STATUS1 bits;
uint16_t halfword;
}UNION_TEMPERA_STATUS2;
//
typedef struct
{
uint8_t dsg :1; //
uint8_t chg :1; //
uint8_t pchg :1; //
uint8_t rsvd0 :5;
uint8_t rsvd1 :8;
}MOSFET_STATUS;
typedef union
{
MOSFET_STATUS bits;
uint16_t halfword;
}UNION_MOSFET_STATUS;
//
typedef struct
{
uint8_t flashUpdate :1; //flash更新标志
uint8_t eepromUpdate :1; //eeprom更新标志
uint8_t rsvd0 :6;
}PACK_STATUS;
typedef union
{
PACK_STATUS bits;
uint8_t byte;
}UNION_PACK_STATUS;
extern UNION_VOLTAGE_STATUS staVol;
extern UNION_CURRENT_STATUS staCur;
extern UNION_TEMPERA_STATUS1 staTemp1;
extern UNION_TEMPERA_STATUS2 staTemp2;
extern UNION_MOSFET_STATUS staMos;
extern UNION_PACK_STATUS staPack;
//OCV曲线数据结构体
typedef struct
{
uint8_t soc; // SOC百分比
uint16_t ocv_dp; // DP模式静置电压(放电)
uint16_t ocv_cp; // CP模式静置电压(充电)
}OCV_Data;
extern OCV_Data ocv_data[15];
//注意结构体数据对齐,否则会莫名奇妙问题
typedef struct
{
//数据及状态采集
uint16_t vCell[16]; // 电芯单体电压 mv
uint32_t packVoltage; // 电芯总电压 mv
int32_t packCurrent; // 实时电流 mA
uint16_t cellVoltageMax; // 电芯单体最高电压 mv
uint16_t cellVoltageMin; // 电芯单体最低电压 mv
uint16_t cellVoltageMaxIndex; // 电芯单体最高电压序号
uint16_t cellVoltageMinIndex; // 电芯单体最低电压序号
uint16_t afe_T1; // AFE测量温度 .c
uint16_t afe_T2; // AFE测量温度 .c
uint16_t afe_T3; // AFE测量温度 .c
uint16_t mcu_T1; // MCU测量温度 .c
uint16_t mcu_T2; // MCU测量温度 .c
uint16_t mcu_T3; // MCU测量温度 .c
uint16_t mcu_T4; // MCU测量温度 .c
int16_t cadcAveVal; // AFE电流初始值,用于电流零点校准
uint32_t ncc; // 系统额定容量 mAS
uint32_t rcc; // 电池包当前剩余电量 mAS
uint16_t soc; // 电池包的剩余电量百分比 %
uint16_t cycleCount; // 累计放电次数
uint16_t bStatus1; //
uint16_t bStatus2; //
uint16_t bStatus3; //
int16_t cadcZero; // 零点校准系数
int16_t cadcGain; // 增益校准系数
uint16_t temperaStatus; // 温度保护状态, BIT0-充电高温; BIT1-放电高温; BIT2-充电低温; BIT3放电低温
uint16_t balanceStatus; // 主动均衡状态, BTI0-均衡开启; BIT1-均衡失败
uint8_t packStatus; //
uint8_t soh; // *8.22新加:电池健康系数(原本的位置显示循环次数了,而原本的packStatus没真正启用过)
//AFE 内部EEPROM 26bytes,数据同时备份到内部FLASH A B
uint8_t ee_sconf1; // 002EH
uint8_t ee_sconf2;
uint8_t ee_ovt_ldrt_ovh; // 002CH
uint8_t ee_ovl;
uint8_t ee_uvt_ovrh;
uint8_t ee_ovrl;
uint8_t ee_uv;
uint8_t ee_uvr;
uint8_t ee_balv;
uint8_t ee_prev;
uint8_t ee_l0v;
uint8_t ee_pfv;
uint8_t ee_ocd1v_ocd1t;
uint8_t ee_ocd2v_ocd2t;
uint8_t ee_scv_sct;
uint8_t ee_occv_occt;
uint8_t ee_most_ocrt_pft;
int8_t otc;
int8_t otcr;
int8_t utc;
int8_t utcr;
int8_t otd;
int8_t otdr;
int8_t utd;
int8_t utdr;
uint8_t ee_tr; //TR是温度内部参考电阻系数
//20230221------------------
int8_t mcu_otc;
int8_t mcu_otcr;
int8_t mcu_utc;
int8_t mcu_utcr;
int8_t mcu_otd;
int8_t mcu_otdr;
int8_t mcu_utd;
int8_t mcu_utdr;
uint8_t mcu_occ; //charging over current
uint8_t mcu_ocd; //discharging over current
uint8_t mcu_occ_t;
uint8_t mcu_ocd_t;
uint8_t mcu_ocr_t; //过流保护恢复事件,255 - 不自动恢复
uint8_t mcu_crc;
//20230221---------------
//20230614---------------
uint8_t CHGLimit_Value; //通过上位机改变限流板保护电流 A //0x42
uint8_t CHGLimit_Count; //通过上位机改变限流板保护时间 S
uint16_t CHGLimit_ReleaseCount; //通过上位机改变限流板保护恢复时间 S
//20230614---------------
//20230705---------------
uint16_t inverter_chgVolLimit; //通过上位机修改通信给逆变器的限压限流值
uint16_t inverter_dsgVolLimit; //单位0.1V
uint16_t inverter_chgCurLimit;
uint16_t inverter_dsgCurLimit; //单位0.1A
//20230705---------------
/**** 下面是写入过程数据,不需要上位机可读取 ****/
//20230411---------------
uint8_t write_Addr; //通过上位机改变板子的通信地址
uint8_t addr_crc;
//20230411---------------
//20230523---------------
uint16_t write_Capacity; //通过上位机改变电池容量显示 //10.12改成u16,范围上限65535
//20230523---------------
//20231109---------------
uint8_t write_Soc; //通过上位机改变板子的通信地址
uint8_t soc_crc;
//20231109---------------
//并机时主机通过485采集下面数据处理
//保护字节和报警字节取或
//SOC和SOH取平均
//电流取累加
//温度取MCU最大值
uint16_t can_status_byte1; //0x4B 3.4
uint16_t can_status_byte2; //5.6
uint16_t can_status_byte3; //7.8
uint16_t can_status_byte4; //9.10
uint8_t can_soc; //12
uint8_t can_soh; //11
int16_t can_cur; //13.14
int16_t can_temp; //15.16
uint16_t can_VolMax; //17.18 电芯单体最高电压 mv
uint16_t can_VolMin; //19.20 电芯单体最低电压 mv
uint16_t can_VolMaxIndex; //21.22 电芯单体最高电压序号
uint16_t can_VolMinIndex; //23.24 电芯单体最低电压序号
int16_t can_TempMax; //25.26 最高温度
int16_t can_TempMin; //27.28 最低温度
uint16_t can_TempMaxIndex; //29.30 最高温度序号
uint16_t can_TempMinIndex; //31.32 最低温度序号
uint16_t can_ArrayIndex; //33.34 主机下发队列序号,与自动分配地址相关
//Wh版屏幕,显示功率总耗
uint16_t can_cumuliCap; //35.36 累计容量
uint16_t can_cycleCnt; //37.38 循环次数
//EEPROM AT24CXX数据
uint16_t E2_485Addr; //485通讯地址 主机地址一般为1,从机地址顺序
uint16_t E2_485Baud; //485通讯波特率,保留
uint16_t E2_485Snum; //485从机数量
uint16_t E2uiChgEndVol; //充电截止电压
uint16_t E2uiDsgEndVol; //放电截止电压
uint16_t E2uiVOC[10]; //SOC标定电压值
uint8_t ucCellNum; //BMS当前电池节数
//SH36735XX系列扩展电芯17~20电压
uint16_t vCell2[4]; //电芯17~20电压 mv(仅SH36735XX使用)
}BMS_MEMORY ;
//专门存储配置参数,对应功能码f3 f4
typedef struct
{
/** 读写地址0x00-0x0F EEPROM地址0x0400-0x041F **/
//20240419 主动均衡参数(单读写)
uint8_t act_bal_startV; //0x00 开启压差
uint8_t act_bal_stopV; // 释放压差
uint16_t act_bal_stopT; //0x01 释放延时
//20240821 SOH计算参数(单)
uint8_t sohcali_transCent; //0x02 累积容量/循环次数的转换百分比 1~100
uint8_t sohcali_minSOH; // 最低健康系数
uint16_t sohcali_startTime; //0x03 100%对应的最大循环次数
uint16_t sohcali_stopTime; //0x04 最大循环次数
//20241023 浪涌短路锁定参数(暂不读写)
uint8_t scWait_T; //0x05 浪涌短路消失后,对下一次浪涌短路的等待时间 单位1s
uint8_t scWaitNum; // 浪涌短路的持续次数,次数溢出显示“浪涌短路锁定”
//20241023 预充参数(暂不读写)
uint8_t pchg_startTime; //0x06 开机预充延时
uint8_t pchg_Time; // 开放电MOS前预充延时
uint8_t pchg_scVol; //0x07 预充时的真短路判断电压
uint8_t sp_scVol; // 浪涌短路时的真短路判断电压
//20250313 禁充/禁放/强充(单)
uint16_t requestFlg_enable; //0x08 启用请求标志的标志 bit7:充电允许 bit6:放电允许 bit5:强充
uint8_t chg_forbid_Soc; //0x09 禁充开启SOC
uint8_t chg_forbid_rSoc; // 禁充释放SOC
uint8_t dsg_forbid_Soc; //0x0A 禁放开启SOC
uint8_t dsg_forbid_rSoc; // 禁放释放SOC
uint8_t chg_force_Soc; //0x0B 强充开启SOC
uint8_t chg_force_rSoc; // 强充释放SOC
//20250402 满充方式和方式4参数(单)
uint8_t soc100_methods; //0x0C 满充方式使能 bit0:单芯过压 bit1:总体过压 bit2:逆变器限压+2A小电流 bit3:满充电压+截止电流
uint8_t soc100_cur; // 截止电流默认5A,单位0.1A
uint16_t soc100_vol; //0x0D 满充电压默认56V,单位0.1V
uint8_t rsvd0[4]; //0x0E-0x0F
/** 读写地址0x10-0x1F EEPROM地址0x0420-0x043F **/
//20240513 长时间待机定时休眠(单)
uint16_t sleep_min_disable; //0x10 纯定时休眠 bit15:休眠禁用 bit0~14:休眠时间min
//20240924 地址控制(暂不读写)
uint16_t addr_FREE_Flg; //0x11 地址手动控制标志,默认0
//20241023 充放启用[长期]控制,重启不可初始化(暂不读写)
uint16_t ctrl_disable; //0x12 bit0:关放电MOS bit1:关充电MOS bit2:关预充 [驻启使用bit3]
//20250519 满充容量校准
uint16_t cali_min_disable; //0x13 bit15:满充容量校准禁用 bit0-14:等待时间
//20250402 低电压待机定时休眠(单)
uint16_t sleep2_min_disable;//0x14 bit15:休眠2禁用 bit0~14:休眠时间min
uint16_t sleep2_vol; //0x15 低电压休眠电压
//20250410 定时校准SOC-开路电压法(单)
uint16_t ocv_min_disable; //0x16 bit15:定时校准禁用 bit0~14:定时时间min
uint8_t ocv_soc_Range; //0x17 定时校准的赋值SOC范围
uint8_t ocv_T_Range; // 定时校准的赋值温度范围
uint16_t temp_disable; //0x18 bit0~4:电池温度1~4的失效开/关控制
uint8_t rsvd1[14]; //0x19-0x1F [0x18~0x1C驻启有参数]
/** 读写地址0x20-0x2F EEPROM地址0x0440-0x045F **/
//20250404 总体过压欠压保护(总读写)
uint16_t pack_ovv; //0x20 总体过压保护 单位0.1V
uint16_t pack_ovrv; //0x21 总体过压保护释放 单位0.1V
uint16_t pack_uvv; //0x22 总体欠压保护 单位0.1V
uint16_t pack_uvrv; //0x23 总体欠压保护释放 单位0.1V
uint8_t pack_ovt; //0x24 总体过压保护延时 单位1s
uint8_t pack_uvt; // 总体过压保护延时 单位1s
//20250405 放电过流2保护(总读写)
uint16_t mcu_ocd2; //0x25 放电过流2保护电流 单位A
uint16_t mcu_ocd2_t; //0x26 放电过流2保护延时 单位10ms
//20250405 环境温度保护(总读写)
int8_t am_otc; //0x27 环境充电高温
int8_t am_otcr; // 环境充电高温释放
int8_t am_utc; //0x28 环境充电低温
int8_t am_utcr; // 环境充电低温释放
int8_t am_otd; //0x29 环境放电高温
int8_t am_otdr; // 环境放电高温释放
int8_t am_utd; //0x2A 环境放电低温
int8_t am_utdr; // 环境放电低温释放
uint8_t cellovr_soc; //0x2B 单体过压释放SOC
uint8_t packovr_soc; // 总体过压释放SOC
uint8_t PACK_NUM; //0x2C 并机最大个数
uint8_t rsvd2_0[1]; //0x2C [驻启有参数]
uint8_t rsvd2_1[3]; //0x2D
//20260722
uint8_t ee_sconf4; //0x2E SH36735XX系列SCONF4寄存器串数配置
//20260716
uint16_t sc_mode; //0x2F AFE芯片+短路倍数
/** 读写地址0x30-0x3F EEPROM地址0x0460-0x047F **/
//20250408 报警参数(总读写)
uint16_t alarm_cov; //0x30 单体过压告警
uint16_t alarm_cuv; //0x31 单体欠压告警
uint16_t alarm_pov; //0x32 总体过压告警
uint16_t alarm_puv; //0x33 总体欠压告警
uint8_t alarm_occ; //0x34 充电过流告警
uint8_t alarm_ocd1; // 放电过流1告警
int8_t alarm_mcu_otc; //0x35 电芯充电高温告警
int8_t alarm_mcu_utc; // 电芯充电低温告警
int8_t alarm_mcu_otd; //0x36 电芯放电高温告警
int8_t alarm_mcu_utd; // 电芯放电低温告警
int8_t alarm_am_otc; //0x37 环境充电高温告警
int8_t alarm_am_utc; // 环境充电低温告警
int8_t alarm_am_otd; //0x38 环境放电高温告警
int8_t alarm_am_utd; // 环境放电低温告警
int8_t alarm_afe_otc; //0x39 MOS充电高温告警
int8_t alarm_afe_utc; // MOS充电低温告警
int8_t alarm_afe_otd; //0x3A MOS放电高温告警
int8_t alarm_afe_utd; // MOS放电低温告警
uint8_t rsvd3[10]; //0x3B-0x3F [驻启有参数]
/** 读写地址0x40-0x4F EEPROM地址0x0480-0x049F **/
//20250410 开路电压法-OCV放电曲线(单)
uint16_t ocv_dpBuf[15]; //0x40-0x4E 放电曲线
uint8_t rsvd4[2]; //0x4F
/** 读写地址0x50-0x5F EEPROM地址0x04A0-0x04BF **/
//20250410 开路电压法-OCV充电曲线(单)
uint16_t ocv_cpBuf[15]; //0x50-0x5E 充电曲线
uint8_t rsvd5[2]; //0x5F
/** 读写地址0x50-0x5F EEPROM地址0x04A0-0x04BF **/
//0x60-0x6F [驻启有参数]
}PARA_MEMORY ;
//逆变器通信SRNE 结构体
typedef struct
{
//数据及状态采集
int16_t packCurrent; // 实时电流 mA
uint16_t packVoltage; // 电芯总电压 mv
uint8_t soc; // 电池包的剩余电量百分比 %
uint8_t socH;
uint8_t soh; // 电池健康系数 %
uint8_t sohH;
uint16_t rcc; // 电池包当前剩余电量 mAH
uint16_t fcc; // 系统满充容量 mAH
uint16_t dcc; // 设计容量 mAH
uint16_t cyc; // 蓄电池循环计数 mAH
uint16_t rsvd1;
uint16_t alarm_byte; //报警
uint16_t protect_byte; //保护
uint16_t status_byte; //状态/故障标志
uint16_t balanceStatus; //平衡状态
uint16_t rsvd2;
uint16_t rsvd3;
uint16_t vCell[16]; // 电池电压 mv
int16_t Tcell[4]; // 电池温度 .c
int16_t afe_MOS; // MOS温度 .c 赋值两个MOS温度的平均值
int16_t afe_MCU; // 环境温度 .c 赋值芯片温度
int16_t chgVolLimit; //
int16_t chgCurLimit; //
int16_t dsgCurLimit; //
}PROTOCOL_SRNE_MEMORY ;
//逆变器通信Voltronic 结构体
typedef struct
{
uint16_t rsvd1; //协议地址从0x0001开始
uint16_t protocolType; //协议类型
uint16_t protocolVer; //协议版本
uint16_t SoftwareH; //BMS软件版本
uint16_t SoftwareL;
uint16_t HardwareH; //BMS硬件版本
uint16_t HardwareL;
uint16_t rsvd2[9];
uint16_t cellNum; // 串联电芯数量
uint16_t cellVol[20]; // 电芯电压1-16 (17~20暂无)
uint16_t tempNum; // 温度传感器数量
uint16_t T[10]; // 1-4电池温度 5芯片温度 6MOS温度平均值 (7-10暂无)
uint16_t chg_packCurrent; // 模块充电电流
uint16_t dsg_packCurrent; // 模块放电电流
uint16_t packVoltage; // 模块电压
uint16_t soc; // soc
uint16_t fccH; // 模块总容量
uint16_t fccL;
uint16_t packNum; // 并联电池包数量
uint16_t chg_alarm_byte; // 充电报警
uint16_t dsg_alarm_byte; // 放电报警
uint16_t chg_protect1_byte; // 充电保护
uint16_t chg_protect2_byte; // 充电保护2
uint16_t dsg_protect1_byte; // 放电保护
uint16_t dsg_protect2_byte; // 放电保护2
uint16_t packstatus; // BMS状态
uint16_t dccH; // 设计容量
uint16_t dccL;
uint16_t cellNum2; // 串联电芯数量
uint16_t Vol_status[10]; // 电芯电压状态1/2,3/4……
uint16_t rsvd3[5];
uint16_t tempNum2; // 温度传感器数量
uint16_t T_status[5]; // BMS温度状态1/2,3/4……
uint16_t rsvd4[10];
uint16_t other_status[10];
uint16_t rsvd5[6];
uint16_t chgVolLimit; // 充电电压限制
uint16_t dsgVolLimit; // 放电电压限制
uint16_t chgCurLimit; // 充电电流限制
uint16_t dsgCurLimit; // 放电电流限制
uint16_t status_byte; // 充放电允许
uint16_t runtime; // 剩余运行时间
uint16_t rccH; // 电池包当前剩余电量 mAH
uint16_t rccL;
}PROTOCOL_VOLTRONIC_MEMORY ;
//逆变器通信SMK 结构体
typedef struct
{
uint16_t rsvd[19]; //00~18
uint16_t status_byte; //19 状态位
uint16_t rsvd2; //20 预留
int16_t soc; //21 soc %
int16_t packVoltage; //22 模块电压 10mV
int16_t packCurrent; //23 模块电流 10mA
uint16_t rsvd3; //24 预留
int16_t chgCurLimit; //25 最大充电电流 10mA
int16_t rcc; //26 电池包当前剩余电量 10mAH
int16_t fcc; //27 系统满充容量 10mAH
uint16_t rsvd4[5]; //28~32 预留
int16_t chgVolLimit; //33 最大充电电压 10mV
uint16_t rsvd5; //34 预留
int16_t dcsCurLimit; //35 最大放电电流 10mA
}PROTOCOL_SMK_MEMORY ;
//逆变器通信Growatt 结构体
typedef struct
{
uint16_t rsvd1; //00 起始位(占位)
uint16_t MCU_softV; //01 MCU软件版本
uint16_t Gauge_V; //02 Gauge版本
uint16_t Gauge_FR_VL; //03 Gauge FR版本L
uint16_t Gauge_FR_VH; //04 Gauge FR版本H
uint16_t D_T1; //05 Date&Time1
uint16_t D_T2; //06 Date&Time2
uint16_t D_T3; //07 Date&Time3
uint16_t D_T4; //08 Date&Time4
uint16_t Bar_C1L; //09 条形码1L
uint16_t Bar_C1H; //0A 条形码1H
uint16_t Bar_C2; //0B 条形码2
uint16_t Bar_C3; //0C 条形码3
uint16_t companyL; //0D 公司信息L
uint16_t companyH; //0E 公司信息H
uint16_t Using_C; //0F 型号(大写)
uint16_t Gau_IC; //10 IC电流
uint16_t Date1_TimeL; //11 日期、时间L
uint16_t Date1_TimeH; //12 日期、时间H
uint16_t status_byte; //13 状态位
uint16_t protect_byte; //14 保护
uint16_t soc; //15 soc %
uint16_t packVoltage; //16 模块电压 10mV
uint16_t packCurrent; //17 模块电流 10mA
int16_t T_Average; //18 电芯温度 ℃
uint16_t chgCurLimit; //19 充电电流限制 10mA
uint16_t rcc; //1A 电池包当前剩余电量 10mAH
uint16_t fcc; //1B 系统满充容量 10mAH
uint16_t FW; //1C YW/FW
uint16_t Delta; //1D 压差 mV
uint16_t cyc; //1E 循环次数
uint16_t Master_Box; //1F
uint16_t soh; //20 电池健康系数 %
uint16_t CV_Vol; //21 CV电压 10mV
uint16_t alarm_byte; //22 报警
uint16_t dsgCurLimit; //23 放电电流限制 10mA
uint16_t Ext_Err; //24 扩展错误
uint16_t cellVolMax; //25 电芯单体最高电压 mV
uint16_t cellVolMin; //26 电芯单体最低电压 mV
uint16_t cellVolMaxIndex; //27 电芯单体最高电压序号,范围0-15
uint16_t cellVolMinIndex; //28 电芯单体最低电压序号,范围0-15
uint16_t cellNum; //29 串联电芯数量(单模块电池串联数量)
uint16_t UpdateFlg; //2A 升级标志
uint16_t rsvd2[6]; //2B~30
//Box并联时上报第2组电池规格和状态查询信息
uint16_t MCU2_softV; //31 软件版本
uint16_t Gau2_Ver; //32 Gauge版本
uint16_t Gau2_FR_VerL; //33 Gauge FR 版本L
uint16_t Gau2_FR_VerH; //34 Gauge FR 版本H
uint16_t Date2_Time1; //35 日期、时间1
uint16_t Date2_Time2; //36 日期、时间2
uint16_t Date2_Time3; //37 日期、时间3
uint16_t Date2_Time4; //38 日期、时间4
uint16_t Bar2_codeL; //39 条形码1L
uint16_t Bar2_codeH; //3A 条形码1H
uint16_t Bar2_code2; //3B 条形码2
uint16_t Bar2_code3; //3C 条形码3
uint16_t company2L; //3D 公司名称L
uint16_t company2H; //3E 公司名称H
uint16_t Mod2_num; //3F 产品型号
uint16_t Gau2_IC_Cur; //40 Gauge IC 电流 10mA
uint16_t Date2_Time5L; //41 日期、时间L
uint16_t Date2_Time5H; //42 日期、时间H
uint16_t status2_byte; //43 状态位
uint16_t protect2_byte; //44 保护
uint16_t soc2; //45 soc %
uint16_t packVoltage2; //46 模块电压 10mV
uint16_t packCurrent2; //47 模块电流 10mA
int16_t T_Average2; //48 温度(平均) -127~127℃
uint16_t chg2_CurLimit; //49 充电电流限制
uint16_t rcc2; //4A 电池包当前剩余电量 10mAH
uint16_t fcc2; //4B 系统满充容量 10mAH
uint16_t YW_FW2; //4C 软硬件版本号 范围1~9
uint16_t Delta2; //4D 压差 V
uint16_t cyc2; //4E 蓄电池循环计数 mAH
uint16_t Mas2_Box; //4F 主机回复
uint16_t soh2; //50 电池健康系数 %
uint16_t CV2_Vol; //51 CV电压
uint16_t alarm2_byte; //52 报警1
uint16_t rsvd3[29]; //53~6F
uint16_t Bar_ID; //70 电池组ID
uint16_t cellVol[16]; //71~80 电芯电压1-16
//Box 并联时上报第 2 组电池单体电压信息:
uint16_t cellVol2[16]; //81~90 电芯电压1-16
}PROTOCOL_Growatt_MEMORY ;
//电流校准结构体
typedef struct
{
int32_t current; //校准电流点电流
int16_t cadcZero; //零点校准值
int16_t cadcGain; //增益校准值
uint16_t cmdZero; //零点校准标记
uint16_t cmdGain; //增益校准标记
uint16_t flagWrZeroToEE;
uint16_t flagWrGainToEE;
uint16_t flagZeroCaliFail;
uint16_t flagGainCaliFail;
int16_t tempCur;
int16_t rsvd;
}CALI_STRUCT;
extern CALI_STRUCT cali;
typedef struct
{
uint16_t status_byte1;
uint16_t status_byte2;
uint16_t status_byte3;
uint16_t status_byte4;
uint16_t soc;
uint16_t soh;
int32_t cur;
int32_t temp;
uint16_t VolMax;
uint16_t VolMin;
uint16_t VolMaxIndex;
uint16_t VolMinIndex;
uint16_t TempMax;
uint16_t TempMin;
uint16_t TempMaxIndex;
uint16_t TempMinIndex;
//Wh版屏幕,显示功率总耗
uint16_t cumuliCap;
uint32_t cycleCnt;
//负值矫正后的最高最低电压
int16_t cellVoltageMax;
int16_t cellVoltageMin;
int16_t com;
}CAN_MEMORY;
//版本号结构体
typedef struct
{
uint8_t Hardware[3];
uint8_t Screen;
uint8_t Software[4];
uint8_t BMS_SN[9]; //BMS生产批次
uint8_t BMS_crc8;
uint8_t PACK_SN[15]; //PACK产品序列号,最大15字节
uint8_t PACK_crc8;
uint8_t rsvd1[30]; //驻启SN号位置,预留以区分
//存在Flash中,升级可更改的
/** 读写地址0x20-0x5F **/
char host[40+2]; //4G平台_域名
uint16_t port; //4G平台_端口
char UserName[40+2]; //4G平台_用户名
char PassWord[40+2]; //4G平台_密码
/** 读写地址0x60-0x6F **/
char ClientID[23+2]; //4G平台_设备唯一标识符
uint8_t hostAll_crc; //4G平台信息的CRC校验码
uint8_t rsvd4[6]; //预留
}VERSION_MEMORY ;
//在线总数据结构体
typedef struct
{
uint8_t Online[AddrMax+2]; //轮询中的从机在线情况,Online[0]代表在线个数,Online[i]=0xAA说明地址i在线
uint16_t vol; //同步地址1当前电压 单位0.01V
int16_t cur; //同步canMem[0]数据 单位0.01A
int16_t temp; //单位0.1℃
uint8_t soc; //单位1%
uint8_t soh; //单位1%
uint8_t status_byte1; //
uint8_t status_byte2; //
uint8_t status_byte3; //
uint8_t status_byte4; //
uint16_t VolMax; // 电芯单体最高电压 单位1mv
uint16_t VolMin; // 电芯单体最低电压 单位1mv
uint16_t VolMaxIndex; // 电芯单体最高电压序号
uint16_t VolMinIndex; // 电芯单体最低电压序号
uint16_t TempMax; // 最高温度 单位0.1℃
uint16_t TempMin; // 最低温度 单位0.1℃
uint16_t TempMaxIndex; // 最高温度序号
uint16_t TempMinIndex; // 最低温度序号
}ONLINE_MEMORY ;
//Global
extern BMS_MEMORY bmsMem;
extern BMS_MEMORY bmsMem_slave;
extern PARA_MEMORY paraMem;
extern CAN_MEMORY canMem[AddrMax+2];
extern VERSION_MEMORY VersionMem;
extern ONLINE_MEMORY onlineMem;
extern PROTOCOL_SRNE_MEMORY SRNEMem;
extern PROTOCOL_VOLTRONIC_MEMORY VoltronicMem;
extern PROTOCOL_SMK_MEMORY SMKMem;
extern PROTOCOL_Growatt_MEMORY GrowattMem;
extern void canMem_refresh(void);
extern void onlineMem_refresh(void);
extern void ParaChange(void);
extern void Addr_Set(void);
extern void SLEEP_Refresh(void);
extern void SLEEP2_Refresh(void);
extern void SLEEP_TIM_Moni(void);
extern void SLEEP2_TIM_Moni(void);
extern void UVOff_TIM_Moni(void);
extern void FCCCali_TIM_Moni(void);
extern void uf_GLOBAL_Init(void);
extern uint8_t CRC8_Cal(uint8_t *p, uint8_t Length);
extern BYTE2 CRC16_Cal(uint8_t *pdata, uint16_t len);
extern uint16_t CRC16_FirmtoEE(uint8_t *data, uint16_t len);
extern uint8_t toASCII(uint8_t data);
extern uint16_t get_random(void);
extern uint8_t GetStr(const char* dataKey, char End1, char End2, char* InStr, char* OutStr);
extern uint8_t GetID(char* InStr, char* OutStr);
extern uint8_t GetStrFromJson(const char* dataKey, char* InStr, char* OutStr);
extern uint8_t uint_str_len(uint32_t value);
extern uint8_t int_str_len(int32_t value);
extern void Refresh_FirmwareVersion(void);
extern void Refresh_HardwareVersion(void);
extern void Refresh_ScreenVersion(void);
extern void Refresh_BMS_SN(void);
extern void Refresh_PACK_SN(void);
//Systick
extern void delay_ms(uint16_t ms);
extern void delay_us(uint16_t us);
//Gpio
extern void uf_GPIO_Init(void);
extern void uf_EXTI_Init(void);
extern void LED_RUN_On(void);
extern void LED_RUN_Off(void);
extern void LED1_On(void);
extern void LED1_Off(void);
extern void LED2_On(void);
extern void LED2_Off(void);
extern void LED3_On(void);
extern void LED3_Off(void);
extern void LED4_On(void);
extern void LED4_Off(void);
extern void LED_ALARM_On(void);
extern void LED_ALARM_Off(void);
extern void LED_ALARM_Toggle(void);
extern void LED_RUN_Toggle(void);
extern void LED_RST_Toggle(void);
extern void LED_ALL_ON(void);
extern void LED_ALL_OFF(void);
extern void VPRO_On(void);
extern void VPRO_Off(void);
extern void CTRL_On(void);
extern void CTRL_Off(void);
extern void PCHG_On(void);
extern void PCHG_Off(void);
extern void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
//电源控制
extern void POWER_Check(void);
extern void POWER_Ctrl(void);
extern void KEY_TIM_Moni(void);
//均衡控制
extern void BAL_On(void);
extern void BAL_Off(void);
extern void MCU_BalanceProcess(void);
//加热控制
extern void WARM_Ctrl(void);
//限流控制
extern void TIM4_PWM_Init(uint16_t arr, uint16_t psc);
extern void PWM_Set_Duty_Percent(float duty_per);
extern void CHG_LIMIT_PWM_Adjust(void);
extern void CHG_LIMIT_Init(void);
extern void CHG_LIMIT_On(void);
extern void CHG_LIMIT_Off(void);
extern void CHG_LIMIT_Ctrl(void);
//放电过流2
extern void OCC2_TIM_Moni(void);
extern void OCC2_Ctrl(void);
//DO
extern void DO_On(void);
extern void DO_Off(void);
#if Addr_SetAuto
//分配地址
extern uint8_t IO3_IN(void); //检测输入电平
extern void IO2_OUTSet(void); //分配中先置高让下一个变99,再置低变AddrMax+1
extern void IO2_OUTReset(void);//正常置低
extern uint8_t IO1_IN(void); //检测输入电平
extern void ADDR_Assign_Moni(void);//根据不同的原地址和输入电平,选择要修改的特定地址
extern void ADDR_Rank_Moni(void); //根据IO3的不同电平,确定自身是主机/从机
#endif
//PCHG
extern void PCHG_StartCtrl(void);
extern void PCHG_Ctrl(void);
//浪涌短路时的TSC判断
extern void TSC_Detect(void);
//AFE
extern void AFE_Ctrl(void);
//Timer
extern uint32_t tmrSys;
extern uint32_t tmrTemp[20];
extern void uf_TIM3_Init(void);
extern uint32_t TIMER_Update(void);
extern uint32_t TIMER_IsOut(uint32_t cnt, uint32_t tmr);
extern uint32_t TIMER_IsOther(uint32_t cnt, uint32_t tmr);
//i2c
extern void uf_I2C1_Init(void);
extern uint8_t EEPROM_WrMulByte(uint8_t addrH, uint8_t addrL, uint8_t lenth, uint8_t *data);
extern uint8_t EEPROM_RdMulByte(uint8_t addrH, uint8_t addrL, uint8_t lenth, uint8_t *data);
extern uint8_t EEPROM_CALI_WrZero(int16_t data);
extern int16_t EEPROM_CALI_RdZero(void);
extern uint8_t EEPROM_CALI_WrGain(int16_t data);
extern int16_t EEPROM_CALI_RdGain(void);
//spi
extern void uf_SPI2_Init(void);
extern void SPI2_Error(void);
extern uint8_t AFE_WriteOneByte(uint8_t addr, uint8_t *data);
extern uint8_t AFE_ReadMulByte(uint8_t addr, uint8_t lenth, uint8_t *data);
extern uint8_t AFE_Reset(void);
//flash
#define FLASH_DATA_A_BASE 0X0800A000
#define FLASH_DATA_B_BASE 0X0800C000
extern uint8_t MEMORY_UpdateFlash(uint32_t addr);
extern uint8_t FLASH_UpdateMemory(void);
extern void uf_FLASH_Init(void);
extern void FLASH_RdWord(uint32_t addr, uint32_t *data, uint16_t len);
extern void FLASH_WrData(uint32_t addr, uint16_t *data, uint16_t num);
//wdg
extern void uf_IWDG_Init(u8 prer,u16 rlr);
extern void IWDG_Feed(void);
//Modbus - 主从机/旧上位机
extern void uf_UART1_Init( u32 bound );
extern void USART1_SendOneByte(uint8_t data);
extern void USART1_SendMulByte(uint8_t *bufPT, uint8_t size);
extern void MODBUS_Init(void); //串口初始化
extern void MODBUS_IT_Receive(void);
extern void MODBUS_IQ_Transmit(void);
extern void MODBUS_IT_TIMUpdate(void);
extern void MODBUS_TIM_Moni(void);
//旧上位机相关
extern void UART1_ReadRecord(void);
extern void UART1_ClearRecord(void);
extern void MODBUS_F03_Rx(uint8_t *mem);
extern void MODBUS_F10_Rx(uint8_t *mem);
extern void MODBUS_Faa_Rx(uint8_t *mem);
extern void MODBUS_Fbb_Rx(uint8_t *mem);
//主机相关
extern void MODBUS_Poll_Init(void); //轮询汇总初始化,只有主机数据
extern void MODBUS_MASTER_F03_Rx(void); //处理从机对读指令的回复
extern void MODBUS_MASTER_F10_Rx(void); //处理从机对写指令的回复
extern void MODBUS_MASTER_Polling_Tx(void);//主机轮询获总数据
#if Addr_SetAuto
//分配地址
extern void MODBUS_AddrAssign_Tx(void); //主机自动分配地址
extern void MODBUS_WrIndex_Tx(void); //主机广播下发队列标志
extern void MODBUS_WrIndex_Rx(void); //从机接收该次分配地址的队列标志
#endif
//屏幕看从机
extern void MODBUS_Screen_RdSlave_Tx(void); //主机因屏幕读从机数据
extern void MODBUS_Screen_WrSlaveAddr_Tx(void);//主机因屏幕写从机地址
//上位机看从机
extern void MODBUS_Config_RdSlave_Tx(void); //主机因上位机读从机数据
//Modbus1 - 485逆变器/新上位机
extern void uf_UART3_Init( u32 bound );
extern void USART3_SendMulByte(uint8_t *bufPT, uint8_t size);
extern void MODBUS1_Init(void);
extern void MODBUS1_IT_Receive(void);
extern void MODBUS1_IQ_Transmit(void);
extern void MODBUS1_IT_TIMUpdate(void);
extern void MODBUS1_TIM_Moni(void);
//新上位机相关
extern void UART3_EraseIAP(void);
extern void UART3_ReadRecord(void);
extern void UART3_ClearRecord(void);
extern void UART3_ProtocolSwitch(void);
extern void MODBUS1_F03_Rx(uint8_t *mem);
extern void MODBUS1_F10_Rx(uint8_t *mem);
extern void MODBUS1_Faa_Rx(uint8_t *mem);
extern void MODBUS1_Fbb_Rx(uint8_t *mem);
//广播
extern void MODBUS1_CtrlMOS_Rx(uint8_t *mem); //ff f2
//485逆变器
extern void MODBUS1_UpdateData(void);
extern void YDN(void);
//三选一分板串口
extern void uf_UART4_Init( u32 bound );
//蓝牙模块 - 透传模式,通信小程序
extern void BLE_IO_Init(void);
extern void BLE_Open(void);
extern void BLE_Close(void);
extern void BLE_Reset(void);
extern void BLE_Init(void);
extern void BLE_TIM_Moni(void);
extern void BLE_IT_Receive(void); //接收
extern void BLE_IT_Update(void); //接收分析
extern void BLE_IQ_Update(void); //发送分析
extern void BLE_IQ_Transmit(void); //发送
//功能
extern void BLE_WriteName(void);
extern void BLE_CheckName(void);
//WIFI模块 - 模块询问才回复
extern void WIFI_IO_Init(void);
extern void WIFI_Open(void);
extern void WIFI_Close(void);
extern void WIFI_Reset(void);
extern void WIFI_Init(void);
extern void WIFI_TIM_Moni(void);
extern void WIFI_IT_Receive(void); //接收
extern void WIFI_IT_Update(void); //接收分析
extern void WIFI_IQ_Update(void); //发送分析
extern void WIFI_IQ_Transmit(void); //发送
//4G模块 - AT指令通信
extern int LTE_printf(const char *fmt, ...);
extern void LTE_4G_IO_Init(void);
extern void LTE_4G_Open(void);
extern void LTE_4G_Close(void);
extern void LTE_4G_Reset(void);
extern void LTE_4G_Init(void);
extern void LTE_TIM_Moni(void);
extern void LTE_4G_IT_Receive(void); //接收
extern void LTE_4G_IT_Update(void); //接收分析
extern void LTE_4G_IQ_Update(void); //发送分析
extern void LTE_4G_IQ_Transmit(void); //发送
//填充4G上报属性
extern void LTE_Record_pubData(void);
//OTA升级相关
extern void LTE_OTA_Info(void);
extern void LTE_OTA_IT_Update(void);
extern void LTE_OTA_IQ_Update(void);
extern void LTE_OTA_IQ_Transmit(void);
//功能
extern void LTE_4G_Domain_ChangeSN(void);
extern void gcj02_to_wgs84(double gcj_lon, double gcj_lat, double *wgs_lon, double *wgs_lat);
//ADC
extern void uf_ADC_Init(void);
extern void LOAD_VOL(void);
extern void MCU_TemperaProcess(void);
//CAN
extern void uf_CAN1_Init(void);
extern void CAN_TIM_Moni(void);
extern void CAN_UpdateData(void);
extern void CAN1_SendData(uint32_t Id, uint8_t *data);
//逆变器通信协议
//第1页
extern void CAN_Protocol_SolArk(void);
extern void CAN_Protocol_GoodWe(void);
extern void CAN_Protocol_Megarevo(void);
extern void CAN_Protocol_Pylon(void);
extern void CAN_Protocol_Deye(void);
extern void CAN_Protocol_MUST(void);
extern void CAN_Protocol_solis(void);
extern void CAN_Protocol_Growatt(void);
extern void CAN_Protocol_Aiswei(void);
extern void CAN_Protocol_Afore(void);
extern void CAN_Protocol_Victron(void);
extern void CAN_Protocol_Sorotec(void);
extern void MOD_Protocol_Growatt(void); //同时准备通信
extern void MOD_Protocol_Sorotec(void); //同时准备通信
extern void YDN_Protocol_Pylon(void);
//第2页
extern void CAN_Protocol_SMA(void);
extern void CAN_Protocol_Sunways(void);
extern void CAN_Protocol_Luxpower(void);
extern void CAN_Protocol_Schneider(void);
extern void CAN_Protocol_AlpSolarr(void);
extern void MOD_Protocol_SRNE(void);
extern void MOD_Protocol_Voltronic(void);
extern void MOD_Protocol_COSUPER(void);
extern void MOD_Protocol_SMK(void);
extern void MOD_Protocol_SAKO(void);
extern void MOD_Protocol_SNADI(void);
extern void MOD_Protocol_invt(void);
//NTC
extern uint16_t const NTC_103AT_CMFA[166];
extern uint16_t TEMP_Cal(uint16_t ntcR);
extern uint16_t TEMP_Cal_CMFA(uint16_t ntcR);
//AFE
extern uint8_t bAlarmFlag;
extern uint8_t bAlarmFlagOld;
extern uint8_t balancing;
extern int16_t AFE_CADC_GetVal(void);
extern void AFE_ReadAlarmFlag(void);
extern uint8_t AFE_Read(uint8_t addr, uint8_t lenth, uint8_t *data);
extern uint8_t AFE_WriteRAM(uint8_t addr, uint8_t lenth, uint8_t *data);
extern uint8_t TwiRead(uint8_t SlaveID,uint16_t RdAddr, uint8_t Length, uint8_t *RdBuf);
extern void CALI_CurrentProcess(void);
//电量
extern void GaugeManage(void);
extern void Cali_SOC_Moni(void);
extern void Cali_FCC_Moni(void);
//Screen
extern void uf_UART2_Init( u32 bound );
extern void Screen_Init(void);
extern void Screen_TIM_Moni(void);
extern void Screen_IT_Receive(void); //接收
extern void Screen_IT_Update(void); //接收分析
extern void Screen_IQ_Transmit(void); //发送
extern void SCR_KeepLight0(void);
extern void SCR_DispProcotol(void);
//SDWA
extern void SDWA_JumpToHome(void);
extern void SDWA_ChangeLight(uint8_t light);
extern void SDWA_KeepLight0(void);
extern void SDWA_UpdateData(void);
extern void SDWA_RecvData(void);
extern void SDWA_TIM_Moni(void);
extern void SDWA_IT_Receive(void);
//OCV开路电压矫正SOC
extern uint8_t OCV_CaliSoc_dp(void);
extern void OCV_CaliSOC(void);
extern void OCV_CaliSOC_DataWr(void);
//Status
extern void Trigger_OVAlarm(void);
extern void Trigger_UVAlarm(void);
extern void Release_OVAlarm(void);
extern void Release_UVAlarm(void);
extern void Trigger_OVProtect(void);
extern void Trigger_UVProtect(void);
extern void Release_OVProtect(void);
extern void Release_UVProtect(void);
extern void Trigger_CurAlarm(void);
extern void Release_CurAlarm(void);
extern void Trigger_CurProtect(void);
extern void Release_CurProtect(void);
extern void Trigger_CurProtectLock(void);
extern void Trigger_mcuTAlarm(void);
extern void Release_mcuTAlarm(void);
extern void Trigger_mcuTProtect(void);
extern void Release_mcuTProtect(void);
extern void Trigger_amTAlarm(void);
extern void Release_amTAlarm(void);
extern void Trigger_amTProtect(void);
extern void Release_amTProtect(void);
extern void Trigger_afeTAlarm(void);
extern void Release_afeTAlarm(void);
extern void Trigger_afeTProtect(void);
extern void Release_afeTProtect(void);
extern void Check_eventChange(void);
extern void Transmit_incident(void);
#ifdef __cplusplus
}
#endif
#endif