2022.4.19  ĬHSE-PLL 72MϵͳʱӸΪ HSI-PLL 36Mʱ
2022.4.21  Modbus F03ԳɹעƳȼɿԲԣڴС

//һ׶μƻ
2022.5.11  CANͽղԣλдܣ
2022.5.12-2022.5.13  BMS ܣ
2022.5.14-2022.5.15  BMS CAN Sol-Ark Э飻
2022.5.16  ԣ
2022.5.17  PCBͻԣ

//ڶ׶μƻ



/////////////////////////////////SOC Ӳ3.17
(GasGuage.c 130-133)
			if(bmsMem.packVoltage > 56000)
			{
				bmsMem.rcc = bmsMem.fcc;
			}

(GasGuage.c 151-154)
			if(bmsMem.packVoltage < 43000)
			{
				bmsMem.rcc = 0;
			}


////////////////////CANЭ////////////////////
Sol-Ark	
GoodWe	3.6
Koyoe	3.16
Aiswei	3.17
SMA		3.21
Sorotec	3.27

//////////
1.̵¶޸ĻbmsMem.mcu_T1

2.Э飬ע⿴һ
Sol-Ark	0x379
Koyoe	0x18FAD201	()
Aiswei	0x379
SMA		0x35F		()
Sorotec	0x35F

3.TxMessage[CAN_SendCount]ʹøȫ棬TxMessage[1]һ



///////////Ļ6Эѡ
void SDWA_Init(void)
					SDWA_DispProcotol(0x03,0x05,0x00);

void SDWA_RecvData(void)
			else if((sdwaBuf[2]==0x06) && (sdwaBuf[3]==0x83) && (sdwaBuf[4]==0x03) && (sdwaBuf[5]==0x15))  
			{
				if(sdwaBuf[8]==0x01)
				{
					if(protocol !=0x06)
						protocol = 0x06;
				}
				else if(sdwaBuf[8]==0x00)
				{
					if(protocol ==0x06)
						protocol = 0x00;
				}					
			}


///////////Growatt CANЭ飬ݷڵ1ҳ3KoyoeЭ 4.3

///////////ȡֵλ0x42

/////////////////////////////////ŵʾ4.4
//λķŵܣֵbmsMem.mcu_ocd
//bmsMem.temperaStatusbit5жϷŵı־λ

SDWA.cиĶʾж(L538)
	if( ((bmsMem.bStatus1 & 0x0c) != 0) || ((bmsMem.temperaStatus & 0x20) != 0) )
	//ŵĻ A5 5A 05 82 01 94 00 01	
	
AFE_SH367309.cĶж(L566)
void AFE_ProtectProcess(void)
bmsMem.temperaStatus & 0x0fΪ0x2f
    if( ( (bmsMem.bStatus1 & 0x7f)!=0)  ||  ( (bmsMem.bStatus2 & 0x0f) !=0) || ((bmsMem.bStatus3 & 0x18) !=0) || (bmsMem.temperaStatus & 0x2f) !=0)

can.cĶж
(L158 - Sol-Ark)
		if( ((bmsMem.bStatus1 & 0x2c) !=0) || ((bmsMem.temperaStatus & 0x20) !=0) )
(L461 - GoodWe)
		if( ((bmsMem.bStatus1 & 0x2c) !=0) || ((bmsMem.temperaStatus & 0x20) !=0) )
(L867 - Growatt)
		if( ((bmsMem.bStatus1 & 0x2c) !=0) || ((bmsMem.temperaStatus & 0x20) !=0) )
(L1231 - Aiswei)
		if( ((bmsMem.bStatus1 & 0x2c) !=0) || ((bmsMem.temperaStatus & 0x20) !=0) )
(L1603 - SMA)
		if( ((bmsMem.bStatus1 & 0x2c) !=0) || ((bmsMem.temperaStatus & 0x20) !=0) )
(L1892 - Sorotec)
		if( ((bmsMem.bStatus1 & 0x2c) !=0) || ((bmsMem.temperaStatus & 0x20) !=0) )

/////////////////////////////////ʾ4.4
//λĳܣֵbmsMem.mcu_occ
//bmsMem.temperaStatusbit4жϳı־λ

SDWA.cиĶʾж(L538)
	if( ((bmsMem.bStatus1 & 0x10) !=0) || ((bmsMem.temperaStatus & 0x10) !=0) )
	//Ļ A5 5A 05 82 01 94 00 01	
	
AFE_SH367309.cĶж(L566)
void AFE_ProtectProcess(void)
bmsMem.temperaStatus & 0x2fΪ0x3f
    if( ( (bmsMem.bStatus1 & 0x7f)!=0)  ||  ( (bmsMem.bStatus2 & 0x0f) !=0) || ((bmsMem.bStatus3 & 0x18) !=0) || (bmsMem.temperaStatus & 0x3f) !=0)

can.cĶж
(L210 - Sol-Ark)
		if( ((bmsMem.bStatus1 & 0x10) !=0) || ((bmsMem.temperaStatus & 0x10) !=0) )
(L513 - GoodWe)
		if( ((bmsMem.bStatus1 & 0x10) !=0) || ((bmsMem.temperaStatus & 0x10) !=0) )
(L858 - Growatt)
		if( ((bmsMem.bStatus1 & 0x10) !=0) || ((bmsMem.temperaStatus & 0x10) !=0) )
(L1283 - Aiswei)
		if( ((bmsMem.bStatus1 & 0x10) !=0) || ((bmsMem.temperaStatus & 0x10) !=0) )
(L1614 - SMA)
		if( ((bmsMem.bStatus1 & 0x10) !=0) || ((bmsMem.temperaStatus & 0x10) !=0) )
(L1903 - Sorotec)
		if( ((bmsMem.bStatus1 & 0x10) !=0) || ((bmsMem.temperaStatus & 0x10) !=0) )

/////////////////////////////////ʱָ4.4
adc.c(L348)
        if( (bmsMem.temperaStatus & BIT4) !=0 || (bmsMem.temperaStatus & BIT5) !=0 ) 


/////////////////////////////////DIDOжMOS 4.20
//1.gpio.c޸PB15ĶѳʼΪ
(L35)
#define PIN_DIDO       GPIO_Pin_15   //һMOS
(L250)
	//DIDO
	GPIO_InitStructure.GPIO_Pin = PIN_DIDO;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

//2.gpio.cԭ⹦ܸΪPA8ţʼΪţź
(L24)
#define PIN_BAL_OUT    GPIO_Pin_8    //źţߵƽ
(L257)
	//BAL
	GPIO_InitStructure.GPIO_Pin = PIN_BAL_OUT;		
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
(L255->L261)
	GPIO_ResetBits(GPIOA, PIN_BAL_OUT); //ԭʼPIN_BALʱ0Ĳƶڵ
(L161\L166)//PB15PA8
	GPIO_SetBits(GPIOA, PIN_BAL_OUT);
	GPIO_ResetBits(GPIOA, PIN_BAL_OUT);

//3.ӶDIDOڵķӦ
global.h(L401)
//DIDO
extern uint8_t DIDO(void);//4.17һMOS
extern void DIDO_TIM_Moni(void);
gpio.c
(L43)
uint8_t  DIDOMoniCount = 0;
(L198)
//DIDO(PB15) -0
uint8_t DIDO(void)
{
	uint8_t status;
	status = GPIO_ReadInputDataBit(GPIOB,PIN_DIDO);
	
	return status;
}
void DIDO_TIM_Moni(void) // ͨıtmperaStatus־bit6MOS
{
	()
}

//4.AFE_SH367309.cֻƲתĻжbit6(L583)
		else if( (bmsMem.temperaStatus & 0x40) !=0)
		{
        LED_ALARM_On();
		}

//5.10msжٶ̫죬Ϊִֻһø߻õ
global.h(L404)
extern void DIDO_CTRL_On(void);
extern void DIDO_CTRL_Off(void);
gpio.c
(L44)
uint8_t  DIDOFlag = 0;
(L150)
void DIDO_CTRL_On(void)
{
	if(DIDOFlag == 1)
	{
		GPIO_SetBits(GPIOB, PIN_CTLC);
		DIDOFlag=0;
	}
}

void DIDO_CTRL_Off(void)
{
	if(DIDOFlag == 0)//ʼΪ0ִһιMOSΪ1ʹֻ1
	{
		GPIO_ResetBits(GPIOB, PIN_CTLC);
		DIDOFlag=1;
	}
}

//6.AFEƺvoid AFE_Ctrl(void)ֻΪжִкѭִк
global.h(L406)
extern void DIDO_Ctrl(void);

AFE_SH367309.c(L427)
void DIDO_Ctrl(void)//10msж
{
	if((bmsMem.temperaStatus & 0x3f) == 0) //ӰBIT0-5ܵ
	{
		()
	}	
}
void AFE_Ctrl(void)//ѭ1s
{
	if((bmsMem.temperaStatus & 0x40) == 0) //ӰBIT6ܵ
	{
		()
	}
}

//7.tim.cvoid TIM3_IRQHandler(void)
		DIDO_TIM_Moni();
		
		DIDO_Ctrl();


////////////////////SOC0 4.21
GasGauge.c(L156)
			if(bmsMem.packVoltage < 43000)
			{
				bmsMem.rcc = 0;
			}


////////////////////FLASHдĬֵ޸ 4.23
global.c(L70)
	bmsMem.E2uiDsgEndVol = 2500;

flash.c(L92-97/L138-143)
	0xEE, //ѹѹ 3750mV
	0x62,
	0xC6, //ѹͷ 3550mV
	0x7D, //Ƿѹѹ 2500mV
	0x87, //Ƿѹͷ 2700mV
	0xAF, //ƽ⿪ѹ 3500mV


/////////////////////////////////ʾCANЭѡ4ҳ33 4.26
void CAN_UpdateData(void)

	else if(protocol_Index == 7){}

void SDWA_Init(void)
ע޸мж
					SDWA_DispProcotol(0x03,0x06,0x00);

void SDWA_RecvData(void)

			else if((sdwaBuf[2]==0x06) && (sdwaBuf[3]==0x83) && (sdwaBuf[4]==0x03) && (sdwaBuf[5]==0x16))  
			{
				if(sdwaBuf[8]==0x01)
				{
					if(protocol !=0x07)
						protocol = 0x07;
				}
				else if(sdwaBuf[8]==0x00)
				{
					if(protocol ==0x07)
						protocol = 0x00;
				}					
			}


////////////////////Ļͣ 4.28
L690void SDWA_UpdateData(void)
			if( (bmsMem.temperaStatus & 0x40) !=0)
			{
				SDWA_Send_VAR(0x0100, 5);
			}
			else
			{
        if(bCHGING ==1)
        {
            //SDWA_Send_Charging(0x0100);
						SDWA_Send_VAR(0x0100, 0);
        }
        else
        {
            //SDWA_Send_Discharging(0x0100);
						SDWA_Send_VAR(0x0100, 1);
        } 
			}


////////////////////¶Ȳ 5.12
adc.c
(L59)
uint8_t Tdifference_count;

(L113)
	int16_t T[4];
	uint8_t i;
	uint16_t max,min;

(L158)
		//о¶Сֵ
		T[0] = bmsMem.mcu_T1;
		T[1] = bmsMem.mcu_T2;
		T[2] = bmsMem.mcu_T3;
		T[3] = bmsMem.mcu_T4;
		max = T[0];
		min = T[0];
		for(i=0;i<4;i++)
		{
			if(max<T[i])
			{
				max = T[i];
			}
			if(min>T[i])
			{
				min = T[i];
			}		
		}

(L177)
		//²
    if((bmsMem.temperaStatus & BIT7) ==0)  
    {
					if( (max-min)>100 ) //²100*0.1϶
					{
							Tdifference_count++;
							if(Tdifference_count> 3) 
							{
									bmsMem.temperaStatus |= BIT7;  //£
									Tdifference_count = 0;
							}
					}
					else
					{
							Tdifference_count = 0;
					}
		 }

(L405)
      //²ͷ
      if((bmsMem.temperaStatus & BIT7) !=0)
			{
					if( (max-min)<100 ) //²ٳ100*0.1϶ȣȷ3ִͷ
					{
							Tdifference_count++;
							if(Tdifference_count > 3) 
							{
									bmsMem.temperaStatus &= ~BIT7;  //£
									Tdifference_count = 0;
							}
					}
					else
					{
							Tdifference_count = 0;
					}
			}

AFE_SH367309.c±ж-ֻñҲӰʾ
//ע⵱²ʱĻʾ"Fault"
void AFE_ProtectProcess(void)
(L603)
else if( (bmsMem.temperaStatus & 0xC0) !=0)


/////////////////////////////////λıͨŵַ5.15
1.bmsMem£ʱӵĵַ42Ϊ43Ҫԡ
golbal.h(L282)
  //20230411---------------
  uint8_t     mcu_address; //ͨλıӵͨŵַ
  uint8_t     addr_crc;
  //20230411---------------
RS485_Modbus.c(L471)
		modbusBuf[3] = 0x43;
	
2.SDWAͨλı
SDWA.c(L737)
		if(bmsMem.mcu_address !=0)
		{
			EEPROM_WrMulByte(0,0,1,&bmsMem.mcu_address);
			delay_ms(5);
			
			bmsMem.E2_485Addr = bmsMem.mcu_address;
			bmsMem.mcu_address = 0;
		}


/////////////////////////////////λ޸ĵʾ5.23
global.h(L287)
	//20230523---------------
	uint8_t     writeCapacity; //ͨλıʾ
	uint8_t     capacity_crc;
	//20230523---------------
RS485_Modbus.c(L471)
		modbusBuf[3] = 0x44;
GasGauage.c
void InitGasGauge(void)(L34)
	uint8_t tmpRd;
	EEPROM_RdMulByte(7,1,1,&tmpRd);
	bmsMem.fcc = 3600 * 1000*tmpRd;
	
//	bmsMem.fcc = 3600 * 100000;   //ϵͳݶ100AH = 100,000mAH = 360,000,000mAS

void GaugeManage(void)(L126) //дAhEEPROM
	if(bmsMem.writeCapacity !=0)
	{
		EEPROM_WrMulByte(7,1,1,&bmsMem.writeCapacity);
		delay_ms(5);
		
		bmsMem.fcc = 3600 * 1000*bmsMem.writeCapacity;
		bmsMem.writeCapacity = 0;
	}
(L152)
				bmsMem.rcc = bmsMem.fcc - bmsMem.fcc/100;
(L178)
				bmsMem.rcc = bmsMem.fcc/100; 


/////////////////////////////////λͨţͻʱλȼ
RS485_Modbus.c
(L241)
			else if((modbusBuf[0] == bmsMem.E2_485Addr) && (modbusBuf[1] == 0x03) )         //ݴ
			{
			    MODBUS_F03_Rx(MODBUS_MEM_PT);
			}
			else if((modbusBuf[0] == bmsMem.E2_485Addr) && (modbusBuf[1] == 0x10) )         //дݴ
			{
			    MODBUS_F10_Rx(MODBUS_MEM_PT);
			}
			else if((modbusBuf[0] == bmsMem.E2_485Addr) && (modbusBuf[1] == 0xaa) )    //CADCУ׼
			{
				MODBUS_Faa_Rx(MODBUS_MEM_PT);   				
			}
			else if((modbusBuf[0] == bmsMem.E2_485Addr) && (modbusBuf[1] == 0xbb) )    //CADCУ׼
			{
				MODBUS_Fbb_Rx(MODBUS_MEM_PT); 
			}
			else
			{
				MODBUS_Init(); //ûʱַͨѶӲϣʱ䵽³ʼ֮Żָ
			}
(L489)
		//ڷͽ׶յݣ˵λݣʱӺ200msٷ
		if(modbusBufIndex > 2)
		{
			delay_ms(200);
		}


//////////̫޸Żȼlevel0 -> level3


////////////////////MUSTͨѶͨѶΪ100K 5.6
void uf_CAN1_Init(void)޸
ԭ
CAN_InitStructure.CAN_Prescaler = 8;     //36MHz/8/(1+6+2)=500kbs
ģ
if(Protocol != 7)
CAN_InitStructure.CAN_Prescaler = 40;    //36MHz/40/(1+6+2)=100kbs

////////////////////SOFARЭ 6.5




////////////////////1ModbusЭ-˶////////////////////
λ/ӻܣPA9PA10 (USART1)
1PB10PB11 (USART3)
**********1 ֲغ**********
uart.c
void uf_UART3_Init( u32 bound )
void USART3_SendMulByte(uint8_t *p, uint8_t size)
void USART3_IRQHandler(void)
tim.cTIM4_IRQHandler
(L95)MODBUS1_IT_TIMUpdate();
main.cmain
(L63)MODBUS1_Init();
(L132)MODBUS1_IQ_Transmit();
(L120)Protocol_UpdateData();
global.h(L453)
//Modbus1 ¼
extern void uf_UART3_Init( u32 bound ); 
extern void USART3_SendMulByte(uint8_t *bufPT, uint8_t size);	
extern void MODBUS1_IT_Receive(void);
extern void MODBUS1_IQ_Transmit(void);
extern void MODBUS1_IT_TIMUpdate(void);
extern void MODBUS1_F03_Rx(uint8_t *mem);
extern void MODBUS1_Init(void);
extern void Protocol_UpdateData(void);
RS485_Modbus_Inverter.c빤ļMOUDLE

**********2 ʼַһµУbmsMem**********
global.h½ṹ
(L315)typedef struct{}PROTOCOL_SENE_MEMORY ;
extern PROTOCOL_SENE_MEMORY SENEMem;
global.c
(L21)PROTOCOL_SENE_MEMORY SENEMem;


////////////////////1ModbusЭ-Ԫ////////////////////
**********1 ṹ**********
global.h½ṹ
(L348)typedef struct{}PROTOCOL_VOLTRONIC_MEMORY ;
(L448)extern PROTOCOL_VOLTRONIC_MEMORY VoltronicMem;
global.c
(L22)PROTOCOL_VOLTRONIC_MEMORY VoltronicMem;
RS485_Modbus_Inverter.c
(L12)#define  MODBUS1_VoltronicMEM_PT     (uint8_t *)&VoltronicMem.rsvd1[0]
**********2 ݸµѡܷ**********
RS485_Modbus_Inverter.c
extern uint8_t protocol;
//ModbusЭݸ
void Protocol_UpdateData(void)
{
	if(protocol == 13)			MOD_Protocol_SENE();
	else if(protocol == 14)		MOD_Protocol_Voltronic();
}
//SENE ˶
void MOD_Protocol_SENE(void)()
**********3 1ʼַĶ**********
void MODBUS1_IT_TIMUpdate(void)
(L115)
			    if(protocol == 13)			MODBUS1_F03_Rx(MODBUS1_SENEMEM_PT);
					else if(protocol == 14)	MODBUS1_F03_Rx(MODBUS1_VoltronicMEM_PT);


////////////////////1ModbusЭ-̫////////////////////
**********1 ṹ**********
global.h½ṹ
(L399)typedef struct{}PROTOCOL_WAET_MEMORY ;
(L500)extern PROTOCOL_WAET_MEMORY WAETMem;
global.c
(L23)PROTOCOL_WAET_MEMORY WAETMem;
RS485_Modbus_Inverter.c
(L13)#define  MODBUS1_WAETMEM_PT     (uint8_t *)&WAETMem.rsvd1[0]
**********2 ݸµѡܷ**********
RS485_Modbus_Inverter.c
void Protocol_UpdateData(void)
	else if(protocol == 15)	MOD_Protocol_WAET();
void MOD_Protocol_WAET(void)
()
**********3 1ʼַĶ**********
void MODBUS1_IT_TIMUpdate(void)
					else if(protocol == 15)	MODBUS1_F03_Rx(MODBUS1_WAETMEM_PT);


////////////////////1ModbusЭ-////////////////////
**********1 ṹ**********
global.h½ṹ
(L399)typedef struct{}PROTOCOL_SAKO_MEMORY ;
(L500)extern PROTOCOL_SAKO_MEMORY WAETMem;
global.c
(L23)PROTOCOL_SAKO_MEMORY WAETMem;
RS485_Modbus_Inverter.c
(L13)#define  MODBUS1_SAKOMEM_PT     (uint8_t *)&SAKOMem.rsvd1[0]
**********2 ݸµѡܷ**********
RS485_Modbus_Inverter.c
void Protocol_UpdateData(void)
	else if(protocol == 31)	MOD_Protocol_SAKO();
void MOD_Protocol_SAKO(void)
()
**********3 1ʼַĶ**********
void MODBUS1_IT_TIMUpdate(void)
					else if(protocol == 31)	MODBUS1_F03_Rx(MODBUS1_SAKOMEM_PT);


////////////////////ʾԣὫԭδдİʶΪ255
void InitGasGauge(void)(L33)
	uint8_t tmpRd;
	
	EEPROM_RdMulByte(7,1,1,&tmpRd);
	
	if(tmpRd>0 && tmpRd<255) //֮ǰдֵ,Ͱ֮ǰֵʾʾ100Ah
	{
		bmsMem.fcc = 3600 * 1000*tmpRd;
	}
	else
	{
		bmsMem.fcc = 3600 * 100000;   //ϵͳݶ100AH = 100,000mAH = 360,000,000mAS
		tmpRd = 100;
		EEPROM_WrMulByte(7,1,1,&tmpRd);
	}


////////////////////4851
1յ
һPAGEصIAP
RS485_Modbus_Inverter.c
(L134)
/*******************************
******* PAGEϢ *******
** M: A7 55 0f 02 03 04 5A A5 **
** S: A7 65 0f 02 03 04 5A A5 **
********************************/
void MODBUS1_F0f_Rx(void)
{
	BYTE2     crc16;
	
	//CRCж
	crc16 = CRC16_Cal_Inverter(modbus1Buf, 6);
//	if( (modbus1Buf[7] == crc16.b8[1]) || (modbus1Buf[6] == crc16.b8[0]) ) 
	if( (modbus1Buf[7] == 0XA5) || (modbus1Buf[6] == 0X5A) ) 
	{	
			//1.
			FLASH_Unlock();	//
			FLASH_ErasePage(FLASH_PAGE_ADDR); //Flashһpage,0x0800FC00-0x0800FFFF
			FLASH_Lock();//
			
			//2.
			//FLASH_WrData(FLASH_PAGE_ADDR,0,8);
					
			/*ͽȷźŵPC*/
			modbus1Buf[0] = 0xA7;
			modbus1Buf[1] = 0X65;
			modbus1Buf[2] = 0X03;
			modbus1Buf[3] = 0X02;
			modbus1Buf[4] = 0X03;
			modbus1Buf[5] = 0X04;
			modbus1Buf[6] = 0X5A;
			modbus1Buf[7] = 0XA5;
		
			modbus1F0fRxFlg = 1;
			MODBUS1_UART_IT_RX_DISABLE;
	}
}

(L18)
#define FLASH_PAGE_ADDR 0x0800FC00//ҪFLASHҳַ

(L22)
uint8_t  modbus1F0fRxFlg;         //Ϣȷ

(L135)
else //485ӻ
	{
		if(modbus1BufIndex > 2)
		{
			if((modbus1Buf[0] == 0xA7) && (modbus1Buf[1] == 0x55))
			{
				MODBUS1_F0f_Rx(); //485
			}
			else
			{
				MODBUS1_Init(); //ûʱַͨѶӲϣʱ䵽³ʼ֮Żָ
			}
		}
		else
		{
			MODBUS1_Init();
		}
	}

(L101)
	if(modbus1FffRxFlg == 1)
	{
		modbus1FffRxFlg = 0;
		modbus1BufIndex = 0;
		MODBUS1_UART_SendMulByte(modbus1Buf, 8);		
		MODBUS1_UART_IT_RX_ENABLE;
		
		delay_ms(1000);
		NVIC_SystemReset(); //λ
	}
	else 

global.h(L667)
extern void MODBUS1_F0f_Rx(void);

//PAGEָظԳɹ


//////////ΪҪȡ¸ĶעⷢǰҪ޸
0x8000000 > 0x8001000
SCB->VTOR = FLASH_BASE | 0x1000;
$K\ARM\ARMCC\bin\fromelf.exe --bin --output=Bin\@L.bin !L


////////////////////λ޸ֵ
//ԭ
#define CHG_LIMIT_VALUE 120000   //λA 100A
#define CHG_LIMIT_COUNT 5       //5S, ģ  
#define CHG_LIMIT_RELEASE_COUNT 600 //ģ鹤60S, ָ  //600S

Ϊͳһǰ
bmsMem.mcu_addressΪbmsMem.write_Addr
bmsMem.writeCapacityΪbmsMem.write_Capacity)

//¼
global.h(L290)
	//20230614---------------
	uint8_t     write_CHGLimit_Value; //ͨλı屣 A
	uint8_t     write_CHGLimit_Count; //ͨλı屣ʱ S
	uint16_t    write_CHGLimit_ReleaseCount; //ͨλı屣ָʱ S
	//20230614---------------

AFE_SH367309.c
void CHG_LIMIT_Ctrl(void)
//CHG_LIMIT_VALUE -> bmsMem.write_CHGLimit_Value
//CHG_LIMIT_COUNT -> bmsMem.write_CHGLimit_Count
//CHG_LIMIT_RELEASE_COUNT -> bmsMem.write_CHGLimit_ReleaseCount

flash.c
(L132)/(L185)
	//20230614
	100,  //
	5,    //ʱ
	0x58, //ͷʱ 0x0258 = 600
	0x02,

uint8_t MEMORY_UpdateFlash(uint32_t addr)
//40Ϊ44һ2
//20Ϊ22һ1
uint8_t FLASH_ReadCheck(uint32_t addr)
//40Ϊ44һ3


////////////////////жܵѹֵλAFEþ
if(bmsMem.packVoltage > 56000) //3.5*16    //3.75*num -4
if(bmsMem.packVoltage < 43000) //2.6875*16 //2.5*num  +3

ԭ㷽ʽ
̶ֵ56V = о3.5V * 16
̶ֵ43V = о2.6875V * 16

¼㷽ʽ
[ģڸcellNum]
cellNum = bmsMem.ee_sconf1 & 0x0F;
if( cellNum < 5 ) //16һ0000
{
	cellNum = 16;
}
[ѹֵcell_OV] = ( (bmsMem.ee_ovt_ldrt_ovh & 0x03) <<8 | bmsMem.ee_ovl ) * 5;
[Ƿѹֵcell_UV] = bmsMem.ee_uv * 20;
[ģѹֵpack_OV] = cell_OV * cellNum -4000;
[ģǷѹֵpack_UV] = cell_UV * cellNum +3000;




/** 20230704Ӳ **/
////////////////////˲СΪ2ɼ⵽С200mA
void AFE_CurrentProcess(void)

////////////////////͵ѹ
global.h(L65)
extern uint8_t  cellNum; //ģڸ
AFE_SH367309.c(L362)
for(i=0;i<cellNum;i++)

////////////////////*1000

////////////////////̫&ƵĳֱԪ
//[ı]
//WAET ̫
void MOD_Protocol_WAET(void)
{
	MOD_Protocol_Voltronic();
}
//SAKO 
void MOD_Protocol_SAKO(void)
{
	MOD_Protocol_Voltronic();
}
					else if(protocol == 15)	MODBUS1_F03_Rx(MODBUS1_VoltronicMEM_PT);
					else if(protocol == 31)	MODBUS1_F03_Rx(MODBUS1_VoltronicMEM_PT);

//[ɾ]
#define  MODBUS1_WAETMEM_PT          (uint8_t *)&WAETMem.rsvd1[0]
#define  MODBUS1_SAKOMEM_PT          (uint8_t *)&SAKOMem.rsvd1[0]
PROTOCOL_WAET_MEMORY WAETMem;
PROTOCOL_SAKO_MEMORY SAKOMem;
extern PROTOCOL_WAET_MEMORY WAETMem;
extern PROTOCOL_SAKO_MEMORY SAKOMem;
//ͨWAET ṹ
typedef struct 						
{
}PROTOCOL_WAET_MEMORY ;
//ͨSAKO ṹ
typedef struct 						
{
}PROTOCOL_SAKO_MEMORY ;
 
////////////////////UART1UART3ڲͬĶʱ
tim.c
//(L70)
//10MS
void uf_TIM2_Init(void)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); 
	
	TIM_TimeBaseStructure.TIM_Period = 10000-1;   
	TIM_TimeBaseStructure.TIM_Prescaler = 72-1;  
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; 
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);  
	
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
	NVIC_Init(&NVIC_InitStructure);  
	
	TIM_ITConfig(TIM2, TIM_IT_Update,ENABLE );
	TIM_Cmd(TIM2, DISABLE);  //ʹTIMx							 
}
//(L123)
//10msж
//10ms3ݽգ붨ʱ2жϴ
void TIM2_IRQHandler(void)   //TIM2ж
{
	if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //ָTIMжϷ:TIM жԴ 
	{
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);  //TIMxжϴλ:TIM жԴ 
		
		MODBUS1_IT_TIMUpdate();
		TIM_Cmd(TIM2,DISABLE);
	}
} 
//ɾ(L118)
		MODBUS1_IT_TIMUpdate();
global.h(L529)
extern void uf_TIM2_Init(void);
main.c(L58)
	uf_TIM2_Init();	  //10MS
RS485_Modbus_Inverter.c
#define  MODBUS1_UART_TIM            TIM2

////////////////////򻯳CRCУΨһ
RS485_Modbus_Inverter.c
//ɾ(L30)
const  uint16_t  CRC16Table_Inverter[256]=
{                                 
	0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,   
	0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,   
	0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40,   
	0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841,   
	0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40,   
	0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41,   
	0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641,   
	0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040,   
	0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240,   
	0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441,   
	0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41,   
	0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840,   
	0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41,   
	0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40,   
	0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640,   
	0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041,   
	0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240,   
	0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441,   
	0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41,   
	0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840,   
	0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41,   
	0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40,   
	0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640,   
	0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041,   
	0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241,   
	0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440,   
	0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40,   
	0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841,   
	0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40,   
	0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41,   
	0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641,   
	0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040
};

// CRC У麯,CRC
BYTE2  CRC16_Cal_Inverter(uint8_t *pdata, uint16_t len)
{	
  uint16_t  i;	
	BYTE2  CRCData;
	
  CRCData.b16=0XFFFF;
	for(i=0;i<len;i++){       
 		CRCData.b16 = CRC16Table_Inverter[CRCData.b8[0]^ *pdata++] ^ CRCData.b8[1];               
	}
	return CRCData;
}
global.h
//(L481)
extern BYTE2  CRC16_Cal(uint8_t *pdata, uint16_t len);


////////////////////IAP滻Ϊ5A A5
RS485_Modbus_Inverter.c
//(L26)
/****************************************
****  IAP      *****
** M: A7 55 20 23 06 18 0X5A 0XA5 **
** S: A7 65 04 0X5A**
*****************************************/
void UART_EraseIAP(void)
{}

//滻
RS485_Modbus_Inverter.c
(L151)
			UART_EraseIAP();
(L92)
	else if(cmdRxIapFlg == 1)
	{
		cmdRxIapFlg = 0;
(L163/L184)
CRC16_Cal_Inverter -> CRC16_Cal
global.h(L677)
extern void UART_EraseIAP(void);

//ɾ
RS485_Modbus_Inverter.c(L20)
uint8_t  modbus1F0fRxFlg;

//
RS485_Modbus_Inverter.c
(L21)
uint8_t  cmdRxIapFlg;             //Ϣ ȷ
(L249)
	cmdRxIapFlg = 0;

//ɾ
global.h(L674)
extern void MODBUS1_F0f_Rx(void);
//
global.h(L579)
extern void UART_EraseIAP(void);

////////////////////0x44 -> 0x46


/////////////////////////////////λͨţͻʱλȼ
RS485_Modbus.c
(L467)
		//ڷͽ׶յݣ˵λݣʱӺ200msٷ
		if(modbusBufIndex > 2)
		{
			delay_ms(200);
		}
(L241)
			else if((modbusBuf[0] == bmsMem.E2_485Addr) && (modbusBuf[1] == 0x03) )         //ݴ
			{
			    MODBUS_F03_Rx(MODBUS_MEM_PT);
			}
			else if((modbusBuf[0] == bmsMem.E2_485Addr) && (modbusBuf[1] == 0x10) )         //дݴ
			{
			    MODBUS_F10_Rx(MODBUS_MEM_PT);
			}
			else if((modbusBuf[0] == bmsMem.E2_485Addr) && (modbusBuf[1] == 0xaa) )    //CADCУ׼
			{
				MODBUS_Faa_Rx(MODBUS_MEM_PT);   				
			}
			else if((modbusBuf[0] == bmsMem.E2_485Addr) && (modbusBuf[1] == 0xbb) )    //CADCУ׼
			{
				MODBUS_Fbb_Rx(MODBUS_MEM_PT); 
			}
			else
			{
				MODBUS_Init(); //ûʱַͨѶӲϣʱ䵽³ʼ֮Żָ
			}


////////////////////˲СΪ0
void AFE_CurrentProcess(void)


////////////////////ЭдѸSENE -> SRNE


////////////////////ַ1Ҳɽ485




/***** 7.14 *****/
**********ӻͨ**********
*****1.MCU_TemperaProcessӶС¶Ⱥƽ¶ȵļ
//½¶ȵȫֱ
int16_t  TemperatureAverage;       // ƽ¶
int16_t  TemperatureMax;      // ¶
int16_t  TemperatureMin;      // ¶
uint16_t TemperatureMaxIndex; // ¶
uint16_t TemperatureMinIndex; // ¶
//ŻMCU_TemperaProcess
//ӸЭмؼ㣺
  //滻Э¶ȵȡֵԼ
	//ɾÿЭıȴСĴ
	//滻Э麯ڵľֲ
	//ڴݸúĴӸֵ
	//еĺûмcan_protect_byteظֵѲȫ
	//ͳһѱֵΪֵ
	//е¶ֵͨŸΪƽ¶
	//485Эǵַ1ֻɱֵĴ

*****2.ݵĻȡ
//bmsMem.can_curĵλͳһ0.01A
//ʱٸЭҪ仯
	int16_t   tempCur; //ܵ
		tempCur = (int16_t)(canMem[0].cur/10); //λ0.1
//¶ȣȡĻݿܻܴ󣬸Ϊint32_t
	int32_t     cur;
	int32_t     temp;
			canMem[1].cur  = (int32_t) bmsMem.can_cur;
			canMem[1].temp = (int32_t) bmsMem.can_temp;
//MODBUS_MASTER_TxռݵĴ벹ȫ
//ݸֵͷݻȡ֮
  AFE_CurrentProcess
        bmsMem.can_cur = (int16_t) (bmsMem.packCurrent/10);   //sum of all packsͳһֵλ0.01A
  ¶ȣMCU_TemperaProcess
        bmsMem.can_temp = TemperatureAverage; //sum of all packs
  SOCSOHGaugeManage
            bmsMem.can_soc = bmsMem.soc; //sum of all packs
            bmsMem.can_soh = bmsMem.soh; //sum of all packs


**********ͨЭ**********
*****MUSTĲ
//1.ɾȥMUSTflagز
//2.CAN1_InitиЭѡֵ
	if(protocol == 7) //MUSTЭĲ100k
	{
			CAN_InitStructure.CAN_Prescaler = 40;     //36MHz/8/(1+6+2)/5=100kbs
	}
	else //Э500k
	{
			CAN_InitStructure.CAN_Prescaler = 8;     //36MHz/8/(1+6+2)=500kbs
	}

////////////////////Э麯޸
*****1.Э黹ԭ31ѡ25ãһ飬ȫݣ
//"protect_byte"4ͳһ
//SOCͳһƽֵ:bmsMem.soc -> canMem[0].soc
//SOHͳһƽֵ:bmsMem.soh -> canMem[0].soh
//¶ͳһƽֵ:TemperatureAverage -> canMem[0].temp
//DONNERGYڵλ0.01A޸

*****Э鱣ֵݲ
1.׺˶աԪݴ
2.׺ڰ汾Ը汾滻ԭ
  ˶գ216λͱֳ48λʹٺϲ
  Ԫ416λͱõĲժΪ48λͣٽӦŻ


////////////////////ֵͨλ޸
//
global.h(L305)
	//20230705---------------
	uint16_t    inverter_chgVolLimit; //ͨλ޸ͨŸѹֵ
	uint16_t    inverter_dsgVolLimit; //λ0.1V
	uint16_t    inverter_chgCurLimit;
	uint16_t    inverter_dsgCurLimit; //λ0.1A
	//20230705---------------
flash.c(L138/L201)
	//20230705
	0x40, //ѹ 0x0240
	0x02,
	0xa0, //ŵѹ 0x01a0
	0x01,
	0xe8, // 0x03e8
	0x03,
	0xe8, //ŵ 0x03e8
	0x03,
	
//滻
flash.c
uint8_t MEMORY_UpdateFlash(uint32_t addr)
//44Ϊ52һ2
//22Ϊ26һ1
uint8_t FLASH_ReadCheck(uint32_t addr)
//44Ϊ52һ3
ProtocolSwitch_P1/P2/P3/P4.c
		chgCurLimit = 1000 * bmsMem.E2_485Snum;  //100.0A
		dsgCurLimit = 1000 * bmsMem.E2_485Snum;  //ŵ100.0A
		chgVolLimit = 576;   //ѹƵ3.6BMS3.65
		dsgVolLimit = 416;   //ŵѹƵ2.6BMS2.50  
>
		chgCurLimit = bmsMem.inverter_chgCurLimit; //ƣλãĬֵ100A
		dsgCurLimit = bmsMem.inverter_dsgCurLimit; //ŵƣλãĬֵ100A
		chgVolLimit = bmsMem.inverter_chgVolLimit; //ѹƣλãĬֵ57.6V
		dsgVolLimit = bmsMem.inverter_dsgVolLimit; //ŵѹƣλãĬֵ41.6V


////////////////////0x46->0x4A


////////////////////Сóʱܿ100->99
//ӶСΧ1.2-1.-2ӳж
uint8_t DSGcount;    //Сŵ
uint8_t DSGminiFlag; //Сŵ־
uint8_t CHGcount;
uint8_t CHGminiFlag;
	if(cali.tempCur  < (-2))					//жϵسŵ״̬
	{
		bDSGING = 1;
	}
	else if(cali.tempCur > 2)
	{
		bCHGING = 1;
	}
	else if( (cali.tempCur >= (-2)) && (cali.tempCur < 0) ) //Сŵ磬ҪӳٿǣֻСŻʾ
	{
		if(DSGminiFlag == 0)
		{
			DSGcount++;
			if(DSGcount > 3)
			{
				DSGminiFlag = 1;
				DSGcount = 0;
			}
			else
			{
				bmsMem.packCurrent  = 0;
			}
		}
	}
	else if( (cali.tempCur > 0) && (cali.tempCur <= 2) ) //С磬Ҫӳٿ
	{
		if(CHGminiFlag == 0)
		{
			CHGcount++;
			if(CHGcount > 3)
			{
				CHGminiFlag = 1;
				CHGcount = 0;
			}
			else
			{
				bmsMem.packCurrent  = 0;
			}
		}
	}
	else							    //磬Ҳŵ磬Ϊ0
	{
		bDSGING = 1;
		bmsMem.packCurrent  = 0;
		
		DSGcount = 0; //С0֮лл0¿ʼ
		CHGcount = 0;
		DSGminiFlag = 0;
		DSGminiFlag = 0;
	}


////////////////////λȡ汾
//ݴ½ṹVersionMem
typedef struct
{
	uint8_t     Hardware[3];
	uint8_t     Software[4];
	uint8_t     Screen;
	uint8_t     Batch_No[10];
}VERSION_MEMORY ;

VERSION_MEMORY VersionMem;

//03ֱӶȡṹ壬Ҫעⱨ֣bmsMem.E2_485Addr 55
#define  MODBUS_VERSIONMEM_PT         (uint8_t *)&VersionMem.Hardware[0]//λ汾ͨѶڴ濪ʼַ
			else if((modbusBuf[0] == 0xAA) && (modbusBuf[1] == 0x03) )               //λȡ汾
			{
			    MODBUS_F03_Rx(MODBUS_VERSIONMEM_PT);
			}


////////////////////SOCȸĽ
1.ڿʼȡʱoldsocҲͬʱֵÿһϵҪһдSOC
		oldsoc = tmp;
2.bmsMem.socoldsocֵ1ͻEEPROMд
		//SOC write  to eeprom
		if(bmsMem.soc > oldsoc)
		{
//			if( (bmsMem.soc - oldsoc) >= 5)
//			{
				oldsoc = bmsMem.soc;
				tempW = bmsMem.soc;
				EEPROM_WrMulByte(0,EEPROM_SOC_ADDR,1,&tempW);
//			}
		}
		else if(bmsMem.soc < oldsoc)
		{
//			if((oldsoc - bmsMem.soc) >= 5 )
//			{
				oldsoc = bmsMem.soc;
				tempW = bmsMem.soc;
				EEPROM_WrMulByte(0,EEPROM_SOC_ADDR,1,&tempW);		
//			}
		}
3.bmsMem.socʾ0Ah->0% 0.1Ah->1%
		bmsMem.soc = bmsMem.rcc/(bmsMem.fcc/100);
		//ʵٷֱȺsocٸ0.1Ahsoc+1
		if( ( bmsMem.rcc%(bmsMem.fcc/100) ) /360000 ) //ȡ0.1%Ϊжϱ׼ 360000mAS = 0.1*1000*3600 = 0.1Ah
		{
			bmsMem.soc += 1;
		}


////////////////////˶Э³ŵMOS״̬
	if((bmsMem.bStatus3 & 0x02) !=0) //MOS״̬
	{
		statusByte |= 0x0400;
	}
	else
	{
		statusByte &= 0xFBFF;
	}
	if((bmsMem.bStatus3 & 0x01) !=0) //ŵMOS״̬
	{
		statusByte |= 0x0800;
	}
	else
	{
		statusByte &= 0xF7FF;
	}


////////////////////ƽ¶ȼ޸
//ʱϣԭֵ
TemperatureAverage = 0;


////////////////////SOCδʱ99Ah,99%ĳ99.1Ah,100%Ӧû
bmsMem.rcc = bmsMem.fcc - (bmsMem.fcc*9/1000);


////////////////////һ
if(((int)tmp>=0) && (tmp<=100)) //ڱȽϲʹתı


////////////////////λдʱ 6.25
//ļӡrtc.h
//滻rtc.cڴ
//ͷļ·"..\BSP"
//main.c
(L25)
#include "rtc.h"
#include "soe.h"
(L78)
	uf_RTC_Init(); //SOE
	RTC_Get(); 
(L130)
			uf_RTC_Update(); //Ϊλ޸ʱ
			RTC_Get();       //SOE,ʱ
//i2c.c/滻
(L19)
#include "soe.h"
(L45)
void uf_I2C1_Init(void){()}
//10Ľдṹ壬Ҫעⱨ֣bmsMem.E2_485Addr 66
RS485_Modbus.c
(L20)
#include "rtc.h"
#include "soe.h"
(L32)
#define  Time_MEM_PT                 (uint8_t *)&calendar_Write.sec
(L268/307)
			else if((modbusBuf[0] == bmsMem.E2_485Addr) && (modbusBuf[1] == 0x66) )    //λдʱ
			{
			    MODBUS_F10_Rx(Time_MEM_PT);
			}


////////////////////¼֮Ļϵı¼ͬʱʱûλ¼ 7.20 [V1.25.18.0]
//˼·ǰдļ¼ܻƣΪMCU¼дEEPROMλУ׼ʱ䡱λд붨ʱλͨMCUȡ¼Ĳ
//ֻӵһ͵ڶ֣MCU¼дEEPROM()λУ׼ʱ䡱()
//ͬʱѼ¼Ϊ50ĿǰֻĻϽб¼Ĳ鿴
//Ļʾ±¼ĹܣͬʱΪű䶯лȡаťм¼
//PS:IICܻBUSYעԣҪĻ˳BUSYĴ

/********** 1.¼ʱ书ֲ **********/
//ļӡSOE.cSOE.h
//ӡSOE.c

/********** 2.޸ļ¼ **********/
	if(soe.pc == 0x1C80) //0x1000-0x1C8050
	{
		soe.pc = RECORD_START_ADDR;
	}	
	
	if(soe.num==50)
	{
		soe.num = 50;
	}

/********** 3.¼ **********/
AFE_SH367309.c
(L20)
#include "soe.h"
(L660)AFE_ProtectProcess()
	//soe¼ж
	soe.bsNew[0] = bmsMem.bStatus1;
	soe.bsNew[1] = bmsMem.bStatus2;
	soe.bsNew[2] = bmsMem.bStatus3;
	soe.bsNew[3] = bmsMem.temperaStatus;	
	soe.bsNew[4] = bmsMem.balanceStatus;
	soe.bsNew[5] = bmsMem.packStatus;
	
	
	//ѹ
	if( ((soe.bsOld[0] & 0x43) ==0) && ((soe.bsOld[2] & 0x08) ==0) ) //ԭ״̬
	{
		if((soe.bsNew[0] & 0x43) != 0) //
		{
			soe.bsOld[0] = soe.bsNew[0]; //Ѿִм¼Ͳִ	
			soe.bkType = BKTYPE_ALARM;
		}
		
		if((soe.bsNew[2] & 0x08) != 0) //
		{
			soe.bsOld[2] = soe.bsNew[2]; //Ѿִм¼Ͳִ	  	
			soe.bkType = BKTYPE_ALARM;
		}
	}
	else //Ѿֱ
	{
		if((soe.bsNew[0] & 0x43) == 0) //ûбϴ
		{
			soe.bsOld[0] &= 0XBC;   //~0X43
		}
		
		if((soe.bsNew[2] & 0x08) == 0) //ûбϴ
		{
			soe.bsOld[2] &= 0XF7;   //~0X08
		}
	}
	
	//
	if( ((soe.bsOld[0] & 0x3c) ==0) && ((soe.bsOld[3] & 0x30) ==0) ) //ԭ״̬
	{
		if((soe.bsNew[0] & 0x3c) != 0) //
		{
			soe.bsOld[0] = soe.bsNew[0]; //Ѿִм¼Ͳִ	
			soe.bkType = BKTYPE_ALARM;
		}
		
		if((soe.bsNew[3] & 0x30) != 0) //
		{
			soe.bsOld[3] = soe.bsNew[3]; //Ѿִм¼Ͳִ	  	
			soe.bkType = BKTYPE_ALARM;
		}
	}
	else //Ѿֱ
	{
		if((soe.bsNew[0] & 0x3c) == 0) //ûбϴ
		{
			soe.bsOld[0] &= 0XC3;   //~0X3c
		}
		
		if((soe.bsNew[3] & 0x30) == 0) //ûбϴ
		{
			soe.bsOld[3] &= 0XCF;   //~0X30
		}
	}
	
	//¶ȱ
	if( ((soe.bsOld[1] & 0x0f) ==0) && ((soe.bsOld[3] & 0x8f) ==0) ) //ԭ״̬
	{
		if((soe.bsNew[1] & 0x0f) != 0) //
		{
			soe.bsOld[1] = soe.bsNew[1]; //Ѿִм¼Ͳִ	
			soe.bkType = BKTYPE_ALARM;
		}
		
		if((soe.bsNew[3] & 0x8f) != 0) //
		{
			soe.bsOld[3] = soe.bsNew[3]; //Ѿִм¼Ͳִ	
			soe.bkType = BKTYPE_ALARM;
		}
	}
	else //Ѿֱ
	{
		if((soe.bsNew[1] & 0x0f) == 0) //ûбϴ
		{
			soe.bsOld[1] &= 0XF0;   //~0X0f
		}
		
		if((soe.bsNew[3] & 0x8f) == 0) //ûбϴ
		{
			soe.bsOld[3] &= 0X70;   //~0X8f
		}
	}
	
	//DIͣ
	if( ((soe.bsOld[3] & 0x40) ==0) ) //ԭ״̬
	{
		if((soe.bsNew[3] & 0x40) != 0) //
		{
			soe.bsOld[3] = soe.bsNew[3]; //Ѿִм¼Ͳִ		
			soe.bkType = BKTYPE_ALARM;
		}
	}
	else //Ѿֱ
	{
		if((soe.bsNew[3] & 0x40) == 0) //ûбϴ
		{
			soe.bsOld[3] &= 0XBF;   //~0X40
		}
	}
	
	if(soe.bkType !=0)	//м¼
	{		
		SOE_BkData(soe.bkType);    //ڲBKTYPE
	}

/********** 4.¼Ļʾ() **********/
1.ʱʾ-00A9SDWA.c
#include "rtc.h"
//0x00A9
//A5 5A 0A 82 00 A9 year month date week hour min sec
void SDWA_Send_Time(uint16_t addr){()}
2.󣬻һ죬ڼʱ1ʱ֡0գ"1"һԴơrtc.c
temp2=temp2+day+table_week[month-1]+1;

3.ɾ¼İťSDWA.c
#include "soe.h"
//ֱӷʱпӰ̣Flag/Count++ķ
(L787)
		if(clearFlag != 0) //ɾ¼ʾ
		{
			SDWA_Send_VAR(0x0420, 0);
			SDWA_Send_VAR(0x0400, 1);
			clearFlag++;
			
			if(clearFlag > 3)
			{
				clearFlag = 0;
				SDWA_Send_VAR(0x0400, 0);
			}
		}
(L1513)
		//ɾ¼ť
		if((sdwaBuf[2]==0x06) && (sdwaBuf[3]==0x83) && (sdwaBuf[4]==0x04) && (sdwaBuf[5]==0x10)) //ť
		{
			uint16_t  i;
			uint16_t  pc;	   //дַ
			uint8_t   adrh,adrl;
			uint8_t   wrBuf[64];
			
			SDWA_Send_VAR(0x0420, 1);
			
			soe.index = 0;    //ʼ0
			soe.pc = 0x1000; //ʼַ0x1000
			soe.num = 0;    //ʼ0
			
			wrBuf[0] = (soe.index >> 24) & 0xff ;
			wrBuf[1] = (soe.index >> 16) & 0xff  ;
			wrBuf[2] = (soe.index >>  8) & 0xff  ;
			wrBuf[3] = (soe.index >>  0) & 0xff  ;
			wrBuf[4] = (soe.pc >>8)&0XFF ;
			wrBuf[5] =  soe.pc & 0xff ;
			wrBuf[6] = (soe.num >>8)&0XFF ;
			wrBuf[7] =  soe.num & 0xff  ;
			
			EEPROM_WrMulByte(0x08,0x00,8,wrBuf);
			delay_ms(10);
			
			pc = 0x1000;
			for(i=0;i<52;i++)
			{
				wrBuf[i] = 0xff;
			}
			for(i=0;i<50;i++)
			{
				adrh = (pc>>8) & 0xff;
				adrl =  pc & 0xff;	
				EEPROM_WrMulByte(adrh,adrl,52,wrBuf);	
				delay_ms(10);	
				
				pc += 0x40;
			}
			
			read_index = 0;
			clearFlag = 1;
		}

/********** 5.¼Ļʾ() **********/
//uf_I2C1_Initжڵǰ¼ŵĶȡעsoe.pcsoe.indexָ[һ]дַͼ
1.ʾҳļ¼
	uint8_t  i;
	uint8_t  adrh,adrl;
	uint32_t ee_index[3];
	uint16_t ee_pc[3];

	//¼,ʼĬ012
	ee_index[0] = read_index;
	ee_pc[0] = 0x1000 + 0x0040 * ee_index[0];
	ee_index[1] = read_index+1;
	ee_pc[1] = 0x1000 + 0x0040 * ee_index[1];
	ee_index[2] = read_index+2;
	ee_pc[2] = 0x1000 + 0x0040 * ee_index[2];
	
	USART_SendVarToSDWA(0x0701, ee_index[0]+1);
	USART_SendVarToSDWA(0x0702, ee_index[1]+1);
	USART_SendVarToSDWA(0x0703, ee_index[2]+1);
	
	//ʾŶӦı¼
	if(read_index < soe.num)//ΪٶдEEPROMֻsoe.numΧʱ
	{
		for(i=0;i<3;i++)
		{
			adrh = (ee_pc[i]>>8) & 0xff;
			adrl =  ee_pc[i] & 0xff;
			EEPROM_RdMulByte(adrh,adrl,52,recordBuf);
			delay_ms(10);
			
			if(recordBuf[0]==0xff && recordBuf[1]==0xff && recordBuf[2]==0xff && recordBuf[3]==0xff)//ȫ0xff,ʾ
			{
				SDWA_Send_VAR(0x0705 + 0x0001*i,1);
			}
			else
			{
				SDWA_Send_VAR(0x0705 + 0x0001*i,0);
				SDWA_Send_RecordTime(0x0710 + 0x0100*i);
				SDWA_Send_Record(0x0790 + 0x0100*i);
			}
		}
	}
	else
	{
		for(i=0;i<3;i++)
		{
			SDWA_Send_VAR(0x0705 + 0x0001*i,1);
		}
	}
2.ͱ¼ʱıģ
void SDWA_Send_RecordTime(uint16_t addr){()}
3.ͱ¼ݵıģ
void SDWA_Send_Record(uint16_t addr){()}
4.¼ʾ
USART_SendVarToSDWA(0x0708, soe.num ); //¼ʾ
5.¼ӺˢSDWAĺ
	SDWA_Init();
6.Ļ֮ǰдĻᱻհ׵ĺ
void SDWA_Send_Blank(uint16_t addr){()}


////////////////////ͬͱȺ֣ټ¼һ޸7.25 [V1.25.18.1]
//ͬ͵ıֿϸ


////////////////////¼ȥ51ʼʾ1~50 [V1.25.18.2]
//SDWA_InitУ
	if(ee_index[2] != 50)
	{
		SDWA_Send_VAR(0x0709, 0);
		USART_SendVarToSDWA(0x0703, ee_index[2]+1);
	}
	else
	{
		SDWA_Send_VAR(0x0709, 1);
	}


////////////////////Ļʾתֿ [V1.25.18.3]
1.ԭSDWA_JumpToAlarmֳ
  SDWA_ShowAlarmSDWA_JumpToAlarm
2.SDWA_ShowAlarmõSDWA_UpdateDataУ
    if(bAlarmFlag == 0) //Ļϵı
    {
				if( (bmsMem.temperaStatus & 0x40) !=0) //ͣ
				{
					SDWA_Send_VAR(0x0100, 5); //Emergency
				}
				else
				{
					if(bCHGING ==1) //״̬
					{
							//SDWA_Send_Charging(0x0100);
							SDWA_Send_VAR(0x0100, 0); //Charge
					}
					else            //ŵ״̬
					{
							//SDWA_Send_Discharging(0x0100);
							SDWA_Send_VAR(0x0100, 1); //Discharge
					} 
				}
				
				SDWA_ClearAlarm();
				
    }
    else                //Ļϵı
    {
        //SDWA_Send_Fault(0x0100);
				SDWA_Send_VAR(0x0100, 2); //Fault
				
				if(bAlarmFlagOld ==0) 
				{
					bAlarmFlagOld = 1;
					SDWA_JumpToAlarm();
				}
				
				SDWA_ShowAlarm();
				
    }


////////////////////Ļ޸ѹֵ [V1.25.18.4]
1.Ļ->ݸֵ
						//޸ѹA5 5A 06 83 13 10 01 dataH dataL
			if((sdwaBuf[2]==0x06) && (sdwaBuf[3]==0x83) && (sdwaBuf[4]==0x13) && (sdwaBuf[5]==0x10))
			{
				uint16_t tmp;
				tmp = sdwaBuf[7]<<8 | sdwaBuf[8];
				bmsMem.inverter_chgVolLimit = tmp;
			}
2.Ļʱʾֵ
		USART_SendVarToSDWA(0x1310, bmsMem.inverter_chgVolLimit );
  ڳʼҲʾ
 	USART_SendVarToSDWA(0x1310, bmsMem.inverter_chgVolLimit );
	USART_SendVarToSDWA(0x0708, soe.num ); //¼ʾ
3.޸ĵֵFlashڣ
  PSbmsMem.ee_sconf1~inverter_dsgCurLimitλдò52λݣԻᱣFlash
      ֻ֮ݣŻרŴEEPROMУԸֵѡFlash
#include "AFE_SH367309.h"
				//bmsMemݸµFLASH ABAFE EEPORM
				if(MEMORY_UpdateFlash(FLASH_DATA_A_BASE) ==0   &&   MEMORY_UpdateFlash(FLASH_DATA_B_BASE) ==0)
				{
					staPack.bits.flashUpdate= 0;
					if(AFE_UpdateConfig() ==0) 
					{
						staPack.bits.eepromUpdate = 0;
					}
					else
					{
						staPack.bits.eepromUpdate = 1;	
					}						
				}
				else
				{
					staPack.bits.flashUpdate= 1;
				}
				bmsMem.packStatus = staPack.halfword;	


////////////////////²ûMOSͣ£ΪAFE_Ctrlֵ [V1.25.18.5]
AFE_Ctrl
if((bmsMem.temperaStatus & 0xBf) != 0) //BIT0-5.7
DIDO_Ctrl
	if((bmsMem.temperaStatus & 0xBf) == 0) //ӰBIT0-5ܵ


////////////////////޸ЭVictrion [V1.25.18.6]
VictrionЭڴȡע͡Эбδʵݣ޸ʹڵı
void CAN_Protocol_Victrion(void){()}


////////////////////޸ͨЭ:Ĵ䣬д޸ģЭ鴫ҲҪΪ [V1.25.18.7]
global.h
extern uint8_t capacity_Ah;
GasGauge.c
(L28)
uint8_t capacity_Ah; //,ڼλ λ1Ah
(L45)
	if(tmpRd>0 && tmpRd<255) //֮ǰдֵ,Ͱ֮ǰֵʾʾ100Ah
	{
		bmsMem.fcc = 3600 * 1000*tmpRd;
		capacity_Ah = tmpRd;
	}
	else
	{
		bmsMem.fcc = 3600 * 100000;   //ϵͳݶ100AH = 100,000mAH = 360,000,000mAS
		capacity_Ah = 100;
		tmpRd = 100;
		EEPROM_WrMulByte(7,1,1,&tmpRd);
	}
(L146)
		if(bmsMem.write_Capacity !=0)
		{
			EEPROM_WrMulByte(7,1,1,&bmsMem.write_Capacity);
			delay_ms(5);
			
			capacity_Ah = bmsMem.write_Capacity;
			bmsMem.fcc = 3600 * 1000*bmsMem.write_Capacity;
			bmsMem.write_Capacity = 0;
		}
//Эͳһ޸ģ
totalCapacity = 10000 * bmsMem.E2_485Snum; -> totalCapacity = 100 * capacity_Ah * bmsMem.E2_485Snum; //λ0.01Ah
totalCapacity = 100 * bmsMem.E2_485Snum;   -> totalCapacity = capacity_Ah * bmsMem.E2_485Snum; //λ1Ah


////////////////////޸ͨЭ:λ޸ĵֵֻõ屾ģֵȻҪԸ [V1.25.18.8]

		chgCurLimit = bmsMem.inverter_chgCurLimit; //ƣλãĬֵ100A
		dsgCurLimit = bmsMem.inverter_dsgCurLimit; //ŵƣλãĬֵ100A
>
		chgCurLimit = bmsMem.inverter_chgCurLimit * bmsMem.E2_485Snum; //ƣλãĬֵ100A
		dsgCurLimit = bmsMem.inverter_dsgCurLimit * bmsMem.E2_485Snum; //ŵƣλãĬֵ100A


////////////////////ƽSOH [V1.25.18.9]
1.canMem[0]ϢҲsohֻǲô
2.ͨЭ:SOH̶99ƽֵ


////////////////////ModbusӻݻܵcanMemΧ [V1.25.18.10]
	uint8_t     soc;
	uint8_t     soh;
	>
	uint16_t    soc;
	uint16_t    soh;


////////////////////Modbusгֹ⣬ʼֵЩ [V1.25.18.11]
//ע⣬SOCĻӰҪע͵
void MODBUS_Init(void)
{		
	modbusCurSta = 0;     //ǰɼ״̬
	modbusCurDev = 2;     //ǰɼ豸Ӵӻ2ʼ
	modbusCurRevdFlag = 0;//
	modbusCurSlaveNum = 0;
	
	canMem[0].protect_byte1 = 0;
	canMem[0].protect_byte2 = 0;
	canMem[0].alarm_byte1 = 0;
	canMem[0].alarm_byte2 = 0;
	canMem[0].cur  = 0;
	canMem[0].temp = 0;
//	canMem[0].soc  = 0;
//	canMem[0].soh  = 0;
	
	modbusBufIndex = 0;
	modbusF03RxFlg = 0;
	modbusF10RxFlg = 0;
	modbusFaaRxFlg = 0;
	modbusFbbRxFlg = 0;
	modbusMoniCount = MODBUS_MON_CNT;
	
	uf_UART_Init(9600);
}


////////////////////¼ᳬ50¼¼Ǿɵ [V1.25.18.12]
//ܸ޸(Total)
	if(soe.num >= 50)
	{
		soe.num = 50;
	}
//±ʾ(Latest)


////////////////////״̬Сʱûʾ״̬޸ [V1.25.18.13]
//AFE_CurrentProcess()
		bDSGING = 1;
		bCHGING = 1;

////////////////////ͨʱз͵ĸûܵݻгʱ޶+/-500A [V1.25.18.14]


////////////////////ת int16->int32 [V1.25.18.15]
//Դյӻݺδȷת
ԭӦ -1.06A = -(006A)  = 1111 1111 1111 1111 1111 1111 1001 0110
ڴ654.30A = 0000FF96 = 0000 0000 0000 0000 1111 1111 1001 0110


////////////////////GrowattЭ£ͷԵGrowatt [V1.25.18.16]


////////////////////Ļ˺صһҳ(԰) [V0.0.0.17]
1.MCUĻSDWA_DetectBright()
2.Ļر䰵ĶӦݣMCUҳת
			//Ϣٴ򿪣תҳ
            //Ļ20: A5 5A 04 81 01 01 20
            //תýָ: A5 5A 04 80 03 00 01			
			if((sdwaBuf[2]==0x04) && (sdwaBuf[3]==0x81) && (sdwaBuf[6]==0x20))
			{
				USART_SendData(USART2, 0xA5);
				while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);	
				USART_SendData(USART2, 0x5A);
				while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);	
				USART_SendData(USART2, 0x04);
				while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);	
				USART_SendData(USART2, 0x80);
				while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);	
				USART_SendData(USART2, 0x03);
				while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);	
				USART_SendData(USART2, 0x00);
				while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);				
				USART_SendData(USART2, 0x01);
				while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
			}


////////////////////޸ļͣӦӢ"Emergency"->"RPSD_Activated" [V0.0.0.18]
	if( ((temperaStatus & 0x40) !=0) ) //ͣ RPSD_Activated
	{
		sendcount +=15;
		*p = 'R'; p++;
		*p = 'P'; p++;
		*p = 'S'; p++;
		*p = 'D'; p++;
		*p = '_'; p++;
		*p = 'A'; p++;
		*p = 'c'; p++;
		*p = 't'; p++;
		*p = 'i'; p++;
		*p = 'v'; p++;
		*p = 'a'; p++;
		*p = 't'; p++;
		*p = 'e'; p++;
		*p = 'd'; p++;
		*p = ' '; p++;
	}


**9.5**
////////////////////Ļȼ⣬ӦᵼִSDWA_Init()޸ [0.0.18.19]


////////////////////Ļд࣬һжԼдЭѡĴ
SDWA.c
	uint8_t protocol_Index;
	protocol_Index = protocol;

protocol -> protocol_Index

			if(protocol != protocol_Index)
			{
				protocol = protocol_Index;
				
				EEPROM_WrMulByte(7,0,1,&protocol);
				delay_ms(5);
			}


////////////////////SOC磬׵99.1Ah
//ȥ=


////////////////////Ĭֵ޸105A [0.0.18.20]


** 9.25ŲBUG **
1
////////////////////ӵ5ҳЭѡѡ No.34~42
void SDWA_Init(void)
ע޸мж
					SDWA_DispProcotol(0x03,0x06,0x00);

void SDWA_RecvData(void)

			else if((sdwaBuf[2]==0x06) && (sdwaBuf[3]==0x83) && (sdwaBuf[4]==0x03) && (sdwaBuf[5]==0x16))  
			{
				if(sdwaBuf[8]==0x01)
				{
					if(protocol !=0x07)
						protocol = 0x07;
				}
				else if(sdwaBuf[8]==0x00)
				{
					if(protocol ==0x07)
						protocol = 0x00;
				}					
			}


////////////////////Э [0.29.0.0]
17.SMK			485
32.COSUPER		485		SRNE
33.Sunway		485		SMK
30.Amensolar	CAN		Megarevo

½ݴ,ͬʱ϶ⶨ
void MOD_Protocol_COSUPER(void){}
extern void MOD_Protocol_COSUPER(void);

void CAN_UpdateData(void)

	else if(protocol_Index == 32){}

void Protocol_UpdateData(void)void MODBUS1_IT_TIMUpdate(void)

	else if(protocol_Index == 32){}


2
////////////////////ʼʱӻ0ӻҲӦ1
RS485_Modbus.c(L461)
	bmsMem.E2_485Snum = 1;


////////////////////ĻûеıҲҳʾFault [0.0.18.21]


////////////////////MOSرջ2AϵDOض [0.0.18.22]
ƽ̵رգ
ŵMOSرգԴڷŵ˵ŵMOS𻵣迪̵ⲿе·ĶϿ
               ʱڷŵߴֵ迪̵
MOSرգԴڳ˵MOS𻵣迪̵ⲿе·ĶϿ
               ʱڷŵߴֵ迪̵

*תĻ
*Ҫ2bit־λʾMOSϡŵMOS[bmsMem.bStatus2bit7.8]
*λλʾ屨
*¼C-MOS_FaultD-MOS_Fault

//еDIDO->DI,DI_CTRL->DI
//DOӦPB14ʹܺΪDO_On()DO_Off()
//־λõbmsMem.bStatus2bit6bit7bmsMem.packCurrent1sһΣʼִдһֱӷAFE_ProtectProcess()ִ
bmsMem.bStatus2 = temp[1] & 0x0f; //bit4~7ط
//MOSϵı¼ʾ


3
////////////////////ѹ [0.0.18.23]
(ڳ״̬)SOC99%
ʱѹתĻҲ

*98  ->ѹ->+ת+ʾѹ   ->->+ת+ʾѹ
*98  ->->+ת+ʾѹ ->ѹ->+ת+ʾѹ

*100 ->->+ת+ʾѹ ->ѹ->++ʾѹ
*100 ->ѹ->++ʾѹ ->->+ת+ʾѹ

//ƺĻתؽSOCж


4
////////////////////״̬Nomal [0.0.18.24]
//״̬ΪǶڳŵ״ֵ̬
AFE_SH367309.c
//ڵֵС100mAҴ-100mAŵ״̬0
SDWA
//ֻӰĻʾڳŵ״̬ǰ
GasGauge.c
//100mAĵԲ
SDWA_Send_VAR(0x0100, 6);


////////////////////Ŷ˶շֿݸ£ŶҪ8Ҳ16 [0.0.18.25]


////////////////////485ЭֵΪ [0.0.18.26]


////////////////////DOƵѿһߵƽͻҲз [0.0.18.27]
//Ӷ-2A~2A֮DO
//ʱжϱDODSGcountDOCHGcount


////////////////////[0.0.18.26]ĺŻ [0.0.18.28]
1.485Эڵ
//bmsMem.fcc/3600*bmsMem.E2_485Snum/10 -> 100*capacity_Ah*bmsMem.E2_485Snum
//bmsMem.fcc/3600*bmsMem.E2_485Snum -> 1000*capacity_Ah*bmsMem.E2_485Snum
2.
//(ԪЭ)̶1 -> bmsMem.E2_485Snum
3.
//ͳһĵо
//ɾȥcellNumĶ壬(GaugeManage())滻bmsMem.ucCellNum
//(COSUPERЭ)bmsMem.ee_sconf1&0x0f -> bmsMem.ucCellNum
//(ԪЭ+ȫַΧĴֵ)̶16 -> bmsMem.ucCellNum
for(i=0;i<16;i++) -> for(i=0;i<bmsMem.ucCellNum;i++)
4.޸
Protocol_UpdateData() -> MODBUS1_UpdateData()
CAN_UpdateDataгţMODBUS1_UpdateDataһ
5.ϲͬOUCOMagerevoSunsynkDeye
6.Victrion->Victron
7.485Э17.SMK


////////////////////Ļѹд54~58Vʾԭֵ [0.0.18.29]


////////////////////ЭAforeͨѶҪظΪ0.5sһ [0.30.0.0]


////////////////////SDWnĻ-ַ0x03ffϢתͬ [0.0.0.0.n]
ע⣺
ĻϢתҪȫֱͬ
ʵʱ¼ҳʾϴˢµҪѸҳҲִкif(read_index < soe.num+3)
SDWnԣɹͼʾΪͼ겻͸ҪʽˢµSDWA_Init();


////////////////////ֵ255->65535 [0.0.18.30]
1.λдcapacity
//ȥcrc8У飬write_CapacityΪu16
//capacity_Ah
//ʼ/дʱŵEEPROMִַ2λ(7,1,2)
//յҪджС1000Żд룬0
//bmsMem.fcc = 3600 * 1000 * capacity_AhbmsMem.fccu32ģ0xFFFFFFFFӦԼ1,193.04AhλΪ1000Ah
2.صӦù


////////////////////Pylonʢܽܵuint32_tͣӦռ4Byte޸


////////////////////GSSTESʯЭNo.36


////////////////////״̬Ż [0.0.18.31]
//עͳһΪStandby
//״̬ʱֵڡֵ಻㣬У׼
AFE_SH367309.c
//ڵֵС100mAҴ-100mA(ĻСʾ0.1A)
//ŵ״̬ʱ0
GasGauge.c
//ĶAFE_CurrentProcess()
//100mAĵ
//ַжţҪжϳŵ״̬
//ת100%->99.1% Ϊ 100%->99.5% 
//ת0%->0.9% Ϊ 0%->0.5% 


////////////////////°汾 [0.0.18.32]
Ӳʾ5.0.G
ʾƣV1.24.A0.0
/ڲĳ汾ʾ:V0.0.0.0
Ļʱأ֣


////////////////////CANЭCAN ID10Ϊ20(Sigineer\Schneider\Pylon)Ҫ
CanTxMsg TxMessage[20];
uint8_t  TxMailBox[20];


////////////////////MOSʹгͻжcurLimitFlag=0 11.7 [0.0.18.33]




////////////////////uf_UART_Init() -> uf_UART1_Init()


////////////////////Ծλܷɾ¼50ʱ϶ʱ¼ [V0.0.18.34]
1.global.h
extern void UART1_ReadRecord(void);
extern void UART1_ClearRecord(void);
2.RS485_Modbus.c
MODBUS_IT_TIMUpdate()ӣ
			else if((modbusBuf[0] == bmsMem.E2_485Addr) && (modbusBuf[1] == 0Xdd) )    //ȡ¼
			{
					UART1_ReadRecord();
			}
			else if((modbusBuf[0] == bmsMem.E2_485Addr) && (modbusBuf[1] == 0xee) )    //¼
			{
					UART1_ClearRecord();
			}
MODBUS_IQ_Transmit()ӣ
	else if(modbusFddRxFlg == 1) //˳¼
	{
		modbusFddRxFlg = 0;
		modbusBufIndex = 0;		

		EEPROM_RdMulByte(modbusBuf[2],modbusBuf[3],52, &modbusBuf[4]);	
		crc16 = CRC16_Cal(modbusBuf, 56);	
		modbusBuf[56] = crc16.b8[0];
		modbusBuf[57] = crc16.b8[1];
		
		MODBUS_UART_SendMulByte(modbusBuf, 58);		
		MODBUS_UART_IT_RX_ENABLE;
	}
	else if(modbusFeeRxFlg == 1) //¼
	{
		modbusFeeRxFlg = 0;
		modbusBufIndex = 0;
		MODBUS_UART_SendMulByte(modbusBuf, 8 );		
		MODBUS_UART_IT_RX_ENABLE;
	}
¼ӣ
uint8_t  modbusFddRxFlg;         //ȡ¼ ȷ
uint8_t  modbusFeeRxFlg;         //¼ ȷ

/****************************************
****  ˳¼   *****
** M: A1 dd 10 00 00 00 CRCL H **
** S: A1 dd 10 00 d0-51 CRCL H **
*****************************************/
void UART1_ReadRecord(void)
{
	BYTE2     crc16;
	
	//CRCж
	crc16 = CRC16_Cal(modbusBuf, 6);
	if( (modbusBuf[7] == crc16.b8[1]) || (modbusBuf[6] == crc16.b8[0]) ) 
	{
		modbusFddRxFlg = 1;
		MODBUS_UART_IT_RX_DISABLE;
	}
	else
	{
		MODBUS_Init(); //ûʱַͨѶӲϣʱ䵽³ʼ֮Żָ
	}
}

/****************************************
****  EEPROMڵļ¼   *****
** M: A2 ee 00 55 00 aa CRCL H **
** S: A2 ee 00 55 00 aa CRCL H **
*****************************************/
void UART1_ClearRecord(void)
{
	uint16_t  i;
	uint16_t  pc;	   //дַ
	uint8_t   adrh,adrl;
	uint8_t   wrBuf[64];
	BYTE2     crc16;
	
	//CRCж
	crc16 = CRC16_Cal(modbusBuf, 6);
	if( (modbusBuf[7] == crc16.b8[1]) || (modbusBuf[6] == crc16.b8[0]) ) 
	{
		soe.index = 0;    //ʼ0
		soe.pc = 0x1000; //ʼַ0x1000
		soe.num = 0;    //ʼ0
		
		wrBuf[0] = (soe.index >> 24) & 0xff ;
		wrBuf[1] = (soe.index >> 16) & 0xff  ;
		wrBuf[2] = (soe.index >>  8) & 0xff  ;
		wrBuf[3] = (soe.index >>  0) & 0xff  ;
		wrBuf[4] = (soe.pc >>8)&0XFF ;
		wrBuf[5] =  soe.pc & 0xff ;
		wrBuf[6] = (soe.num >>8)&0XFF ;
		wrBuf[7] =  soe.num & 0xff  ;
		
		EEPROM_WrMulByte(0x08,0x00,8,wrBuf);
		delay_ms(10);
		
		pc = 0x1000;
		for(i=0;i<52;i++)
		{
			wrBuf[i] = 0xff;
		}
		for(i=0;i<50;i++)
		{
			adrh = (pc>>8) & 0xff;
			adrl =  pc & 0xff;	
			EEPROM_WrMulByte(adrh,adrl,52,wrBuf);	
			delay_ms(10);	
			
			pc += 0x40;
		}

		
		EEPROM_RdMulByte(0x08,0x04,4,&modbusBuf[2]); //ǰ
		
		crc16 = CRC16_Cal(modbusBuf, 6);	
		modbusBuf[6] = crc16.b8[0];
		modbusBuf[7] = crc16.b8[1];	
		
		modbusFeeRxFlg = 1;
		MODBUS_UART_IT_RX_DISABLE;
	}
	else
	{
		MODBUS_Init(); //ûʱַͨѶӲϣʱ䵽³ʼ֮Żָ
	}
}


////////////////////λ޸Soc [V0.0.18.35]
global.h
	//20231109---------------
	uint8_t     write_Soc; //ͨλıӵͨŵַ
	uint8_t     soc_crc;
	//20231109---------------
RS485_Modbus.c
0x4A -> 0x4B
GasGauge.c
	if(bmsMem.write_Soc !=0)
	{
		EEPROM_WrMulByte(0,EEPROM_SOC_ADDR,1,&bmsMem.write_Soc);
		delay_ms(5);
		
		bmsMem.soc = bmsMem.write_Soc;
		bmsMem.rcc = (bmsMem.fcc/100) * bmsMem.soc;
		bmsMem.write_Soc = 0;
	}


////////////////////оϵСѹжŵѹ⺯AFE_VoltageProcess()
	bmsMem.ucCellNum = bmsMem.ee_sconf1 & 0x0F;
	if( bmsMem.ucCellNum < 5 ) //16һ0000
	{
		bmsMem.ucCellNum = 16;
	}


////////////////////ֻ4·¶Ƚƽ¶ȡ¶ȵļ [Vx.x.18.36]


////////////////////ȥ²һܣtemperatStatus.bit7Ԥ [Vx.x.18.37]


////////////////////άʵԹ޸Э [Vx.x.18.38]


////////////////////Ķѯݵıֵ [Vx.x.18.39]
ݵıֵЭĸΪbStatus1,2,3temperaStatus
global.h
BMS_MEMORYṹ壺bmsMem.can_protect_byte1 -> bmsMem.can_status_byte1
CAN_MEMORYṹ壺canMem[i].protect_byte1 -> canMem[i].status_byte1
AFE_SH367309.c
AFE_ProtectProcess()ӣ
	//sum of all packs
	bmsMem.can_status_byte1 = bmsMem.bStatus1;
	bmsMem.can_status_byte2 = bmsMem.bStatus2;
	bmsMem.can_status_byte3 = bmsMem.bStatus3;
	bmsMem.can_status_byte4 = bmsMem.temperaStatus; //¶ȱжڴ֮ǰִ
RS485_Modbus.c͡ProtocolSwitch_P1/2/3/4/5.c
ԭbmsMem.bStatus1 -> Э麯protectByte1 -> bmsMem.can_protect_byte1 -> canMem[i].protect_byte1 -> Э麯
ڣbmsMem.bStatus1 -> bmsMem.can_status_byte1 -> canMem[i].status_byte1 -> Э麯protectByte1 -> Э麯


////////////////////IICͨŻ [Vx.x.18.40]


////////////////////С˲ֵ3ʹ3µӳʾ [Vx.x.18.41]


////////////////////¶ȵһֱδ£޸ [Vx.x.18.42]


////////////////////ʹʱĵһֱգ [Vx.x.18.43]
//ղΪֵ


////////////////////DeyeЭ飬ǿ־ [Vx.x.18.44]
//жͻPylonЭ()5%10%Ϊ׼




////////////////////1λ [V0.0.19.00]
//ݹΪ˺֣Ϊ0x33
RS485_Modbus_Inverter.c
//
(L5)
#include "rtc.h"
#include "soe.h"
(L14)
#define  MODBUS1_MEM_PT              (uint8_t *)&bmsMem.vCell[0]       //λͨѶڴ濪ʼַ
#define  MODBUS1_VersionMEM_PT        (uint8_t *)&VersionMem.Hardware[0]//λ汾ͨѶڴ濪ʼַ
#define  MODBUS1_TimeMEM_PT           (uint8_t *)&calendar_WRITE.sec    //λʱУ׼ͨѶڴ濪ʼַ
(L29)
uint8_t  modbus1F10RxFlg;         //дݽȷ
uint8_t  modbus1FaaRxFlg;         //CADCУ׼ݽȷ
uint8_t  modbus1FbbRxFlg;         //CADCУ׼ݽȷ
uint8_t  modbus1FddRxFlg;         //ȡ¼ ȷ
uint8_t  modbus1FeeRxFlg;         //¼ ȷ
(L88)
	BYTE2 crc16;
(L97)
	else if(modbus1F10RxFlg == 1)
	{
		modbus1F10RxFlg = 0;
		modbus1BufIndex = 0;
		
		//bmsMemݸµFLASH ABAFE EEPORM
		if(MEMORY_UpdateFlash(FLASH_DATA_A_BASE) ==0   &&   MEMORY_UpdateFlash(FLASH_DATA_B_BASE) ==0)
		{			
			staPack.bits.flashUpdate= 0;
			if(AFE_UpdateConfig() ==0) 
			{
				staPack.bits.eepromUpdate = 0;
				MODBUS1_UART_SendMulByte(modbus1Buf, 8);	
			}
			else
			{
				staPack.bits.eepromUpdate = 1;	
			}						
		}
		else
		{
			staPack.bits.flashUpdate= 1;
		}
		bmsMem.packStatus = staPack.halfword;		
		MODBUS1_UART_IT_RX_ENABLE;		
	}
	else if(modbus1FaaRxFlg == 1)
	{
		modbus1FaaRxFlg = 0;
		modbus1BufIndex = 0;	
		
		if(cali.flagZeroCaliFail ==0)  //ok
		{
		//	01 AA 5A A5 03 04 CRCL H
			modbus1Buf[0] = bmsMem.E2_485Addr;
			modbus1Buf[1] = 0xaa;
			modbus1Buf[2] = 0x5a;
			modbus1Buf[3] = 0xa5;
			modbus1Buf[4] = 0x03;
			modbus1Buf[5] = 0x04;
			crc16 = CRC16_Cal(modbus1Buf, 6);	
			modbus1Buf[6] = crc16.b8[0];
			modbus1Buf[7] = crc16.b8[1];
			MODBUS1_UART_SendMulByte(modbus1Buf, 8);
		}
		else //fail
		{
		//	01 AA 5A A5 05 06 CRCL H
			modbus1Buf[0] = bmsMem.E2_485Addr;
			modbus1Buf[1] = 0xaa;
			modbus1Buf[2] = 0x5a;
			modbus1Buf[3] = 0xa5;
			modbus1Buf[4] = 0x05;
			modbus1Buf[5] = 0x06;
			crc16 = CRC16_Cal(modbus1Buf, 6);	
			modbus1Buf[6] = crc16.b8[0];
			modbus1Buf[7] = crc16.b8[1];
			MODBUS1_UART_SendMulByte(modbus1Buf, 8);
		}
		
		MODBUS1_UART_IT_RX_ENABLE;	
	}
	else if(modbus1FbbRxFlg == 1)
	{
		modbus1FbbRxFlg = 0;
		modbus1BufIndex = 0;	
		
		if(cali.flagGainCaliFail ==0)  //ok
		{
		//	01 AA 5A A5 03 04 CRCL H
			modbus1Buf[0] = bmsMem.E2_485Addr;
			modbus1Buf[1] = 0xbb;
			modbus1Buf[2] = 0x5b;
			modbus1Buf[3] = 0xb5;
			modbus1Buf[4] = 0x03;
			modbus1Buf[5] = 0x04;
			crc16 = CRC16_Cal(modbus1Buf, 6);	
			modbus1Buf[6] = crc16.b8[0];
			modbus1Buf[7] = crc16.b8[1];
			MODBUS1_UART_SendMulByte(modbus1Buf, 8);
		}
		else //fail
		{
		//	01 AA 5A A5 05 06 CRCL H
			modbus1Buf[0] = bmsMem.E2_485Addr;
			modbus1Buf[1] = 0xbb;
			modbus1Buf[2] = 0x5b;
			modbus1Buf[3] = 0xb5;
			modbus1Buf[4] = 0x05;
			modbus1Buf[5] = 0x06;
			crc16 = CRC16_Cal(modbus1Buf, 6);	
			modbus1Buf[6] = crc16.b8[0];
			modbus1Buf[7] = crc16.b8[1];
			MODBUS1_UART_SendMulByte(modbus1Buf, 8);
		}
		
		MODBUS1_UART_IT_RX_ENABLE;	
	}
	else if(modbus1FddRxFlg == 1) //˳¼
	{
		modbus1FddRxFlg = 0;
		modbus1BufIndex = 0;		

		EEPROM_RdMulByte(modbus1Buf[2],modbus1Buf[3],52, &modbus1Buf[4]);	
		crc16 = CRC16_Cal(modbus1Buf, 56);	
		modbus1Buf[56] = crc16.b8[0];
		modbus1Buf[57] = crc16.b8[1];
		
		MODBUS1_UART_SendMulByte(modbus1Buf, 58);		
		MODBUS1_UART_IT_RX_ENABLE;
	}
	else if(modbus1FeeRxFlg == 1) //¼
	{
		modbus1FeeRxFlg = 0;
		modbus1BufIndex = 0;
		MODBUS1_UART_SendMulByte(modbus1Buf, 8 );		
		MODBUS1_UART_IT_RX_ENABLE;
	}
(L245)
					else
					{
						MODBUS1_Init(); //ûʱַͨѶӲϣʱ䵽³ʼ֮Żָ
					}
			}
			
			else if((modbus1Buf[0] == bmsMem.E2_485Addr) && (modbus1Buf[1] == 0x33) )   //λݴ
			{
					MODBUS1_F03_Rx(MODBUS1_MEM_PT);
			}
			else if((modbus1Buf[0] == bmsMem.E2_485Addr) && (modbus1Buf[1] == 0x10) )    //дݴ
			{
					MODBUS1_F10_Rx(MODBUS1_MEM_PT);
			}
			else if((modbus1Buf[0] == bmsMem.E2_485Addr) && (modbus1Buf[1] == 0xaa) )    //CADCУ׼
			{
					MODBUS1_Faa_Rx(MODBUS1_MEM_PT);   				
			}
			else if((modbus1Buf[0] == bmsMem.E2_485Addr) && (modbus1Buf[1] == 0xbb) )    //CADCУ׼
			{
					MODBUS1_Fbb_Rx(MODBUS1_MEM_PT); 
			}
			else if((modbus1Buf[0] == bmsMem.E2_485Addr) && (modbus1Buf[1] == 0x55) )    //λȡ汾
			{
					MODBUS1_F03_Rx(MODBUS1_VersionMEM_PT);
			}
			else if((modbus1Buf[0] == bmsMem.E2_485Addr) && (modbus1Buf[1] == 0x66) )    //λдʱ
			{
					MODBUS1_F10_Rx(MODBUS1_TimeMEM_PT);
			}
			else if((modbus1Buf[0] == bmsMem.E2_485Addr) && (modbus1Buf[1] == 0Xdd) )    //ȡ¼
			{
					UART3_ReadRecord();
			}
			else if((modbus1Buf[0] == bmsMem.E2_485Addr) && (modbus1Buf[1] == 0xee) )    //¼
			{
					UART3_ClearRecord();
			}
(L303)
			if((modbus1Buf[0] == bmsMem.E2_485Addr) && (modbus1Buf[1] == 0x33) )         //ݴ
			{
					MODBUS1_F03_Rx(MODBUS1_MEM_PT);
			}
			else if((modbus1Buf[0] == bmsMem.E2_485Addr) && (modbus1Buf[1] == 0x10) )    //дݴ
			{
					MODBUS1_F10_Rx(MODBUS1_MEM_PT);
			}
			else if((modbus1Buf[0] == bmsMem.E2_485Addr) && (modbus1Buf[1] == 0xaa) )    //CADCУ׼
			{
					MODBUS1_Faa_Rx(MODBUS1_MEM_PT);   				
			}
			else if((modbus1Buf[0] == bmsMem.E2_485Addr) && (modbus1Buf[1] == 0xbb) )    //CADCУ׼
			{
					MODBUS1_Fbb_Rx(MODBUS1_MEM_PT); 
			}
			else if((modbus1Buf[0] == bmsMem.E2_485Addr) && (modbus1Buf[1] == 0x55) )    //λȡ汾
			{
					MODBUS1_F03_Rx(MODBUS1_VersionMEM_PT);
			}
			else if((modbus1Buf[0] == bmsMem.E2_485Addr) && (modbus1Buf[1] == 0x66) )    //λдʱ
			{
					MODBUS1_F10_Rx(MODBUS1_TimeMEM_PT);
			}
			else if((modbus1Buf[0] == bmsMem.E2_485Addr) && (modbus1Buf[1] == 0Xdd) )    //ȡ¼
			{
					UART3_ReadRecord();
			}
			else if((modbus1Buf[0] == bmsMem.E2_485Addr) && (modbus1Buf[1] == 0xee) )    //¼
			{
					UART3_ClearRecord();
			}
			
			else 
(L360)
/***********************************************
****  MODBUS1 F10 дĴĽ     *****
**  01 10 ADRH L 0 LENTH 2LETH DATAn CRCL H   **
**  01 10 ADRH L 0 LENTH CRCL  CRCH           ** 
************************************************/
//mem point to bmsMem
void  MODBUS1_F10_Rx(uint8_t *mem)
{
	BYTE2     crc16;
	uint8_t   adr;
	uint8_t   len;	
	
	len = modbus1Buf[6];
	adr = modbus1Buf[3] <<1;
	
	//CRCж
	crc16 = CRC16_Cal(modbus1Buf, len+7);
	if( (modbus1Buf[len+8] == crc16.b8[1]) && (modbus1Buf[len+7] == crc16.b8[0]) ) 
	{
		memcpy(mem+adr, &modbus1Buf[7], len);	//modbus1BufCOPYbmsMemṹ壬עС	
		crc16 = CRC16_Cal(modbus1Buf, 6);	
		modbus1Buf[6] = crc16.b8[0];
		modbus1Buf[7] = crc16.b8[1];	
		
		modbus1F10RxFlg = 1;
		MODBUS1_UART_IT_RX_DISABLE;
	}
}

/****************************************
****  MODBUS FAA      CADCУ׼   *****
** M: 01 AA 5A A5 01 02 CRCL H         **
** S: 01 AA 5A A5 03 04 CRCL H    OK   ** 
** S: 01 AA 5A A5 05 06 CRCL H    FAIL **
*****************************************/
void MODBUS1_Faa_Rx(uint8_t *mem)
{
	BYTE2     crc16;
	
	//CRCж
	crc16 = CRC16_Cal(modbus1Buf, 6);
	if( (modbus1Buf[7] == crc16.b8[1]) || (modbus1Buf[6] == crc16.b8[0]) ) 
	{
		cali.cmdZero = 1;
//		if( (modbus1Buf[2] == 0x5a) && (modbus1Buf[3] == 0xa5) && (modbus1Buf[4] == 0x01) && (modbus1Buf[5] == 0x02) )
//		{
//			cali.cmdZero = 1;
//		}

//		crc16 = CRC16_Cal(modbus1Buf, 6);	
//		modbus1Buf[6] = crc16.b8[0];
//		modbus1Buf[7] = crc16.b8[1];	
		
//		modbus1FaaRxFlg = 1;
		MODBUS1_UART_IT_RX_DISABLE;
	}
}

/****************************************
****  MODBUS Fbb      CADCУ׼   *****
** M: 01 BB D1 D2 D3 D4 CRCL H         **
** S: 01 BB 5B B5 03 04 CRCL H     OK  **
** S: 01 BB 5B B5 05 06 CRCL H     FAIL**
*****************************************/
void MODBUS1_Fbb_Rx(uint8_t *mem)
{
	BYTE2     crc16;
	
	//CRCж
	crc16 = CRC16_Cal(modbus1Buf, 6);
	if( (modbus1Buf[7] == crc16.b8[1]) || (modbus1Buf[6] == crc16.b8[0]) ) 
	{		
		cali.current = modbus1Buf[2]<<24 | modbus1Buf[3]<<16 | modbus1Buf[4]<<8 | modbus1Buf[5];	
		cali.cmdGain = 1;		
		
//		crc16 = CRC16_Cal(modbus1Buf, 6);	
//		modbus1Buf[6] = crc16.b8[0];
//		modbus1Buf[7] = crc16.b8[1];	
		
//		modbus1FbbRxFlg = 1;
		MODBUS1_UART_IT_RX_DISABLE;
	}
}
(L486)
	modbus1F10RxFlg = 0;
	modbus1FaaRxFlg = 0;
	modbus1FbbRxFlg = 0;
	modbus1FddRxFlg = 0;
	modbus1FeeRxFlg = 0;
(L64)
/****************************************
****  ˳¼   *****
** M: A1 dd 10 00 00 00 CRCL H **
** S: A1 dd 10 00 d0-51 CRCL H **
*****************************************/
void UART3_ReadRecord(void)
{
	BYTE2     crc16;
	
	//CRCж
	crc16 = CRC16_Cal(modbus1Buf, 6);
	if( (modbus1Buf[7] == crc16.b8[1]) || (modbus1Buf[6] == crc16.b8[0]) ) 
	{
		modbus1FddRxFlg = 1;
		MODBUS1_UART_IT_RX_DISABLE;
	}
	else
	{
		MODBUS1_Init(); //ûʱַͨѶӲϣʱ䵽³ʼ֮Żָ
	}
}

/****************************************
****  EEPROMڵļ¼   *****
** M: A2 ee 00 55 00 aa CRCL H **
** S: A2 ee 00 55 00 aa CRCL H **
*****************************************/
void UART3_ClearRecord(void)
{
	uint16_t  i;
	uint16_t  pc;	   //дַ
	uint8_t   adrh,adrl;
	uint8_t   wrBuf[64];
	BYTE2     crc16;
	
	//CRCж
	crc16 = CRC16_Cal(modbus1Buf, 6);
	if( (modbus1Buf[7] == crc16.b8[1]) || (modbus1Buf[6] == crc16.b8[0]) ) 
	{
		soe.index = 0;    //ʼ0
		soe.pc = 0x1000; //ʼַ0x1000
		soe.num = 0;    //ʼ0
		
		wrBuf[0] = (soe.index >> 24) & 0xff ;
		wrBuf[1] = (soe.index >> 16) & 0xff  ;
		wrBuf[2] = (soe.index >>  8) & 0xff  ;
		wrBuf[3] = (soe.index >>  0) & 0xff  ;
		wrBuf[4] = (soe.pc >>8)&0XFF ;
		wrBuf[5] =  soe.pc & 0xff ;
		wrBuf[6] = (soe.num >>8)&0XFF ;
		wrBuf[7] =  soe.num & 0xff  ;
		
		EEPROM_WrMulByte(0x08,0x00,8,wrBuf);
		delay_ms(10);
		
		pc = 0x1000;
		for(i=0;i<52;i++)
		{
			wrBuf[i] = 0xff;
		}
		for(i=0;i<50;i++)
		{
			adrh = (pc>>8) & 0xff;
			adrl =  pc & 0xff;	
			EEPROM_WrMulByte(adrh,adrl,52,wrBuf);	
			delay_ms(10);	
			
			pc += 0x40;
		}

		
		EEPROM_RdMulByte(0x08,0x04,4,&modbus1Buf[2]); //ǰ
		
		crc16 = CRC16_Cal(modbus1Buf, 6);	
		modbus1Buf[6] = crc16.b8[0];
		modbus1Buf[7] = crc16.b8[1];	
		
		modbus1FeeRxFlg = 1;
		MODBUS1_UART_IT_RX_DISABLE;
	}
	else
	{
		MODBUS1_Init(); //ûʱַͨѶӲϣʱ䵽³ʼ֮Żָ
	}
}
(L583)
//һʱûнյݣʼMODBUS1ͨѶ
void MODBUS1_TIM_Moni(void)
{
	modbus1MoniCount--;
	if(modbus1MoniCount == 0)
	{
		MODBUS1_Init();
	}
}

global.h//
(L643)
extern void UART3_ReadRecord(void);
extern void UART3_ClearRecord(void);
(L645)
extern void MODBUS1_F10_Rx(uint8_t *mem);
extern void MODBUS1_Faa_Rx(uint8_t *mem);
extern void MODBUS1_Fbb_Rx(uint8_t *mem);
(L58)
extern uint8_t modbus1FaaRxFlg;       //CADCУ׼ݽȷ
extern uint8_t modbus1FbbRxFlg;       //CADCУ׼ݽȷ
(L641)
extern void MODBUS1_TIM_Moni(void);

AFE_SH367309.c
CALI_CurrentProcess()
modbus1FaaRxFlg
modbus1FbbRxFlg

tim.c(L103)
		MODBUS1_TIM_Moni();


////////////////////»þ״̬ʧ [V0.0.19.01]


////////////////////д1~1000AhִʱдSOC=100%ʧ [V0.0.19.02]
if(bmsMem.rcc >= bmsMem.fcc+1000000)
//rcc͸Ϊuint32_trccС0ʱԼֵʾ1000AֵԽǷС0ж


1.17
////////////////////ԭһֱCtrlMOSر [V0.0.19.03]
//ڻдRAMʽMCUƵıֻص
//ͣʹCTRLɾȥжǷ񱨾һ


////////////////////¶ȱĴ͵ǰ״̬޹ [V0.0.19.04]
//жҪʵ״̬


////////////////////ѯڵַ2ͨϵBUG޸ [V0.0.19.05]


////////////////////ŵMOSϣԭֻDO [V0.0.19.06]
//ԳŵMOSҲҪжڳֹϺ󣬾֮ǰMOSرյԭʧˣҲһֱάֿMOSرյ״̬
//֣ñ־λ㣬ֻʧͳ
//ҪҲڱʧ

Program Size: Code=56158 RO-data=3430 RW-data=156 ZI-data=3988  
56158+3430+156=59,74458.3K

////////////////////ַ1Žͨ


1.19
////////////////////ĻŻ [V0.0.19.07]
֮ǰ
Program Size: Code=56138 RO-data=3430 RW-data=156 ZI-data=3988  
֮
Program Size: Code=54958 RO-data=3430 RW-data=156 ZI-data=3988  


1.23
////////////////////Э飬SOC<=10%ʱ [V0.0.19.08]
Ѽӡ
CAN:
Sol-Ark,GoodWe̵,Growatt,AisweiʿΩ,MUST,JOHNRAY,Pylon,Sacolarп,Luxpower,Schneiderʩ͵,Sigineer,Senergyʢܽ,Victronά,Megarevo,Afore,GSSTESʯ
MODBUS:
VoltronicԪ,SMK

û״̬λġ
CAN:SMA˼,Sorotec,DONNERGY,SOFAR׺,Deyeҵ
MODBUS:SRNE˶

˼MUSTǿǿָɾȥPylonǿָӦضͺUS2000BݲӣʯDeyePylon԰


////////////////////ЭΪ1s1 [V0.0.19.09]
//Эŵ1s0.5s


Program Size: Code=56714 RO-data=3430 RW-data=160 ZI-data=3984  
56714+3430+160 = 60304
////////////////////ԪЭظŻ [V0.0.19.10]
ԪЭͱ׼485Э鲻ͬ
ԪЭʱݳռ2ֽ
ԪЭЭͺЭ汾Ϊ00 00 01 00(ǰַݶ)

ͨŶuint8_tͣͨŽṹǡȸֽٵֽڡ
ı
2uint8_t2ֽڣҪȵͺ(ڷǰͨź)
1uint16_t2ֽ,
2uint16_t4ֽڣҪȸߺ(ͨźӰ죬ȸߺ)


////////////////////Ż [V0.0.19.11]
Program Size: Code=56714 RO-data=3430 RW-data=160 ZI-data=3984  
¶ȱжϣ¶ȶ4·¶ȶȽ
 Program Size: Code=56610 RO-data=3430 RW-data=160 ZI-data=3984  
дװõCANɺsend
 б׼֡CANЭɣ
 չ֡Ҳں (MUSTչֻ֡1)
 CAN_SendCount++;ŵSend
 Program Size: Code=46146 RO-data=4030 RW-data=160 ZI-data=3984  
 46146+4030+160 = 50336

[V0.0.19.10]Ĵ
Program Size: Code=46258 RO-data=3918 RW-data=160 ZI-data=3984  
46258+3918+160 = 50336


////////////////////HpPlusΪXindun

////////////////////λѡЭ [V0.0.19.12]
ο03ݵıģʵʹ
λЭźЭַ16
BMSظЭźЭʾѡɹظݱʾ޷ѡ/ѡʧܣʱ䲻յظʾʱ
(ĿǰֻV2.xλϿ)

Program Size: Code=46710 RO-data=3466 RW-data=740 ZI-data=3988  
46710+3466+740 = 50916


////////////////////CANʱʱյ305ݾͻʼ [V0.0.19.13]
Program Size: Code=46782 RO-data=3718 RW-data=740 ZI-data=3988  
46782+3718+740 = 51240


////////////////////SorotecЭȱȫЭ鸴һ [V0.0.19.14]
ɣֻSorotecĵѹ//ƽ¶ûֵ
Program Size: Code=46794 RO-data=3706 RW-data=740 ZI-data=3988  
46794+3706+740 = 51240


////////////////////CRCУ󣬵ûгʼᵼͨ״̬쳣޷һ֡ [V0.0.19.15]
03 10 aa bbĺﶼҪ
Program Size: Code=46826 RO-data=3674 RW-data=740 ZI-data=3988  


////////////////////һʵλдַ [V0.0.19.16]


////////////////////MODBUS_Initʹ [V0.0.19.17]
if(modbusBufIndex > 2)ӦelseֶɾȥⲻҪĳʼ
Ӧǲʱͻʼ


////////////////////Growatt-485Э [V0.33.0.0]
Sorotecͬ


////////////////////ѯ [V0.0.19.18]
ҪռӻС¶ȣ֪ʵ¶Ƕ
͵ѹܻݵ֮󣬾ͰЭظֵĵ

////////////////////3.4ڵĳʼ־λ


////////////////////ѯδӻֵ [V0.0.19.19]
ѯôӻʱٴѯʣ
 лظǾͼ¼²ѯһ
 ûлظ˵ǵƽ£յǰӻ


////////////////////MODBUSĵַС [V0.0.19.20]
0310ȡַΪڴʱҪ<<1ʵʵõֵӦôuint16_t
CRCУ飬Ҫ&&||


////////////////////ͨЭƽ¶ȣӦôݵлӵƽ¶ [V0.0.19.21]
//ĶһGrowattݵȺ


////////////////////ѯٶ [V0.0.19.22]
ӻѯʱ1sһʵеڵͨŲ9600ʵܿʹ
 02 03 00 4B 00 0D F4 2A 8BIT
 02 03 1A 00 00 00 03 63 44 FF FA 0B 79 0C 97 0C 87 00 0D 00 0F 0B 82 0B 71 00 02 00 01 1E 50 31BIT
 ܹ0.0040625s
400msһӻѯǰ200ms200msղظ
 (Թ100sһշģʱ̴̫ݣ200msĿͻԹҲ̫)
ɾȥѯݾʱĶ3.4ڴΪӻͨ
ʼʱȴͳһΪ10s

TIMER_IsOut
 ʹøʽ
 if(TIMER_IsOut(tmrTemp[a],b))
 {
	 tmrTemp[a] = TIMER_Update();
	 ...
 }
 a:һ飬ֲͬʱ
 b:ʱ = 10ms x b
 tmrTemp[a]:ʱжʱ,ΪʱtmrSysֵ
 uint32_t TIMER_IsOut(uint32_t cnt, uint32_t tmr)
 {
     uint32_t tmp = tmrSys;
     
     tmp = cnt > tmp ? ( (uint32_t)(-1) - cnt + tmp ) : ( tmp-cnt );
     
     if(tmp>=tmr) 
         return 1; 
     else 
         return 0;
 }
 ȽϴνжʱtmrSysֵڵtmrSysֵֵ㹻ͻظ1
 ϴεĴ˵ֵܿˣ
 (uint32_t)(-1) - cnt + tmp0xFFFF-ϴεtmrSysֵ + ڵtmrSysֵõֵ
 εĴ(һ㶼δ)
tmp-cntõֵ


////////////////////SOCУ׼ ѹֵ(57.6V)+2A [V0.0.19.23]

////////////////////protocolĶⶨglobal.h


////////////////////趨һṹ壬רŷضд͸ [V0.0.19.24]
ṹ壺
룺f3->03  f4->10
淽ʽEEPROMӵַ0x0400ʼ
ҪĶپEEPROMд


////////////////////λ
*õʽдϾ˶Ҫ⣩
 Ĭֵ 
ѹ 50mV   act_bal_startV	uint8_t
ͷŵѹ 30mV   act_bal_stopV	uint8_t
ͷʱ 600s   act_bal_stopT	uint16_t
////////////////////ʱñ־
Ĭֵ
0		
60min	ʱ60min


////////////////////ֵʵʹ [V0.0.19.25]


////////////////////߹ [V0.0.19.26]
粻ŵ״̬(2A)1hκͨ豸룬ģʽ

״̬£ֻгŵ߼ʱ
ģʽ£ֳ/ͨ/Ļ/Ļ߼ʱ˳

ϣ
ִǰ5sڼǷͨ/ĻеĻ͸߼ʱߣ
(ĺôǣ߼ʱУжݵͨŻĻӰ߼ʱ
ֻҪߵʱͨάְУͲýٳֱӸʱ)

enable־sleepFlagǷԳΪ1


////////////////////ParaMemEEPROMĵַͶȡ [V0.0.19.27]
IICʼУȡе⣬Ҫ
ParaMemдEEPROMʱַuint8ͶӦģԭд⣬Ҫ
 ΪλıѾйˣParaMemֻ޸EEPROMĴŵַ
EEPROMõַ0x0400~0x06FFÿַӦһuint8_tַ
ParaMemMODBUSͨţͨʱÿַӦһuint16_tַLENTHӦ16ʱĳȣ2*LENTHӦ8ʱĳ


////////////////////ǷѹʱŵMOSر [V0.0.19.28]
ֶťºԭAFEֵдEEPROMȻAFEǷѹֵֵ500mVʱ5minʱEEPROMֵдAFE
Ļַť0291		ťɫ0290	ʱı02A0
״̬λʹbmsMem.balanceStatusbit5:0x20
 (עЭдƽ־λģֵĶ)


////////////////////״̬λӲ״̬ʾ [V0.0.19.29]
״̬
bmsMem.balanceStatus |= 0x0010;
ֶǷѹ״̬
bmsMem.balanceStatus |= 0x0020;
DO̵״̬
bmsMem.temperaStatus |= 0x0080;
(Ԥ״̬)
bmsMem.bStatus3 |= 0x0020;
(Ԥʧ)
bmsMem.bStatus2 |= 0x0020;


6.26
////////////////////汾00x00,ֹ֮󳬹9дֻҪ'A'֮0xA0

////////////////////Ļť»ὫEEPROM0x0200~0x2000 [V0.0.19.30]


6.28
////////////////////Ϊ˲裬У׼ֵҪĶԭ3225ڸΪ7000 [V0.0.19.31]




7.1
////////////////////ǰֻرճMOSŵMOSֿԷֹ [V0.0.19.32]

////////////////////MOSĿ߼ [V0.0.19.33]
ص㣺ֻüͣͳرر
       ʱرշŵMOSֳMOS嵱ǰ״̬ʹڳ̬ʱ绽

[ͣ]MOSŵMOS嶼ر
[]رշŵMOSӰMOS״̬
[ر]MOSرգرգӰŵMOS״̬
[ŵر]ŵMOSرգӰMOS״̬
[]MOSرգ򿪣ӰŵMOS״̬
[״̬]MOS򿪣ر

 (رѹ££MOS)
 (ŵرǷѹŵ·ŵ£ŵ£ŵMOS)

AFEĵ͹ģʽ/ģʽὫŵMOSرգԲ
AFEʱAFE⵽ѹ£ҲѳMOSرգֳ߱MOSҲҪǵǷ


7.4
////////////////////EEPROMдĵôеıֵͳһ#defineһ𣬷֮ [V0.0.19.34]
ʼʱEEPROMûݣĬֵд
ֵȷķΧжֱǷڷΧڣûУжEEPROMﶼ0xffУ׼ֵ⣬жһֵǲ^ֵ
soe.timsoe.timEnEEPROMдأɾ

////////////////////У׼У׼ĵַ͸Ҫ [V0.0.19.35]
ڲ
4λǰ2λЧλ2λȡ^
ڰEEPROMհť󣬳ݵǰ(3,0,4)ûǷҪ+У׼ݵڳĶӦλ

////////////////////EEPROMĵַ· [V0.0.19.36]
SOCЭǿҪ֮Ĭֵ
ִ߼ĹҲܿǱ䶯ֵ
 ParaMemֵҪ

 [0x0000~0x01FF]κζʼֵ
bmsMem.E2_485Addr	485ͨѶַ		0x0000	1	λò
Update_Index		IAP־λ		0x0001	1	λò
bmsMem.ee_uv		AFEǷѹֵ	0x0004	1	λò
bmsMem.cadcZero	У׼		0x0008	4	λ(2, 0, 8)
bmsMem.cadcGain	У׼		0x000C	4	λ(3, 0, 8)
ӣBMSΣPACK

 [0x0200~0x03FF]䶯ֵͨضĻⰴťʼΪҪĳʼֵ
capacity_Ah		Ah			0x0200	2	λ(7, 1, 2)
bmsMem.soc			SOC				0x0202	1	λ(0,64, 1)
protocol			Эѡ		0x0203	1	λ(7, 0, 1)
ӣۼѭ

 [0x0400~0x07FF]ͻˢ´˴ݣһ㶼ǹ
paraMem.act_bal_		0x0400	4	λò
paraMem.sleep_	ʱ߲	0x0420	2	λò
FlashҲҸطŸֵΪҪд÷EEPROM
 ¼uf_FLASH_Init()EEPROMֵFlash¼ֵȶԣͬͽFlashֵдEEPROM
ӣSOHϵcycCountСڵ_a_ʱSOH100%cycCount_a_Сڵ_b_ʱSOH=99-(99-c)*(cycCount-a)/(b-a)SOHͽ_c_%

////////////////////ŻParaдʱdefine0x04
#define EE_PARA_WRITE  adrh,adrl,len


7.8
////////////////////EEPROMݵķΧ [V0.0.19.37]
ʼEEPROMʱҪǷ÷Χ
 
ͨͨ/ĻдʱҪǷ÷Χ
 bmsMem.E2_485Addrif(bmsMem.write_Addr !=0)⣬ҪжǷڿѡΧ
 bmsMem.socif(bmsMem.write_Soc !=0)⣬ҪжǷڿѡΧ
 
ee_uvдַ
ǰĵֵдд˶
ĳʼֵڵһζǷֵд100


////////////////////SOC=0ı [V0.0.19.38]
Adr 10 [00 4a 00 01 02 00 00] crc1 crc2
ڳضģֱӺbmsMem.write_socһĲдSOC=0


////////////////////߹ܣ֮ǰдһ֣ǵ£ [V0.0.19.39]
	//ڳŵ磬ʼ
	if((bmsMem.packCurrent <= (-2000)) || (bmsMem.packCurrent >= 2000))
	{
		if((paraMem.sleep_min_disable & 0x8000) == 0) //
		{
			sleeptimecount=RTC_GetCounter();
			sleep_flag = 0;
		}
	}


////////////////////10%ǿ [V0.0.19.40]
ԭŹܵıҲǿ(֮дʱٸķֿ)

////////////////////ӽЭPylonЭ [V0.35.0.0]
ǿ־
Pylonܵǿű־Ҫ

////////////////////Э¶ֵӦȡcanMem[0]. [V0.0.19.41]
ƽ¶ȣӦȡcanMem[0].tempTemperatureAverage
¶ȣӦȡcanMem[0].TempMax

////////////////////ЭĵѹֵӦȡcanMem[0]. [V0.0.19.42]
͵ѹӦȡcanMem[0].VolMax

////////////////////¶ȵѹ  ļ㣬 [V0.0.19.43]


////////////////////طŵʱ״̬ر [V0.0.19.44]
ʵ飬ŵʱ屣ֿᵼĵر

////////////////////ѹ+2Aѹ*100 [V0.0.19.45]

////////////////////PylonЭĻظûϣѼ [V0.0.19.46]

////////////////////λѡЭ-Э [V0.0.19.47]


7.15
////////////////////EEPROMضťΧֻ0x0200-0x03FF [V0.0.19.48]
ⲿֱصĻϢSOCǰЭ顢ۼѭ
ڳǰ㣬Ϊ



////////////////////ɵֵ [V0.0.19.49]
ʼȡУ׼ֵǰûнSOCЭѡд
ȻڵַУ׼ֵЧֵ˵ǰûУ׼/Ǿɳ
ٶȡɵַУ׼ֵڣֵУ׼ֵĵַѾɵַĵУ׼ֵ
ֵ


////////////////////SOC15%ϣصѹ50V2ӣSOCУ׼15%15% [0.0.19.50]
ܵѹСڵ50VSOC15%Cali_Soc_Flag = 1; ʱܵѹָ50VϻSOCѾС15%Cali_Soc_flag = 0; ¼ʱ
ʱ2*60*10010ms˵2ӣʱSOC15bmsMem.soc = 15;


////////////////////AFEдʱ [V0.0.19.51]
֮ǰڸAFEʱֵеֵʾӰ100%99%
AFEִкñ־λ1ʹִ֮еļ㸳ֵʱֱֵ=0һͰִ


////////////////////Flash_A/BҲEEPROMParaMem [V0.0.19.52]
Ϊ޸FlashλøΪ0xFFFlashزҪһ
 ʼʱFlashµṹ壬AFEparaһ
 дݺAFEparaҲҪһ
򣬻ͨFlash_A/BķʽParaMemֵ
ƽʱParaMemĲͨȸFlashֵٸEEPROMֵ

ԭuf_I2C1_Init()ĶĬֵMODBUS1_F10_Rx()ļ¼дParaַConfig_WritePara()¼EEPROMأûɾҲɾ
AFE_UpdateConfig()ΪAFE_UpdatePara()


****ʼ****
////////////////////100A+6.0.0(Ĭ)
////////////////////50mV192us
70 0f 6e ee 62 c6 7d 87 af 78 64 c3 [08] [0b] [03] [0a] 50 64 46 ec f6 64 46 ec f6 [f5] 
41 37 02 05 41 37 fb fe [69] [69] 08 08 1e [23] 
[64] 05 58 02
40 02 a0 01 [e8] [03] [e8] [03]

////////////////////150A+6.0.0
////////////////////50mV192us
70 0f 6e ee 62 c6 7d 87 af 78 64 c3 [08] [0b] [03] [0a] 50 64 46 ec f6 64 46 ec f6 [f5] 
41 37 02 05 41 37 fb fe [9b] [9b] 08 08 1e [c1] 
[96] 05 58 02
40 02 a0 01 [dc] [05] [dc] [05]

////////////////////200A+6.0.P
////////////////////80mV192us
70 0f 6e ee 62 c6 7d 87 af 78 64 c3 [18] [1b] [13] [1a] 50 64 46 ec f6 64 46 ec f6 [24] 
41 37 02 05 41 37 fb fe [cd] [cd] 08 08 1e [f8] 
[c8] 05 58 02
40 02 a0 01 [d0] [07] [d0] [07]


////////////////////Ĭ+24*60min [V0.0.19.53]
32767min=546h=22d
24*60=1440=0x05A0


////////////////////ѹж-6VֹЩԲĵ޷ [V0.0.19.54]




8.8
////////////////////GPIOʼƽ

////////////////////ر߼Ż [V0.0.19.55]
֮ǰرյĳ籨ֻMCUĳ籨
 AFEĳѹ/±ȶӦԹرCHG_LIMIT_Ctrl()
if(((bmsMem.bStatus1 & 0x51) != 0) || ((bmsMem.bStatus2 & 0x83) != 0) || ((bmsMem.temperaStatus & 0x15) != 0))

////////////////////ƵԤ߼ [V0.0.19.56]
ԤΪ·
1.·շʱ
    رMOSԤ䡣
2.·ʾʱ
    MOSֹرգԤ·ֿעʱʵʱ
    ԤУԽԽС4sг1.9AĵжӦ·رԤ·ֹرճMOSʾԤʧܡ
3.·ʧ
    MOSֹرգԤMOSӿΪرգض˵ѹ
  ض˵ѹԼڵصѹ
    ԤMOS
  ض˵ѹԵڵصѹӦýС
    MOSֹر
    Ԥ䣬ض˳磬ÿ4sرԤ1μ
      ⵽ض˵ѹԼڵصѹԤMOS
      10μ⵽ض˵ѹȻڵصѹMSOֹرգʾԤʧܡ
*8.16䣺Ԥֵ=ѹ/30ŷķ·ж֮-0.1Aɣ4sʱ
           Ԥʧܷ뱨¼,ĻʾPCHG_FailԤʧܻƺĻʾ
*8.20䣺·жϲõֵˣǣ
           Ԥ俪ȳ1sȻϣ⸺صѹ10V(ԿĶ·5V)˵·ʾԤʧ
		   ԤʱĸֵŻ£жԤʱʼ

////////////////////Ԥ״̬Ԥʧʾ [V0.0.19.57]
Ԥ״̬bStatus3 bit5
 bmsMem.bStatus3 = temp[2] & 0xdb; //bit2bit5ط
 bmsMem.bStatus3 |= 0x0020; //Ԥ״̬
ԤMOS״̬bStatus3 bit2 (ԭAFEԤMOS״̬MCUƵ)
 bmsMem.bStatus3 = temp[2] & 0xdb; //bit2bit5ط
 bmsMem.bStatus3 |= 0x0004; //ԤMOS
ԤʧܣbStatus2 bit5
 bmsMem.bStatus2 |= 0x0020; //Ԥʧ
*8.30䣺ѯݵı״̬жϣҪԤʧܱ




////////////////////ĻresetأҪƶУ׼ֵ

////////////////////bmsMemȥwrite_

////////////////////packStatus޸ģɾȥEEPROMдʧܱ־EEPROM±־Ϊ1bit




////////////////////ӽǿ־ͷֵ20% [V0.0.19.58]
Deyeֵ<=5%ǿ>=10%ͷţDeyeУͱ׼ֿ
 ׼棺<10%>20%ͷ
֮ǰЭֻûǿ־ͷţڰǿ

////////////////////ûнű־Э飬ҲͨĶŵֵн [V0.0.19.59]
Э鶼ٴŹ

////////////////////Pylonݸ£ŵѹ [V0.0.19.60]

////////////////////Pylon CANЭС¶/10,λ1K0.1K [V0.0.19.61]




////////////////////SOC<99ʱﵽѹתĻҳУ׼SOC޸ [V0.0.19.62]
ѵѹתУ׼֮ж

////////////////////ѯֵܺʱҪߵж [V0.0.19.63]


****ʼ****
·Ϊ50mV0us̶ȱӡ
////////////////////100A+6.0.0(Ĭ)
70 0f 6e ee 62 c6 7d 87 af 78 64 c3 [08] [0b] [00] [0a] 50 64 46 ec f6 64 46 ec f6 [d4] 
41 37 02 05 41 37 fb fe [69] [69] 08 08 1e [23] 
[64] 05 58 02
40 02 a0 01 [e8] [03] [e8] [03]

////////////////////150A+6.0.0
70 0f 6e ee 62 c6 7d 87 af 78 64 c3 [08] [0b] [00] [0a] 50 64 46 ec f6 64 46 ec f6 [d4] 
41 37 02 05 41 37 fb fe [9b] [9b] 08 08 1e [c1] 
[96] 05 58 02
40 02 a0 01 [dc] [05] [dc] [05]

////////////////////200A+6.0.P
70 0f 6e ee 62 c6 7d 87 af 78 64 c3 [18] [1b] [00] [1a] 50 64 46 ec f6 64 46 ec f6 [f2] 
41 37 02 05 41 37 fb fe [cd] [cd] 08 08 1e [f8] 
[c8] 05 58 02
40 02 a0 01 [d0] [07] [d0] [07]




9.4
////////////////////ǰڱߺҲرձ [V0.0.19.64]


9.10
////////////////////ʢЭ [V0.36.0.0]
áλѡ


9.11
////////////////////MOSж30s [V0.0.19.65]
ֻ޸MOSжʱ30sͷȻ3s


9.18
///////////////////ĻЭѡŻ [V0.0.19.66]


9.19
///////////////////IAPײ־λĲŻΪEEPROMֵ [V0.0.19.67]


9.24
////////////////////ڻЭ󣬸CAN [V0.0.19.68]


9.27
///////////////////ɾ¼֮ǰжǷпɾļ¼ [V0.0.19.69]
///////////////////λ/Ļɾ¼ĻҲ [V0.0.19.70]




8.12
////////////////////ĻòοĻ [V0.0.20.00]
*9.12 ·50mV0usԤ䣻ѹ͹ѹͷŵѹֻ޸ĵѹأʱ


8.13
////////////////////¼100 [V0.0.20.01]
Ļ101102Ĵ뻹Ҫ


////////////////////¼оѹ¶ [V0.0.20.02]
ĻֻʾʲôEE_SOEṹ仯ԼĶɣļ
λͨ0xddȡ¼
ͱĲĶݶԻظжϣòͬĽʽ
 λ: SlaveID DD addrH addrL 00 00 CRCL CRCH
 BMSظ:SlaveID DD addrH addrL DATA0~51 CRCL CRCH
addr=0x1000+k*0x40
 500x1000~0x1C40
 1000x1000~0x28C0
EEPROMһ0x40=64uint8ʹС
 Ŀǰ52ʣ12ǲŵоѹ
 wrBuf[64]
*9.2 洢ʽʹݿλʾ


////////////////////ͨжϼ֮ǰı¼ʽ [V0.0.20.03]

////////////////////Ļʱʽ [V0.0.20.04]




////////////////////ѭ [V0.0.20.05]
ÿrcc1Ah,ۻҲ1Ah
ۼ90%һѭ

////////////////////SOHparaMemḺ́ [V0.0.20.06]
ѭ<=200ʱSOH=100%
ѭ>200ʱSOH99%ʼͣﵽ6000ʱӦSOH=70%½Ҳᳬ6000
SOHֵҪ洢ֻҪʱݵǰѭͼ̱ó

////////////////////λдѭparaMemḺ́ [V0.0.20.07]
ѭͨɼԶҪд롪ɴֱ޸ԭֵˣ͵ֻλддֵҲĳֵ
SOHдǴڲΪֲĶpackStatusһܹɼҲֻpackStatusԼ
ParaMemḺֻ́ҪӦλü




////////////////////SNŵʹãĻʾ汾źSN [V0.0.20.08]
汾Ź2x9λټһcrc8У룬EEPROM
 crcУֵΪ0λֵʾĻʾ(ÿ)
Ļַ
 ID      02C0
 BMS ID    02CD
 Ӳ汾  02D6
 汾  02DE
*9.11 SNŲҪ0x30+


////////////////////λдSN [V0.0.20.09]
λ0x55еĳӣSNŶ
 յSNֵ0ղʾ
յдSNźڻظʱдEEPROM
F10Ļظһжϣݹ洢


////////////////////ĻòӷΧж [V0.0.20.10]
ñֵĬͬ޸ͷֵ
ͷֵֵܳ
漰ѹͷšǷѹͷš/ºͷšŵ/ºͷ




////////////////////λȡϢ [V0.0.20.11]
λ󲢻ϢӦǸṹ
1ڣλлѯʵַܻᵱɶԼӵĴӻϢȡҪѶӻϢĹĶ


////////////////////ѳ59K־ӦַΪ128K [V0.0.20.12]


////////////////////λʾĻ汾ţԱԭ1ֽ [V0.0.20.13]
0xFF=1111 1111
 2λʾͺţ01Ӧ03510Ӧ04311Ӧ070(͵ã070ֻǰ8λ)00ԤݱʾĻ(ҪҲҪܿ0x00.0x01.0x02.0x03Щ)
 2Ƶʣ6λʾIndexΧ0~63ʾΪ1~64
 ע⣡ûдʱʾ04301óֵǡ0x80=1000 00000xFF070£ֻ1~63
汾źĻŵλòܶ漰λĶȡ˾ͺǰλ
01 56 00 01 00 00 01 41 4b a2




////////////////////ʼť [V0.0.20.14]
ʼť
0x01A4 ͼɫ
0x0125->0x01A5 ַָ

////////////////////ĻдSOC [V0.0.20.15]
SOCУ׼
0X0126 SOCʾ




////////////////////ŻĻѡЭ鲿 [V0.0.20.16]

////////////////////ĻеУ׼ [V0.0.20.17]
ֻʾ
0X01A8~01A9	ݱ	packֵ
ϵɸ
0X01A1~01A2	ݱ	ϵ
ť
0X012A		ͼ	У׼
0X012B			
0X012C		ͼ	У׼
0X012D			




////////////////////л [V0.0.20.18]
л
0X01A0 ͼ
0X0127 ˵2Եİť	

A5 5A 06 83 01 27 01 00 00/01[/Ӣ]

////////////////////ŻĻʼ [V0.0.20.19]
·̶50mV0us
ѹ͹ѹͷŶֻıֵһӳʱȲӰ


ǰˡ
////////////////////ʢCANЭ
////////////////////ʱ
////////////////////MOSϵжϸΪ30sָжϱ3s
////////////////////ĻѡЭŻ
////////////////////IAP־λŻ
////////////////////λ¼ĻҲˢʾ


////////////////////¼100ĻϽʾڣ50->100


9.19
////////////////////һ+ťַ
ע⣺ΪѾкλͨ߼
       λѯĻߵӻݵıģʱĻȡӻʱ

1
extern uint8_t  sdwa_RdData_Index;//ĻʾݵĵַĬaddrֻaddr=1Ա仯Ϊַ
extern uint8_t  sdwa_RdRecord_Flg;//ĻֻԲ鿴¼¼//յָ/¼ҳ/·ʱŻEEPROMһĻ¼

extern uint8_t  sdwa_WrAddr;      //Ļͨдӻֵַ
extern uint8_t  sdwa_WrAddr_Flg;  //Ļͨдӻַı־ 0д 1 2ɹ 3ʧ

extern uint8_t  assignAddr_State; //ťַ״̬ 0δʼ 1 2
extern uint8_t  assignAddr_Step;  //Զַǰ

2global.hУ
uint8_t  modbusCurF03RxFlag;//յ03ظ ȷ
uint8_t  modbusCurF10RxFlag;//յ10ظ ȷ

uint8_t  modbusCurStatus;   //ǰִеĹܡÿ仯ʼշ״̬ 0:ѯ 1Ļӻ 2:λӻ 3:дӻַ 4:Զַ

uint8_t  sdwa_WrAddr_Failcount; //дַʧܵļ
uint8_t  assignAddr_Failcount;  //ַʧܵļ

uint8_t  bAlarmFlagOld_slave; //Ļʾӻת
uint8_t  assignAddr_Flag;  //ַɵʾ

#define PIN_ADDR_IN    GPIO_Pin_8    //ԶַIO1
#define PIN_ADDR_OUT   GPIO_Pin_9    //ԶַIO2


1
//ַ
extern void IO2_OUTSet(void);  //øһ99õͱPACK_NUM+1
extern void IO2_OUTReset(void);//õ
extern uint8_t IO1_IN(void);   //ƽ
extern void IO1_TIM_Moni(void);//ݲͬԭַƽѡҪ޸ĵضַ

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);//ѯ
extern void MODBUS_AutoAssign_Tx(void);    //Զַ

extern void MODBUS_Screen_RdSlave_Tx(void);    //Ļӻ
extern void MODBUS_Screen_WrSlaveAddr_Tx(void);//Ļдӻַ

2global.hУ
void SDWA_ShowAlarm_Slave(void) //ȡĴӻݵʾ

////////////////////һ Ļַ
0x01A6 PACKҳתҳť
0x0270 ݻPACKҳť

////////////////////һŻߵĴӻɽеת

////////////////////λԺĻԼ
λͨӻĻ鿴ַԭֵ
110sյλģλȡַʼ

////////////////////Ļɸ
ַ01AA




////////////////////ѭָҪoldֵжд




9.23
////////////////////ȫԶַ=Զӻ+Զַ
1
extern uint8_t  assignAddr_relay;       //ʱ2sٿʼͨţȴַ仯
extern uint8_t  assignAddr_485num;      //ַ߸ڴӻŽ·б־
extern uint8_t  assignAddr_WrIndex_Flg; //ִ·б־ı־

uint16_t bmsMem.can_ArrayIndex;   // ·ţԶַ
uint16_t paraMem.addr_FREE_Flg;     //0x11 ֶַƱ־Ĭ0

2
#define PIN_ADDR_RANK  GPIO_Pin_7    //ԶַIO3͵ƽʱ˵Ǵӻ
uint16_t ADDR_Moni_Count; //ԶַǰΪ̽ӽŶøıĵַ ÿ10ms
uint8_t IO1_INH_Count;
uint8_t IO1_INL_Count;

uint8_t  modbusCurSlaveLastAddr; //һߴӻĵַ

uint8_t  assignAddr_485num;     //ַ߸ڴӻ(ֵ>2)·б־
uint16_t assignAddr_random;     //ɷɵ(PACK_NUM+1~65535),ʶ
uint8_t  assignAddr_WrIndex_Flg;//ִ·б־ı־


extern uint16_t get_random(void);

extern uint8_t IO3_IN(void);   //ƽ
extern void ADDR_Rank_Moni(void);  //IO3Ĳͬƽȷ/ӻ

extern void MODBUS_WrIndex_Tx(void);       //㲥·б־
extern void MODBUS_WrIndex_Rx(void);       //ӻոôηַĶб־


ʱҪѯʱΪ1sڿԲ0.4sЧ

Ϊ
̡1.ʱȴ2s(ȴܵĵַ仯)
̡2.ѯ꣬2(Լ40s)еߵַַ4ߣַ3ߣ
̡3.ѯ꣬6(Լ2min)Ҳκδӻ
̡4.ѯʱ´ӻ(ַ2)
       ѯ[־]Ϊ0Ĵӻ˵ûĴӻڸֽ
̡5.ѯʱӴطĴӻ(ַ⵫϶2~PACK_NUM)
       ѯ[־]ǾɳеbmsMem.E2_485Addrֵ:2~PACK_NUMڸֽ
       ѯ[־]͵ǰϴ·[־]ͬĴӻڸֽ
     Ǿɳַ1Ӱ죬ҲѯõַԲǣ
̡6.ԭǴӻBMSַձ1ʱ
       ǰ漸BMSˣǰ3ԭַ41ʱַ5Ժֵ䣬Ҫ
 *[־]ѯһַ㲥ΧPACK_NUM+1~65535(;ɳеĵֵַײ)

////////////////////ڻЭ󣬸CANʣǰѼӣ


////////////////////ַ仯߼
󣬻Ĭ϶EEPROMĵַ
ӻַڱ洢õַٴϵʱIO3̽״̬ʱάָõַ
ӻὫб־洢ַģöб־㣬ԱϴεĶб־
ŵ㣺Թ̶󣬼ٿȴʱ

////////////////////һʾӻѹʾ


9.30
////////////////////ɾ¼x2ǰѼӣ

////////////////////õx2


ѾϵŻ
////////////////////Ļָ/޸ǷѹֵʱҪǷѹǿƸλҲ
////////////////////ѯֶԡܸĵַлظ룬κԶ
////////////////////߸ʱ [ַ]
////////////////////¼ʾͳһΪ100

////////////////////¼ĻʾļݣԾɼ¼صΪж

ҪϵŻ
////////////////////
////////////////////
////////////////////
////////////////////
////////////////////
10.8
////////////////////ⶼɾȥͣ [V0.0.19.71]
DIִкŶ > ɾȥ
ͣע > ɾȥ
temperaStatus & 0x4 > ɾȥ
temperaStatus & 0x7 > Ϊ0x3
status_byte4 & 0x7 > Ϊ0x3

////////////////////ʱӳʱϵǿʹãӦӰĲͬ޸ [V0.0.19.72]
¿ĺRTC_WaitForSynchro();  //ȴRTCĴͬҪӦΪµĴʱصĺRTC_GetSynchro()
ʱʧʱ־LSEErrFlag=1
Ӱв
 λдʱ䣬ִҲлظ(ҪҪModbusʼ)
 Ļʱʾ
ʱҪֵĻ¼һֱ¼2000-00-00 00:00:00ҲֱӲʾ
ߺǷѹԭRTCLSEϣҪƶʱ

10.11
////////////////////Ż
ȴʱ250ӳ1000
дʱҪһϵдܳȴʱ䣬ٲж
RTC_Get()ͨRTC_GetCounterõʱһֱߣ֤RTC쳣
 ж־λ=1


////////////////////¶߳ʼ󣬲ɼһݻƽ¶ĬϵĲ

////////////////////MODBUS_Init()ΪMODBUS_Init()MODBUS_Poll_Init()


10.17
////////////////////дʱԭ [V0.0.19.73]

////////////////////ʱУ׼Ż [V0.0.19.74]
ʱʼʱ=ǰֵ-(ԭʱ-ԭʼֵ)ʹӰߵ
ǷѹǿƸλʱѸλʱ=300s-(ԭʱ-ԭλʼֵ)ʹӰߵ
жϣٿĳʼʱҲû˳ ڽߵƵƥ䣺Ƶʱӳ10sƵRTCҲ߶

////////////////////Config_WritePara()ParaChange()
////////////////////ŻÿĻʱҲͬʱ¼¼




10.22
////////////////////Ԥ߼Ż [V0.0.19.75]
1.3ζ·(ÿμ<=5s)ֱMOSʾԤʧܡ
2.·ʧԤرжʱʱԴڵ(>=100mA)򲻷ϹرԤ(ÿ4sһΣֱ10μδʾԤʧܡ)
3.ض˵ѹдʵʵѹ

uint8_t  scOccurFlag;   //·ֹı־
uint8_t  scRepeatTime;  //ȴ·ʱ2s =>Ӧ·ʧ2sδٴγ֣˵
uint8_t  scRepeatCount; //·ظļ2 =>Ӧ3γֶ· =>ڵζ·ȥִԤ亯ʱֱִԤʧ


////////////////////ͬV3ṹ壬ֹλдλóͻ
////////////////////Ԥ [V0.0.19.76]

pchg_enable 0/1  //Ԥ书Ƿ
pchg_scShow 0/1  //Ԥ俪AFE·Ƿʾ(Ƿ_ϰ)

pchg_dif_V 12   //Ԥɵѹжֻиغ͵صѹСڸֵΪԤ(̫С׳̫)
pchg_T,pchgNum 4,10 //·ʧʱԤ䣬Ԥĳʱͳ˵ǰѴأʾԤʧܡ
scWait_T,scWaitNum+1 5,3  //·ʧԤɺ󣬷һζ·ĵȴʱ͵ȴ˵·Σʾ·

AFE·أѡ
 ·ӦbStatus1,bit5
 ԣbStatus1 & 0x7 -> bStatus1 & 0x5

////////////////////Ӷ· [V0.0.19.77]
ڡԤʧܡ⣬·ʾʱbit4bit5־λ1λһʾ
ƣΪԤʱֻС·
ĻʾFault
¼ݽ+1
ɱ¼+1
 Ҷ·ɼ¼ҪжǷ
ѯӻʱ
 ԤʧbStatus2,bit5
 ·bStatus2,bit4
 ԣstatus_byte2 & 0xe -> status_byte2 & 0xf


////////////////////MOSָںһԵ [V0.0.19.78]
uint16_t CTRL_Order; //һ
uint16_t paraMem.ctrl_disable; //

////////////////////ѯԴӻٴѯʣʱĳѹ

////////////////////ǿǷѹʱǷѹֵʽ޸Ĳ500mVͷǿǷѹ








10.21 Ż
////////////////////[ַ]߸ʱ
////////////////////¼ʾͳһΪ100


10.24 Ż
////////////////////Эﴫ䵱ǰSOH

////////////////////ĻPACKҳʾѯ/

////////////////////λ޸ǷѹֵҲֹͣǷѹǿƸλ

////////////////////¼ɾ¼մС




////////////////////Ӳ汾ŷEEPROM
//ͳĲͬͻǰдEEPROM
//Ӳ0xff,Ĭд6.1.0

////////////////////Ƿѹ27002900
70 0f 6e ee 62 c6 [87] [91] af 78 64 c3 08 0b 00 0a 50 64 46 ec f6 64 46 ec f6 [57] 


****ĻŻ
////////////////////¶߳ʼ󣬲ɼһݻƽ¶ĬϵĲ

////////////////////[ַ]Զַ4

////////////////////[һ+ַ]ַҲʾǴӻķΧ
////////////////////[ַ]ַ10sκθĶָԭַ
////////////////////[ַ]дַwhileѭӿ췴Ӧٶ
////////////////////[һ]ӻַҲӦÿʾ
////////////////////[һ]ĻʾAddr¸ʱ
////////////////////[һ]ʾӻĹѹҪж


////////////////////[ַԶ]Զ仯ַҪеַд




10.28
////////////////////PACK_SNݿͻ󣬿ĸ֣


10.29
////////////////////еƳ


10.30
////////////////////ѹ45VʱĬ
ѹ45Vʱһ100mAϵ10min








11.18
////////////////////Flashĳʼֵ
SOHĬֵ

////////////////////oldrcc_AhͬŻ
Ȼֻrcc_AhͬӶͬ

////////////////////Delay_msŻֹһжϳͻ¿
ӳʱ˳

////////////////////ѡFreeЭ仯
MEMORY_UpdateEEPROMʱ




////////////////////Ļʾ״̬(balanceStatus & 0x10)
гʾʱʱУʾǳ




////////////////////RCT62Kһҳ [Vx.x.22.0]
оƬѡRCT6,J-LinkٶѡHigh_density_512K
ļ/CORE/startup_stm32f10x_hd.sħC/C++ҪĳSTM32F10X_HD
FlashAB1024Ϊ2048
mainͳʼΪ0x1800




////////////////////ʱд󣬻ȡʼܿЧ(Ϊ0) [Vx.x.22.1]
ͨжʹ׼úٽжϣʹ״̬


////////////////////RTCʱ䱸 [Vx.x.22.2]
ĳЩRTCĴʱʧ(BKP_DR1Ҳ0x5050)ִд뱸ʱĳ
ʱĬ2023-06-25Ҳʱ̱ݣÿο(ʱ)ʱ/ÿ1h¼һ/ŵ翪ʼʱ¼һ/ŵʱÿ5min¼һ


////////////////////ͳһ [Vx.x.22.3]
[Ż]ۻĵλΪ0.1Ah
[Ż]1ѭӦʱжϰٷֱȲǷΪ0(ϾǿɶдĲ)
[Ż]ʼʱڶۻһתѭж
[Ż]λ޸ѭʱͬʱۻ


////////////////////(еĵʵûе) [Vx.x.22.4]
[Vx.x.19.78]MOSرձ־õĴ
[Vx.x.19.72]ŵʼ㣬RTCǷж
䣺ɾȥ45Vһɾȥ߼


////////////////////Ļö·ʱʱExitʹ·ѹΪ50mV޸ [Vx.x.22.5]
ͬʱдĿܳΧĲֵ淶£ΧĲ
ǿǷѹλд500mVԼĵ500mV5100mV
 ޸EEPROMǷѹֵڶȡд0xffֶдĸ


//ŻĻд
ȥһЩźͿո
ȫ·ʾ
ȫ¼ʱȫ0˵RTCʧЧʱʾʱ


////////////////////ŻĻд뷶Χ [Vx.x.22.6]
д뼫ֵᴥ˸пܵĲ
Ƿѹԭд벻500mV޸


12.31
////////////////////2μ⵽ڳ״ֹ̬ͣ [Vx.x.22.7]


1.3
////////////////////ĻЭѡ [Vx.x.22.8]
ΪĻ0x03450x0346ռãЭҪ
ռǱһҳתťʾ

////////////////////MOSźλˣѸ [Vx.x.22.9]




3.5
////////////////////ʱĳӻ(ѹ)ôӻ [Vx.x.22.10]
ЭӦȥôӻֵֵش
ݻ¼ֵҪ޸ļ㷶Χ

ĻʾҲΪ*OnlineNum
͸λݣOnline[0]ֵӲΪ
byte20x10·вֱжûӣ

GrowattĶ16ΪbmsMem.ucCellNum
SigineerĶ16ΪbmsMem.ucCellNum
SacolarĶ16ΪbmsMem.ucCellNum
DONNERGYĶ16ΪbmsMem.ucCellNum


////////////////////ѹж-8V+5V [Vx.x.22.11]




3.13
////////////////////ӽ߼ [Vx.x.22.12]
SOC=100%ʱ=0

Эĳ/ŵλждˣѸ


////////////////////ݲ޸ֵ [Vx.x.22.13]
߼
ѯɡʱÿPACKsocжϣسֵͷŵֵ
磬4̨PACK3̨ߣ1̨򱨾ߡ
      ߵPACK
	  3̨soc=100%ֵ=0
	  1̨soc=100%,2̨soc<=99%ֵ=100A*2
	  3̨soc<=99%ֵ=100A*3

+ǿ־ȻͨƽSOC(ܸ)


////////////////////趨ǿ־socֵ [Vx.x.22.14]
ýı־+SOCx2
ýŵı־SOCx2
ǿı־SOCx2
uint16_t requestFlg_enable;
uint8_t  chg_forbid_Soc;
uint8_t  chg_forbid_reSoc;
uint8_t  dsg_forbid_Soc;
uint8_t  dsg_forbid_reSoc;
uint8_t  dsg_force_Soc;
uint8_t  dsg_force_reSoc;

߹ܣڴݸλonline[0]ݣûעֻ1ص




3.20
////////////////////ʱBMSҲϴѹ [Vx.x.22.15]
//BIT5 cell ov
if((canMem[0].status_byte1 & 0x01) !=0)
{
	if(canMem[0].soc < 99)
	{
		protectByte1 |= 0x20;
	}
	else
	{
		protectByte1 &= 0xDF;
	}
}
else
{
	protectByte1 &= 0xDF;
}

3.24
////////////////////ĻѡЭĴûȫŻĿǰ


3.26
////////////////////Сӳʾʱ䣬3sΪ5s [Vx.x.22.16]


////////////////////һֱԱֱӶEEPROMʾŻΪ͸ҹ [Vx.x.22.17]
if(read_index < soe.num+3)ŻΪif(read_index < soe.num)elseݸĶ


////////////////////λлԣFreeʧתҳѸ [Vx.x.22.18]


////////////////////λMOS־λʱԤûparaMemʱλ [Vx.x.22.19]
if(((CTRL_Order & 0x04) == 0) && ((paraMem.ctrl_disable & 0x04) == 0))

*ид||Ӧøĳ&&


////////////////////Ż [Vx.x.22.20]
֮ǰȱ˸bmsMem.rcc




ʱҪ
////////////////////߹ [+1]
paraMem
	//20240513  ʱʱ
	uint16_t    sleep_min_disable; //0x10 ʱ bit15ִ1ʹ bit0~14ʱ
	//20250402  ͵ѹʱ
	uint16_t    sleep_vol_disable2;//0x11 ͵ѹ bit15ִ2ʹ bit0~14ʱ
ִ߼
 ʱȻʱ䣻жϱ临ӡ
עRTCͲRTCĶҪ

////////////////////ParaMemĲĶδ֡


////////////////////·/Ԥʧܴӳ5min [+2]
·ͷʱ5minݲ
RTCͶʱ涼Ҫд


////////////////////޸ж߼ [+3]
paraMemӲ
uint8_t  fcc_methods; //䷽ʽʹ bit0 оѹ  bit1 ѹ bit3 ѹ+С  bit4 ѹ+ֹ
uint8_t  fcc_cur;     //ֹĬ5Aλ0.1A
uint16_t fcc_vol;     //ѹĬ56Vλ0.1V

䷽ʽ4ʱͬʱѹ͵رճMOSֹͣ
ӱ־λ bmsMem.bStatus2 & 0x0100 ʾֹͣ

////////////////////paraMemcyc_Ϊsohcali_


////////////////////ѹ [+4]
Ӳ
uint16_t pack_ovv; //ѹĬ57.6V λ0.1V
uint16_t pack_ovrv; //ѹͷĬ54V λ0.1V
uint16_t pack_uvv; //ǷѹĬ45.6V λ0.1V
uint16_t pack_uvrv; //ǷѹͷĬ49.6V λ0.1V
uint8_t  pack_ovt; //ѹʱĬ1s λ1s
uint8_t  pack_uvt; //ѹʱĬ1s λ1s
ѹسMOSǷѹطŵMOS
ѹִ


////////////////////ӷŵ2 [+5]
Ӳ
uint16_t mcu_occ2; //ŵ2 250A λA
uint16_t mcu_occ2_t; //ŵ2ʱ 30*10ms λ10ms

Ϊִзŵ20.3sCTLΪطŵMOSȻͨʱ(߼ͣ)


////////////////////ӻ¶ȱ [+6]
¶ָMCU¶

Ӳ
	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;           //     ŵͷ

עMOS¶ȱֵҪȻ¶ȴ


////////////////////ȫʾͼ¼߼ [+7]
ΪռֻbStatus1/2/3temperaStatusıͱҪ
 ־λλ֮ǰиĶҪ忴һ

ѹѹSOCʱĻ

ɼȻĶ
 ״̬Ϊuint16_tݶӦĶ

ԤʹCTRLſMOSأǾͲ÷ŵ2ʹCTRLţΪʱдرշŵMOSƣͬʱ1sһεдʱ

4رճ磬Ҫ֪bStatus & 0x0800

¼زȫע洢ı־λֻ0xff
 ¼7Ҫ¼Ǳ־λ0x00ffΧ
 7ʹpackStatusλ

ж4ӳ״̬ж

ַʽҪͬʱ
 1ʱ䳬 24 Сʱͨš޳ŵ е磩״̬
 2͵ѹߵѹͬʱͨšޱ޾⡢޵ſʼ߼ʱ
 1ʱΪСʱλռ0x7F00
 ʱ2ʱΪ0x00FFӵλ


////////////////////ӱ [+8]
ӱ־
MOS¶ȸ澯*4о¶ȸ澯*4¶ȸ澯*4ѹ澯*4澯*3
Ӳ
	//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ŵ¸澯

Эıı˸


////////////////////ӱ˸ [+9]

////////////////////Ż [+10]
bStatus3ĳŵ״̬mcu
ֵ߲Ķ


////////////////////ʱҲͬ澯
澯Ϊָ˸澯ֵϣǻָͷֵ

//////////////////// [+11]
/ŵ1/ŵ2/·
ӿҲִ5Ҳȴ60s޸ִнΪӿ·״̬

λдʹһдλ
bit4 ڽ


////////////////////趨ʱӦϵ [+12]
ٵ趨/ŵ澯ʱ/ŵ=澯10A
ڵ趨Ÿ澯ѹʱŵѹ=澯ѹ


////////////////////ĻĶMCUֵʱͬAFEֵ [+13]

////////////////////ĶFlashĻʼʱĬֵ


////////////////////澯ͱĴļStatus.c [+14]


////////////////////ֱ [+15]
ѹ
 SOC<96%ŵ>3A
Ƿѹ
 (״̬)

 SOC<96%ŵ>3A

 (״̬)

 ŵ>2A
ŵ1
 >2A
ŵ2
 >2A
·
 >1AضϿ

////////////////////ѹǷѹMCU
˼·
 λдҪдĴ
 
 һԭ33/10ݱֲ(ֻΪλŻЩΪ̶ֵ)f3/f4Ĺܲ
 Ƭյ33/10ģ׼afeֵʱ
 óᵥԭеĵѹ͵ǷѹֵΪ̶ֵ(500mV=0x19*20,5115mV=0x3FF*5)ʱ
 ȻʵʱֵparaMemĲλ(ڵڶ챨ĵĸEEPROMֵʱд洢)
 
 ڶµf3/f4ģյݷparaMemĶӦλ

*bmsMemṹ岻øı䣬ǿƻָǷѹֵĲҲҪĶ
 ΪһֱFlashŵֵԭһֻи¸AFEֵ仯
 MCUиݹѹǷѹִֵбͱͷŵִд룬йرMOSִд룬ѹǷѹ־λAFEĸ

*paraMemвֻҪ䶯
 ָݵַд

////////////////////ѹ/Ƿѹı


////////////////////ӿ·ѹ [+17]
Ӳ
uint16_t ocv_cpBuf[15];
uint16_t ocv_dpBuf[15];
uint16_t ocv_min_enable;
uint8_t  ocv_caliRange_soc;
uint8_t  ocv_caliRange_T;


////////////////////ݲ

////////////////////߷2λóƣ߷ֿҲӰеλ

////////////////////λͨʱһܶдעҪһ


////////////////////Эݸ [+18]
ͱ־ͱֿ
ѹѹϱ
SMKЭޱͱ

Ŷ=˶΢Ķ




/** ʱ **/
*ѹ
ѹӦöȴֲܴʱ>1
ѹ֮ǰδѼ

*ʾMOSϣ
ŵ״̬ĸֵbStatus3֮ǰ2Ѹ

*Ļʾ¼ı
(¼ķŵ2и5д3Ѹ)

Эڸ澯ͱеҪĵ
/** [V3.00.00.12]+[6.2.P] **/




////////////////////򷢸ͻ󣬶Գļ
4رMOSûȷͷοѹͷ4ͷ [+1]

ֵѹѹ澯󣬳½Ϊ40A֮ǰûдѼ [+2]

޸Ƿѹ澯ѹŵѹֵ=ֵ֮ǰдCurѸ [+3]


////////////////////򷢸ͻ󣬶Գļ2
canMemṹı־λûΪuint16_tѸ [+4]

/ѹ澯ֵΪ̶40AԭǶӦСڸΪͽƵı־λʱֵܹΪ40A [+5]

ͻҪʱĶԭͲֵļ㣬״̬жѯһִֽУڷ1sһεĺжϣʱ [+6]

·Զָ֮ǰûдֻдѼ [+7]

Ԥ䳬ʱʧ·ֿ״̬Ϊ·һ5minԶʱעCtrlšûд [+8]

ӿ·ԤĲҪflashĬֵ [+9]

ĻǿƽǷѹʱ޸ĵǹѹֵΪдAFE˲Զʼ״̬Ҫͨ뽫ѹصΪ޸Ϊ500mVԴ򲻿 [+10]

ѹ/ǷѹıλӦbStatus1bStatus2Ѹ [+11]

SOC=100%ʱѹ澯/ѹ澯/ƺĻʾ [+12]

·ԤʧʱMCUҲάMOSر [+13]

ŵ2ԭжϣдɳжϣbStatus1д2Ѹ [+14]

ΪĻ/λȥĳӻʱͬcanMemṹӦֵ [+15]

¶ȱӦtemperaStatusbalanceStatusѸ [+16]


////////////////////бͱ־λȷ
ӿ·תԤжӦBIT6дBIT10Ѹ

·ԤʧܣȥƳΪ

*ͨϿB+ߵķʽ·5κִ

·ĽӦжǷУٲҪļ

ʱرշŵMOS֮ǰд־ҲMOSұ־λԣע͵ΪûҪ˹ر


////////////////////Ԥ߼˼Ͳ
տպϣִӿ·
 (ֺ8sԶ5ִ)
Ԥ1sж·ִ·
 (ֺɽ)
ӿ·Ԥ40sûгɹִԤ䳬ʱʧ
 (ֺ5minԶ5ִ)

////////////////////ԭ·ΪԤ䳬ʱʧܴ
·ڳֺ󲻿ɽԤ䳬ʱʧܸΪ5κ


////////////////////ʱı飬ر
2ʱ֮ǰˣӦڻʱҲ2ʼ


////////////////////·ѹҲ
·ѹûػҲ涨ʱĹ
·ѹԵĿŵ1Aڶ0.1A

////////////////////·ѹ֮ǰĳŵ󣬲ִУ׼ִֻһβҪ
OCV_choiceǴ״̬0/1ʱ
ִһκˢOCV_choice=1гŵټʱ


////////////////////Ԥ߼Ϊԭ߼ͬ
ͬʱиscr_Moni_Count = SCR_MON_CNT;дUVOff_MON_CNTѸ

֮ǰ·ʱָҪʱRTCɾȥ




////////////////////Ϊܹʡѯʱ䣬PACK_NUMΪ [+26]
Ĭ2̨ɸķΧ1-20
PACK_NUM=1ʱѯ
3.4ڵĳʱʼȴʱPACK_NUM1=̶30s 2~20=PACK_NUM*1.5s+2s
ַڸֵ͸ĶPACK_NUMʱҪǷAddr<=PACK_NUMʱָ2(PACK_NUM=1ָ1)

һֵΪPACK_NUMֵȫͨãĿǰӦ20
 ԶַַַPACK_NUM+1ֵ+1


////////////////////Ҫ·ҲΪ5minԶͷţκ
־λӿ·һ


////////////////////ڲŻ [+29][+30]
ֻѯЧַʱȻ1~20
ΪparaMemд
ַǴӻʱдֵڳΪʱЧ

ѯ
ʹ
2̨


////////////////////·ʵδŲԭŻ [+31]


////////////////////ַĲӰ [+32]
ҪǴӻΪĸֵĶַʵʿɱķΧȻ2~20ֶĵķΧȻ1~20
ѯͷַܲӰ


////////////////////ǷѹУ׼ [+33]


¶[+34]
////////////////////Ķѹ40AΪ40A*ûбĸ


////////////////////·ѹĸĶ
жõʱĵ3A
У׼ʱ趨Ĭֵ30min

У׼֮¾õʱָԭֵʹھʱһֱУ׼SOC
Ҫ¼״ֻ̬Ҫھ״̬£һֱʱУ׼
ֳŵߣֻʹDPֵEEPROMҪ¼״̬ʱʼմںͳ

OCVУ׼ʱOCV_step=0
OCVУ׼ʱ
 ڳŵ磬OCV_step=0ǻÿ30min¼һʱ
 տûʱ/մӳŵ״̬OCV_step:0->3
 մӳŵ״̬

ʱ㣬EEPROM쳣ʱ£ڴӳŵ״̬ص״̬ʱ
 ڳŵʱÿ30minһΣ

оֵСһλ


////////////////////ŵPACKѹ=ŵѹʱBMSͽָ
ʱsoc20%ϣҲ


////////////////////ȡMOSŵµĸ澯ͱжϸֵʱ־λִʱ [+35]


////////////////////ӿ·Ĭϲ110mV 64us [+36]
AFE30mV40mV30mV(200A)Ȼ󱣳̶ֵֹSDWAͬĶҲȥλ֮ȥ
110mV 64us
70 0e 6e d0 62 a8 8c 9b af 78 64 c3 18 1b 21 1a 50 64 46 ec f6 64 46 ec f6 60 


////////////////////SOC [+37]
ԭƸΪ[]bmsMem.fcc->bmsMem.ncc (nominal:ϵ)
½[]fccϵɱ棬ȷ1mAS
RTCʱ12hڹػҲԼסʼʱǷҪʱ
 RTC쳣ʱ12hڹػҪ¿ʼǷѹѹм䲻ػУ׼

߼տʼʱSOC=0/1%У׼ͬʱ12hУ׼
       12hڣжһʹSOC=100%ڻֹͣ(<2A)ִУ׼ֵ[]=ʱʣ档
	   12h⣬жһʹSOC=100%䶯
	   ʣһֱԭSOC100%

λʾ[][ʣ]ڳʱʣ=[]
λĻдʱȸ[]Ҳ[][ʣ]=[]*SOCӰǰųλУ׼־
 λĻдSOCʱὫñ־

SOCʱΪSOCÿ1%Ӧ1mASҪ
 ֻҪ0.1AHʾ1%
 rcc>=fcc/100*99+0.1AHֵSOC̶Ϊ100%

[]EEPROMλmAS
 [У׼ȴʱ]EEPROMʹʱӰ

/ĻʾĲʱ*ٸ
ĲʣʱҲ*


6.4
////////////////////ǰSOC99% [+38]




** Ǳ׼£[V3.36.22.21]~[V3.36.22.28] **
5.13
////////////////////3.4ڿԺV3λͨ [Vx.x.22.21]
ͨʱѯͣģҲͣ


6.16
////////////////////ǿж"="ֹ0%ʱ [Vx.x.22.22]


////////////////////δſά1%δά99% [Vx.x.22.23]
Ϊʱɱ䣬δſ0.1Ah~0.5Agǻ


////////////////////¶ֵ [Vx.x.22.24]
¶ߵķΧ-40~110Ϊ-55~125
¶ȸȷ(ԭҲãǼֵʵʲ಻0.1)


////////////////////Ԥѹ12VΪ19V [Vx.x.22.25] (֮ǰѼ)


6.30
////////////////////Эݽ [Vx.x.22.26] (֮ǰѼ)
Growatt.485Э飬CV_Vol = bmsMem.inverter_chgVolLimit * 10;


7.3
////////////////////Э飬עϱ [Vx.x.22.27]


7.16
////////////////////canMemһṹ [Vx.x.22.28]
curtempĸֵҪת(int16_t)
ͬʱС¶ȵı͸Ļuint16_tK¶


7.24
////////////////////ĻʾĻ汾Ż [Vx.x.22.29]
ɼ028xx0x04ʼ
Ļ汾Ϊ0ʾ


8.5
////////////////////Ļʾ汾Ż [Vx.x.22.30]






** ʱ£[+39~+41] **
[+39]ǿƹǷѹŻ
ĵǷѹǷѹMCUִ
ԭСǿƹصǷѹִأɾȥ
 ָĬϲʱرչܣ޸ĵǷѹֵʱرչܣ
 ԵǷѹ=25Ļָ
 
߼ǿƹǷѹǷѹ͵Ƿѹı־λ0
 ʱɻָɻָ

[+40]رУ׼_Ч
     ֮ǰĹرûʵãڸΪ
	 رպrccܳfcc
	 رպfcc=ncc

[+41]ѹѹʱ򣬳̶40AĶΪ
     100AӵֵӦΪ20A




[++1]Ϊ㷺Ŀͻ
*ʱеظΪ100AӦֵ
bmsMem
70 0e 6e d0 62 a8 8c 9b af 78 64 c3 18 1b 00 1a 50 64 46 ec f6 64 46 ec f6 96 
3c 37 00 05 41 3c ec f1 69 69 01 01 3c 85 
64 05 3c 00
40 02 e8 01 e8 03 e8 03
paraMem
40 02 1c 02 c8 01 f0 01 01 01 82 00 04 00 46 41 ec f1 46 41 ec f1 60 60 02 00 00 00 00 00 00 00 c0 0d ea 0b 30 02 e8 01 50 64 37 05 3c f1 41 f1 41 f1 5f f1 5f f1
*һϵ趨
 1.رSOCѹʱУ׼
 2.رУ׼
 3.16̨
paraMem
40 02 1c 02 c8 01 f0 01 01 01 82 00 04 00 46 41 ec f1 46 41 ec f1 60 60 [10] 00 00 00 00 00 00 00 c0 0d ea 0b 30 02 e8 01 50 64 37 05 3c f1 41 f1 41 f1 5f f1 5f f1



**׼**
11.19
////////////////////Growatt CANŻ [Vx.x.23.1]


////////////////////Ԥ [Vx.x.23.2]


////////////////////ĻȷΧ20~40ʶ [Vx.x.23.3]




11.20
////////////////////ʱ棬Ļܸ⣬޷Ч
ԭEEPROMλparaMemҪĴ洢ʽ

////////////////////ӵ澯Զͷ




**׼**
////////////////////ڹرԤʱҲҪAFE·ʱǷ· [Vx.x.23.3]


11.27
////////////////////ԭ[Vx.x.23.2]Ԥ߼ʵ⣬ݸòʹԭ߼8sֱ˳Ԥ
ԭԤ߼AFE·ֱ˳Ԥ
˳Ԥ̴AFE·ҪAFE·жϲԤʱͬ




**׼12.5**
////////////////////AFE¶ȱֵ [Vx.x.23.6]


////////////////////ͷ




**** Ӳ6.3.L ****
//ƣPA8PC1 

//PB12룬PB13Ĭϵ 

//PC10/PC11ͨţοפ 
//PC12λţοפ 

//ȼοĵ 
//ȼ麯ų 

//Ȱգ֮дϸ 


1.13
//
ϴݹ5
дĲʱ1ظProtocolNameʽΪδĶд׼һ淶ʽ""{}/[]Ҫ
ʱƣ+++ȴ0.5s


1.15
ֲܣ
///λ/ػ
󣬵KEYյ2sߵƽPOWERߵƽ
ٴΰº2sִиλ4sִйػ

LED״̬
  ʱеȫȻwhileѭбʵ״̬
  ִиλûִйػʱе˸ȫһ
  ִйػеϨ
  
λCANx4ģ飬ֱ//ϱ־Ź
ػȫMOSȫأ//Ԥȫأֹͨͣ

ϵͳסˣǹز˻ϿŹ


1.19
//PA8PWMԿ
PWMƵ20kHzռձ50%-95%
10A

׼ѹʱ53Vȡ52Vʱ
  53.5V 94.0f
  53.0V 92.8f
Ϊ100.00λԣ0.1fĲֵе
PWM΢ŵ̷ӦҪЧ

ݵֵռձȣ仯ԽԽ
  ƺռձȸĶ󣬶ԵӰ1.2sĳ2sӦ1
ҪԵС10AԺPWMô


1.20
//-Ļ汾ڴʱϱ


1.21
//Ż
CANжϼ
ߺ󣬴ڳʱʼĵʱҲر

¼ĵַҪжǷ

ԶַʱԵַı仯ݲִдEEPROM֮write_Addrдȥ
Զַʱźãյظ1ٷһ䣬ӻظIO2ֱwhileѭ
ַΪַʱ˸ǳ


֮Żͷװ


1.22
//Ҫⲿ񣬲Ŧ۵ع

1.30
//֮ǰնб־͸ݵַIO1ƽܣŵ(write_Addr != 0)жڷų




/**Ӳ6.3.LW**/

//ͨMBO26A
ATŵ<CR><LF>=0x0d 0x0a
9600
/Ͽ+CONNECTED+DISCONN
ֽ244
//ֽСְ

//ţ
PC13 Դά
PC0  ״̬

PB12 LED1

PB9  PWM

PC1 ӵ⣬ԿƵַ仯


2.27
//ֹֹ֮ͣͣǰעˣڻָ


2.27
//ťֳͶ̰ģʽʵҪѡ

//Զַܣִдֻʱִ

//С/WIFI/4Gд룬ɸʵҪѡִһ


2.28
//4Gͨ
*оƬȴֻ0.8s

//Flash100A


3.2
//4Gͨ
оƬȴ˵ֻ0.8sʵʷAT+CSQڿʱظ99Ҫʱͨ
2ͨݡ¼ء
¼

д


ʱϱɾ
ԭ棺
			LTE_CombineStr("\"ChgLimitStatus\":%s,",  Status[ChgLimitStatus]); //14+4 + 5
			LTE_CombineStr("\"BalanceStatus\":%s,",   Status[BalanceStatus]); //13+4 + 5
			//״̬
			LTE_CombineStr("\"LockOCC\":%s,",     Status[LockOCC]); //7+4 + 5
			LTE_CombineStr("\"LockOCD1\":%s,",    Status[LockOCD1]); //8+4 + 5
			LTE_CombineStr("\"LockOCD2\":%s,",    Status[LockOCD2]); //8+4 + 5
			LTE_CombineStr("\"LockSP\":%s,",      Status[LockSP]); //6+4 + 5
			LTE_CombineStr("\"LockSC\":%s,",      Status[LockSC]); //6+4 + 5
			LTE_CombineStr("\"ChgMosFault\":%s,", Status[ChgMosFault]); //11+4 + 5
			LTE_CombineStr("\"DsgMosFault\":%s,", Status[DsgMosFault]); //11+4 + 5
			LTE_CombineStr("\"DOStatus\":%s,",    Status[DOStatus]); //8+4 + 5
			LTE_CombineStr("\"ForceOffUV\":%s,",  Status[ForceOffUV]); //10+4 + 5
			//
			LTE_CombineStr("\"PackOV\":%s,",     Status[PackOV]); //6+4 + 5
			LTE_CombineStr("\"PackUV\":%s,",     Status[PackUV]); //6+4 + 5
			LTE_CombineStr("\"CellOV\":%s,",     Status[CellOV]); //6+4 + 5
			LTE_CombineStr("\"CellUV\":%s,",     Status[CellUV]); //6+4 + 5
			LTE_CombineStr("\"PF\":%s,",         Status[PF]); //2+4 + 5
			LTE_CombineStr("\"L0V\":%s,",        Status[L0V]); //3+4 + 5
			LTE_CombineStr("\"OCC\":%s,",        Status[OCC]); //3+4 + 5
			LTE_CombineStr("\"OCD1\":%s,",       Status[OCD1]); //4+4 + 5
			LTE_CombineStr("\"OCD2\":%s,",       Status[OCD2]); //4+4 + 5
			LTE_CombineStr("\"SP\":%s,",         Status[SP]); //2+4 + 5
			LTE_CombineStr("\"SC\":%s,",         Status[SC]); //2+4 + 5
			LTE_CombineStr("\"McuOTC\":%s,",     Status[McuOTC]); //6+4 + 5
			LTE_CombineStr("\"McuOTD\":%s,",     Status[McuOTD]); //6+4 + 5
			LTE_CombineStr("\"McuUTC\":%s,",     Status[McuUTC]); //6+4 + 5
			LTE_CombineStr("\"McuUTD\":%s,",     Status[McuUTD]); //6+4 + 5
			LTE_CombineStr("\"AmbientOTC\":%s,", Status[AmbientOTC]); //10+4 + 5
			LTE_CombineStr("\"AmbientOTD\":%s,", Status[AmbientOTD]); //10+4 + 5
			LTE_CombineStr("\"AmbientUTC\":%s,", Status[AmbientUTC]); //10+4 + 5
			LTE_CombineStr("\"AmbientUTD\":%s,", Status[AmbientUTD]); //10+4 + 5
			LTE_CombineStr("\"MosOTC\":%s,",     Status[MosOTC]); //6+4 + 5
			LTE_CombineStr("\"MosOTD\":%s,",     Status[MosOTD]); //6+4 + 5
			LTE_CombineStr("\"MosUTC\":%s,",     Status[MosUTC]); //6+4 + 5
			LTE_CombineStr("\"MosUTD\":%s,",     Status[MosUTD]); //6+4 + 5
			//
			LTE_CombineStr("\"PackOVWarning\":%s,", Status[PackOVWarning]); //6+4 + 5
			LTE_CombineStr("\"PackUVWarning\":%s,", Status[PackUVWarning]); //6+4 + 5
			LTE_CombineStr("\"CellOVWarning\":%s,", Status[CellOVWarning]); //6+4 + 5
			LTE_CombineStr("\"CellUVWarning\":%s,", Status[CellUVWarning]); //6+4 + 5
			LTE_CombineStr("\"OCCWarning\":%s,",    Status[OCCWarning]); //3+4 + 5
			LTE_CombineStr("\"OCDWarning\":%s,",    Status[OCDWarning]); //3+4 + 5
			LTE_CombineStr("\"McuOTCWarning\":%s,",     Status[McuOTCWarning]); //6+7+4 + 5
			LTE_CombineStr("\"McuOTDWarning\":%s,",     Status[McuOTDWarning]); //6+7+4 + 5
			LTE_CombineStr("\"McuUTCWarning\":%s,",     Status[McuUTCWarning]); //6+7+4 + 5
			LTE_CombineStr("\"McuUTDWarning\":%s,",     Status[McuUTDWarning]); //6+7+4 + 5
			LTE_CombineStr("\"AmbientOTCWarning\":%s,", Status[AmbientOTCWarning]); //10+7+4 + 5
			LTE_CombineStr("\"AmbientOTDWarning\":%s,", Status[AmbientOTDWarning]); //10+7+4 + 5
			LTE_CombineStr("\"AmbientUTCWarning\":%s,", Status[AmbientUTCWarning]); //10+7+4 + 5
			LTE_CombineStr("\"AmbientUTDWarning\":%s,", Status[AmbientUTDWarning]); //10+7+4 + 5
			LTE_CombineStr("\"MosOTCWarning\":%s,",     Status[MosOTCWarning]); //6+7+4 + 5
			LTE_CombineStr("\"MosOTDWarning\":%s,",     Status[MosOTDWarning]); //6+7+4 + 5
//			LTE_CombineStr("\"MosUTCWarning\":%s,",     Status[MosUTCWarning]); //6+7+4 + 5
//			LTE_CombineStr("\"MosUTDWarning\":%s,",     Status[MosUTDWarning]); //6+7+4 + 5

Ϊ
			if(ChgLimitStatus) LTE_CombineStr("\"ChgLimitStatus\":true,"); //14+4 + 5
			if(BalanceStatus) LTE_CombineStr("\"BalanceStatus\":true,"); //13+4 + 5
			//״̬
			if(LockOCC) LTE_CombineStr("\"LockOCC\":true,"); //7+4 + 5
			if(LockOCD1) LTE_CombineStr("\"LockOCD1\":true,"); //8+4 + 5
			if(LockOCD2) LTE_CombineStr("\"LockOCD2\":true,"); //8+4 + 5
			if(LockSP) LTE_CombineStr("\"LockSP\":true,"); //6+4 + 5
			if(LockSC) LTE_CombineStr("\"LockSC\":true,"); //6+4 + 5
			if(ChgMosFault) LTE_CombineStr("\"ChgMosFault\":true,"); //11+4 + 5
			if(DsgMosFault) LTE_CombineStr("\"DsgMosFault\":true,"); //11+4 + 5
			if(DOStatus) LTE_CombineStr("\"DOStatus\":true,"); //8+4 + 5
			if(ForceOffUV) LTE_CombineStr("\"ForceOffUV\":true,"); //10+4 + 5
			//
			if(PackOV) LTE_CombineStr("\"PackOV\":true,"); //6+4 + 5
			if(PackUV) LTE_CombineStr("\"PackUV\":true,"); //6+4 + 5
			if(CellOV) LTE_CombineStr("\"CellOV\":true,"); //6+4 + 5
			if(CellUV) LTE_CombineStr("\"CellUV\":true,"); //6+4 + 5
			if(PF) LTE_CombineStr("\"PF\":true,"); //2+4 + 5
			if(L0V) LTE_CombineStr("\"L0V\":true,"); //3+4 + 5
			if(OCC) LTE_CombineStr("\"OCC\":true,"); //3+4 + 5
			if(OCD1) LTE_CombineStr("\"OCD1\":true,"); //4+4 + 5
			if(OCD2) LTE_CombineStr("\"OCD2\":true,"); //4+4 + 5
			if(SP) LTE_CombineStr("\"SP\":true,"); //2+4 + 5
			if(SC) LTE_CombineStr("\"SC\":true,"); //2+4 + 5
			if(McuOTC) LTE_CombineStr("\"McuOTC\":true,"); //6+4 + 5
			if(McuOTD) LTE_CombineStr("\"McuOTD\":true,"); //6+4 + 5
			if(McuUTC) LTE_CombineStr("\"McuUTC\":true,"); //6+4 + 5
			if(McuUTD) LTE_CombineStr("\"McuUTD\":true,"); //6+4 + 5
			if(AmbientOTC) LTE_CombineStr("\"AmbientOTC\":true,"); //10+4 + 5
			if(AmbientOTD) LTE_CombineStr("\"AmbientOTD\":true,"); //10+4 + 5
			if(AmbientUTC) LTE_CombineStr("\"AmbientUTC\":true,"); //10+4 + 5
			if(AmbientUTD) LTE_CombineStr("\"AmbientUTD\":true,"); //10+4 + 5
			if(MosOTC) LTE_CombineStr("\"MosOTC\":true,"); //6+4 + 5
			if(MosOTD) LTE_CombineStr("\"MosOTD\":true,"); //6+4 + 5
			//if(MosUTC) LTE_CombineStr("\"MosUTC\":true,"); //6+4 + 5
			//if(MosUTD) LTE_CombineStr("\"MosUTD\":true,"); //6+4 + 5
			//
			if(PackOVWarning) LTE_CombineStr("\"PackOVWarning\":true,"); //6+4 + 5
			if(PackUVWarning) LTE_CombineStr("\"PackUVWarning\":true,"); //6+4 + 5
			if(CellOVWarning) LTE_CombineStr("\"CellOVWarning\":true,"); //6+4 + 5
			if(CellUVWarning) LTE_CombineStr("\"CellUVWarning\":true,"); //6+4 + 5
			if(OCCWarning) LTE_CombineStr("\"OCCWarning\":true,"); //3+4 + 5
			if(OCDWarning) LTE_CombineStr("\"OCDWarning\":true,"); //3+4 + 5
			if(McuOTCWarning) LTE_CombineStr("\"McuOTCWarning\":true,"); //6+7+4 + 5
			if(McuOTDWarning) LTE_CombineStr("\"McuOTDWarning\":true,"); //6+7+4 + 5
			if(McuUTCWarning) LTE_CombineStr("\"McuUTCWarning\":true,"); //6+7+4 + 5
			if(McuUTDWarning) LTE_CombineStr("\"McuUTDWarning\":true,"); //6+7+4 + 5
			if(AmbientOTCWarning) LTE_CombineStr("\"AmbientOTCWarning\":true,"); //10+7+4 + 5
			if(AmbientOTDWarning) LTE_CombineStr("\"AmbientOTDWarning\":true,"); //10+7+4 + 5
			if(AmbientUTCWarning) LTE_CombineStr("\"AmbientUTCWarning\":true,"); //10+7+4 + 5
			if(AmbientUTDWarning) LTE_CombineStr("\"AmbientUTDWarning\":true,"); //10+7+4 + 5
			if(MosOTCWarning) LTE_CombineStr("\"MosOTCWarning\":true,"); //6+7+4 + 5
			if(MosOTDWarning) LTE_CombineStr("\"MosOTDWarning\":true,"); //6+7+4 + 5
			//if(MosUTCWarning) LTE_CombineStr("\"MosUTCWarning\":true,"); //6+7+4 + 5
			//if(MosUTDWarning) LTE_CombineStr("\"MosUTDWarning\":true,"); //6+7+4 + 5


3.5
//ӿ·Ƴʾ

//״̬¼


3.9
//Ĭϸ£
////////////////////̩߼

////////////////////̩ƹرյĶֹ̣50us

////////////////////λɶЭ飬ͨѡЭ0ѵǰЭ

////////////////////ӿ·Ƴʾ

////////////////////ĬϹ쳣ѹֹ
100A70 [1e] 6e d0 62 a8 8c 9b af 78 64 c3 18 1b 00 1a 50 64 46 ec f6 64 46 ec f6 [f8]
100A70 [1e] 6e d0 62 a8 8c 9b af 78 64 c3 18 1b 21 1a 50 64 46 ec f6 64 46 ec f6 [0e]


3.18
////////////////////Ż
ʼռձ=صѹ+1V/Ĭϳѹ60V * 100%
ǳ״̬رȴ8s


3.20
////////////////////4GŻ
//ݼҴפ4GפڲһЩ£ͬҴ

////////////////////IAP_V2.5

////////////////////OCVֻ


////////////////////Ż
Program Size: Code=125592 RO-data=6808 RW-data=1504 ZI-data=12160  
125592+6808+1504 = 133904 = 130K120K

ѡѡһСĴ
Program Size: Code=87534 RO-data=5962 RW-data=1300 ZI-data=7004  
87534+5962+1300 = 94796 = 92K
133904-94796 = 39108 >38K

PylonЭӦַʽдĿǰӲд
Program Size: Code=84898 RO-data=5962 RW-data=1300 ZI-data=7004  
84898+5962+1300 = 92160
94796-92160 = 2636 >2K

Ż
ٺϲظĲ߼ñʽع
Ϣṹ壺


д
Program Size: Code=126948 RO-data=6804 RW-data=1520 ZI-data=12160  
126948+6804+1520 = 135272
Program Size: Code=123196 RO-data=7552 RW-data=1524 ZI-data=12164   
123196+7552+1524 = 132272 
135272-132272 = 3000

Program Size: Code=123196 RO-data=7552 RW-data=1524 ZI-data=12164   
123196+7552+1524 = 132272 
Program Size: Code=121096 RO-data=7556 RW-data=1524 ZI-data=12164 
121096+7556+1524 = 130176
132272-130176 = 2096

LTE_4G_IT_Update()LTE_4G_IQ_Transmit()Уif(LTE_status == xxx)ṹ
  ״ָ̬飬ѭж
ַظ
  һµͳһʹú궨壬Ƶĳȡһͨúʹú궨


////////////////////⣬82m
Ӧ=ѹ*4
//AFEֵҪΪ60mV 70mV 60mV(ʱĹ̶ֵ)
//Flashֵ
//쳣ѹѹر
ԭֵ70 1e 6e d0 62 a8 8c 9b af 78 64 c3 18 1b 00 1a 50 64 46 ec f6 64 46 ec f6 f8
ֵ70 1e 6e d0 62 a8 8c 9b af 78 64 c3 48 4b 00 4a 50 64 46 ec f6 64 46 ec f6 46
//У׼ĬֵѸ7000


////////////////////OTA
IAP־ʹIIC洢Ϊ˰ԲҪݾIAPÿǲת־
дת־ĲԱֱܼдFlashʱ޷תû


////////////////////Э
ԭУ
Program Size: Code=122080 RO-data=7556 RW-data=1544 ZI-data=12160  
122080+7556+1544 = 131180
ȥȫЭ
Program Size: Code=98212 RO-data=7552 RW-data=1540 ZI-data=12164  
98212+7552+1540 = 107304 = 104K
131180-107304 = 23876

Sol-Ark,Growatt,Pylon,Voltronic
Program Size: Code=103472 RO-data=7556 RW-data=1540 ZI-data=12164  
103472+7556+1540 = 112568
õҵ
Program Size: Code=104840 RO-data=7556 RW-data=1544 ZI-data=12160  
103472+7556+1544 = 112572 = 109K
Ӧţ1.3.11.12.14.37


////////////////////ѹǹرյԴ
1minκγѹ
  ѹʱ1min
ѹɾȥжϣɾȥŵжϣɾȥж
  ֻжǷг


////////////////////5Vе
ʾʼ


////////////////////߼ͻһ
¼ͷ+2,Ƿѹֹ
PC6


////////////////////IAPתʱʼLEDøߣڶ̰ʱҲ˲һ
棬ʼLEDĬõ֮ͣø߼
ػǰλĹ


////////////////////λȲ

////////////////////ıȽеһִ

{"request_id":"gca20ac1f929j4c51834","params":["Protocol","InverterChgVol","InverterDsgVol","InverterChgCur","InverterDsgCur","POV_Vol","POVR_Vol","PUV_Vol","PUVR_Vol","COV_Vol","COVR_Vol","CUV_Vol","CUVR_Vol","SC_Cur","SC_Delay","OCC_Cur","OCC_Delay","OCD1_Cur","OCD1_Delay","OTC_Temp","OTCR_Temp","OTD_Temp","OTDR_Temp","UTC_Temp","UTCR_Temp","UTD_Temp","UTDR_Temp","SOC","CYC","Capacity"]}

Program Size: Code=107008 RO-data=7556 RW-data=1552 ZI-data=14376  


////////////////////3.23°أ82mΪ91m
//Ӧ=ѹ*9
//У׼Ĭֵ10000
//AFEֵҪΪ30mV 40mV 30mV(ʱĹ̶ֵ)
//Flashֵ
70 1e 6e d0 62 a8 8c 9b af 78 64 c3 18 1b 00 1a 50 64 46 ec f6 64 46 ec f6 f8


///////////////////¼͸ֻظмʱ򷵻
ϱɺ


///////////////////¼ϱɾȥԤ


///////////////////4Gͨ1000
Program Size: Code=106676 RO-data=7552 RW-data=1556 ZI-data=17524  
106676+7552+1556 = 115784


///////////////////HardFault_Handler()
(ػ)


////////////////////WhĻҪͬʱVTcSDWnԲֵַҪ
ֳ0x3FFVTcҪֵ֧ĵַ
0x05A9
0x05AA
0x05B5
0x05B6

ָΪ߼ݵĵַ
0x05A0 -> 0x0366
0x05A3 -> 0x0361
0x05A4 -> 0x0100(ԭַ)
0x05A5 -> 0x0362
0x05A7 -> 0x0364
0x05A8 -> 0x0365
0x05B1 -> 0x0371
0x05B2 -> 0x0372
0x05B3 -> 0x0373
0x05B4 -> 0x0374
0x05B8 -> 0x0375
0x05B9 -> 0x0376
0x05BA -> 0x0377
0x05BB -> 0x0378

οRE棬
ӱɫʱʾÿ3ո񣬱¼Ȼ1ҳ3
ҳûĹ,ŵ״̬ͼԭ

Program Size: Code=107980 RO-data=7552 RW-data=1556 ZI-data=16708  
107980+7552+1556 = 117088 =114K


////////////////////ΪʱᴥԿǽťõԴߣΪFlash־
Flash־ڵ128+2K128KOTAϢˣ128+4Kԭг


4.2
//Ԥ߼£
Ԥ䣺
MOSرգԤ1s()ͷţMOS
ŵMOSǰԤ䣺
ŵMOSǰرգҪʱάֲҪ򿪣Ԥ8s()ͷţ򿪷ŵMOS
ӿ·Ϊͨƻѻϱ¼


4.6
//Ļ˳ߣ
  Ϊжϣɾȥ
//˳ߺ4Gߣ
  Ϊʱ4Gߣ˳ʱûм˳4G

//150A
70 1e 6e d0 62 a8 87 91 af 78 64 bb 18 1b 10 1a 50 64 46 ec f6 64 46 ec f6 8f 3c 37 00 05 41 3c ec f1 9b 9b 01 01 1e 89 96 05 3c 00
30 02 1c 02 cc 01 e5 01 01 01 a0 00 04 00 46 41 ec f1 46 41 ec f1 60 60 10 00 00 00 00 00 00 00 de 0d f0 0a 2b 02 e0 01 8c 8c 37 05 3c f1 41 f1 41 f1 5f f1 5f f1


4.7
//ĻʾʱҪtimecount-8h
  й̶T8ʱ
//OCVУ׼3AԣҪ0.5A
//Źʱų16sιǰ
//ΪǳʱҪMOSƲԤ

//ʹǿƹرǷѹĵʱıʾ4Gǰ״̬


4.13
//ƽִ̨еУ׼


4.14
//4G߶ڼ飬ֹߺȴûʵʷκ


4.15
//Լ鶩ĵĲ裬ӳʱ㣬3Ӧִһ
//ڻظгۻ4Gģ鲻ظʱ޷ۼ


4.16
//ȼ̵ΪѡعܣĬϲӰ±ֱִ


4.20
//4Gģ̫ͨᵼ4G쳣


4.22
//λSNźϱSNûи¡Ҫ޸SN֮SNŵַʹɼͨ
//Ļ4G޻ظʱʾNull


//оѹ
ϱ4G//WIFIĵоѹ5119mVʾֵ
ЭҪоѹҲΪcellVol[]
ݹ̣Աԭֵյʱı
//¼УоѹΧ0~4095


//OCVУ׼У׼+õ0.5A+ȴʱ4h+ػʱ䲻

//Ӹ4GʾĻconnect
//ŻLTE_lastFlagΪLTE_ResendDelayӺʱ2sҰERRORļ/2


4.27
//OCVʱ洢ָ
//ݸºżSOC
//PylonЭ飬¶Ȳ


4.28
//㸺ֵоѹ[0]ֵûֵָ
//SDWAĻʾʾֵСڵֱʾ0


5.6
//
  paraMem.fcc_ΪparaMem.soc100_
  paraMem.ctrl_disableֻbit0/1/2
//дSNʱºôˣѸ


5.8
//Ļдֵ3ȥ
Ϊ͸澯ϵһֱ
ʵҪparaMemдEEPROMҲǳѾ1д󳤶
staPack.bits.eepromUpdateɺʾдEEPROMĿǰֻʾдAFEEEPROM


5.12
//4GŻ
Ļʾrssiֵnetworkֵ
CGREGյ2쳣ȴ3sٴѯ
CFUN=0/1֮Ҫ3sѯ

CSQظERROR20s4Gģ(Ϊ̫Ӧõ)
Ļʾģеĳ̫Ķһ


5.12
//4GŻ
Ļʾrssiֵnetworkֵ
CGREGյ2쳣ȴ3sٴѯ
CFUN=0/1֮Ҫ3sѯ

CSQظERROR20s4Gģ(Ϊ̫Ӧõ)
Ļʾģеĳ̫Ķһ

networknet


5.13
//ԶŻ
ӻظѯյֽ࣬¼1

//ЭΪ246ʵʿ

//ֲվĻ

//ԶַŻ
1.Զַʱ0.5s1s1ΣϾдַҪµ
2.Զַѯյظ޷10ִԶ


//Ļ24Э飬ŶӦ
	1."Sol-Ark",		2."GoodWe",		30."Megarevo",		12."Pylon",
	11."Deye",			7."MUST",		37."solis",			3."Growatt",
	4."Aiswei",			35."Afore",		27."Victron",		6."Sorotec",
	
	5."SMA",			*."Sunways",	23."Luxpower",		24."Schneider",
	*"AlpSolarr",		13."SRNE",		14."Voltronic",		32."COSUPER",
	17."SMK",			31."SAKO",		18."SNADI",			21."invt",


//Ļʾŵʣʱ䣬5*0.1A500*0.1A







ԤƸ£
//Ļʾ4Gǰ״̬һֵ洢ռԭֵ
//Ļվ
//ĻЭ°汾
//4Gģ޻ظʱǷҪʱ


//δŻ
CANжϼ
4Gǰ״̬ʾλ

