Commit 1d058c8e5e5cb268d5f75da26c8ebbc8aa703931

Authored by Stéphane Raimbault
1 parent fa4f566b

Major changes to test-master-random

- Use only addresses between address_start and address_end
- Better memory usage
Showing 1 changed file with 133 additions and 128 deletions
tests/test-master-random.c
@@ -35,25 +35,27 @@ @@ -35,25 +35,27 @@
35 - read_holding_registers 35 - read_holding_registers
36 36
37 All these functions are called with random values on a address 37 All these functions are called with random values on a address
38 - range defined by following defines.  
39 -  
40 - This program is also really useful to test your remote target unit. 38 + range defined by the following defines.
41 */ 39 */
42 -#define LOOP 1  
43 -#define SLAVE 0x11  
44 -#define ADDR_MIN 0  
45 -#define ADDR_MAX 499  
46 -#define FIELDS 500 40 +#define LOOP 1
  41 +#define SLAVE 0x11
  42 +#define ADDRESS_START 0
  43 +#define ADDRESS_END 499
47 44
  45 +/* At each loop, the program works in the range ADDRESS_START to
  46 + * ADDRESS_END then ADDRESS_START + 1 to ADDRESS_END and so on.
  47 + */
48 int main(void) 48 int main(void)
49 { 49 {
50 - int ok, fail;  
51 - int loop_nb; 50 + int ret;
  51 + int nb_fail;
  52 + int nb_loop;
52 int addr; 53 int addr;
53 - int field_nb;  
54 - int *tab_rq;  
55 - int *tab_rq_bits;  
56 - int *tab_rp; 54 + int nb_points_total;
  55 + uint8_t *tab_rq_status;
  56 + uint8_t *tab_rp_status;
  57 + uint16_t *tab_rq_registers;
  58 + uint16_t *tab_rp_registers;
57 modbus_param_t mb_param; 59 modbus_param_t mb_param;
58 60
59 /* RTU parity : none, even, odd */ 61 /* RTU parity : none, even, odd */
@@ -66,141 +68,144 @@ int main(void) @@ -66,141 +68,144 @@ int main(void)
66 modbus_connect(&mb_param); 68 modbus_connect(&mb_param);
67 69
68 /* Allocate and initialize the different memory spaces */ 70 /* Allocate and initialize the different memory spaces */
69 - tab_rq = (int *) malloc(FIELDS * sizeof(int));  
70 - memset(tab_rq, 0, FIELDS * sizeof(int));  
71 -  
72 - tab_rq_bits = (int *) malloc(FIELDS * sizeof(int));  
73 - memset(tab_rq_bits, 0, FIELDS * sizeof(int));  
74 -  
75 - tab_rp = (int *) malloc(FIELDS * sizeof(int));  
76 - memset(tab_rp, 0, FIELDS * sizeof(int));  
77 -  
78 - loop_nb = ok = fail = 0;  
79 - while (loop_nb++ < LOOP) {  
80 - for (addr=ADDR_MIN; addr <= ADDR_MAX; addr++) {  
81 - for (field_nb=1; field_nb<=FIELDS; field_nb++) {  
82 - int i;  
83 -  
84 - /* Random numbers (short) */  
85 - for (i=0; i<field_nb; i++) {  
86 - tab_rq[i] = (int) (16536.0*rand()/(RAND_MAX+1.0));  
87 - tab_rq_bits[i] = (i) % 2; 71 + nb_points_total = ADDRESS_END - ADDRESS_START;
  72 +
  73 + tab_rq_status = (uint8_t *) malloc(nb_points_total * sizeof(uint8_t));
  74 + memset(tab_rq_status, 0, nb_points_total * sizeof(uint8_t));
  75 + tab_rp_status = (uint8_t *) malloc(nb_points_total * sizeof(uint8_t));
  76 + memset(tab_rp_status, 0, nb_points_total * sizeof(uint8_t));
  77 +
  78 + tab_rq_registers = (uint16_t *) malloc(nb_points_total * sizeof(uint16_t));
  79 + memset(tab_rq_registers, 0, nb_points_total * sizeof(uint16_t));
  80 + tab_rp_registers = (uint16_t *) malloc(nb_points_total * sizeof(uint16_t));
  81 + memset(tab_rp_status, 0, nb_points_total * sizeof(uint16_t));
  82 +
  83 + nb_loop = nb_fail = 0;
  84 + while (nb_loop++ < LOOP) {
  85 + for (addr = ADDRESS_START; addr <= ADDRESS_END; addr++) {
  86 + int i;
  87 + int nb_points;
  88 +
  89 + /* Random numbers (short) */
  90 + for (i=0; i<nb_points_total; i++) {
  91 + tab_rq_registers[i] = (uint16_t) (65535.0*rand() / (RAND_MAX + 1.0));
  92 + tab_rq_status[i] = tab_rq_registers[i] % 2;
  93 + }
  94 + nb_points = ADDRESS_END - addr;
  95 +
  96 + /* SINGLE COIL */
  97 + ret = force_single_coil(&mb_param, SLAVE, addr, tab_rq_status[0]);
  98 + if (ret != 1) {
  99 + printf("ERROR force_single_coil (%d)\n", ret);
  100 + printf("Slave = %d, address = %d, value = %d\n",
  101 + SLAVE, addr, tab_rq_status[0]);
  102 + nb_fail++;
  103 + } else {
  104 + ret = read_coil_status(&mb_param, SLAVE, addr, 1, tab_rp_status);
  105 + if (ret != 1 || tab_rq_status[0] != tab_rp_status[0]) {
  106 + printf("ERROR read_coil_status single (%d)\n", ret);
  107 + printf("Slave = %d, address = %d\n",
  108 + SLAVE, addr);
  109 + nb_fail++;
88 } 110 }
  111 + }
89 112
90 - /* SINGLE COIL */  
91 - ok = force_single_coil(&mb_param, SLAVE, addr, tab_rq_bits[0]);  
92 - if (ok != 1) {  
93 - printf("ERROR force_single_coil (%d)\n", ok);  
94 - printf("Slave = %d, address = %d, value = %d\n",  
95 - SLAVE, addr, tab_rq_bits[0]);  
96 - fail++; 113 + /* MULTIPLE COILS */
  114 + ret = force_multiple_coils(&mb_param, SLAVE, addr, nb_points, tab_rq_status);
  115 + if (ret != nb_points) {
  116 + printf("ERROR force_multiple_coils (%d)\n", ret);
  117 + printf("Slave = %d, address = %d, nb_points = %d\n",
  118 + SLAVE, addr, nb_points);
  119 + nb_fail++;
  120 + } else {
  121 + ret = read_coil_status(&mb_param, SLAVE, addr, nb_points, tab_rp_status);
  122 + if (ret != nb_points) {
  123 + printf("ERROR read_coil_status\n");
  124 + printf("Slave = %d, address = %d, nb_points = %d\n",
  125 + SLAVE, addr, nb_points);
  126 + nb_fail++;
97 } else { 127 } else {
98 - ok = read_coil_status(&mb_param, SLAVE, addr, 1, tab_rp);  
99 - if (ok != 1 || tab_rq_bits[0] != tab_rp[0]) {  
100 - printf("ERROR read_coil_status single (%d)\n", ok);  
101 - printf("Slave = %d, address = %d\n",  
102 - SLAVE, addr);  
103 - fail++; 128 + for (i=0; i<nb_points; i++) {
  129 + if (tab_rp_status[i] != tab_rq_status[i]) {
  130 + printf("ERROR read_coil_status ");
  131 + printf("(%d != %d)\n", tab_rp_status[i], tab_rq_status[i]);
  132 + printf("Slave = %d, address = %d\n",
  133 + SLAVE, addr);
  134 + nb_fail++;
  135 + }
104 } 136 }
105 } 137 }
  138 + }
106 139
107 - /* MULTIPLE COILS */  
108 - ok = force_multiple_coils(&mb_param, SLAVE, addr, field_nb, tab_rq_bits);  
109 - if (ok != field_nb) {  
110 - printf("ERROR force_multiple_coils (%d)\n", ok);  
111 - printf("Slave = %d, address = %d, field_nb = %d\n",  
112 - SLAVE, addr, field_nb);  
113 - fail++; 140 + /* SINGLE REGISTER */
  141 + ret = preset_single_register(&mb_param, SLAVE, addr, tab_rq_registers[0]);
  142 + if (ret != 1) {
  143 + printf("ERROR preset_single_register (%d)\n", ret);
  144 + printf("Slave = %d, address = %d, value = %d\n",
  145 + SLAVE, addr, tab_rq_registers[0]);
  146 + nb_fail++;
  147 + } else {
  148 + ret = read_holding_registers(&mb_param, SLAVE,
  149 + addr, 1, tab_rp_registers);
  150 + if (ret != 1) {
  151 + printf("ERROR read_holding_registers single (%d)\n", ret);
  152 + printf("Slave = %d, address = %d\n",
  153 + SLAVE, addr);
  154 + nb_fail++;
114 } else { 155 } else {
115 - ok = read_coil_status(&mb_param, SLAVE, addr,  
116 - field_nb, tab_rp);  
117 - if (ok != field_nb) {  
118 - printf("ERROR read_coil_status\n");  
119 - printf("Slave = %d, address = %d, field_nb = %d\n",  
120 - SLAVE, addr, field_nb);  
121 - fail++;  
122 - } else {  
123 - for (i=0; i<field_nb; i++) {  
124 - if (tab_rp[i] != tab_rq_bits[i]) {  
125 - printf("ERROR read_coil_status ");  
126 - printf("(%d != %d)\n", tab_rp[i], tab_rq_bits[i]);  
127 - printf("Slave = %d, address = %d\n",  
128 - SLAVE, addr);  
129 - fail++;  
130 - }  
131 - } 156 + if (tab_rq_registers[0] != tab_rp_registers[0]) {
  157 + printf("ERROR read_holding_registers single ");
  158 + printf("(%d != %d)\n",
  159 + tab_rq_registers[0], tab_rp_registers[0]);
  160 + printf("Slave = %d, address = %d\n",
  161 + SLAVE, addr);
  162 + nb_fail++;
132 } 163 }
133 } 164 }
134 -  
135 - /* SINGLE REGISTER */  
136 - ok = preset_single_register(&mb_param, SLAVE, addr, tab_rq[0]);  
137 - if (ok != 1) {  
138 - printf("ERROR preset_single_register (%d)\n", ok);  
139 - printf("Slave = %d, address = %d, value = %d\n",  
140 - SLAVE, addr, tab_rq[0]);  
141 - fail++; 165 + }
  166 +
  167 + /* MULTIPLE REGISTERS */
  168 + ret = preset_multiple_registers(&mb_param, SLAVE,
  169 + addr, nb_points, tab_rq_registers);
  170 + if (ret != nb_points) {
  171 + printf("ERROR preset_multiple_registers (%d)\n", ret);
  172 + printf("Slave = %d, address = %d, nb_points = %d\n",
  173 + SLAVE, addr, nb_points);
  174 + nb_fail++;
  175 + } else {
  176 + ret = read_holding_registers(&mb_param, SLAVE,
  177 + addr, nb_points, tab_rp_registers);
  178 + if (ret != nb_points) {
  179 + printf("ERROR read_holding_registers (%d)\n", ret);
  180 + printf("Slave = %d, address = %d, nb_points = %d\n",
  181 + SLAVE, addr, nb_points);
  182 + nb_fail++;
142 } else { 183 } else {
143 - ok = read_holding_registers(&mb_param, SLAVE,  
144 - addr, 1, tab_rp);  
145 - if (ok != 1) {  
146 - printf("ERROR read_holding_registers single (%d)\n", ok);  
147 - printf("Slave = %d, address = %d\n",  
148 - SLAVE, addr);  
149 - fail++;  
150 - } else {  
151 - if (tab_rq[0] != tab_rp[0]) {  
152 - printf("ERROR read_holding_registers single "); 184 + for (i=0; i<nb_points; i++) {
  185 + if (tab_rq_registers[i] != tab_rp_registers[i]) {
  186 + printf("ERROR read_holding_registers ");
153 printf("(%d != %d)\n", 187 printf("(%d != %d)\n",
154 - tab_rq[0], tab_rp[0]); 188 + tab_rq_registers[i], tab_rp_registers[i]);
155 printf("Slave = %d, address = %d\n", 189 printf("Slave = %d, address = %d\n",
156 SLAVE, addr); 190 SLAVE, addr);
157 - fail++;  
158 - }  
159 - }  
160 - }  
161 -  
162 - /* MULTIPLE REGISTERS */  
163 - ok = preset_multiple_registers(&mb_param, SLAVE,  
164 - addr, field_nb, tab_rq);  
165 - if (ok != field_nb) {  
166 - printf("ERROR preset_multiple_registers (%d)\n", ok);  
167 - printf("Slave = %d, address = %d, field_nb = %d\n",  
168 - SLAVE, addr, field_nb);  
169 - fail++;  
170 - } else {  
171 - ok = read_holding_registers(&mb_param, SLAVE,  
172 - addr, field_nb, tab_rp);  
173 - if (ok != field_nb) {  
174 - printf("ERROR read_holding_registers (%d)\n", ok);  
175 - printf("Slave = %d, address = %d, field_nb = %d\n",  
176 - SLAVE, addr, field_nb);  
177 - fail++;  
178 - } else {  
179 - for (i=0; i<field_nb; i++) {  
180 - if (tab_rq[i] != tab_rp[i]) {  
181 - printf("ERROR read_holding_registers ");  
182 - printf("(%d != %d)\n",  
183 - tab_rq[i], tab_rp[i]);  
184 - printf("Slave = %d, address = %d\n",  
185 - SLAVE, addr);  
186 - fail++;  
187 - } 191 + nb_fail++;
188 } 192 }
189 } 193 }
190 } 194 }
191 } 195 }
192 -  
193 - if (fail)  
194 - printf("Address : %d - Fails sum : %d\n", addr, fail);  
195 - else  
196 - printf("Address : %d - OK\n", addr);  
197 } 196 }
  197 +
  198 + if (nb_fail)
  199 + printf("Address: %d - nb of fails: %d\n", addr, nb_fail);
  200 + else
  201 + printf("Address: %d - OK\n", addr);
198 } 202 }
199 203
200 /* Free the memory */ 204 /* Free the memory */
201 - free(tab_rp);  
202 - free(tab_rq);  
203 - free(tab_rq_bits); 205 + free(tab_rp_status);
  206 + free(tab_rq_status);
  207 + free(tab_rp_registers);
  208 + free(tab_rq_registers);
204 209
205 /* Close the connection */ 210 /* Close the connection */
206 modbus_close(&mb_param); 211 modbus_close(&mb_param);