guohui лет назад: 2
Родитель
Сommit
bb03dba734

+ 0 - 113
04-软件设计及源码/03-核心板/V1.0/05.src/smart_pdu/src/cascade.c

@@ -3,7 +3,6 @@
 #include "xlist.h"
 #include "elog.h"
 #include "paras.h"
-#include "modbus-rtu.h"
 #include "cfg.h"
 #include "sys.h"
 #include "paras.h"
@@ -637,100 +636,7 @@ static inline GlobalDeviceInfo *get_dev(void)
 {
     return &paras_get()->dev;
 }
-static int mbus_init(cascade_handle_t *cas, char *path, int mode, int addr, uint32_t baud)
-{
-    int r;
-
-    cas->mb = modbus_new_rtu(path, baud, 'N', 8, 1);
-    if(cas->mb == NULL)
-        return -1;
-
-    r = modbus_connect(cas->mb);
-    if (r!=0) {
-        LOGD("____modbus_connect failed, %s\n", modbus_strerror(errno));
-        return -1;
-    }
 
-    //r = modbus_rtu_set_serial_mode(cas->mb, MODBUS_RTU_RS485);
-    if (r != 0){
-        LOGD("____modbus_rtu_set_serial_mode failed, %s\n", modbus_strerror(errno));
-        return -1;
-    }
-
-    r = modbus_rtu_set_rts(cas->mb, MODBUS_RTU_RTS_NONE);
-    if (r != 0) {
-        LOGD("____modbus_rtu_set_rts failed, %s\n", modbus_strerror(errno));
-        return -1;
-    }
-    r = modbus_set_error_recovery(cas->mb, MODBUS_ERROR_RECOVERY_PROTOCOL);
-    
-    //设置超时时间为2S
-    modbus_set_response_timeout(cas->mb, 1, 5000);
-    modbus_set_byte_timeout(cas->mb, 0, 50000);
-
-    cas->addr = addr;
-    if(mode==MODBUS_SLAVE) {   //slave mode
-        modbus_set_slave(cas->mb, addr);
-    }
-
-    r = pthread_mutex_init(&cas->mutex, NULL);
-    if (r) {
-        LOGD("____pthread_mutex_init failed\n");
-        return -1;
-    }
-
-    return 0;
-}
-static int mbus_deinit(cascade_handle_t *cas)
-{
-    modbus_close(&cas->mb);
-    modbus_free(&cas->mb);
-    return 0;
-}
-static int mbus_read(cascade_handle_t *cas, int addr, uint16_t reg, uint16_t *data, int len)
-{
-    int r=0;
-    pthread_mutex_lock(&cas->mutex);
-    modbus_set_slave(cas->mb, addr);
-    r = modbus_read_registers(cas->mb, reg, (len+len%2)/2, data);
-    pthread_mutex_unlock(&cas->mutex);
-    return r ;
-}
-static int mbus_write(cascade_handle_t *cas, int addr, uint16_t reg, uint16_t *data, int len)
-{
-    int r=0;
-    pthread_mutex_lock(&cas->mutex);
-    modbus_set_slave(cas->mb, addr);
-    r = modbus_write_registers(cas->mb, reg, (len+len%2)/2, data);
-    pthread_mutex_unlock(&cas->mutex);
-    return r ;
-}
-static int mbus_write_read(cascade_handle_t *cas, int addr, uint16_t reg, uint16_t *wdata, int wlen, uint16_t *rdata, int rlen)
-{
-    int r=0;
-    pthread_mutex_lock(&cas->mutex);
-    modbus_set_slave(cas->mb, addr);
-    r = modbus_write_and_read_registers(cas->mb, reg, (wlen+wlen%2)/2, wdata, reg, (rlen+rlen%2)/2, rdata);
-    pthread_mutex_unlock(&cas->mutex);
-    return r ;
-}
-
-static int mbus_receive(cascade_handle_t *cas, uint8_t *req)
-{
-    int r=0;
-    pthread_mutex_lock(&cas->mutex);
-    r = modbus_receive(cas->mb, req);
-    pthread_mutex_unlock(&cas->mutex);
-    return r ;
-}
-static int mbus_reply(cascade_handle_t *cas, uint8_t *req, int reqlen, modbus_mapping_t *map)
-{
-    int r=0;
-    pthread_mutex_lock(&cas->mutex);
-    r = modbus_reply(cas->mb, req, reqlen, map);
-    pthread_mutex_unlock(&cas->mutex);
-    return r ;
-}
 /////////////////////////////////////////////////////////////////////////
 static int find_addr_fn(handle_t l, node_t *node, node_t *xd, void *arg, int *act)
 {
@@ -961,26 +867,7 @@ static void* scan_thread(void *arg)
 
     pthread_exit(NULL);
 }
-static int mb_init(cascade_handle_t *cas)
-{
-    int r;
-    ModbusInfo_t *info=&get_dev()->_gmodbus_info;
 
-    if(cas->inited) {
-        mbus_deinit(&cas);
-    }
-    cas->inited = 0;
-    r = mbus_init(cas, CASCADE_MODBUS_PORT, info->product_modbus_type,
-                  (info->product_modbus_type==MODBUS_MASTER)?0:info->product_modbus_addr,
-                  info->product_modbus_baud);
-    if(r!=0) {
-        LOGE("cascade modbus init error.\n");
-        return -1;
-    }
-    cas->inited = 1;
-
-    return 0;
-}
 
 
 int cascade_init(void)

+ 159 - 0
04-软件设计及源码/03-核心板/V1.0/05.src/smart_pdu/src/mb.c

@@ -0,0 +1,159 @@
+#include <pthread.h>
+#include <errno.h>
+#include "modbus-rtu.h"
+#include "mb.h"
+
+typedef struct {
+    
+    int                 inited;
+    pthread_mutex_t     mutex;
+    int                 addr;
+    
+    modbus_t            *mb;
+    modbus_mapping_t    *map;
+    uint8_t             query[MODBUS_RTU_MAX_ADU_LENGTH];
+}mb_handle_t;
+static mb_handle_t mbHandle;
+
+
+
+int mb_init(char *path, int addr, uint32_t baudrate)
+{
+    int r;
+    mb_handle_t *h=&mbHandle;
+
+    h->mb = modbus_new_rtu(path, baudrate, 'N', 8, 1);
+    if(h->mb == NULL)
+        return -1;
+
+    r = modbus_connect(h->mb);
+    if (r!=0) {
+        LOGD("____modbus_connect failed, %s\n", modbus_strerror(errno));
+        return -1;
+    }
+
+    //r = modbus_rtu_set_serial_mode(cas->mb, MODBUS_RTU_RS485);
+    if (r != 0){
+        LOGD("____modbus_rtu_set_serial_mode failed, %s\n", modbus_strerror(errno));
+        return -1;
+    }
+
+    r = modbus_rtu_set_rts(h->mb, MODBUS_RTU_RTS_NONE);
+    if (r != 0) {
+        LOGD("____modbus_rtu_set_rts failed, %s\n", modbus_strerror(errno));
+        return -1;
+    }
+    r = modbus_set_error_recovery(h->mb, MODBUS_ERROR_RECOVERY_PROTOCOL);
+    
+    //设置超时时间为2S
+    modbus_set_response_timeout(h->mb, 1, 5000);
+    modbus_set_byte_timeout(h->mb, 0, 50000);
+
+    h->addr = addr;
+    if(h->addr>0) {   //slave mode
+        modbus_set_slave(h->mb, addr);
+    }
+
+    r = pthread_mutex_init(&h->mutex, NULL);
+    if (r) {
+        LOGD("____pthread_mutex_init failed\n");
+        return -1;
+    }
+    h->inited = 1;
+
+    return 0;
+}
+
+
+int mb_deinit(mb_handle_t *h)
+{
+    if(!h) {
+        return -1;
+    }
+
+    if(h->inited) {
+        modbus_close(&h->mb);
+        modbus_free(&h->mb);
+    }
+    h->inited = 0;
+    free(h);
+
+    return 0;
+}
+
+
+int mb_read(mb_handle_t *h, int addr, uint16_t reg, uint16_t *data, int len)
+{
+    int r=0;
+
+    if(!h) {
+        return -1;
+    }
+
+    pthread_mutex_lock(&cas->mutex);
+    modbus_set_slave(cas->mb, addr);
+    r = modbus_read_registers(cas->mb, reg, (len+len%2)/2, data);
+    pthread_mutex_unlock(&cas->mutex);
+    return r ;
+}
+
+
+int mb_write(mb_handle_t *h, int addr, uint16_t reg, uint16_t *data, int len)
+{
+    int r=0;
+
+    if(!h) {
+        return -1;
+    }
+
+    pthread_mutex_lock(&cas->mutex);
+    modbus_set_slave(cas->mb, addr);
+    r = modbus_write_registers(cas->mb, reg, (len+len%2)/2, data);
+    pthread_mutex_unlock(&cas->mutex);
+    return r ;
+}
+static int mbus_write_read(mb_handle_t *h, int addr, uint16_t reg, uint16_t *wdata, int wlen, uint16_t *rdata, int rlen)
+{
+    int r=0;
+
+    if(!h) {
+        return -1;
+    }
+
+    pthread_mutex_lock(&cas->mutex);
+    modbus_set_slave(cas->mb, addr);
+    r = modbus_write_and_read_registers(cas->mb, reg, (wlen+wlen%2)/2, wdata, reg, (rlen+rlen%2)/2, rdata);
+    pthread_mutex_unlock(&cas->mutex);
+    return r ;
+}
+
+
+int mbus_receive(mb_handle_t *h, uint8_t *req)
+{
+    int r=0;
+
+    if(!h) {
+        return -1;
+    }
+
+    pthread_mutex_lock(&h->mutex);
+    r = modbus_receive(h->mb, req);
+    pthread_mutex_unlock(&h->mutex);
+    return r ;
+}
+
+
+int mbus_reply(mb_handle_t *h, uint8_t *req, int reqlen, modbus_mapping_t *map)
+{
+    int r=0;
+
+    if(!h) {
+        return -1;
+    }
+
+    pthread_mutex_lock(&h->mutex);
+    r = modbus_reply(cas->mb, req, reqlen, map);
+    pthread_mutex_unlock(&cas->mutex);
+    return r ;
+}
+

+ 22 - 0
04-软件设计及源码/03-核心板/V1.0/05.src/smart_pdu/src/mb.h

@@ -0,0 +1,22 @@
+#ifndef __MB_Hx__
+#define __MB_Hx__
+
+
+enum {
+    MB_MASTER=0,
+    MB_SLAVE,
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+#endif