// Function for changing Modbus response timeout
void ModbusClientV1::change_response_timeout(int sec, int usec)
{
	struct timeval t;

	modbus_get_response_timeout(ctx, &t);
	printTimeTV("Initial response timeout", &t);
	t.tv_sec = sec;
	t.tv_usec = usec;
	modbus_set_response_timeout(ctx, &t);
	modbus_get_response_timeout(ctx, &t);
	printTimeTV("New response 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_response_timeout(lua_State *L)
{
	ctx_t *ctx = ctx_check(L, 1);
	uint32_t opt1, opt2;
	
#if LIBMODBUS_VERSION_CHECK(3,1,0)
	modbus_get_response_timeout(ctx->modbus, &opt1, &opt2);
#else
	struct timeval t;
	modbus_get_response_timeout(ctx->modbus, &t);
	opt1 = t.tv_sec;
	opt2 = t.tv_usec;
#endif
	lua_pushnumber(L, opt1);
	lua_pushnumber(L, opt2);

	return 2;
}
Exemple #4
0
int main(int argc, char *argv[])
{
    uint16_t *tab_rp_registers = NULL;
    modbus_t *ctx = NULL;
    uint32_t sec_to = 1;
    uint32_t usec_to = 0;
    int i;
    int rc;
    int nb_points = 1;
    ctx = modbus_new_rtu(SERIAL_PORT, BAUD_RATE, PARITY, BYTE_SIZE, STOP_BITS);
    if (ctx == NULL) {
        fprintf(stderr, "Unable to allocate libmodbus context\n");
        return -1;
    }
    modbus_set_debug(ctx, TRUE);
    modbus_set_error_recovery(ctx, MODBUS_ERROR_RECOVERY_LINK | MODBUS_ERROR_RECOVERY_PROTOCOL);
    modbus_set_slave(ctx, SERVER_ID);
    modbus_get_response_timeout(ctx, &sec_to, &usec_to);
    modbus_enable_rpi(ctx,TRUE);
    modbus_configure_rpi_bcm_pin(ctx,RPI_PIN);
    modbus_rpi_pin_export_direction(ctx);


    //modbus_get_response_timeout(ctx, &old_response_to_sec, &old_response_to_usec);
    if (modbus_connect(ctx) == -1)
    {
        fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
        modbus_free(ctx);
        return -1;
    }
    // modbus_get_response_timeout(ctx, &new_response_to_sec, &new_response_to_usec);
    /* Allocate and initialize the memory to store the registers */
    tab_rp_registers = (uint16_t *) malloc(nb_points * sizeof(uint16_t));
    memset(tab_rp_registers, 0, nb_points * sizeof(uint16_t));
    rc = modbus_read_registers(ctx, 97,1, tab_rp_registers);
    printf("Date received is : %d\n",tab_rp_registers[0]);
    free(tab_rp_registers);

    /* Close the connection */
    modbus_rpi_pin_unexport_direction(ctx);
    modbus_close(ctx);
    modbus_free(ctx);
}
Exemple #5
0
uint8_t *raw_data_command(int *re_size,int size,uint8_t *raw_req)
{
	modbus_t *sdl;
	int req_length,re_try = 0;
	//int rc;
	uint8_t *rsp;
	//raw_req = malloc(MODBUS_RTU_MAX_ADU_LENGTH);
	rsp = malloc(MODBUS_RTU_MAX_ADU_LENGTH);
sdl_wifi:
	sdl = modbus_new_tcp("169.254.114.25",502);
	//sdl = modbus_new_tcp("192.168.1.25",502);
	struct timeval old_response_timeout;
	struct timeval response_timeout;

	/* Save original timeout */
	modbus_get_response_timeout(sdl, &old_response_timeout);

	/* Define a new and too short timeout! */
	response_timeout.tv_sec = 2;
	response_timeout.tv_usec = 0;
	modbus_set_response_timeout(sdl, &response_timeout);

    modbus_set_debug(sdl, TRUE);
	modbus_set_error_recovery(sdl,
                              MODBUS_ERROR_RECOVERY_LINK |
                              MODBUS_ERROR_RECOVERY_PROTOCOL);
	
	modbus_set_slave(sdl,1);

	if (modbus_connect(sdl) == -1) 
	{    
		if(re_try < 2){re_try++; sleep(2);goto sdl_wifi;}
		return NULL;
	}
	req_length = modbus_send_raw_request(sdl, raw_req, size*sizeof(uint8_t));
	//rc = modbus_receive_confirmation(sdl, rsp);
	*re_size = modbus_receive_confirmation(sdl, rsp);
	//printf("%s\n",rsp);
	//printf("%d\n",*re_size);
	modbus_close(sdl);
	modbus_free(sdl);
	return rsp;
}
Exemple #6
0
uint8_t * sdl_read_buffsize(int *size)
{
	int resend=0,re_con=0;	
	int rc, size_per_record,num_parameter,i,j;
	unsigned long num_record, num_byte;
	modbus_t *sdl;
	uint16_t * SDL_DATA_BUFF;
	uint8_t * rsp = malloc(MODBUS_RTU_MAX_ADU_LENGTH);
reconnect:	
	sdl = modbus_new_tcp("169.254.114.25",502);

	struct timeval old_response_timeout;
	struct timeval response_timeout;

	/* Save original timeout */
	modbus_get_response_timeout(sdl, &old_response_timeout);

	/* Define a new and too short timeout! */
	response_timeout.tv_sec = 2;
	response_timeout.tv_usec = 0;
	modbus_set_response_timeout(sdl, &response_timeout);

    modbus_set_debug(sdl, TRUE);
	modbus_set_error_recovery(sdl,
                              MODBUS_ERROR_RECOVERY_LINK |
                              MODBUS_ERROR_RECOVERY_PROTOCOL);
	
	modbus_set_slave(sdl,1);

	if (modbus_connect(sdl) == -1) 
	{   
		if(re_con < 3)
		{
			re_con++;
			sleep(2);
			goto reconnect;
		}
		else return NULL;
		
	}
tryagain:
	SDL_DATA_BUFF = (uint16_t*)malloc(4*sizeof(uint16_t));
	rc = modbus_read_input_registers(sdl,UT_REGISTERS_RD_DATA_BUFFSIZE_ADDRESS,2,SDL_DATA_BUFF);
	if (rc != 2) 
	{
		if(resend < 3)
		{
			resend++; 
			sleep(2);       		
			goto tryagain;
		}
		else return -100000;
	}
	i = 0;
	for(j=0;j<rc;j++)
	{
		rsp[i+1] = SDL_DATA_BUFF[j] & 0x00ff;
		rsp[i] = SDL_DATA_BUFF[j]>>8;		
		i = i+2;
	}
	*size = 2*rc;
	return rsp;
}
Exemple #7
0
uint8_t *sdl_read_data(int *size,int register_num)
{
	
	int retry=0;	
	int rc,read_num,i,j;
	int created_time;
	float parameter;
	long long_value;
	uint16_t *SDL_Paramenters;	
	read_num = 2*register_num;
	modbus_t *sdl;
	uint8_t * rsp = malloc(MODBUS_RTU_MAX_ADU_LENGTH);
	sdl = modbus_new_tcp("169.254.114.25",502);

	struct timeval old_response_timeout;
	struct timeval response_timeout;

	/* Save original timeout */
	modbus_get_response_timeout(sdl, &old_response_timeout);

	/* Define a new and too short timeout! */
	response_timeout.tv_sec = 2;
	response_timeout.tv_usec = 0;
	modbus_set_response_timeout(sdl, &response_timeout);

    modbus_set_debug(sdl, TRUE);
	modbus_set_error_recovery(sdl,
                              MODBUS_ERROR_RECOVERY_LINK |
                              MODBUS_ERROR_RECOVERY_PROTOCOL);
	
	modbus_set_slave(sdl,1);

	if (modbus_connect(sdl) == -1) 
	{   
		return NULL;
	}
try_more:
	// The number 6 is the extra bytes that we need to store the data such as checksum
	SDL_Paramenters = (uint16_t*)malloc(read_num*sizeof(uint16_t));
	rc = modbus_read_input_registers(sdl,UT_REGISTERS_RD_DATA_BUFF_ADDRESS,read_num,SDL_Paramenters);
	//*size = modbus_receive_confirmation(sdl, rsp);
    if (rc != read_num) 
	{
		if(retry < 3)
		{
			retry++;   
			sleep(2);     		
			goto try_more;
		}
		else return -100000;
	}
	i = 0;
	for(j=0;j<rc;j++)
	{
		rsp[i+1] = SDL_Paramenters[j] & 0x00ff;
		rsp[i] = SDL_Paramenters[j]>>8;		
		i = i+2;
		//printf("%x %x\n",rsp[i+1],rsp[i]);
	}
	*size = 2*rc;
	return rsp;
}