diff options
Diffstat (limited to 'modbuslog.c')
-rw-r--r-- | modbuslog.c | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/modbuslog.c b/modbuslog.c new file mode 100644 index 0000000..a73dd94 --- /dev/null +++ b/modbuslog.c @@ -0,0 +1,117 @@ +/* + * modbuslog + * + * Copyright (C) 2011 Jonathan McCrohan + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +// gcc modbuslog.c -o modbuslog `pkg-config --libs --cflags libmodbus libconfig` + + +#include <stdio.h> +#include <unistd.h> +#include <stdlib.h> +#include <errno.h> + +#include <libconfig.h> +#include <modbus.h> + +#define SLAVE_ID 1 +#define START_ADDRESS 0 +#define NUMBER_REGISTERS 14 +#define DEBUG 1 + +int main(int argc, char *argv[]) +{ + +const char *CONFIG_FILE = "modbuslog.cfg"; + + config_t cfg; + //config_setting_t *setting; + + const char *modbus_device_address; + int modbus_baud_rate; + int modbus_data_bits; + const char *modbus_parity; + int modbus_stop_bits; + + config_init(&cfg); + + + if(!config_read_file(&cfg, CONFIG_FILE)) + { + fprintf(stderr, "%s:%d - %s\n", config_error_file(&cfg), + config_error_line(&cfg), config_error_text(&cfg)); + config_destroy(&cfg); + fprintf(stderr, "Unable to find CONFIG_FILE.\n"); + return -1; + } + + modbus_t *ctx; + uint16_t tab_reg[64]; + int rc; + int i; + + if(!(config_lookup_string(&cfg, "modbus.device", &modbus_device_address) + && config_lookup_int(&cfg, "modbus.baud", &modbus_baud_rate) + && config_lookup_int(&cfg, "modbus.data_bits", &modbus_data_bits) + && config_lookup_string(&cfg, "modbus.parity", &modbus_parity) + && config_lookup_int(&cfg, "modbus.stop_bits", &modbus_stop_bits)) +){ + fprintf(stderr, "Check modbus configuration in configuration file.\n"); + return -1; +} + + if(DEBUG){ + printf("%s %d %c %d %d\n",modbus_device_address, modbus_baud_rate, modbus_parity[0], modbus_data_bits, modbus_stop_bits); + } + +ctx = modbus_new_rtu(modbus_device_address, modbus_baud_rate, modbus_parity[0], modbus_data_bits, modbus_stop_bits); + +modbus_set_slave(ctx, SLAVE_ID); +modbus_set_debug(ctx, DEBUG); + +if (ctx == NULL) { + fprintf(stderr, "Unable to create the libmodbus context\n"); + return -1; +} + + + +if (modbus_connect(ctx) == -1) { + fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno)); + modbus_free(ctx); + return -1; +} + +rc = modbus_read_input_registers(ctx, START_ADDRESS, NUMBER_REGISTERS, tab_reg); + + +if (rc == -1) { + fprintf(stderr, "ERROR: %s\n", modbus_strerror(errno)); + return -1; +} + + +for (i=0; i < rc; i=i+2) { + printf("reg[%d]=%d\n", i, tab_reg[i]+tab_reg[i+1]); +} + + +modbus_close(ctx); +modbus_free(ctx); + + return 0; +} |