From 9bccaac7efbf7221704154149e5df45e7567c831 Mon Sep 17 00:00:00 2001 From: Jonathan McCrohan Date: Tue, 6 Dec 2011 00:18:01 +0000 Subject: Create Makefile. --- modbuslog.c | 316 ------------------------------------------------------------ 1 file changed, 316 deletions(-) delete mode 100644 modbuslog.c (limited to 'modbuslog.c') diff --git a/modbuslog.c b/modbuslog.c deleted file mode 100644 index be7a4d1..0000000 --- a/modbuslog.c +++ /dev/null @@ -1,316 +0,0 @@ -/* - * 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 . - */ - -// gcc modbuslog.c -o modbuslog `pkg-config --libs --cflags libmodbus libconfig` - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include -#include -#include - -#define SLAVE_ID 1 -#define START_ADDRESS 0 -#define NUMBER_REGISTERS 14 - -void minute_check(int signum) { - alarm(60); -} - -char *mac_address() { - int s; - struct ifreq ifr; - - s = socket(PF_INET, SOCK_DGRAM, 0); - memset(&ifr, 0x00, sizeof(ifr)); - strcpy(ifr.ifr_name, "eth0"); - ioctl(s, SIOCGIFHWADDR, &ifr); - close(s); - - static char mac_address[12]; - sprintf(mac_address, "%.2X%.2X%.2X%.2X%.2X%.2X", - (unsigned char) ifr.ifr_hwaddr.sa_data[0], - (unsigned char) ifr.ifr_hwaddr.sa_data[1], - (unsigned char) ifr.ifr_hwaddr.sa_data[2], - (unsigned char) ifr.ifr_hwaddr.sa_data[3], - (unsigned char) ifr.ifr_hwaddr.sa_data[4], - (unsigned char) ifr.ifr_hwaddr.sa_data[5]); - - return mac_address; -} - -int main(int argc, char *argv[]) { - - const char *configfile = "/etc/modbuslog.cfg"; - - int DEBUG = 0; - int k; - for (k = 1; k < argc; k++) { - if (strcmp(argv[k], "-d") == 0) { - DEBUG = 1; - } - } - - 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; - int modbus_retry; - - config_init(&cfg); - - if (!config_read_file(&cfg, configfile)) { - 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 configfile.\n"); - return -1; - } - - 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) - && config_lookup_int(&cfg, "modbus.retry", &modbus_retry))) { - fprintf(stderr, - "Incomplete modbus configuration. Check configuration file.\n"); - return -1; - } - - if (DEBUG) { - printf("%s %s %d %c %d %d\n", mac_address(), modbus_device_address, - modbus_baud_rate, modbus_parity[0], modbus_data_bits, - modbus_stop_bits); - } - - modbus_t *ctx; - uint16_t tab_reg[4]; - uint8_t byte[8]; - int rc; - int i; - - signal(SIGALRM, minute_check); - alarm(60); - - for (;;) { - select(0, NULL, NULL, NULL, NULL); - - time_t t = time(NULL); - time_t unixtime_min = (((int) t) / 60 * 60); - //int unixtime = (int) t; - //printf("%d\n", unixtime); - - config_setting_t *readings; - - readings = config_lookup(&cfg, "reading"); - - unsigned int num_readings = config_setting_length(readings); - - int i; - for (i = 0; i < num_readings; ++i) { - config_setting_t *register_element = config_setting_get_elem( - readings, i); - int slaveid; - config_setting_lookup_int(register_element, "slaveid", &slaveid); - int intervalvalue; - config_setting_lookup_int(register_element, "intervalvalue", - &intervalvalue); - //printf("%d", intervalvalue); - - int registertype; - config_setting_lookup_int(register_element, "registertype", - ®istertype); - - int startaddress; - config_setting_lookup_int(register_element, "startaddress", - &startaddress); - - int numregisters; - config_setting_lookup_int(register_element, "numregisters", - &numregisters); - - const char *intervalunit; - config_setting_lookup_string(register_element, "intervalunit", - &intervalunit); - - //printf("%c", intervalunit[0]); - - int intervalduration; - - if (intervalunit[0] == 'h') - intervalduration = intervalvalue * 3600; - else - intervalduration = intervalvalue * 60; - - if (unixtime_min % intervalduration == 0) { - //printf("specified minute. %d %d\n", unixtime_min, - // intervalduration); - - ctx = modbus_new_rtu(modbus_device_address, modbus_baud_rate, - modbus_parity[0], modbus_data_bits, modbus_stop_bits); - - modbus_set_slave(ctx, slaveid); - modbus_set_debug(ctx, DEBUG); - - if (ctx == NULL) { - fprintf(stderr, "Unable to create libmodbus object.\n"); - //return -1; - } - - if (modbus_connect(ctx) == -1) { - fprintf(stderr, "Connection failed: %s\n", - modbus_strerror(errno)); - modbus_free(ctx); - //return -1; - } - - int retry = 0; - do { - switch (registertype) { - - case 3: - rc = modbus_read_registers(ctx, startaddress, - numregisters, tab_reg); - break; - - case 4: - rc = modbus_read_input_registers(ctx, startaddress, - numregisters, tab_reg); - break; - - default: - rc = modbus_read_registers(ctx, startaddress, - numregisters, tab_reg); - break; - } - if (rc == -1) { - fprintf(stderr, "ERROR: %s\n", modbus_strerror(errno)); - } - retry++; - } while ((rc != -1) && (retry < (modbus_retry+1))); - - //MODBUS_GET_HIGH_BYTE(data); - //MODBUS_GET_LOW_BYTE(data); - //MODBUS_SET_INT16_TO_INT8(tab_int8, index, value); - - //_YYYY_MM_DD_HH_MM_SS.log - time_t unixtime_day = ((((int) t) / 86400 * 86400) + 86400); - - struct tm midnight = *localtime(&unixtime_day); - - char filename[50]; - - sprintf(filename, - "/var/modbuslog/%s_%04i_%02i_%02i_%02i_%02i_%02i.log", - mac_address(), midnight.tm_year + 1900, - midnight.tm_mon + 1, midnight.tm_mday, midnight.tm_hour, - midnight.tm_min, midnight.tm_sec); - - //printf("%s\n",filename); - - FILE *fp = fopen(filename, "r"); - if (fp) { - fclose(fp); - } else { - // file doesn't exist. create it. - FILE *fp = fopen(filename, "w"); - fprintf( - fp, - "IntervalID|UTCDate|UTCTime|LOCALDate|LOCALTime|SensorID|RegisterID|Reading\n"); - fclose(fp); - } - - FILE *filehandle = fopen(filename, "a+"); - - int16_t registervalue = 0; - - int p; - for (p = 0; p < numregisters; p++) { - MODBUS_SET_INT16_TO_INT8(byte, p * 2, tab_reg[p]); - //registervalue += tab_reg[i] + tab_reg[i + 1]; - } - - switch (numregisters) { - case 1: - registervalue = byte[0]; - break; - case 2: - registervalue = ((byte[0]) << 8) + byte[1]; - break; - case 4: - registervalue = ((byte[0]) << 24) + ((byte[1]) << 16) - + ((byte[2]) << 8) + byte[3]; - break; - default: - registervalue = byte[0]; - break; - } - - struct tm utc = *gmtime(&unixtime_min); - struct tm lc = *localtime(&unixtime_min); - - int intervalid; - FILE *intervalfile = fopen("/var/modbuslog/interval.txt", "r+"); - fscanf(intervalfile, "%d", &intervalid); - intervalid++; - rewind(intervalfile); - fprintf(intervalfile, "%d", intervalid); - fclose(intervalfile); - - fprintf( - filehandle, - "%i|%04i%02i%02i|%02i%02i%02i|%04i%02i%02i|%02i%02i%02i|%i|%i|%i\n", - intervalid, utc.tm_year + 1900, utc.tm_mon + 1, - utc.tm_mday, utc.tm_hour, utc.tm_min, utc.tm_sec, - lc.tm_year + 1900, lc.tm_mon + 1, lc.tm_mday, - lc.tm_hour, lc.tm_min, lc.tm_sec, slaveid, startaddress, - registervalue); - fclose(filehandle); - - modbus_close(ctx); - modbus_free(ctx); - - sleep(1); - //return 0; - - } - - //printf("%d ", slaveid); - } - //printf("%d\n", unixtime_min); - } -} -- cgit v1.2.3