X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fmodbus.c;h=97840fd6cbf7bc3f6f8f0a8b1a6535bf4ca143fd;hb=cce136946b879557f91183e4de58e92b81e138c8;hp=795465f041d2a1962ea270ff40cd456771089394;hpb=467d76ea1757cc591b1f215b1ae277b82d67d73c;p=collectd.git
diff --git a/src/modbus.c b/src/modbus.c
index 795465f0..97840fd6 100644
--- a/src/modbus.c
+++ b/src/modbus.c
@@ -47,15 +47,19 @@
/*
*
* RegisterBase 1234
+ * RegisterCmd ReadHolding
* RegisterType float
* Type gauge
- * ModbusRegisterType holding
* Instance "..."
*
*
*
* Address "addr"
* Port "1234"
+ * # Or:
+ * # Device "/dev/ttyUSB0"
+ * # Baudrate 38400
+ * # (Assumes 8N1)
* Interval 60
*
*
@@ -84,6 +88,14 @@ enum mb_mreg_type_e /* {{{ */
typedef enum mb_register_type_e mb_register_type_t;
typedef enum mb_mreg_type_e mb_mreg_type_t;
+/* TCP or RTU depending on what is specified in host config block */
+enum mb_conntype_e /* {{{ */
+{
+ MBCONN_TCP,
+ MBCONN_RTU
+}; /* }}} */
+typedef enum mb_conntype_e mb_conntype_t;
+
struct mb_data_s;
typedef struct mb_data_s mb_data_t;
struct mb_data_s /* {{{ */
@@ -109,9 +121,11 @@ typedef struct mb_slave_s mb_slave_t;
struct mb_host_s /* {{{ */
{
char host[DATA_MAX_NAME_LEN];
- char node[NI_MAXHOST];
+ char node[NI_MAXHOST]; /* TCP hostname or RTU serial device */
/* char service[NI_MAXSERV]; */
- int port;
+ int port; /* for Modbus/TCP */
+ int baudrate; /* for Modbus/RTU */
+ mb_conntype_t conntype;
cdtime_t interval;
mb_slave_t *slaves;
@@ -301,21 +315,33 @@ static int mb_init_connection (mb_host_t *host) /* {{{ */
/* We'll do the error handling ourselves. */
modbus_set_error_handling (&host->connection, NOP_ON_ERROR);
- if ((host->port < 1) || (host->port > 65535))
- host->port = MODBUS_TCP_DEFAULT_PORT;
+ if (host->conntype == MBCONN_TCP)
+ {
+ if ((host->port < 1) || (host->port > 65535))
+ host->port = MODBUS_TCP_DEFAULT_PORT;
- DEBUG ("Modbus plugin: Trying to connect to \"%s\", port %i.",
- host->node, host->port);
+ DEBUG ("Modbus plugin: Trying to connect to \"%s\", port %i.",
+ host->node, host->port);
- modbus_init_tcp (&host->connection,
- /* host = */ host->node,
- /* port = */ host->port);
+ modbus_init_tcp (&host->connection,
+ /* host = */ host->node,
+ /* port = */ host->port);
+ }
+ else /* MBCONN_RTU */
+ {
+ DEBUG ("Modbus plugin: Trying to connect to \"%s\".", host->node);
+
+ modbus_init_rtu (&host->connection,
+ /* device = */ host->node,
+ /* baudrate = */ host->baudrate,
+ 'N', 8, 1, 0);
+ }
status = modbus_connect (&host->connection);
if (status != 0)
{
ERROR ("Modbus plugin: modbus_connect (%s, %i) failed with status %i.",
- host->node, host->port, status);
+ host->node, host->port ? host->port : host->baudrate, status);
return (status);
}
@@ -336,17 +362,32 @@ static int mb_init_connection (mb_host_t *host) /* {{{ */
if (host->connection != NULL)
return (0);
- if ((host->port < 1) || (host->port > 65535))
- host->port = MODBUS_TCP_DEFAULT_PORT;
+ if (host->conntype == MBCONN_TCP)
+ {
+ if ((host->port < 1) || (host->port > 65535))
+ host->port = MODBUS_TCP_DEFAULT_PORT;
- DEBUG ("Modbus plugin: Trying to connect to \"%s\", port %i.",
- host->node, host->port);
+ DEBUG ("Modbus plugin: Trying to connect to \"%s\", port %i.",
+ host->node, host->port);
- host->connection = modbus_new_tcp (host->node, host->port);
- if (host->connection == NULL)
+ host->connection = modbus_new_tcp (host->node, host->port);
+ if (host->connection == NULL)
+ {
+ ERROR ("Modbus plugin: Creating new Modbus/TCP object failed.");
+ return (-1);
+ }
+ }
+ else
{
- ERROR ("Modbus plugin: Creating new Modbus/TCP object failed.");
- return (-1);
+ DEBUG ("Modbus plugin: Trying to connect to \"%s\", baudrate %i.",
+ host->node, host->baudrate);
+
+ host->connection = modbus_new_rtu (host->node, host->baudrate, 'N', 8, 1);
+ if (host->connection == NULL)
+ {
+ ERROR ("Modbus plugin: Creating new Modbus/RTU object failed.");
+ return (-1);
+ }
}
modbus_set_debug (host->connection, 1);
@@ -358,7 +399,7 @@ static int mb_init_connection (mb_host_t *host) /* {{{ */
if (status != 0)
{
ERROR ("Modbus plugin: modbus_connect (%s, %i) failed with status %i.",
- host->node, host->port, status);
+ host->node, host->port ? host->port : host->baudrate, status);
modbus_free (host->connection);
host->connection = NULL;
return (status);
@@ -427,7 +468,7 @@ static int mb_read_data (mb_host_t *host, mb_slave_t *slave, /* {{{ */
{
status = EBADF;
}
- else
+ else if (host->conntype == MBCONN_TCP)
{
struct sockaddr sockaddr;
socklen_t saddrlen = sizeof (sockaddr);
@@ -724,19 +765,19 @@ static int mb_config_add_data (oconfig_item_t *ci) /* {{{ */
status = -1;
}
}
- else if (strcasecmp ("ModbusRegisterType", child->key) == 0)
+ else if (strcasecmp ("RegisterCmd", child->key) == 0)
{
#if LEGACY_LIBMODBUS
- ERROR("Modbus plugin: ModbusRegisterType parameter can not be used "
+ ERROR("Modbus plugin: RegisterCmd parameter can not be used "
"with your libmodbus version");
#else
char tmp[16];
status = cf_util_get_string_buffer (child, tmp, sizeof (tmp));
if (status != 0)
/* do nothing */;
- else if (strcasecmp ("holding", tmp) == 0)
+ else if (strcasecmp ("ReadHolding", tmp) == 0)
data.modbus_register_type = MREG_HOLDING;
- else if (strcasecmp ("input", tmp) == 0)
+ else if (strcasecmp ("ReadInput", tmp) == 0)
data.modbus_register_type = MREG_INPUT;
else
{
@@ -919,6 +960,8 @@ static int mb_config_add_host (oconfig_item_t *ci) /* {{{ */
status = cf_util_get_string_buffer (child, buffer, sizeof (buffer));
if (status == 0)
status = mb_config_set_host_address (host, buffer);
+ if (status == 0)
+ host->conntype = MBCONN_TCP;
}
else if (strcasecmp ("Port", child->key) == 0)
{
@@ -926,6 +969,14 @@ static int mb_config_add_host (oconfig_item_t *ci) /* {{{ */
if (host->port <= 0)
status = -1;
}
+ else if (strcasecmp ("Device", child->key) == 0)
+ {
+ status = cf_util_get_string_buffer (child, host->node, sizeof (host->node));
+ if (status == 0)
+ host->conntype = MBCONN_RTU;
+ }
+ else if (strcasecmp ("Baudrate", child->key) == 0)
+ status = cf_util_get_int(child, &host->baudrate);
else if (strcasecmp ("Interval", child->key) == 0)
status = cf_util_get_cdtime (child, &host->interval);
else if (strcasecmp ("Slave", child->key) == 0)
@@ -942,9 +993,22 @@ static int mb_config_add_host (oconfig_item_t *ci) /* {{{ */
} /* for (i = 0; i < ci->children_num; i++) */
assert (host->host[0] != 0);
- if (host->host[0] == 0)
+ if (host->node[0] == 0)
{
- ERROR ("Modbus plugin: Data block \"%s\": No type has been specified.",
+ ERROR ("Modbus plugin: Data block \"%s\": No address or device has been specified.",
+ host->host);
+ status = -1;
+ }
+ if (host->conntype == MBCONN_RTU && !host->baudrate)
+ {
+ ERROR ("Modbus plugin: Data block \"%s\": No serial baudrate has been specified.",
+ host->host);
+ status = -1;
+ }
+ if ((host->conntype == MBCONN_TCP && host->baudrate) ||
+ (host->conntype == MBCONN_RTU && host->port))
+ {
+ ERROR ("Modbus plugin: Data block \"%s\": You've mixed up RTU and TCP options.",
host->host);
status = -1;
}
@@ -953,18 +1017,15 @@ static int mb_config_add_host (oconfig_item_t *ci) /* {{{ */
{
user_data_t ud;
char name[1024];
- struct timespec interval = { 0, 0 };
ud.data = host;
ud.free_func = host_free;
ssnprintf (name, sizeof (name), "modbus-%s", host->host);
- CDTIME_T_TO_TIMESPEC (host->interval, &interval);
-
plugin_register_complex_read (/* group = */ NULL, name,
/* callback = */ mb_read,
- /* interval = */ (host->interval > 0) ? &interval : NULL,
+ /* interval = */ host->interval,
&ud);
}
else