X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fmodbus.c;h=887c63c03235922c2f7c62eff1d7e4409eee4f80;hb=HEAD;hp=19848b0b330c056b71a82b92888631c0f1b59830;hpb=45aa67ef031ed2b8083f92efa2cbb76e0da8c02e;p=collectd.git diff --git a/src/modbus.c b/src/modbus.c index 19848b0b..887c63c0 100644 --- a/src/modbus.c +++ b/src/modbus.c @@ -115,7 +115,6 @@ struct mb_host_s /* {{{ */ modbus_t *connection; #endif _Bool is_connected; - _Bool have_reconnected; }; /* }}} */ typedef struct mb_host_s mb_host_t; @@ -237,7 +236,7 @@ static int mb_submit (mb_host_t *host, mb_slave_t *slave, /* {{{ */ return (EINVAL); if (host->interval <= 0) - host->interval = interval_g; + host->interval = plugin_get_interval (); if (slave->instance[0] == 0) ssnprintf (slave->instance, sizeof (slave->instance), "slave_%i", @@ -260,6 +259,7 @@ static float mb_register_to_float (uint16_t hi, uint16_t lo) /* {{{ */ union { uint8_t b[4]; + uint16_t s[2]; float f; } conv; @@ -288,13 +288,6 @@ static int mb_init_connection (mb_host_t *host) /* {{{ */ if (host == NULL) return (EINVAL); - if (host->is_connected) - return (0); - - /* Only reconnect once per interval. */ - if (host->have_reconnected) - return (-1); - modbus_set_debug (&host->connection, 1); /* We'll do the error handling ourselves. */ @@ -319,7 +312,6 @@ static int mb_init_connection (mb_host_t *host) /* {{{ */ } host->is_connected = 1; - host->have_reconnected = 1; return (0); } /* }}} int mb_init_connection */ /* #endif LEGACY_LIBMODBUS */ @@ -336,10 +328,6 @@ static int mb_init_connection (mb_host_t *host) /* {{{ */ if (host->connection != NULL) return (0); - /* Only reconnect once per interval. */ - if (host->have_reconnected) - return (-1); - if ((host->port < 1) || (host->port > 65535)) host->port = MODBUS_TCP_DEFAULT_PORT; @@ -349,7 +337,6 @@ static int mb_init_connection (mb_host_t *host) /* {{{ */ host->connection = modbus_new_tcp (host->node, host->port); if (host->connection == NULL) { - host->have_reconnected = 1; ERROR ("Modbus plugin: Creating new Modbus/TCP object failed."); return (-1); } @@ -369,7 +356,6 @@ static int mb_init_connection (mb_host_t *host) /* {{{ */ return (status); } - host->have_reconnected = 1; return (0); } /* }}} int mb_init_connection */ #endif /* !LEGACY_LIBMODBUS */ @@ -392,7 +378,6 @@ static int mb_read_data (mb_host_t *host, mb_slave_t *slave, /* {{{ */ int values_num; const data_set_t *ds; int status; - int i; if ((host == NULL) || (slave == NULL) || (data == NULL)) return (EINVAL); @@ -429,6 +414,44 @@ static int mb_read_data (mb_host_t *host, mb_slave_t *slave, /* {{{ */ else values_num = 1; + status = 0; + if (host->connection == NULL) + { + status = EBADF; + } + else + { + struct sockaddr sockaddr; + socklen_t saddrlen = sizeof (sockaddr); + + status = getpeername (modbus_get_socket (host->connection), + &sockaddr, &saddrlen); + if (status != 0) + status = errno; + } + + if ((status == EBADF) || (status == ENOTSOCK) || (status == ENOTCONN)) + { + status = mb_init_connection (host); + if (status != 0) + { + ERROR ("Modbus plugin: mb_init_connection (%s/%s) failed. ", + host->host, host->node); + host->is_connected = 0; + host->connection = NULL; + return (-1); + } + } + else if (status != 0) + { +#if LEGACY_LIBMODBUS + modbus_close (&host->connection); +#else + modbus_close (host->connection); + modbus_free (host->connection); +#endif + } + #if LEGACY_LIBMODBUS /* Version 2.0.3: Pass the connection struct as a pointer and pass the slave * id to each call of "read_holding_registers". */ @@ -445,51 +468,22 @@ static int mb_read_data (mb_host_t *host, mb_slave_t *slave, /* {{{ */ } #endif - for (i = 0; i < 2; i++) - { - status = modbus_read_registers (host->connection, + status = modbus_read_registers (host->connection, /* start_addr = */ data->register_base, /* num_registers = */ values_num, /* buffer = */ values); - if (status > 0) - break; - - if (host->is_connected) - { + if (status != values_num) + { + ERROR ("Modbus plugin: modbus_read_registers (%s/%s) failed. status = %i, values_num = %i " + "Giving up.", host->host, host->node, status, values_num); #if LEGACY_LIBMODBUS - modbus_close (&host->connection); - host->is_connected = 0; + modbus_close (&host->connection); #else - modbus_close (host->connection); - modbus_free (host->connection); - host->connection = NULL; + modbus_close (host->connection); + modbus_free (host->connection); #endif - } - - /* If we already tried reconnecting this round, give up. */ - if (host->have_reconnected) - { - ERROR ("Modbus plugin: modbus_read_registers (%s) failed. " - "Reconnecting has already been tried. Giving up.", host->host); - return (-1); - } - - /* Maybe the device closed the connection during the waiting interval. - * Try re-establishing the connection. */ - status = mb_init_connection (host); - if (status != 0) - { - ERROR ("Modbus plugin: modbus_read_registers (%s) failed. " - "While trying to reconnect, connecting to \"%s\" failed. " - "Giving up.", - host->host, host->node); - return (-1); - } - - DEBUG ("Modbus plugin: Re-established connection to %s", host->host); - - /* try again */ - continue; - } /* for (i = 0, 1) */ + host->connection = NULL; + return (-1); + } DEBUG ("Modbus plugin: mb_read_data: Success! " "modbus_read_registers returned with status %i.", status); @@ -602,9 +596,6 @@ static int mb_read (user_data_t *user_data) /* {{{ */ host = user_data->data; - /* Clear the reconnect flag. */ - host->have_reconnected = 0; - success = 0; for (i = 0; i < host->slaves_num; i++) {