Contents — find the section you need
CEA-Nährstofftanks — Bilanzierung von Auffüllung und Verdünnung
Volumen und Konzentration gemeinsam wiederherstellen
Ein Tank enthält 90 L bei 80 mg/L einer verfolgten Komponente. Die Zugabe von 10 L komponentenfreiem Wasser stellt das Volumen auf 100 L wieder her, senkt aber die Konzentration auf 72 mg/L. Ein niedriger Füllstand und ein Komponentendefizit erfordern daher eine getrennte Bilanzierung.
Dieser Leitfaden erweitert die Grundlagen der Wurzelzone um diskrete Vorgänge. Alle Werte sind synthetisch; 100 mg/L ist ein arithmetisches Ziel, keine Kulturempfehlung. Wir verfolgen eine Komponente bekannter Konzentration, ohne ein Düngerrezept, eine Konzentration aus EC oder Säure-/Basendosen zu berechnen.
Die Grenze definieren
Nehmen Sie einen perfekt durchmischten Tank an, bei dem Kulturkreislauf-Zufuhr und -Rücklauf gestoppt sind. Während jedes Vorgangs gibt es keine Aufnahme, Verdunstung, Ausfällung oder Reaktion, und Flüssigkeitsvolumina sind additiv. Ein Betriebstank benötigt Zufuhr- und Rücklaufvolumen sowie Komponentenflüsse in seiner Bilanz. Umschließt die Grenze das gesamte zirkulierende System, ist interne Zirkulation keine externe Auffüllung.
Für Volumen V [L], Konzentration C [mg/L] und gelöste Komponentenmasse M [mg] gilt M=VC. Die Zugabe von Volumen V_a bei Konzentration C_a ergibt
Verwenden Sie C_a=0 nur, wenn das zugegebene Wasser keine der verfolgten Komponenten enthält. Der Nährstoffmanagement-Leitfaden der OSU beschreibt die Analyse des Quellwassers sowie die Beachtung von Salzkonzentration, pH-Wert, Alkalinität und Nährstoffverhältnissen.
Drei Zugaben vergleichen
Beginnen Sie mit 90 L bei 80 mg/L: 7.200 mg. Nehmen Sie eine Stammlösungskonzentration von 10.000 mg/L für diese Komponente an.
| Vorgang | Endvolumen | Endgültige Komponentenmasse | Endkonzentration |
|---|---|---|---|
| 10 L komponentenfreies Wasser zugeben | 100 L | 7.200 mg | 72,00 mg/L |
| Etwa 0,181818 L nur Stammlösung zugeben | Etwa 90,181818 L | Etwa 9.018,18 mg | 100,00 mg/L |
| 0,28 L Stammlösung und 9,72 L Wasser zugeben | 100 L | 10.000 mg | 100,00 mg/L |
Auch die Stammlösung fügt Volumen hinzu. Für Zielkonzentration C_t, Stammlösungskonzentration C_s und Stammlösungsvolumen x,
Eine Erhöhung der Konzentration erfordert C_s>C_t>C_0. Stammlösung auf Zielkonzentration kann eine niedrigere Anfangskonzentration mit einer endlichen Zugabe nicht exakt auf dieses Ziel bringen. Eine negative Lösung zeigt an, dass die vorgeschlagene Zugabe das Ziel nicht erreichen kann.
Ist auch das Endvolumen V_f vorgegeben und enthält das Zusatzwasser keine der Komponenten,
Beide Zugaben müssen nichtnegativ sein, und das Endvolumen muss in das Gefäß passen. Hier sind dies 0,28 L Stammlösung und 9,72 L Wasser. Die alleinige Angabe der Konzentration ergibt eine andere Antwort als die Angabe von Konzentration und Volumen zusammen.
Ablassen und Verdünnen haben unterschiedliche Effekte
Beginnen Sie nun mit 100 L bei 120 mg/L: 12.000 mg. Das Ablassen von 10 L gut durchmischter Lösung entfernt 1.200 mg. Der Rest sind 90 L und 10.800 mg, weiterhin bei 120 mg/L. Die Zugabe von 10 L komponentenfreiem Wasser ergibt dann 100 L bei 108 mg/L.
Die Zugabe von 20 L Wasser ohne vorheriges Ablassen ergibt stattdessen 120 L bei 100 mg/L. Der Tank enthält weiterhin 12.000 mg und benötigt mehr Reservekapazität.
| Bedingung | Gleichung | Grenze |
|---|---|---|
| Erst D L ablassen, dann mit Wasser ersetzen | C_1=C_0(1-D/V_0) | Perfekte Durchmischung; komponentenfreie Nachfüllung |
| W L Wasser ohne Ablassen zugeben | C_1=V_0C_0/(V_0+W) | Volumen steigt |
| Gleichzeitiger Zu- und Ablauf bei konstantem Volumen | C(t)=C_{in}+(C_0-C_{in})e^{-Qt/V} | Perfekte Durchmischung, konstanter Durchfluss, keine Aufnahme oder Reaktion |
Bei gleichzeitigem Austausch von 10 L ergeben Qt/V=0,1 und C_{in}=0 etwa 108,58 mg/L. Dies unterscheidet sich von den 108 mg/L, die durch vorheriges Ablassen erzielt werden. Die Reihenfolge des Vorgangs gehört ins Protokoll.
Die Bilanzierung in Python reproduzieren
Speichern Sie dies als tank_accounting.py und führen Sie python3 tank_accounting.py aus. Es wird nur die Standardbibliothek verwendet.
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")
Die Ausgaben sind 72,00 mg/L; 0,181818 L und 100,00 mg/L; 0,28 L und 9,72 L; 108,00 mg/L; und 100,00 mg/L. Prüfen Sie vor dem Experimentieren mit einer anderen Stammlösungskonzentration die oben genannten Erreichbarkeitsbedingungen und stellen Sie sicher, dass der Nenner ungleich null ist.
Von der Bilanzierung zur Steuerung
Der Bewässerungswasser-Test-Leitfaden der OSU erklärt, dass EC und TDS einzelne Salzkonzentrationen nicht identifizieren. Das Ersetzen von C durch EC kann die Auffüllung einer bestimmten Komponente nicht berechnen. Ein Mischdünger ändert mehrere Komponenten gleichzeitig, sodass das Erreichen eines Ziels nicht die gesamte Zusammensetzung wiederherstellt.
Ein Sensor muss die perfekt durchmischte Vorhersage auch nicht sofort erreichen. Der Nährstoffmanagement-Leitfaden der OSU fordert Rühren und das Abwarten stabiler Messwerte. Ausgehend von dieser Unterscheidung schlägt dieser Artikel folgenden Ausgangspunkt für den Steuerungsentwurf vor:
- Erfassen Sie Anfangszeit, Volumen, Probenahmeort, Grundlage der Komponentenkonzentration, EC, Flüssigkeitstemperatur und pH-Wert.
- Erfassen Sie Stammlösungszusammensetzung, tatsächliche Zugabe- und Ablassvolumina sowie Zirkulationszustand. Die Dauer des Pumpenbefehls allein belegt keinen tatsächlichen Durchfluss.
- Warten Sie ein auf der Ausrüstung basierendes Durchmischungsintervall und stabile Messwerte ab, bevor Sie neu bewerten. Vermeiden Sie es, unmittelbar nach der Injektion als Reaktion auf einen lokalen Messwert weitere Befehle zu stapeln.
- Bewahren Sie Vorhersagefehler auf. Stoppen Sie weitere Zugaben, um abnormale Werte, Durchflussabweichungen oder veraltete Messwerte zu untersuchen. Legen Sie Toleranzen und Dosisgrenzen an der tatsächlichen Anlage fest.
Dies ist keine vollständige Spezifikation eines Dosiersystems. Die durchgerechneten Beispiele validieren die arithmetische Konsistenz von Volumen, Komponentenmasse und Konzentration unter den genannten Annahmen. Der nächste Schritt besteht darin, befohlene Vorgänge mithilfe von gemessenem Pumpendurchfluss und Durchmischungsreaktion mit Beobachtungen zu verbinden.
CEA-Dosierpumpen — Volumenkalibrierung und Durchmischungswartezeiten
Zwei Prüfungen, bevor man eine Zugabe „20 mL“ nennt
Der Leitfaden zur Tankbilanzierung berechnete Zugaben aus Wasser- und Komponentenbilanzen. Eine berechnete 20 mL legt noch keine Pumpenlaufzeit fest. Der Abschluss der Injektion bedeutet auch nicht, dass ein Tankmesswert repräsentativ ist.
Dieser Leitfaden trennt die Kalibrierung von Befehl zu Volumen von der Prüfung, wann Messwerte nach der Injektion neu bewertet werden können. Jeder Datensatz unten ist ein eigenständiges synthetisches Beispiel, keine gemessene Leistung eines Geräts oder einer Kultur. Der Code betreibt keine Ausrüstung und berechnet kein Düngerrezept.
Kalibrierungsbedingungen konstant halten
Der Leitfaden zu Düngerinjektoren der University of Georgia erklärt regelmäßige Kalibrierung und Wartung, Betriebsdurchflussbereiche und Druckbedingungen. Das Verhältnis eines wasserproportionalen Injektors unterscheidet sich von der mL/s einer hier betrachteten zeitbefohlenen Pumpe.
Befolgen Sie für ein Sammelexperiment das Gerätehandbuch und erfassen Sie Bedingungen einheitlich:
| Aufzeichnung | Zweck |
|---|---|
| Pumpe, Geschwindigkeitseinstellung, Schläuche, Ventile und Wartungshistorie | Die kalibrierte Konfiguration identifizieren |
| Flüssigkeit, Temperatur und Dichte, falls verwendet | Einen Wasserversuch von einem Stammlösungsversuch unterscheiden |
| Saughöhe, Auslasshöhe/-druck und Rohrleitungen | Unterschiede zwischen Sammlung und Betrieb bewahren |
| Vorfüllen, Blasen und vorangehende Leerlaufzeit | Startunterschiede identifizieren |
| Befehlsstart/-stopp, Sammelende und gesammeltes Volumen | Festlegen, ob Nachtropfen nach dem Stopp enthalten ist |
Das Trennen der Auslassrohrleitung zur Sammlung kann den Gegendruck ändern. Ein einfacher Sammelaufbau belegt allein noch keine Förderung im installierten System. Halten Sie vorläufige Wasserprüfungen getrennt von der Bestätigung mit der beabsichtigten Flüssigkeit.
Rechnen Sie beim Wiegen die netto gesammelte Masse \Delta m [g] mit der Flüssigkeitsdichte \rho [g/mL] um: V=\Delta m/\rho [mL]. Nehmen Sie nicht an, dass jede Flüssigkeit eine Dichte von 1 g/mL hat. Erfassen Sie Waagenauflösung, Kalibrierungsstatus und Zeitgenauigkeit.
Ein Langzeitdurchschnitt kann eine kurze Zugabe verfälscht darstellen
Nehmen Sie drei Versuche bei jeder Dauer an, alle beginnend im selben Zustand.
| Befehl [s] | Drei synthetische Volumina [mL] | Mittelwert [mL] |
|---|---|---|
| 10 | 15, 16, 17 | 16 |
| 20 | 35, 36, 37 | 36 |
| 30 | 55, 56, 57 | 56 |
| 60 | 115, 116, 117 | 116 |
Die Mittelwerte folgen V(t)=at+b=2t-4 [mL], mit a in mL/s und b in mL. Ein Ziel von 20 mL ergibt (20-b)/a=12 s. Allein die Steigung zu verwenden ergibt in diesem Beispiel 10 s und nur 16 mL.
Die Verwendung des 60-s-Durchschnittsdurchflusses, 116/60 mL/s, ergibt stattdessen etwa 10,34 s für 20 mL. Die synthetische Gleichung sagt bei dieser Dauer etwa 16,69 mL voraus. Welche „Durchflussrate“ verwendet wird, ist entscheidend.
Der Achsenabschnitt von −4 mL ist ein Regressionskoeffizient über den erfassten Bereich, kein Beweis für eine physikalische Reinverzögerung von zwei Sekunden. Extrapolieren Sie nicht außerhalb von 10–60 s, besonders in Richtung null. Prüfen Sie bei gemessenen Daten Residuen und erwägen Sie ein separates Kurzzeitmodell, falls sich die Beziehung krümmt.
Jede synthetische Zeile hat eine Stichprobenstandardabweichung von 1 mL. Ein Regressionsfehler von null bei den Mittelwerten entfernt nicht die Einzelschuss-Variation. Drei Wiederholungen belegen auch keine Tag-zu-Tag-Variabilität oder Waagenverzerrung. Überprüfen Sie gemessene Vorhersagen mit zusätzlichen, von der Anpassung ausgeschlossenen Dauern und Versuchen.
Injektionsabschluss von Durchmischungsbestätigung trennen
Der Nährstoffmanagement-Leitfaden der OSU fordert Rühren und stabile Messwerte vor der Bewertung. Das Festlegen einer Wartezeit erfordert eine von der Volumenkalibrierung getrennte Zeitreihe nach der Injektion.
Erfassen Sie synchronisierte Messungen sowohl vom Injektionspunkt entfernt als auch in dessen Nähe. Dokumentieren Sie Volumen, Zirkulationsdurchfluss, Injektions- und Sensorstandorte, Temperatur und Sensorfilterung. Durchmischung, Transport und Sensorreaktion tragen alle zur beobachteten Dynamik bei; eine angepasste Reaktionszeit ist nicht automatisch eine reine Durchmischungszeit.
Normalisieren Sie zur Veranschaulichung eine Änderung vom Anfangswert y_0 zu einem bekannten Endwert y_\infty:
Der Zeitpunkt null ist der Injektionsabschluss. Dies ist eine synthetische lokale Messreaktion, kein massenerhaltendes Tankmodell. Nehmen Sie Zeitkonstanten von 40 s und 80 s an den Standorten A und B an. Ihre zeitkontinuierlichen Reaktionen erreichen ein 5-%-Band um die Endänderung nach etwa 120 s bzw. 240 s.
Oben: drei gesammelte Volumina pro Dauer und die an ihre Mittelwerte angepasste Linie. Unten: synthetische Reaktionen A und B. Die Zeit ist in Sekunden, das Volumen in mL, und die normalisierte Reaktion ist dimensionslos. Es werden keine gemessenen Daten gezeigt.
Legen Sie nun eine Lehrregel fest: Mit Proben alle 10 s müssen beide Standorte 30 s lang innerhalb von 5 % bleiben, bevor eine Bestätigung erfolgt. B qualifiziert sich erstmals bei 240 s. Die vier Proben bei 240, 250, 260 und 270 s liefern die Bestätigung bei 270 s. Würde man nur A prüfen, wäre die Qualifikation bereits bei 150 s erreicht und B übersehen worden.
Weder 5 % noch 30 s sind ein universelles Akzeptanzkriterium. Wählen Sie Kriterien anhand von Messrauschen/-genauigkeit, akzeptabler Konzentrationsabweichung und Probenahmeintervall. Schätzen Sie Endwerte unabhängig, zum Beispiel aus ausreichend langen Aufzeichnungen, und prüfen Sie auch Unterschiede zwischen den Endwerten der Standorte. Das separate Normalisieren jedes Standorts kann anhaltende räumliche Konzentrationsunterschiede verbergen. Verwenden Sie diese Normalisierung nicht, wenn die Änderung von Anfangs- zu Endwert im Verhältnis zum Rauschen klein ist.
Die Berechnungen reproduzieren
Speichern Sie als pump_mixing.py und führen Sie python3 pump_mixing.py aus. Es wird nur die Standardbibliothek benötigt.
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")
Die Ausgaben sind Steigung 2,00, Achsenabschnitt −4,00, ein 12,00-s-Befehl für 20 mL, 76,00 mL bei 40 s und Bestätigung bei 270 s. Der zurückgehaltene 40-s-Referenzwert stammt ebenfalls aus derselben synthetischen Gleichung und ist daher kein Beweis für die Übertragbarkeit auf tatsächliche Ausrüstung. Das Ändern der Zeitkonstante von 80 s auf 120 s ergibt eine Bestätigung bei 390 s. Existiert in der Aufzeichnung kein qualifizierendes Fenster, gibt der Code None zurück.
Die Prüfungen mit der Freigabe für eine weitere Zugabe verbinden
Eine Steuerungsimplementierung benötigt mehr als einen Timer. Dieser Artikel schlägt getrennte Phasen für Vorprüfungen, eine Zugabe, Durchmischungs-/Messwartezeit und Neubewertung vor. Befehle außerhalb des Bereichs, fehlende oder veraltete Messwerte, gestoppte Zirkulation, abnormale Füllstände oder das Ausbleiben der Stabilisierung innerhalb des Beobachtungszeitraums sollten weitere Zugaben bis zur Untersuchung verhindern. Füllen Sie fehlende Proben nicht mit dem vorherigen Wert und zählen Sie dies nicht als kontinuierliche Stabilität.
Ein EC-Messwert unterhalb des Ziels nach dem Warten belegt nicht sofort ein bestimmtes Komponentendefizit; bewahren Sie die in den Grundlagen der Wurzelzone erklärte Unterscheidung zwischen EC und Zusammensetzung. Der nächste Schritt besteht darin, Liefervorhersagen und Wartekriterien anhand gemessener Protokolle zu bewerten, bevor eine Dosiersteuerung mit Grenzen pro Zugabe, kumulativ und für Wiederholungsversuche entworfen wird.
CEA-Dosiersteuerung — Grenzen, Messwartezeiten und Fehlerzustände
Ein niedriger Messwert rechtfertigt keine wiederholten Zugaben
Pumpenkalibrierung und Durchmischungswartezeiten trennten das gelieferte Volumen vom Zeitpunkt, an dem sich Beobachtungen stabilisieren. Die nächste Frage ist, ob derzeit eine weitere Zugabe erlaubt ist. Ein niedriger Messwert während der Durchmischung, eine alte Probe oder gestoppte Zirkulation belegen diese Erlaubnis nicht.
Dieser Leitfaden schlägt ein Lehrdesign mit getrennten Betriebszuständen und Prüfungen von Volumen, Versuchsanzahl und Beobachtungen vor. Alle Werte und Eingaben sind synthetisch, keine Betriebsgrenzen oder Düngerempfehlungen. Das Python-Beispiel reproduziert nur ein Freigabetor; es betreibt keine Pumpe.
Einen Kandidaten berechnen, dann entscheiden, ob er ausgeführt werden darf
Ein aus der Tankbilanzierung abgeleiteter Kandidat benötigt weiterhin Prüfungen gegen den Kalibrierungsbereich, den Gerätezustand und Beobachtungen, die den vorherigen Vorgang bewerten können.
Der Injektorleitfaden der UGA erklärt regelmäßige Kalibrierung und Wartung. Der Nährstoffmanagement-Leitfaden der OSU fordert Rühren und stabile Messwerte vor der Bewertung. Die unten genannten Zustände und Grenzen sind das vorgeschlagene Design dieses Artikels, keine von einer der beiden Quellen gelieferte Reglerspezifikation.
Sechs Betriebszustände trennen
| Zustand | Aktivität | Übergangsbedingung |
|---|---|---|
| CHECK | Beobachtungen, Kandidat, verbleibendes Budget und Ausrüstung validieren | Vor DOSE eine Reservierung erfassen; zu DONE, wenn das Ziel bereits erreicht ist |
| DOSE | Einen Befehl für eine eindeutige Vorgangs-ID ausgeben | Stopp vor WAIT bestätigen; Timeout oder Durchflussabweichung führt zu FAULT |
| WAIT | Neue Zugaben untersagen und Beobachtungen nach dem Stopp sammeln | Qualifizierende Beobachtungen führen zu REVIEW; Nichtstabilisierung bis zur Frist führt zu FAULT |
| REVIEW | Beobachtungen und Historie neu bewerten | DONE, wenn erfüllt; CHECK, wenn ein weiterer Kandidat gerechtfertigt ist; FAULT bei Unstimmigkeiten |
| DONE | Ausgabe gestoppt halten und Aufzeichnung schließen | Ein nachfolgender Vorgang erfordert eine neue Betriebsentscheidung |
| FAULT | Stopp anfordern und weitere Zugaben untersagen | Ausdrückliche Wiederherstellung nach Prüfung von Ursache, gelieferter Menge und Ausrüstung |
Das Ausgeben eines Stoppbefehls unterscheidet sich vom Bestätigen, dass der Durchfluss gestoppt hat. Software-Zustandsnamen können ein fehlerhaftes Ventil oder eine fehlerhafte Pumpe nicht verhindern. Eine Implementierung benötigt auch Ausgaberückmeldung, gerätespezifische Stoppmechanismen und definiertes Neustartverhalten.
Lassen Sie FAULT nicht nach kurzer Wartezeit automatisch zu CHECK zurückkehren. Das Wiederholen eines Vorgangs ohne Klärung der Ursache kann unbeabsichtigte Zugaben anhäufen.
Das Budget belasten, bevor der Befehl ausgegeben wird
Verwenden Sie veranschaulichende Grenzwerte von 16–20 mL pro Zugabe, 50 mL pro Betriebssitzung und höchstens drei Freigaben. Das Minimum von 16 mL entspricht der synthetischen Kalibrierung bei 10 s aus dem vorherigen Artikel. Diese Zahlen sind keine Geräteeinstellungen.
Für bereits belastetes Volumen B [mL] und Kandidat d [mL] gilt die Anforderung
Erfassen Sie bei der Freigabe B\leftarrow B+d und n\leftarrow n+1, bevor Sie zum Befehl übergehen. Dieses Verzeichnis stellt verbrauchte Freigabekapazität dar, keine gemessene Lieferung. Schlägt die Kommunikation unmittelbar nach einem Befehl fehl, nehmen Sie keine Nulllieferung an und erstatten Sie keine Kapazität zurück. Erfassen Sie gemessene und unsichere Lieferung getrennt.
| Synthetischer Vorgang | Kandidat | Belastete Gesamtsumme nach Entscheidung | Ergebnis |
|---|---|---|---|
| Erster | 16 mL | 16 mL | Erlaubt |
| Zweiter, nach Stopp, Durchmischung und Prüfung | 16 mL | 32 mL | Erlaubt |
| Dritter, nach Prüfung | 18 mL | 50 mL | Erlaubt |
| Vierter | 16 mL | 50 mL | Abgelehnt: Versuchsgrenze |
Eine Anfrage von 20 mL nach Belastung von 32 mL wird abgelehnt, da sie 52 mL erreichen würde, selbst bei einem verbleibenden Versuch. Überdenken Sie Beobachtungen und die Grundlage des Kandidaten, anstatt die Dosis automatisch auf die verbleibende Kapazität zu kürzen.
Eine Sitzung ist hier eine Korrektursequenz mit erfasstem Start und Ende. Eine Schleifeniteration, ein Seitenneuladen oder eine Neuverbindung ist keine neue Sitzung. Ein Betriebssystem benötigt ausdrückliche Bedingungen für die Budgeterneuerung, etwa ein definiertes Zeitfenster oder einen Tankwechsel, sowie Aufzeichnungen, die einen Neustart überdauern. Dieses Beispiel besitzt keine Persistenz.
Aktualität getrennt von Stabilität prüfen
Der Empfangszeitpunkt allein belegt keine Aktualität. Berücksichtigen Sie den Zeitpunkt der Quellmessung, die Uhrensynchronisation und die Reihenfolge relativ zum Vorgang. Hier ist age_s ein bereits umgerechnetes Messalter, das nur zwischen null und fünf Sekunden akzeptiert wird. Ein negatives Alter aus einem zukünftigen Zeitstempel wird ebenfalls abgelehnt.
after_stop bedeutet, dass die Beobachtung auf die Bestätigung des vorherigen Stopps folgt. Verwenden Sie für die erste Zugabe eine Beobachtung, die nach Beginn der aktuellen Vorprüfung erhalten wurde. stable ist eine vorgelagerte Entscheidung, die auf einer Abfolge von Beobachtungen basiert, wie im vorherigen Leitfaden besprochen. Ein einzelner unveränderter Wert belegt keine Stabilität: Bewerten Sie fehlende Daten, festsitzende Sensoren und Abweichungen zwischen Standorten.
Fünf Sekunden sind eine Lehrannahme. Ein mit Probenahmeintervall und Kommunikationsverzögerung unvereinbarer Grenzwert kann nützliche Beobachtungen ablehnen. Ihn einfach zu erhöhen löst Probleme mit veralteten Daten nicht.
Das Freigabetor in Python ausprobieren
Speichern Sie als dosing_gate.py und führen Sie python3 dosing_gate.py aus. Es wird nur die Standardbibliothek benötigt.
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"
Die ersten drei Entscheidungen sind ALLOW; die vierte ist ATTEMPTS. Die belasteten Gesamtsummen sind 16, 32, 50 und 50 mL. Das Zurücksetzen des Demonstrationszustands auf CHECK am Ende jeder Iteration stellt erfolgreiches synthetisches Stoppen, Durchmischen und Neubewerten dar. Eine Implementierung darf diesen Übergang nicht allein deshalb ausführen, weil ein fester Timer abgelaufen ist.
Diese Funktion ist ein Offline-Lehrtor mit numerischen Argumenten. Sie parst keine Kommunikationseingaben, berechnet keine Dosis, stellt keine Stabilität fest, überwacht keinen tatsächlichen Durchfluss und führt die Zustandsmaschine nicht aus. Sie lehnt NaN, Unendlich, negative belastete Volumina und ungültige Versuchszahlen ab, ist aber keine vollständige externe Eingabe-API.
Die Ablehnungsgrenzen ausprobieren
| Eingabe oder Situation | Erwartetes Ergebnis |
|---|---|
| Ein weiterer Kandidat trifft in WAIT ein | STATE; keine zusätzliche Budgetbelastung oder Befehl |
| Alter ist sechs Sekunden oder negativ | STALE |
| Beobachtung geht dem Stopp voraus oder ist nicht stabil | STALE oder UNSTABLE |
| Zirkulation gestoppt oder abnormaler Füllstand | INTERLOCK |
| Kandidat ist 15 oder 21 mL | DOSE_RANGE |
| Anfrage von 20 mL nach Belastung von 32 mL | BUDGET |
| Kandidat oder belastetes Volumen ist NaN | INVALID |
Eine Implementierung muss auch testen, dass das erneute Senden einer Vorgangs-ID nicht zweimal ausgeführt werden kann. Committen Sie Budgetänderungen und Vorgangs-IDs gemeinsam, damit konkurrierende Anfragen nicht dieselbe verbleibende Kapazität verbrauchen können. Gleichen Sie nach einer Unterbrechung gespeicherte Befehle mit dem tatsächlichen Gerätezustand ab, bevor Sie fortfahren.
Was dies feststellt
Das Beispiel prüft Freigabeentscheidungen gegen gelieferte Eingaben und Grenzwerte. Es leitet weder einzelne Komponentendefizite aus EC noch Säuremengen aus pH-Unterschieden ab. Es validiert auch weder Wachstum, Ertrag, Gerätesicherheit noch Konzentrationsverfolgung.
Die Rollen von Bilanzierung, Lieferkalibrierung, Durchmischungsbewertung und Freigabe sind nun verbunden. Die Validierung mit gemessenen Gerätprotokollen bleibt offen. Als Nächstes folgt der Wasserweg durch Produktionssysteme wie NFT, DWC und Tropfbewässerung, bei denen sich das Verhältnis zwischen Tank und Wurzeln ändert.

Kommentare
Bitte zuerst anmelden.
Noch keine Einträge.