AMIQ: Transfer waveform data file using GPIB commands only  FAQ overview
 
Question: How can I transfer a waveform data file to AMIQ using GPIB commands only?
I'm not able to transfer waveform data from a waveform file to AMIQ with
GPIB commands like
:MMEMory:DATA <destination>, <binary block data>.
 
   
Answer: The solution is this short BASIC program. The transfer to AMIQ is performed in line 210. It appears as
:MMEMory:DATA <filename>, <binary block data>

The BASIC program will send the following data
:MMEMory:DATA ’
amiqsico.wv’, #3140 <binary data>

#             The ASCII character # initiates binary block transfer
3             Number of digits of subsequent length information in ASCII
140           Length in ASCII of binary data record bytes
<binary data> 140 bytes of curve form

The data file is generated using the Pascal program listed after the BASIC program.


===== BASIC Program ====================================
10 IEC TERM 10
20 IEC OUT 6,"*rst"
30 REM                            wait after reset
40 HOLD 15000
50 IEC OUT 6,"*dcl"
60 IEC OUT 6,"*cls"
70 IEC OUT 6,":system:beeper:state off"
80 REM                            define memory
90 DIM Z$(1000)
100 REM                            open your file e.g. SICO.WV
110 OPENI# 5,"sico.wv"
120 REM                            read data from file
130 Z$=INPUT$(999,#5)
140 REM                           get number of bytes
150 L=LEN(Z$)
160 REM                           convert number of bytes into string
170 D$=STR$(L,USING "###")
180 REM                           merge data from your file into GPIB
190 REM                           command and send it to AMIQ via GPIB
200 REM                           to AMIQ hard disk (file: AMIQSICO.WV)
210 IEC OUT 6,":MMEM:data 'amiqsico.wv', #3"+D$+Z$
220 REM                           load data from AMIQ hard disk into
230 REM                           AMIQ memory
240 IEC OUT 6,":MMEM:load ram, 'amiqsico.wv';*wai"
250 REM                           start to run AMIQ outputs

260 IEC OUT 6,":output:I VAR"
270 IEC OUT 6,":output:Q VAR"
280 IEC OUT 6,":trig:imm"
290 REM                           read AMIQ status byte
300 IEC OUT 6,"*stb?"
310 IEC IN 6,A$
320 PRINT "AMIQ status (0 if ok): ",A$


===========================================================
===========================================================
===========================================================

The data for SICO.WV are generated using the following Pascal program:


program sincos (input, output);
(*
        GENERATION OF A WAVEFORM DATA SET FOR AMIQ
       ============================================


   The program generates a data set to output a sine
  and cosine wave at the I and Q outputs of AMIQ.
  The sine and cosine values range from -1 to 0 to +1.
  To transfer the values to AMIQ they must be converted into
  binary format consisting of integer 16-bit-wide numbers without a sign.


               + 1 ---> 64768
                    ...
                 0 ---> 32768
                    ...
               - 1 --->   768


   Before this binary data set can be processed further,
  the TYPE tag {TYPE: WV, xxxxxxx} must be placed in front.
  The TYPE tag must be the first entry in a WAVEFORM file.
  WV means that the file contains a curve which is closed upon
  itself.
  xxxxxxx is the checksum of the waveform file. To simplify
  our example, 0 is used, i.e. AMIQ does not evaluate a checksum.


   The binary data must now be packed into a WAVEFORM tag with
  the following structure:
  {WAVEFORM-Length: Start,# IQIQIQIQIQIQIQIQIQI ... IQ}


   The WAVEFORM tag consists of the following characters and data:
  {            Opens each tag.
  WAVEFORM     Name of the tag for waveform files.
  -            Separates the name from the length indication.
  Length       Length of the data set
                 Length indicates the number of bytes of the
                 data set and consists of:
                 number of digits of the start value
                 (1 to 7, in our example 1)
                 + length of ",#" (2 bytes)
                 + number of I/Q pairs * 4 (2 bytes for each
                                             I and Q value).
  :             Separates the name and length from the remainder
                of the data set. The blank can be omitted.
  Start         Address in the output memory of AMIQ used to
                store the following samples. In our example and
                most applications, this will be '0'.
  ,#            Indicates the beginning of the binary data.
  IQIQIQ        Binary data set.

                 The binary data contain the I and Q values in
                alternate order. The first value is an I value.
                Each value consists of 2 bytes, starting with
                the least significant bit.
  }             Terminates each tag.



   The tags TYPE and WAVEFORM are mandatory for each waveform
  file. All other tags can be inserted after the TYPE tag in
  arbitrary order, e.g.
        {TYPE: WV,0}
        {COMMENT: I/Q=sine/cosine, 20 points, clock 10 MHz}
        {CLOCK: 10e6}
        {FILTER: 2,5MHz}
        {WAVEFORM-83: 0,# IQIQIQIQIQIQ ... IQ}
*)



const
    STEPS      = 20;                 (* Range 0 to 3.14 divided into 20 steps *)
    FNAME      = 'SICO.WV';          (* Output file *)
    HEADTEXT   = '{TYPE: WV, 0}';    (* Header in file *)
    CLOCKTEXT  = '{CLOCK: 10e6}';    (* optional *)
    FILTERTEXT = '{FILTER: 2,5MHz}'; (* optional *)
    WAVETEXT1  = '{WAVEFORM-';       (* Start of waveform data *)
    WAVETEXT3  = ': 0,#';            (* Waveform data *)
    ENDETEXT   = '}';                (* End of waveform data *)


var
  fv       : file;
  sinus    : real;
  cosinus  : real;
  i        : integer;
  j        : integer;
  x        : real;
  value    : array[0..(STEPS * 2)] of word;
  charline : string;
begin
    assign(fv, FNAME);               (* define and open file for write *)
    rewrite(fv, 1);
    writeln('Neu');                  (* output some text on screen *)
    x := 0.0;
    j := 0;
    charline := HEADTEXT;               (* write header to file *)
    blockwrite(fv, charline[1], length(charline));
    charline := CLOCKTEXT;              (* optional write to file *)
    blockwrite(fv, charline[1], length(charline));
    charline := FILTERTEXT;             (* optional write to file *)
    blockwrite(fv, charline[1], length(charline));
    charline := WAVETEXT1;              (* write first part of waveform header to file *)
    blockwrite(fv, charline[1], length(charline));
    str(((STEPS * 4) + 3):3, charline); (* write data length of waveform to file *)
    blockwrite(fv, charline[1], length(charline));

     charline := WAVETEXT3;              (* terminate waveform header *)
    blockwrite(fv, charline[1], length(charline));


     for i := 0 to STEPS do
    begin       (* Calculate STEPS number of sine and cosine values.
                   Change the equations to generate other functions.
                   Make sure that the values are in the range
                                    768 <= sinus   <= 64768
                                    768 <= cosinus <= 64768 *)
         sinus   := ((64000.0 * (sin(x) + 1.0) / 2.0) + 768.0);
         cosinus := ((64000.0 * (cos(x) + 1.0) / 2.0) + 768.0);


          value[j] := trunc(sinus);         (* real to integer (I) and write to buffer *)
         value[j + 1] := trunc(cosinus);   (* real to integer (Q) and write to buffer *)
                                           (* output values to screen *)
         writeln(value[j]:10, value[j + 1]:10, sin(x):10:2, cos(x):10:2);
         x := x + (2.0 * PI / STEPS);      (* calculate next x *)
         j := j + 2;                       (* calculate next buffer position *)
    end;
    blockwrite(fv, value, STEPS * 4);      (* write buffer to file *)
    charline := ENDETEXT;                  (* write end marker to file *)
    blockwrite(fv, charline[1], length(charline));
    close(fv);
end.