Ejemplo n.º 1
0
int main(int argc, char *argv[])
{
    modbus_t            *ctx;
    struct timeval      timeout;
    int                 ret, i, rc, ii,iii;
    int nb_pointers;
   // unit16_t *tab_rp_registers;
    uint16_t        regs[MODBUS_MAX_READ_REGISTERS] = {0}; 
    uint16_t        regs2[MODBUS_MAX_READ_REGISTERS] = {0};
    char            regs3[MODBUS_MAX_READ_REGISTERS] = {0};
    FILE *fp = NULL;
 

    if(argc < 3){
        printf("INsufficient argument");
        return -1;
    }


    ctx = modbus_new_rtu(MODBUS_SERIAL_DEV,
            MODBUS_SERIAL_BAUDRATE,
            MODBUS_SERIAL_PARITY,
            MODBUS_SERIAL_DATABITS,
            MODBUS_SERIAL_STOPBITS);
 
    if (ctx == NULL) {
        fprintf(stderr, "Unable to create the libmodbus context\n");
        exit(-1);
    }
 
    
    i = modbus_rtu_get_serial_mode(ctx);
    if( i == MODBUS_RTU_RS232)
    {
	printf("Serial mode = RS232\n");
	ret = modbus_rtu_set_serial_mode(ctx, MODBUS_RTU_RS232);
	if(ret < 0)
	    fprintf(stderr, "modbus_rtu_set_serial_mode() error: %s\n", strerror(errno));
    }
    else if(i == MODBUS_RTU_RS485)
    {
	printf("Serial mode = RS485\n");
	ret = modbus_rtu_set_serial_mode(ctx, MODBUS_RTU_RS485);
	if(ret < 0)
	    fprintf(stderr, "modbus_rtu_set_serial_mode() error: %s\n", strerror(errno));
    }
    else
    {
	printf("Serial mode = RS485\n");
	ret = modbus_rtu_set_serial_mode(ctx, MODBUS_RTU_RS485);
	if(ret < 0)
	    fprintf(stderr, "modbus_rtu_set_serial_mode() error: %s\n", strerror(errno));
    }

    /* set slave device ID */
    modbus_set_slave(ctx, MODBUS_DEVICE_ID);
 
    /* Debug mode */
    modbus_set_debug(ctx, MODBUS_DEBUG);

    if (modbus_connect(ctx) == -1) {
        fprintf(stderr, "Connection failed: %s\n",
                modbus_strerror(errno));
        modbus_free(ctx);
        return -1;
    }


    /* Allocate and initialize the memory to store the registers */
  /*  nb_points = (UT_REGISTERS_NB > UT_INPUT_REGISTERS_NB) ?
        UT_REGISTERS_NB : UT_INPUT_REGISTERS_NB;
    tab_rp_registers = (uint16_t *) malloc(nb_points * sizeof(uint16_t));
    memset(tab_rp_registers, 0, nb_points * sizeof(uint16_t));
    */

     /* write data in test.txt */
    fp = fopen("test2.txt", "w");
    if(fp == NULL)
    {
        printf("fail to open file!\n");
        return -1;
    }


    for( iii=1; iii <= strtol(argv[2],NULL, 10);iii++)
        {
                regs[iii] = strtol(argv[iii+2], NULL, 10);
        }

        rc = modbus_write_registers(ctx, strtol(argv[1], NULL, 16), strtol(argv[2], NULL, 10), &regs[1]);
         if (rc < 0) {
                fprintf(stderr, "%s\n", modbus_strerror(errno));
         }


    /* read holding registers (0x03 function code) */

   rc = modbus_read_registers(ctx, strtol(argv[1], NULL, 16), strtol(argv[2], NULL, 10), regs2);
    if (rc < 0) {
        fprintf(stderr, "%s\n", modbus_strerror(errno));
    }
    else {
            printf("HOLDING REGISTERS:\n");
            for (ii=0; ii < rc; ii++) {
                sprintf(regs3, "%d", regs2[ii]);
                fputs(regs3, fp);
                fputs("\n", fp);
                printf("[%d]=%d\n", ii, regs2[ii]);
            }
    }


    fclose(fp);

    /* Close the connection */
    modbus_close(ctx);

    modbus_free(ctx);
 
    return 0;
}
Ejemplo n.º 2
0
int main(int argc, char *argv[])
{
        modbus_t *mb;
        int16_t tab_reg[100]={0};
  	int tty_fd,key_fd,led_fd;
	int  i = 0, count,regs;
        int mode;
	struct input_event ev_key;
	if (argc < 3) {
		fprintf(stdout, "Usage: [ UART device ] [ key device ]\n");
		exit(0);	
	}
	mb = modbus_new_rtu(argv[1],115200,'N',8,1);//open port
        key_fd=open(argv[2],O_RDWR);
	if (key_fd < 0) {
	    perror("open key device error!\n");
	    close(key_fd);
	    exit(1);
	}
        modbus_set_debug(mb, FALSE);
        modbus_set_error_recovery(mb,
                              MODBUS_ERROR_RECOVERY_LINK |
                              MODBUS_ERROR_RECOVERY_PROTOCOL);
        modbus_set_slave(mb,5);//set slave address
        if(mode=modbus_rtu_get_serial_mode(mb)<0){
            printf("get 1 serial mode faild\n");
            return -1;
        }
       mb=modbus_rtu_set_serial_mode(mb,MODBUS_RTU_RS485);
       if(mode=modbus_rtu_get_serial_mode(mb)<0){
          printf("get 2 serial mode faild\n");
          return -1;
       }
       if(mode==1)
         printf("mode:RS485 %d\n",mode);
       else
         printf("mode:RS232 %d\n",mode);
       //modbus_rtu_open_485de(mb,"/sys/class/leds/RS485_TX_RX/brightness");
       modbus_connect(mb);

       led_fd = open("/sys/class/leds/sys_led/brightness", O_RDWR);	
       if (led_fd < 0) {
		perror("open led device error!\n");
		close(led_fd);
		exit(1);
       }
       write(led_fd, "0", 1);
       for ( ; ; ) {
              count = read(key_fd, &ev_key, sizeof(struct input_event));		
              if (count > 0){
		     if (EV_KEY == ev_key.type){
                     printf("type:%d, code:%d, value:%d\n", ev_key.type, ev_key.code, ev_key.value);
                     switch(ev_key.code){
		                case 22:
		                    if (0 == ev_key.value) {
                                        //modbus_set_slave(mb,5);//set slave address
		                       regs=modbus_read_registers(mb, 0x000B,1, tab_reg);
		                       // for(i=0;i<regs;i++)
		                       //    printf("异常光路:[%d]=%d\n",i,tab_reg[i]);
                                       // printf("----------------------------------->发出切换指令 A\n");
                                        write(led_fd, "1", 1);
		                        sleep(1);
                                       // printf("----------------------------------->发出切换指令 B\n");
                                        write(led_fd, "0", 1);
                                        //sleep(1);
                                       //  printf("----------------------------------->发出切换指令 C\n");
		                     }
		                     break;
		                case 16: {
		                    if (0 == ev_key.value) {
                                        modbus_set_slave(mb,2);//set slave address
		                        regs=modbus_read_registers(mb, 0x000B,1, tab_reg);
		                        for(i=0;i<regs;i++)
		                           printf("异常光路:[%d]=%d\n",i,tab_reg[i]);
		                      
		                     }
		                     break;
		                case 17:
		                    if (0 == ev_key.value) {
                                        modbus_set_slave(mb,3);//set slave address
		                        regs=modbus_read_registers(mb, 0x000B,1, tab_reg);
		                        for(i=0;i<regs;i++)
		                           printf("异常光路:[%d]=%d\n",i,tab_reg[i]);
		                      
		                     }
		                     break;
		                case 18:
		                    if (0 == ev_key.value) {
                                        modbus_set_slave(mb,4);//set slave address
		                        regs=modbus_read_registers(mb, 0x000B,1, tab_reg);
		                        for(i=0;i<regs;i++)
		                           printf("异常光路:[%d]=%d\n",i,tab_reg[i]);
		                      
		                     }
		                     break;
		                case 19: 
		                    if (0 == ev_key.value) {
                                        modbus_set_slave(mb,1);//set slave address
		                        regs=modbus_read_registers(mb, 0x000B,1, tab_reg);
		                        for(i=0;i<regs;i++)
		                           printf("异常光路:[%d]=%d\n",i,tab_reg[i]);
		                      
		                     }
		                     break;
		                case 20: 
		                    if (0 == ev_key.value) {
                                        modbus_set_slave(mb,6);//set slave address
		                        regs=modbus_read_registers(mb, 0x000B,1, tab_reg);
		                        for(i=0;i<regs;i++)
		                           printf("异常光路:[%d]=%d\n",i,tab_reg[i]);
		                      
		                     }
		                     break;
		                case 21: 
		                    if (0 == ev_key.value) {
                                        modbus_set_slave(mb,7);//set slave address
		                        regs=modbus_read_registers(mb, 0x000B,1, tab_reg);
		                        for(i=0;i<regs;i++)
		                           printf("异常光路:[%d]=%d\n",i,tab_reg[i]);
		                      
		                     }
		                     break;
		                case 15:
		                    if (0 == ev_key.value) {
                                        modbus_set_slave(mb,8);//set slave address
		                        regs=modbus_read_registers(mb, 0x000B,1, tab_reg);
		                        for(i=0;i<regs;i++)
		                           printf("异常光路:[%d]=%d\n",i,tab_reg[i]);
		                     }
		                     break;
		               default:
		                    printf("无效中断");
		                    break;								  
		       }	
                   }
               }	
           }
        }
	close(key_fd);
        modbus_close(mb);  
        modbus_free(mb);
	return 0;
}
Ejemplo n.º 3
0
int main(int argc, char *argv[])
{
    modbus_t            *ctx;
    struct timeval      timeout;
    int                 ret, i, rc, ii;
    int nb_pointers;
    //unit16_t *tab_rp_registers;
    uint16_t        regs[MODBUS_MAX_READ_REGISTERS] = {0};
    char            regs2[MODBUS_MAX_READ_REGISTERS]={0};
    FILE *fp = NULL;

    int err, rows, cols;
 

   if(argc != 5){
        printf("INsufficient argument");
        return -1;
    }
    err = opendb();
    if(err)
    {
	/*Database is not open*/
	return err;
    }


    ctx = modbus_new_rtu(MODBUS_SERIAL_DEV,
            MODBUS_SERIAL_BAUDRATE,
            MODBUS_SERIAL_PARITY,
            MODBUS_SERIAL_DATABITS,
            MODBUS_SERIAL_STOPBITS);
 
    if (ctx == NULL) {
        fprintf(stderr, "Unable to create the libmodbus context\n");
        exit(-1);
    }
 
    
    i = modbus_rtu_get_serial_mode(ctx);
    if( i == MODBUS_RTU_RS232)
    {
	printf("Serial mode = RS232\n");
	ret = modbus_rtu_set_serial_mode(ctx, MODBUS_RTU_RS232);
	if(ret < 0)
	    fprintf(stderr, "modbus_rtu_set_serial_mode() error: %s\n", strerror(errno));
    }
    else if(i == MODBUS_RTU_RS485)
    {
	printf("Serial mode = RS485\n");
	ret = modbus_rtu_set_serial_mode(ctx, MODBUS_RTU_RS485);
	if(ret < 0)
	    fprintf(stderr, "modbus_rtu_set_serial_mode() error: %s\n", strerror(errno));
    }
      else
    {
	printf("Serial mode = RS485\n");
	ret = modbus_rtu_set_serial_mode(ctx, MODBUS_RTU_RS485);
	if(ret < 0)
	    fprintf(stderr, "modbus_rtu_set_serial_mode() error: %s\n", strerror(errno));
    }
    /* set slave device ID */
    modbus_set_slave(ctx, strtol(argv[2], NULL, 10));
 
    /* Debug mode */
    modbus_set_debug(ctx, MODBUS_DEBUG);

    if (modbus_connect(ctx) == -1) {
        fprintf(stderr, "Connection failed: %s\n",
                modbus_strerror(errno));
        modbus_free(ctx);
        return -1;
    }


    /* Allocate and initialize the memory to store the registers */
    /*  nb_points = (UT_REGISTERS_NB > UT_INPUT_REGISTERS_NB) ?
        UT_REGISTERS_NB : UT_INPUT_REGISTERS_NB;
    tab_rp_registers = (uint16_t *) malloc(nb_points * sizeof(uint16_t));
    memset(tab_rp_registers, 0, nb_points * sizeof(uint16_t));
    */

     /* write data in test.txt */
    fp = fopen("test.txt", "w");
    if(fp == NULL)
    {
        printf("fail to open file!\n");
        return -1;
    }


 	

    rc = modbus_read_registers(ctx, strtol(argv[3], NULL, 16), strtol("1", NULL, 10), regs);
    if (rc < 0) {
	printf("1234\n");
        fprintf(stderr, "%s\n", modbus_strerror(errno));
    }
    else {
            printf("HOLDING REGISTERS:\n");
            for (ii=0; ii < rc; ii++) {
                sprintf(regs2, "%d", regs[ii]);
                fputs(regs2, fp);
                fputs("\n", fp);
                printf("[%d]=%d\n", ii, regs[ii]);
		sql_write2(argv[1], argv[2], argv[3], regs2, argv[4]);
		
            }
		if( mysql_query(dp, query))
		{
			fprintf(stderr, "%s\n", mysql_error(dp));
		}

		qp = mysql_store_result(dp);
		mysql_free_result(qp);
	
		mysql_close(dp);


    }

    fclose(fp);

    /* Close the connection */
    modbus_close(ctx);

    modbus_free(ctx);
 
    return 0;
}
Ejemplo n.º 4
0
int main(int argc, char *argv[])
{
	modbus_t *diris;
	int code;
	char errmsg[255];
	FILE *f_lock;

	uint16_t tab_reg[64];
	int i;
	int debug=0;

	if (argc==1)
	{
		fprintf(stderr,"Usage: %s <reg>\n", argv[0]);
		exit(1);
	}

	/* Lock file */
	srandom(time(NULL));
	i=0;
	f_lock=fopen("/var/run/modbus.lck","r");
	while (i < 4 && f_lock>0)
	{
		fclose(f_lock);
		usleep(500000*random()%10);
		i++;
		f_lock=fopen("/var/run/modbus.lck","r");
	}
	if (i==4) 
	{ 
		fprintf(stderr, "Lock timeout\n");
		exit(1);
	}
	if (f_lock<0)
	{
		f_lock=fopen("/var/run/modbus.lck","a");
		fputs("modbus",f_lock);
		fclose(f_lock);
	}

	/* Open Serial Device */
	diris=modbus_new_rtu("/dev/ttyUSB0", 9600, 'O', 8, 1);
	if (diris == NULL) {
	    fprintf(stderr, "Unable to create the libmodbus context\n");
	    unlink("/var/run/modbus.lck");
	    return 1;
	}

	/* Prepare to connect to Slave */
	code=modbus_set_slave(diris, 5);
	if(code <0)
	{
		perror(errmsg);
		fprintf(stderr,"Set slave error: %s\n",errmsg);
	    unlink("/var/run/modbus.lck");
		return 1;
	}

	if (debug)
		modbus_set_debug(diris, 1);

	if (debug)
	{
		/* Check Serial Mode */
		code=modbus_rtu_get_serial_mode(diris);
		if (code=MODBUS_RTU_RS485)
		{
			printf("Mode: RS485\n");
		}
		else
		{
			printf("Mode: RS232\n");
		}
	}

	if (debug)
	{
		/* Check RTS Mode */
		code=modbus_rtu_get_rts(diris);
		switch(code)
		{
			case MODBUS_RTU_RTS_NONE:
			printf("RTS: None\n");
			break;
			case MODBUS_RTU_RTS_UP:
			printf("RTS: Up\n");
			break;
			case MODBUS_RTU_RTS_DOWN:
			printf("RTS: Down\n");
			break;
			default:
			printf("RTS: Unknown\n");
		}
		printf("RTS: %d\n", code);
	}

	/* Change RTS Mode */
	modbus_rtu_set_rts(diris, MODBUS_RTU_RTS_UP);

	if (debug)
	{
		code=modbus_rtu_get_rts(diris);
		switch(code)
		{
			case MODBUS_RTU_RTS_NONE:
			printf("RTS: None\n");
			break;
			case MODBUS_RTU_RTS_UP:
			printf("RTS: Up\n");
			break;
			case MODBUS_RTU_RTS_DOWN:
			printf("RTS: Down\n");
			break;
			default:
			printf("RTS: Unknown\n");
		}
		printf("RTS: %d\n", code);
	}

	/* Initiate connect (nothing to do in serial mode) */
	if (modbus_connect(diris) == -1) {
	    fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
	    modbus_free(diris);
	    unlink("/var/run/modbus.lck");
	    return -1;
	}
	if (debug) {printf("Connect OK\n");}
	

	/* Do the read */
	if (debug) { printf("Reading %s\n", argv[1]); }
	/* int modbus_read_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest); */
	code = modbus_read_registers(diris, atoi(argv[1]), 2, tab_reg);
	if (code == -1) {
	    fprintf(stderr, "%s\n", modbus_strerror(errno));
		modbus_close(diris);
		modbus_free(diris);
	    unlink("/var/run/modbus.lck");
	    return -1;
	}

	/* Display Value returned */
	/*for (i=0; i < code; i++) {
	    printf("reg[%d]=%d (0x%X)\n", i, tab_reg[i], tab_reg[i]);
	}
	*/
	if (code==2)
	{
		printf("%d\n", tab_reg[1]);
	}

	/*printf("Reset IMax\n");
	code=modbus_write_register(diris, 1024, 1);
	if (code == -1)
	{
	    fprintf(stderr, "%s\n", modbus_strerror(errno));
		modbus_close(diris);
		modbus_free(diris);
	    return -1;
	}*/

	/* Close */
	modbus_close(diris);
	modbus_free(diris);
	unlink("/var/run/modbus.lck");
	return 0;
}