.. highlightlang:: us .. index:: Kanal-Interpolation .. index:: Interpolation .. index:: MDF .. index:: INCA .. index:: NC_Interpolation .. _nc_interpolation: NC_Interpolation ================ .. us.tag NC_Interpolation GERMAN nc.tools New5151 :ref:`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. .. function:: 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) .. us.return **Returnwert** Ist TRUE (1), wenn die Datei erzugt werden konnte oder FALSE (0). .. us.params **Parameter** .. uparam:: ssNCFile *ssNCFile* ist der Name einer NC-Datei die interpoliert werden soll. .. uparam:: ncid *ncid* ist die Zugriffsnummer einer NC-Datei, die von einem erfolgreichen Aufruf der Funktionen :ref:`nc_create` oder :ref:`nc_open` geliefert wurde. .. uparam:: ssNewNCName *ssNewNCName* ist der NC-Dateiname für die Ergebnisdatei. .. uparam:: ssTimeName *ssTimeName*: Ist der Name eines Zeitkanals auf den Interpoliert werden soll. Wird der Parameter *rvTimeDef* angegeben, kann der Zeitkanal frei definiert werden. .. uparam:: 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. .. uparam:: 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. .. us.comment **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: .. code-block:: none - 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: .. code-block:: ini ; 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 .. us.example **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); } } .. us.history **History** .. list-table:: :header-rows: 1 * - Version - Beschreibung * - R2022.4 - String-Kanäle werden interpoliert. * - R2022.4 - Die _nc_enum informationen werden bei der Interpolation beibehalten. * - 5.15.1 - Neu. .. seealso:: :ref:`uberblick-netcdf-dateien`, :ref:`NC_ExportData`, :ref:`dateneditorkanal-interpolation`, :ref:`nc_create`, :ref:`auto_ImportData`, :sub:`id-540769`