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.

bool = NC_Interpolation(ssNCFile, ssNewNCName, ssTimeName)
bool = NC_Interpolation(ssNCFile, ssNewNCName, ssTimeName, svChannelList)
bool = NC_Interpolation(ssNCFile, ssNewNCName, ssTimeName, svChannelList, rvTimeDef)
bool = NC_Interpolation(ncid, ssNewNCName, ssTimeName)
bool = NC_Interpolation(ncid, ssNewNCName, ssTimeName, svChannelList)
bool = NC_Interpolation(ncid, ssNewNCName, ssTimeName, svChannelList, rvTimeDef)

Returnwert

Ist TRUE (1), wenn die Datei erzugt werden konnte oder FALSE (0).

Parameter

ssNCFile

ssNCFile ist der Name einer NC-Datei die interpoliert werden soll.

ncid

ncid ist die Zugriffsnummer einer NC-Datei, die von einem erfolgreichen Aufruf der Funktionen nc_create oder nc_open geliefert wurde.

ssNewNCName

ssNewNCName ist der NC-Dateiname für die Ergebnisdatei.

ssTimeName

ssTimeName: Ist der Name eines Zeitkanals auf den Interpoliert werden soll. Wird der Parameter rvTimeDef angegeben, kann der Zeitkanal frei definiert werden.

svChannelList

svChannelList ist ein Vektor mit Kanalnamen. Falls ein leerer String übergeben wird, werden alle Kanäle interpoliert. Wird der Parameter nicht angegeben, werden alle Kanäle interpoliert.

rvTimeDef

Ist ein Vektor mit einem oder drei Elementen.

Wird nur ein Wert übergeben, ist das der Abtastrate, z. B. 0.1 Sekunde. Der Zeitbereich wird vom Kanal ssTimeName übernommen.

Wird ein Vektor mit drei Elemente übergeben, kann der Startwert, der Endwert und die Abtastrate angeben werden [rsStart, rsEnde, rsDelta].

Beipiel: [0,10,0.1] erzeugt einen Zeitkanl von o bis 10s mit einer Abtastrate von 0.1 s (10 Hz).

Wird der Parameter nicht angegeben, werde die Daten auf den Zeitkanal ssTimeName interpoliert.

Kommentar

Es werden nur Kanäle mit mindestens 2 Punkten interpoliert.

Bei MDF-Dateien müssen die Gerätenamen berücksichtigt werden. Der Gruppenname wird ignoriert.

Es wird keine Extrapolation durchgeführt. Fehlende Daten werden auf missing gesetzt.

Die Daten werden linear interpoliert.

Behandlung von Bit-Kanälen

Sollen bestimmte Kanäle nicht linear interpoliert werden, können die Kanäle mit Ihrem Namen in eine Ini-Datei geschrieben werden. Die Namen müssen gültige Namen sein. In der Ini-Datei kann die Interpolationsart festgelegt werden, siehe Kommentar im folgenden Beispiel. Die Datei muss im Benutzerverzeichnis von UniPlot gespeichert werden. Der Dateiname ist Bit_Channel_Interpolation.ini.

String-Kanäle

String-Kanäle können interpoliert werden und UniPlot verwendet folgende Regel: Der interpolierte Kanal übernimmt den Wert des ursprünglichen Kanals, bis der interpolierte Zeitkanal Kanal gleich oder größer als ein vorhandener Zeitpunkt im ursprünglichen Zeitkanal ist.

Beispiel:

- Originaldatei at 1Hz
Zeit   String-Kanäle
0      A
1      B
2      C

- Interpolierte Datei - 2Hz
Zeit  String-Kanäle
0     A
0.5   A
1     B
1.5   B
2     C

Beispieldatei:

; Used be NC_Interpolation, NC_SycchronizeTime, NC_TimeInterpolation
; Channelname = interpolation type (nType)
; nType == 1: prev
; Previous neighbor interpolation. The interpolated value at a query point is
; the value at the previous sample grid point.

; nType == 2: nearest (default)
; Nearest neighbor interpolation. The interpolated value at a query point is the
; value at the nearest sample grid point.

; nType == 3: next
; Next neighbor interpolation. The interpolated value at a query point is the
; value at the next sample grid point.

[Interpolation]
Bit_Kanal1 = 1
Bit.Channel2 = 2
vKwz1 = 1

Beispiel

def TestInterpolation()
{
   ssDatFile = "u:/nc_daten2/080226_P5736R3_Startversuch.dat"
   ssNCFile = auto_ImportData(ssDatFile);

   ssNewTimeName = "time"
   svChannel = ["AirCtl_dvolIndAir_r32_ETKC_1", "PthSet_trqInrSet_ETKC_1", "AirCtl_mDesVal_ETKC_1"]

   // Erzeuge neuen Namen:
   svPath = SplitPath(ssNCFile);
   ssOutputName = svPath[1] + svPath[2] + svPath[3] + "_interpol" + svPath[4];

   NC_Interpolation(ssNCFile, ssOutputName, ssNewTimeName, svChannel); // Time wie erste Kanal
   //NC_Interpolation (ssNCFile, ssOutputName, ssNewTimeName, svChannel, [0.01]) // Delta 0.1s von Range 1. Kanal
   //NC_Interpolation (ssNCFile, ssOutputName, ssNewTimeName, svChannel, [0,12,0.01]) // Time von 0s bis 12s in 0.01s
}

Das folgende Beispiel liesst MDF Dateien ein und interpoliert die Daten auf den Zeitkanals The following example reads MDF file and interpolates the data to the time of the first channel found in the channel list svSearchName. The data is exported as a Excel XLSX file:

RegisterCommand("File: MDF-Export", "_MDF_To_Excel", "MDF->Excel...", "", "", "MSExcel.BMP");
UserBar_Add("_MDF_To_Excel");

def _MDF_Find_TimeChannel(ncid, svSearch)
{
   nSearch = len(svSearch);
   for (i in 1:nSearch) {
      VaridTime = _NC_get_time_channel_id(ncid, svSearch[i]);
      if (VaridTime != -1) {
         return VaridTime;
      }
   }
   return -1;
}

def _MDF_To_Excel()
{
   // Channelname for interpolation.
   // The time is used from the first found defined channel
   svSearchName = ["Input_2", "time1", "time2"];

   WriteProfileInt("Settings", "MDF_StripDeviceName", 1)
   WriteProfileInt("Settings", "MDF_StripGroupName", 1)

   ssDir = GetProfileString("settings", "last_mdf_to_excel_dir");
   svFiles = GetOpenFileName_Data(ssDir, TRUE, TRUE, FALSE);
   if (svFiles[1] == "") {
      return;
   }
   smPath = SplitPath(svFiles);
   WriteProfileString("settings", "last_mdf_to_excel_dir", smPath[1;1] + smPath[1;2]);

   nFiles = len(svFiles);

   for (i in 1:nFiles) {
      ssNCName = auto_ImportData(svFiles[i]);
      ncid = nc_open(ssNCName, NC_NOWRITE);
      if (ncid == -1) {
         MessageBoxError("Cannot open file: %s", ssNCName);
         continue;
      }
      if (_QV_IsVS100(ncid) == FALSE) {
         nc_close(ncid);
         continue;
      }

      varid = _MDF_Find_TimeChannel(ncid, svSearchName);
      if (varid == -1) {
         // USe first time channel
         dimid = 0;
         nVars  =  nc_inquire_nvars(ncid);
         if (nVars <= 0) {
            nc_close(ncid);
            continue;
         }
         rvVarid = _QV_FindGroupChannelsVS100(ncid, nVars, dimid);
         if (rvVarid[1] == -1) {
            Event_Error(_s("MDF LoadDataset", "Cannot find Time Channel"));
         }
         varid = rvVarid[1];
      }
      ssTimeName = nc_varinq_name(ncid, varid);

      ssNewNCName = sum(smPath[i; 1,2, 3]) + "_tran.nc2";
      ncid2 = NC_TimeInterpolation(ncid, ssNewNCName, ssTimeName);
      nc_close(ncid);
      if (ncid2 == -1) {
         Event_Error("MDF-Export", "Failed to create file");
         continue;
      }
      nc_close(ncid2);

      obj = [.]
      ssType = "XLSX-NOHEADER" // "XLSX";
      // obj.ssOutDir = "d:/";
      obj.ssMissing = "missing";
      // obj.bOverwrite = TRUE;
      // obj.svChannel = ["Lst", "EngPwr", "Speed", "PME"];
      NC_ExportData(ssNewNCName, "XLSX-NOHEADER", obj);
   }
}

History

Version Beschreibung
R2022.4 String-Kanäle werden interpoliert.
R2022.4 Die _nc_enum informationen werden bei der Interpolation beibehalten.
5.15.1 Neu.

id-540769