7. Überblick UniPlot-Datendateien

Wenn Sie mit UniPlot Daten importieren, z. B. aus Excel- oder INCA-Dateien, werden Sie zunächst in das UniPlot-Datenformat (nc2) konvertiert.

Bis UniPlot R2011 konnten optional netCDF-Dateien erzeugt werden. netCDF ist ein Dateiformat für wissenschaftliche Messdaten, das an der University Corporation for Atmospheric Research entwickelt wurde (siehe Copyright netCDF). Ab UniPlot R2012 werden netCDF-Dateien nicht mehr verwendet.

7.1. Inhalt einer UniPlot-Datendatei

Das folgende Listing enthält eine Ausgabe des Programms ncdump.exe. Das Programm gibt des Inhalt einer nc- oder nc2-Datei als Text-Datei aus. (Mit dem Programm ncgen.exe könnte diese Datei wieder in eine (binäre) nc2-Datei umgewandelt werden.)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
netcdf Test1.xls {
dimensions:
   n = 5 ;
variables:
       float EngSpd(n) ;
             EngSpd:title = "EngSpd" ;
             EngSpd:long_name = "EngSpd [RPM]" ;
             EngSpd:units = "RPM" ;
       float PME(n) ;
             PME:title = "PME" ;
             PME:long_name = "PME [bar]" ;
             PME:units = "bar" ;

// global attributes:
         :Origin = "D:\\uniplot_du\\samples\\Test1.xls" ;
         :Source = "Uniplot Software GmbH (www.uniplot.de)" ;
         :Creator = "UniPlot Excel Converter v3" ;

data:

  EngSpd = 1006.00, 1249.00, 1512.00, 1708.00, 1804.00;
  PME = 8.47, 9.33, 10.64, 11.21, 11.27;
}

7.1.1. Dimensionen

Jeder Kanal hat eine benannte Dimension. Alle Kanäle mit der selben Dimension werden im Dateneditor in einer Tabelle gemeinsam angezeigt.

Hat der Kanal A die Dimension n1 = 10 (10 Punkte) und der Kanal B die Dimension n2 = 10 (ebenfalls 10 Punkte) werden die Kanäle im Dateneditor in zwei verschiedenen Tabellen angezeigt.

Ein Kanal kann auch mehrere Dimension enthalten, diese Eigenschaft wird von UniPlot aber nur bei Stringkanälen verwendet. Dabei ist die erste Dimension die Anzahl der Strings und die zweite Dimension die Länge des längsten Strings. Stringkanäle sind also eine Matrix von Zeichen.

7.1.2. Attribute

Ein Attribut ist ein Key/Value-Paar. Der Key ist ein Name und der Value ist ein Wert mit einem Datentyp und einer Länge.

UniPlot-Datendateien kennen folgende Datentypen für Attribute und Kanäle:

Datentyp Bedeutung
NC_CHAR Ein Byte einer Zeichenkette.
NC_INT8 Eine ganze Zahl mit 8 Bits (1 Byte). (Wertebereich -127 und 128 bzw. 0 bis 255.)
NC_INT16 Eine ganze Zahl mit 16 Bits (2 Bytes).
NC_INT32 Eine ganze Zahl mit 32 Bits (4 Bytes).
NC_FLOAT Eine einfach genaue Gleitkommazahl (4 Bytes).
NC_DOUBLE Eine doppelt genaue Gleitkommazahl (8 Bytes).

Neben dem Datentyp hat der Attribut-Wert eine Länge. Ist der Attribut-Wert eine Zeichenkette, ist die Länge die Anzahl an Bytes. Ist der Attributwert ein Vektor von doppelt genauen Gleitkommazahlen, ist die Länge die Anzahl der Gleitkommazahlen.

Auf Attributwerte kann immer nur als Ganzes zugegriffen werden. Um z. B. ein Zeichen eines Attributwertes zu ändern, wird der ganze Attributwert gelesen, geändert und anschließend komplett wieder gespeichert. Bei Kanälen (siehe unten) können einzelne Zahlen geändert werden, ohne den ganzen Kanal lesen bzw. schreiben zu müssen.

Attribute werden deshalb für kleine Datenmengen verwendet (kleiner als 1.000 Bytes), sie dürfen aber auch einige MB groß sein.

Eine UniPlot-Datendatei kann bis zu 20.000 globale Attribute enthalten. Global heißen die Attribute, weil sie sich auf die ganze Datei beziehen. Die Kanäle enthalten ebenfalls eine Liste von Attributen, den Kanal-Attributen.

Unter Standard-Attribute werden die Attribute beschrieben, die UniPlot verwendet.

7.1.3. Kanäle

Kanäle sind ebenfalls Key/Value-Paare. Der Key ist der Kanalname und der Wert ist ein Vektor mit Zahlen. Die Vektorlänge kann bis zu ca. 2,1 Milliarden Elemente betragen.

time = [0.1, 0.2, 0.3, ..., 2.000.000]

7.2. Kanal Namen

Ab UniPlot 5.14.5 dürfen die Kanalnamen die folgenden Sonderzeichen enthalten: ., -, +, $, #, ~, !, ^, &, %. Damit der Formelinterpreter weiterhin wie gewohnt benutzt werden kann und keine Probleme beim Datenaustausch oder in Automatisierungen entstehen, kann der Kanalname alternativ auch mit Unterstrichen anstatt Sonderzeichen an die Funktion übergeben werden. Beispiel: Die NC-Datei enthält einen Kanal AI50%+m. Die folgenden beiden Aufrufe liefern die selbe varid:

varid = nc_varid(ncid, "AI50%+m");
varid = nc_varid(ncid, "AI50__m");

Wenn die NC-Datei jedoch Kanalnamen enthält, die sich nur durch Sonderzeichen unterscheiden, liefert der Aufruf mit Unterstrichen unter Umständen verschiedene varids zurück. Der Grund dafür ist, dass die Funktion die Suche beim ersten passenden Kanalnamen beendet. Beispiel: Eine NC-Datei enthält die Kanalnamen AI50%+m (varid 0), AI50%-m (varid 1):

Der folgende Aufruf liefert die varid = 1:

varid = nc_varid(ncid, "AI50%-m");

Beim Aufruf mit zwei Unterstrichen liefert die Funktion die varid der Variablen AI50%+m, also die varid = 0:

varid = nc_varid(ncid, "AI50__m");

Um Probleme mit dem Formelinterpreter zu vermeiden, sollten sich alle Kanalname unterscheiden, auch wenn die Sonderzeichen durch Unterstriche ersetzt würden. Falls die NC-Datei mit UniPlot erzeugt worden ist, werden die Variablen die sich nur durch die Sonderzeichen unterscheiden durchnummeriert. Dabei bleibt der erste Kanal unverändert. Alle folgenden Kanäle, die sich nur durch die Sonderzeichen unterscheiden werden beginnend bei 0 durchnummeriert.

7.3. Eigenschaften von UniPlot-Datendateien (nc2)

  • Das nachträgliche Zufügen oder Entfernen von Attributen oder Kanälen ist bei vielen Messdaten-Dateiformaten nicht möglich oder führt zum Kopieren der ganzen Datei. nc2-Dateien können problemlos nachträglich geändert werden.
  • Stabilität: Bei den meisten Messdaten-Dateiformaten werden bei Änderungen die Daten direkt in die Datei geschrieben. Wird eine Reihe von Änderungen an den Daten durchgeführt und eine der Änderungen schlägt fehlt (z. B. wegen Netzwerkstörungen, Stromausfall oder Softwarefehlern), ist die Datei fehlerhaft. Bei nc2-Dateien können die Änderungen wieder rückgängig gemacht werden, weil UniPlot-Datendateien Transaktionen verwenden.
  • Häufig kompaktere Dateien, weil Teile der Datei komprimiert werden.
  • Keine Größenbeschränkung der Dateien auf 2 oder 4 GB, es sind 1 TB große Dateien mit 2,1 Milliarden Punkten pro Kanal möglich.

7.4. Funktionen

  Tools
NC_AddFiles NC_AddFiles erzeugt eine neue NC-Datei durch Verketten von mehreren Dateien wobei die Datenrekords der angegebenen Dateien aneinander gehängt werden. Es werden die Daten der Kanäle verkettet, deren Namen übereinstimmen.
NC_Classify NC_Classify klassiert eine Datei in Gruppen. Für jede Gruppe wird ein Indexkanal erzeugen. Der Indexkanal beginnt mit dem Wert 1. Der Wert ist konstant für eine Gruppe. Die zweite Gruppe hat den Wert 2 usw. Falls die Funktion mit mehr als 2 Parametern aufgerufen wird, wird die Datei in Abhängigkeit vom angegebenen Indexkanal in einzelne Dateien aufgetrennt.
NC_CreateMeanCycleFile NC_CreateMeanCycleFile erzeugt eine NC-Datei mit gemittelten Zyklen. Die zyklischen Daten werden aus einer NC-Datei gelesen. Die nötigen Parameter werden in einem Objekt übergeben.
NC_CreateSampleReduction NC_CreateSampleReduction erzeugt Kanäle mit reduzierter Punktanzahl für die Kanäle, die mehr als 2e6 Punkte enthalten.
NC_DeleteFilteredRecords NC_DeleteFilteredRecords löscht alle gefilterten Records aus der angegebenen NC-Datei.
NC_Edit NC_Edit öffnet ein Dialogfenster in dem eine UniPlot Datendatei (NC-Datei) bearbeitet werden kann.
NC_ExportData NC_ExportData konvertiert netCDF-Dateien (.nc) oder UniPlot-Datendateien (.nc2) in ein anderes Dateiformat.
NC_GetVarAttribs NC_GetVarAttribs liefert die Kanalattributwerte als Textmatrix.
NC_GetVarNames NC_GetVarNames liefert die Namen der Variablen einer netCDF Datei (NC-Datei).
NC_Interpolation NC_Interpolation erzeugt eine NC-Datei mit interpolierten Daten. Mit der Funktion können Dateien, die einen Zeitkanal enthalten, auf einen andere Abtastrate interpoliert werden, oder MDF-Dateien, die Daten mit mehreren unterschiedliche Abtastraten enthalten, können auf eine gemeinsame Abtastrate interpoliert werden.
NC_MapInterpolation NC_MapInterpolation berechnet durch Interpolation aus Kennfeldern zusätzliche Kanäle in einer netCDF Datei (NC-Datei).
NC_MergeFiles NC_MergeFiles erzeugt eine neue NC-Datei aus den Kanälen mehrerer Dateien. Die Kanäle werden der Datei zugefügt.
nc_convert_units nc_convert_units konvertiert die Kanäle einer NC2-Datei in SI-Einheiten oder gebräuchliche Einheiten.
nc_from_obj nc_from_obj erzeugt eine netCDF-Datendatei aus einem speziellen UniScript-Objekt (Struktur).
nc_to_obj nc_to_obj liest eine netCDF-Datendatei oder eine Untermenge einer netCDF-Datendatei in ein UniScript-Objekt (Struktur).
  Öffnen und Schließen
nc_abort nc_abort verwirft alle Änderungen, die seit dem Öffnen der Datei, seit dem letzten nc_sync an der NC-Datei durchgeführt wurden.
nc_close nc_close schließt eine offene NC-Datei.
nc_create nc_create erzeugt eine neue UniPlot-Datendatei oder eine netCDF-Datei.
nc_open nc_open öffnet eine existierende Datendatei zum Lesen oder Schreiben.
nc_sync nc_sync schreibt die gepufferten Daten in die Datei.
  Globale Funktionen
nc_copy nc_copy kopiert die Daten einer offenen NC-Datei in eine neue NC-Datei.
nc_endef nc_endef beendet den Definitions-Modus für eine offene NC-Datei. Die Änderungen werden auf die Festplatte geschrieben. Die Variablen werden mit Füllwerten geschrieben, es sei denn nc_setfill wurde vorher mit dem Argument NC_NOFILL aufgerufen. Die NC-Datei wird dann in den Daten-Modus umgeschaltet, sodass Daten geschrieben oder gelesen werden können.
nc_fatal_error nc_fatal_error liefert den Fehlercode des ersten fatalen Fehlers oder den Wert 0, falls kein fataler Fehler aufgetreten ist.
nc_filename nc_filename erfragt den Dateinamen für eine gegebene ncid.
nc_get_enum_values nc_get_enum_values gibt den Wert des Attributs _nc_enum als zweispaltige Matrix zurück.
nc_get_option nc_get_option erfragt eine Option.
nc_inquire_format nc_inquire_format erfragt das Format einer offenen NC-Datei.
nc_inquire_mode nc_inquire_mode erfragt den Mode einer offenen Datendatei.
nc_inquire_ndims nc_inquire_ndims erfragt die Anzahl der Dimensionen in einer NC-Datei.
nc_inquire_ngatts nc_inquire_ngatts erfragt die Anzahl der globalen Attribute in einer NC-Datei.
nc_inquire_nvars nc_inquire_nvars erfragt die Anzahl der Variablen in einer NC-Datei.
nc_inquire_recdim nc_inquire_recdim erfragt die Identifikations-Nummer der Record-Variablen in einer netCDF-Datei.
nc_last_error nc_last_error liefert bei UniPlot-Datendateien (NC2) den zuletzt aufgetretenen Fehler. Falls bei der letzten nc_-Funktion kein Fehler aufgetreten ist, liefert die Funktion den Wert 0.
nc_redef nc_redef schaltet eine zum Schreiben offene netCDF-Datei in den Definitionsmodus um. Im Definitionsmodus können Dimensionen, Attribute und Variablen hinzugefügt oder umbenannt oder Attribute gelöscht werden.
nc_set_option nc_set_option setzt eine Option.
nc_seterror_options nc_seterror_options legt fest wie sich die netCDF-Funktionen bei einem Fehler verhalten sollen.
nc_setfill nc_setfill legt den Füllmode fest.
nc_str_error nc_str_error liefert einen Fehlermeldungstext.
  Dimensionen
nc_dimdef nc_dimdef fügt einer netCDF-Datei eine neue Dimension hinzu. Die netCDF-Datei muss sich dazu im Definitions-Modus befinden (siehe nc_endef/nc_redef).
nc_dimid nc_dimid gibt die Identifikations-Nummer einer Dimension zurück.
nc_diminq_name nc_diminq_name erfragt den Namen einer Dimension.
nc_diminq_size nc_diminq_size erfragt die Größe einer Dimension (Anzahl der Datenpunkte).
nc_dimredim nc_dimredim ändert die Größe einer Dimension. Die NC2-Datei muss sich dazu im Definitions-Modus befinden (siehe nc_endef/nc_redef).
nc_dimrename nc_dimrename nennt eine Dimension um.
  Variablen
nc_makevalidname nc_makevalidname liefert einen gültigen netCDF Variablennamen für einen gegebenen Namen.
nc_varcopy nc_varcopy kopiert die Daten einer Variablen von einer NC-Datei in eine andere NC-Datei. Die Variable muss in beiden Dateien den gleichen Namen und die gleiche Punktzahl haben.
nc_vardef nc_vardef fügt ein neue Variable in die offene netCDF Datei ein. Die Datei muss sich dazu im Definitions-Modus befinden.
nc_vardelete nc_vardelete löscht eine Variable. Die Datei darf sich dazu nicht im Definitions-Modus befinden.
nc_varget nc_varget liest Daten einer Variablen aus einer netCDF-Datei, die sich dazu im Daten-Modus befinden muss.
nc_varget_missing nc_varget_missing liest Daten einer Variablen aus einer netCDF-Datei. Fehlende Werte werden auf den Wert MISSING_VALUE gesetzt. Die Datei muss sich im Daten-Modus befinden.
nc_varid nc_varid erfragt die Identifikations-Nummer einer netCDF-Variablen, wobei der Variablen-Name vorgegeben wird.
nc_varinq_changed nc_varinq_changed erfragt den change-counter einer netCDF-Variablen. Bei jeder Änderung an einer Variable ändert sich dieser Wert.
nc_varinq_datatype nc_varinq_datatype erfragt den Datentyp einer netCDF-Variablen, wobei die Variable durch eine Identifikations-Nummer vorgegeben ist.
nc_varinq_dimids Die nc_varinq_dimids Funktion gibt einen Vektor von Dimensions-Identifikations-Nummern zurück.
nc_varinq_info nc_varinq_info liefert Informationen zu den Werten eines Kanals (Minimum, Maximum, Monotonie und ob der Kanal fehlende Werte enthält).
nc_varinq_name nc_varinq_name erfragt den Namen einer netCDF-Variablen, wobei die Identifikations-Nummer vorgegeben wird.
nc_varinq_natts nc_varinq_natts erfragt die Anzahl der Attribute einer Variablen.
nc_varput nc_varput schreibt Daten in eine netCDF-Variable in eine geöffnete netCDF-Datei, die sich im Daten-Modus befinden muss.
nc_varput_missing nc_varput_missing schreibt Daten in eine netCDF-Variable in eine geöffnete netCDF-Datei, die sich im Daten-Modus befinden muss. Fehlende Werte müssen den Wert MISSING_VALUE enthalten.
nc_varrename nc_varrename gibt einer netCDF-Variable einen anderen Namen.
nc_varsearch nc_varsearch sucht den Index des größten Wertes in varid, der kleiner oder gleich x ist. Die Werte in varid müssen monoton aufsteigend sortiert sein und dürfen keine Missing-Values enthalten.
  Attribute
nc_attcopy nc_attcopy kopiert ein Attribut in eine andere netCDF-Datei.
nc_attdelete nc_attdelete löscht ein Attribut. Die Datei muss sich dazu im Definitions-Modus befinden.
nc_attget Mit nc_attget können Attributwerte von Variablen erfragt werden.
nc_attinq_datatype nc_attinq_datatype erfragt den Datentyp eines Attributs einer netCDF-Variablen.
nc_attinq_len nc_attinq_len erfragt die Anzahl der Datenpunkte eines Attributs. Falls das Attribute vom Datentyp NC_CHAR ist, liefert die Funktion die Anzahl der Zeichen.
nc_attname nc_attname erfragt den Namen eines Attributs.
nc_attput nc_attput fügt einer Variablen ein Attribut hinzu oder ändert ein vorhandenes Attribut.
nc_attrename nc_attrename nennt ein Attribut um.

7.5. Standard-Attribute

In UniPlot-Datendateien, können neben den Kanälen auch Attribute (Stammdaten) in der Form

AttributName = AttributWert

geschrieben werden.

Es wird dabei zwischen globalen Attributen (Attribute die sich auf die gesamte Datei beziehen) und Kanal-Attributen (Attribute die sich nur auf einen Kanal beziehen) unterschieden.

Bei den Attributnamen wird Groß-/Kleinschreibung unterschieden.

7.5.1. Globale Attribute

Attribut-Name Datentyp Bedeutung
Origin char Name aus der die Datendatei entstanden ist, z. B. „c:/test.xls“.
Source char Ersteller des Import-Filters, z.B. „Uniplot Software GmbH (www.uniplot.com)“
Creator char Name des Import-Filters, dem Namen kann eine Versionsnummer folgen. Z. B. UniPlot Pasy 1.0.
Date char Datum
Time char Zeit
Range int[2]  
_nc_dl_driver, _nc_dl_driverinfo, _nc_dl_source, _nc_dl_loadcount char und int siehe Verzögerter Import.
_nc_hasgroups Zahl Siehe Kanalattribut _nc_group.

7.5.2. Kanal-Attribute

Attribut-Name Datentyp Bedeutung
title char  
long_name char  
units char Physikalische Einheit, z. B. Nm
scale_factor double Der Kanal wird über die Formel x * scale_factor + add_offset transformiert
add_offset double Siehe Attribut scale_factor.
missing_value wie Kanal Der Datentyp des Attributs missing_value ist der Datentyp des Kanals.
Type char Wert ist entweder „Time Channel“ oder „Data Channel“.
datatype char Mögliche Werte: „date“, „time“, „datetime“
C_format char Formatzeichenkette, siehe printf.
__Delete__ int Bedeutet, dass der Kanal zum Löschen markiert ist: Wert 0 oder 1
Description char Beschreibung des Kanals
Comment char Kommentar zum Kanal
_FillValue wie Kanal  
_formula_text char  
_formula_description char  
_formula_comment char  
_formula_onlyif char  
_channel_type char „formula“/“formula_not_registered“
valid_range wie Kanal valid_range ist ein Kanalattribut, das den gültigen Wertebereich angibt. Das Attribut enthält zwei Werte. Der erste Wert definiert die untere gültige Grenze und der zweite Wert die obere gültige Grenze. Liegt ein Wert außerhalb des Bereichs, wird die Zahl im Datenbrowser in rot ausgegeben. Der Datentyp des Attributs sollte mit dem Datentyp des Kanals übereinstimmen.
_nc_enum char Das Attribut kann beliebig viele Wert/Text-Paare enthalten. Die einzelnen Elemente müssen durch Oder-Zeichen getrennt sein. Beispiel: 0|Off|1|On|2|Error. Die Reihenfolge ist Wert|Text|Wert|Text|.... Das Dezimaltrennzeichen ist ein Punkt (.). Siehe nc_get_enum_values. Beim Laden von 2D-Datensätzen über den Datenbrowser werden die Werte des Attributes für die Beschriftung der Y-Achse verwendet. Auch die Funktion auto_LoadDataset lädt die Werte in die y-Achse.
XStart_XDelta double[2] Startwert und Delta, wenn der Kanal als t/y-Kurve geladen wird.
nc_min, nc_max, nc_monotone, nc_has_missings, nc_change_counter double Siehe nc_varinq_info.
_nc_dl_loaded, _nc_dl_loadinfo int siehe Verzögerter Import.
_nc_group char Enthält einen durch Schrägstriche (slash /) getrennten Pfad zur Anzeige der Kanalnamen in einer Baumstruktur, z. B. "Angle Data/Heat Release". Das globale Attribut _nc_hasgroups muss auf 1 gesetzt sein, damit die Gruppen verwendet werden.

7.6. Verzögerter Import

Wenn die Option „Verzögertes Importieren von Datenkanälen“ eingeschaltet ist (siehe Extras=>Weitere Optionen, Gruppe: Datenimport und Datenbrowser), werden nicht alle Kanäle sofort aus der Quelldatei in die nc2-Datei kopiert, sondern die Kanäle werden erst bei Bedarf geladen. Enthält eine Messung z. B. 400 Kanäle, der Anwender ist aber nur an 8 Kanälen interessiert, wird der Import fast 50 mal schneller ausgeführt.

Globale Attribute

_nc_dl_driver = "rs_usdata"
_nc_dl_driverinfo = "TDM"
_nc_dl_source = "d:\\test.tdm"
_nc_dl_loadcount = 0

Kanal-Attribute

_nc_dl_loaded = 0
_nc_dl_loadinfo = "5,2,amp"
context = _XXX_DL_open(ncid, ssSource)
bool = _XXX_DL_load_channel(context, varid, ssInfo)
_XXX_DL_close(context)

Beispiel:

def _TDM_DL_open(ncid, ssSource)
{
    ctx = [.];
    hTDMFile = _DDC_OpenFileEx(ssSource, "", TRUE /* READONLY */);
    if (type(hTDMFile) != "error") {
        ctx.hTDMFile = hTDMFile;
        ctx.ncid = ncid;
        ctx.ssOurce = ssSource;
        return ctx;
    }
    return 0;
}
def _TDM_DL_load_channel(ctx, varid, ssInfo)
{
    sv = strtok(ssInfo, ",");
    iGroup = strtol(sv[1]);
    iChannel = strtol(sv[2]);
    oGroups = _DDC_GetChannelGroups(ctx.hTDMFile);
    oChannels = _DDC_GetChannels(oGroups[iGroup]);
    nBlocksize = 10000;
    nStart = 0;
    nRead = nBlocksize;
    while (nRead >= nBlocksize) {
        rvData = _DDC_GetDataValues(oChannels[iChannel], nStart, nBlocksize);
        if (type(rvData) == "error") {
            return FALSE;
        }
        nRead = len(rvData);
        r = nc_varput(ctx.ncid, varid, nStart, nRead, rvData);
        nStart = nStart + nRead;
    }
    return TRUE;
}
def _TDM_DL_close(ctx)
{
    _DDC_CloseFile(ctx.hTDMFile);
}

7.7. Beispiel

Die folgende Funktion erzeugt eine nc-Datei. Die Daten werden in diesem Beispiel als String-Matrix (smData) übergeben:

def NC_WriteSimpleNCFile(ssFileName, ssNetCDFName, svChanName, svUnits, ...
                        rvDataType, smData, ssCreator)
{
    nCols = nc(smData);
    nRows = nr(smData);
    ncid = nc_create(ssNetCDFName, NC_CLOBBER|0x10000);
    if (ncid == -1) {
        MessageBox(sprintf(_s("Cannot create file %s - Is file already open?"), ..
                              ssNetCDFName), "ICONSTOP");
        return "#IMPORTERROR#";
    }
    dimids = nc_dimdef(ncid, "nRows", nRows);
    // Globale Attribute:
    nc_attput(ncid, -1, "Origin", NC_CHAR, _StandardFileName(ssFileName));
    nc_attput(ncid, -1, "Source", NC_CHAR, "Uniplot Software GmbH");
    nc_attput(ncid, -1, "Creator", NC_CHAR, ssCreator);
    rvRange = [1, nRows];
    nc_attput(ncid, -1, "Range", NC_LONG, rvRange);
    nc_attput(ncid, -1, "Reference", NC_CHAR, "");
    nc_attput(ncid, -1, "Date", NC_CHAR, sum(date()));
    nc_attput(ncid, -1, "Time", NC_CHAR, sum(time()));
    nc_attput(ncid, -1, "Title", NC_CHAR, "");
    nc_attput(ncid, -1, "Comment1", NC_CHAR, "");
    nc_attput(ncid, -1, "Comment2", NC_CHAR, "");
    nc_attput(ncid, -1, "Comment3", NC_CHAR, "");
    for (i in 1:nCols) {
        if (_NC_DATETIME == rvDataType[i]) {
            varid = nc_vardef(ncid, svChanName[i], NC_DOUBLE, dimids);
        } else {
            varid = nc_vardef(ncid, svChanName[i], rvDataType[i], dimids);
        }
        nc_attput(ncid, varid, "title", NC_CHAR, svChanName[i]);
        nc_attput(ncid, varid, "units", NC_CHAR, svUnits[i]);
        nc_attput(ncid, varid, "long_name", NC_CHAR, ..
                    svChanName[i] + "  [" + svUnits[i] + "]");
        nc_attput(ncid, varid, "scale_factor", NC_DOUBLE, 1.0);
        nc_attput(ncid, varid, "add_offset", NC_DOUBLE, 0.0);
        nc_attput(ncid, varid, "Description", NC_CHAR, "");
        nc_attput(ncid, varid, "Comment", NC_CHAR, "");
        nc_attput(ncid, varid, "ChanType", NC_CHAR, "DateTime");
    }
    nc_setfill(ncid, NC_NOFILL);
    nc_endef(ncid);
    for (i in 1:nCols) {
        if (rvDataType[i] == 100) {
            rvData = DT_ParseDateTime(smData[;i]);
        } else {
            rvData = strtod(smData[;i]);
        }
        nc_varput(ncid, i-1, 0, nRows, rvData);
    }
    nc_close(ncid);
    return ssNetCDFName;
}