/* * Copyright © 2001-2008 Stéphane Raimbault * * 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 . */ #include #include #include #include #include /* The goal of this program is to check all major functions of libmodbus: - force_single_coil - read_coil_status - force_multiple_coils - preset_single_register - read_holding_registers - preset_multiple_registers - read_holding_registers All these functions are called with random values on a address range defined by the following defines. */ #define LOOP 1 #define SLAVE 0x11 #define ADDRESS_START 0 #define ADDRESS_END 3 /* At each loop, the program works in the range ADDRESS_START to * ADDRESS_END then ADDRESS_START + 1 to ADDRESS_END and so on. */ int main(void) { int ret; int nb_fail; int nb_loop; int addr; int nb; uint8_t *tab_rq_status; uint8_t *tab_rp_status; uint16_t *tab_rq_registers; uint16_t *tab_rp_registers; modbus_param_t mb_param; /* RTU parity : none, even, odd */ /* modbus_init_rtu(&mb_param, "/dev/ttyS0", 19200, "none", 8, 1); */ /* TCP */ modbus_init_tcp(&mb_param, "127.0.0.1", 1502); modbus_set_debug(&mb_param, TRUE); if (modbus_connect(&mb_param) == -1) { printf("ERROR Connection failed\n"); exit(1); } /* Allocate and initialize the different memory spaces */ nb = ADDRESS_END - ADDRESS_START; tab_rq_status = (uint8_t *) malloc(nb * sizeof(uint8_t)); memset(tab_rq_status, 0, nb * sizeof(uint8_t)); tab_rp_status = (uint8_t *) malloc(nb * sizeof(uint8_t)); memset(tab_rp_status, 0, nb * sizeof(uint8_t)); tab_rq_registers = (uint16_t *) malloc(nb * sizeof(uint16_t)); memset(tab_rq_registers, 0, nb * sizeof(uint16_t)); tab_rp_registers = (uint16_t *) malloc(nb * sizeof(uint16_t)); memset(tab_rp_registers, 0, nb * sizeof(uint16_t)); nb_loop = nb_fail = 0; while (nb_loop++ < LOOP) { for (addr = ADDRESS_START; addr <= ADDRESS_END; addr++) { int i; /* Random numbers (short) */ for (i=0; i