## Niederohmige Messwertpaare dokumentieren und berechnen

Bewahren Sie tatsächliche Messwerte samt Kontext in `blank-readings.csv` auf und ersetzen Sie `FILL_REAL_ID` durch die Musterkennung. Die drei Zeilen von `demo-readings.csv` sind konstruierte Beispiele, keine MTTJ-Messungen oder Muster für Abnahmeprüfungen. `kelvin_pair_calc.py` berechnet Widerstand und Offset aus jedem vorzeichenbehafteten Strom-/Spannungspaar.

Das Python-Skript arbeitet offline ausschließlich mit der Standardbibliothek; zusätzliche Pakete sind nicht erforderlich. Es steuert kein Instrument, prüft keine Dry-Circuit-Einstellungen und entscheidet nicht über die Produktabnahme. Prüfen Sie Messannahmen und Produktspezifikation separat wie im Artikel beschrieben.

## Die 16 Eingabespalten

Ändern Sie die Spaltennamen nicht. Das Skript nutzt vier Spalten mit vorzeichenbehafteten Messwerten zur Berechnung. Die übrigen Eingabespalten bleiben als Kontext erhalten; deren Werte werden nicht geprüft.

| Spalte | Bedeutung und Einheit |
| --- | --- |
| `sample_id` | Kennung des in der Zeile erfassten Musters |
| `sample_state` | Musterzustand zum Messzeitpunkt |
| `spec_revision` | Verwendeter Revisionsstand der Produktspezifikation |
| `sense_A_B_drawing_ref` | Referenz der Skizze mit den Sense-Punkten A/B |
| `fixture_id` | Kennung der Prüfvorrichtung |
| `method` | Dokumentierte Methode; die Vorlagen verwenden `four_wire_current_pair` |
| `range` | Messbereich des Instruments |
| `source_limit_mV` | Dokumentierte Quellspannungsgrenze in mV |
| `sample_history` | Musterhistorie einschließlich vorheriger mechanischer, Umwelt- oder elektrischer Prüfungen |
| `i_plus_mA` | Tatsächlich gemessener positiver Strom mit Vorzeichen in mA; für die Berechnung größer als 0 |
| `i_minus_mA` | Tatsächlich gemessener negativer Strom mit Vorzeichen in mA; für die Berechnung kleiner als 0 |
| `v_plus_uV` | Zu `i_plus_mA` gehörende erfasste Spannung mit Vorzeichen in μV |
| `v_minus_uV` | Zu `i_minus_mA` gehörende erfasste Spannung mit Vorzeichen in μV |
| `sampled_plus_at` | Abtastzeit des positiven Strommesswerts; als aufgezeichneter Text erhalten |
| `sampled_minus_at` | Abtastzeit des negativen Strommesswerts; als aufgezeichneter Text erhalten |
| `note` | Mit der ursprünglichen Zeile aufbewahrte Anmerkungen |

Bewahren Sie die Vorzeichen beider Ströme und Spannungen. Null ist ein Spannungsmesswert; ein leeres Feld bedeutet fehlende Messung und bleibt leer. Fehlt eine der vier Messwertspalten, ist sie leer oder enthält nur Leerraum, setzt das Skript keine Null ein. Leere Kontextfelder bleiben ebenfalls leer.

## Berechnung und vier Ausgabespalten

Für jedes vollständige, gültige Paar gilt:

`R = (V+ − V−) / (I+ − I−)`

`E = V+ − I+ R`

Die zweite Formel berechnet den Offset aus `V = IR + E`. Eingaben in μV und mA ergeben `R` in mΩ und `E` in μV. Die Rechnung setzt linearen Widerstand und stabilen Offset während des Paars voraus; ein Ergebnis bestätigt diese Annahmen nicht. Zahlen werden mit bis zu 12 signifikanten Stellen ausgegeben.

| Ausgabespalte | Bedeutung |
| --- | --- |
| `r_pair_mohm` | Berechneter Paarwiderstand in mΩ; bei fehlendem oder ungültigem Paar leer |
| `offset_pair_uV` | Berechneter Paaroffset in μV; bei fehlendem oder ungültigem Paar leer |
| `calculation_status` | Rechenstatus: `calculated`, `missing` oder `invalid` |
| `calculation_note` | Erklärung des Status und der Rechenannahmen |

| Statuswert | Ausgabebedingung |
| --- | --- |
| `calculated` | Alle vier Eingaben sind numerisch und endlich, der positive Strom ist größer als 0, der negative kleiner als 0 und beide Ergebnisse sind endlich. Der unveränderte Hinweis lautet `Assumes a linear resistor and stable offset. No acceptance judgment.`: linearer Widerstand und stabiler Offset werden angenommen; keine Abnahmeentscheidung. |
| `missing` | Mindestens ein Messwert fehlt oder ist leer. Beide Zahlenausgaben bleiben leer. `Missing readings; no zero imputation.` bedeutet: fehlende Werte, kein Ersetzen durch Null. |
| `invalid` | Eine Eingabe ist nicht numerisch oder nicht endlich, Stromvorzeichen erfüllen die Bedingungen nicht oder ein Ergebnis ist nicht endlich. Beide Zahlenausgaben bleiben leer; der Hinweis nennt den Grund. |

Bei `invalid` lauten die Originalhinweise `Readings must be numeric.`, `Require finite readings and Iplus>0, Iminus<0.` oder `Non-finite calculated output.` Sie fordern numerische beziehungsweise endliche Werte mit den angegebenen Stromvorzeichen oder melden ein nicht endliches Ergebnis. Status und Hinweise beschreiben die Rechenbehandlung, keine Produktabnahme.

## Die konstruierten Beispiele lesen

| Demozeile | I+ / I− (mA) | V+ / V− (μV) | `r_pair_mohm` (mΩ) | `offset_pair_uV` (μV) | `calculation_status` |
| --- | --- | --- | ---: | ---: | --- |
| `DEMO_STABLE` | +10 / −10 | +110 / −90 | 10 | 10 | `calculated` |
| `DEMO_DRIFT` | +10 / −10 | +110 / −86 | 9.8 | 12 | `calculated` |
| `DEMO_UNEQUAL` | +12 / −8 | +130 / −70 | 10 | 10 | `calculated` |

Im Driftbeispiel ändert sich der angenommene Offset zwischen den Messungen von 10 auf 14 μV. Die Rechnung ergibt 9.8 mΩ und 12 μV Offset. `calculated` erkennt oder beseitigt diese Drift nicht. Das Beispiel mit unterschiedlichen Strombeträgen nutzt +12 und −8 mA und ergibt 10 mΩ. Bleiben die vorzeichenbehafteten Werte in der leeren Vorlage leer, sind beide Zahlenausgaben leer und der Status lautet `missing`.

## Offline rechnen und die Eingabe aufbewahren

Speichern Sie Skript und CSV lokal und führen Sie `python kelvin_pair_calc.py demo-readings.csv result.csv` aus. Für echte Messwerte verwenden Sie die ausgefüllte leere Vorlage und eine separate Ausgabedatei. Das Skript weist Eingabe- und Ausgabepfade zurück, die zum selben Pfad aufgelöst werden, und bewahrt so die Rohdatei.

Die Ausgabe erhält die Eingabespalten und ergänzt vier Rechenspalten. Enthält die Eingabe bereits gleichnamige Ausgabespalten, ersetzt das Skript sie durch die neuen Ergebnisse. Es schreibt UTF-8-CSV mit Byte-Reihenfolge-Markierung. Fehlende Werte bleiben leer; eine Bestanden-/Nicht-bestanden-Entscheidung erfolgt nicht.
