Kaynağa Gözat

F407 级联读取数据bug修改

liyi 1 yıl önce
ebeveyn
işleme
7251e7a34d

+ 1 - 1
f407/applications/breaker.c

@@ -33,7 +33,7 @@ static int read_reg(uint8_t addr, uint16_t reg, uint16_t *data, int cnt)
     
     cascade_lock(1);
     for(i=0; i<RETRY_TIMES; i++) {
-        r = mb_read(MB_ID_CASCADE, addr, reg, data, cnt, TIMEOUT);
+        r = mb_read(MB_ID_POWER, addr, reg, data, cnt, TIMEOUT);
         if(r==cnt) {
             break;
         }

+ 117 - 138
f407/applications/cascade.c

@@ -36,22 +36,28 @@ typedef struct {
 	}data;
 }north_data_t;
 
+
+typedef union{
+	slave_info_t			info;
+	north_data_t 			north;
+}cascade_data_cache;
+
+
 typedef struct cascade_info{
+	uint8_t         switch_flag;
 	uint8_t  				saddr;
 	uint8_t         read_addr;
 	uint8_t 				md_type;
 	uint32_t        bund;
 	uint8_t         quit;
-	slave_info_t			*info;
+	//slave_info_t			*info;
 	lock_t 					lock;
 	slave_t         slaves[POWER_CASCADE_MAX+1];
 	cmd_data_t    cmd;
-    power_all_t   all;
-//	union {
-//		md_ac_dc_t ac_dc;
-//		md_3_ac_t  ac_3; 
-//	}data;						//modbus to user
-	north_data_t *north;
+  power_all_t   all;
+
+	//north_data_t *north;
+	cascade_data_cache *chache;
 }cascade_handle_t;
 
 
@@ -138,10 +144,10 @@ 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->chache->info;
 	power_all_t all;
 
-    power_data_get(&all);
+   power_data_get(&all);
 	info->channels = all.chs-1 > 0 ? all.chs-1 :  all.chs;
 
 	if(info->channels  > POWER_SLAVE_CH_MAX)
@@ -249,7 +255,7 @@ static void slave_func(uint16_t reg,void *r_w_data,uint32_t lenth)
 			{
 				case CASCADE_CMD_GET_INFO:
 				{
-					LOGD("____read_____  %d,sendlen = %d size=%d\n",lenth,sendlen,sizeof(power_ch_t)*4);
+					LOGD("____read_____ readlen = %d,sendlen = %d power_ch_t size=%d\n",lenth,sendlen,sizeof(power_ch_t));
 					//my_memcpy_byte(r_w_data,(void*)&slave_info.info+sendlen,lenth*2);
 					uint8_t * base_addr = (uint8_t *)&all.pch[1];
 					my_memcpy_byte(r_w_data,base_addr+sendlen,lenth*2);
@@ -482,16 +488,16 @@ static int master_cmd(cascade_handle_t *cas,uint8_t cur_dev_addr ,cmd_data_t *cm
 							uint8_t chanels = value & 0xff;
 							if(chanels == 0 || chanels > 100)
 							{
-								cas->info->channels = 0;
+								cas->chache->info.channels = 0;
 								LOGD("get slave channels %d!!!\n",chanels);
 							}else
 							{
 								if(chanels >= POWER_SLAVE_CH_MAX)
 										chanels = POWER_SLAVE_CH_MAX;
-								cas->info->channels = chanels;
+								cas->chache->info.channels = chanels;
 								//rdata.dlen = sizeof(slave_info_t) -sizeof(power_ch_t)*(POWER_SLAVE_CH_MAX - cas->info.channels);
-                rdata.dlen = sizeof(power_ch_t)*cas->info->channels;
-								rdata.data = (uint8_t*)&(cas->info->ch);
+                rdata.dlen = sizeof(power_ch_t)*cas->chache->info.channels;
+								rdata.data = (uint8_t*)&(cas->chache->info.ch);
 								r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
 								if(r==0) {
 
@@ -538,92 +544,89 @@ static int master_cmd(cascade_handle_t *cas,uint8_t cur_dev_addr ,cmd_data_t *cm
 
 
 
-uint8_t cascade_init(uint8_t mode,uint8_t addr,uint32_t baud)
+uint8_t cascade_init(void)
 {	
-	mb_para_t para;
-	para.type = MB_TYPE_RTU;
-	para.para.rtu.dev = CASCADE_PORT;
-	para.para.rtu.baudrate = baud;
-	para.para.rtu.parity = 0;
-	para.para.rtu.pin = -1;
-	para.para.rtu.lvl = 0;
-	para.para.rtu.baudrate = baud;
+	paras_data_t* p_d = paras_get();
 	memset(&slave_info,0,sizeof(slave_info));
-	
 	slave_info.quit = 1;
-	if(addr == 0){
-		para.mode = MB_MODE_MASTER;
-	}else
+	slave_info.lock = lock_init();
+	slave_info.md_type = p_d->cas.mode;
+	
+	slave_info.chache = (cascade_data_cache *) malloc(sizeof(cascade_data_cache));
+	if(slave_info.chache == NULL)
 	{
-		para.mode = MB_MODE_SLAVE;
-		slave_info.saddr = addr;
+		lock_deinit(slave_info.lock);
+		return -1;
 	}
-    mb_setup(MB_ID_CASCADE, &para);
-    
-	slave_info.bund = baud;
-	slave_info.md_type = para.mode;
-	slave_info.lock = lock_init();
-
-	if(para.mode == MB_MODE_SLAVE)
+	LOGD("__casecde__malloc size if cascade %d\n",sizeof(cascade_data_cache));
+	if(p_d->cas.mode == MB_MODE_SLAVE)
 	{
-		mb_set_addr(MB_ID_CASCADE,slave_info.saddr);
+		mb_set_addr(MB_ID_CASCADE,p_d->cas.addr);
 		mb_set_cb(MB_ID_CASCADE, &mb_table);
 		func.slave_func = slave_func;
 		mb_set_cascade_cb(MB_ID_CASCADE,&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)
+		memset(&slave_info.chache->north,0,sizeof(north_data_t));
+	}else if(p_d->cas.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));
+		memset(&slave_info.chache->info,0,sizeof(slave_info_t));	
+	}else
+	{
+		LOGE("cascede mode type is err ____ %d!!!\n",p_d->cas.mode);
+		free(slave_info.chache);
+		slave_info.chache = 0;
+		return -1;
 	}
-
 	slave_info.quit = 0;
-	if(para.mode == MB_MODE_MASTER)
-		slave_info.read_addr = 1;
-	
-	LOGD("mode: %d addr: %d bound: %d\n",slave_info.md_type,slave_info.saddr,para.para.rtu.baudrate);
+	slave_info.read_addr = 1;
 	LOGD("scan thread!!!\n");
 	thread_start(THREAD_ID_CAS_SCAN,cascade_scan_thread,NULL);
 	sleep(1);
 	LOGD("cascade thread!!!\n");
 	thread_start(THREAD_ID_CAS_TH,cascade_thread,NULL);
-	
 	return 0;
 }
 
 
-uint8_t cascade_deinit()
+
+void cascade_reset(uint8_t mode,uint8_t addr)
 {
-    lock_deinit(slave_info.lock);
-		if(slave_info.north)
-		{
-			free(slave_info.north);
-			slave_info.north = 0;
-		}
-		if(slave_info.info)
-		{
-			free(slave_info.info);
-			slave_info.info = 0;
-		}
-    return 0;
+	slave_info.switch_flag = 1;
+	paras_data_t* p_d = paras_get();
+	
+	if((p_d->cas.mode == MB_MODE_MASTER) && (slave_info.md_type != MB_MODE_MASTER))
+	{
+		slave_info.md_type = MB_MODE_MASTER;
+		memset(&slave_info.chache->info,0,sizeof(slave_info_t));			
+	}else if((p_d->cas.mode == MB_MODE_SLAVE) && (slave_info.md_type != MB_MODE_SLAVE))
+	{
+		slave_info.md_type = MB_MODE_SLAVE;
+		mb_set_addr(MB_ID_CASCADE,p_d->cas.addr);
+		mb_set_cb(MB_ID_CASCADE, &mb_table);
+		func.slave_func = slave_func;
+		mb_set_cascade_cb(MB_ID_CASCADE,&func);
+		memset(&slave_info.chache->north,0,sizeof(north_data_t));		
+	}else if(p_d->cas.mode == MB_MODE_SLAVE)
+	{
+		mb_set_addr(MB_ID_CASCADE,p_d->cas.addr);
+			
+	}else
+	{
+		return ;
+	}
+	paras_save();
+	slave_info.switch_flag = 0;
 }
 
-
 void cascade_scan_thread(void *arg)
 {
 	while(slave_info.quit == 0)
 	{
+		if(slave_info.switch_flag)
+		{
+			sleep(1);
+			continue;
+		}
+		
 		if(slave_info.md_type == MB_MODE_MASTER)
 		{
 			master_scan(&slave_info);
@@ -632,52 +635,51 @@ void cascade_scan_thread(void *arg)
 		{
 			paras_data_t* p_data = paras_get();
 			power_all_t all;
-
-            power_data_get(&all);
+      power_data_get(&all);
 			if(p_data->prod.type == PDU_AC_I1O1 || p_data->prod.type == PDU_DC_I1O1)
 			{
 				int channels = all.chs > 0 ? all.chs - 1: 0;
-				slave_info.north->data.ac_dc.dev_cnt = (p_data->prod.type << 8 | channels);
+				slave_info.chache->north.data.ac_dc.dev_cnt = (p_data->prod.type << 8 | channels);
 				int cnt = all.chs > POWER_SLAVE_CH_MAX ? POWER_SLAVE_CH_MAX : channels;
 				//电量信息
 				for(int i = 0; i < cnt;i++)
 				{
-					slave_info.north->data.ac_dc.power[i].voltage 	= all.pch[i].power[0].voltage *1000;
-					slave_info.north->data.ac_dc.power[i].current 	= all.pch[i].power[0].current *1000;
-					slave_info.north->data.ac_dc.power[i].power 	= all.pch[i].power[0].power *1000;
-					slave_info.north->data.ac_dc.power[i].consumer  = all.pch[i].power[0].consump *1000;
-					slave_info.north->data.ac_dc.power[i].factor 	= all.pch[i].power[0].factor *1000;
-					slave_info.north->data.ac_dc.power[i].freq 		= all.pch[i].power[0].freq *1000;
+					slave_info.chache->north.data.ac_dc.power[i].voltage 	= all.pch[i+1].power[0].voltage *1000;
+					slave_info.chache->north.data.ac_dc.power[i].current 	= all.pch[i+1].power[0].current *1000;
+					slave_info.chache->north.data.ac_dc.power[i].power 	= all.pch[i+1].power[0].power *1000;
+					slave_info.chache->north.data.ac_dc.power[i].consumer  = all.pch[i+1].power[0].consump *1000;
+					slave_info.chache->north.data.ac_dc.power[i].factor 	= all.pch[i+1].power[0].factor *1000;
+					slave_info.chache->north.data.ac_dc.power[i].freq 		= all.pch[i+1].power[0].freq *1000;
 				}
 				//总信息
-				//slave_info.north->data.ac_dc.power_all. = all.ttl.total;
-				slave_info.north->data.ac_dc.power_all.all_consumer = all.ttl.total[0].consump *1000;
-				slave_info.north->data.ac_dc.power_all.all_current  = all.ttl.total[0].current *1000;
-				slave_info.north->data.ac_dc.power_all.all_power    = all.ttl.total[0].power *1000;
-				slave_info.north->data.ac_dc.power_all.all_voltage  = all.ttl.total[0].voltage *1000;
+				//slave_info.chache->north.data.ac_dc.power_all. = all.ttl.total;
+				slave_info.chache->north.data.ac_dc.power_all.all_consumer = all.ttl.total[0].consump *1000;
+				slave_info.chache->north.data.ac_dc.power_all.all_current  = all.ttl.total[0].current *1000;
+				slave_info.chache->north.data.ac_dc.power_all.all_power    = all.ttl.total[0].power *1000;
+				slave_info.chache->north.data.ac_dc.power_all.all_voltage  = all.ttl.total[0].voltage *1000;
 				//温湿度
-				slave_info.north->data.ac_dc.temp = 0;				//后续加上传感器数据
-				slave_info.north->data.ac_dc.humity = 0;
+				slave_info.chache->north.data.ac_dc.temp = 0;				//后续加上传感器数据
+				slave_info.chache->north.data.ac_dc.humity = 0;
 				for(int i = 0; i < cnt;i++)
-					slave_info.north->data.ac_dc.switch_stu[i] = 0;
+					slave_info.chache->north.data.ac_dc.switch_stu[i] = 0;
 				for(int i = 0; i < cnt;i++)
 				{
-					slave_info.north->data.ac_dc.delay_open[i] = all.pch[i].info.open_delay;
+					slave_info.chache->north.data.ac_dc.delay_open[i] = all.pch[i].info.open_delay;
 				}
 				for(int i = 0; i < cnt;i++)
 				{
-					slave_info.north->data.ac_dc.delay_close[i] = all.pch[i].info.close_delay;
+					slave_info.chache->north.data.ac_dc.delay_close[i] = all.pch[i].info.close_delay;
 				}
 			}else
 			{
 				int channels = all.chs > 0 ? all.chs - 1: 0;
-				slave_info.north->data.ac_3.dev_cnt = (p_data->prod.type << 8 | channels);
+				slave_info.chache->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 = all.ttl.total[i].consump *1000;
-					slave_info.north->data.ac_3.ac_3_all_pw[i].current  = all.ttl.total[i].current *1000;
-					slave_info.north->data.ac_3.ac_3_all_pw[i].power    = all.ttl.total[i].power *1000;
-					slave_info.north->data.ac_3.ac_3_all_pw[i].voltage  = all.ttl.total[i].voltage *1000;
+					slave_info.chache->north.data.ac_3.ac_3_all_pw[i].consumer = all.ttl.total[i].consump *1000;
+					slave_info.chache->north.data.ac_3.ac_3_all_pw[i].current  = all.ttl.total[i].current *1000;
+					slave_info.chache->north.data.ac_3.ac_3_all_pw[i].power    = all.ttl.total[i].power *1000;
+					slave_info.chache->north.data.ac_3.ac_3_all_pw[i].voltage  = all.ttl.total[i].voltage *1000;
 				}
 				int cnt = all.chs > POWER_SLAVE_CH_MAX ? POWER_SLAVE_CH_MAX : channels;
 				for(int i = 0; i < cnt;i++)
@@ -689,20 +691,20 @@ void cascade_scan_thread(void *arg)
 				{
 					for(int j = A_P; j <= C_P;j++)
 					{
-						slave_info.north->data.ac_3.ac_3_chn_p[i][j].p_consumer = all.pch[i].power[j].consump * 1000;
-						slave_info.north->data.ac_3.ac_3_chn_p[i][j].p_current  = all.pch[i].power[j].current * 1000;
-						slave_info.north->data.ac_3.ac_3_chn_p[i][j].p_power    = all.pch[i].power[j].power * 1000;
-						slave_info.north->data.ac_3.ac_3_chn_p[i][j].p_voltage  = all.pch[i].power[j].voltage * 1000;
-						slave_info.north->data.ac_3.ac_3_chn_p[i][j].p_status   = all.pch[i].power[j].status;		
+						slave_info.chache->north.data.ac_3.ac_3_chn_p[i][j].p_consumer = all.pch[i+1].power[j].consump * 1000;
+						slave_info.chache->north.data.ac_3.ac_3_chn_p[i][j].p_current  = all.pch[i+1].power[j].current * 1000;
+						slave_info.chache->north.data.ac_3.ac_3_chn_p[i][j].p_power    = all.pch[i+1].power[j].power * 1000;
+						slave_info.chache->north.data.ac_3.ac_3_chn_p[i][j].p_voltage  = all.pch[i+1].power[j].voltage * 1000;
+						slave_info.chache->north.data.ac_3.ac_3_chn_p[i][j].p_status   = all.pch[i+1].power[j].status;		
 					}
 				}	
 				for(int i = 0; i < cnt;i++)
 				{
-					slave_info.north->data.ac_3.delay_open[i] = all.pch[i].info.open_delay;
+					slave_info.chache->north.data.ac_3.delay_open[i] = all.pch[i].info.open_delay;
 				}
 				for(int i = 0; i < cnt;i++)
 				{
-					slave_info.north->data.ac_3.delay_close[i] = all.pch[i].info.close_delay;
+					slave_info.chache->north.data.ac_3.delay_close[i] = all.pch[i].info.close_delay;
 				}
 				
 			}
@@ -716,9 +718,14 @@ void cascade_scan_thread(void *arg)
 
 void cascade_thread(void *arg)
 {
-    LOGD("__ cascade %s\n", (slave_info.md_type==MODBUS_MASTER)?"master":"slave");
+    LOGD("__ cascade %s\n", (slave_info.md_type==MB_MODE_MASTER)?"master":"slave");
     while(slave_info.quit==0) {
-        if(slave_info.md_type==MODBUS_MASTER) {      //主模
+			if(slave_info.switch_flag)
+			{
+				sleep(1);
+				continue;
+			}
+        if(slave_info.md_type==MB_MODE_MASTER) {      //主模
             cmd_data_t cmd;
             cmd.cmd = CASCADE_CMD_GET_INFO;
             cmd.obj = OBJ_OVERALL;
@@ -773,14 +780,14 @@ int mb_port_read_hold(u16 addr, u16 *preg)//读保持寄存器, 返回 : 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);
+			data = (uint16_t*)(&slave_info.chache->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);
+			data = (uint16_t*)(&slave_info.chache->north.data.ac_3);
 			uint32_t offset = addr - AC_3_DEV_CHN_REG;
 			*preg = *(data+offset);
 			return 0;
@@ -813,45 +820,17 @@ int mb_port_write_hold(u16 addr, u16 reg)//写保持寄存器, 返回 : 0-成功
 
 uint8_t cascade_read_slave(uint8_t addr)
 {
-	memset(&slave_info.info,0,sizeof(slave_info.info));
+	memset(&slave_info.chache->info,0,sizeof(slave_info_t));
 	slave_info.read_addr = addr;
 }
 
-uint8_t cascade_set_mode(uint8_t mode,uint8_t addr)
-{
-	if(MODBUS_MASTER == mode)
-	{
-		slave_info.md_type = MODBUS_MASTER;
-		slave_info.saddr = 0;
-		mb_set_addr(MB_ID_CASCADE,0);
-	}else
-	{
-		slave_info.md_type =MODBUS_SLAVE;
-		slave_info.saddr = addr;
-		mb_set_addr(MB_ID_CASCADE,addr);
-	}
-}
-
-void cascade_reinit(uint8_t mode,uint8_t addr,uint32_t baud)
-{
-    if(mode != MODBUS_MASTER || mode !=MODBUS_SLAVE || addr >= POWER_SLAVE_CH_MAX)
-    {
-        return;
-    }
-
-    slave_info.quit = 1;
-    sleep(1);
-    cascade_deinit();
-    cascade_init(mode,addr,baud);
-}
-
 int cascade_power_get(power_all_t *all)
 {
     if(!all) {
         return -1;
     }
-    all->chs = slave_info.info->channels;
-    all->pch = &slave_info.info->ch[0];
+    all->chs = slave_info.chache->info.channels;
+    all->pch = &slave_info.chache->info.ch[0];
     return 0;
 }
 int cascade_get_dlist(dev_list_t *dl)

+ 3 - 2
f407/applications/cascade.h

@@ -102,13 +102,14 @@ enum {
     CASCADE_CMD_BREAKER_SAVE_DELETE,
     CASCADE_CMD_OPEN_NF,
     CASCADE_CMD_CLOSE_NF,
-
+		CASCADE_CMD_SEND_OFFSET,
     CASCADE_CMD_MAX,
 };
 
 
-uint8_t cascade_init(uint8_t mode,uint8_t addr,uint32_t baud);
+uint8_t cascade_init();
 uint8_t cascade_deinit();
+void cascade_reset(uint8_t mode,uint8_t addr);
 void    cascade_scan_thread(void *arg);
 void    cascade_thread(void *arg);
 int     cascade_request(cmd_data_t *cmd);

+ 2 - 2
f407/applications/cfg.h

@@ -49,9 +49,9 @@
     
     #define CHANNEL_DELAY                       8
 
-    #define PROD_TYPE                           PDU_AC_I3O3
+    //#define PROD_TYPE                           PDU_AC_I3O3
     //#define PROD_TYPE                           PDU_AC_I1O1
-    
+    #define PROD_TYPE 													 PDU_DC_I1O1
     #define USE_UI
     #define ROTATE                             90
 

+ 2 - 3
f407/applications/main.c

@@ -99,9 +99,8 @@ static int user_init(void)
     modbus_data_t *cas=&p->cas;
     
     power_init();
-    //cascade_init(cas->mode, cas->addr, cas->baud);
-    
-    web_init();
+    cascade_init();
+    //web_init();
     
     return 0;
 }

+ 34 - 0
f407/applications/mb.c

@@ -87,6 +87,21 @@ int mb_init(void)
     return 0;
 }
 
+int mb_init_n(uint8_t id,mb_para_t *para)
+{
+	int r;
+	mb_handle_t *h=&mbHandle;
+	if(id<0 || id>=MB_ID_MAX || !para) {
+        return -1;
+  }
+	r = mb_setup(id, para);
+	h->inf[id].lck = lock_init();
+}
+
+
+
+
+
 
 int mb_setup(int id, mb_para_t *para)
 {
@@ -131,6 +146,25 @@ int mb_setup(int id, mb_para_t *para)
 
 
 
+int mb_deinit_n(uint8_t id)
+{
+	if(id<0 || id>=MB_ID_MAX) {
+        return -1;
+  }
+	mb_handle_t *h=&mbHandle;
+	if(h->inf[id].lck)
+	{
+		lock_deinit(h->inf[id].lck);
+	}
+	if(h->inf[id].hinst)
+	{
+		mb_disconn(h->inf[id].hinst);
+		mb_destory(h->inf[id].hinst);
+	}
+	h->inf[id].lck = 0;
+	h->inf[id].hinst = 0;
+}
+
 int mb_deinit(void)
 {
     int i;

+ 2 - 2
f407/applications/packages/iniparser/src/iniparser.c

@@ -15,7 +15,7 @@
 #include "iniparser.h"
 
 /*---------------------------- Defines -------------------------------------*/
-#define ASCIILINESZ         (1024)
+#define ASCIILINESZ         (256)
 #define INI_INVALID_KEY     ((char*)-1)
 
 /*---------------------------------------------------------------------------
@@ -174,7 +174,7 @@ int iniparser_getnsec(const dictionary * d)
     for (i=0 ; i<d->size ; i++) {
         if (d->key[i]==NULL)
             continue ;
-        if (strchr(d->key[i], ':')==NULL) {
+        if (strchr(d->key[i], ':')!=NULL) {
             nsec ++ ;
         }
     }

+ 52 - 14
f407/applications/packages/qmodbus-latest/src/modbus_slave.c

@@ -83,24 +83,43 @@ static void mb_slave_pdu_deal_read_holds(mb_inst_t *hinst, mb_pdu_t *pdu)
     u16 addr = pdu->rd_req.addr;
     int nb = pdu->rd_req.nb;
     u8 *p = hinst->datas;
-		if(addr < 0x20)
+		
+		if(hinst->func->slave_func)
 		{
-			hinst->func->slave_func(addr,p,nb);	// 读回调函数
+			if(addr < 0x20)
+			{
+				hinst->func->slave_func(addr,p,nb);	// 读回调函数
+			}else
+			{
+					for (int i=0; i<nb; i++)
+					{
+							u16 val;
+							int rst = hinst->cb->read_hold(addr + i, &val);
+							if (rst < 0)
+							{
+									pdu->exc.ec = -rst;
+									pdu->exc.fc = MODBUS_FC_EXCEPT_MAKE(pdu->exc.fc);
+									return;
+							}
+							p += mb_cvt_u16_put(p, val);
+					}
+			}
 		}else
 		{
-				for (int i=0; i<nb; i++)
+			for (int i=0; i<nb; i++)
+			{
+				u16 val;
+				int rst = hinst->cb->read_hold(addr + i, &val);
+				if (rst < 0)
 				{
-						u16 val;
-						int rst = hinst->cb->read_hold(addr + i, &val);
-						if (rst < 0)
-						{
-								pdu->exc.ec = -rst;
-								pdu->exc.fc = MODBUS_FC_EXCEPT_MAKE(pdu->exc.fc);
-								return;
-						}
-						p += mb_cvt_u16_put(p, val);
+					pdu->exc.ec = -rst;
+					pdu->exc.fc = MODBUS_FC_EXCEPT_MAKE(pdu->exc.fc);
+					return;
 				}
+				p += mb_cvt_u16_put(p, val);
+			}			
 		}
+		
     pdu->rd_rsp.dlen = 2 * nb;
     pdu->rd_rsp.pdata = hinst->datas;
 }
@@ -217,9 +236,28 @@ static void mb_slave_pdu_deal_write_regs(mb_inst_t *hinst, mb_pdu_t *pdu)
     u16 addr = pdu->wr_req.addr;
     int nb = pdu->wr_req.nb;
     u8 *p = pdu->wr_req.pdata;
-		if(addr < 0x20)
+		
+		
+		if(hinst->func->slave_func)
 		{
-			hinst->func->slave_func(addr,p,nb);
+			if(addr < 0x20)
+			{
+				hinst->func->slave_func(addr,p,nb);
+			}else
+			{
+				for (int i=0; i<nb; i++)
+				{
+						u16 val;
+						p += mb_cvt_u16_get(p, &val);
+						int rst = hinst->cb->write_hold(addr + i, val);
+						if (rst < 0)
+						{
+								pdu->exc.ec = -rst;
+								pdu->exc.fc = MODBUS_FC_EXCEPT_MAKE(pdu->exc.fc);
+								return;
+						}
+				}
+			}			
 		}else
 		{
 			for (int i=0; i<nb; i++)

+ 54 - 5
f407/applications/power.c

@@ -515,15 +515,22 @@ static int board_read(power_handle_t *h, board_data_t *pbrd)
             case DCPDU_TYPE:
             {
                 uint32_t flag;
-                uint16_t *ptmp = tmp + 32;
+                //uint16_t *ptmp = tmp + 32;
                 
-                offset = POWER_DC_OUT_INFO + 16;
-                r = read_reg(h, pbrd->addr, offset, ptmp, 32);
+                offset = POWER_DC_OUT_INFO;
+                r = read_reg(h, pbrd->addr, offset, tmp, 32);
                 if (r<0) {
                     LOGE("read_reg failed, addr:%d reg:0x%04x/%d cnt:%d\n", pbrd->addr, offset, offset, 32);
                     break;
                 }
-                
+								 offset = POWER_DC_OUT_INFO + 16;
+								uint16_t *ptmp = tmp + 32;
+								
+                r = read_reg(h, pbrd->addr, offset, ptmp, 32);
+                if (r<0) {
+                    LOGE("read_reg failed, addr:%d reg:0x%04x/%d cnt:%d\n", pbrd->addr, offset, offset, 32);
+                    break;
+                }               
                 for (i = 0; i < pbrd->chs; i++) {
                     int Index = i * 8;
                     pwr = &pbrd->pch[i].power[0];
@@ -574,6 +581,47 @@ static int board_read(power_handle_t *h, board_data_t *pbrd)
                     pch->alarm.p_upper = (tmp[0+Index] & BIT(3))?1:0;
                     pch->alarm.w_upper = (tmp[0+Index] & BIT(4))?1:0;
                 }
+								
+								offset = POWER_DC_THRESHOLD_VOL_MAX;
+								r = read_reg(h, pbrd->addr, offset, tmp, 16);
+                for (i = 0; i < pbrd->chs; i++) {
+                    int Index = i * 2;
+                    pch = &pbrd->pch[i];
+									pch->thr.v_upper.val = ((tmp[1+Index] << 16)+tmp[0+Index])/1000.0f;
+                }			
+								
+								offset = POWER_DC_THRESHOLD_VOL_MIN;
+								r = read_reg(h, pbrd->addr, offset, tmp, 16);
+                for (i = 0; i < pbrd->chs; i++) {
+                    int Index = i * 2;
+                    pch = &pbrd->pch[i];
+									pch->thr.v_lower.val = ((tmp[1+Index] << 16)+tmp[0+Index])/1000.0f;
+                }
+								
+								offset = POWER_DC_THRESHOLD_CUR_MAX;
+								r = read_reg(h, pbrd->addr, offset, tmp, 16);
+                for (i = 0; i < pbrd->chs; i++) {
+                    int Index = i * 2;
+                    pch = &pbrd->pch[i];
+									pch->thr.c_upper.val = ((tmp[1+Index] << 16)+tmp[0+Index])/1000.0f;
+                }											
+								
+								offset = POWER_DC_THRESHOLD_POWER_MAX;
+								r = read_reg(h, pbrd->addr, offset, tmp, 16);
+                for (i = 0; i < pbrd->chs; i++) {
+                    int Index = i * 2;
+                    pch = &pbrd->pch[i];
+									pch->thr.p_upper.val = ((tmp[1+Index] << 16)+tmp[0+Index])/1000.0f;
+                }		
+
+								offset = POWER_DC_THRESHOLD_POWERCON_MAX;
+								r = read_reg(h, pbrd->addr, offset, tmp, 16);
+                for (i = 0; i < pbrd->chs; i++) {
+                    int Index = i * 2;
+                    pch = &pbrd->pch[i];
+									pch->thr.w_upper.val = ((tmp[1+Index] << 16)+tmp[0+Index])/1000.0f;
+                }		
+								
             }
             break;
             
@@ -812,6 +860,7 @@ static int power_copy(power_handle_t *h)
             if(pd->pch) free(pd->pch);
             pd->chs = 0;
             pd->pch = malloc(sizeof(power_ch_t)*h->chs);
+						LOGD("channels back up ch_mem=%d\n",sizeof(power_ch_t)*h->chs);
         }
         
         if(pd->pch) {
@@ -1050,7 +1099,7 @@ int power_scan(void)
                 LOGE("___ power_scan, calloc pch failed\n");
                 return -1;
             }
-            
+            LOGD("__ power init board %d, b_mem=%d ch_mem=%d\n",i,sizeof(board_data_t),sizeof(power_ch_t)*pkey->chs);
             for(j=0; j<pkey->chs; j++) {
                 pch[j].info.addr = i;
                 pch[j].info.sch  = j;                    //序号从0开始

+ 3 - 3
f407/applications/sys.c

@@ -171,7 +171,7 @@ static void poll_thread(void *arg)
     //tmp_create();
     while(h->quit==0) {
         sensor_query();
-        breaker_query();
+       // breaker_query();
         sleep(1);
     }
     pthread_exit(NULL);
@@ -184,10 +184,10 @@ int sys_init(void)
     fs_init();
     //db_init();
     paras_init();
-   // ui_init();
+		ui_init();
     
     mb_init();
-    //sensor_init();
+    sensor_init();
     //breaker_init();
     thread_start(THREAD_ID_POLL, poll_thread, NULL);
 

+ 2 - 0
f407/applications/ui/lang.c

@@ -16,6 +16,7 @@
 const char *lang_str_pool[2][STR_ID_MAX]={
     {
         "版本",     //STR_ID_VERSION
+				"日期",		  //STR_ID_DATE
         "时间",     //STR_ID_TIME
         "地址",     //STR_ID_ADDR
         "输入",     //STR_ID_INPUT
@@ -41,6 +42,7 @@ const char *lang_str_pool[2][STR_ID_MAX]={
     
     {
         "Version",  //STR_ID_VERSION
+				"Date",			//STR_ID_DATE
         "Time",     //STR_ID_TIME
         "Addr",     //STR_ID_ADDR
         "INPUT",    //STR_ID_INPUT

+ 14 - 10
f407/applications/ui/menu.c

@@ -11,6 +11,7 @@
 #include "lang.h"
 #include "timer.h"
 #include "cfg.h"
+#include "cascade.h"
 #include <sys/time.h>
 
 #define LINES          5
@@ -180,21 +181,22 @@ static void menu_system_paint(menu_handle_t *h, int font1, int font2, int item_h
     
     //lcd_fill(COLOR_BLACK);
     sprintf(tmp, "SmartPDU");
-    lcd_draw_string(0, 0, LCD_WIDTH, item_h, tmp, font1, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_CENTER, VERTICAL_CENTER);
+    lcd_draw_string(10, 0, LCD_WIDTH-10, item_h, tmp, font1, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_CENTER, VERTICAL_CENTER);
 
     sprintf(tmp, "%s:%s", lang_get_str(h->lang, STR_ID_VER), VERSION);
-    lcd_draw_string(0, item_h, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+    lcd_draw_string(10, item_h, LCD_WIDTH-10, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
 
     get_date(xxx, sizeof(xxx), tm);
     sprintf(tmp, "%s:%s", lang_get_str(h->lang, STR_ID_DATE), xxx);
-    lcd_draw_string(0, item_h*2, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+    lcd_draw_string(10, item_h*2, LCD_WIDTH-10, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
     
     get_time(xxx, sizeof(xxx), tm);
     sprintf(tmp, "%s:%s", lang_get_str(h->lang, STR_ID_TIME), xxx);
-    lcd_draw_string(0, item_h*3, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
-
-    sprintf(tmp, "IP:%s", "11.11.11.11");//getLocalIpAddress("e0"));
-    lcd_draw_string(0, item_h*4, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+    lcd_draw_string(10, item_h*3, LCD_WIDTH-10, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+		
+		
+    sprintf(tmp, "IP:%s", RT_LWIP_IPADDR);//getLocalIpAddress("e0"));
+    lcd_draw_string(10, item_h*4, LCD_WIDTH-10, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
     //lcd_refresh();
 }
 static void menu_input_paint(menu_handle_t *h, int font1, int font2, int item_h, key_val_t *kv)
@@ -513,10 +515,12 @@ static int menu_modbus_key_handle(menu_handle_t *h, key_val_t *kv)
                 if(h->menu.page[h->menu.menu_id].item_id==MODBUS_ITEM_SAVE || h->menu.page[h->menu.menu_id].item_id==MODBUS_ITEM_QUIT) {         //save
                     if(h->menu.page[h->menu.menu_id].item_id==MODBUS_ITEM_SAVE) {
                         //r = cascade_set_modbus(&h->mb);
-                        if(r==0) {
+                        //if(r==0) {
                             paras_get()->cas = h->mb;
-                            r = paras_save();
-                        }
+                            //r = paras_save();
+														cascade_reset(h->mb.mode,h->mb.addr);
+													
+                        //}
 
                     }
                     h->menu.page[h->menu.menu_id].item_id = 0;

+ 7 - 5
f407/applications/web.c

@@ -145,7 +145,8 @@ static void send_powerc(web_handle_t *h, mg_conn_t *c, uint8_t addr)
     hdr->addr  = addr;
     hdr->type  = PKT_TYPE_POWER_CH;
     hdr->nack  = 0;
-    
+
+#if 1  
     times = all.chs/ONCE_SEND_CNT;
     for(i=0; i<times; i++) {
         for(j=0; j<ONCE_SEND_CNT; j++) {
@@ -165,6 +166,7 @@ static void send_powerc(web_handle_t *h, mg_conn_t *c, uint8_t addr)
     xlen = (all.chs%ONCE_SEND_CNT)*sizeof(power_ch_t)+sizeof(pkt_hdr_t);
     hdr->dlen  = xlen-sizeof(pkt_hdr_t);
     ws_send(c, h->buf, xlen, 1);
+#endif
 }
 static void send_powert(web_handle_t *h, mg_conn_t *c, uint8_t addr)
 {
@@ -321,10 +323,10 @@ static int ws_handle(web_handle_t *h, pkt_hdr_t *hdr, mg_conn_t *c)
                 
                 case SUB_TYPE_PARAS_MODBUS:
                 {
-                    modbus_data_t *p=(modbus_data_t*)hdr->data;
-                    cascade_reinit(p->mode, p->addr, p->baud);
-                    para->cas = *p;
-                    paras_save();
+//                    modbus_data_t *p=(modbus_data_t*)hdr->data;
+//                    cascade_reinit(p->mode, p->addr, p->baud);
+//                    para->cas = *p;
+//                    paras_save();
                 }
                 break;