Przeglądaj źródła

增加断路器检测,修改modbus tcp bug IP bug

liyi 1 rok temu
rodzic
commit
7f9f8bc8ee
4 zmienionych plików z 205 dodań i 66 usunięć
  1. 4 1
      pro/src/app.c
  2. 118 27
      pro/src/appweb_handle.c
  3. 82 36
      pro/src/cascade.c
  4. 1 2
      pro/src/cascade.h

+ 4 - 1
pro/src/app.c

@@ -1511,7 +1511,10 @@ static void* breaker_thread(void *arg)
                     break;
                 }
             }
-            
+            if(temp->breaker_gather_addr == 0)
+            {
+                hlw8110_read_Status(NULL,(int*)(&temp->breaker_status));
+            }
         }
         lock_s_release(LOCK_ID_BREAKER);
         sleep(1);

+ 118 - 27
pro/src/appweb_handle.c

@@ -15,6 +15,7 @@
 #include "mongoose.h"
 #include "language_common.h"
 #include "websocket_handle.h"
+#include "breaker_detection.h"
 
 #define TOTAL_COUNT 60
 #define FN_MAX  30
@@ -5385,49 +5386,139 @@ static void equipmentMintenance(void *conn)
                 strcpy(breakerManager->breaker_switch_name,buff);
                 breakerManager->breaker_id =  i;  
                 uint32_t jdh = atoi(_Over_equipment_mintenance.jdh);
-                if(jdh <= MAX_BREAKER_CHN)
+                if(breakerManager->breaker_gather_addr >= BREADER_485_ADDR && 
+                                    breakerManager->breaker_gather_addr <= (BREADER_485_ADDR + BREAKER_BOARD_MAX))
                 {
-                    char jdh_flag = 0;
-                    char chn[MAX_BREAKER_CHN] = {0};
-
-                    lock_s_hold(LOCK_ID_BREAKER);
-                    list_for_each_entry(temp, &__globalDeviceManage.g_new_global_breaker.list, list)
+                    if(jdh <= MAX_BREAKER_CHN && jdh >0)
                     {
-                        if(temp->breaker_gather_addr == breakerManager->breaker_gather_addr)
+                        char jdh_flag = 0;
+                        char chn[MAX_BREAKER_CHN] = {0};
+
+                        lock_s_hold(LOCK_ID_BREAKER);
+                        list_for_each_entry(temp, &__globalDeviceManage.g_new_global_breaker.list, list)
                         {
-                            chn[temp->breaker_chn-1] = 1;
+                            if(temp->breaker_gather_addr == breakerManager->breaker_gather_addr)
+                            {
+                                chn[temp->breaker_chn-1] = 1;
+                            }
                         }
-                    }
-                    lock_s_release(LOCK_ID_BREAKER);
+                        lock_s_release(LOCK_ID_BREAKER);
 
-                    if(chn[jdh-1] != 1)
+                        if(chn[jdh-1] != 1)
+                        {
+                            breakerManager->breaker_chn = jdh;
+                        }else
+                        {
+                            jdh_flag = 1;
+                        }
+                        
+                        if(jdh_flag == 1)
+                        {
+                            free(breakerManager);
+                            breakerManager = NULL;
+                            ack_str = ctrl_breaker_err_ack_to_json("channel or id is existing!!!!");
+                            
+                        }else{
+                            dev_insert_breaker_genera_manage(__globalDeviceManage.db,breakerManager);
+
+                            lock_s_hold(LOCK_ID_BREAKER);
+                            list_add_tail(&breakerManager->list,&__globalDeviceManage.g_new_global_breaker.list);
+                            lock_s_release(LOCK_ID_BREAKER);
+
+                            ack_str=ctrl_sts_ack_to_json();
+                        }
+                    }else {
+                            free(breakerManager);
+                            breakerManager = NULL;
+                            ack_str = ctrl_breaker_err_ack_to_json("jdh error!!!!");
+                    }
+                }else if(breakerManager->breaker_gather_addr >= 1 && breakerManager->breaker_gather_addr <=30) //controller
+                {
+                    if(jdh <= 2 && jdh > 0)    
                     {
-                        breakerManager->breaker_chn = jdh;
+                        char jdh_flag = 0;
+                        char chn[2] = {0};
+                        lock_s_hold(LOCK_ID_BREAKER);
+                        list_for_each_entry(temp, &__globalDeviceManage.g_new_global_breaker.list, list)
+                        {
+                            if(temp->breaker_gather_addr == breakerManager->breaker_gather_addr)
+                            {
+                                chn[temp->breaker_chn-1] = 1;
+                            }
+                        }
+                        lock_s_release(LOCK_ID_BREAKER);
+                        if(chn[jdh-1] != 1)
+                        {
+                            breakerManager->breaker_chn = jdh;
+                        }else
+                        {
+                            jdh_flag = 1;
+                        }
+                        if(jdh_flag == 1)
+                        {
+                            free(breakerManager);
+                            breakerManager = NULL;
+                            ack_str = ctrl_breaker_err_ack_to_json("channel or id is existing!!!!");
+                            
+                        }else{
+                            dev_insert_breaker_genera_manage(__globalDeviceManage.db,breakerManager);
+
+                            lock_s_hold(LOCK_ID_BREAKER);
+                            list_add_tail(&breakerManager->list,&__globalDeviceManage.g_new_global_breaker.list);
+                            lock_s_release(LOCK_ID_BREAKER);
+
+                            ack_str=ctrl_sts_ack_to_json();
+                        }
+
                     }else
-                    {
-                        jdh_flag = 1;
-                    }
-                     
-                    if(jdh_flag == 1)
                     {
                         free(breakerManager);
                         breakerManager = NULL;
-                        ack_str = ctrl_breaker_err_ack_to_json("channel or id is existing!!!!");
-                        
-                    }else{
-                        dev_insert_breaker_genera_manage(__globalDeviceManage.db,breakerManager);
-
+                        ack_str = ctrl_breaker_err_ack_to_json("jdh error!!!!");
+                    }
+                }else if(breakerManager->breaker_gather_addr == 0) //current support one breaker
+                {
+                    if(jdh == 1)
+                    {
+                        char jdh_flag = 0;
                         lock_s_hold(LOCK_ID_BREAKER);
-                        list_add_tail(&breakerManager->list,&__globalDeviceManage.g_new_global_breaker.list);
+                        list_for_each_entry(temp, &__globalDeviceManage.g_new_global_breaker.list, list)
+                        {
+                            if(temp->breaker_gather_addr == breakerManager->breaker_gather_addr)
+                            {
+                                jdh_flag = 1;
+                            }
+                        }
                         lock_s_release(LOCK_ID_BREAKER);
-
-                        ack_str=ctrl_sts_ack_to_json();
-                    }
-                }else {
+                        if(jdh_flag == 1)
+                        {
+                            free(breakerManager);
+                            breakerManager = NULL;
+                            ack_str = ctrl_breaker_err_ack_to_json("channel or id is existing!!!!");
+                            
+                        }else{
+                            breakerManager->breaker_chn = jdh;
+                            dev_insert_breaker_genera_manage(__globalDeviceManage.db,breakerManager);
+
+                            lock_s_hold(LOCK_ID_BREAKER);
+                            list_add_tail(&breakerManager->list,&__globalDeviceManage.g_new_global_breaker.list);
+                            lock_s_release(LOCK_ID_BREAKER);
+
+                            ack_str=ctrl_sts_ack_to_json();
+                        }
+                    }else
+                    {
                         free(breakerManager);
                         breakerManager = NULL;
                         ack_str = ctrl_breaker_err_ack_to_json("jdh error!!!!");
+                    }   
+                }else
+                {
+                    free(breakerManager);
+                    breakerManager = NULL;
+                    ack_str = ctrl_breaker_err_ack_to_json("not surpport base addr !!");
                 }
+
             }else
             {
                 ack_str = ctrl_breaker_err_ack_to_json("ID More 48 !!!!");

+ 82 - 36
pro/src/cascade.c

@@ -10,6 +10,7 @@
 #include "paras.h"
 #include "cascade_slave_tcp.h"
 #include "sys.h"
+#include "breaker_detection.h"
 
 #if 1
     #define LOGD            log_d
@@ -346,69 +347,114 @@ static int slave_breaker_add(cascade_breaker_add_t *data)
         if(id[i] == 0)
         break;
     }
-        if(i > MAX_BREAKER_ID)
+    if(i > MAX_BREAKER_ID)
+    {
+            goto quit;
+    }
+    uint32_t jdh = data->jdh;
+    char jdh_flag = 0;
+    if((data->cjdz >= BREADER_485_ADDR) && (data->cjdz <= (BREADER_485_ADDR+BREAKER_BOARD_MAX)))        //breaker board
+    {
+        if(jdh > MAX_BREAKER_CHN || jdh < 1)
         {
             goto quit;
         }
-        GlobalBreakerManager *breakerManager = (GlobalBreakerManager*) malloc(sizeof(GlobalBreakerManager));
-        memset(breakerManager,0,sizeof(GlobalBreakerManager));
-        breakerManager->product_id = __globalDeviceManage._globalDevInfo.product.id;
-        breakerManager->breaker_gather_addr = data->cjdz;
-        strcpy(breakerManager->breaker_com,data->com);
-        strcpy(breakerManager->breaker_gather_type,data->cjfs);
-        strcpy(breakerManager->breaker_chns_name,data->breaker_chns);
-
-        breakerManager->breaker_id =  i; 
-        sprintf(buff,"Breaker_%d",breakerManager->breaker_id);
-        strcpy(breakerManager->breaker_switch_name,buff);
         
-
-        uint32_t jdh = data->jdh;
-
-        if(jdh > MAX_BREAKER_CHN)
+        char chn[MAX_BREAKER_CHN] = {0};
+        lock_s_hold(LOCK_ID_BREAKER);
+        list_for_each_entry(temp, &dm->g_new_global_breaker.list, list)
         {
-            goto quit2;
+            if(temp->breaker_gather_addr == data->cjdz)
+            {
+                chn[temp->breaker_chn-1] = 1;
+            }
+        }
+        lock_s_release(LOCK_ID_BREAKER);
+        if(chn[jdh-1] != 1)
+        {
+            //breakerManager->breaker_chn = jdh;
+        }else
+        {
+            jdh_flag = 1;
+        }
+        if(jdh_flag == 1)
+        {
+            goto quit;
         }
 
-        char jdh_flag = 0;
-
-        char chn[MAX_BREAKER_CHN] = {0};
-
+    }else if(data->cjdz > 0 && data->cjdz <= 30)    //controller
+    {
+        char chn[2] = {0};
+        if(jdh > 2 || jdh < 1)
+        {
+            goto quit;
+        }
         lock_s_hold(LOCK_ID_BREAKER);
         list_for_each_entry(temp, &dm->g_new_global_breaker.list, list)
         {
-            if(temp->breaker_gather_addr == breakerManager->breaker_gather_addr)
+            if(temp->breaker_gather_addr == data->cjdz)
             {
                 chn[temp->breaker_chn-1] = 1;
             }
         }
         lock_s_release(LOCK_ID_BREAKER);
-
         if(chn[jdh-1] != 1)
         {
-            breakerManager->breaker_chn = jdh;
+           // breakerManager->breaker_chn = jdh;
         }else
         {
             jdh_flag = 1;
         }
-        
         if(jdh_flag == 1)
         {
-            goto quit2;
-        }else{
-            dev_insert_breaker_genera_manage(dm->db,breakerManager);
-
-            lock_s_hold(LOCK_ID_BREAKER);
-            list_add_tail(&breakerManager->list,&dm->g_new_global_breaker.list);
-            lock_s_release(LOCK_ID_BREAKER);
-            r = 0;
+            goto quit;
+        }
+    }else if(data->cjdz == 0)                //current board
+    {
+        if(jdh != 1)
+        {
+            goto quit;
+        }
+        lock_s_hold(LOCK_ID_BREAKER);
+        list_for_each_entry(temp, &dm->g_new_global_breaker.list, list)
+        {
+            if(temp->breaker_gather_addr == data->cjdz)
+            {
+                jdh_flag = 1;
+            }
         }
+        lock_s_release(LOCK_ID_BREAKER);
+        if(jdh_flag)
+        {
+            goto quit;
+        }
+    }else
+    {
+       goto quit;
+    }
+        GlobalBreakerManager *breakerManager = (GlobalBreakerManager*) malloc(sizeof(GlobalBreakerManager));
+        memset(breakerManager,0,sizeof(GlobalBreakerManager));
+        breakerManager->product_id = __globalDeviceManage._globalDevInfo.product.id;
+        breakerManager->breaker_gather_addr = data->cjdz;
+        strcpy(breakerManager->breaker_com,data->com);
+        strcpy(breakerManager->breaker_gather_type,data->cjfs);
+        strcpy(breakerManager->breaker_chns_name,data->breaker_chns);
+        breakerManager->breaker_chn = jdh;
+        breakerManager->breaker_id =  i; 
+        sprintf(buff,"Breaker_%d",breakerManager->breaker_id);
+        strcpy(breakerManager->breaker_switch_name,buff);
+    
+
+        dev_insert_breaker_genera_manage(dm->db,breakerManager);
+
+        lock_s_hold(LOCK_ID_BREAKER);
+        list_add_tail(&breakerManager->list,&dm->g_new_global_breaker.list);
+        lock_s_release(LOCK_ID_BREAKER);
+        r = 0;
+        
 
     return r;
 
-quit2:
-    free(breakerManager);
-    breakerManager = NULL;
 quit:
     return r;
 }

+ 1 - 2
pro/src/cascade.h

@@ -10,7 +10,6 @@
 
 #define MAX_BREAKER_CHN                 (6)
 #define MAX_BREAKER_ID                  (49) 
-#define MAX_BREAKER_DIO_CHN             1
 
 #define CASCADE_MAX                     32
 #define ERR_MAX                         5
@@ -179,7 +178,7 @@ typedef struct{
     uint16_t breaker_status;
     uint16_t breaker_addrs;
     int breaker_id;
-    char breaker_gather_type[6];
+    char breaker_gather_type[64];
     char breaker_com[20];
     char breaker_switch_name[64];
     char breaker_chns_name[64];    //