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.)

 1netcdf Test1.xls {
 2dimensions:
 3   n = 5 ;
 4variables:
 5       float EngSpd(n) ;
 6             EngSpd:title = "EngSpd" ;
 7             EngSpd:long_name = "EngSpd [RPM]" ;
 8             EngSpd:units = "RPM" ;
 9       float PME(n) ;
10             PME:title = "PME" ;
11             PME:long_name = "PME [bar]" ;
12             PME:units = "bar" ;
13
14// global attributes:
15         :Origin = "D:\\uniplot_du\\samples\\Test1.xls" ;
16         :Source = "STS Software and Testing Solutions GmbH (www.uniplot.de)" ;
17         :Creator = "UniPlot Excel Converter v3" ;
18
19data:
20
21  EngSpd = 1006.00, 1249.00, 1512.00, 1708.00, 1804.00;
22  PME = 8.47, 9.33, 10.64, 11.21, 11.27;
23}

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_varput_text

nc_varput_text schreibt Textdaten in eine netCDF-Variable in eine geöffnete netCDF-Datei, die sich im Daten-Modus befinden muss.

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. „STS Software and Testing Solutions 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. Gruppieren von Kanälen (Baumstruktur)

Die Kanäle, die in in einer Gruppe enthalten sein sollen, erhalten das Attribut _nc_group (Datentyp = NC_CHAR), z. B. _nc_group = "Angle Data/Heat Release" oder _nc_group = "G1". Damit die Gruppierung angezeigt wird, muss noch das globale Attribut _nc_hasgroups = 1 (NC_LONG) erzeugt werden:

nc_attput(ncid, -1, "_nc_hasgroups", NC_BYTE, 1);
nc_attput(ncid, varid, "_nc_group", NC_CHAR, "G1");

Damit die Gruppierung im Brower angezeigt wird muss der Benutzer den entsprechenden Schalter im Browser (Baumstruktur) drücken. Die Funktion Browser_ShowTreeStructure() schaltet die Ansicht im Browser ein bzw. aus. Der Return-Wert 1 bedeutet, dass eingeschaltet wurde. Der Zustand wird in der globalen Variablen _g().nc_use_groups gespeichert.

7.7. 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.8. 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);
    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, "STS Software and Testing Solutions 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;
}