From Friday, April 19th (11:00 PM CDT) through Saturday, April 20th (2:00 PM CDT), 2024, ni.com will undergo system upgrades that may result in temporary service interruption.

We appreciate your patience as we improve our online experience.

Measurement Studio for .NET Languages

cancel
Showing results for 
Search instead for 
Did you mean: 

Corrupted start time in tdms file

Solved!
Go to solution

So I get my data as AnalogWaveformy<double>[] with a regular sample intervall. In this case there shouldnt be any need for timing information for each sample. But the problem ist when I start a measurement and stream the data into a TDMS file, the field "wf_start_time" (in Excel) doesnt show the actual start time. It shows the timestamp from the last samples when I stop the measurement.

If I load the TDMS file into my Programm and get the DateTime[] info from it, the start time is also incorrect. The sampling data is right but every timestamp ist rightTimeStamp+measurementDuraction. There is a offset. If i measure till 6 AM the DateTime[] info starts at 6 AM.

 

The shown time is exact and I could reprocess it to get the real start time. But this doesnt seem like the way to go.

Right now I am setting up my file like this:

public void _setUpTdmsFile(string _path, string[] _channelNames)
{
    int _numberOfChannels = _channelNames.Length;       ///< Anzahl der Kanäle welche in die Datei geschrieben werden sollen.
    // Öffne eventuell vorhandene Datai.
    if (File.Exists(_path))
    {
        TdmsFile.Delete(_path);
    }
    // Erstelle eine neue Datei.
    //_file = new TdmsFile(_path, new TdmsFileOptions(TdmsFileFormat.Version20));
    _file = new TdmsFile(_path, new TdmsFileOptions());
    _file.AutoSave = true;
    // Erstelle ChannelGroup.
    TdmsChannelGroupCollection _channelGroups = _file.GetChannelGroups();
    _channelGroup = new TdmsChannelGroup("Main Group");
    _channelGroups.Add(_channelGroup);
    // Setze Datei Layout.
    TdmsChannelCollection _tdmsChannels = _channelGroup.GetChannels();
    _waveformChannels = new TdmsChannel[_numberOfChannels];
    _channelGroup.WaveformLayout = TdmsWaveformLayout.NoTimeChannel; 
    // Setze Kanäle welche für das Schreiben von Daten benötigt werden.
    for (int i = 0; i < _numberOfChannels; i++)
    {
        string _channelName = _channelNames[i];
        _waveformChannels[i] = new TdmsChannel(_channelName, TdmsDataType.Double);
        _tdmsChannels.Add(_waveformChannels[i]);
    }
}

and append data to it like this:

Snippet

public void _appendTdmsFile(AnalogWaveform<double>[] _waveform)
{
    _channelGroup.AppendAnalogWaveforms<double>(_waveformChannels, _waveform);
}

Snippet

public void _stopStreaming()
{
    _file.Close();
}

Currently my theory is, that the start time field gets overwritten every time I append to the file. Is my code wrong or could this be a bug? I checked the documentian and the forum and cant find anything about this. If needed I would be happy to provide more information.

 

It would also be an option to write just a single time collum but in my understanding this isnt supported right now.

0 Kudos
Message 1 of 2
(2,083 Views)
Solution
Accepted by topic author rizardus

I found a workaround and will post it here in case anyone else encounters this problem. The first time I get an Analogwaveform I get the start time and save it for later use.

Snippet

if (first)
{
    _handler._setStartTime(data[0].Samples[0].TimeStamp);
    first = false;
}

At the end I overwrite the start time property in the TDMS file manually.

Snippet

public void _stopStreaming()
{
    for (int i = 0; i < _waveformChannels.Length; i++)
    {
        _waveformChannels[i].GetProperty("wf_start_time").SetValue<DateTime>(realStartTime);
    }
    _file.Close();
}

 This is probably not the best solution but it works.

0 Kudos
Message 2 of 2
(2,066 Views)