Преглед изворни кода

STS 控制板代码修改。

liyi пре 10 месеци
родитељ
комит
dc0f50aaa6

+ 194 - 26
control/NEW_STS/HARDWARE/Hlw8110/Hlw8110.c

@@ -462,40 +462,182 @@ unsigned char Judge_CheckSum_HLW8110_Calfactor(void)
 ==========================================================================================================*/
 void Init_HLW8110(void)
 {
-	Uart_HLW8110_WriteREG_EN();
-	DelayNms(20);
+
 	
 //电流通道A设置命令,指定当前用于计算视在功率、功率因数、相角、瞬时有功功率、瞬时视在功率和有功功率过载的信号指示 的通道为通道A	
-	Uart_HLW8110_Set_Channel_A();			
-	DelayNms(20);
-	Uart_Write_HLW8110_Reg(REG_SYSCON_ADDR,2,0x0a04);	//开启A通道,关闭B通道,电压通道PGA = 1,电流通道PGA = 16
-	DelayNms(20);
-	
-	Uart_Write_HLW8110_Reg(REG_EMUCON_ADDR,2,0x0001);	//1,使能PFA 脉冲输出和有功电能寄存器累加;
-	DelayNms(20);
-//	Uart_Write_HLW8110_Reg(REG_EMUCON_ADDR,2,0x0001);
-//	DelayNms(20);
+	for(int i = 0 ; i < 50 ;i++)
+	{
+		Uart_HLW8110_WriteREG_EN();
+		DelayNms(10);
+		Uart_HLW8110_Set_Channel_A();			
+		DelayNms(10);
+		Uart_Write_HLW8110_Reg(REG_SYSCON_ADDR,2,0x0a04);	//开启A通道,关闭B通道,电压通道PGA = 1,电流通道PGA = 16
+		DelayNms(10);
+		
+
+		Uart_Write_HLW8110_Reg(REG_EMUCON_ADDR,2,0x0001);	//1,使能PFA 脉冲输出和有功电能寄存器累加;
 //	Uart_Write_HLW8110_Reg(REG_EMUCON_ADDR,2,0x0018);	//正向和负向过零点均发生变化,ZXD0 = 1,ZXD1 = 1
-//	Uart_Write_HLW8110_Reg(REG_EMUCON2_ADDR,2,0x0065);	//0x0001是EMUCON2的默认值,waveEn = 1,zxEn = 1,A通道电量寄存器,读后不清0,EPA_CB = 1;打开功率因素检测
-//	DelayNms(20);
-	Uart_Write_HLW8110_Reg(REG_EMUCON2_ADDR,2,0x0065);
-	DelayNms(20);
+		DelayNms(10);
+		Uart_Write_HLW8110_Reg(REG_EMUCON2_ADDR,2,0x0065);	//0x0001是EMUCON2的默认值,waveEn = 1,zxEn = 1,A通道电量寄存器,读后不清0,EPA_CB = 1;打开功率因素检测
+		DelayNms(10);
+
 	
-	Uart_HLW8110_WriteREG_DIS();
+		Uart_HLW8110_WriteREG_DIS();
+		B_Read_Error = 0;
+		Check_WriteReg_Success();
+		if (B_Read_Error == 1)
+		{
+			DelayNms(100);
+		}else
+		{
+			break;
+		}
+	}
 //	DelayNms(3);	
   //读取地址是0x6F至0x77的寄存器,验证系数是否正确
-  Judge_CheckSum_HLW8110_Calfactor();	
+ // Judge_CheckSum_HLW8110_Calfactor();	
+	uint8_t d  = 0;
+	for(int i = 0;i < 3;i++)
+	{
+		d = Judge_CheckSum_HLW8110_Calfactor();
+		if(d)
+		{
+			break;
+		}
+	}
+	if(d == 0)
+	{
+		U16_RMSIAC_RegData		=	0xcad1;
+		U16_RMSIBC_RegData		=	0xcacf;
+		U16_RMSUC_RegData			=	0xa4c3;
+		U16_PowerPAC_RegData	=	0xab47;
+		U16_PowerPBC_RegData	=	0xab49;
+		U16_PowerSC_RegData		=	0xab41;
+		U16_EnergyAC_RegData	=	0xe9cc;
+		U16_EnergyBC_RegData	=	0xe9ce;		
+	}
+}
+
+void re_check_write_reg_success(void)
+{
+	Uart_Read_HLW8110_Reg(REG_SYSCON_ADDR,2);
+	DelayNms(10);
+	eMBPoll();
+	if ( u8_RxBuf[u8_RX_Length-1] == HLW8110_checkSum_Read(u8_RX_Length) )
+	{
+		U16_Check_SysconReg_Data =  (u8_RxBuf[0]<<8) + (u8_RxBuf[1]); 
+//		printf("写入的SysconReg寄存器:%lx\n " ,U16_Check_SysconReg_Data);
+		if(U16_Check_SysconReg_Data == 0x0a04)
+		{
+		}else
+		{
+			B_Read_Error = 1;
+		}
+		
+	}
+	else
+	{
+//		printf("SysconReg寄存器读取出错\r\n");
+		B_Read_Error = 1;
+	}
+	
+	Uart_Read_HLW8110_Reg(REG_EMUCON_ADDR,2);
+	DelayNms(10);
+	eMBPoll();
+	if ( u8_RxBuf[u8_RX_Length-1] == HLW8110_checkSum_Read(u8_RX_Length) )
+	{
+		U16_Check_EmuconReg_Data =  (u8_RxBuf[0]<<8) + (u8_RxBuf[1]); 
+//		printf("写入的EmuconReg寄存器:%lx\n " ,U16_Check_EmuconReg_Data);
+		
+		if(U16_Check_EmuconReg_Data == 0x0001)
+		{
+		}else
+		{
+			B_Read_Error = 1;
+		}
+	}
+	else
+	{
+//		printf("EmuconReg寄存器读取出错\r\n");
+		B_Read_Error = 1;
+	}
+	
+	
+	Uart_Read_HLW8110_Reg(REG_EMUCON2_ADDR,2);
+	DelayNms(10);
+	eMBPoll();
+	if ( u8_RxBuf[u8_RX_Length-1] == HLW8110_checkSum_Read(u8_RX_Length) )
+	{
+		U16_Check_Emucon2Reg_Data =  (u8_RxBuf[0]<<8) + (u8_RxBuf[1]); 
+//		printf("写入的Emucon2Reg寄存器寄存器:%lx\n " ,U16_Check_Emucon2Reg_Data);
+		if(U16_Check_Emucon2Reg_Data == 0x0065)
+		{
+		}else
+		{
+			B_Read_Error = 1;
+		}
+	}
+	else
+	{
+//		printf("Emucon2Reg寄存器读取出错\r\n");
+		B_Read_Error = 1;
+	}
+	
+}
+
+void reinit_hlw8110()
+{
+	for(int i = 0 ; i < 50 ;i++)
+	{
+		Uart_HLW8110_WriteREG_EN();
+		DelayNms(10);
+		eMBPoll();
+		Uart_HLW8110_Set_Channel_A();
+		DelayNms(10);
+		eMBPoll();
+		Uart_Write_HLW8110_Reg(REG_SYSCON_ADDR,2,0x0a04);
+		DelayNms(10);
+		eMBPoll();
+		Uart_Write_HLW8110_Reg(REG_EMUCON_ADDR,2,0x0001);
+		DelayNms(10);
+		eMBPoll();
+		Uart_Write_HLW8110_Reg(REG_EMUCON2_ADDR,2,0x0065);
+		DelayNms(10);
+		eMBPoll();
+		Uart_HLW8110_WriteREG_DIS();
+		B_Read_Error = 0;
+		re_check_write_reg_success();
+		if(B_Read_Error)
+		{
+			eMBPoll();
+			DelayNms(100);
+		}else
+		{
+			break;
+		}
+	}
+}
+
+
+
+uint8_t Check_WriteReg_Sucess_Addr(uint8_t addr,uint8_t readlen, uint16_t value)
+{
+	B_Read_Error = 1;
+	Uart_Read_HLW8110_Reg(addr,readlen);
+	DelayNms(10);
+	uint16_t data = 0;
+	if (u8_RxBuf[u8_RX_Length-1] == HLW8110_checkSum_Read(u8_RX_Length))
+	{
+		data = (u8_RxBuf[0]<<8) + (u8_RxBuf[1]);
+		if(data != value)
+		{
+			B_Read_Error = 0;
+		}
+	}
+	return B_Read_Error;
 }
 
 
-/*=========================================================================================================
- * Function : void Check_WriteReg_Success(void)
- * Describe : 检验写入的REG是否正确写入
- * Input    : none
- * Output   : none
- * Return   : none
- * Record   : 2020/04/02
-==========================================================================================================*/
 void Check_WriteReg_Success(void)
 {
 	Uart_Read_HLW8110_Reg(REG_SYSCON_ADDR,2);
@@ -504,6 +646,13 @@ void Check_WriteReg_Success(void)
 	{
 		U16_Check_SysconReg_Data =  (u8_RxBuf[0]<<8) + (u8_RxBuf[1]); 
 //		printf("写入的SysconReg寄存器:%lx\n " ,U16_Check_SysconReg_Data);
+		if(U16_Check_SysconReg_Data == 0x0a04)
+		{
+		}else
+		{
+			B_Read_Error = 1;
+		}
+		
 	}
 	else
 	{
@@ -517,6 +666,13 @@ void Check_WriteReg_Success(void)
 	{
 		U16_Check_EmuconReg_Data =  (u8_RxBuf[0]<<8) + (u8_RxBuf[1]); 
 //		printf("写入的EmuconReg寄存器:%lx\n " ,U16_Check_EmuconReg_Data);
+		
+		if(U16_Check_EmuconReg_Data == 0x0001)
+		{
+		}else
+		{
+			B_Read_Error = 1;
+		}
 	}
 	else
 	{
@@ -531,6 +687,12 @@ void Check_WriteReg_Success(void)
 	{
 		U16_Check_Emucon2Reg_Data =  (u8_RxBuf[0]<<8) + (u8_RxBuf[1]); 
 //		printf("写入的Emucon2Reg寄存器寄存器:%lx\n " ,U16_Check_Emucon2Reg_Data);
+		if(U16_Check_Emucon2Reg_Data == 0x0065)
+		{
+		}else
+		{
+			B_Read_Error = 1;
+		}
 	}
 	else
 	{
@@ -554,6 +716,7 @@ void Read_HLW8110_IA(void)
 	
 	Uart_Read_HLW8110_Reg(REG_RMSIA_ADDR,3);
 	DelayNms(10);
+	eMBPoll();
 	if ( u8_RxBuf[u8_RX_Length-1] == HLW8110_checkSum_Read(u8_RX_Length) )
 	{
 		U32_RMSIA_RegData = (unsigned long)(u8_RxBuf[0]<<16) + (unsigned long)(u8_RxBuf[1]<<8) + (unsigned long)(u8_RxBuf[2]); 
@@ -597,6 +760,7 @@ void Read_HLW8110_U(void)
 	
 	Uart_Read_HLW8110_Reg(REG_RMSU_ADDR,3);
 	DelayNms(10);
+	eMBPoll();
 	if ( u8_RxBuf[u8_RX_Length-1] == HLW8110_checkSum_Read(u8_RX_Length) )
 	{
 		U32_RMSU_RegData = (unsigned long)(u8_RxBuf[0]<<16) + (unsigned long)(u8_RxBuf[1]<<8) + (unsigned long)(u8_RxBuf[2]);
@@ -642,6 +806,7 @@ void Read_HLW8110_PA(void)
 	
 	Uart_Read_HLW8110_Reg(REG_POWER_PA_ADDR,4);
 	DelayNms(10);
+	eMBPoll();
 	if ( u8_RxBuf[u8_RX_Length-1] == HLW8110_checkSum_Read(u8_RX_Length) )
 	{
 		U32_POWERPA_RegData = (unsigned long)(u8_RxBuf[0]<<24) + (unsigned long)(u8_RxBuf[1]<<16) + (unsigned long)(u8_RxBuf[2]<<8) + (unsigned long)(u8_RxBuf[3]);
@@ -689,7 +854,7 @@ void Read_HLW8110_EA(void)
 	float a;
 	Uart_Read_HLW8110_Reg(REG_ENERGY_PA_ADDR,3); 
 	DelayNms(10);
-	
+	eMBPoll();
 	if ( u8_RxBuf[u8_RX_Length-1] == HLW8110_checkSum_Read(u8_RX_Length) )
 	{
 		U32_ENERGY_PA_RegData = (unsigned long)(u8_RxBuf[0]<<16) + (unsigned long)(u8_RxBuf[1]<<8) + (unsigned long)(u8_RxBuf[2]);
@@ -741,6 +906,7 @@ void Read_HLW8110_LineFreq(void)
 	unsigned long b;
 	Uart_Read_HLW8110_Reg(REG_UFREQ_ADDR,2);
 	DelayNms(10);
+	eMBPoll();
 	if ( u8_RxBuf[u8_RX_Length-1] == HLW8110_checkSum_Read(u8_RX_Length) )
 	{
 		b = (unsigned long)(u8_RxBuf[0]<<8) + (unsigned long)(u8_RxBuf[1]);
@@ -777,6 +943,7 @@ void Read_HLW8110_PF(void)
 	
 	Uart_Read_HLW8110_Reg(REG_PF_ADDR,3);
 	DelayNms(10);
+	eMBPoll();
 	if ( u8_RxBuf[u8_RX_Length-1] == HLW8110_checkSum_Read(u8_RX_Length) )
 	{
 		b = (unsigned long)(u8_RxBuf[0]<<16) + (unsigned long)(u8_RxBuf[1]<<8) + (unsigned long)(u8_RxBuf[2]);
@@ -820,6 +987,7 @@ void Read_HLW8110_Angle(void)
 	unsigned long b;
 	Uart_Read_HLW8110_Reg(REG_ANGLE_ADDR,2);
 	DelayNms(10);
+	eMBPoll();
 	if ( u8_RxBuf[u8_RX_Length-1] == HLW8110_checkSum_Read(u8_RX_Length) )
 	{
 		b =(unsigned long)(u8_RxBuf[0]<<8) + (unsigned long)(u8_RxBuf[1]);

+ 4 - 11
control/NEW_STS/HARDWARE/Hlw8110/Hlw8110.h

@@ -42,7 +42,9 @@
 #define REG_ENERGY_BC_ADDR			0x77
 
 
-
+//ºê¶¨Òå
+#define FALSE	0
+#define TRUE	1
 
 #define D_TIME1_50MS	50
 
@@ -74,14 +76,5 @@ void Calculate_HLW8110_MeterData(void);
 
 void Init_HLW8112(void);
 void HLW8112_Measure(void);
-
-
-
-float read_hlw8110_i(void);
-float read_hlw8110_v(void);
-float read_hlw8110_p(void);
-float read_hlw8110_e(void);
-float read_hlw8110_pf(void);
-float read_hlw8110_freq(void);
-
+void reinit_hlw8110(void);
 #endif

+ 3 - 0
control/NEW_STS/MODBUS/include/mb.h

@@ -409,6 +409,9 @@ eMBErrorCode    eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress,
  */
 eMBErrorCode    eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress,
                                   USHORT usNDiscrete );
+																	
+																	
+uint8_t eMBCheck(void);
 
 #ifdef __cplusplus
 PR_END_EXTERN_C

+ 11 - 0
control/NEW_STS/MODBUS/mb.c

@@ -327,6 +327,17 @@ eMBDisable( void )
     return eStatus;
 }
 
+uint8_t eMBCheck(void)
+{
+	if( eMBState != STATE_ENABLED)
+	{
+		return 1;
+	}else
+	{
+		return 0;
+	}
+}
+
 eMBErrorCode
 eMBPoll( void )
 {

+ 18 - 6
control/NEW_STS/MODBUS/rtu/mbrtu.c

@@ -153,8 +153,13 @@ eMBRTUReceive( UCHAR * pucRcvAddress, UCHAR ** pucFrame, USHORT * pusLength )
     eMBErrorCode    eStatus = MB_ENOERR;
 
     ENTER_CRITICAL_SECTION(  );
-    assert( usRcvBufferPos < MB_SER_PDU_SIZE_MAX );
-
+    //assert( usRcvBufferPos < MB_SER_PDU_SIZE_MAX );
+		if(usRcvBufferPos >= MB_SER_PDU_SIZE_MAX)
+		{
+			eMBDisable();
+			EXIT_CRITICAL_SECTION(  );
+			return eStatus;
+		}
     /* Length and CRC check */
     if( ( usRcvBufferPos >= MB_SER_PDU_SIZE_MIN )
         && ( usMBCRC16( ( UCHAR * ) ucRTUBuf, usRcvBufferPos ) == 0 ) )
@@ -237,7 +242,11 @@ xMBRTUReceiveFSM( void )
     BOOL            xTaskNeedSwitch = FALSE;
     UCHAR           ucByte;
 
-    assert( eSndState == STATE_TX_IDLE );
+		if(eSndState != STATE_TX_IDLE)
+		{
+			eMBDisable();
+			return xTaskNeedSwitch;
+		}
 
     /* Always read the character. */
     ( void )xMBPortSerialGetByte( ( CHAR * ) & ucByte );
@@ -296,8 +305,11 @@ xMBRTUTransmitFSM( void )
 {
     BOOL            xNeedPoll = FALSE;
 
-    assert( eRcvState == STATE_RX_IDLE );
-
+    if(eRcvState != STATE_RX_IDLE)
+		{
+			eMBDisable();
+			return xNeedPoll;
+		}
     switch ( eSndState )
     {
         /* We should not get a transmitter event if the transmitter is in
@@ -320,8 +332,8 @@ xMBRTUTransmitFSM( void )
             xNeedPoll = xMBPortEventPost( EV_FRAME_SENT );
             /* Disable transmitter. This prevents another transmit buffer
              * empty interrupt. */
+						eSndState = STATE_TX_IDLE;
             vMBPortSerialEnable( TRUE, FALSE );
-            eSndState = STATE_TX_IDLE;
         }
         break;
     }

+ 7 - 0
control/NEW_STS/USER/main.c

@@ -96,6 +96,13 @@ int main()
 uint8_t write_errp_count = 0;
 
 	while(1){
+		
+		
+		if(eMBCheck())
+		{
+			eMBEnable();
+		}
+		
 		Fwdgt_reload();
 		eMBPoll();
 #if 1