瀏覽代碼

modbus tcp to user

liyi 1 年之前
父節點
當前提交
2358c490a6
共有 7 個文件被更改,包括 183 次插入 和 0 次删除
  1. 1 0
      pro/CMakeLists.txt
  2. 20 0
      pro/src/cascade.c
  3. 126 0
      pro/src/cascade_slave_tcp.c
  4. 20 0
      pro/src/cascade_slave_tcp.h
  5. 13 0
      pro/src/common.h
  6. 1 0
      pro/src/thread.c
  7. 2 0
      pro/src/thread.h

+ 1 - 0
pro/CMakeLists.txt

@@ -94,6 +94,7 @@ set(PDU_SRC_LIST
 	${PROJECT_SOURCE_DIR}/src/pduMIB_trap.c
 	${PROJECT_SOURCE_DIR}/src/hlw8110_handle.c
 	${PROJECT_SOURCE_DIR}/src/breaker_detection.c
+	${PROJECT_SOURCE_DIR}/src/cascade_slave_tcp.c
 	)
 
 set(NO_WARNNING_FLAGS "-Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable")

+ 20 - 0
pro/src/cascade.c

@@ -8,6 +8,8 @@
 #include "modbus_handle.h"
 #include "sqlite_handle.h"
 #include "paras.h"
+#include "cascade_slave_tcp.h"
+#include "sys.h"
 
 #if 1
     #define LOGD            log_d
@@ -1781,10 +1783,28 @@ int cascade_init(void)
                                                  CASCADE_REG_WRITE, MAX_WRITE_REGS2);
 
     set_modbus(cas, get_mb());
+    
+    cascade_slave_init();
+
     slave_add(cas, 0);
 
     thread_start(THREAD_ID_CASCADE, cas);
     thread_start(THREAD_ID_CASCADE_SCAN, cas);
+
+    GlobalDeviceManager* dm =get_dm();
+    NetworkInfo_t net = {0};
+    sys_get_net(&net,IP_V4);
+    uint8_t addr = 0;
+    if(!dm->_globalDevInfo.cascade.mode)
+    {
+        addr = 0XFF; 
+    }else
+    {
+        addr = dm->_globalDevInfo.cascade.addr;
+    }
+
+    dm->md_tcp = tcp_modbus_init(net.ip_address,CASCADE_SLAVE_PORT,addr,dm->_globalDevInfo.product.pwr_type);
+    thread_start(THREAD_ID_TCP, NULL);
         
     return 0;
 }

+ 126 - 0
pro/src/cascade_slave_tcp.c

@@ -0,0 +1,126 @@
+#include "cascade_slave_tcp.h"
+#include "stdlib.h"
+#include "cascade.h"
+#include "thread.h"
+
+
+Modbus_Manger_Tcp* tcp_modbus_init(const char* ip, uint16_t port,uint8_t addr,int power_type)
+{
+    Modbus_Manger_Tcp* tcp  = NULL;
+    tcp = (Modbus_Manger_Tcp*)malloc(sizeof(Modbus_Manger_Tcp));
+    if(!tcp)
+    {
+        log_d("malloc modubus manger faield!!!\n");
+        goto err1;
+    }
+    memset(tcp, 0, sizeof(Modbus_Manger_Tcp));
+    
+    tcp->ctx = modbus_new_tcp(ip, port);
+    if(!tcp->ctx)
+    {
+        log_d("malloc modbus_tcp ctx faield!!!\n");
+        goto err2;
+    }
+    
+    struct timeval response_timeout;
+    response_timeout.tv_sec = 1;
+    response_timeout.tv_usec = 0;
+    modbus_set_response_timeout(tcp->ctx, 0,800000);
+    modbus_set_byte_timeout(tcp->ctx,0,50000);
+    modbus_set_error_recovery(tcp->ctx,MODBUS_ERROR_RECOVERY_PROTOCOL);
+    modbus_set_slave(tcp->ctx,addr);
+    strcpy(tcp->ip,ip);
+    tcp->port = port;
+    tcp->slave_id = addr;
+    tcp->power_type = power_type;
+    return tcp;
+err2:
+    free(tcp);
+err1:
+    return tcp;
+}
+
+
+void  tcp_modbus_deinit(Modbus_Manger_Tcp **tcp)
+{
+    Modbus_Manger_Tcp** tmp = tcp;
+    if(tmp)
+    {
+        if(*tmp)
+        {
+            modbus_free((*tmp)->ctx);
+            modbus_close((*tmp)->ctx);
+
+            free(*tmp);
+            *tmp = 0;   
+        }
+    }
+    
+}
+
+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_hdr(uint8_t *data, int datalen, mb_hdr_t *h)
+{
+    h->addr = data[0];
+    h->func = data[1];
+    h->reg  = data[2]<<8 | data[3];
+    h->regcnt = data[4]<<8 | data[5];
+
+    h->dlen = 0;
+    h->data = NULL;
+    if(datalen>8) {
+        h->dlen = data[6];
+        h->data = data+7;
+
+        memswap(h->data, h->dlen+h->dlen%2);
+    }
+    //print_hdr("sss", h);
+
+    return 0;
+}
+static inline GlobalDeviceManager* get_dm(void)
+{
+    return &__globalDeviceManage;
+}
+
+void* tcp_modbus_thread(void *arg)
+{
+    //GlobalDeviceManager *mgr = (GlobalDeviceManager *)(arg);
+    
+    GlobalDeviceManager *mgr = get_dm();
+    Modbus_Manger_Tcp *tcp = mgr->md_tcp;
+    tcp->connection = modbus_tcp_listen(tcp->ctx,CASCADE_SLAVE_CONNECTION);
+    modbus_tcp_accept(tcp->ctx,&tcp->connection);
+    uint8_t query[MODBUS_TCP_MAX_ADU_LENGTH] = {0};
+    mb_hdr_t h;
+    log_d("start tcp modbus thread!!!\n");
+    int rc = 0;
+    while(1)
+    {
+        rc = modbus_receive(tcp->ctx,query);
+        if(rc > 0)
+        {
+            _mb_hdr(&query[6],rc,&h);
+            if(h.func==MODBUS_FC_READ_HOLDING_REGISTERS) {
+                cascade_slave_read(h.reg, h.regcnt);
+            }
+            else if(h.func==MODBUS_FC_WRITE_SINGLE_REGISTER) {
+                cascade_slave_write(h.reg, h.regcnt);
+            }
+            modbus_reply(tcp->ctx,query,rc,cascade_slave_map());
+            //r = _mb_reply(cas, buff, rc,cascade_slave_map());
+        }
+    }
+
+}

+ 20 - 0
pro/src/cascade_slave_tcp.h

@@ -0,0 +1,20 @@
+#ifndef __CASCADE_SLAVE_TCP_H__ 
+#define __CASCADE_SLAVE_TCP_H__ 
+
+#include "stdint.h"
+#include "modbus.h"
+#include "common.h"
+
+
+
+#define CASCADE_SLAVE_CONNECTION                5
+#define CASCADE_SLAVE_PORT                      6666
+
+
+
+Modbus_Manger_Tcp* tcp_modbus_init(const char * ip, uint16_t port,uint8_t addr,int power_type);
+void  tcp_modbus_deinit(Modbus_Manger_Tcp **tcp);
+
+
+#endif
+

+ 13 - 0
pro/src/common.h

@@ -918,6 +918,18 @@ typedef struct cascade_triphasic_mmap{
 }cascade_triphasic_mmap_t;
 
 
+typedef struct
+{
+    modbus_t *ctx;
+    char ip[64];
+    uint16_t port;
+    uint8_t slave_id;
+    uint8_t power_type;
+    modbus_mapping_t *map;
+    int connection;
+    //pthread_mutex_t mutex;
+}Modbus_Manger_Tcp;
+
 
 
 #pragma pack ()
@@ -1031,6 +1043,7 @@ typedef struct
 
     smtp_info_t          smtpInfo;
     mqtt_info_t          mqttInfo;
+    Modbus_Manger_Tcp *md_tcp;
 }GlobalDeviceManager;
 
 extern GlobalDeviceManager __globalDeviceManage;

+ 1 - 0
pro/src/thread.c

@@ -18,6 +18,7 @@ static thread_attr_t thdAttrs[THREAD_ID_MAX]={
     {"brkscan",     breaker_scanner_thread,     NULL,           8*MB,           1},
     {"mqtt",        mqtt_thread,                NULL,           8*MB,           1},
     {"smtp",        smtp_thread,                NULL,           8*MB,           1},
+    {"modbus_tcp",  tcp_modbus_thread,          NULL,           8*MB,           1},
 };
 static thread_handle_t thdHandles[THREAD_ID_MAX]={0};
 

+ 2 - 0
pro/src/thread.h

@@ -29,6 +29,7 @@ enum {
     THREAD_ID_BREAKER_SCANNER,
     THREAD_ID_MQTT,
     THREAD_ID_SMTP,
+    THREAD_ID_TCP,
     
     THREAD_ID_MAX=30
 };
@@ -70,6 +71,7 @@ void* netswitch_thread(void *arg);
 void* breaker_scanner_thread(void *arg);
 void* mqtt_thread(void *arg);
 void* smtp_thread(void *arg);
+void* tcp_modbus_thread(void *arg);
 
 
 int thread_start(int id, void *arg);