Browse Source

控制北向和级联内存大小。

liyi 1 year ago
parent
commit
ab07be749c
4 changed files with 206 additions and 146 deletions
  1. 185 129
      f407/applications/cascade.c
  2. 13 13
      f407/applications/datadef.h
  3. 3 1
      f407/applications/main.c
  4. 5 3
      f407/applications/power.c

+ 185 - 129
f407/applications/cascade.c

@@ -29,6 +29,12 @@ typedef struct {
     
 }mb_handle_t;
 
+typedef struct {
+		union {
+		md_ac_dc_t ac_dc;
+		md_3_ac_t  ac_3; 
+	}data;
+}north_data_t;
 
 typedef struct cascade_info{
 	uint8_t  				saddr;
@@ -36,7 +42,7 @@ typedef struct cascade_info{
 	uint8_t 				md_type;
 	uint32_t        bund;
 	uint8_t         quit;
-	slave_info_t			info;
+	slave_info_t			*info;
 	lock_t 					lock;
 	mb_handle_t*           mb;
 	slave_t         slaves[CASCADE_MAX+1];
@@ -45,6 +51,7 @@ typedef struct cascade_info{
 //		md_ac_dc_t ac_dc;
 //		md_3_ac_t  ac_3; 
 //	}data;						//modbus to user
+	north_data_t *north;
 }cascade_handle_t;
 
 
@@ -131,7 +138,7 @@ static uint8_t master_scan(cascade_handle_t *cas)
 
 static int slave_get_info(cascade_handle_t *cas)
 {
-	slave_info_t *info=&cas->info;
+	slave_info_t *info=cas->info;
 	power_data_t power = power_data_get();
 
 	info->channels = power.chs-1 > 0 ? power.chs-1 :  power.chs;
@@ -178,6 +185,7 @@ static void slave_func(uint16_t reg,void *r_w_data,uint32_t lenth)
 	cmd_data_t *cmd=NULL;
 	mb_handle_t *handle = (mb_handle_t *)(slave_info.mb);
 	pthread_t id = 0;
+	power_data_t power = power_data_get();
 	switch (reg)
 	{
 		case CASCADE_REG_SCAN:
@@ -239,15 +247,21 @@ static void slave_func(uint16_t reg,void *r_w_data,uint32_t lenth)
 			{
 				case CASCADE_CMD_GET_INFO:
 				{
-					//LOGD("____read_____ %d\n",lenth);
-					my_memcpy_byte(r_w_data,(void*)&slave_info.info+sendlen,lenth*2);
+					LOGD("____read_____  %d,sendlen = %d size=%d\n",lenth,sendlen,sizeof(power_ch_t)*4);
+					//my_memcpy_byte(r_w_data,(void*)&slave_info.info+sendlen,lenth*2);
+					uint8_t * base_addr = (uint8_t *)&power.pch[1];
+					my_memcpy_byte(r_w_data,base_addr+sendlen,lenth*2);
 					memswap(r_w_data,lenth*2);
 					
 				}
 					break;
 				case CASCADE_CMD_QUERY_CH:
 				{
-					my_memcpy_byte(r_w_data,(void*)&slave_info.info+sendlen,lenth*2);
+					//my_memcpy_byte(r_w_data,(void*)&slave_info.info+sendlen,lenth*2);
+					//power_data_t power = power_data_get();
+					uint8_t * base_addr = (uint8_t *)&power.pch[1];
+					//my_memcpy_byte(r_w_data,&power.pch[1]+sendlen,lenth*2);
+					my_memcpy_byte(r_w_data,base_addr+sendlen,lenth*2);
 					memswap(r_w_data,lenth*2);
 				}
 					break;
@@ -455,24 +469,48 @@ static int master_cmd(cascade_handle_t *cas,uint8_t cur_dev_addr ,cmd_data_t *cm
             wdata.dlen = sizeof(cmd_data_t);
             wdata.data = (uint8_t*)cmd;
 
-            rdata.dlen = sizeof(slave_info_t)-sizeof(power_ch_t)*SLAVE_CH_MAX;
-            rdata.data = (uint8_t*)&cas->info;
-
-            r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
-            if(r==0) {
-                rdata.dlen = sizeof(slave_info_t)-sizeof(power_ch_t)*(SLAVE_CH_MAX - cas->info.channels);
-                rdata.data = (uint8_t*)&cas->info;
-                r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
-                if(r==0) {
+//            rdata.dlen = sizeof(slave_info_t)-sizeof(power_ch_t)*SLAVE_CH_MAX;
+//            rdata.data = (uint8_t*)cas->info;
+						uint16_t value = 0;
+						r = mb_read(cas->mb,cur_dev_addr,4000,&value,1,100);//获取通道数
+            //r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
+						LOGD("r = %d  value=%d\n",r,value);
+            if(r == 1)
+						{
+							uint8_t chanels = value & 0xff;
+							if(chanels == 0)
+							{
+								cas->info->channels = 0;
+								LOGD("can not get cannes!!!\n");
+							}else
+							{
+								cas->info->channels = chanels;
+								//rdata.dlen = sizeof(slave_info_t) -sizeof(power_ch_t)*(SLAVE_CH_MAX - cas->info.channels);
+                rdata.dlen = sizeof(power_ch_t)*cas->info->channels;
+								rdata.data = (uint8_t*)&(cas->info->ch);
+								r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
+								if(r==0) {
 
                 }else
 								{
 									 LOGE("_____ master CASCADE_CMD_GET_INFO read failed\n");
 								}
-            }
-            else {
-                LOGE("_____ master CASCADE_CMD_GET_INFO failed\n");
-            }
+							}
+						}
+//						if(r==0) {
+//                rdata.dlen = sizeof(slave_info_t)-sizeof(power_ch_t)*(SLAVE_CH_MAX - cas->info.channels);
+//                rdata.data = (uint8_t*)&cas->info;
+//                r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
+//                if(r==0) {
+
+//                }else
+//								{
+//									 LOGE("_____ master CASCADE_CMD_GET_INFO read failed\n");
+//								}
+//            }
+//            else {
+//                LOGE("_____ master CASCADE_CMD_GET_INFO failed\n");
+//            }
         }
         break;
         case CASCADE_CMD_BREAKER_GET_INFO:
@@ -530,10 +568,27 @@ uint8_t cascade_init(const char* uart,uint8_t mode,uint8_t addr,uint32_t baud)
 		mb_set_cb_table(slave_info.mb->hinst,&mb_table);
 		func.slave_func = slave_func;
 		mb_set_cb_cascade(slave_info.mb->hinst,&func);
+		slave_info.north = (north_data_t *)malloc(sizeof(north_data_t));
+		if(slave_info.north == NULL)
+		{
+			LOGE("can't malloc to large memery!!!\n");
+			return -1;
+		}
+		memset(slave_info.north,0,sizeof(north_data_t));
+	}else if(para.mode == MB_MODE_MASTER)
+	{
+		slave_info.info = (slave_info_t *) malloc(sizeof(slave_info_t));
+		if(slave_info.info == NULL)
+		{
+			LOGE("can't malloc to large slave_info.info memery!!!\n");
+			return -1;
+		}
+		memset(slave_info.info,0,sizeof(slave_info_t));
 	}
 
 	slave_info.quit = 0;
-	slave_info.read_addr = 1;
+	if(para.mode == MB_MODE_MASTER)
+		slave_info.read_addr = 1;
 	
 	LOGD("uart: %s mode: %d addr: %d bound: %d\n",uart,slave_info.md_type,slave_info.saddr,para.para.rtu.baudrate);
 	LOGD("scan thread!!!\n");
@@ -566,82 +621,83 @@ void cascade_scan_thread(void *arg)
 			sleep(1);
 		}else	//做从机//拷贝数据到北向
 		{
-//			paras_data_t* p_data = paras_get();
-//			power_data_t power = power_data_get();
-//			
-//			if(p_data->prod.type == PDU_AC_I1O1 || p_data->prod.type == PDU_DC_I1O1)
-//			{
-//				int channels = power.chs > 0 ? power.chs - 1: 0;
-//				slave_info.data.ac_dc.dev_cnt = (p_data->prod.type << 8 | channels);
-//				int cnt = power.chs > 64 ? 64 : channels;
-//				//电量信息
-//				for(int i = 0; i < cnt;i++)
-//				{
-//					slave_info.data.ac_dc.power[i].voltage 	= power.pch[i].power[0].voltage *1000;
-//					slave_info.data.ac_dc.power[i].current 	= power.pch[i].power[0].current *1000;
-//					slave_info.data.ac_dc.power[i].power 		= power.pch[i].power[0].power *1000;
-//					slave_info.data.ac_dc.power[i].consumer = power.pch[i].power[0].consump *1000;
-//					slave_info.data.ac_dc.power[i].factor 	= power.pch[i].power[0].factor *1000;
-//					slave_info.data.ac_dc.power[i].freq 		= power.pch[i].power[0].freq *1000;
-//				}
-//				//总信息
-//				//slave_info.data.ac_dc.power_all. = power.ttl.total;
-//				slave_info.data.ac_dc.power_all.all_consumer = power.ttl.total[0].consump *1000;
-//				slave_info.data.ac_dc.power_all.all_current = power.ttl.total[0].current *1000;
-//				slave_info.data.ac_dc.power_all.all_power = power.ttl.total[0].power *1000;
-//				slave_info.data.ac_dc.power_all.all_voltage = power.ttl.total[0].voltage *1000;
-//				//温湿度
-//				slave_info.data.ac_dc.temp = 0;				//后续加上传感器数据
-//				slave_info.data.ac_dc.humity = 0;
-//				for(int i = 0; i < cnt;i++)
-//					slave_info.data.ac_dc.switch_stu[i] = 0;
-//				for(int i = 0; i < cnt;i++)
-//				{
-//					slave_info.data.ac_dc.delay_open[i] = power.pch[i].info.start_delay;
-//				}
-//				for(int i = 0; i < cnt;i++)
-//				{
-//					slave_info.data.ac_dc.delay_close[i] = power.pch[i].info.stop_delay;
-//				}
-//			}else
-//			{
-//				int channels = power.chs > 0 ? power.chs - 1: 0;
-//				slave_info.data.ac_3.dev_cnt = (p_data->prod.type << 8 | channels);
-//				for(int i = A_P; i <= C_P;i++)
-//				{
-//					slave_info.data.ac_3.ac_3_all_pw[i].consumer = power.ttl.total[i].consump *1000;
-//					slave_info.data.ac_3.ac_3_all_pw[i].current = power.ttl.total[i].current *1000;
-//					slave_info.data.ac_3.ac_3_all_pw[i].power = power.ttl.total[i].power *1000;
-//					slave_info.data.ac_3.ac_3_all_pw[i].voltage = power.ttl.total[i].voltage *1000;
-//				}
-//				int cnt = power.chs > 64 ? 64 : channels;
-//				for(int i = 0; i < cnt;i++)
-//				{
-
-//					//总体信息
-//				}
-//				for(int i = 0; i < cnt;i++)
-//				{
-//					for(int j = A_P; j <= C_P;j++)
-//					{
-//						slave_info.data.ac_3.ac_3_chn_p[i][j].p_consumer = power.pch[i].power[j].consump * 1000;
-//						slave_info.data.ac_3.ac_3_chn_p[i][j].p_current = power.pch[i].power[j].current * 1000;
-//						slave_info.data.ac_3.ac_3_chn_p[i][j].p_power = power.pch[i].power[j].power * 1000;
-//						slave_info.data.ac_3.ac_3_chn_p[i][j].p_voltage = power.pch[i].power[j].voltage * 1000;
-//						slave_info.data.ac_3.ac_3_chn_p[i][j].p_status = power.pch[i].power[j].status;		
-//					}
-//				}	
-//				for(int i = 0; i < cnt;i++)
-//				{
-//					slave_info.data.ac_3.delay_open[i] = power.pch[i].info.start_delay;
-//				}
-//				for(int i = 0; i < cnt;i++)
-//				{
-//					slave_info.data.ac_3.delay_close[i] = power.pch[i].info.stop_delay;
-//				}
-//				
-//			}
-			slave_get_info(&slave_info);
+			paras_data_t* p_data = paras_get();
+			power_data_t power = power_data_get();
+			
+			if(p_data->prod.type == PDU_AC_I1O1 || p_data->prod.type == PDU_DC_I1O1)
+			{
+				int channels = power.chs > 0 ? power.chs - 1: 0;
+				slave_info.north->data.ac_dc.dev_cnt = (p_data->prod.type << 8 | channels);
+				int cnt = power.chs > SLAVE_CH_MAX ? SLAVE_CH_MAX : channels;
+				//电量信息
+				for(int i = 0; i < cnt;i++)
+				{
+					slave_info.north->data.ac_dc.power[i].voltage 	= power.pch[i].power[0].voltage *1000;
+					slave_info.north->data.ac_dc.power[i].current 	= power.pch[i].power[0].current *1000;
+					slave_info.north->data.ac_dc.power[i].power 		= power.pch[i].power[0].power *1000;
+					slave_info.north->data.ac_dc.power[i].consumer = power.pch[i].power[0].consump *1000;
+					slave_info.north->data.ac_dc.power[i].factor 	= power.pch[i].power[0].factor *1000;
+					slave_info.north->data.ac_dc.power[i].freq 		= power.pch[i].power[0].freq *1000;
+				}
+				//总信息
+				//slave_info.north->data.ac_dc.power_all. = power.ttl.total;
+				slave_info.north->data.ac_dc.power_all.all_consumer = power.ttl.total[0].consump *1000;
+				slave_info.north->data.ac_dc.power_all.all_current = power.ttl.total[0].current *1000;
+				slave_info.north->data.ac_dc.power_all.all_power = power.ttl.total[0].power *1000;
+				slave_info.north->data.ac_dc.power_all.all_voltage = power.ttl.total[0].voltage *1000;
+				//温湿度
+				slave_info.north->data.ac_dc.temp = 0;				//后续加上传感器数据
+				slave_info.north->data.ac_dc.humity = 0;
+				for(int i = 0; i < cnt;i++)
+					slave_info.north->data.ac_dc.switch_stu[i] = 0;
+				for(int i = 0; i < cnt;i++)
+				{
+					slave_info.north->data.ac_dc.delay_open[i] = power.pch[i].info.start_delay;
+				}
+				for(int i = 0; i < cnt;i++)
+				{
+					slave_info.north->data.ac_dc.delay_close[i] = power.pch[i].info.stop_delay;
+				}
+			}else
+			{
+				int channels = power.chs > 0 ? power.chs - 1: 0;
+				slave_info.north->data.ac_3.dev_cnt = (p_data->prod.type << 8 | channels);
+				for(int i = A_P; i <= C_P;i++)
+				{
+					slave_info.north->data.ac_3.ac_3_all_pw[i].consumer = power.ttl.total[i].consump *1000;
+					slave_info.north->data.ac_3.ac_3_all_pw[i].current = power.ttl.total[i].current *1000;
+					slave_info.north->data.ac_3.ac_3_all_pw[i].power = power.ttl.total[i].power *1000;
+					slave_info.north->data.ac_3.ac_3_all_pw[i].voltage = power.ttl.total[i].voltage *1000;
+				}
+				int cnt = power.chs > SLAVE_CH_MAX ? SLAVE_CH_MAX : channels;
+				for(int i = 0; i < cnt;i++)
+				{
+
+					//总体信息
+				}
+				for(int i = 0; i < cnt;i++)
+				{
+					for(int j = A_P; j <= C_P;j++)
+					{
+						slave_info.north->data.ac_3.ac_3_chn_p[i][j].p_consumer = power.pch[i].power[j].consump * 1000;
+						slave_info.north->data.ac_3.ac_3_chn_p[i][j].p_current = power.pch[i].power[j].current * 1000;
+						slave_info.north->data.ac_3.ac_3_chn_p[i][j].p_power = power.pch[i].power[j].power * 1000;
+						slave_info.north->data.ac_3.ac_3_chn_p[i][j].p_voltage = power.pch[i].power[j].voltage * 1000;
+						slave_info.north->data.ac_3.ac_3_chn_p[i][j].p_status = power.pch[i].power[j].status;		
+					}
+				}	
+				for(int i = 0; i < cnt;i++)
+				{
+					slave_info.north->data.ac_3.delay_open[i] = power.pch[i].info.start_delay;
+				}
+				for(int i = 0; i < cnt;i++)
+				{
+					slave_info.north->data.ac_3.delay_close[i] = power.pch[i].info.stop_delay;
+				}
+				
+			}
+			LOGD("cpy data to north user\n");
+			//slave_get_info(&slave_info);
 		}
 		sleep(1);
 		
@@ -706,43 +762,43 @@ int mb_port_read_input(u16 addr, u16 *preg)//读输入寄存器, 返回 : 0-成
 int mb_port_read_hold(u16 addr, u16 *preg)//读保持寄存器, 返回 : 0-成功, -2-地址错误
 {
     MB_ASSERT(preg != NULL);
-//		uint16_t *data = NULL;
-//    if( AC_DC_DEV_CHN_REG <= addr &&  addr <= AC_DC_DRY_REG)
-//		{
-//			data = (uint16_t*)(&slave_info.data.ac_dc);
-//			uint32_t offset = addr - AC_DC_DEV_CHN_REG;
-//			*preg = *(data+offset);
-//			return 0;
-//		}
-//		if(AC_3_DEV_CHN_REG <= addr && addr <= AC_3_DRY_REG)
-//		{
-//			data = (uint16_t*)(&slave_info.data.ac_3);
-//			uint32_t offset = addr - AC_3_DEV_CHN_REG;
-//			*preg = *(data+offset);
-//			return 0;
-//		}	
+		uint16_t *data = NULL;
+    if( AC_DC_DEV_CHN_REG <= addr &&  addr <= AC_DC_DRY_REG)
+		{
+			data = (uint16_t*)(&slave_info.north->data.ac_dc);
+			uint32_t offset = addr - AC_DC_DEV_CHN_REG;
+			*preg = *(data+offset);
+			return 0;
+		}
+		if(AC_3_DEV_CHN_REG <= addr && addr <= AC_3_DRY_REG)
+		{
+			data = (uint16_t*)(&slave_info.north->data.ac_3);
+			uint32_t offset = addr - AC_3_DEV_CHN_REG;
+			*preg = *(data+offset);
+			return 0;
+		}	
 		return(-2);
 }
 
 int mb_port_write_hold(u16 addr, u16 reg)//写保持寄存器, 返回 : 0-成功, -2-地址错误, -3-值非法, -4-设备故障
 {
-//  power_data_t power = power_data_get();
-//	
-//	if(AC_DC_SET_DELAY_OPEN <= addr && addr <= AC_DC_ALL_SET_SWITCH_REG)
-//	{
-//		switch(addr)
-//		{
-//			case AC_DC_SET_DELAY_OPEN ... (AC_DC_SET_DELAY_CLOSE-1):
-//			{
-//				uint16_t channel = addr - AC_DC_SET_DELAY_OPEN;
-//				//获取通道控制接口 写入数据
-//				
-//				
-//			}
-//			break;
-//		}
-//		return 0;
-//	}
+  power_data_t power = power_data_get();
+	
+	if(AC_DC_SET_DELAY_OPEN <= addr && addr <= AC_DC_ALL_SET_SWITCH_REG)
+	{
+		switch(addr)
+		{
+			case AC_DC_SET_DELAY_OPEN ... (AC_DC_SET_DELAY_CLOSE-1):
+			{
+				uint16_t channel = addr - AC_DC_SET_DELAY_OPEN;
+				//获取通道控制接口 写入数据
+				
+				
+			}
+			break;
+		}
+		return 0;
+	}
 	return(-2);
 } 
 
@@ -787,8 +843,8 @@ void cascade_reinit(uint8_t mode,uint8_t addr,uint32_t baud)
 cascade_data_t cascade_power_get(void)
 {
     cascade_data_t cas_d = {0};
-		cas_d.chs = slave_info.info.channels;
-		cas_d.pch = &slave_info.info.ch[0];
+		cas_d.chs = slave_info.info->channels;
+		cas_d.pch = &slave_info.info->ch[0];
     return cas_d;
 }
 int cascade_get_dlist(dev_list_t *dl)

+ 13 - 13
f407/applications/datadef.h

@@ -540,15 +540,15 @@ typedef struct ac_dc_in{
 
 typedef struct md_ac_dc{
     uint16_t          dev_cnt;                   //设备类型和通道数
-    ac_dc_out_t       power[64];                 //最大64通道
+    ac_dc_out_t       power[SLAVE_CH_MAX];                 //最大64通道
 		ac_dc_in_t        power_all;
     uint16_t          temp;
 		uint16_t          humity;
-    uint16_t          switch_stu[64];
-    uint16_t          delay_open[64];
-    uint16_t          delay_close[64];
-    sensor_info_t     md_s[8];
-    uint16_t          dry_node[4]; 
+    uint16_t          switch_stu[SLAVE_CH_MAX];
+    uint16_t          delay_open[SLAVE_CH_MAX];
+    uint16_t          delay_close[SLAVE_CH_MAX];
+    sensor_info_t     md_s[4];
+    //uint16_t          dry_node[4]; 
 }md_ac_dc_t;
 
 typedef struct all_info{
@@ -578,15 +578,15 @@ typedef struct chn_phase_info{
 typedef struct md_3_ac{
     uint16_t            dev_cnt;                                        //设备类型和通道数
     all_info_t          ac_3_all_pw[3];
-    all_chn_info_t      ac_3_all_chn[64];
-    chn_phase_info_t    ac_3_chn_p[64][3];
+    all_chn_info_t      ac_3_all_chn[SLAVE_CH_MAX];
+    chn_phase_info_t    ac_3_chn_p[SLAVE_CH_MAX][3];
     uint16_t            temp;
 		uint16_t            humity;
-    uint16_t            switch_chn[64];
-    uint16_t            delay_open[64];
-    uint16_t            delay_close[64];
-    sensor_info_t       md_s[8];
-    uint16_t            dry_node[4];
+    uint16_t            switch_chn[SLAVE_CH_MAX];
+    uint16_t            delay_open[SLAVE_CH_MAX];
+    uint16_t            delay_close[SLAVE_CH_MAX];
+    sensor_info_t       md_s[4];
+    //uint16_t            dry_node[4];
 }md_3_ac_t;
 
 

+ 3 - 1
f407/applications/main.c

@@ -114,7 +114,8 @@ static int user_init(void)
 {
    // ui_init();
     sd_mount();
-    //power_init();
+    power_init();
+		LOGD("____________cascade thread!!!!!\n");
     web_init();
 	  LOGD("cascade thread!!!!!\n");
     cascade_init(CASCADE_PORT,1,1,115200);
@@ -125,6 +126,7 @@ static int user_init(void)
 
 int main(void)
 {
+
     sys_init();
     user_init();
     while (1) {

+ 5 - 3
f407/applications/power.c

@@ -746,11 +746,13 @@ int power_init(void)
     h->cur_addr = 0;
     h->brd_max = BRD_NUM;
     h->prod = &paras_get()->prod;
-    
+    LOGD("11111111111111111111111\n");
     power_scan();
-    power_set_all_sw(1);
+		LOGD("111111111111111111111112222222222222222222\n");
+    //power_set_all_sw(1);
+		LOGD("1111111111111111111111122222222222222222223333333333333333333333\n");
     thread_start(THREAD_ID_POWER, power_thread, h);
-    
+    LOGD("11111111111111111111111222222222222222222233333333333333333333334444444444444444\n");
     return 0;
 }