window:
使用EasyModbusTCP Server Simulator 作为服务。
linux:
程序:
#include <stdio.h>
#include <modbus/modbus.h>
int main()
{
modbus_t *ctx;
uint16_t holding_registers[1];
// Create a new Modbus TCP context
ctx = modbus_new_tcp("192.168.2.3", 502);
if (ctx == NULL) {
fprintf(stderr, "Error creating Modbus TCP context\n");
return 1;
}
// Connect to the Modbus server
if (modbus_connect(ctx) == -1) {
fprintf(stderr, "Error connecting to Modbus server: %s\n", modbus_strerror(errno));
modbus_free(ctx);
return 1;
}
// Read the value of holding register 0
int rc = modbus_read_registers(ctx, 0, 1, holding_registers);
if (rc == -1) {
fprintf(stderr, "Error reading holding register: %s\n", modbus_strerror(errno));
modbus_free(ctx);
return 1;
}
// Print the value of the holding register
printf("Value of holding register 0: %d\n", holding_registers[0]);
// Disconnect from the Modbus server and free the context
modbus_close(ctx);
modbus_free(ctx);
return 0;
}
反馈:
Error reading holding register: Connection timed out
后面添加了延时:
modbus_set_response_timeout(ctx, 1,0);
没有效果,然后再次添加了设置设备ID:
modbus_set_slave(ctx, 1);
这时的结果就是正确的:
Value of holding register 0: 23
原因分析:
modbus-TCP的设备ID的作用:
在 Modbus-TCP 中,设备 ID(Device ID)通常用于标识 Modbus 服务器或从设备。Modbus-TCP 是一种基于 TCP/IP 协议的 Modbus 通信协议,其中 TCP/IP 用于传输 Modbus 数据和命令。与传统的串行 Modbus 不同,Modbus-TCP 中的设备 ID 并不是必需的,因为网络地址可以唯一地标识 Modbus 服务器或从设备。
然而,设备 ID 仍然可以用于一些特殊的应用场景,例如在一个网络中存在多个 Modbus 服务器或从设备时,可以使用设备 ID 来区分它们。在这种情况下,设备 ID 可以被视为一个设备的逻辑地址,而网络地址则是物理地址。此外,设备 ID 还可以用于 Modbus-TCP 与其他 Modbus 协议之间进行转换时,例如将 Modbus-TCP 转换为 Modbus RTU,设备 ID 可以用于保持通信一致性和兼容性。(by chatGPT)