From 74bb1731477dd829b54c3e0b331c76de9b1d53ef Mon Sep 17 00:00:00 2001 From: Stefan Wahren Date: Mon, 23 Apr 2012 20:56:26 +0200 Subject: [PATCH] Added multi-telegram support for serial connection --- bin/Makefile.am | 6 +- bin/Makefile.in | 41 +++++- bin/mbus-serial-request-data-multi-reply.c | 142 +++++++++++++++++++++ 3 files changed, 187 insertions(+), 2 deletions(-) create mode 100644 bin/mbus-serial-request-data-multi-reply.c diff --git a/bin/Makefile.am b/bin/Makefile.am index e7ab902..7710550 100644 --- a/bin/Makefile.am +++ b/bin/Makefile.am @@ -15,7 +15,7 @@ AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir) -I$(top_srcdir)/src noinst_HEADERS = bin_PROGRAMS = mbus-tcp-scan mbus-tcp-request-data mbus-tcp-request-data-multi-reply \ mbus-tcp-select-secondary mbus-tcp-scan-secondary \ - mbus-serial-scan mbus-serial-request-data \ + mbus-serial-scan mbus-serial-request-data mbus-serial-request-data-multi-reply \ mbus-serial-select-secondary mbus-serial-scan-secondary \ mbus-serial-switch-baudrate @@ -49,6 +49,10 @@ mbus_serial_request_data_LDFLAGS = -L$(top_builddir)/mbus mbus_serial_request_data_LDADD = -lmbus mbus_serial_request_data_SOURCES = mbus-serial-request-data.c +mbus_serial_request_data_multi_reply_LDFLAGS = -L$(top_builddir)/mbus +mbus_serial_request_data_multi_reply_LDADD = -lmbus +mbus_serial_request_data_multi_reply_SOURCES = mbus-serial-request-data-multi-reply.c + mbus_serial_select_secondary_LDFLAGS = -L$(top_builddir)/mbus mbus_serial_select_secondary_LDADD = -lmbus mbus_serial_select_secondary_SOURCES = mbus-serial-select-secondary.c diff --git a/bin/Makefile.in b/bin/Makefile.in index d86e4bf..acf0538 100644 --- a/bin/Makefile.in +++ b/bin/Makefile.in @@ -40,8 +40,10 @@ bin_PROGRAMS = mbus-tcp-scan$(EXEEXT) mbus-tcp-request-data$(EXEEXT) \ mbus-tcp-select-secondary$(EXEEXT) \ mbus-tcp-scan-secondary$(EXEEXT) mbus-serial-scan$(EXEEXT) \ mbus-serial-request-data$(EXEEXT) \ + mbus-serial-request-data-multi-reply$(EXEEXT) \ mbus-serial-select-secondary$(EXEEXT) \ - mbus-serial-scan-secondary$(EXEEXT) + mbus-serial-scan-secondary$(EXEEXT) \ + mbus-serial-switch-baudrate$(EXEEXT) subdir = bin DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in @@ -66,6 +68,16 @@ mbus_serial_request_data_DEPENDENCIES = mbus_serial_request_data_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(mbus_serial_request_data_LDFLAGS) $(LDFLAGS) -o $@ +am_mbus_serial_request_data_multi_reply_OBJECTS = \ + mbus-serial-request-data-multi-reply.$(OBJEXT) +mbus_serial_request_data_multi_reply_OBJECTS = \ + $(am_mbus_serial_request_data_multi_reply_OBJECTS) +mbus_serial_request_data_multi_reply_DEPENDENCIES = +mbus_serial_request_data_multi_reply_LINK = $(LIBTOOL) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) \ + $(mbus_serial_request_data_multi_reply_LDFLAGS) $(LDFLAGS) -o \ + $@ am_mbus_serial_scan_OBJECTS = mbus-serial-scan.$(OBJEXT) mbus_serial_scan_OBJECTS = $(am_mbus_serial_scan_OBJECTS) mbus_serial_scan_DEPENDENCIES = @@ -90,6 +102,15 @@ mbus_serial_select_secondary_LINK = $(LIBTOOL) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(mbus_serial_select_secondary_LDFLAGS) \ $(LDFLAGS) -o $@ +am_mbus_serial_switch_baudrate_OBJECTS = \ + mbus-serial-switch-baudrate.$(OBJEXT) +mbus_serial_switch_baudrate_OBJECTS = \ + $(am_mbus_serial_switch_baudrate_OBJECTS) +mbus_serial_switch_baudrate_DEPENDENCIES = +mbus_serial_switch_baudrate_LINK = $(LIBTOOL) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(mbus_serial_switch_baudrate_LDFLAGS) \ + $(LDFLAGS) -o $@ am_mbus_tcp_request_data_OBJECTS = mbus-tcp-request-data.$(OBJEXT) mbus_tcp_request_data_OBJECTS = $(am_mbus_tcp_request_data_OBJECTS) mbus_tcp_request_data_DEPENDENCIES = @@ -142,17 +163,21 @@ LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(mbus_serial_request_data_SOURCES) \ + $(mbus_serial_request_data_multi_reply_SOURCES) \ $(mbus_serial_scan_SOURCES) \ $(mbus_serial_scan_secondary_SOURCES) \ $(mbus_serial_select_secondary_SOURCES) \ + $(mbus_serial_switch_baudrate_SOURCES) \ $(mbus_tcp_request_data_SOURCES) \ $(mbus_tcp_request_data_multi_reply_SOURCES) \ $(mbus_tcp_scan_SOURCES) $(mbus_tcp_scan_secondary_SOURCES) \ $(mbus_tcp_select_secondary_SOURCES) DIST_SOURCES = $(mbus_serial_request_data_SOURCES) \ + $(mbus_serial_request_data_multi_reply_SOURCES) \ $(mbus_serial_scan_SOURCES) \ $(mbus_serial_scan_secondary_SOURCES) \ $(mbus_serial_select_secondary_SOURCES) \ + $(mbus_serial_switch_baudrate_SOURCES) \ $(mbus_tcp_request_data_SOURCES) \ $(mbus_tcp_request_data_multi_reply_SOURCES) \ $(mbus_tcp_scan_SOURCES) $(mbus_tcp_scan_secondary_SOURCES) \ @@ -311,12 +336,18 @@ mbus_serial_scan_SOURCES = mbus-serial-scan.c mbus_serial_request_data_LDFLAGS = -L$(top_builddir)/mbus mbus_serial_request_data_LDADD = -lmbus mbus_serial_request_data_SOURCES = mbus-serial-request-data.c +mbus_serial_request_data_multi_reply_LDFLAGS = -L$(top_builddir)/mbus +mbus_serial_request_data_multi_reply_LDADD = -lmbus +mbus_serial_request_data_multi_reply_SOURCES = mbus-serial-request-data-multi-reply.c mbus_serial_select_secondary_LDFLAGS = -L$(top_builddir)/mbus mbus_serial_select_secondary_LDADD = -lmbus mbus_serial_select_secondary_SOURCES = mbus-serial-select-secondary.c mbus_serial_scan_secondary_LDFLAGS = -L$(top_builddir)/mbus mbus_serial_scan_secondary_LDADD = -lmbus mbus_serial_scan_secondary_SOURCES = mbus-serial-scan-secondary.c +mbus_serial_switch_baudrate_LDFLAGS = -L$(top_builddir)/mbus +mbus_serial_switch_baudrate_LDADD = -lmbus +mbus_serial_switch_baudrate_SOURCES = mbus-serial-switch-baudrate.c all: all-am .SUFFIXES: @@ -397,6 +428,9 @@ clean-binPROGRAMS: mbus-serial-request-data$(EXEEXT): $(mbus_serial_request_data_OBJECTS) $(mbus_serial_request_data_DEPENDENCIES) @rm -f mbus-serial-request-data$(EXEEXT) $(mbus_serial_request_data_LINK) $(mbus_serial_request_data_OBJECTS) $(mbus_serial_request_data_LDADD) $(LIBS) +mbus-serial-request-data-multi-reply$(EXEEXT): $(mbus_serial_request_data_multi_reply_OBJECTS) $(mbus_serial_request_data_multi_reply_DEPENDENCIES) + @rm -f mbus-serial-request-data-multi-reply$(EXEEXT) + $(mbus_serial_request_data_multi_reply_LINK) $(mbus_serial_request_data_multi_reply_OBJECTS) $(mbus_serial_request_data_multi_reply_LDADD) $(LIBS) mbus-serial-scan$(EXEEXT): $(mbus_serial_scan_OBJECTS) $(mbus_serial_scan_DEPENDENCIES) @rm -f mbus-serial-scan$(EXEEXT) $(mbus_serial_scan_LINK) $(mbus_serial_scan_OBJECTS) $(mbus_serial_scan_LDADD) $(LIBS) @@ -406,6 +440,9 @@ mbus-serial-scan-secondary$(EXEEXT): $(mbus_serial_scan_secondary_OBJECTS) $(mbu mbus-serial-select-secondary$(EXEEXT): $(mbus_serial_select_secondary_OBJECTS) $(mbus_serial_select_secondary_DEPENDENCIES) @rm -f mbus-serial-select-secondary$(EXEEXT) $(mbus_serial_select_secondary_LINK) $(mbus_serial_select_secondary_OBJECTS) $(mbus_serial_select_secondary_LDADD) $(LIBS) +mbus-serial-switch-baudrate$(EXEEXT): $(mbus_serial_switch_baudrate_OBJECTS) $(mbus_serial_switch_baudrate_DEPENDENCIES) + @rm -f mbus-serial-switch-baudrate$(EXEEXT) + $(mbus_serial_switch_baudrate_LINK) $(mbus_serial_switch_baudrate_OBJECTS) $(mbus_serial_switch_baudrate_LDADD) $(LIBS) mbus-tcp-request-data$(EXEEXT): $(mbus_tcp_request_data_OBJECTS) $(mbus_tcp_request_data_DEPENDENCIES) @rm -f mbus-tcp-request-data$(EXEEXT) $(mbus_tcp_request_data_LINK) $(mbus_tcp_request_data_OBJECTS) $(mbus_tcp_request_data_LDADD) $(LIBS) @@ -428,10 +465,12 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbus-serial-request-data-multi-reply.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbus-serial-request-data.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbus-serial-scan-secondary.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbus-serial-scan.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbus-serial-select-secondary.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbus-serial-switch-baudrate.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbus-tcp-request-data-multi-reply.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbus-tcp-request-data.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbus-tcp-scan-secondary.Po@am__quote@ diff --git a/bin/mbus-serial-request-data-multi-reply.c b/bin/mbus-serial-request-data-multi-reply.c new file mode 100644 index 0000000..fb90ad0 --- /dev/null +++ b/bin/mbus-serial-request-data-multi-reply.c @@ -0,0 +1,142 @@ +//------------------------------------------------------------------------------ +// Copyright (C) 2011, Robert Johansson, Raditex AB +// All rights reserved. +// +// rSCADA +// http://www.rSCADA.se +// info@rscada.se +// +//------------------------------------------------------------------------------ + +#include +#include +#include +#include +#include + +#include +#include + +static int debug = 0; + +//------------------------------------------------------------------------------ +// Scan for devices using secondary addressing. +//------------------------------------------------------------------------------ +int +main(int argc, char **argv) +{ + mbus_frame reply; + mbus_frame_data reply_data; + mbus_handle *handle = NULL; + + char *device, *addr_str, matching_addr[16]; + int address, baudrate = 9600; + + memset((void *)&reply, 0, sizeof(mbus_frame)); + memset((void *)&reply_data, 0, sizeof(mbus_frame_data)); + + if (argc == 3) + { + device = argv[1]; + addr_str = argv[2]; + } + else if (argc == 4 && strcmp(argv[1], "-d") == 0) + { + device = argv[2]; + addr_str = argv[3]; + debug = 1; + } + else if (argc == 5 && strcmp(argv[1], "-b") == 0) + { + baudrate = atoi(argv[2]); + device = argv[3]; + addr_str = argv[4]; + } + else if (argc == 6 && strcmp(argv[1], "-d") == 0 && strcmp(argv[2], "-b") == 0) + { + baudrate = atoi(argv[3]); + device = argv[4]; + addr_str = argv[5]; + debug = 1; + } + else + { + fprintf(stderr, "usage: %s [-d] [-b BAUDRATE] device mbus-address\n", argv[0]); + fprintf(stderr, " optional flag -d for debug printout\n"); + fprintf(stderr, " optional flag -b for selecting baudrate\n"); + return 0; + } + + if ((handle = mbus_connect_serial(device)) == NULL) + { + fprintf(stderr, "Failed to setup connection to M-bus gateway\n"); + return 1; + } + + if (mbus_serial_set_baudrate(handle->m_serial_handle, baudrate) == -1) + { + printf("Failed to set baud rate.\n"); + return 1; + } + + + if (strlen(addr_str) == 16) + { + // secondary addressing + + int probe_ret; + + probe_ret = mbus_probe_secondary_address(handle, addr_str, matching_addr); + + if (probe_ret == MBUS_PROBE_COLLISION) + { + fprintf(stderr, "%s: Error: The address mask [%s] matches more than one device.\n", __PRETTY_FUNCTION__, addr_str); + return 1; + } + else if (probe_ret == MBUS_PROBE_NOTHING) + { + fprintf(stderr, "%s: Error: The selected secondary address does not match any device [%s].\n", __PRETTY_FUNCTION__, addr_str); + return 1; + } + else if (probe_ret == MBUS_PROBE_ERROR) + { + fprintf(stderr, "%s: Error: Failed to probe secondary address [%s].\n", __PRETTY_FUNCTION__, addr_str); + return 1; + } + // else MBUS_PROBE_SINGLE + + address = 253; + } + else + { + // primary addressing + address = atoi(addr_str); + } + + // instead of the send and recv, use this sendrecv function that + // takes care of the possibility of multi-telegram replies + if (mbus_sendrecv_request(handle, address, &reply, -1) == -1) + { + fprintf(stderr, "Failed to send/receive M-Bus request.\n"); + return 1; + } + + // + // dump hex data if debug is true + // + if (debug) + { + mbus_frame_print(&reply); + } + + // + // generate XML and print to standard output + // + printf("%s", mbus_frame_xml(&reply)); + + mbus_disconnect(handle); + return 0; +} + + +