* RegisterBase 1234
* RegisterType float
* Type gauge
+ * ModbusRegisterType holding
* Instance "..."
* </Data>
*
REG_TYPE_UINT32,
REG_TYPE_FLOAT
}; /* }}} */
+enum mb_mreg_type_e /* {{{ */
+{
+ MREG_HOLDING,
+ MREG_INPUT
+}; /* }}} */
typedef enum mb_register_type_e mb_register_type_t;
+typedef enum mb_mreg_type_e mb_mreg_type_t;
struct mb_data_s;
typedef struct mb_data_s mb_data_t;
char *name;
int register_base;
mb_register_type_t register_type;
+ mb_mreg_type_t modbus_register_type;
char type[DATA_MAX_NAME_LEN];
char instance[DATA_MAX_NAME_LEN];
uint16_t values[2];
int values_num;
const data_set_t *ds;
- struct sockaddr sockaddr;
- socklen_t saddrlen = sizeof(sockaddr);
int status;
if ((host == NULL) || (slave == NULL) || (data == NULL))
else
values_num = 1;
- if(host->connection == NULL)
- goto try_connect;
-
- if(getpeername(modbus_get_socket(host->connection),
- &sockaddr, &saddrlen) != 0)
- switch(errno){
- case EBADF:
- case ENOTSOCK:
- case ENOTCONN:
- try_connect:
- 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);
- }
- break;
- default:
+ 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);
+ modbus_close (&host->connection);
#else
- modbus_close (host->connection);
- modbus_free (host->connection);
+ modbus_close (host->connection);
+ modbus_free (host->connection);
#endif
}
return (-1);
}
#endif
-
- status = modbus_read_registers (host->connection,
+ if (data->modbus_register_type == MREG_INPUT){
+ status = modbus_read_input_registers (host->connection,
+ /* start_addr = */ data->register_base,
+ /* num_registers = */ values_num, /* buffer = */ values);
+ }
+ else{
+ status = modbus_read_registers (host->connection,
/* start_addr = */ data->register_base,
/* num_registers = */ values_num, /* buffer = */ values);
+ }
if (status != values_num)
{
- ERROR ("Modbus plugin: modbus_read_registers (%s) failed. "
- "Giving up.", host->host);
+ 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);
+#else
+ modbus_close (host->connection);
+ modbus_free (host->connection);
+#endif
+ host->connection = NULL;
return (-1);
}
status = -1;
}
}
+ else if (strcasecmp ("ModbusRegisterType", child->key) == 0)
+ {
+ #if LEGACY_LIBMODBUS
+ ERROR("Modbus plugin: ModbusRegisterType 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)
+ data.modbus_register_type = MREG_HOLDING;
+ else if (strcasecmp ("input", tmp) == 0)
+ data.modbus_register_type = MREG_INPUT;
+ else
+ {
+ ERROR ("Modbus plugin: The modbus_register_type \"%s\" is unknown.", tmp);
+ status = -1;
+ }
+ #endif
+ }
else
{
ERROR ("Modbus plugin: Unknown configuration option: %s", child->key);