Commit a2e41db3862886d5787910f8c59765b5db1bbf34
1 parent
12753875
Renamed modbus_read_and_write_registers to modbus_write_and_read_registers
The function name was confusing because the write operation is performed before the read. Take care to swap the arguments in the migration process.
Showing
7 changed files
with
39 additions
and
34 deletions
NEWS
| ... | ... | @@ -6,6 +6,10 @@ libmodbus 2.9.5 (2011-06-XX) |
| 6 | 6 | by Tobias Doerffel, Florian octo Forster and Hannu Vuolasaho. |
| 7 | 7 | - Enable RS485 support only when available |
| 8 | 8 | - Export modbus_set/get_serial_mode functions on all platforms |
| 9 | +- API change for read/write multiple registers function: | |
| 10 | + * modbus_read_and_write_registers -> modbus_write_and_read_registers | |
| 11 | + The function name was confusing because the write operation is performed | |
| 12 | + before the read. Take care to swap the arguments in the migration process. | |
| 9 | 13 | |
| 10 | 14 | libmodbus 2.9.4 (2011-06-05) |
| 11 | 15 | ============================ | ... | ... |
src/modbus-private.h
| ... | ... | @@ -61,7 +61,7 @@ MODBUS_BEGIN_DECLS |
| 61 | 61 | #define _FC_WRITE_MULTIPLE_COILS 0x0F |
| 62 | 62 | #define _FC_WRITE_MULTIPLE_REGISTERS 0x10 |
| 63 | 63 | #define _FC_REPORT_SLAVE_ID 0x11 |
| 64 | -#define _FC_READ_AND_WRITE_REGISTERS 0x17 | |
| 64 | +#define _FC_WRITE_AND_READ_REGISTERS 0x17 | |
| 65 | 65 | |
| 66 | 66 | typedef enum { |
| 67 | 67 | _MODBUS_BACKEND_TYPE_RTU=0, | ... | ... |
src/modbus.c
| ... | ... | @@ -138,7 +138,7 @@ static unsigned int compute_response_length_from_request(modbus_t *ctx, uint8_t |
| 138 | 138 | length = 2 + (nb / 8) + ((nb % 8) ? 1 : 0); |
| 139 | 139 | } |
| 140 | 140 | break; |
| 141 | - case _FC_READ_AND_WRITE_REGISTERS: | |
| 141 | + case _FC_WRITE_AND_READ_REGISTERS: | |
| 142 | 142 | case _FC_READ_HOLDING_REGISTERS: |
| 143 | 143 | case _FC_READ_INPUT_REGISTERS: |
| 144 | 144 | /* Header + 2 * nb values */ |
| ... | ... | @@ -254,7 +254,7 @@ static uint8_t compute_meta_length_after_function(int function, |
| 254 | 254 | } else if (function == _FC_WRITE_MULTIPLE_COILS || |
| 255 | 255 | function == _FC_WRITE_MULTIPLE_REGISTERS) { |
| 256 | 256 | length = 5; |
| 257 | - } else if (function == _FC_READ_AND_WRITE_REGISTERS) { | |
| 257 | + } else if (function == _FC_WRITE_AND_READ_REGISTERS) { | |
| 258 | 258 | length = 9; |
| 259 | 259 | } else { |
| 260 | 260 | /* _FC_READ_EXCEPTION_STATUS, _FC_REPORT_SLAVE_ID */ |
| ... | ... | @@ -290,7 +290,7 @@ static int compute_data_length_after_meta(modbus_t *ctx, uint8_t *msg, |
| 290 | 290 | case _FC_WRITE_MULTIPLE_REGISTERS: |
| 291 | 291 | length = msg[ctx->backend->header_length + 5]; |
| 292 | 292 | break; |
| 293 | - case _FC_READ_AND_WRITE_REGISTERS: | |
| 293 | + case _FC_WRITE_AND_READ_REGISTERS: | |
| 294 | 294 | length = msg[ctx->backend->header_length + 9]; |
| 295 | 295 | break; |
| 296 | 296 | default: |
| ... | ... | @@ -300,7 +300,7 @@ static int compute_data_length_after_meta(modbus_t *ctx, uint8_t *msg, |
| 300 | 300 | /* MSG_CONFIRMATION */ |
| 301 | 301 | if (function <= _FC_READ_INPUT_REGISTERS || |
| 302 | 302 | function == _FC_REPORT_SLAVE_ID || |
| 303 | - function == _FC_READ_AND_WRITE_REGISTERS) { | |
| 303 | + function == _FC_WRITE_AND_READ_REGISTERS) { | |
| 304 | 304 | length = msg[ctx->backend->header_length + 1]; |
| 305 | 305 | } else { |
| 306 | 306 | length = 0; |
| ... | ... | @@ -526,7 +526,7 @@ static int check_confirmation(modbus_t *ctx, uint8_t *req, |
| 526 | 526 | req_nb_value = (req_nb_value / 8) + ((req_nb_value % 8) ? 1 : 0); |
| 527 | 527 | rsp_nb_value = rsp[offset + 1]; |
| 528 | 528 | break; |
| 529 | - case _FC_READ_AND_WRITE_REGISTERS: | |
| 529 | + case _FC_WRITE_AND_READ_REGISTERS: | |
| 530 | 530 | case _FC_READ_HOLDING_REGISTERS: |
| 531 | 531 | case _FC_READ_INPUT_REGISTERS: |
| 532 | 532 | /* Read functions 1 value = 2 bytes */ |
| ... | ... | @@ -858,7 +858,7 @@ int modbus_reply(modbus_t *ctx, const uint8_t *req, |
| 858 | 858 | return -1; |
| 859 | 859 | break; |
| 860 | 860 | |
| 861 | - case _FC_READ_AND_WRITE_REGISTERS: { | |
| 861 | + case _FC_WRITE_AND_READ_REGISTERS: { | |
| 862 | 862 | int nb = (req[offset + 3] << 8) + req[offset + 4]; |
| 863 | 863 | uint16_t address_write = (req[offset + 5] << 8) + req[offset + 6]; |
| 864 | 864 | int nb_write = (req[offset + 7] << 8) + req[offset + 8]; |
| ... | ... | @@ -867,7 +867,7 @@ int modbus_reply(modbus_t *ctx, const uint8_t *req, |
| 867 | 867 | (address_write + nb_write) > mb_mapping->nb_registers) { |
| 868 | 868 | if (ctx->debug) { |
| 869 | 869 | fprintf(stderr, |
| 870 | - "Illegal data read address %0X or write address %0X in read_and_write_registers\n", | |
| 870 | + "Illegal data read address %0X or write address %0X write_and_read_registers\n", | |
| 871 | 871 | address + nb, address_write + nb_write); |
| 872 | 872 | } |
| 873 | 873 | rsp_length = response_exception(ctx, &sft, |
| ... | ... | @@ -1255,11 +1255,12 @@ int modbus_write_registers(modbus_t *ctx, int addr, int nb, const uint16_t *src) |
| 1255 | 1255 | return rc; |
| 1256 | 1256 | } |
| 1257 | 1257 | |
| 1258 | -/* Read multiple registers from remote device to dest array and write multiple | |
| 1259 | - registers to remote device from data array. */ | |
| 1260 | -int modbus_read_and_write_registers(modbus_t *ctx, | |
| 1261 | - int read_addr, int read_nb, uint16_t *dest, | |
| 1262 | - int write_addr, int write_nb, const uint16_t *data) | |
| 1258 | +/* Write multiple registers from src array to remote device and read multiple | |
| 1259 | + registers from remote device to dest array. */ | |
| 1260 | +int modbus_write_and_read_registers(modbus_t *ctx, | |
| 1261 | + int write_addr, int write_nb, const uint16_t *src, | |
| 1262 | + int read_addr, int read_nb, uint16_t *dest) | |
| 1263 | + | |
| 1263 | 1264 | { |
| 1264 | 1265 | int rc; |
| 1265 | 1266 | int req_length; |
| ... | ... | @@ -1268,27 +1269,27 @@ int modbus_read_and_write_registers(modbus_t *ctx, |
| 1268 | 1269 | uint8_t req[MAX_MESSAGE_LENGTH]; |
| 1269 | 1270 | uint8_t rsp[MAX_MESSAGE_LENGTH]; |
| 1270 | 1271 | |
| 1271 | - if (read_nb > MODBUS_MAX_READ_REGISTERS) { | |
| 1272 | + if (write_nb > MODBUS_MAX_RW_WRITE_REGISTERS) { | |
| 1272 | 1273 | if (ctx->debug) { |
| 1273 | 1274 | fprintf(stderr, |
| 1274 | - "ERROR Too many registers requested (%d > %d)\n", | |
| 1275 | - read_nb, MODBUS_MAX_READ_REGISTERS); | |
| 1275 | + "ERROR Too many registers to write (%d > %d)\n", | |
| 1276 | + write_nb, MODBUS_MAX_RW_WRITE_REGISTERS); | |
| 1276 | 1277 | } |
| 1277 | 1278 | errno = EMBMDATA; |
| 1278 | 1279 | return -1; |
| 1279 | 1280 | } |
| 1280 | 1281 | |
| 1281 | - if (write_nb > MODBUS_MAX_RW_WRITE_REGISTERS) { | |
| 1282 | + if (read_nb > MODBUS_MAX_READ_REGISTERS) { | |
| 1282 | 1283 | if (ctx->debug) { |
| 1283 | 1284 | fprintf(stderr, |
| 1284 | - "ERROR Too many registers to write (%d > %d)\n", | |
| 1285 | - write_nb, MODBUS_MAX_RW_WRITE_REGISTERS); | |
| 1285 | + "ERROR Too many registers requested (%d > %d)\n", | |
| 1286 | + read_nb, MODBUS_MAX_READ_REGISTERS); | |
| 1286 | 1287 | } |
| 1287 | 1288 | errno = EMBMDATA; |
| 1288 | 1289 | return -1; |
| 1289 | 1290 | } |
| 1290 | 1291 | req_length = ctx->backend->build_request_basis(ctx, |
| 1291 | - _FC_READ_AND_WRITE_REGISTERS, | |
| 1292 | + _FC_WRITE_AND_READ_REGISTERS, | |
| 1292 | 1293 | read_addr, read_nb, req); |
| 1293 | 1294 | |
| 1294 | 1295 | req[req_length++] = write_addr >> 8; |
| ... | ... | @@ -1299,8 +1300,8 @@ int modbus_read_and_write_registers(modbus_t *ctx, |
| 1299 | 1300 | req[req_length++] = byte_count; |
| 1300 | 1301 | |
| 1301 | 1302 | for (i = 0; i < write_nb; i++) { |
| 1302 | - req[req_length++] = data[i] >> 8; | |
| 1303 | - req[req_length++] = data[i] & 0x00FF; | |
| 1303 | + req[req_length++] = src[i] >> 8; | |
| 1304 | + req[req_length++] = src[i] & 0x00FF; | |
| 1304 | 1305 | } |
| 1305 | 1306 | |
| 1306 | 1307 | rc = send_msg(ctx, req, req_length); | ... | ... |
src/modbus.h
| ... | ... | @@ -173,9 +173,9 @@ int modbus_write_bit(modbus_t *ctx, int coil_addr, int status); |
| 173 | 173 | int modbus_write_register(modbus_t *ctx, int reg_addr, int value); |
| 174 | 174 | int modbus_write_bits(modbus_t *ctx, int addr, int nb, const uint8_t *data); |
| 175 | 175 | int modbus_write_registers(modbus_t *ctx, int addr, int nb, const uint16_t *data); |
| 176 | -int modbus_read_and_write_registers(modbus_t *ctx, int read_addr, | |
| 177 | - int read_nb, uint16_t *dest, int write_addr, | |
| 178 | - int write_nb, const uint16_t *data); | |
| 176 | +int modbus_write_and_read_registers(modbus_t *ctx, int write_addr, int write_nb, | |
| 177 | + const uint16_t *src, int read_addr, int read_nb, | |
| 178 | + uint16_t *dest); | |
| 179 | 179 | int modbus_report_slave_id(modbus_t *ctx, uint8_t *dest); |
| 180 | 180 | |
| 181 | 181 | modbus_mapping_t* modbus_mapping_new(int nb_coil_status, int nb_input_status, | ... | ... |
tests/bandwidth-client.c
| ... | ... | @@ -174,7 +174,7 @@ int main(int argc, char *argv[]) |
| 174 | 174 | nb_points = MODBUS_MAX_RW_WRITE_REGISTERS; |
| 175 | 175 | start = gettime_ms(); |
| 176 | 176 | for (i=0; i<n_loop; i++) { |
| 177 | - rc = modbus_read_and_write_registers(ctx, | |
| 177 | + rc = modbus_write_and_read_registers(ctx, | |
| 178 | 178 | 0, nb_points, tab_reg, |
| 179 | 179 | 0, nb_points, tab_reg); |
| 180 | 180 | if (rc == -1) { | ... | ... |
tests/random-test-client.c
| ... | ... | @@ -195,9 +195,9 @@ int main(void) |
| 195 | 195 | } |
| 196 | 196 | } |
| 197 | 197 | /* R/W MULTIPLE REGISTERS */ |
| 198 | - rc = modbus_read_and_write_registers(ctx, | |
| 199 | - addr, nb, tab_rp_registers, | |
| 200 | - addr, nb, tab_rw_rq_registers); | |
| 198 | + rc = modbus_write_and_read_registers(ctx, | |
| 199 | + addr, nb, tab_rw_rq_registers, | |
| 200 | + addr, nb, tab_rp_registers); | |
| 201 | 201 | if (rc != nb) { |
| 202 | 202 | printf("ERROR modbus_read_and_write_registers (%d)\n", rc); |
| 203 | 203 | printf("Address = %d, nb = %d\n", addr, nb); | ... | ... |
tests/unit-test-client.c
| ... | ... | @@ -269,13 +269,13 @@ int main(int argc, char *argv[]) |
| 269 | 269 | /* Write registers to zero from tab_rp_registers and store read registers |
| 270 | 270 | into tab_rp_registers. So the read registers must set to 0, except the |
| 271 | 271 | first one because there is an offset of 1 register on write. */ |
| 272 | - rc = modbus_read_and_write_registers(ctx, | |
| 273 | - UT_REGISTERS_ADDRESS, UT_REGISTERS_NB, | |
| 272 | + rc = modbus_write_and_read_registers(ctx, | |
| 273 | + UT_REGISTERS_ADDRESS + 1, UT_REGISTERS_NB - 1, | |
| 274 | 274 | tab_rp_registers, |
| 275 | - UT_REGISTERS_ADDRESS + 1, | |
| 276 | - UT_REGISTERS_NB - 1, | |
| 275 | + UT_REGISTERS_ADDRESS, | |
| 276 | + UT_REGISTERS_NB, | |
| 277 | 277 | tab_rp_registers); |
| 278 | - printf("4/5 modbus_read_and_write_registers: "); | |
| 278 | + printf("4/5 modbus_write_and_read_registers: "); | |
| 279 | 279 | if (rc != UT_REGISTERS_NB) { |
| 280 | 280 | printf("FAILED (nb points %d != %d)\n", rc, UT_REGISTERS_NB); |
| 281 | 281 | goto close; | ... | ... |