## Mencatat dan menghitung pasangan pembacaan resistansi rendah

Simpan bacaan nyata dan konteks di `blank-readings.csv`; ganti `FILL_REAL_ID` dengan ID sampel. Tiga baris `demo-readings.csv` adalah contoh buatan, bukan pengukuran MTTJ atau sampel penerimaan. `kelvin_pair_calc.py` menghitung resistansi dan offset pasangan arus/tegangan bertanda.

Python bekerja offline hanya dengan pustaka standar, tanpa paket tambahan. Tidak mengendalikan instrumen, memvalidasi dry circuit, atau memutuskan penerimaan. Konfirmasi asumsi dan spesifikasi terpisah sesuai artikel.

## 16 kolom masukan

Pertahankan nama. Skrip menghitung dari empat kolom bacaan; lainnya disimpan sebagai konteks tanpa diperiksa nilainya.

| Kolom | Arti dan satuan |
| --- | --- |
| `sample_id` | ID sampel baris |
| `sample_state` | Kondisi saat diukur |
| `spec_revision` | Revisi spesifikasi digunakan |
| `sense_A_B_drawing_ref` | Referensi diagram Sense A/B |
| `fixture_id` | ID jig |
| `method` | Metode dicatat; templat memakai `four_wire_current_pair` |
| `range` | Rentang instrumen |
| `source_limit_mV` | Batas tegangan sumber tercatat, mV |
| `sample_history` | Riwayat termasuk uji mekanis, lingkungan, atau listrik sebelumnya |
| `i_plus_mA` | Arus positif terukur bertanda dalam mA; lebih dari 0 untuk hitungan |
| `i_minus_mA` | Arus negatif terukur bertanda dalam mA; kurang dari 0 untuk hitungan |
| `v_plus_uV` | Tegangan sensing bertanda pasangan `i_plus_mA`, μV |
| `v_minus_uV` | Tegangan sensing bertanda pasangan `i_minus_mA`, μV |
| `sampled_plus_at` | Waktu bacaan positif, tetap sebagai teks |
| `sampled_minus_at` | Waktu bacaan negatif, tetap sebagai teks |
| `note` | Catatan bersama baris asli |

Pertahankan tanda. Tegangan nol adalah angka, kosong berarti hilang dan tetap kosong. Kolom tidak ada, kosong atau hanya spasi pada salah satu dari empat bacaan tidak diganti nol. Konteks kosong juga tetap kosong.

## Hitungan dan empat keluaran

Setiap pasangan lengkap valid memakai:

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

`E = V+ − I+ R`

Rumus kedua mengambil offset dari `V = IR + E`. μV dan mA memberi `R` mΩ, `E` μV. Diasumsikan linier dan offset stabil selama pasangan; hasil tidak membuktikan asumsi. Maksimal 12 digit signifikan.

| Keluaran | Arti |
| --- | --- |
| `r_pair_mohm` | Resistansi mΩ; kosong jika hilang atau invalid |
| `offset_pair_uV` | Offset μV; kosong jika hilang atau invalid |
| `calculation_status` | Status `calculated`, `missing` atau `invalid` |
| `calculation_note` | Penjelasan status dan asumsi |

| Status | Kapan ditulis |
| --- | --- |
| `calculated` | Empat angka berhingga, arus positif di atas 0, negatif di bawah 0 dan keluaran berhingga. Teks asli `Assumes a linear resistor and stable offset. No acceptance judgment.` mengasumsikan linier dan stabil tanpa keputusan penerimaan. |
| `missing` | Bacaan tidak ada atau kosong; dua keluaran angka kosong. `Missing readings; no zero imputation.` berarti hilang tanpa penggantian nol. |
| `invalid` | Bukan angka atau tidak berhingga atau NaN, tanda salah atau keluaran tidak berhingga atau NaN. Keluaran angka kosong, catatan menyebut sebab. |

Catatan asli: `Readings must be numeric.`, `Require finite readings and Iplus>0, Iminus<0.` atau `Non-finite calculated output.` Meminta angka, berhingga dan tanda yang benar, atau menyebut keluaran tidak berhingga atau NaN. Status menyangkut hitungan, bukan penerimaan.

## Baca contoh buatan

| Baris | 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 mengubah offset asumsi dari 10 ke 14 μV, memberi 9.8 mΩ dan 12 μV. `calculated` tidak mendeteksi atau menghilangkan drift. Contoh arus tidak sama +12 dan −8 mA memberi 10 mΩ. Bacaan kosong mempertahankan dua hasil kosong dan `missing`.

## Jalankan offline dan simpan masukan

Dengan berkas lokal jalankan `python kelvin_pair_calc.py demo-readings.csv result.csv`. Data nyata memakai templat terisi dan keluaran lain. Skrip menolak masukan dan keluaran yang diselesaikan ke jalur sama, melindungi asli.

Kolom masukan dipertahankan, empat hitungan ditambahkan. Jika nama sudah ada, kolom itu diganti hasil baru. Menulis UTF-8 CSV dengan tanda urutan byte. Bacaan hilang tetap kosong, tanpa keputusan lulus/gagal.
