Advertisement
Guest User

Untitled

a guest
Jan 18th, 2017
209
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.13 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <signal.h>
  3. #include <inttypes.h>
  4. #include <string.h>
  5. #include <lightmodbus/master.h>
  6. #include <pthread.h>
  7.  
  8. ModbusMaster master;
  9. pthread_t pt;
  10.  
  11. void sigexit( int signum )
  12. {
  13. printf( "\nBye!\n" );
  14. pthread_cancel( pt );
  15. exit( 0 );
  16. }
  17.  
  18. int promptval( const char *name )
  19. {
  20. int val = 0;
  21. char buf[1024];
  22.  
  23. printf( "%s>", name );
  24. scanf( "%1023s", buf );
  25. sscanf( buf, "%d", &val );
  26. return val;
  27. }
  28.  
  29. void *prompt( void *dummy )
  30. {
  31. unsigned int i;
  32. uint16_t func;
  33. uint16_t addr;
  34. uint16_t index;
  35. uint16_t count;
  36. uint16_t andmask;
  37. uint16_t ormask;
  38. uint16_t val;
  39. uint8_t ec = 0;
  40. uint8_t *data = NULL;
  41. char strbuf[256];
  42.  
  43. addr = promptval( "addr" );
  44. func = promptval( "func" );
  45.  
  46. switch ( func )
  47. {
  48. case 1:
  49. case 2:
  50. index = promptval( "index" );
  51. count = promptval( "count" );
  52. ec = modbusBuildRequest0102( &master, func, addr, index, count );
  53. break;
  54.  
  55. case 3:
  56. case 4:
  57. index = promptval( "index" );
  58. count = promptval( "count" );
  59. ec = modbusBuildRequest0304( &master, func, addr, index, count );
  60. break;
  61.  
  62. case 5:
  63. index = promptval( "index" );
  64. val = promptval( "val" );
  65. ec = modbusBuildRequest05( &master, addr, index, !!val );
  66. break;
  67.  
  68. case 6:
  69. index = promptval( "index" );
  70. val = promptval( "val" );
  71. ec = modbusBuildRequest06( &master, addr, index, val );
  72. break;
  73.  
  74. case 15:
  75. index = promptval( "index" );
  76. count = promptval( "count" );
  77. data = calloc( BITSTOBYTES( count ), sizeof( uint8_t ) );
  78. if ( data == NULL ) raise( SIGINT );
  79.  
  80. for ( i = 0; i < count; i++ )
  81. {
  82. memset( strbuf, 0, 256 );
  83. snprintf( strbuf, 256, "%.2d:%.2d:%.2d", index, index + i, index + count );
  84. val = promptval( strbuf );
  85. modbusMaskWrite( data, BITSTOBYTES( count ), i, val );
  86. }
  87.  
  88. ec = modbusBuildRequest15( &master, addr, index, count, data );
  89. free( data );
  90. break;
  91.  
  92. case 16:
  93. index = promptval( "index" );
  94. count = promptval( "count" );
  95. data = calloc( count, sizeof( uint16_t ) );
  96. if ( data == NULL ) raise( SIGINT );
  97.  
  98. for ( i = 0; i < count; i++ )
  99. {
  100. memset( strbuf, 0, 256 );
  101. snprintf( strbuf, 256, "%.2d:%.2d:%.2d", index, index + i, index + count );
  102. val = promptval( strbuf );
  103. data[i] = val;
  104. }
  105.  
  106. ec = modbusBuildRequest16( &master, addr, index, count, (uint16_t*) data );
  107. free( data );
  108. break;
  109.  
  110. case 22:
  111. index = promptval( "index" );
  112. andmask = promptval( "and" );
  113. ormask = promptval( "or" );
  114. ec = modbusBuildRequest22( &master, addr, index, andmask, ormask );
  115. break;
  116.  
  117.  
  118. default:
  119. printf( ":unsupported function code!\n" );
  120. break;
  121. }
  122.  
  123. if ( ec != MODBUS_OK ) printf( ":error %d\n", ec );
  124. else
  125. {
  126. for ( i = 0; i < master.request.length; i++ )
  127. printf( "%.2X ", master.request.frame[i] );
  128. printf( "\n" );
  129. }
  130. return NULL;
  131. }
  132.  
  133. void sigreprompt( int signum )
  134. {
  135. pthread_cancel( pt );
  136. printf( "\n" );
  137. signal( SIGQUIT, sigreprompt );
  138. }
  139.  
  140. int main( int argc, char **argv )
  141. {
  142. signal( SIGINT, sigexit );
  143. signal( SIGQUIT, sigreprompt );
  144.  
  145. modbusMasterInit( &master );
  146. printf( "SIGINT to exit\n" );
  147.  
  148. while ( 1 )
  149. {
  150. pthread_create( &pt, NULL, prompt, NULL );
  151. pthread_join( pt, NULL );
  152. }
  153.  
  154. modbusMasterEnd( &master );
  155. return 0;
  156. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement