liyi 1 год назад
Родитель
Сommit
9207a2f749

+ 55 - 20
f407/applications/cascade.c

@@ -13,14 +13,7 @@
 #include "thread.h"
 
 
-typedef struct {
-    uint8_t         cmd;
-    uint8_t         obj;
-    uint8_t         chId;
-    // char            time_s[24];   //start time
-    // char            time_e[24];   //end time
-		uint8_t 			data[200];
-}cmd_data_t;
+
 
 
 typedef void * handle_t;
@@ -161,6 +154,7 @@ static uint8_t master_scan(cascade_handle_t *cas)
 		lock_off(cas->lock);
 		if(r > 0)
 		{
+			LOGD("get slave addr %d\n",slave_addr);
 			cas->slaves[slave_addr].addr = slave_addr;
 			cas->slaves[slave_addr].err = 0;
 			//获取当前
@@ -188,8 +182,9 @@ void cascade_scan_thread(void *arg)
 			power_data_t power = power_data_get();
 			if(p_data->prod.type == PDU_AC_I1O1 || p_data->prod.type == PDU_DC_I1O1)
 			{
-				slave_info.data.ac_dc.dev_cnt = (p_data->prod.type << 8 | power.chs);
-				int cnt = power.chs > 64 ? 64 : power.chs;
+				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++)
 				{
@@ -221,7 +216,8 @@ void cascade_scan_thread(void *arg)
 				}
 			}else
 			{
-				slave_info.data.ac_3.dev_cnt = (p_data->prod.type << 8 | power.chs);
+				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;
@@ -229,7 +225,7 @@ void cascade_scan_thread(void *arg)
 					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 : power.chs;
+				int cnt = power.chs > 64 ? 64 : channels;
 				for(int i = 0; i < cnt;i++)
 				{
 
@@ -272,9 +268,14 @@ void cascade_thread(void *arg)
     //ModbusInfo_t *info=&cas->mInfo;
     mb_handle_t *handle=(mb_handle_t *)(cas->mb);
     LOGD("__ cascade %s\n", (cas->md_type==MODBUS_MASTER)?"master":"slave");
-    while(handle->quit==0) {
+    slave_info.saddr = 1;
+		while(handle->quit==0) {
         if(cas->md_type==MODBUS_MASTER) {      //主模
-            r = master_query(cas);
+//						cmd_data_t cmd;
+//						cmd.cmd = CASCADE_CMD_GET_INFO;
+//						cmd.obj = OBJ_OVERALL;
+//						cas->cmd = cmd;
+//            r = master_query(cas);
             sleep(1);
         }
         else {                                  //从模式,等待主设备发起数据请求
@@ -345,6 +346,7 @@ 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;
+	LOGD("____XXXXXXXXXX____ reg = %d\n",reg);
 	switch (reg)
 	{
 		case CASCADE_REG_SCAN:
@@ -352,11 +354,20 @@ void slave_func(uint16_t reg,void *r_w_data,uint32_t lenth)
 		break;
 		case CASCADE_REG_WRITE:
 		{
-  
+			
 			cmd = (cmd_data_t*)(r_w_data);
       if(cmd->cmd>=CASCADE_CMD_GET_INFO) {
 					slave_info.cmd = *cmd;
       }
+			LOGD("____XXXXXXX__WRITE_XXXXXXXXXXXXXX____cmd->cmd=%d,lenth=%d\n",cmd->cmd,lenth);
+			if(lenth > 10)
+			{
+				for(int i = 0; i < 10;i++)
+				{
+					LOGD("%X ",*((rt_uint8_t*)r_w_data+i));
+				}
+				LOGD("\n");
+			}
       sendlen = 0;
       
 			switch(cmd->cmd)
@@ -402,6 +413,7 @@ void slave_func(uint16_t reg,void *r_w_data,uint32_t lenth)
 		case CASCADE_REG_READ:
 		{
 			cmd = &slave_info.cmd;
+			LOGD("____XXXXXXX__READ_XXXXXXXXXXXXXX____cmd->cmd=%d\n",cmd->cmd);
 			switch(cmd->cmd)
 			{
 				case CASCADE_CMD_GET_INFO:
@@ -441,11 +453,23 @@ void slave_func(uint16_t reg,void *r_w_data,uint32_t lenth)
 #define REGS(x)    (((x)+(x)%2)/2)
 
 
+static void memswap(uint8_t *buf, int len)
+{
+    int i;
+    uint8_t tmp;
+
+    for(i=0; i<len; i+=2) {
+        tmp = buf[i];
+        buf[i] = buf[i+1];
+        buf[i+1] = tmp;
+    }
+}
+
 static int _mb_write(cascade_handle_t *cas, int addr, data_t *d)
 {
 	int i = 0,r=0,timeout=0;
   int wl,xlen,wlen=0,oncelen=250;
-	uint16_t buff[MB_BUF_SIZE];
+	uint8_t buff[MB_BUF_SIZE+100];
 	if(d->dlen<=0) {
         return -1;
   }
@@ -460,7 +484,11 @@ static int _mb_write(cascade_handle_t *cas, int addr, data_t *d)
      }
 		xlen += xlen%2;
 		memcpy(buff, d->data+wlen, xlen);
-		wl = mb_write(cas->mb, addr, CASCADE_REG_WRITE, buff, xlen/2);
+		LOGD("%X  %X  %X\n",buff[0],buff[1],buff[2]);
+		memswap(buff,xlen%2+xlen);
+		//交换数据
+		 
+		wl = mb_write(cas->mb, addr, CASCADE_REG_WRITE, (uint16_t*)buff, xlen/2);
 		if(wl<0) {
 			LOGE("___ _mb_write failed, addr: %d, reg: %d, cnt: %d, %s, retry: %d\n", addr, CASCADE_REG_WRITE, xlen/2,"write failed",i);
       r = -1; 
@@ -474,6 +502,7 @@ static int _mb_write(cascade_handle_t *cas, int addr, data_t *d)
     wlen += xlen;
 	}
 	lock_off(cas->lock);
+	return r;
 }
 static int _mb_read(cascade_handle_t *cas, int addr, data_t *d)
 {
@@ -510,16 +539,16 @@ static int _mb_read(cascade_handle_t *cas, int addr, data_t *d)
          break;
       }
     }
-		
+		return r;
 }
 
 static int mb_write_read(cascade_handle_t *cas, int addr, data_t *wd, data_t *rd)
 {
     int r=0;
     
-    r = _mb_write(cas->mb, addr,wd);
+    r = _mb_write(cas, addr,wd);
     if(r==0) {
-        r = _mb_read(cas->mb, addr,rd);
+        r = _mb_read(cas, addr,rd);
     }
     return r;
 }
@@ -608,6 +637,12 @@ static int master_cmd(cascade_handle_t *cas,uint8_t cur_dev_addr ,cmd_data_t *cm
     return r;
 }
 
+int cascade_request(cmd_data_t *cmd)
+{
+	master_cmd(&slave_info,1,cmd);
+	LOGD("cnmdmsadasdasd\n");
+	return 0;
+}
 
 static int master_query(cascade_handle_t *cas)
 {

+ 16 - 2
f407/applications/cascade.h

@@ -13,9 +13,21 @@ typedef struct {
     uint8_t         *data;           
 }data_t;
 
+enum {
+    OBJ_OVERALL=0,
+    OBJ_CHANNEL,
+    OBJ_HISTORY,
+    OBJ_SENSOR,
+};
 
-
-
+typedef struct {
+    uint8_t         cmd;
+    uint8_t         obj;
+    uint8_t         chId;
+    // char            time_s[24];   //start time
+    // char            time_e[24];   //end time
+		uint8_t 			data[200];
+}cmd_data_t;
 
 #define AC_DC_DEV_CHN_REG                  	(4000)
 #define AC_DC_DRY_REG         							(4987)
@@ -91,4 +103,6 @@ uint8_t cascade_init(const char* uart,uint8_t mode,uint8_t addr,uint32_t baud);
 uint8_t cascade_deinit();
 void cascade_scan_thread(void *arg);
 void cascade_thread(void *arg);
+
+int cascade_request(cmd_data_t *cmd);
 #endif

+ 1 - 1
f407/applications/cfg.h

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

+ 7 - 1
f407/applications/main.c

@@ -115,7 +115,7 @@ static int user_init(void)
    // ui_init();
     sd_mount();
     
-    //power_init();
+    power_init();
     //web_init();
 	
 	  LOGD("cascade thread!!!!!\n");
@@ -129,7 +129,13 @@ int main(void)
 {
     sys_init();
     user_init();
+		cmd_data_t cmd;
+		cmd.cmd = CASCADE_CMD_GET_INFO;
+		cmd.obj = OBJ_OVERALL;
+	
     while (1) {
+				//cascade_request(&cmd);
+				
         sleep(10);
     }
 }

+ 7 - 7
f407/applications/mb.c

@@ -186,12 +186,12 @@ int mb_read(void *h, uint8_t addr, uint16_t reg, uint16_t *data, int cnt, int ti
     mb_set_tmo(mh->hinst, timeout, 50);
     mb_set_slave(mh->hinst, addr);
     sz = mb_read_regs(mh->hinst, reg, cnt, data);
-    if(sz==cnt) {
-        r = 0;
-    }
+//    if(sz==cnt) {
+//        r = 0;
+//    }
 #endif
     
-    return r;
+    return sz;
 }
 
 
@@ -209,9 +209,9 @@ int mb_write(void *h, uint8_t addr, uint16_t reg, uint16_t *data, int cnt)
 #else
     mb_set_slave(mh->hinst, addr);
     r = mb_write_regs(mh->hinst, reg, cnt, data);
-    if(sz==cnt) {
-        r = 0;
-    }
+//    if(sz==cnt) {
+//        r = 0;
+//    }
 #endif
     
     return r;

+ 1 - 1
f407/applications/packages/qmodbus-latest/inc/modbus_cfg.h

@@ -13,7 +13,7 @@
 
 //#define MB_USING_RAW_PRT        //使用原始通信数据打印
 
-//#define MB_USING_ADDR_CHK       //使用从机地址检查
+#define MB_USING_ADDR_CHK       //使用从机地址检查
 //#define MB_USING_MBAP_CHK       //使用MBAP头检查
 
 #define MB_USING_PORT_RTT       //使用rt-thread系统接口