## Meetparen voor lage weerstand vastleggen en berekenen

Bewaar echte waarden en context in `blank-readings.csv`; vervang `FILL_REAL_ID` door de monsteridentificatie. De drie regels van `demo-readings.csv` zijn verzonnen, geen MTTJ-metingen of acceptatiemonsters. `kelvin_pair_calc.py` berekent weerstand en offset per stroom-/spanningspaar met teken.

Python werkt offline met alleen de standaardbibliotheek, zonder extra pakketten. Het stuurt geen instrument, controleert geen droogcircuit en beslist niet over acceptatie. Bevestig aannames en specificatie apart volgens het artikel.

## De 16 invoerkolommen

Behoud de kolomnamen. Het script rekent met vier meetkolommen en bewaart overige velden als context zonder hun waarden te controleren.

| Kolom | Betekenis en eenheid |
| --- | --- |
| `sample_id` | Identificatie van het monster in deze regel |
| `sample_state` | Toestand tijdens de meting |
| `spec_revision` | Gebruikte specificatierevisie |
| `sense_A_B_drawing_ref` | Referentie van de Sense A/B-tekening |
| `fixture_id` | Identificatie van de testopstelling |
| `method` | Vastgelegde methode; sjablonen gebruiken `four_wire_current_pair` |
| `range` | Instrumentbereik |
| `source_limit_mV` | Vastgelegde bronspanningsgrens in mV |
| `sample_history` | Historie inclusief eerdere mechanische, omgevings- of elektrische tests |
| `i_plus_mA` | Gemeten positieve stroom met teken in mA; groter dan 0 voor berekening |
| `i_minus_mA` | Gemeten negatieve stroom met teken in mA; kleiner dan 0 voor berekening |
| `v_plus_uV` | Gemeten spanning met teken bij `i_plus_mA`, in μV |
| `v_minus_uV` | Gemeten spanning met teken bij `i_minus_mA`, in μV |
| `sampled_plus_at` | Tijd van positieve meting, als tekst bewaard |
| `sampled_minus_at` | Tijd van negatieve meting, als tekst bewaard |
| `note` | Opmerkingen bij de oorspronkelijke regel |

Behoud alle tekens. Nulspanning is een getal; leeg is ontbrekend en blijft leeg. Ontbreekt een van de vier velden, is het leeg of bevat het alleen witruimte, dan wordt geen nul ingevuld. Lege context blijft ook leeg.

## Berekening en vier uitvoerkolommen

Elk volledig geldig paar gebruikt:

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

`E = V+ − I+ R`

De tweede formule haalt offset uit `V = IR + E`. Invoer in μV en mA geeft `R` in mΩ en `E` in μV. Lineaire weerstand en stabiele offset tijdens het paar zijn aannames; een resultaat controleert ze niet. Uitvoer heeft maximaal 12 significante cijfers.

| Uitvoer | Betekenis |
| --- | --- |
| `r_pair_mohm` | Berekende weerstand in mΩ; leeg bij ontbrekend of ongeldig paar |
| `offset_pair_uV` | Berekende offset in μV; leeg bij ontbrekend of ongeldig paar |
| `calculation_status` | Status: `calculated`, `missing` of `invalid` |
| `calculation_note` | Toelichting op status en aannames |

| Status | Wanneer geschreven |
| --- | --- |
| `calculated` | Vier eindige numerieke invoeren, positieve stroom groter dan 0, negatieve kleiner dan 0 en twee eindige resultaten. Letterlijke tekst `Assumes a linear resistor and stable offset. No acceptance judgment.` neemt lineariteit en stabiele offset aan zonder acceptatiebesluit. |
| `missing` | Minstens één ontbrekende of lege meting; beide numerieke uitkomsten leeg. `Missing readings; no zero imputation.` betekent ontbrekende waarden zonder nulinvulling. |
| `invalid` | Niet-numerieke of niet-eindige invoer, verkeerde stroomtekens of niet-eindige uitkomst. Numerieke uitvoer leeg; de tekst noemt de reden. |

Letterlijke foutteksten: `Readings must be numeric.`, `Require finite readings and Iplus>0, Iminus<0.` of `Non-finite calculated output.` Ze eisen getallen, eindige waarden en juiste stroomtekens, of melden niet-eindige uitvoer. Status en tekst beschrijven de berekening, geen productacceptatie.

## De verzonnen voorbeelden lezen

| Regel | 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` |

Drift verandert de aangenomen offset van 10 naar 14 μV en geeft 9.8 mΩ met 12 μV. `calculated` detecteert of verwijdert de drift niet. Het voorbeeld met ongelijke stroomsterkten gebruikt de opgegeven waarden met teken +12 en −8 mA en geeft 10 mΩ. Bij lege metingen blijven beide getallen leeg met status `missing`.

## Offline uitvoeren en invoer bewaren

Bewaar script en CSV lokaal en voer `python kelvin_pair_calc.py demo-readings.csv result.csv` uit. Gebruik voor echte gegevens het ingevulde formulier en een andere uitvoer. Het script weigert invoer en uitvoer die naar hetzelfde pad verwijzen, zodat het origineel behouden blijft.

Uitvoer bewaart invoerkolommen en voegt vier rekenkolommen toe. Bestaande kolommen met die namen worden door nieuwe resultaten vervangen. Het schrijft UTF-8-CSV met bytevolgordemarkering. Ontbrekende waarden blijven leeg, zonder goed-/afkeur.
