// Function for changing Modbus bytes timeout void ModbusClientV1::change_byte_timeout(int sec, int usec) { struct timeval t; modbus_get_byte_timeout(ctx, &t); printTimeTV("Initial byte timeout", &t); t.tv_sec = sec; t.tv_usec = usec; modbus_set_byte_timeout(ctx, &t); modbus_get_byte_timeout(ctx, &t); printTimeTV("New byte timeout", &t); }
modbus_ctrl::modbus_ctrl(modbus_t* context) : next_write_time(0), shadow_registers() { this->context = context; if(context == NULL) { throw modbus_exception(); } //set timeout struct timeval timeout_end; struct timeval timeout_begin; modbus_get_byte_timeout(context, &timeout_end); timeout_end.tv_usec = TIMEOUT_END; modbus_set_byte_timeout(context, &timeout_end); modbus_get_response_timeout(context, &timeout_begin); timeout_begin.tv_usec = TIMEOUT_BEGIN; modbus_set_response_timeout(context, &timeout_begin); //connect if(modbus_connect(context) == -1) { throw modbus_exception(); } }
static int ctx_get_byte_timeout(lua_State *L) { ctx_t *ctx = ctx_check(L, 1); uint32_t opt1, opt2; #if LIBMODBUS_VERSION_CHECK(3,1,0) modbus_get_byte_timeout(ctx->modbus, &opt1, &opt2); #else struct timeval t; modbus_get_byte_timeout(ctx->modbus, &t); opt1 = t.tv_sec; opt2 = t.tv_usec; #endif lua_pushnumber(L, opt1); lua_pushnumber(L, opt2); return 2; }
int main(int argc, char *argv[]) { modbus_t *ctx; struct timeval timeout; int ret, ii; /*uint8_t bits[MODBUS_MAX_READ_BITS] = {0};*/ uint16_t regs[MODBUS_MAX_READ_REGISTERS] = {0}; char regs2[MODBUS_MAX_READ_REGISTERS]={0}; FILE *fp = NULL; if(argc != 3){ printf("INsufficient argument"); return 1; } ctx = modbus_new_tcp(MODBUS_CLIENT_IP, MODBUS_CLIENT_PORT); /* set device ID */ modbus_set_slave(ctx, MODBUS_DEVICE_ID); /* Debug mode */ modbus_set_debug(ctx, MODBUS_DEBUG); /* set timeout */ timeout.tv_sec = MODBUS_TIMEOUT_SEC; timeout.tv_usec = MODBUS_TIMEOUT_USEC; modbus_get_byte_timeout(ctx, &timeout); timeout.tv_sec = MODBUS_TIMEOUT_SEC; timeout.tv_usec = MODBUS_TIMEOUT_USEC; modbus_set_response_timeout(ctx, &timeout); if (modbus_connect(ctx) == -1) { fprintf(stderr, "Connexion failed: %s\n", modbus_strerror(errno)); modbus_free(ctx); exit(-1); } /* write data in test.txt */ fp = fopen("test.txt", "w"); if(fp == NULL) { printf("fail to open file!\n"); return -1; } /* read holding registers (0x03 function code) */ ret = modbus_read_registers(ctx, strtol(argv[1], NULL, 16), strtol(argv[2], NULL, 10), regs); if (ret < 0) { fprintf(stderr, "%s\n", modbus_strerror(errno)); } else { printf("HOLDING REGISTERS:\n"); for (ii=0; ii < ret; ii++) { sprintf(regs2, "%d", regs[ii]); fputs(regs2, fp); fputs("\n", fp); printf("[%d]=%d\n", ii, regs[ii]); } } fclose(fp); /* Close the connection */ modbus_close(ctx); modbus_free(ctx); exit(0); }