/** ****************************************************************************** * @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对应20A,150A对应30A,200A对应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:负数 2:true 3:false 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:负数 2:true 3:false 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