AOC Fast Tape Format
Al Goldstein
7 June 1995 Original Document
7 August 2000 Added User ASCII stream information
- Table 1
The following can be used to decipher the Fast Tape data recorded on the AOC
RAMS data system. A Fast Tape recording is used to capture raw, unaveraged
data at a greater than 1 sample per second rate. Some terms used in this
description are:
- AOC - Aircraft Operation Center
- RAMS - Research Aircraft Measurement System (the main aircraft data collection system)
- Byte - 8 bit digital quantity
- Word - 16 bit digital quantity
- INE - Inertial Navigation Equipment (Delco Carousel IV Nav. Units)
- RA - Radar Altimeter
General Description
Prior to 1994, fast tape data was recorded on 2400 ft reels of magnetic tape
in the industry standard 9-track 1600 BPI (bytes per inch) Phase Encoded
format. In 1994, AOC transitioned to Digital Audio Tape (DAT) drives mounted
internally to the RAMS Micro 99 minicomputers. Data recorded on DAT cartridges
use the industry standard DDS format, currently without any data compression.
Tape record formats are identical for both media types.
Although normally enabled all the time, the operator has the option to disable
Fast Tape recording, which can result in time gaps in the data. In the past,
Fast Data recording was selectively enabled, so older tapes are more likely to
have these time gaps. 9-track tapes could only store about two hours of
continuous data, so there may have been several tapes for each flight. The
actual number of records per tape was dependent on the configuration, selection
of channels, and rates for each channel. A DAT cartridge has the capacity to
store an entire flight's data, so unless there is a hardware problem, there
should only be one DAT per flight.
The data is separated into physical records, each record containing the data
collected during one second of operation. There should be no End Of File (EOF)
marks except after the last record of the flight. If a 9-Track tape was used
completely, there may be no EOF mark, but the End Of Tape (EOT) reflective
strip can be used to stop reading the tape. DAT drives append an End Of Data
(EOD) flag after every write to tape. Most software interprets this as an EOT,
the main difference being that a DAT does not 'run on' after the last valid
record before hitting EOT.
Record Description - Overview
The first word of each record contains a 2 (decimal) in the high (most
significant) byte (in Fortran: IAnd(First,177400b) will equal 1000 Octal or
0200 Hex). This differentiates Fast data records from Slow data and Dropsonde
data records and would only be changed if a major format revision was
implemented. The lower (least significant) byte of the first word has the
aircraft ID (42 or 43 Decimal, 52 or 53 Octal, 2A or 2B Hex).
The second word of each record gives the size of the record in 16 bit words.
There is no fixed size for each physical record. The size will vary depending
on the parameters selected for recording and the sampling rate for each analog
channel. It also depends on the number of samples received on asynchronous
digital channels (e.g. INE's & RA) during any given second. The absolute
maximum record size (limited by Hewlett Packard software and hardware) is
32768 words. Currently, the RAMS software limits the record size to somewhat
less than 10,000 words. This may change based on installation of new
instruments that output data in a high speed digital format (e.g. the DRI
charge probe).
The last word of each record is the checksum. This is equal to the least
significant 16 bits of the signed, 16 bit integer addition of all words in the
record except the checksum.
A suggested method of reading a Fast Data record is to initiate a read from the
tape to a buffer of at least the maximum anticipated size (e.g. 10,000 words).
A check for EOF and EOT/EOD should be made to verify that a record was actually
read. The read request should return the actual number of words read, which
can be compared with word 2 of the record. Word 1 can be checked for Fast Tape
(upper byte) and valid aircraft ID (lower byte). A checksum should then be
computed and compared to the last word of the record. If all these checks are
passed, a valid Fast Data record has been read.
Detailed Record Description
Each record consists of several sections. A table (Table 1) of the assignments
is attached. The ID, size and checksum have already been discussed. Words
3-8 contain the date and time that the data was collected. This time is a copy
of the HP Micro 99 internal clock, and should always be valid. The format is:
Year, Month, Day, Hour, Minute, Second. The ranges for each parameter are give
n in Table 1. The next three words are a copy of the time received from Time
Code Generator #1. Although this may be invalid due to hardware failure, if it
is present it can be used as a validity check on the Micro 99 time. The last
three words of the general info section are a copy of the event switch data.
This is included so that user marked events are easily correlated to the fast
data collection time. Detailed Record Description (cont.)
The next section contains the word counts for each digital and analog channel
stored in this record. The format shows ten words for the counts on digital
channels followed by 80 words corresponding to counts for the 80 analog to
digital converter channels. All counts are positive numbers of words.
The main data block begins at word 105. The first data will typically be from
INE #1 (unless word 15 - INE #1 counts - is zero). All words from each channel
are contiguous and are not time referenced within the second. For a normal
data count (instrument is not starting or stopping at odd intervals) a uniform
distribution across the second can be assumed.
A desired data block can be found by skipping over earlier blocks within the
record. As an example, to locate the start of APN-232 data, add 105 (the start
of the data block) to the contents of words 15 and 16. If there is no INE data
, this will result in a starting address of 105. In the more likely case,
normal INE data (2 INE's * 40 bursts per second * 10 parameters per burst * 2
16-bit words per parameter = 1600 words) will push the start of the APN-232
data to word 1705. The location of a data block must be computed individually
for each record, since counts can vary from one second to the next. A Fortran
example of code to locate a data block is given in Listing 1.
Data Formats
Data recorded on Fast Tape is as close to the original from the instrument as
possible. The format for each may be very different than the averaged sample
recorded on the AOC Slow Tape. Some of the descriptions and differences are
described here.
INE Data: The block for each INE is divided into one or more (max. 41,
typically 40) bursts. Each burst contains ten double words which are data
values for the ten INE parameters (PA,Lat,Long,etc.) measured during a 1/40
sec. interval (with INE internal filtering and processing). There should
never be a partial burst. The burst format, parameter scaling and bit
assignments are given in Table 2. It is important to note that the least
significant bit is used as an error flag and parameters with this bit set to 1
should not be used (for that one specific sample). This error flag is required
because the parity of each parameter value is checked in the Interface Adaptor
Unit, which then extends the sign of the data to the MS bit before the data is
sent to the Micro 29. A Fortran example of code for scaling the INE data is
given in Listing 2.
APN-232 Radar Altimeter: Each RA reading is stored as two words.
Normally there are 60-62 data samples per second. The format for the bit
assignments is given in Table 3. A Fortran example that checks for error bits
and scales the value into a floating point variable is given in Listing 3.
APN-159 Synchro RA: Each 16 bit word is one data sample. There are
typically 10 samples per second. The RA data is converted by two Synchro to
Digital converters, one for Coarse resolution, the other for Fine. The most
significant 4 bits of each data word are the Coarse reading, the other 12 bits
are the Fine. Listing 4 shows a method of converting this Coarse/Fine code
into feet of Radar Altitude.
APN-159 Parallel RA: Each 16 bit word is one data sample coded as
integer feet. As with the synchro data, there are typically ten samples per
second. The number of APN-159 units with operating parallel encoders decreased
in the early 1990's due to non-repairable encoder failures. Parallel RA was
not available at all after the 1994 Hurricane season.
User Data: Data is saved as raw ASCII, written to the Fast data record
at the completion of each line (as denoted by a and/or ). Lines with
an odd number of characters have a Null character (value - 00) in the LS byte
of the last word.
Analog Data: For the 80 A/D converter channels, each channel has its
own count word and its own data section. In normal operation, each channel's
data block will consist of 0, 10, 20, 40 or 80 samples, each sample stored in
one word. The number of samples stored for each channel is determined by the
configuration file used to start the system before the flight. If a channel is
selected for 10, 20 or 40 samples, the 80 data values actually collected are
averaged to the desired amount (e.g. for a channel configured at 20 samples,
each 4 samples collected would be added together and divided by 4 to get one
value to be stored). The scaling for all analog data is the same, regardless
of sample rate. Each data value is stored as a binary fraction with a sign bit
(the most significant, weighted as -10 volts) and 15 data bits. The second
most significant bit has a weight of +5 volts, the third represents +2.5 volts,
etc. down to the least significant bit, with a weight of approx. +0.305
millivolts.
The actual A/D converter module produces a 14 bit value, so a channel selected
for 80 samples on the Fast Tape will have 14 bits of data (sign + 13 bits)
followed by two zeros in the least significant bits. For lower sample rates
(10, 20 or 40 per second) these least significant bits will have data, since
the process of averaging extends the resolution of the data value. The same
conversion routine can be used for any data sample rate because the most
significant bit weights do not change. A simple method of converting Fast
Tape words to volts is:
Volts = Float(Integer_Word) * .000305
Table 1
Fast Tape Record Format
|
| Word
| Description
| 1 | Tape ID - set to (1000b + acft #)
| | 2 | Record Size in words
| | 3 | Year (e.g. 1991)
| Date and Time from Micro 29 clock
| | 4 | Month (1-12)
| | 5 | Day (1-31)
| | 6 | Hour (0-23)
| | 7 | Minute (0-59)
| | 8 | Second (0-59)
| | 9 | Hour (0-23)
| Time from Time Code Gen #1
| | 10 | Minute (0-59)
| | 11 | Second (0-59)
| | 12-14 | Event Switch Data
| | 15 | Digital channel 1
(INE #1) word count
| | 16 | Digital channel 2
(INE #2)word count
| | 17 | Digital channel 3
(APN-232 RA) word count
| | 18 | Digital channel 4
(Unassigned)word count
| | 19 | Digital channel 5
(Unassigned)word count
| | 20 | Digital channel 6
(APN-159 Synchro RA) word count
| | 21 | Digital channel 7
(APN-159 Parallel RA) word count
| | 22 | Digital channel 8
(User ASCII data #1) word count
| | 23 | Digital channel 9
(User ASCII data #2)word count
| | 24 | Digital channel10
(User ASCII data #3)word count
| | 25-104 | Analog channel 0-79 word counts (from ADC)
| | 105 | First data word (typically from INE #1)
| | : | :
| | : | :
| | n-1 | Last data word
(where record word 2 specifies n)
| | n | Checksum for record
| |
Table 2
INE Data Format
|
|
Word 1:
|
Altitude (Computed Pressure Altitude)
33322222222221111111111
21098765432109876543210987654321
SSSSSS*****data*********0001000E
MS bit (Sign) = -3276800 ft (32 * -102400 ft)
LS data bit = .391 ft
|
| Word 2:
|
Latitude
33322222222221111111111
21098765432109876543210987654321
SSS********data*********0010G00E
MS bit (Sign) = -(4*PI) radians
LS data bit = 1.498E-06 radians (‘60 meters)
|
| Word 3:
|
Longitude
33322222222221111111111
21098765432109876543210987654321
SSS********data*********0011G00E
MS bit (Sign) = -(4*PI) radians
LS data bit = 1.498E-06 radians
|
| Word 4:
|
North Velocity
33322222222221111111111
21098765432109876543210987654321
SS*********data*********0100G00E
MS bit (Sign) = -3276.8 knots (2 * -1638.4 knots)
LS data bit = 3.906E-04 knots (‘ .721 meters/hr)
|
| Word 5:
|
East Velocity
33322222222221111111111
21098765432109876543210987654321
SS*********data*********0101G00E
MS bit (Sign) = -3276.8 knots (2 * -1638.4 knots)
LS data bit = 3.906E-04 knots
|
| Word 6:
|
Vertical Speed
33322222222221111111111
21098765432109876543210987654321
SS*********data*********0110000E
MS bit (Sign) = -4096 ft/sec (2 * -2048 ft/sec)
LS data bit = 4.883E-04 ft/sec
|
| Word 7:
|
Drift Angle
33322222222221111111111
21098765432109876543210987654321
SSS********data*********0111000E
MS bit (Sign) = -(4*PI) radians
LS data bit = 1.498E-06 radians
|
| Word 8:
|
Heading
33322222222221111111111
21098765432109876543210987654321
SSS********data*********1000G00E
MS bit (Sign) = -(4*PI) radians
LS data bit = 1.498E-06 radians
|
| Word 9:
|
Pitch Angle
33322222222221111111111
21098765432109876543210987654321
SSS********data*********1001000E
MS bit (Sign) = -(4*PI) radians
LS data bit = 1.498E-06 radians
|
| Word 10:
|
Roll Angle
33322222222221111111111
21098765432109876543210987654321
SSS********data*********1010000E
MS bit (Sign) = -(4*PI) radians
LS data bit = 1.498E-06 radians
|
All data is in 2's complement binary fractional notation
S - Sign bit (1 = negative)
G - Pole Reference (1 = Geodetic, 0 = Alternate
E - Error bit (1 = error in this word)
PI - π = 3.14159...
Table 3
APN-232 Radar Altimeter Data Format
|
| Bit
| Description
| 32 (MSB) | Odd Parity
| | 31 | Negative Altitude
| | 30 | 32,768 ft
| | 29 | 16,384 ft.
| | 28 | 8,192 ft.
| | 27 | 4,096 ft.
| | 26 | 2,048 ft.
| | 25 | 1,024 ft.
| | 24 | 512 ft.
| | 23 | 256 ft.
| | 22 | 128 ft.
| | 21 | 64 ft.
| | 20 | 32 ft.
| | 19 | 16 ft.
| | 18 | 8 ft.
| | 17 | 4 ft.
| | 16 | 2 ft.
| | 15 | 1 ft.
| | 14 | _ ft.
| | 13 | Warning Monitor
| | 12 | 500 ft. Test in Progress
| | 11 | Search or Blanking
| | 10 | RT Fail
| | 9-1 (LSB) | Spare - set to 0
| |
FORTRAN code
Listing 1
Data Block Location
C*********************************************************** C
C Return a pointer and word count to a desired data
C block within a fast tape record.
C
C Calling Sequence: Call FT_Ptr(IB,ID_Num,IPtr,ICount)
C
C IB is the data buffer array for one sec. of fast data.
C ID_Num is the desired block: 1 - Digital chan 1
C 11 - ADC Chan 0
C 12 - ADC Chan 1, etc.
C IPtr is the returned pointer to the start of the
C requested block in IB
C ICount is the number of 16 bit words in the requested
C block.
C
C A sample code fragment using FT_Ptr to get ADC chan 2 data
C would look like this:
C
C ID_Num = 13 ! select ADC Chan 2
C CALL FT_Ptr(IB,ID_Num,IPtr,ICount) ! get ptr & count
C IF (ICount.LE.0) THEN ! no data
C :
C ELSE ! data available
C DO i = 1,ICount ! loop through
CC IPtr points to 1st value, so calc i-1 for correct offset
C volts = Float(IB(IPtr+i-1)) * .00305
C : ! process voltage sample
C END DO
C ENDIF
C
C**********************************************************
SUBROUTINE FT_Ptr(IB,ID_Num,IPtr,ICount)
INTEGER*2 IB(*),ID_Num,IPtr,ICount ! IB dimensioned in main
INTEGER*2 i,j
j = 105 ! point to start of data section
IF (ID_Num.GT.1) THEN ! don't do calc for INE 1
DO i = 15,ID_Num+13 ! ID_Num=2 does 1 iter, etc.
j = j + IB(i) ! add another block's count
END DO
ENDIF
IPtr = j ! done w/ calc, pass on to caller
ICount = IB(ID_Num+14) ! ID_Num=1 gets word 15, etc.
RETURN
END
Listing 2
INE Data Block Conversion
C**********************************************************
C
C Convert INE Data to useable flaoting point values.
C
C Calling sequence: CALL CVINE(InINE,OutINE,IStat)
C
C InINE is an array of 10 double integers
C containing the raw burst from tape record
C OutINE is a 10 word real array with the resulting
C converted nav. values
C IStat is a returned status array:
C 0- no error in this parameter, 1- some error
C
C**********************************************************
SUBROUTINE CVINE(InINE,OutINE,IStat)
INTEGER*2 IStat(10),i,id_tag
INTEGER*4 InINE(10)
REAL OutINE(10),Pi_x_4,BigNumber
PARAMETER (Pi_x_4=12.5663706144)
PARAMETER (BigNumber=2.**31)
DO i = 1,10
OutINE(i) = 0. ! in case of error, return a 0
IF ( (IAnd(InINE(i),360b)/16.NE.i-1) ! tag error
& .OR.(IAnd(InINE(i),1).NE.0)) THEN ! parity error
IStat(i) = 1
ELSE ! good starting parameter
GOTO (100,200,200,300,300,400,200,200,200,200),i
C
C Several parameters have the same scaling; handle them in the
C same subsection.
C
C -102400*32 ft scaling - for Press Alt
C
100 OutINE(i) = Float(IAnd(InINE(i),37777777400b))
& * 3276800./BigNumber
GOTO 500
C
C -PI*4 Scaling - for Lat,Long,Hdg,Drft Ang,Pitch,Roll
C
200 OutINE(i)=Float(IAnd(InINE(i),37777777400b))
& * Pi_x_4/BigNumber
GOTO 500
C
C -1638.4*2 knots - for N. Vel, E. Vel
C
300 OutINE(i)=Float(IAnd(InINE(i),37777777400b))
& * 3276.8/BigNumber
GOTO 500
C
C -2048*2 ft/sec - for Vert. Speed
C
400 OutINE(i)=Float(IAnd(InINE(i),37777777400b))
& * 4096./BigNumber
500 CONTINUE
ENDIF
END DO
RETURN
END
Listing 3
APN-232 Data Conversion
C**********************************************************
C
C Convert APN-232 Fast Data
C
C Calling Sequence: CALL RA2F(I_Dbl_Raw,RA,Stat)
C
C I_Dbl_Raw is the raw double word integer from the fast
C fast tape buffer
C RA is the returned RA in feet - single precision real
C Stat is the status bits, 0 = no error
C
C**********************************************************
SUBROUTINE RA2F(I_Dbl_Raw,RA,Stat)
INTEGER*4 I_Dbl_Raw
REAL RA
INTEGER*2 Stat
C
RA = Float( IAnd(I_Dbl_Raw,17777740000B)/40000B ) * .5
Stat = IAnd(I_Dbl_Raw,36000b)/2000B
RETURN
END
Listing 4
RA Synchro Data Calculation
C***********************************************************
C
C Convert APN-159 Synchro Fast Data
C
C Calling Sequence: Call RA1SF(IRaw,RA)
C
C IRaw is the unconverted synchro data word from the
C the fast tape array - 16 bit integer
C RA is the converted RA in feet - single precision real
C
C***********************************************************
SUBROUTINE RA1SF(IRaw,RA)
INTEGER*2 IRaw
REAL Coarse, RA_Temp, RA, Cab_Len
PARAMETER (Cab_Len=-36.04) ! acft antenna cable length
C
Coarse = FLOAT( IAnd(IRaw,170000B)/10000B )*3125. - 400.
RA_Temp = FLOAT( IAnd(IRaw,007777b) ) * (4000./4096.)
DO WHILE (RA_Temp.LT.Coarse)
RA_Temp = RA_Temp + 4000.
END DO
RA = RA_Temp + Cab_Len
RETURN
END