Commit 7b320fa25a07b591db50677b3ec5370f2b39e70a

Authored by Stéphane Raimbault
1 parent f4583400

Add preset_multiple_registers in slave side

- add some unit tests
- add PRESET_MULTIPLE_REGISTERS support in manage_query()
modbus/modbus.c
@@ -857,9 +857,6 @@ void manage_query(modbus_param_t *mb_param, uint8_t *query, @@ -857,9 +857,6 @@ void manage_query(modbus_param_t *mb_param, uint8_t *query,
857 resp_length = response_exception(mb_param, slave, function, 857 resp_length = response_exception(mb_param, slave, function,
858 ILLEGAL_DATA_ADDRESS, response); 858 ILLEGAL_DATA_ADDRESS, response);
859 } else { 859 } else {
860 - int i;  
861 - /* uint8_t byte_count = query[offset+6]; */  
862 -  
863 /* Similar to build_query_basis! */ 860 /* Similar to build_query_basis! */
864 resp_length = build_response_basis(mb_param, slave, function, response); 861 resp_length = build_response_basis(mb_param, slave, function, response);
865 /* 4 to copy the coil address (2) and the quantity of coils */ 862 /* 4 to copy the coil address (2) and the quantity of coils */
@@ -868,8 +865,24 @@ void manage_query(modbus_param_t *mb_param, uint8_t *query, @@ -868,8 +865,24 @@ void manage_query(modbus_param_t *mb_param, uint8_t *query,
868 } 865 }
869 } 866 }
870 break; 867 break;
  868 + case FC_PRESET_MULTIPLE_REGISTERS: {
  869 + uint16_t count = (query[offset+4] << 8) + query[offset+5];
  870 +
  871 + if ((address + count) > mb_mapping->nb_holding_registers) {
  872 + printf("Illegal data address %0X in preset_multiple_registers\n",
  873 + address + count);
  874 + resp_length = response_exception(mb_param, slave, function,
  875 + ILLEGAL_DATA_ADDRESS, response);
  876 + } else {
  877 + /* Similar to build_query_basis! */
  878 + resp_length = build_response_basis(mb_param, slave, function, response);
  879 + /* 4 to copy the address (2) and the no. of registers */
  880 + memcpy(response + resp_length, query + resp_length, 4);
  881 + resp_length += 4;
  882 + }
  883 + }
  884 + break;
871 case FC_READ_EXCEPTION_STATUS: 885 case FC_READ_EXCEPTION_STATUS:
872 - case FC_PRESET_MULTIPLE_REGISTERS:  
873 case FC_REPORT_SLAVE_ID: 886 case FC_REPORT_SLAVE_ID:
874 printf("Not implemented\n"); 887 printf("Not implemented\n");
875 break; 888 break;
tests/unit-test-master.c
@@ -45,7 +45,7 @@ int main(void) @@ -45,7 +45,7 @@ int main(void)
45 45
46 /* TCP */ 46 /* TCP */
47 modbus_init_tcp(&mb_param, "127.0.0.1", 1502); 47 modbus_init_tcp(&mb_param, "127.0.0.1", 1502);
48 - modbus_set_debug(&mb_param, TRUE); 48 +/* modbus_set_debug(&mb_param, TRUE);*/
49 49
50 modbus_connect(&mb_param); 50 modbus_connect(&mb_param);
51 51
@@ -191,14 +191,16 @@ int main(void) @@ -191,14 +191,16 @@ int main(void)
191 } 191 }
192 192
193 { 193 {
194 - uint16_t tab_value[] = { 0x0A, 0x0102 };  
195 - ret = preset_multiple_registers(&mb_param, SLAVE, 0x01, 0x02, tab_value);  
196 - }  
197 - if (ret == 2) {  
198 - printf("OK\n");  
199 - } else {  
200 - printf("FAILED\n");  
201 - goto close; 194 + int nb_points = 2;
  195 + uint16_t tab_value[] = { 0x000A, 0x0102 };
  196 + ret = preset_multiple_registers(&mb_param, SLAVE, 0x01, nb_points, tab_value);
  197 + printf("* preset_multiple_registers: ");
  198 + if (ret == nb_points) {
  199 + printf("OK\n");
  200 + } else {
  201 + printf("FAILED\n");
  202 + goto close;
  203 + }
202 } 204 }
203 205
204 /** ILLEGAL DATA ADDRESS */ 206 /** ILLEGAL DATA ADDRESS */
@@ -243,11 +245,30 @@ int main(void) @@ -243,11 +245,30 @@ int main(void)
243 UT_COIL_STATUS_ADDRESS + UT_COIL_STATUS_NB_POINTS, ON); 245 UT_COIL_STATUS_ADDRESS + UT_COIL_STATUS_NB_POINTS, ON);
244 printf("* force single coil: "); 246 printf("* force single coil: ");
245 if (ret == ILLEGAL_DATA_ADDRESS) { 247 if (ret == ILLEGAL_DATA_ADDRESS) {
246 - printf("OK\n"); 248 + printf("OK");
247 } else { 249 } else {
248 - printf("FAILED\n"); 250 + printf("FAILED");
  251 + }
  252 +
  253 + ret = force_multiple_coils(&mb_param, SLAVE, UT_COIL_STATUS_ADDRESS,
  254 + UT_COIL_STATUS_NB_POINTS + 1, tab_rp_status);
  255 + printf("* force multipls coils: ");
  256 + if (ret == ILLEGAL_DATA_ADDRESS) {
  257 + printf("OK");
  258 + } else {
  259 + printf("FAILED");
249 } 260 }
250 261
  262 + ret = preset_multiple_registers(&mb_param, SLAVE, UT_HOLDING_REGISTERS_ADDRESS,
  263 + UT_HOLDING_REGISTERS_NB_POINTS + 1, tab_rp_registers);
  264 + printf("* preset multiple registers: ");
  265 + if (ret == ILLEGAL_DATA_ADDRESS) {
  266 + printf("OK");
  267 + } else {
  268 + printf("FAILED");
  269 + }
  270 +
  271 + printf("\n");
251 close: 272 close:
252 /* Free the memory */ 273 /* Free the memory */
253 free(tab_rp_status); 274 free(tab_rp_status);