The CODAS Data Storage Format
Download printable pdf version
Here is an utility to help you repair WinDaq header for errors like "Illegal header value 8 bytes from the start of the file.", "Illegal header value 12 bytes from the start of the file.", "Illegal header value 16 bytes from the start of the file.", "Illegal header value 28 bytes from the start of the file." or "Illegal header value 44 bytes from the start of the file."
General
Since the WinDaq convert utility can be used to convert other data file formats into the CODAS data storage format, typical WinDaq users will never need to be involved in the level of detail presented here. There are some applications however, that require a good understanding of the format used to store data files to disk:
- If the WinDaq Waveform Browser playback and analysis software package will be bypassed.
- If you wish to examine (using the WINDAQ Waveform Browser) data acquired and stored by a completely different data acquisition system in a format not supported by the Convert Utility. In such an instance it will be necessary to transform the data file to be examined into the CODAS data storage format.
It should be mentioned that the CODAS data storage format is complex and its interpretation and use should be limited to experienced programmers. For non-experienced programmers, the ActiveX control ReadDataqFile may be of more use. Further, since WinDaq is a constantly evolving product, DATAQ Instruments makes no guarantees that the descriptions and functions of the format's various elements will remain as described (note the liberal use of the word "RESERVED" in the description of the data file header). However, it has been DATAQ Instruments' policy to provide backward file compatibility as new features are added that require file format changes. We will use our best efforts to continue this policy in the future. As such, you will note a number of relative references contained in the file header that are designed to enhance the file format's ability to adapt to as yet undefined future WinDaq performance upgrades. To avoid future incompatibilities, these relative variables should not be treated as absolutes in user-generated programs making use of WinDaq-generated files.
Note: Files saved to MMC or SD using one of our stand-alone data loggers (.wdc files) are in a slightly different format than files saved to your PC using WinDaq Acquisition software (.wdq files). To see the differences Click Here.
Data File Architecture
A CODAS-format data file consists of three major elements. These elements are the data file header, the acquired ADC data, and the data file trailer. Each element is diagrammed below along with the decimal byte number (relative to the beginning of the file) corresponding to the section's first element. The header contains 35 elements of various byte sizes describing virtually every data acquisition parameter, as well as various relative references to the ADC data and trailer elements. The headers currently have space for up to 256 channels, depending on MAX Channels.
MAX Channels Table | ||
Version Type | MAX Channels | Bytes used (Header element 5) |
"Standard" version | 29 | 1156 |
"Mutiplexer" versions | 144 OR ((number of channels acquired) +1)* | 36(MAX Channels) + 112 |
*If less than 144 channels are acquired MAX Channels = 144; if 144 or more channels are acquired MAX Channels = (number of channels acquired) + 1 Note: With WinDaq Version 2.63 and later, files are "Multiplexer" files only if any channels above the first 16 are enabled. |
The data element of the file contains actual A-D converter data written during acquisition for each channel that was enabled. The trailer element contains information related to event markers enabled during acquisition, time and date stamping information, and event marker annotation.
The sections that follow will describe each file element in detail.
CODAS Format File Header Elements
The following table describes all 35 elements of the CODAS data storage format file header. All numbers given are in decimal unless otherwise indicated. Note: Elements designated as Type UI or I are 16 bits; Elements designated as Type L or UL are 32 bits.
Element | Byte | Type | Description | Comments | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1 | 0-1 | UI | S/R denom; most significant bit of S/R number; total channels enabled | See "Element 1" section to follow | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2 | 2-3 | UI | Intelligent Oversampling Factor. This is the number by which the burst rate is divided to give the throughput rate. | See "Element 2" section to follow | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
3 | 4 | B | Offset in bytes from BOF to header channel info tables | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
4 | 5 | B | Number of bytes in each channel info entry | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
5 | 6-7 | I | Number of bytes in data file header (see MAX Channels Table). | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
6 | 8-11 | UL | Unpacked Files: Number of ADC data bytes in file excluding header. Packed Files: The number of data bytes the file would have if it were unpacked. To determine the total number of bytes written to the file: 1. Determine the number of data values written to the file for each channel using the following formula (divisions should be done as integer divisions, discarding the remainders): 2. Sum the NumberOfSamplesWrittenToFile for all channels acquired and multiply by 2: This will give the total number of bytes written to the file. Files are packed when Element 27 bit 14 = 1 |
Variable, based on acq file size | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
7 | 12-15 | UL | Total number of event marker, time and date stamp, and event marker comment pointer bytes in trailer | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
8 | 16-17 | UI | Total number of user annotation bytes including 1 null per channel | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
9 | 18-19 | -- | Height of graphics area in pixels | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
10 | 20-21 | -- | Width of graphics area in pixels | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
11 | 22-23 | I | Cursor position relative to screen center: far left = (element 10)/2; center = 0; far right = (element 10)2-1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
12 | 24-27 | 4B | Byte #24: Max number of overlapping waveforms per window Byte #25: Max number of horizontally adjacent waveform windows The high order 6 bits specify the spacing between vertical grid lines. Default = 0 = 20 pixels of space. The least significant 2 bits contain 01 - the number of horizontally adjacent windows. Byte #26: Max number of vertically adjacent waveform windows. Byte #27: Reserved |
Bytes 24-26 describe the design of any display format (e.g., display format 1 = 1,1,1; display format 2 = 2,1,1; display format 5 = 1,1,4). | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
13 | 28-35 | D | Time between channel samples: 1/(sample rate throughput / total number of acquired channels) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
14 | 36-39 | L | Time file was opened by acquisition: total number of seconds since Jan. 1, 1970 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
15 | 40-43 | L | Time file trailer was written by acquisition: total number of seconds since Jan. 1, 1970 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
16 | 44-47 | L | Waveform compression factor | Relative to start of data section | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
17 | 48-51 | L | Position of cursor in waveform file | Position at BOF = 0, position at 1 pixel toward EOF = 1, etc. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
18 | 52-55 | L | Position of time marker in waveform file | Position at BOF = 0, position at 1 pixel toward EOF = 1, etc. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
19 | 56-59 | L | Bytes #56 & 57: Number of pretrigger data points Bytes #58 & 59: Number of posttrigger data points |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
20 | 60-61 | I | Position of left limit cursor from screen-center in pixels | Default = -[(element 10)/2] | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
21 | 62-63 | I | Position of right limit cursor from screen-center in pixels | Default = [(element 10)/2]-1 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
22 | 64 | B | Playback state memory: bit 0 = Cursor on/off; bit 1 = waveform values on/off; bit 2 = TBF function on/off; bit 3 = time marker on/off; bit 4 = %EOF on/off: bit 5 = base line mode on/off; bit 6 = scroll lock on/off; bit 7 = event markers on/off. Set bit means function is on. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
23 | 65 | B | Grid, annotation, compression mode: bit 0 = 1 if grid pattern is enabled; bit 1 = 1 if user annotation is enabled; bits 7 & 6 are reserved and must be zero
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
24 | 66 | B | Channel number enabled for adjustments 0 = channel1; -1 = none | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
25 | 67 | B | Scroll, "T" key, "P" key, and "W" key states: bit 6 = 1 if last scroll direction was reverse; bit 7 = 1 if (W)indow-oriented scroll mode is enabled.
For AT-CODAS
For WinDaq(/EX)
bit 7=1 if Options Units/Division is checked, for AT-CODAS 7=1 if Window-oriented scroll mode is enabled. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
26 | 68-99 | B[32] | Array of 32 elements describing the channels assigned to each waveform window. Initialized to 0, 1, 2, ..., 31. If variable waveform assignment "1 = 3" is specified, array changes to 2, 1, 2, 3, 4, ..., 31. 0 = channel 1, 2 = channel 3, etc. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
27 | 100-101 | UI | Bit 15 = 0 display FFT in db; Bit 15 = 1 display FFT in magnitude; Bit 14 = 1 if file is packed (packed files are WinDaq/Pro+ files with at least one channel that has a sample rate divisor other than 1). Bits 12 and 13 define F4 key selection. Bits 10 and 11 define F3 key selection. Bit 9 = 1 if lowest physical channel number is 0 instead of 1. Bit 8 = 1 if Oscilloscope Mode's "Free Run" box is checked. For the Standard version, Bits 7 - 4 are reserved and must be 0. For the Multiplexer versions, Bits 7 - 4 contain the most significant 4 bits of the trigger channel number. Bits 2 and 3 define thermocouple type. Bit 1=1 specifies HiRes file with 16-bit data.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
28 | 102 | UI | Bits 14 and 15 define FFT window. Bit 13 defines FFT type.
Bits 0 thru 12 are the lowest frequency index on the display |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
29 | 104 | B | Bits 0 thru 3 define magnification factor applied to spectrum; Bits 4 thru 7 define the spectrum moving average factor | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
30 | 105 | B | Bits 5 and 6 define the display mode; bit 7 trig sweep slope; Bit 4 = 1/0, erase bar on/off
Bits 0 thru 3 define the trigger channel source |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
31 | 106 | I | MS 14 bits describe the Triggered sweep level Data bit 0 is set to indicate Triggered Mode or data bit 1 is set to indicate Triggered Storage Mode. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
32 | 108 | B | Bits 7 & 6 describe the active XY cursor.
Bits 4 - 0 describe the number of 1/16th XY screen stripes enabled (0 - 16). |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
33 | 109 | B | For AT-CODAS Legacy Versions Bits 0 - 2 with value range of 0 - 7 describe pen width (0 = 1 pixel; 7 = 8 pixels). For DI-400/500/720/730/740/760 Bits 0-3 specify Triggered Mode Hysteresis. The resulting 4-bit value represents a logarithmically spaced trigger and rearm level above and below the specified Trigger Level by 0, 1, 2, 3, 4, 6, 9, 13, 19, 28, 40, 58, 84, 122, 176, 255 least significant bit for a 12-bit A/D converter. Bits 7 - 4 describe remote event and storage states: Bit 4 = 1 if remote events enabled Bit 5 = 1 if remote storage enabled Bit 6 = 1/0 events triggered on -/+ slope Bit 7 = 1/0 storage triggered on -/+ slope |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
34 | 110 to ((value of Header Element 5) - 3) | -- | Channel information (36 bytes per channel - number of channels is MAX Channels) | See Channel Information section | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
35 | (Value of Header Element 5) - 2 | I | Fixed value of 8001H | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Type key: (B) Byte; (D) Double; (I) Integer; (L) Long; (UI) Unsigned Integer; (UL) Unsigned Long |
HEADER ELEMENT 1
Header Element 1 for AT-CODAS Legacy versions only
Element 1 - SAMPLE RATE DENOMINATOR AND TOTAL CHANNELS ACQUIRED STORAGE FORMAT
Header element 1 describes the total number of channels contained in the file along with the sample rate denominator and most significant bit of the sample rate numerator.
Header Element
Byte 1 | Byte 0 | ||||||||||||||
SN16 | SD9 | SD8 | SD7 | SD6 | SD5 | SD4 | SD3 | SD2 | SD1 | SD0 | T4 | T3 | T2 | T1 | T0 |
5-bit hex value (T0-T4) of word 0 | Total number of channels in file |
0 | Reserved |
1 | 1 |
2 | 2 |
3 | 3 |
4 | 4 |
: | : |
1A | 26 |
1B | 27 |
1C | 28 |
1D | 29 |
1E | Reserved |
1F | Reserved |
Header Element 1 for WinDaq
For WinDaq, Header element 1 describes the total number of channels acquired. Byte 1 is fixed. There are 2 versions of header element 1 dependent upon MAX Channels.
Header Element 1 for MAX Channels = 29
Byte 1 | Byte 0 | ||||||||||||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | T4 | T3 | T2 | T1 | T0 |
5-bit hex value (T0-T4) of word 0 | Total number of channels in file |
0 | Reserved |
1 | 1 |
2 | 2 |
3 | 3 |
4 | 4 |
: | : |
1A | 26 |
1B | 27 |
1C | 28 |
1D | 29 |
1E | Reserved |
1F | Reserved |
Header Element 1 for MAX Channels >= 144
Byte 1 | Byte 0 | ||||||||||||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | T7 | T6 | T5 | T4 | T3 | T2 | T1 | T0 |
8-bit hex value (T0-T7) of word 0 | Total number of channels in file |
0 | Reserved |
1 | 1 |
2 | 2 |
3 | 3 |
4 | 4 |
: | : |
FC | 252 |
FD | 253 |
FE | 254 |
FF | Reserved |
HEADER Element 2
Sample Rate Formation (for AT-CODAS Legacy versions only)
Header element 2 describes the sample rate numerator and sample rate formation. The word is formatted as follows:
Header Element 2
SN15 | SN14 | SN13 | SN12 | SN11 | SN10 | SN9 | SN8 | SN7 | SN6 | SN5 | SN4 | SN3 | SN2 | SN1 | SN0 |
For WinDaq Versions 2.85 and later Header element 2 is defined as Number of A/D Readings per sample.
Determining Sample Rate (for AT-CODAS Legacy versions only)
The sample throughput rate at which waveform data was acquired during acquisition is determined by forming a numerator and denominator from the indicated bits of header elements 1 and 2, then dividing. The following formula is used to determine sample rate:
Sample Throughput Rate = SN ÷ SD
Where: | Sample Throughput Rate is the aggregate sample rate in samples per second. To determine the sample rate on a per channel basis, divide Sample Rate Throughput by the number of channels acquired (Header Element 1 provides that information). SN is a 17-bit integer value composed of Element 2 and the most significant bit (SN16) of Element 1. SD is a 10-bit integer value as defined in Element 1 above. |
Use this method to determine sample rate only on files for which WWB displays the "Convert Output Open" dialog, where the file must be opened using format "0) CODAS old header file" and which the user has not converted by using File Save or clicking "Save All." Otherwise, use the method described below (Total Number of Acquired Channels ÷ Element 13).
Determining Sample Rate for WinDaq Files
Total Number of Acquired Channels ÷ Element 13
The Total Number of Acquired Channels is determined in Element 1. Element 13 (as defined above) = 1/(sample throughput rate/total number of acquired channels).
WAVEFORM CHANNEL INFORMATION (ELEMENT 34 OF DATA FILE HEADER)
Data file element 34 consists of as many as 256 structures (one structure for each waveform channel - the number of waveform channels is equal to MAX Channels) of 36 bytes each. Note that the number of bytes contained in each structure (currently 36) is subject to change in the future. Refer to relative header element 4 which contains a byte value equal to the number of bytes contained in each channel information structure. The architecture of each channel information structure is as follows:
Item | Bytes | Type | Description | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1 | 4 | F | Scaling Slope (m) applied to the waveform to scale it within the display window. Allows waveforms to be scaled within user definable upper and lower window-edge limits. Item 1 should be at least 0.25 to prevent shrinking the dynamic range too small, and no greater than (32767 - (Element9-1))/(Element9-1) to prevent overflow of the fixed-point multiplications used to scale data for plotting. Negating Item 1 is equivalent to checking Scaling > Invert in WinDaq. Setting Item 1 to 1.0 and Item 2 to 0.0 is equivalent to using Scaling > Show Dynamic Range in WinDaq. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2 | 4 | F | Scaling intercept value (b) to Item 1. Item 2 must be kept in the range of -0.5 to +0.5 to display the center of th A/D converter range anywhere between the bottom and top of the waveform strip. Setting Item 1 to 1.0 and Item 2 to 0.0 is equivalent to using Scaling > Show Dynamic Range in WinDaq. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
3 | 8 | D | Calibration scaling factor (m) for waveform value display | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
4 | 8 | D | Calibration Intercept factor (b) for waveform value display | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
5 | 6 | B | Engineering units tag for calibrated waveform* | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
6 | 1 | B | Reserved | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
7 | 1 | B | Unpacked files: Reserved Packed files: Sample rate divisor for the channel Files are packed when Element 27 bit 14 = 1 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
8 | 1 | B | 6 bits (Standard version) or 8 bits (Multiplexer versions) used to describe the physical channel number referred to the input (check element 27, bit 9 for channel number starting point). A value of 0 represents a calculated channel (one that was not actually acquired but rather generated by Advanced CODAS). Bit 6 = 1 indicated a differential channel configuration. Following are some example byte values and their associated physical channel numbers: 41H - Channel 1 differential channel pair (physical channels 1 & 9) 01 - Single-ended channel 1 44H - Channel 4 differential channel pair (physical channels 4 & 12) 10H - Single-ended channel 16 46H - Channel 6 differential channel pair (physical channels 6 & 14) 09 - Single-ended channel 9 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
9 | 1 | B | Specifies Gain, mV Full Scale, and Unipolar/Bipolar Low order 4 bits specify gain where 0 - 15 represent the following values:
High order 4 bits specify the full scale value in millivolts where 0 - 7 represent the following values:
7 causes WinDaq to display the dynamic range as ±100% Full Scale. Adding 8 designates the signal as unipolar with 0V at the bottom of Full Scale and Baseline as half of Full Scale. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
10 | 2 | UI | For AT-CODAS: DAC offset for High Performance Signal. For WinDaq(/EX): The least-significant 5 bits are reserved and must be zero. Bits are assigned as follows: Bit 15 is set for thermocouple channels Bit 14 is set to enable Scaling Digital Plot on a digital channel (Standard version) or is set for differential channels (Multiplexer versions) Bit 13 is set for digital input channels Bit 12 is set for nonlinear, non-thermocouple channels Bit 11 is set for last point to disable averaging Bits 10-8 define the acquisition method:
Bits 7-5 specify thermocouple type (if bits 12 and 15 are both set):
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Type Key: (B) - Byte; (D) - Double precision floating point; (F) - Single precision floating point; (UI) - Unsigned integer |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* Although six bytes (characters) are reserved, only four are used for an engineering unit tag. In addition, the fifth character must always be a null character (00). Some examples may help:
|
ADC DATA FORMAT
Each data value written to a CODAS data file consists of a 16-bit word. Data bits D0 and D1 are applied as follows:
D1 | D0 | Comments |
0 | 0 | The default state of all channels except lowest-numbered acquired channel |
0 | 1 | The default state of lowest-numbered acquired channel** |
1 | 0 | Displays a negative-going marker on any channel's waveform* |
1 | 1 | Displays a positive-going marker on any channel's waveform* |
* These markers will be displayed through WinDaq only if the event marker display function is enabled. Refer to the SEARCH-FOR-EVENT function in the WinDaq Waveform Browser software manual. |
Data samples are written to the file in order of lowest to highest channel number sampled. A differentially connected channel pair assumes the channel number of the lowest channel input number (e.g., the differential channel pair consisting of channels 3 and 11 assumes a channel number of 3).
In packed files (when Element 27 bit 14 = 1), each data value is the average of a number (usually the sample rate divisor) of A/D converter readings. Whenever the number of data samples reaches the sample rate divisor, the average is computed and written to the file. When the file fills or is stopped, the averages for the last set of readings are computed and written to the file whether or not the number of samples is equal to the sample rate divisor.
Data bits D2 through D15 (D15 is the sign) of the data value word represent the two's complement data value of the A/D converter reading. If A/D converter readings are being averaged, the left-justified 14-bit average is stored even if the A/D converter has fewer bits. For HiRes files (bit 1=1 in element 27), bits D0 and D1 are the least significant data bits. Note that any A-D converter count obtained by WinDaq may be converted to an equivalent engineering unit by first arithmetic shifting the 16-bit number to the right by two bits (to preserve the sign), multiplying by the slope m, and adding the intercept b. For HiRes data, replace the right shift with multiplication (times) 0.25.
CODAS DATA FILE TRAILER
(Event marker Pointers, Time and Date Stamps, User Channel Annotation, and Event Marker Comments)
The CODAS data file trailer is divided into three sections: The first (Trailer #1) contains pointers into the ADC DATA section to indicate where an event marker exists in relation to an acquired data point, time and date stamps for event markers, and event marker comment pointers into trailer #3; The second (Trailer #2) contains any user channel annotation that was provided during data acquisition; The third (Trailer #3) contains event marker comments. The first data byte of each CODAS data file section is shown below by making use of relative offsets (Header Elements 5 through 8)obtained from the appropriate locations in the data file header.
File Trailer #1 and #3
There are two ways an event marker can be generated during data acquisition: Automatically upon each initiation of data storage to disk; Manually by pressing the CTRL key and space bar (for an uncommented event marker), by pressing the SHIFT key and space bar (for a commented event marker), or through use of a trigger signal on a digital input port. Only automatically-generated event markers carry a time and date stamp. Times and dates associated with manually-generated event markers are calculated based on the number of samples since the last time and date stamp (given sample rate). Also, an event marker may be commented or uncommented depending upon the keyboard action taken by the user during data acquisition.
Assuming a time and date stamp and comment is associated with each event marker pointer in trailer #1, then the order of appearance in trailer #1 is as follows (each value is a signed long): (1) Event marker pointer; (2) Time and date stamp; (3) Event marker comment pointer. However, an event marker pointer (at least one will always exist) may or may not have an associated time and date stamp, and may or may not have an associated event marker comment pointer. The following test may be applied to determine the existence of a time and date stamp immediately following the event marker pointer:
IF Event Marker Pointer < 0 THEN a Time and Date Stamp DOES NOT exist
or
IF Event Marker Pointer is greater than or equal to 0 THEN a Time and Date Stamp exists
Following this test, a determination must be made related to the next signed long (that following either the event marker pointer or the time and date stamp depending upon the result of the above test). The next long will be either another event marker pointer or an event marker comment pointer. The following test may be applied using header elements 1 and 6 which describe the total number of channels and the total number of ADC data bytes contained in the file respectively:
Equation 1* IF Long > -1 × (Element 6 ÷ (2(number of channels acquired))) THEN the Long is another Event Marker Pointer
or
Equation 2* IF Long is less than or equal to -1 × (Element 6 ÷ (2(number of channels acquired))) THEN the Long is an Event Marker Comment Pointer
Assuming this last long is determined to be an event marker comment pointer, then the next long will be an event marker pointer.
Use of Event Marker Pointers
An event marker pointer describes the offset into the ADC Data section of the CODAS file where the sample associated with the given event marker exists. This offset is calculated as follows relative to the beginning of the data file:
Equation 3* IF Event Marker Pointer < 0 THEN Event Marker Pointer = Event Marker Pointer × -1
OFFSET = (Event Marker Pointer × (2(number of channels acquired))) + Element 5
Event markers enabled during data acquisition are flagged along with the data sample associated with the lowest-numbered acquired channel through use of the two least significant data bits of the waveform data word. Refer to the ADC DATA FORMAT section above.
*For HiRes files, in Equations 1, 2, and 3 above, "(number of channels acquired)" should be omitted from the equation since WinDaq HiRes acquisition does this multiplication already. Advanced CODAS peak detect adds the channel number minus 1 to the product to indicate the channel number for peaks and valleys, and the stored values for the valleys are negated.
Note: An error message may occur due to confusion between HiRes and Standard file formats. The error message typically states: 'File... contains 16-bit data, which this application does not support.' WinDaq uses different file formats: files with the .WDQ extension support 14-bit ADC readings, while files with .WDH or .WHC extensions support 16-bit ADC readings. Do not manually change the file extension. To resolve this issue, ensure that the file extension matches the correct ADC reading format used during data collection.
Use of Time and Date Stamps
A time and date stamp extracted from trailer #1 is applied as follows to yield the actual time and date an event marker occurred relative to the moment the data acquisition file was opened (Header Element No. 14):
Event Marker Occurrence in Time = Time and Date Stamp + Element 14
Note that the time and date resulting from the above equation is in seconds since January 1, 1970. When converted to an actual date and time, the result is in Greenwich Mean Time (GMT). Local time is controlled through use of the time zone (TZ) environment variable which should be automatically accessed by software algorithms designed to convert elapsed seconds since January 1, 1980 into local time (e.g., the Microsoft C compiler function "localtime"). For computers operating in the Pacific time zone and recognizing daylight saving time, TZ is set as follows from AUTOEXEC.BAT:
SET TZ = PST8PDT
Where PST indicates Pacific Standard Time, 8 means 8 hours behind GMT, and PDT indicates the observance of daylight saving time. The default state of TZ is "EST5EDT".
Use of Event Marker Comment Pointers
Event marker comment pointers are used to point to the first character of the event marker comment. The following equation may be used to determine the offset into the data file for any given event marker comment and as a function of relative header offset Elements 5 through 7:
Event Marker Comment Pointer = Event Marker Comment Pointer AND 7FFFFFFFH
OFFSET = Event Marker Comment Pointer + Element 5 + Element 6 + Element 7
Note that each event marker comment is terminated by a null (00) character.
File Trailer #2
CODAS file trailer number 2 contains any user channel annotation entered during data acquisition. Annotation for each acquired channel is terminated with a null (00) character. Also, channel annotation appears in the trailer in sequential order. For example, if 4 channels were acquired with channel annotation provided for channel 4 only, bytes 0 through 2 of the User Annotation section of the file would be null characters. Byte 3 would be the first character of channel 4's annotation.