Przeglądaj źródła

Merge branch 'master' of http://jiecheng2024.tpddns.cn:3000/liyuezong/SmartPDCode

guohui 1 rok temu
rodzic
commit
811f1e10e1

+ 5 - 1
control/STS/HARDWARE/Adc/Adc.c

@@ -18,7 +18,7 @@ void adc_init(void)
 	rcu_adc_clock_config(RCU_ADCCK_APB2_DIV6);
 	rcu_periph_clock_enable(RCU_GPIOB);
 	
-	gpio_mode_set(RCU_GPIOB, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_0); 
+	gpio_mode_set(GPIOB, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_0); 
 	
 	adc_deinit();
 	
@@ -28,8 +28,12 @@ void adc_init(void)
 	adc_channel_length_config(ADC_REGULAR_CHANNEL, 1U);
 	adc_regular_channel_config(0U, ADC_CHANNEL_8, ADC_SAMPLETIME_55POINT5);
 	adc_external_trigger_config(ADC_REGULAR_CHANNEL, ENABLE);
+	adc_resolution_config(ADC_RESOLUTION_12B);
+	
+	
 	adc_enable();
 	DelayNms(1);
+
 	adc_calibration_enable();
 	
 }

+ 18 - 4
control/STS/HARDWARE/At24xx/At24xx.c

@@ -62,7 +62,9 @@ void at24xx_read(unsigned short read_addr, unsigned char *buff,unsigned short re
 {
 	while(read_num)
 	{
-		*buff++ = at24xx_read_one_byte(read_addr++);
+		*buff = at24xx_read_one_byte(read_addr);
+		read_addr++;
+		buff++;
 		read_num --;
 	}
 }
@@ -71,7 +73,9 @@ void at24xx_write(unsigned short write_addr, unsigned char *buff,unsigned short
 {
 	while(write_num)
 	{
-		at24xx_write_one_byte(write_addr++,*buff++);
+		at24xx_write_one_byte(write_addr,*buff);
+		write_addr++;
+		buff++;
 		write_num --;
 	}
 }
@@ -129,9 +133,10 @@ void at24xx_write_one_byte(unsigned short write_addr,unsigned char data)
                             
   GenI2CStopSig();     
 	
-  DelayNms(7);                                                                              
+  DelayNms(10);                                                                              
 }
 
+
 static void read_iic_data(void)
 {
 	sts_data_t *sts_d = get_sts();
@@ -221,7 +226,16 @@ static void read_iic_data(void)
 			sts_d->m_data.over_func = 0;
 		}
 		r_addr = &sts_d->iic_consumer;
-		at24xx_read(IIC_CONSUMER_START,r_addr,sizeof(float));
+		uint32_t buff = 0;
+		at24xx_read(IIC_CONSUMER_START,&buff,4);
+		if((uint32_t)buff == 0)
+		{
+			sts_d->iic_consumer = 0;
+		}else
+		{
+			at24xx_read(IIC_CONSUMER_START,r_addr,sizeof(float));
+		}
+		
 		
 		r_addr = &sts_d->m_data.out_status;
 		at24xx_read(IIC_OUT_CHANNEL,r_addr,sizeof(uint16_t));

+ 5 - 0
control/STS/HARDWARE/Beep/Beep.c

@@ -16,6 +16,10 @@ static void beep(void)
 {
 	gpio_bit_toggle(GPIOB, GPIO_PIN_1);
 }
+static void clear_beep(void)
+{
+	gpio_bit_reset(GPIOB, GPIO_PIN_1);
+}
 
 void beep_init(void)
 {
@@ -27,6 +31,7 @@ void beep_init(void)
 	
 	sts_data_t *data = get_sts();
 	data->beep = beep;
+	data->clear_beep = clear_beep;
 }
 
 

+ 46 - 14
control/STS/HARDWARE/Electricity/Electricity.c

@@ -33,34 +33,46 @@ void electricity_init()
 	data->check_wanning = check_wanning;
 }
 
+
+extern float   F_AC_V;												
+extern float   F_AC_I;													
+extern float   F_AC_P;													
+extern float   F_AC_LINE_Freq;     							
+extern float   F_AC_E;													
+extern float   F_AC_PF;													
+extern float   F_Angle;
+
+
 void electricity_read(uint8_t channel)
 {
 	electricity_t ele = {0};
 	select_channel(channel);
 	DelayNus(50);
 	Check_WriteReg_Success();
-	ele.voltage = read_hlw8110_v();
-	ele.current = read_hlw8110_i();
-	ele.consumer = read_hlw8110_e();
-	ele.power = read_hlw8110_p();
-	ele.freq = read_hlw8110_freq();
-	ele.factor = read_hlw8110_pf();
+	Calculate_HLW8110_MeterData();
+//	ele.voltage = read_hlw8110_v();
+//	ele.current = read_hlw8110_i();
+//	ele.consumer = read_hlw8110_e();
+//	ele.power = read_hlw8110_p();
+//	ele.freq = read_hlw8110_freq();
+//	ele.factor = read_hlw8110_pf();
 	
 	sts_data_t *data = get_sts();
 	if(channel == 0)
 	{
-		data->m_data.out_power.voltage = ele.voltage * 1000;
-		data->m_data.out_power.current = ele.current * 1000;
+		data->m_data.out_power.voltage = F_AC_V * 1000;
+		data->m_data.out_power.current = F_AC_I * 1000;
 		
-		data->m_data.out_power.power = ele.power * 1000;
-		data->m_data.out_power.freq = ele.freq * 1000;
-		data->m_data.out_power.factor = ele.factor * 1000;
-		data->iic_consumer += ele.consumer;
+		data->m_data.out_power.power = F_AC_P* 1000;
+		data->m_data.out_power.freq = F_AC_LINE_Freq * 1000;
+		data->m_data.out_power.factor = F_AC_PF * 1000;
+		data->iic_consumer += F_AC_E;
 		data->m_data.out_power.consumer = data->iic_consumer * 1000;
+		data->m_data.out_power.angle = F_Angle *1000;
 	}else
 	{
-		data->m_data.out_power.voltage = ele.voltage * 1000;
-		data->m_data.out_power.freq = ele.freq * 1000;
+		data->m_data.input[channel-1].voltage = F_AC_V * 1000;
+		data->m_data.input[channel-1].freq = F_AC_LINE_Freq * 1000;
 	}
 }
 
@@ -73,6 +85,10 @@ static void check_voltage_max(uint8_t channel)
 			if(data->m_data.out_power.voltage > data->m_data.output_th.voltage_max)
 			{
 				SET_WANNING_VOLTAGE_MAX(data->m_data.output_waning.waning);
+				if(IS_OVERFUNC_VOLTAGE_MAX(data->m_data.over_func))
+				{
+					data->close_output();
+				}
 			}else
 			{
 				UNSET_WANNING_VOLTAGE_MAX(data->m_data.output_waning.waning);
@@ -102,6 +118,10 @@ static void check_voltage_min(uint8_t channel)
 			if(data->m_data.out_power.voltage < data->m_data.output_th.voltage_min)
 			{
 				SET_WANNING_VOLTAGE_MIN(data->m_data.output_waning.waning);
+				if(IS_OVERFUNC_VOLTAGE_MIN(data->m_data.over_func))
+				{
+					data->close_output();
+				}
 			}else
 			{
 				UNSET_WANNING_VOLTAGE_MIN(data->m_data.output_waning.waning);
@@ -132,6 +152,10 @@ static void check_current_max(uint8_t channel)
 			if(data->m_data.out_power.current > data->m_data.output_th.current_max)
 			{
 				SET_WANNING_CURRENT_MAX(data->m_data.output_waning.waning);
+				if(IS_OVERFUNC_CURRENT_MAX(data->m_data.over_func))
+				{
+					data->close_output();
+				}
 			}else
 			{
 				UNSET_WANNING_CURRENT_MAX(data->m_data.output_waning.waning);
@@ -149,6 +173,10 @@ static void check_power_max(uint8_t channel)
 			if(data->m_data.out_power.power > data->m_data.output_th.power_max)
 			{
 				SET_WANNING_POWER_MAX(data->m_data.output_waning.waning);
+				if(IS_OVERFUNC_POWER_MAX(data->m_data.over_func))
+				{
+					data->close_output();
+				}
 			}else
 			{
 				UNSET_WANNING_POWER_MAX(data->m_data.output_waning.waning);
@@ -166,6 +194,10 @@ static void check_consumer_max(uint8_t channel)
 			if(data->m_data.out_power.consumer > data->m_data.output_th.consumer_max)
 			{
 				SET_WANNING_CONSUMER_MAX(data->m_data.output_waning.waning);
+				if(IS_OVERFUNC_CONSUMER_MAX(data->m_data.over_func))
+				{
+					data->close_output();
+				}
 			}else
 			{
 				UNSET_WANNING_CONSUMER_MAX(data->m_data.output_waning.waning);

+ 54 - 32
control/STS/HARDWARE/Exti/Exti.c

@@ -3,20 +3,20 @@
 #include "gd32e230x_conf.h"
 #include "main.h"
 
-#define INPUT_PIN_1   GPIO_PIN_7
-#define INPUT_PIN_2   GPIO_PIN_8
+#define INPUT_PIN_1   GPIO_PIN_0
+#define INPUT_PIN_2   GPIO_PIN_1
 
-#define SWTICH_PIN    GPIO_PIN_5
+#define SWTICH_PIN    GPIO_PIN_9
 
-#define EXIT_INPUT_PIN_1  EXTI_SOURCE_PIN7
-#define EXIT_INPUT_PIN_2 	EXTI_SOURCE_PIN8
+#define EXIT_INPUT_PIN_1  EXTI_SOURCE_PIN0
+#define EXIT_INPUT_PIN_2 	EXTI_SOURCE_PIN1
 
-#define SWITCH_INPUT_PIN  EXTI_SOURCE_PIN5
+#define SWITCH_INPUT_PIN  EXTI_SOURCE_PIN9
 
-#define INPUT_EXIT_1 			EXTI_7
-#define INPUT_EXIT_2      EXTI_8
+#define INPUT_EXIT_1 			EXTI_0
+#define INPUT_EXIT_2      EXTI_1
 
-#define SWITCH_EXTI       EXTI_5
+#define SWITCH_EXTI       EXTI_9
 
 
 static void read_input_level(uint8_t channel);
@@ -25,25 +25,26 @@ static void read_switch_level();
 
 void sts_exti_init(void)
 {
+	rcu_periph_clock_enable(RCU_GPIOA);
 	rcu_periph_clock_enable(RCU_GPIOB);
 	rcu_periph_clock_enable(RCU_CFGCMP);
 	//rcu_periph_clock_enable(RCU_AF);
 	
-	gpio_mode_set(GPIOB,GPIO_MODE_INPUT,GPIO_PUPD_NONE,INPUT_PIN_1);
-	gpio_mode_set(GPIOB,GPIO_MODE_INPUT,GPIO_PUPD_NONE,INPUT_PIN_2);
+	gpio_mode_set(GPIOA,GPIO_MODE_INPUT,GPIO_PUPD_NONE,INPUT_PIN_1);
+	gpio_mode_set(GPIOA,GPIO_MODE_INPUT,GPIO_PUPD_NONE,INPUT_PIN_2);
 	gpio_mode_set(GPIOB,GPIO_MODE_INPUT,GPIO_PUPD_NONE,SWTICH_PIN);
-	
+//	nvic_irq_enable(EXTI0_1_IRQn,0);
 	nvic_irq_enable(EXTI4_15_IRQn,0);
-	syscfg_exti_line_config(EXTI_SOURCE_GPIOB,EXIT_INPUT_PIN_1);
-	syscfg_exti_line_config(EXTI_SOURCE_GPIOB,EXIT_INPUT_PIN_2);
+//	syscfg_exti_line_config(EXTI_SOURCE_GPIOA,EXIT_INPUT_PIN_1);
+//	syscfg_exti_line_config(EXTI_SOURCE_GPIOA,EXIT_INPUT_PIN_2);
 	syscfg_exti_line_config(EXTI_SOURCE_GPIOB,SWITCH_INPUT_PIN);
-	
-	exti_init(INPUT_EXIT_1,EXTI_INTERRUPT,EXTI_TRIG_BOTH);
-	exti_init(INPUT_EXIT_2,EXTI_INTERRUPT,EXTI_TRIG_BOTH);
+//	
+//	exti_init(INPUT_EXIT_1,EXTI_INTERRUPT,EXTI_TRIG_BOTH);
+//	exti_init(INPUT_EXIT_2,EXTI_INTERRUPT,EXTI_TRIG_BOTH);
 	exti_init(SWITCH_EXTI,EXTI_INTERRUPT,EXTI_TRIG_BOTH);
-	
-	exti_interrupt_flag_clear(INPUT_EXIT_1);
-	exti_interrupt_flag_clear(INPUT_EXIT_2);
+//	
+//	exti_interrupt_flag_clear(INPUT_EXIT_1);
+//	exti_interrupt_flag_clear(INPUT_EXIT_2);
 	exti_interrupt_flag_clear(SWITCH_EXTI);
 	
 	sts_data_t * data = get_sts();
@@ -55,11 +56,21 @@ void sts_exti_init(void)
 
 uint8_t get_exti_in_1(void)
 {
-	return gpio_input_bit_get(GPIOB,INPUT_PIN_1);
+
+	if(gpio_input_bit_get(GPIOA,INPUT_PIN_1))
+	{
+		return 1;
+	}else 
+		return 0;
+	
 }
 uint8_t get_exti_in_2(void)
 {
-	return gpio_input_bit_get(GPIOB,INPUT_PIN_2);
+	if(gpio_input_bit_get(GPIOA,INPUT_PIN_2))
+	{
+		return 1;
+	}else 
+		return 0;
 }
 
 
@@ -86,7 +97,11 @@ static void read_input_level(uint8_t channel)
 
 uint8_t get_exti_switch(void)
 {
-	return gpio_input_bit_get(GPIOB,SWTICH_PIN);
+	if(gpio_input_bit_get(GPIOB,SWTICH_PIN))
+	{
+		return 1;
+	}else 
+		return 0;
 }
 
 static void read_switch_level()
@@ -95,40 +110,47 @@ static void read_switch_level()
 	data->switch_status = get_exti_switch();
 }
 
-
-void EXTI4_15_IRQHandler(void)
+void EXTI0_1_IRQHandler(void)
 {
 	sts_data_t * data = get_sts();
 	if(RESET != exti_interrupt_flag_get(INPUT_EXIT_1))
 	{
+		exti_interrupt_flag_clear(INPUT_EXIT_1);
 		if(get_exti_in_1() == SET) 					//rising
-		{
-			data->m_data.input_status.input_status[INPUT_CHANNEL_1] = 1;
-		}else																//falling
 		{
 			data->m_data.input_status.input_status[INPUT_CHANNEL_1] = 0;
 			if(data->m_data.input_status.input_status[INPUT_CHANNEL_2])
 			{
 				data->choise_input(INPUT_CHANNEL_2);
 			}
+			
+		}else																//falling
+		{
+			data->m_data.input_status.input_status[INPUT_CHANNEL_1] = 1;
 		}
-		exti_interrupt_flag_clear(INPUT_EXIT_1);
+		
 	}
 	if(RESET != exti_interrupt_flag_get(INPUT_EXIT_2))
 	{
 		if(get_exti_in_2() == SET)				//rising
-		{
-			data->m_data.input_status.input_status[INPUT_CHANNEL_2] = 1;
-		}else																//falling
 		{
 			data->m_data.input_status.input_status[INPUT_CHANNEL_2] = 0;
 			if(data->m_data.input_status.input_status[INPUT_CHANNEL_1])
 			{
 				data->choise_input(INPUT_CHANNEL_1);
 			}
+		}else																//falling
+		{
+
+			data->m_data.input_status.input_status[INPUT_CHANNEL_2] = 1;
 		}
 		exti_interrupt_flag_clear(INPUT_EXIT_2);
 	}
+}
+void EXTI4_15_IRQHandler(void)
+{
+	sts_data_t * data = get_sts();
+
 	if(RESET != exti_interrupt_flag_get(SWITCH_EXTI))
 	{
 		if(get_exti_switch() == SET)     //rising

+ 9 - 9
control/STS/HARDWARE/Hlw8110/Hlw8110.c

@@ -463,23 +463,23 @@ unsigned char Judge_CheckSum_HLW8110_Calfactor(void)
 void Init_HLW8110(void)
 {
 	Uart_HLW8110_WriteREG_EN();
-	DelayNms(10);
+	DelayNms(20);
 	
 //电流通道A设置命令,指定当前用于计算视在功率、功率因数、相角、瞬时有功功率、瞬时视在功率和有功功率过载的信号指示 的通道为通道A	
 	Uart_HLW8110_Set_Channel_A();			
-	DelayNms(10);
+	DelayNms(20);
 	Uart_Write_HLW8110_Reg(REG_SYSCON_ADDR,2,0x0a04);	//开启A通道,关闭B通道,电压通道PGA = 1,电流通道PGA = 16
-	DelayNms(10);
+	DelayNms(20);
 	
 	Uart_Write_HLW8110_Reg(REG_EMUCON_ADDR,2,0x0001);	//1,使能PFA 脉冲输出和有功电能寄存器累加;
-	DelayNms(10);
-	Uart_Write_HLW8110_Reg(REG_EMUCON_ADDR,2,0x0001);
-	DelayNms(10);
+	DelayNms(20);
+//	Uart_Write_HLW8110_Reg(REG_EMUCON_ADDR,2,0x0001);
+//	DelayNms(20);
 //	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(10);
+//	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(10);
+	DelayNms(20);
 	
 	Uart_HLW8110_WriteREG_DIS();
 //	DelayNms(3);	

+ 1 - 1
control/STS/HARDWARE/I2c/I2c.c

@@ -104,7 +104,7 @@ static  void  SetI2CSDAAsOutput(void)
 {
   gpio_mode_set(GPIOF, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_0);           //设置PF0为输出模式
   gpio_output_options_set(GPIOF, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0); //设置输出模式及速度
-  //gpio_bit_set(GPIOF, GPIO_PIN_7);                                              //状态默认设置为高电平
+  gpio_bit_set(GPIOF, GPIO_PIN_0);                                              //状态默认设置为高电平
 }
 
 /*********************************************************************************************************

+ 4 - 1
control/STS/HARDWARE/Led/Led.c

@@ -11,6 +11,7 @@
 
 #include "Led.h"
 #include "gd32e230x_conf.h"
+#include "main.h"
 
 static void ConfigLEDGPIO(void);  
 
@@ -28,7 +29,9 @@ static void ConfigLEDGPIO(void)
 }
 void InitLED(void)
 {
-  ConfigLEDGPIO();  
+  ConfigLEDGPIO(); 
+	sts_data_t *data = get_sts();
+	data->led_flash = LEDFlicker2;
 }
 
 void LEDFlicker1(unsigned short cnt)

+ 10 - 5
control/STS/HARDWARE/Relay/Relay.c

@@ -12,6 +12,7 @@
 #include "Sn74lvc573.h"
 #include "R_Led.h"
 #include "main.h"
+#include "SysTick.h"
 
 #define RELAY_1  GPIO_PIN_3
 #define RELAY_2  GPIO_PIN_4
@@ -36,7 +37,8 @@ static void ConfigRelayGPIO(void)
 void InitRelay(void)
 {
 	Init74Lvc();
-  ConfigRelayGPIO();  
+  ConfigRelayGPIO(); 
+	r_led_init();	
 	sts_data_t *data = get_sts();
 	data->choise_input = choise_input;
 	data->open_output = out_open;
@@ -52,20 +54,23 @@ void choise_input(uint8_t channel)
 	{
 		case 0:
 		{
-			unlock();
+			
 			gpio_bit_reset(GPIOB, RELAY_1);
-			lock();
+			
 			data->m_data.md_choise.choise_ch = INPUT_CHANNEL_1;
 			in_r_led_on_off(channel);
+			unlock();
+			lock();
 		}
 		break;
 		case 1:
 		{
-			unlock();
+			
 			gpio_bit_set(GPIOB, RELAY_1);
-			lock();
 			data->m_data.md_choise.choise_ch = INPUT_CHANNEL_2;
 			in_r_led_on_off(channel);
+			unlock();
+			lock();
 		}
 		break;
 		default:

+ 25 - 28
control/STS/HARDWARE/Temprature/Temprature.c

@@ -21,55 +21,52 @@
 *****************************************************************/
 static float get_temp(void);
 
-#define GATHER_MAX  200
+#define GATHER_MAX  2000
 #define VREF        33
 
 #define V_HOT(ad) (((ad * 1000)>>12) * VREF / 10.0 /1000.0) 
 
 #define R_HOT(ad) ((V_HOT(ad)*10000.0) / ((VREF/10.0)-(2.0*V_HOT(ad))))
 
-#define T_TEMP(res) ((662.666 - (45.389 * log10(res)) + (0.069 * log10(res)*log10(res)*log10(res))) - 273.15)
+#define T_TEMP(res) ((662.666 - (45.389 * log(res)) + (0.069 * log(res)*log(res)*log(res))) - 273.15)
+
+//static uint32_t gather_count = 0;
+
+//static uint32_t all_get_ad = 0;
 
-static uint32_t gather_count = 0;
 
-static uint32_t all_get_ad = 0;
 
 static float get_temp(void)
 {
 	sts_data_t *data = get_sts();
 	uint32_t all_get_ad = 0;	
 	float temprature = 0.0;
-	if(gather_count < GATHER_MAX)
+	
+	for(uint32_t i = 0; i < GATHER_MAX ;i++)
 	{
-		
 		all_get_ad += get_adc();
-		gather_count++;
-	}else
-	{
-		all_get_ad /= GATHER_MAX;
-		
-		float v_hot = V_HOT(all_get_ad);
-		if((uint32_t)((v_hot)*100) < 165)
+	}
+	all_get_ad /= GATHER_MAX;
+	float v_hot = V_HOT(all_get_ad);
+	if(v_hot < 3.3)
+	{	
+		float i_current = (3.3 - v_hot) / (10000);
+		float res = v_hot / i_current;
+		temprature = T_TEMP(res);
+		if(((uint32_t)res)>=598 && ((uint32_t)res) <= 197000)
 		{
-			float res = ((v_hot)*10000) / (3.3 - 2 * v_hot);
-			if(res>=598 && res <= 197000)
-			{
-				temprature = T_TEMP(res);
-				data->temp_online_flag = TEMP_ONLINE;
-			}else
-			{
-				data->temp_online_flag = TEMP_INLINE;
-			}
+					data->m_data.temprature_flag  = TEMP_ONLINE;
+					data->m_data.temprature = temprature * 100;
 		}else
 		{
-			temprature = 0.0;
-			data->temp_online_flag = TEMP_INLINE;
+					data->m_data.temprature_flag = TEMP_INLINE;
+			data->m_data.temprature =(-88.88 *100);
 		}
-		
-		gather_count = 0;
-		all_get_ad = 0;
+	}else
+	{
+		data->m_data.temprature_flag = TEMP_INLINE;
+		data->m_data.temprature =(-88.88 *100);
 	}
-	data->temprature = temprature;
 	return temprature;
 }
 

+ 2 - 0
control/STS/HARDWARE/Uart1/Uart1.c

@@ -178,10 +178,12 @@ void select_channel(uint8_t chx)
 			SEL0_H;
 			SEL1_L;
 			SEL2_L;
+		break;
 		case 2:
 			SEL0_L;
 			SEL1_H;
 			SEL2_L;
+		break;
 		default:
 			break;
 	}

+ 71 - 4
control/STS/MODBUS/BARE/port/port.c

@@ -184,14 +184,19 @@ eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegi
 							{
 								uint16_t recive = 0;
 								memcpy(&recive,&usRegHoldBuf[WiRegIndex],WusNRegs*2);
-								if(recive > 0)
+								if(recive == 1)
 								{
+									t_data->write_at24(IIC_OUT_CHANNEL,&recive,sizeof(recive));
 									t_data->open_output();
-								}else
+								}else if(recive == 0)
 								{
 									t_data->close_output();
+									t_data->write_at24(IIC_OUT_CHANNEL,&recive,sizeof(recive));
+								}else
+								{
+									eStatus = MB_ENOREG;
 								}
-								t_data->write_at24(IIC_OUT_CHANNEL,recive,sizeof(recive));
+								
 							}else if(usAddress == STS_CHOISE_INPUT)
 							{
 								uint16_t recive = 0;
@@ -209,13 +214,75 @@ eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegi
 								uint16_t *p_start = &(data->input_th[0].voltage_max);
 								memcpy(p_start+WeeiRegIndex,&usRegHoldBuf[WiRegIndex],WusNRegs*2);
 								t_data->write_at24(IIC_INPUT_THRESHOLD_START+(WeeiRegIndex*2),&usRegHoldBuf[WiRegIndex],WusNRegs*2);
-								
+								for(int i =0 ; i < 2; i++) {
+									if(data->input_th[i].voltage_max <= SMALL_VALUE)
+										UNSET_VOLTAGE_MAX_EN(t_data->input_wanning_en[i]);
+									else
+										SET_VOLTAGE_MAX_EN(t_data->input_wanning_en[i]);
+									
+									if(data->input_th[i].voltage_min <= SMALL_VALUE)
+										UNSET_VOLTAGE_MIN_EN(t_data->input_wanning_en[i]);
+									else
+										SET_VOLTAGE_MIN_EN(t_data->input_wanning_en[i]);		
+									
+									if(data->input_th[i].freq_max <= SMALL_VALUE)
+										UNSET_FREQ_MAX_EN(t_data->input_wanning_en[i]);
+									else
+										SET_FREQ_MAX_EN(t_data->input_wanning_en[i]);	
+
+									if(data->input_th[i].freq_min <= SMALL_VALUE)
+										UNSET_FREQ_MIN_EN(t_data->input_wanning_en[i]);
+									else
+										SET_FREQ_MIN_EN(t_data->input_wanning_en[i]);
+								}
 							}else if(usAddress >= STS_OUTPUT_THRESHOLD  && usAddress < STS_TEMP_THRESHOLD)
 							{
+								WeeiRegIndex = (uint16_t)(usAddress - STS_OUTPUT_THRESHOLD);
+								uint16_t *p_start = &data->output_th;
+								memcpy(p_start+WeeiRegIndex,&usRegHoldBuf[WiRegIndex],WusNRegs*2);
+								t_data->write_at24(IIC_OUTPUT_THRESHOLD_START+(WeeiRegIndex*2),&usRegHoldBuf[WiRegIndex],WusNRegs*2);
+								if(data->output_th.voltage_max <= SMALL_VALUE)
+									UNSET_VOLTAGE_MAX_EN(t_data ->output_wanning_en);
+								else
+									SET_VOLTAGE_MAX_EN(t_data ->output_wanning_en);
+								
+								if(data->output_th.voltage_min <= SMALL_VALUE)
+									UNSET_VOLTAGE_MIN_EN(t_data ->output_wanning_en);
+								else
+									SET_VOLTAGE_MIN_EN(t_data ->output_wanning_en);
+
+								if(data->output_th.current_max <= SMALL_VALUE)
+									UNSET_CURRENT_MAX_EN(t_data ->output_wanning_en);
+								else
+									SET_CURRENT_MAX_EN(t_data ->output_wanning_en);
+
+								if(data->output_th.power_max <= SMALL_VALUE)
+									UNSET_POWER_MAX_EN(t_data ->output_wanning_en);
+								else
+									SET_POWER_MAX_EN(t_data ->output_wanning_en);
+
+								if(data->output_th.consumer_max <= SMALL_VALUE)
+									UNSET_CONSUMER_MAX_EN(t_data ->output_wanning_en);
+								else
+									SET_CONSUMER_MAX_EN(t_data ->output_wanning_en);	
+								
 							}else if(usAddress >= STS_TEMP_THRESHOLD && usAddress < STS_OVER_FUNC)
 							{
+								WeeiRegIndex = (uint16_t)(usAddress - STS_TEMP_THRESHOLD);
+								uint16_t *p_start = &data->temprature_th;
+								memcpy(p_start+WeeiRegIndex,&usRegHoldBuf[WiRegIndex],WusNRegs*2);
+								t_data->write_at24(IIC_TEMPRATURE_THRESHOLD_START+(WeeiRegIndex*2),&usRegHoldBuf[WiRegIndex],WusNRegs*2);
 							}else if(usAddress == STS_OVER_FUNC)
 							{
+								uint16_t recive = 0;
+								if(recive > 0x003F)
+								{
+									eStatus = MB_ENOREG;
+								}else{
+									memcpy(&recive,&usRegHoldBuf[WiRegIndex],WusNRegs*2);
+									t_data->m_data.over_func = recive;
+									t_data->write_at24(IIC_OVER_FUNC_START,&recive,sizeof(recive));
+								}
 							}else
 							{
 								eStatus = MB_ENOREG;

+ 1 - 1
control/STS/MODBUS/BARE/port/portserial.c

@@ -72,7 +72,7 @@ vMBPortSerialEnable( BOOL xRxEnable, BOOL xTxEnable )
 BOOL
 xMBPortSerialInit( UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits, eMBParity eParity )
 {
-	nvic_irq_enable(USART0_IRQn, 0);     //使能串口中断,设置优先级
+	nvic_irq_enable(USART0_IRQn, 1);     //使能串口中断,设置优先级
   rcu_periph_clock_enable(RCU_GPIOA);  //使能GPIOA时钟
 
   //配置TX的GPIO 

Plik diff jest za duży
+ 1796 - 109
control/STS/PRJ/sts.uvguix.Gowon


+ 56 - 4
control/STS/PRJ/sts.uvoptx

@@ -103,7 +103,7 @@
         <bEvRecOn>1</bEvRecOn>
         <bSchkAxf>0</bSchkAxf>
         <bTchkAxf>0</bTchkAxf>
-        <nTsel>13</nTsel>
+        <nTsel>4</nTsel>
         <sDll></sDll>
         <sDllPa></sDllPa>
         <sDlgDll></sDlgDll>
@@ -114,9 +114,29 @@
         <tDlgDll></tDlgDll>
         <tDlgPa></tDlgPa>
         <tIfile></tIfile>
-        <pMon>BIN\UL2V8M.DLL</pMon>
+        <pMon>Segger\JL2CM3.dll</pMon>
       </DebugOpt>
       <TargetDriverDllRegistry>
+        <SetRegEntry>
+          <Number>0</Number>
+          <Key>DLGTARM</Key>
+          <Name>(6010=-1,-1,-1,-1,0)(6018=-1,-1,-1,-1,0)(6019=-1,-1,-1,-1,0)(6008=-1,-1,-1,-1,0)(6009=-1,-1,-1,-1,0)(6014=-1,-1,-1,-1,0)(6015=-1,-1,-1,-1,0)(6003=-1,-1,-1,-1,0)(6000=-1,-1,-1,-1,0)</Name>
+        </SetRegEntry>
+        <SetRegEntry>
+          <Number>0</Number>
+          <Key>ARMDBGFLAGS</Key>
+          <Name></Name>
+        </SetRegEntry>
+        <SetRegEntry>
+          <Number>0</Number>
+          <Key>DLGUARM</Key>
+          <Name>?</Name>
+        </SetRegEntry>
+        <SetRegEntry>
+          <Number>0</Number>
+          <Key>JL2CM3</Key>
+          <Name>-U69545260 -O78 -S5 -ZTIFSpeedSel1000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(0BF11477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8001 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0GD32E23x.FLM -FS08000000 -FL010000 -FP0($$Device:GD32E230C8$Flash\GD32E23x.FLM)</Name>
+        </SetRegEntry>
         <SetRegEntry>
           <Number>0</Number>
           <Key>UL2V8M</Key>
@@ -124,18 +144,50 @@
         </SetRegEntry>
       </TargetDriverDllRegistry>
       <Breakpoint/>
+      <WatchWindow1>
+        <Ww>
+          <count>0</count>
+          <WinNumber>1</WinNumber>
+          <ItemText>retry</ItemText>
+        </Ww>
+        <Ww>
+          <count>1</count>
+          <WinNumber>1</WinNumber>
+          <ItemText>ADC_RDATA</ItemText>
+        </Ww>
+        <Ww>
+          <count>2</count>
+          <WinNumber>1</WinNumber>
+          <ItemText>temprature</ItemText>
+        </Ww>
+        <Ww>
+          <count>3</count>
+          <WinNumber>1</WinNumber>
+          <ItemText>data-&gt;temprature</ItemText>
+        </Ww>
+        <Ww>
+          <count>4</count>
+          <WinNumber>1</WinNumber>
+          <ItemText>sts_data_t</ItemText>
+        </Ww>
+        <Ww>
+          <count>5</count>
+          <WinNumber>1</WinNumber>
+          <ItemText>sts_data</ItemText>
+        </Ww>
+      </WatchWindow1>
       <Tracepoint>
         <THDelay>0</THDelay>
       </Tracepoint>
       <DebugFlag>
         <trace>0</trace>
         <periodic>1</periodic>
-        <aLwin>0</aLwin>
+        <aLwin>1</aLwin>
         <aCover>0</aCover>
         <aSer1>0</aSer1>
         <aSer2>0</aSer2>
         <aPa>0</aPa>
-        <viewmode>0</viewmode>
+        <viewmode>1</viewmode>
         <vrSel>0</vrSel>
         <aSym>0</aSym>
         <aTbox>0</aTbox>

+ 1 - 1
control/STS/PRJ/sts.uvprojx

@@ -313,7 +313,7 @@
           </ArmAdsMisc>
           <Cads>
             <interw>1</interw>
-            <Optim>2</Optim>
+            <Optim>0</Optim>
             <oTime>0</oTime>
             <SplitLS>0</SplitLS>
             <OneElfS>1</OneElfS>

+ 45 - 14
control/STS/USER/main.c

@@ -15,6 +15,12 @@
 #include "Mb.h"
 
 
+#define VERSION  "V1.0.0.0"
+
+#define UNIQU_1                       			0x1FFFF7AC
+#define UNIQU_2                       			0x1FFFF7B0
+#define UNIQU_3                       			0x1FFFF7B4
+
 sts_data_t  sts_data;
 
 
@@ -33,6 +39,7 @@ int main()
 	InitKey();
 	InitLED();
 	InitTimer();
+	InitRelay();
 	
 	fans_init();
 	beep_init();
@@ -45,14 +52,23 @@ int main()
 	uint8_t md_addr = ReadKeyValue();
 	eMBInit(MB_RTU,md_addr,0,115200,MB_PAR_NONE);
 	eMBEnable();
+	strcpy(sts_data.m_data.info.date,__DATE__);
+	strcat(sts_data.m_data.info.date," ");
+	strcat(sts_data.m_data.info.date,__TIME__);
+	strcpy(sts_data.m_data.info.ver,VERSION);
+	sts_data.m_data.dev |= (STS_TYPE << 8);
 	
-	Fwdgt_Init();
+	sts_data.m_data.info.uniq_ID_64_95 						= *(uint32_t*)(UNIQU_3);
+	sts_data.m_data.info.uniq_ID_32_63 						= *(uint32_t*)(UNIQU_2);
+	sts_data.m_data.info.uniq_ID_00_31 						= *(uint32_t*)(UNIQU_1);
+//	Fwdgt_Init();
 	
 	sts_data.read_input_level(INPUT_CHANNEL_1);
 	sts_data.read_input_level(INPUT_CHANNEL_2);
 	sts_data.read_switch_level();
-	
-	
+	sts_data.m_data.input_status.input_status[INPUT_CHANNEL_1] = 1;						//test
+	sts_data.m_data.input_status.input_status[INPUT_CHANNEL_2] = 1;						//test
+	sts_data.read_eeprom();
 	if(sts_data.switch_status == INPUT_CHANNEL_1 && 
 			sts_data.m_data.input_status.input_status[INPUT_CHANNEL_1])
 	{
@@ -69,8 +85,9 @@ int main()
 		sts_data.close_output();
 	}
 	uint8_t channel = CH448_CHANNEL_1;
+	uint8_t write_errp_count = 0;
 	while(1){
-		Fwdgt_reload();
+	//	Fwdgt_reload();
 		eMBPoll();
 		sts_data.read_temp();
 		// read consumer
@@ -78,21 +95,29 @@ int main()
 		{
 			sts_data.flag_1000ms = 0;
 			sts_data.led_flash();
+			write_errp_count++;
 			if(sts_data.beep_flag)
 			{
 				sts_data.beep();
+			}else
+			{
+				sts_data.clear_beep();
 			}
 		}
+		if(write_errp_count >= 10)
+		{
+			write_errp_count = 0;
+			sts_data.write_at24(IIC_CONSUMER_START,&sts_data.iic_consumer,sizeof(sts_data.iic_consumer));
+		}
 		if(sts_data.flag_100ms)
 		{
 			sts_data.flag_100ms = 0;
 			sts_data.read_ele(channel);
-			//
 			sts_data.check_wanning(channel);
 			channel ++;
 		}
 		
-		if(channel == CH448_CHANNEL_3)
+		if(channel == CH448_CHANNEL_NONE)
 		{
 			//check input and is or not swtict input 
 			if((sts_data.m_data.input_status.input_status[INPUT_CHANNEL_1]) && 
@@ -113,11 +138,15 @@ int main()
 					}
 				}else if(sts_data.m_data.md_choise.choise_ch == INPUT_CHANNEL_2)
 				{
-					if(STS_INPUT_HAS_WANNING(sts_data.m_data.input_wanning.waning[INPUT_CHANNEL_1]))
+					if(STS_INPUT_HAS_WANNING(sts_data.m_data.input_wanning.waning[INPUT_CHANNEL_2]))
 					{
-						if(sts_data.m_data.out_status == OUT_OPEN) sts_data.close_output();
-					}else {
-							sts_data.choise_input(INPUT_CHANNEL_1);
+							if(STS_INPUT_HAS_WANNING(sts_data.m_data.input_wanning.waning[INPUT_CHANNEL_1]))
+							{
+								if(sts_data.m_data.out_status == OUT_OPEN) sts_data.close_output();
+							}else
+							{
+								sts_data.choise_input(INPUT_CHANNEL_1);
+							}
 					}
 				}else
 				{
@@ -136,23 +165,25 @@ int main()
 				{
 					if(sts_data.m_data.out_status == OUT_OPEN) sts_data.close_output();
 				}
+			}else
+			{
+				sts_data.beep_flag = 1;
 			}
 			channel = CH448_CHANNEL_1;
 		}
-		if(sts_data.temp_online_flag == TEMP_ONLINE)
+		if(sts_data.m_data.temprature_flag == TEMP_ONLINE)
 		{
-			sts_data.m_data.temprature = sts_data.temprature * 100;
 			if(sts_data.m_data.temprature_th.fans_max_temp != 0 && sts_data.m_data.temprature_th.fans_min_temp != 0)
 			{
 				if(sts_data.m_data.temprature_th.fans_max_temp > sts_data.m_data.temprature_th.fans_min_temp)
 				{
-					if((uint16_t)(sts_data.temprature*100) >= sts_data.m_data.temprature_th.fans_max_temp)
+					if((int16_t)(sts_data.m_data.temprature) >= sts_data.m_data.temprature_th.fans_max_temp)
 					{
 						if(sts_data.m_data.fans_status != FANS_ON)
 						{
 							sts_data.fans(FANS_ON);
 						}
-					}else if((uint16_t)(sts_data.temprature*100) <= sts_data.m_data.temprature_th.fans_min_temp)
+					}else if((int16_t)(sts_data.m_data.temprature) <= sts_data.m_data.temprature_th.fans_min_temp)
 					{
 						if(sts_data.m_data.fans_status != FANS_OFF)
 						{

+ 15 - 8
control/STS/USER/main.h

@@ -23,11 +23,11 @@
 
 #define STS_INPUT_THRESHOLD   		(STS_CHOISE_INPUT + 1)
 
-#define STS_OUTPUT_THRESHOLD     	(STS_INPUT_THRESHOLD + 10)
+#define STS_OUTPUT_THRESHOLD     	(STS_INPUT_THRESHOLD + 16)
 
-#define STS_TEMP_THRESHOLD        (STS_OUTPUT_THRESHOLD + 2)
+#define STS_TEMP_THRESHOLD        (STS_OUTPUT_THRESHOLD + 10)
 
-#define STS_OVER_FUNC             (STS_TEMP_THRESHOLD +1)
+#define STS_OVER_FUNC             (STS_TEMP_THRESHOLD +2)
 
 
 
@@ -50,7 +50,7 @@
 #define IIC_OUT_CHANNEL                   (210)
 
 
-#define INVALID_VALUE                      (10000000)
+#define INVALID_VALUE                      (40000000000)
 #define SMALL_VALUE                        (500) 
 
 
@@ -65,6 +65,7 @@ enum {
 	CH448_CHANNEL_1 = 0,
 	CH448_CHANNEL_2,
 	CH448_CHANNEL_3,
+	CH448_CHANNEL_NONE,
 };
 
 
@@ -144,6 +145,15 @@ enum {
 																			|| (IS_WANNING_FREQ_MAX(reg)) || (IS_WANNING_FREQ_MIN(reg)) )
 
 
+
+
+#define IS_OVERFUNC_VOLTAGE_MAX(reg)          IS_VOLTAGE_MAX_EN(reg)
+#define IS_OVERFUNC_VOLTAGE_MIN(reg)					IS_VOLTAGE_MIN_EN(reg)
+#define IS_OVERFUNC_CURRENT_MAX(reg)					IS_CURRENT_MAX_EN(reg)
+#define IS_OVERFUNC_POWER_MAX(reg)						IS_POWER_MAX_EN(reg) 
+#define IS_OVERFUNC_CONSUMER_MAX(reg)         IS_CONSUMER_MAX_EN(reg)
+
+
 #pragma pack (2)
 
 typedef struct {
@@ -250,10 +260,6 @@ typedef struct sts_data sts_data_t;
 typedef struct sts_data{
 	uint8_t     flag_1000ms;
 	uint8_t     flag_100ms;
-	uint8_t     temp_online_flag;
-	uint8_t     count_start_flag;
-	uint8_t     switch_flag;
-	uint8_t     over_func_flag;
 	uint8_t     beep_flag;
 	uint8_t       switch_status;
 	md_data_t 						m_data;
@@ -269,6 +275,7 @@ typedef struct sts_data{
 	void (*read_switch_level)();
 	void (*fans)(uint8_t on_off);
 	void (*beep)();
+	void (*clear_beep)();
 	void (*led_flash)();
 	void (*read_eeprom)();
 	void (*read_at24)(uint16_t start,uint8_t *buff,uint16_t lenth);