【发布时间】:2020-02-27 01:01:21
【问题描述】:
我将根据 modbus-tcp 规范进行读/写。 所以,我正在尝试在 linux 环境中编写客户端和服务器。 (我会使用 modbus-tcp 与 windows 程序(作为客户端)通信。)
但它没有按我的意愿工作,所以我在这里问你。
- 我正在测试 linux 作为客户端和 easymodbus 作为服务器的客户端代码。
- 我使用了 libmodbus 代码。
- 我想读取线圈(0x01)并写入线圈(0x05)。
- 当使用libmodbus执行代码时,从Unit ID部分打印出'ff'。(根据手册,modbus-tcp应该输出01。 我不知道为什么要打印“ff”(附照片)。
错误的结果:
预期结果:
- '[00] [00] .... [00]' ;你知道在哪里控制这部分吗?
- 您是否拥有或知道使用 libmodbus 实现“读/写”功能的示例代码?
如果您知道,请告诉我信息。
ctx = modbus_new_tcp("192.168.0.99", 502);
modbus_set_debug(ctx, TRUE);
if (modbus_connect(ctx) == -1) {
fprintf(stderr, "Connection failed: %s\n",
modbus_strerror(errno));
modbus_free(ctx);
return -1;
}
tab_rq_bits = (uint8_t *) malloc(nb * sizeof(uint8_t));
memset(tab_rq_bits, 0, nb * sizeof(uint8_t));
tab_rp_bits = (uint8_t *) malloc(nb * sizeof(uint8_t));
memset(tab_rp_bits, 0, nb * sizeof(uint8_t));
nb_loop = nb_fail = 0;
/* WRITE BIT */
rc = modbus_write_bit(ctx, addr, tab_rq_bits[0]);
if (rc != 1) {
printf("ERROR modbus_write_bit (%d)\n", rc);
printf("Address = %d, value = %d\n", addr, tab_rq_bits[0]);
nb_fail++;
} else {
rc = modbus_read_bits(ctx, addr, 1, tab_rp_bits);
if (rc != 1 || tab_rq_bits[0] != tab_rp_bits[0]) {
printf("ERROR modbus_read_bits single (%d)\n", rc);
printf("address = %d\n", addr);
nb_fail++;
}
}
printf("Test: ");
if (nb_fail)
printf("%d FAILS\n", nb_fail);
else
printf("SUCCESS\n");
free(tab_rq_bits);
free(tab_rp_bits);
/* Close the connection */
modbus_close(ctx);
modbus_free(ctx);
return 0;
【问题讨论】:
标签: modbus modbus-tcp