Commande d'instrument, redirection vers fichier

Commande d'instrument, redirection vers fichier - C - Programmation

Marsh Posté le 27-06-2006 à 14:10:19    

Bonjour,
je cherche à remplir un tableau avec un fichier qui me permettrait de balancer le tout sur un géné de type HP 33120.
J'ai trouvé un programme qui semble le faire, le problème est qu'il me balance des boucles for et que en gros tu rentres tout à la main comme un bête gars.
Je voulais savoir comment faire pour lui indiquer un fichier de type csv ou txt avec la suite de bit qui remplirait directement la condition.
J'ai pas des connaissances exceptionnelles en c(enfin ca ressemble à du c) et donc je voulais votre avis et vos conseils pour rediriger l'entrée standard vers un fichier.
la partie qui gère le foutage en tableau des données est la fonction : void get_data(void)
 
 
Merci à tous !  
 

Code :
  1. This program uses the arbitrary waveform function to download and
  2. output a square wave pulse with a calculated rise time and fall time.
  3. The waveform consists of 4000 points downloaded over the GPIB
  4. interface as ASCII data.
  5. ***************************************************************************/
  6. #include <stdio.h> /* Used for printf() */
  7. #include <stdlib.h> /* Used for malloc(), free(), atoi() */
  8. #include <string.h> /* Used for strlen() */
  9. #include <cfunc.h> /* Header file from GPIB Command Library */
  10. #define ISC 7L /* Assign GPIB select code */
  11. #define ADDR 710L /* Set GPIB address for function generator */
  12. /* Function Prototypes */
  13. void rst_clear(void);
  14. void get_data(void);
  15. void download_data(float *waveform, int num_points);
  16. void out_waveform(void);
  17. void command_exe(char *commands[], int length);
  18. void check_error(char *func_name);
  19. /**************************************************************************/
  20. void main(void) /* Start of main() */
  21. {
  22. rst_clear(); /* Reset the instrument and clear error queue */
  23. get_data(); /* Calculate the waveform data points */
  24. out_waveform(); /* Download points and output arb waveform */
  25. }
  26. /**************************************************************************/
  27. void rst_clear(void)
  28. {
  29. /* Reset the function generator, clear the error queue, and wait for
  30. commands to complete. A "1" is sent to the output buffer from the
  31. *OPC? command when *RST and *CLS are completed. */
  32. float value;
  33. IOOUTPUTS(ADDR, "*RST;*CLS;*OPC?", 15);
  34. IOENTER(ADDR, &value);
  35. }
  36. /**************************************************************************/
  37. void get_data(void)
  38. {
  39. /* Load 4000 points into an array to set the rise time and fall time
  40. to 250 ns and the pulse width to 10 us (the output frequency is set
  41. to 5 kHz in the "out_waveform" function). */
  42. float *waveform;
  43. int loop, num_points = 4000;
  44. waveform = (float*) malloc (num_points * sizeof(float));
  45. for (loop = 1; loop <= 5; loop++)
  46. {
  47. waveform[loop] = (float)(loop-1)/5; /* Set rise time (5 points) */
  48. }
  49. for (loop = 6; loop <= 205; loop++)
  50. {
  51. waveform[loop] = 1; /* Set pulse width (10 points) */
  52. }
  53. for (loop = 206; loop <= 210; loop++)
  54. {
  55. waveform[loop] = (float)(210-loop)/5; /* Set fall time (5 points) */
  56. }
  57. 6
  58. for (loop = 211; loop <= 4000; loop++)
  59. {
  60. waveform[loop] = 0; /* Set remaining points to zero */
  61. }
  62. /* Call function to download the 4000 data points to volatile memory */
  63. download_data(waveform, num_points);
  64. /* Free memory allocated for data points */
  65. free(waveform);
  66. }
  67. /**************************************************************************/
  68. void download_data(float *waveform, int num_points)
  69. {
  70. /* Download the waveform array (4000 points) to volatile memory.
  71. The function generator expects to receive the arb waveform data as
  72. one contiguous block. To do this, suppress the carriage return (CR)
  73. and line feed (LF) before downloading the data. */
  74. static char state[2] = {13, 10}; /* ASCII 13 = carriage return
  75. ASCII 10 = line feed */
  76. /* First, disable EOI (End-or-Identify) and EOL (End-of-Line) */
  77. IOEOI (ISC,0); IOEOL (ISC, " ", 0);
  78. /* Send "DATA VOLATILE" header and suppress CR/LF */
  79. printf("Downloading Arb...\n\n" );
  80. IOOUTPUTS (ADDR, "DATA VOLATILE,", 14);
  81. /* Re-enable EOI and EOL for normal GPIB operation and send the data */
  82. IOEOI (ISC,1); IOEOL (ISC, state, 2);
  83. /* Use the IOOUTPUTA to output the waveform data as an ASCII array */
  84. IOOUTPUTA (ADDR, waveform, num_points); printf("Download Complete\n\n" );
  85. /* Call the function to check for errors */
  86. check_error("download_data" );
  87. }
  88. /**************************************************************************/
  89. void out_waveform(void)
  90. {
  91. /* Set the output frequency to 5 kHz with an amplitude of 10 Vpp and
  92. output the arbitrary waveform. */
  93. static char *cmd_string[]=
  94. {
  95. /* Copy arb waveform to non-volatile memory with name "PULSE" */
  96. "DATA:COPY PULSE, VOLATILE",
  97. "FUNC:USER PULSE", /* Select the active arb waveform */
  98. "FUNC:SHAP USER" /* Output the selected arb waveform */
  99. };
  100. /* Call the function to execute the command strings shown above */
  101. command_exe(cmd_string, sizeof(cmd_string)/sizeof(char*));
  102. /* Call the function to check for errors */
  103. check_error("out_waveform" );
  104. }
  105. /**************************************************************************/
  106. void command_exe(char *commands[], int length)
  107. {
  108. /* Execute one command string at a time using loop */
  109. int loop;
  110. for (loop = 0; loop < length; loop++)
  111. {
  112. IOOUTPUTS(ADDR, commands[loop], strlen(commands[loop]));
  113. }
  114. /* Set output termination to 50 ohms and output frequency to 5 kHz @ 5 Vpp */
  115. IOOUTPUTS(ADDR, "OUTP:LOAD 50", 12);
  116. IOOUTPUTS(ADDR, "FREQ 5000;VOLT 5", 16);
  117. }
  118. /**************************************************************************/
  119. void check_error(char *func_name)
  120. {
  121. /* Read error queue to determine if errors have occurred */
  122. char message[80];
  123. int length = 80;
  124. IOOUTPUTS(ADDR, "SYST:ERR?", 9); /* Read the error queue */
  125. IOENTERS(ADDR, message, &length); /* Enter error string */
  126. while (atoi(message) != 0) /* Loop until all errors are read */
  127. {
  128. printf("Error %s in function %s\n\n", message, func_name);
  129. IOOUTPUTS(ADDR, "SYST:ERR?", 9);
  130. IOENTERS(ADDR, message, &length);
  131. }
  132. }
  133. /**************************************************************************/
  134. End of Program 3


Message édité par mbl le 27-06-2006 à 14:12:21
Reply

Marsh Posté le 27-06-2006 à 14:10:19   

Reply

Marsh Posté le 27-06-2006 à 14:37:58    

a priori il n'y a aucune entrée clavier dans ce code. La fonction get_data elle te programme un créneau tout simple.
 

Reply

Marsh Posté le 27-06-2006 à 14:53:21    

euh oui enfin je voulais dire que la il te programme ton truc de base sans trop de modification possible après la compilation.
Moi je veux pouvoir spécifier un fichier avec ma trame à moi et ou il suffit juste de modifier les données dedans pour modifier la trame envoyée.
Et pas retouché toute la partie qui fait ca.
Parceque rentré 300 points en boucle for, je vais en avoir marre rapidement :/

Reply

Marsh Posté le 27-06-2006 à 16:26:42    

Heuuu. Je te propose ça et je laisse les autres intervenants faire le ménage dans mon code?

Code :
  1. void get_data(void)
  2. {
  3. FILE *fp;
  4. float *waveform;
  5. float temp;
  6. int num_points = 4000;
  7. int i;
  8. waveform = (float*) malloc (num_points * sizeof(float));
  9. int nbre=0;
  10. if ((fp = fopen("trame.txt","r" )) != NULL)
  11. {
  12.  while( !feof(fp) )
  13.  {
  14.   fscanf(fp,"%f",&temp);
  15.   waveform[nbre]=temp;
  16.   nbre++;
  17.  }
  18.  for (i=nbre;i<=num_points;i++) waveform[i]=0.0;
  19.  download_data(waveform, num_points);
  20.  fclose(fp);
  21. }
  22. else printf("%s\n","probleme fichier" );
  23. free(waveform);
  24. }


Il faut que tu crées un fichier trame.txt avec tes données rangées verticalement. Dis moi au moins si ça marche...
edit : petite modif


Message édité par GrosBocdel le 27-06-2006 à 20:11:48
Reply

Marsh Posté le 28-06-2006 à 06:31:16    

Merci beaucoup ! j'essaye ca tout à l'heure.
Euh enfin quand je peux mais ca m'a l'air assez probant :)

Reply

Marsh Posté le 28-06-2006 à 11:43:42    

boah ca soule !!  
J'arrive pas à trouver la librairie cfunc.h ! et le site d'agilent c'est le plus bel exemple de non ergonomie.

Reply

Marsh Posté le 28-06-2006 à 13:03:47    

bah ils ont quand même pensé à faire un champ de recherche sur leur page principale!  :)  
http://www.home.agilent.com/cgi-bi [...] RY_CODE=US
Comme j'ai pas ton géné HP sous la main, ça va devenir un peu compliqué pour moi. Essaie d'installer des pilotes plus anciens, ils doivent fournir ce fichier.
 

Reply

Marsh Posté le 28-06-2006 à 14:26:13    

t'inquiete déja essayer, c'est un pack à la con de 79mo qui ne peut pas etre installer si t'as pas tout les droits sur ta machine.
Moi par exemple j'ai pas tout les droits :)

Reply

Marsh Posté le 28-06-2006 à 15:43:37    

T'as plus qu'à offrir un café à ton admin alors !  :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed