手头使用的是libmodbus库,不支持rtu over tcp模式。看官方没有增加这个功能的打算,于是在现有tcp代码基础上重构了下,增加了rtu over tcp支持,目前简单使用没有问题。
代码放到
https://github.com/zhaogaojian/libmodbus_rtu_over_tcp
使用示例如下
modbus_t *ctx;
uint16_t tab_reg[32] = {0};
ctx = modbus_new_rtutcp("192.168.1.16", 5001);
modbus_set_debug(ctx, TRUE); //设置debug模式
modbus_set_slave(ctx, 1); //从机地址
modbus_connect(ctx);
modbus_set_error_recovery(ctx,
MODBUS_ERROR_RECOVERY_LINK | MODBUS_ERROR_RECOVERY_PROTOCOL);
// struct timeval t;
// t.tv_sec=0;
// t.tv_usec=1000000; //设置modbus超时时间为1000毫秒
//modbus_set_response_timeout(ctx, 5, 1000000);
//modbus_set_byte_timeout(ctx, 5, 1000000);
while (1)
{
//printf("test\n");
int regs = modbus_read_input_registers(ctx, 4252, 2, tab_reg);
//printf("test1\n");
// regs=modbus_write_register(mb,0x00,94);
float f=modbus_get_float_abcd(tab_reg);
printf("%d %d %d %d %d %f\n", regs, tab_reg[0], tab_reg[1], tab_reg[2], tab_reg[3],f);
sleep(3);
}
modbus_close(ctx);
modbus_free(ctx);
return 0;