Contents — find the section you need

Tangki nutrisi CEA — akuntansi untuk pengisian ulang dan pengenceran

Memulihkan volume dan konsentrasi secara bersamaan

Sebuah tangki menampung 90 L pada 80 mg/L komponen yang dilacak. Menambahkan 10 L air bebas komponen memulihkan volume menjadi 100 L tetapi menurunkan konsentrasi menjadi 72 mg/L. Ketinggian yang rendah dan defisit komponen karenanya membutuhkan akuntansi terpisah.

Panduan ini memperluas dasar-dasar zona akar ke operasi diskret. Semua nilai bersifat sintetis; 100 mg/L adalah target aritmetika, bukan rekomendasi tanaman. Kita melacak satu komponen dengan konsentrasi yang diketahui, tanpa menghitung resep pupuk, konsentrasi dari EC, atau dosis asam/basa.

Definisikan batas

Asumsikan satu tangki tercampur sempurna dengan pasokan dan pengembalian loop tanaman dihentikan. Selama setiap operasi tidak ada penyerapan, penguapan, presipitasi, atau reaksi, dan volume cairan bersifat aditif. Tangki yang beroperasi membutuhkan aliran volume dan komponen pasokan dan pengembalian dalam keseimbangannya. Jika batas mencakup seluruh sistem sirkulasi, sirkulasi internal bukan pengisian ulang eksternal.

Untuk volume V [L], konsentrasi C [mg/L], dan massa komponen terlarut M [mg], M=VC. Menambahkan volume V_a pada konsentrasi C_a menghasilkan

V_1=V_0+V_a,\qquad M_1=V_0C_0+V_aC_a,\qquad C_1=\frac{M_1}{V_1}

Gunakan C_a=0 hanya jika air yang ditambahkan tidak mengandung komponen yang dilacak. Panduan manajemen nutrisi OSU menjelaskan analisis air sumber serta perhatian terhadap konsentrasi garam, pH, alkalinitas, dan rasio nutrisi.

Bandingkan tiga penambahan

Mulai dengan 90 L pada 80 mg/L: 7.200 mg. Asumsikan konsentrasi stok 10.000 mg/L untuk komponen ini.

Operasi Volume akhir Massa komponen akhir Konsentrasi akhir
Tambahkan 10 L air bebas komponen 100 L 7.200 mg 72,00 mg/L
Tambahkan sekitar 0,181818 L stok saja Sekitar 90,181818 L Sekitar 9.018,18 mg 100,00 mg/L
Tambahkan 0,28 L stok dan 9,72 L air 100 L 10.000 mg 100,00 mg/L

Stok juga menambah volume. Untuk konsentrasi target C_t, konsentrasi stok C_s, dan volume stok x,

\frac{V_0C_0+xC_s}{V_0+x}=C_t \quad\Rightarrow\quad x=\frac{V_0(C_t-C_0)}{C_s-C_t}

Menaikkan konsentrasi membutuhkan C_s>C_t>C_0. Stok pada konsentrasi target tidak dapat membawa konsentrasi awal yang lebih rendah tepat ke target tersebut dengan penambahan yang terbatas. Solusi negatif menunjukkan bahwa penambahan yang diusulkan tidak dapat memenuhi tujuan.

Jika volume akhir V_f juga ditetapkan dan air pengisi tidak mengandung komponen tersebut,

x=\frac{V_fC_t-V_0C_0}{C_s},\qquad V_{water}=V_f-V_0-x

Kedua penambahan harus nonnegatif dan volume akhir harus muat dalam wadah. Di sini keduanya adalah 0,28 L stok dan 9,72 L air. Menentukan konsentrasi saja memberikan jawaban yang berbeda dari menentukan konsentrasi dan volume sekaligus.

Pengurasan dan pengenceran memiliki efek yang berbeda

Sekarang mulai dengan 100 L pada 120 mg/L: 12.000 mg. Menguras 10 L larutan yang tercampur sempurna menghilangkan 1.200 mg. Sisanya adalah 90 L dan 10.800 mg, masih pada 120 mg/L. Menambahkan 10 L air bebas komponen kemudian menghasilkan 100 L pada 108 mg/L.

Menambahkan 20 L air tanpa menguras justru menghasilkan 120 L pada 100 mg/L. Tangki masih mengandung 12.000 mg, dan membutuhkan lebih banyak kapasitas cadangan.

Kondisi Persamaan Batas
Kuras D L terlebih dahulu, lalu ganti dengan air C_1=C_0(1-D/V_0) Pencampuran sempurna; pengisian bebas komponen
Tambahkan W L air tanpa menguras C_1=V_0C_0/(V_0+W) Volume bertambah
Aliran masuk dan keluar simultan pada volume konstan C(t)=C_{in}+(C_0-C_{in})e^{-Qt/V} Pencampuran sempurna, aliran konstan, tanpa penyerapan atau reaksi

Untuk penggantian simultan 10 L, Qt/V=0.1 dan C_{in}=0 memberikan sekitar 108,58 mg/L. Ini berbeda dari 108 mg/L yang diperoleh dengan menguras terlebih dahulu. Urutan operasi harus dicatat dalam log.

Reproduksi akuntansi dalam Python

Simpan ini sebagai tank_accounting.py dan jalankan python3 tank_accounting.py. Ini hanya menggunakan pustaka standar.

from math import isfinite


def mix(v, c, added_v, added_c):
    values = (v, c, added_v, added_c)
    if not all(isfinite(x) for x in values):
        raise ValueError("finite values required")
    if v <= 0 or min(c, added_v, added_c) < 0:
        raise ValueError("invalid volume or concentration")
    return (v * c + added_v * added_c) / (v + added_v)


v, c, target, stock = 90.0, 80.0, 100.0, 10000.0
x = v * (target - c) / (stock - target)
print(f"water top-up: {mix(v, c, 10, 0):.2f} mg/L")
print(f"stock addition: {x:.6f} L, {mix(v, c, x, stock):.2f} mg/L")
y = (100 * target - v * c) / stock
print(f"fixed final volume: stock {y:.2f} L, water {10-y:.2f} L")
print(f"drain then refill: {mix(90, 120, 10, 0):.2f} mg/L")
print(f"dilute only: {mix(100, 120, 20, 0):.2f} mg/L")

Keluarannya adalah 72,00 mg/L; 0,181818 L dan 100,00 mg/L; 0,28 L dan 9,72 L; 108,00 mg/L; dan 100,00 mg/L. Sebelum bereksperimen dengan konsentrasi stok lain, periksa kondisi keterjangkauan di atas dan pastikan penyebutnya bukan nol.

Dari akuntansi ke kontrol

Panduan uji air irigasi OSU menjelaskan bahwa EC dan TDS tidak mengidentifikasi konsentrasi garam individual. Mengganti C dengan EC tidak dapat menghitung pengisian ulang komponen tertentu. Pupuk campuran mengubah beberapa komponen sekaligus, sehingga memenuhi satu target tidak memulihkan seluruh komposisi.

Sensor juga tidak harus langsung mencapai prediksi pencampuran sempurna. Panduan manajemen nutrisi OSU menganjurkan pengadukan dan membiarkan pembacaan stabil. Berdasarkan perbedaan tersebut, artikel ini mengusulkan titik awal berikut untuk desain kontrol:

  1. Catat waktu awal, volume, lokasi pengambilan sampel, dasar konsentrasi komponen, EC, suhu cairan, dan pH.
  2. Catat komposisi stok, volume penambahan dan pengurasan aktual, serta status sirkulasi. Durasi perintah pompa saja tidak menetapkan aliran aktual.
  3. Tunggu interval pencampuran yang ditetapkan pada peralatan dan pengukuran yang stabil sebelum menilai ulang. Hindari menumpuk perintah tambahan sebagai respons terhadap pembacaan lokal segera setelah injeksi.
  4. Pertahankan kesalahan prediksi. Hentikan penambahan lebih lanjut untuk menyelidiki ketinggian abnormal, ketidaksesuaian aliran, atau pengukuran yang basi. Tetapkan toleransi dan batas dosis pada instalasi aktual.

Ini bukan spesifikasi lengkap sistem dosis. Contoh-contoh yang dikerjakan memvalidasi konsistensi aritmetika volume, massa komponen, dan konsentrasi di bawah asumsi yang dinyatakan. Langkah berikutnya adalah menghubungkan operasi yang diperintahkan dengan pengamatan menggunakan aliran pompa dan respons pencampuran yang terukur.

Pompa dosis CEA — kalibrasi volume dan waktu tunggu pencampuran

Dua pemeriksaan sebelum menyebut suatu penambahan “20 mL”

Panduan akuntansi tangki menghitung penambahan dari keseimbangan air dan komponen. 20 mL yang dihitung belum menentukan waktu jalan pompa. Menyelesaikan injeksi juga tidak berarti pembacaan tangki bersifat representatif.

Panduan ini memisahkan kalibrasi perintah-ke-volume dari pemeriksaan kapan pengukuran pasca-injeksi dapat dinilai ulang. Setiap kumpulan data di bawah ini adalah contoh sintetis orisinal, bukan kinerja terukur suatu perangkat atau tanaman. Kode ini tidak mengoperasikan peralatan atau menghitung resep pupuk.

Jaga kondisi kalibrasi tetap konstan

Panduan injektor pupuk University of Georgia menjelaskan kalibrasi dan perawatan berkala, rentang aliran operasi, dan kondisi tekanan. Rasio injektor proporsional-air berbeda dari mL/detik pompa berperintah-waktu yang dibahas di sini.

Untuk eksperimen pengumpulan, ikuti manual peralatan dan catat kondisi secara konsisten:

Catatan Tujuan
Pompa, pengaturan kecepatan, selang, katup, dan riwayat servis Mengidentifikasi konfigurasi yang dikalibrasi
Cairan, suhu, dan densitas jika digunakan Menjaga uji coba air tetap terpisah dari uji coba larutan stok
Ketinggian isap, elevasi/tekanan pembuangan, dan perpipaan Mempertahankan perbedaan antara pengumpulan dan operasi
Priming, gelembung, dan waktu diam sebelumnya Mengidentifikasi perbedaan saat startup
Awal/akhir perintah, akhir pengumpulan, dan volume yang terkumpul Menentukan apakah tetesan pasca-berhenti disertakan

Memutuskan perpipaan pembuangan untuk pengumpulan dapat mengubah tekanan balik. Pengaturan pengumpulan yang mudah tidak dengan sendirinya menetapkan pengiriman dalam sistem yang terpasang. Jaga pemeriksaan air awal tetap terpisah dari konfirmasi dengan cairan yang dimaksud.

Saat menimbang, konversikan massa bersih yang terkumpul \Delta m [g] menggunakan densitas cairan \rho [g/mL]: V=\Delta m/\rho [mL]. Jangan mengasumsikan setiap cairan memiliki densitas 1 g/mL. Catat resolusi timbangan, status kalibrasi, dan akurasi pewaktuan.

Rata-rata jangka panjang dapat salah merepresentasikan penambahan singkat

Asumsikan tiga uji coba pada setiap durasi, semuanya dimulai dari status yang sama.

Perintah [s] Tiga volume sintetis [mL] Rata-rata [mL]
10 15, 16, 17 16
20 35, 36, 37 36
30 55, 56, 57 56
60 115, 116, 117 116

Rata-rata tersebut mengikuti V(t)=at+b=2t-4 [mL], dengan a dalam mL/s dan b dalam mL. Target 20 mL memberikan (20-b)/a=12 s. Menggunakan kemiringan saja memberikan 10 s dan hanya 16 mL dalam contoh ini.

Menggunakan aliran rata-rata 60 s, 116/60 mL/s, justru memberikan sekitar 10,34 s untuk 20 mL. Persamaan sintetis tersebut memprediksi sekitar 16,69 mL pada durasi itu. “Laju aliran” mana yang digunakan menjadi penting.

Intersep −4 mL adalah koefisien regresi pada rentang yang disampel, bukan bukti penundaan murni dua detik secara fisik. Jangan mengekstrapolasi di luar 10–60 s, terutama ke arah nol. Untuk data terukur, periksa residu dan pertimbangkan model durasi-pendek terpisah jika hubungannya melengkung.

Setiap baris sintetis memiliki simpangan baku sampel sebesar 1 mL. Kesalahan regresi nol pada rata-rata tidak menghilangkan variasi antar-tembakan individual. Tiga pengulangan juga tidak menetapkan variabilitas hari-ke-hari atau bias timbangan. Periksa prediksi terukur menggunakan durasi dan uji coba tambahan yang dikecualikan dari pencocokan.

Pisahkan penyelesaian injeksi dari konfirmasi pencampuran

Panduan manajemen nutrisi OSU menganjurkan pengadukan dan pembacaan yang stabil sebelum penilaian. Menetapkan waktu tunggu membutuhkan deret waktu pasca-injeksi yang terpisah dari kalibrasi volume.

Catat pengukuran yang tersinkronisasi jauh dari titik injeksi maupun di dekatnya. Dokumentasikan volume, aliran sirkulasi, lokasi injeksi dan sensor, suhu, dan penyaringan sensor. Pencampuran, transportasi, dan respons sensor semuanya berkontribusi pada dinamika yang diamati; satu waktu respons yang dicocokkan bukan otomatis merupakan waktu pencampuran murni.

Sebagai ilustrasi, normalisasikan perubahan dari nilai awal y_0 ke nilai akhir yang diketahui y_\infty:

z(t)=\frac{y(t)-y_0}{y_\infty-y_0}=1-e^{-t/\tau}

Waktu nol adalah penyelesaian injeksi. Ini adalah respons pengukuran lokal sintetis, bukan model tangki yang mengekalkan massa. Asumsikan konstanta waktu 40 s dan 80 s pada lokasi A dan B. Respons waktu-kontinu keduanya memasuki pita 5% di sekitar perubahan akhir setelah sekitar 120 s dan 240 s.

Diagram 1 · Use the button to switch views
Data perintah-volume sintetis dan dua respons yang dinormalisasi. Garis putus-putus menandai ambang respons ilustratif 95%.

Atas: tiga volume yang terkumpul per durasi dan garis yang dicocokkan dengan rata-ratanya. Bawah: respons sintetis A dan B. Waktu dalam detik, volume dalam mL, dan respons yang dinormalisasi tidak berdimensi. Tidak ada data terukur yang ditampilkan.

Sekarang terapkan aturan edukatif: dengan sampel setiap 10 s, kedua lokasi harus tetap berada dalam 5% selama 30 s sebelum konfirmasi. B pertama kali memenuhi syarat pada 240 s. Empat sampel pada 240, 250, 260, dan 270 s memberikan konfirmasi pada 270 s. Memeriksa A saja akan memenuhi syarat pada 150 s dan mengabaikan B.

Baik 5% maupun 30 s bukan kriteria penerimaan yang universal. Pilih kriteria menggunakan derau/akurasi pengukuran, deviasi konsentrasi yang dapat diterima, dan interval pengambilan sampel. Estimasikan nilai akhir secara independen, misalnya dari catatan yang cukup panjang, dan periksa juga perbedaan antara nilai akhir masing-masing lokasi. Menormalisasi setiap lokasi secara terpisah dapat menyembunyikan perbedaan konsentrasi spasial yang persisten. Jangan gunakan normalisasi ini ketika perubahan dari awal ke akhir kecil relatif terhadap derau.

Reproduksi perhitungan

Simpan sebagai pump_mixing.py dan jalankan python3 pump_mixing.py. Hanya pustaka standar yang dibutuhkan.

from math import exp
from statistics import mean

# Synthetic data only; time [s], collected volume [mL].
runs = {10: [15, 16, 17], 20: [35, 36, 37],
        30: [55, 56, 57], 60: [115, 116, 117]}
ts = list(runs)
vs = [mean(runs[t]) for t in ts]
tm, vm = mean(ts), mean(vs)
a = sum((t-tm)*(v-vm) for t, v in zip(ts, vs)) / sum((t-tm)**2 for t in ts)
b = vm - a*tm
command = (20-b)/a
if not min(ts) <= command <= max(ts):
    raise ValueError("command outside calibration range")
print(f"fit: V = {a:.2f} t {b:+.2f}; 20 mL command = {command:.2f} s")
print(f"held-out 40 s: predicted {a*40+b:.2f} mL; reference 76.00 mL")

# Two synthetic normalized responses, sampled every 10 s.
# Four consecutive samples span 30 s. No missing samples here.
times = list(range(0, 401, 10))
errors = [max(exp(-t/40), exp(-t/80)) for t in times]
ready = next((times[i] for i in range(3, len(times))
              if all(e <= 0.05 for e in errors[i-3:i+1])), None)
print(f"two-location confirmation = {ready} s")

Keluarannya adalah kemiringan 2,00, intersep −4,00, perintah 12,00 s untuk 20 mL, 76,00 mL pada 40 s, dan konfirmasi pada 270 s. Referensi 40 s yang ditahan itu juga berasal dari persamaan sintetis yang sama, sehingga bukan bukti generalisasi ke peralatan aktual. Mengubah konstanta waktu 80 s menjadi 120 s memberikan konfirmasi pada 390 s. Jika tidak ada jendela yang memenuhi syarat dalam rekaman, kode mengembalikan None.

Hubungkan pemeriksaan dengan izin untuk penambahan berikutnya

Implementasi kontrol membutuhkan lebih dari sekadar pewaktu. Artikel ini mengusulkan tahap terpisah untuk pemeriksaan awal, satu penambahan, waktu tunggu pencampuran/pengukuran, dan penilaian ulang. Perintah di luar rentang, pembacaan yang hilang atau basi, sirkulasi yang berhenti, ketinggian abnormal, atau kegagalan menstabilkan dalam periode pengamatan harus mencegah penambahan lebih lanjut hingga investigasi selesai. Jangan mengisi sampel yang hilang dengan nilai sebelumnya dan menganggapnya sebagai stabilitas yang berkelanjutan.

Pembacaan EC di bawah target setelah menunggu tidak langsung menetapkan defisit komponen tertentu; pertahankan perbedaan antara EC dan komposisi yang dijelaskan dalam dasar-dasar zona akar. Langkah berikutnya adalah menilai prediksi pengiriman dan kriteria waktu tunggu terhadap log terukur sebelum merancang kontrol dosis dengan batas per-penambahan, kumulatif, dan percobaan ulang.

Kontrol dosis CEA — batas, waktu tunggu pengukuran, dan status kegagalan

Pembacaan rendah tidak membenarkan penambahan berulang

Kalibrasi pompa dan waktu tunggu pencampuran memisahkan volume yang dikirim dari waktu saat pengamatan mengendap. Pertanyaan berikutnya adalah apakah penambahan lain saat ini diizinkan. Pembacaan rendah selama pencampuran, sampel lama, atau sirkulasi yang berhenti tidak menetapkan izin tersebut.

Panduan ini mengusulkan desain edukatif dengan status operasi terpisah dan pemeriksaan pada volume, jumlah percobaan, dan pengamatan. Semua nilai dan input bersifat sintetis, bukan batas operasi atau rekomendasi pupuk. Contoh Python ini hanya mereproduksi gerbang otorisasi; kode ini tidak mengoperasikan pompa.

Hitung kandidat, lalu putuskan apakah dapat dieksekusi

Kandidat yang diturunkan dari akuntansi tangki masih membutuhkan pemeriksaan terhadap rentang kalibrasi, status peralatan, dan pengamatan yang dapat menilai operasi sebelumnya.

Panduan injektor UGA menjelaskan kalibrasi dan perawatan berkala. Panduan manajemen nutrisi OSU menganjurkan pengadukan dan pembacaan yang stabil sebelum penilaian. Status dan batas di bawah ini adalah desain yang diusulkan artikel ini, bukan spesifikasi pengontrol yang disediakan oleh salah satu sumber tersebut.

Pisahkan enam status operasi

Status Aktivitas Kondisi transisi
CHECK Validasi pengamatan, kandidat, anggaran tersisa, dan peralatan Catat reservasi sebelum DOSE; menuju DONE jika tujuan sudah tercapai
DOSE Keluarkan satu perintah untuk ID operasi yang unik Konfirmasi penghentian sebelum WAIT; timeout atau ketidaksesuaian aliran menuju FAULT
WAIT Larang penambahan baru dan kumpulkan pengamatan pasca-berhenti Pengamatan yang memenuhi syarat menuju REVIEW; kegagalan mengendap sebelum batas waktu menuju FAULT
REVIEW Nilai ulang pengamatan dan riwayat DONE jika memuaskan, CHECK jika kandidat lain dibenarkan, FAULT untuk inkonsistensi
DONE Jaga keluaran tetap berhenti dan tutup catatan Operasi berikutnya membutuhkan keputusan operasi baru
FAULT Minta penghentian dan larang penambahan lebih lanjut Pemulihan eksplisit setelah memeriksa penyebab, jumlah yang terkirim, dan peralatan

Mengeluarkan perintah berhenti berbeda dari mengonfirmasi bahwa aliran telah berhenti. Nama status perangkat lunak tidak dapat mencegah katup atau pompa yang gagal. Implementasi juga membutuhkan umpan balik keluaran, mekanisme penghentian di sisi peralatan, dan perilaku restart yang terdefinisi.

Jangan membuat FAULT kembali secara otomatis ke CHECK setelah waktu tunggu singkat. Mengulangi operasi tanpa menyelesaikan penyebabnya dapat mengakumulasi penambahan yang tidak diinginkan.

Bebankan anggaran sebelum mengeluarkan perintah

Gunakan batas ilustratif 16–20 mL per penambahan, 50 mL per sesi operasi, dan paling banyak tiga otorisasi. Minimum 16 mL berkaitan dengan kalibrasi sintetis pada artikel sebelumnya pada 10 s. Angka-angka ini bukan pengaturan peralatan.

Untuk volume yang sudah dibebankan B [mL] dan kandidat d [mL], syaratkan

16\le d\le20,\qquad B+d\le50,\qquad n<3

Saat otorisasi, catat B\leftarrow B+d dan n\leftarrow n+1 sebelum melanjutkan ke perintah. Buku besar ini merepresentasikan kapasitas otorisasi yang terpakai, bukan pengiriman terukur. Jika komunikasi gagal segera setelah suatu perintah, jangan mengasumsikan pengiriman nol dan mengembalikan kapasitasnya. Catat pengiriman yang terukur dan yang tidak pasti secara terpisah.

Operasi sintetis Kandidat Total terbebankan setelah keputusan Hasil
Pertama 16 mL 16 mL Izinkan
Kedua, setelah berhenti, pencampuran, dan peninjauan 16 mL 32 mL Izinkan
Ketiga, setelah peninjauan 18 mL 50 mL Izinkan
Keempat 16 mL 50 mL Tolak: batas percobaan

Permintaan 20 mL setelah membebankan 32 mL ditolak karena akan mencapai 52 mL, meskipun masih ada percobaan tersisa. Pertimbangkan kembali pengamatan dan dasar kandidat tersebut, alih-alih secara otomatis memotong dosis ke kapasitas yang tersisa.

Di sini sesi adalah satu urutan koreksi dengan awal dan akhir yang tercatat. Satu iterasi loop, penyegaran halaman, atau penyambungan ulang bukan sesi baru. Sistem operasional membutuhkan kondisi pembaruan anggaran yang eksplisit, seperti jendela waktu yang ditetapkan atau penggantian tangki, serta catatan yang bertahan setelah restart. Contoh ini tidak memiliki persistensi.

Periksa kesegaran secara terpisah dari stabilitas

Waktu penerimaan saja tidak menetapkan kesegaran. Pertimbangkan waktu pengukuran sumber, sinkronisasi jam, dan urutan relatif terhadap operasi. Di sini age_s adalah usia pengukuran yang sudah dikonversi dan hanya diterima antara nol dan lima detik. Usia negatif dari stempel waktu masa depan juga ditolak.

after_stop berarti pengamatan tersebut mengikuti konfirmasi penghentian sebelumnya. Untuk penambahan awal, gunakan pengamatan yang diperoleh setelah memulai pemeriksaan awal saat ini. stable adalah keputusan hulu berdasarkan urutan pengamatan, sebagaimana dibahas dalam panduan sebelumnya. Satu nilai yang tidak berubah tidak menetapkan stabilitas: nilai data yang hilang, sensor yang macet, dan ketidaksesuaian antar-lokasi.

Lima detik adalah asumsi edukatif. Batas yang tidak sesuai dengan interval pengambilan sampel dan penundaan komunikasi dapat menolak pengamatan yang berguna. Sekadar menambah batas tersebut tidak menyelesaikan masalah data yang basi.

Coba gerbang otorisasi dalam Python

Simpan sebagai dosing_gate.py dan jalankan python3 dosing_gate.py. Hanya pustaka standar yang dibutuhkan.

from math import isfinite


def gate(state, dose_ml, charged_ml, attempts, age_s,
         after_stop, stable, circulation, level_ok):
    """Offline authorization check; no hardware commands or persistence."""
    if state != "CHECK":
        return "STATE"
    if not all(isfinite(x) for x in (dose_ml, charged_ml, age_s)):
        return "INVALID"
    if charged_ml < 0 or type(attempts) is not int or attempts < 0:
        return "INVALID"
    if not all(type(x) is bool for x in
               (after_stop, stable, circulation, level_ok)):
        return "INVALID"
    if not circulation or not level_ok:
        return "INTERLOCK"
    if not 0 <= age_s <= 5 or not after_stop:
        return "STALE"
    if not stable:
        return "UNSTABLE"
    if not 16 <= dose_ml <= 20:
        return "DOSE_RANGE"
    if attempts >= 3:
        return "ATTEMPTS"
    if charged_ml + dose_ml > 50:
        return "BUDGET"
    return "ALLOW"


if __name__ == "__main__":
    charged, attempts, state = 0.0, 0, "CHECK"
    for requested in (16, 16, 18, 16):
        result = gate(state, requested, charged, attempts, 1,
                      True, True, True, True)
        if result == "ALLOW":
            # Charge BEFORE a simulated command; never refund uncertainty.
            charged += requested
            attempts += 1
            state = "WAIT"
        print(f"{requested} mL: {result}; charged={charged:.0f} mL")
        # Synthetic successful stop/mixing/reassessment, not a timer.
        state = "CHECK"

Tiga keputusan pertama adalah ALLOW; keempat adalah ATTEMPTS. Total terbebankan adalah 16, 32, 50, dan 50 mL. Mengatur ulang status demonstrasi ke CHECK di akhir setiap iterasi merepresentasikan penghentian, pencampuran, dan penilaian ulang sintetis yang berhasil. Implementasi tidak boleh mengeksekusi transisi tersebut hanya karena pewaktu tetap telah habis.

Fungsi ini adalah gerbang edukatif offline dengan argumen numerik. Fungsi ini tidak mengurai input komunikasi, menghitung dosis, menetapkan stabilitas, memantau aliran aktual, atau mengeksekusi mesin status. Fungsi ini menolak NaN, infinity, volume terbebankan negatif, dan jumlah percobaan yang tidak valid, tetapi bukan API input-eksternal yang lengkap.

Uji batasan penolakan

Input atau situasi Hasil yang diharapkan
Kandidat lain tiba saat WAIT STATE; tidak ada pembebanan anggaran atau perintah tambahan
Usia enam detik atau negatif STALE
Pengamatan mendahului penghentian, atau tidak stabil STALE atau UNSTABLE
Sirkulasi berhenti atau ketinggian abnormal INTERLOCK
Kandidat adalah 15 atau 21 mL DOSE_RANGE
Permintaan 20 mL setelah membebankan 32 mL BUDGET
Kandidat atau volume terbebankan adalah NaN INVALID

Implementasi juga harus menguji bahwa mengirim ulang suatu ID operasi tidak dapat dieksekusi dua kali. Komit perubahan anggaran dan ID operasi secara bersamaan sehingga permintaan yang bersaing tidak dapat sama-sama menghabiskan kapasitas tersisa yang sama. Setelah gangguan, rekonsiliasi perintah yang tersimpan dengan status peralatan aktual sebelum melanjutkan.

Apa yang ditetapkan oleh ini

Contoh ini memeriksa keputusan otorisasi terhadap input dan batasan yang diberikan. Contoh ini tidak menyimpulkan defisit komponen individual dari EC atau jumlah asam dari perbedaan pH. Contoh ini juga tidak memvalidasi pertumbuhan, hasil panen, keselamatan peralatan, atau pelacakan konsentrasi.

Peran akuntansi, kalibrasi pengiriman, penilaian pencampuran, dan otorisasi kini telah terhubung. Validasi dengan log peralatan terukur masih terbuka. Berikutnya adalah jalur air melalui sistem produksi seperti NFT, DWC, dan drip, tempat hubungan antara tangki dan akar berubah.

What to read next

Tinjau perbedaan antara EC, pH, dan massa komponen.Penginderaan dan estimasi citra CEA — penempatan sensor dan area daun terproyeksiContinue the seriesJalur air dan hidraulika bertingkat CEA — NFT, DWC, drip, dan keseimbangan headExplore another aspect of this fieldAkuaponik CEA — batasan kualitas air untuk ikan, mikroba, dan tanaman