Contents — find the section you need
CEA besin tankları — yeniden doldurma ve seyreltme muhasebesi
Hacmi ve derişimi birlikte geri kazanmak
Bir tank, izlenen bir bileşenin 80 mg/L derişiminde 90 L içerir. 10 L bileşensiz su eklemek hacmi 100 L'ye geri getirir ancak derişimi 72 mg/L'ye düşürür. Bu nedenle düşük seviye ile bileşen açığı ayrı muhasebe gerektirir.
Bu kılavuz, kök bölgesi temellerini ayrık işlemlere genişletir. Tüm değerler sentetiktir; 100 mg/L bir aritmetik hedeftir, bir mahsul önerisi değildir. EC'den bir gübre reçetesi veya asit/baz dozu hesaplamadan, bilinen derişimdeki tek bir bileşeni izliyoruz.
Sınırı tanımlayın
Mahsul döngüsü tedariki ve dönüşü durdurulmuş, mükemmel karıştırılmış tek bir tank varsayın. Her işlem sırasında alım, buharlaşma, çökelme veya reaksiyon yoktur ve sıvı hacimleri toplanabilirdir. Çalışan bir tankın dengesinde tedarik ve dönüş hacmi ile bileşen akışları gerekir. Sınır tüm dolaşım sistemini kapsıyorsa, iç dolaşım harici bir yeniden doldurma değildir.
Hacim V [L], derişim C [mg/L] ve çözünmüş bileşen kütlesi M [mg] için M=VC'dir. C_a derişiminde V_a hacmi eklemek şunu verir:
C_a=0'ı yalnızca eklenen su izlenen bileşeni içermiyorsa kullanın. OSU'nun besin yönetimi kılavuzu, kaynak su analizini ve tuz derişimine, pH'a, alkaliliğe ve besin oranlarına dikkat edilmesini açıklar.
Üç eklemeyi karşılaştırın
80 mg/L'de 90 L ile başlayın: 7,200 mg. Bu bileşen için 10,000 mg/L'lik bir stok derişimi varsayın.
| İşlem | Son hacim | Son bileşen kütlesi | Son derişim |
|---|---|---|---|
| 10 L bileşensiz su ekleme | 100 L | 7,200 mg | 72.00 mg/L |
| Yaklaşık 0.181818 L yalnızca stok ekleme | Yaklaşık 90.181818 L | Yaklaşık 9,018.18 mg | 100.00 mg/L |
| 0.28 L stok ve 9.72 L su ekleme | 100 L | 10,000 mg | 100.00 mg/L |
Stok da hacim ekler. Hedef derişim C_t, stok derişimi C_s ve stok hacmi x için,
Derişimi yükseltmek C_s>C_t>C_0 gerektirir. Hedef derişimdeki stok, sonlu bir eklemeyle daha düşük bir başlangıç derişimini tam olarak o hedefe getiremez. Negatif bir çözüm, önerilen eklemenin hedefi karşılayamayacağını gösterir.
Son hacim V_f de belirtilmişse ve tamamlama suyu bileşeni içermiyorsa,
Her iki ekleme de negatif olmamalı ve son hacim kaba sığmalıdır. Burada bunlar 0.28 L stok ve 9.72 L sudur. Yalnızca derişimi belirtmek, hem derişimi hem hacmi belirtmekten farklı bir cevap verir.
Boşaltma ve seyreltmenin farklı etkileri vardır
Şimdi 120 mg/L'de 100 L ile başlayın: 12,000 mg. İyi karışmış çözeltiden 10 L boşaltmak 1,200 mg uzaklaştırır. Kalan, hâlâ 120 mg/L'de 90 L ve 10,800 mg'dır. Ardından 10 L bileşensiz su eklemek 108 mg/L'de 100 L verir.
Boşaltmadan 20 L su eklemek ise 100 mg/L'de 120 L verir. Tank hâlâ 12,000 mg içerir ve daha fazla yedek kapasiteye ihtiyaç duyar.
| Koşul | Denklem | Sınır |
|---|---|---|
| Önce D L boşalt, sonra suyla değiştir | C_1=C_0(1-D/V_0) | Mükemmel karışım; bileşensiz yeniden doldurma |
| Boşaltmadan W L su ekle | C_1=V_0C_0/(V_0+W) | Hacim artar |
| Sabit hacimde eş zamanlı giriş ve çıkış | C(t)=C_{in}+(C_0-C_{in})e^{-Qt/V} | Mükemmel karışım, sabit akış, alım veya reaksiyon yok |
10 L'nin eş zamanlı değişimi için, Qt/V=0.1 ve C_{in}=0 yaklaşık 108.58 mg/L verir. Bu, önce boşaltarak elde edilen 108 mg/L'den farklıdır. İşlem sırası kayıt defterine aittir.
Muhasebeyi Python'da yeniden üretin
Bunu tank_accounting.py olarak kaydedin ve python3 tank_accounting.py çalıştırın. Yalnızca standart kütüphaneyi kullanır.
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")
Çıktılar 72.00 mg/L; 0.181818 L ve 100.00 mg/L; 0.28 L ve 9.72 L; 108.00 mg/L; ve 100.00 mg/L'dir. Başka bir stok derişimiyle denemeden önce, yukarıdaki ulaşılabilirlik koşullarını kontrol edin ve paydanın sıfır olmadığından emin olun.
Muhasebeden kontrole
OSU'nun sulama suyu test kılavuzu, EC ve TDS'nin tekil tuz derişimlerini belirlemediğini açıklar. EC'yi C yerine koymak, belirli bir bileşenin yeniden doldurulmasını hesaplayamaz. Karışık bir gübre birden fazla bileşeni aynı anda değiştirir, bu yüzden bir hedefi karşılamak tüm bileşimi geri yüklemez.
Bir sensörün de mükemmel karıştırılmış tahmine hemen ulaşması gerekmez. OSU'nun besin yönetimi kılavuzu, karıştırmayı ve okumaların stabilize olmasını beklemeyi ister. Bu ayrıma dayanarak, bu makale kontrol tasarımı için şu başlangıç noktasını önerir:
- Başlangıç zamanını, hacmi, örnekleme konumunu, bileşen derişimi için dayanağı, EC'yi, sıvı sıcaklığını ve pH'ı kaydedin.
- Stok bileşimini, gerçek ekleme ve boşaltma hacimlerini ve dolaşım durumunu kaydedin. Yalnızca pompa komut süresi gerçek akışı belirlemez.
- Yeniden değerlendirmeden önce ekipman üzerinde belirlenmiş bir karışma aralığını ve kararlı ölçümleri bekleyin. Enjeksiyondan hemen sonraki yerel bir okumaya tepki olarak ek komutları üst üste yığmaktan kaçının.
- Tahmin hatalarını koruyun. Anormal seviyeleri, akış tutarsızlıklarını veya bayat ölçümleri incelemek için daha fazla eklemeyi durdurun. Gerçek kurulumda toleranslar ve doz sınırları belirleyin.
Bu eksiksiz bir dozajlama sistemi spesifikasyonu değildir. Çalışılan örnekler, belirtilen varsayımlar altında hacim, bileşen kütlesi ve derişimin aritmetik tutarlılığını doğrular. Sonraki adım, ölçülen pompa akışını ve karışma tepkisini kullanarak komut edilen işlemleri gözlemlere bağlamaktır.
CEA dozajlama pompaları — hacim kalibrasyonu ve karışma bekleme süreleri
Bir eklemeyi "20 mL" diye adlandırmadan önceki iki kontrol
Tank muhasebesi kılavuzu, su ve bileşen dengelerinden eklemeleri hesapladı. Hesaplanan 20 mL henüz bir pompa çalışma süresi belirtmez. Enjeksiyonu bitirmek de bir tank okumasının temsili olduğu anlamına gelmez.
Bu kılavuz komuttan hacme kalibrasyonu, enjeksiyon sonrası ölçümlerin ne zaman yeniden değerlendirilebileceğinin kontrolünden ayırır. Aşağıdaki her veri seti, bir cihazın veya mahsulün ölçülmüş performansı değil, özgün bir sentetik örnektir. Kod, ekipmanı çalıştırmaz veya gübre reçetesi hesaplamaz.
Kalibrasyon koşullarını sabit tutun
Georgia Üniversitesi'nin gübre enjektörü kılavuzu, periyodik kalibrasyon ve bakımı, çalışma akış aralıklarını ve basınç koşullarını açıklar. Suya orantılı bir enjektörün oranı, burada ele alınan zamanla komut edilen bir pompanın mL/s'sinden farklıdır.
Bir toplama deneyi için, ekipman kılavuzunu takip edin ve koşulları tutarlı bir şekilde kaydedin:
| Kayıt | Amaç |
|---|---|
| Pompa, hız ayarı, hortum, vanalar ve servis geçmişi | Kalibre edilmiş yapılandırmayı tanımlamak |
| Sıvı, sıcaklık ve kullanılıyorsa yoğunluk | Bir su denemesini bir stok çözelti denemesinden ayrı tutmak |
| Emme seviyesi, deşarj yüksekliği/basıncı ve tesisat | Toplama ile işletme arasındaki farkları korumak |
| Doldurma, kabarcıklar ve önceki bekleme süresi | Başlangıç farklarını tanımlamak |
| Komut başlangıç/bitiş, toplama bitişi ve toplanan hacim | Durma sonrası damlamanın dahil olup olmadığını tanımlamak |
Toplama için deşarj tesisatının bağlantısını kesmek arka basıncı değiştirebilir. Kolay bir toplama kurulumu, kurulu sistemdeki teslimatı tek başına kanıtlamaz. Ön su kontrollerini amaçlanan sıvıyla doğrulamadan ayrı tutun.
Tartarken, net toplanan kütle \Delta m [g] değerini sıvı yoğunluğu \rho [g/mL] kullanarak dönüştürün: V=\Delta m/\rho [mL]. Her sıvının 1 g/mL yoğunluğa sahip olduğunu varsaymayın. Terazi çözünürlüğünü, kalibrasyon durumunu ve zamanlama doğruluğunu kaydedin.
Uzun vadeli bir ortalama kısa bir eklemeyi yanlış temsil edebilir
Her sürede, hepsi aynı durumda başlayan üç deneme varsayın.
| Komut [s] | Üç sentetik hacim [mL] | Ortalama [mL] |
|---|---|---|
| 10 | 15, 16, 17 | 16 |
| 20 | 35, 36, 37 | 36 |
| 30 | 55, 56, 57 | 56 |
| 60 | 115, 116, 117 | 116 |
Ortalamalar V(t)=at+b=2t-4 [mL] izler; a mL/s ve b mL cinsindendir. 20 mL'lik bir hedef (20-b)/a=12 s verir. Yalnızca eğimi kullanmak bu örnekte 10 s ve yalnızca 16 mL verir.
60 s ortalama akışı, 116/60 mL/s, kullanmak ise 20 mL için yaklaşık 10.34 s verir. Sentetik denklem o sürede yaklaşık 16.69 mL tahmin eder. Hangi "akış hızının" kullanıldığı önemlidir.
−4 mL'lik kesişim, örneklenen aralık üzerinde bir regresyon katsayısıdır, fiziksel iki saniyelik saf bir gecikmenin kanıtı değildir. 10–60 s dışına, özellikle sıfıra doğru, dışlamayı yapmayın. Ölçülen veriler için kalıntıları inceleyin ve ilişki eğrileşiyorsa ayrı bir kısa süreli model düşünün.
Her sentetik satırın 1 mL'lik bir örnek standart sapması vardır. Ortalamalar üzerindeki sıfır regresyon hatası, tekil atış değişkenliğini ortadan kaldırmaz. Üç tekrar da gün-günden değişkenliği veya terazi yanlılığını belirlemez. Uydurmaya dahil edilmemiş ek süreler ve denemeler kullanarak ölçülen tahminleri kontrol edin.
Enjeksiyon tamamlanmasını karışma doğrulamasından ayırın
OSU'nun besin yönetimi kılavuzu, değerlendirmeden önce karıştırmayı ve kararlı okumaları ister. Bir bekleme süresi belirlemek, hacim kalibrasyonundan ayrı bir enjeksiyon sonrası zaman serisi gerektirir.
Enjeksiyon noktasından uzakta olduğu kadar yakınında da eşzamanlı ölçümleri kaydedin. Hacmi, dolaşım akışını, enjeksiyon ve sensör konumlarını, sıcaklığı ve sensör filtrelemesini belgeleyin. Karışma, taşıma ve sensör tepkisinin tümü gözlemlenen dinamiklere katkıda bulunur; tek bir uydurulmuş tepki süresi otomatik olarak saf bir karışma süresi değildir.
Açıklama için, başlangıç değeri y_0'dan bilinen bir son değere y_\infty olan bir değişimi normalize edin:
Sıfır zamanı enjeksiyon tamamlanmasıdır. Bu sentetik bir yerel ölçüm tepkisidir, kütle koruyan bir tank modeli değildir. A ve B konumlarında 40 s ve 80 s zaman sabitleri varsayın. Sürekli zamanlı tepkileri, yaklaşık 120 s ve 240 s sonra son değişimin etrafındaki %5'lik banda girer.
Üst: her süre için toplanan üç hacim ve ortalamalarına uydurulan çizgi. Alt: sentetik tepkiler A ve B. Zaman saniye, hacim mL ve normalize edilmiş tepki boyutsuzdur. Ölçülmüş veri gösterilmemiştir.
Şimdi öğretici bir kural uygulayın: her 10 s'de bir örnekle, her iki konum da doğrulamadan önce 30 s boyunca %5 içinde kalmalıdır. B ilk olarak 240 s'de nitelenir. 240, 250, 260 ve 270 s'deki dört örnek, 270 s'de doğrulama sağlar. Yalnızca A'yı kontrol etmek 150 s'de nitelenir ve B'yi gözden kaçırır.
Ne %5 ne de 30 s evrensel bir kabul kriteridir. Ölçüm gürültüsü/doğruluğu, kabul edilebilir derişim sapması ve örnekleme aralığını kullanarak kriterleri seçin. Son değerleri bağımsız olarak, örneğin yeterince uzun kayıtlardan tahmin edin ve ayrıca konumların son değerleri arasındaki farkları inceleyin. Her konumu ayrı ayrı normalize etmek, kalıcı mekânsal derişim farklarını gizleyebilir. Başlangıçtan sona değişim gürültüye kıyasla küçükken bu normalizasyonu kullanmayın.
Hesaplamaları yeniden üretin
pump_mixing.py olarak kaydedin ve python3 pump_mixing.py çalıştırın. Yalnızca standart kütüphane gerekir.
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")
Çıktılar 2.00 eğim, −4.00 kesişim, 20 mL için 12.00 s'lik bir komut, 40 s'de 76.00 mL ve 270 s'de doğrulamadır. Dışarıda tutulan 40 s referansı da aynı sentetik denklemden gelir, bu yüzden gerçek ekipmana genelleştirmenin kanıtı değildir. 80 s zaman sabitini 120 s olarak değiştirmek, doğrulamayı 390 s'de verir. Kayıtta nitelenen bir pencere yoksa, kod None döndürür.
Kontrolleri başka bir ekleme iznine bağlayın
Bir kontrol uygulaması bir zamanlayıcıdan fazlasını gerektirir. Bu makale, ön kontroller, bir ekleme, karışma/ölçüm bekleme süresi ve yeniden değerlendirme için ayrı aşamalar önerir. Aralık dışı komutlar, eksik veya bayat okumalar, durmuş dolaşım, anormal seviyeler veya gözlem periyodu içinde stabilize olamama, inceleme beklenene kadar daha fazla eklemeyi önlemelidir. Eksik örnekleri önceki değerle doldurup bunu sürekli stabilite olarak saymayın.
Bekledikten sonra hedefin altındaki bir EC okuması, belirli bir bileşen açığını hemen belirlemez; kök bölgesi temellerinde açıklanan EC ve bileşim arasındaki ayrımı koruyun. Sonraki adım, kalıcı ekleme, kümülatif ve yeniden deneme sınırlarıyla dozajlama kontrolü tasarlamadan önce, teslimat tahminlerini ve bekleme kriterlerini ölçülen kayıtlara karşı değerlendirmektir.
CEA dozajlama kontrolü — sınırlar, ölçüm bekleme süreleri ve arıza durumları
Düşük bir okuma tekrarlanan eklemeleri haklı çıkarmaz
Pompa kalibrasyonu ve karışma bekleme süreleri, teslim edilen hacmi gözlemlerin yerleştiği zamandan ayırdı. Sonraki soru, başka bir eklemeye şu anda izin verilip verilmediğidir. Karışma sırasında düşük bir okuma, eski bir örnek veya durmuş dolaşım bu izni belirlemez.
Bu kılavuz, hacim, deneme sayısı ve gözlemler üzerinde ayrı işletme durumları ve kontrollerle öğretici bir tasarım önerir. Tüm değerler ve girdiler sentetiktir, işletme sınırları veya gübre önerileri değildir. Python örneği yalnızca bir yetkilendirme kapısını yeniden üretir; bir pompayı çalıştırmaz.
Bir aday hesaplayın, sonra yürütülüp yürütülemeyeceğine karar verin
Tank muhasebesinden türetilen bir aday, hâlâ kalibrasyon aralığına, ekipman durumuna ve önceki işlemi değerlendirebilecek gözlemlere karşı kontroller gerektirir.
UGA'nın enjektör kılavuzu, periyodik kalibrasyon ve bakımı açıklar. OSU'nun besin yönetimi kılavuzu, değerlendirmeden önce karıştırmayı ve kararlı okumaları ister. Aşağıdaki durumlar ve sınırlar bu makalenin önerdiği tasarımdır, her iki kaynak tarafından sağlanan bir kontrolör spesifikasyonu değildir.
Altı işletme durumunu ayırın
| Durum | Etkinlik | Geçiş koşulu |
|---|---|---|
| CHECK | Gözlemleri, adayı, kalan bütçeyi ve ekipmanı doğrula | DOSE'dan önce bir rezervasyon kaydet; hedef zaten karşılanmışsa DONE'a git |
| DOSE | Benzersiz bir işlem kimliği için tek bir komut ver | WAIT'ten önce durmayı onayla; zaman aşımı veya akış uyuşmazlığı FAULT'a götürür |
| WAIT | Yeni eklemeleri yasakla ve durma sonrası gözlemleri topla | Nitelenen gözlemler REVIEW'a götürür; son tarihe kadar stabilize olamama FAULT'a götürür |
| REVIEW | Gözlemleri ve geçmişi yeniden değerlendir | Tatmin ediciyse DONE, başka bir aday haklıysa CHECK, tutarsızlıklar için FAULT |
| DONE | Çıktıyı durdurulmuş tut ve kaydı kapat | Sonraki bir işlem yeni bir işletme kararı gerektirir |
| FAULT | Durmayı talep et ve daha fazla eklemeyi yasakla | Nedeni, teslim edilen miktarı ve ekipmanı kontrol ettikten sonra açık kurtarma |
Bir durdurma komutu vermek, akışın durduğunu onaylamaktan farklıdır. Yazılım durum adları arızalı bir vana veya pompayı önleyemez. Bir uygulama ayrıca çıktı geri bildirimine, ekipman tarafı durdurma mekanizmalarına ve tanımlanmış yeniden başlatma davranışına ihtiyaç duyar.
FAULT'un kısa bir beklemeden sonra otomatik olarak CHECK'e dönmesini sağlamayın. Nedenini çözmeden bir işlemi tekrarlamak, istenmeyen eklemelerin birikmesine neden olabilir.
Komutu vermeden önce bütçeyi yükleyin
Ekleme başına 16–20 mL, işletme oturumu başına 50 mL ve en fazla üç yetkilendirmelik açıklayıcı sınırlar kullanın. 16 mL'lik asgari değer, önceki makalenin 10 s'deki sentetik kalibrasyonuna karşılık gelir. Bu sayılar ekipman ayarları değildir.
Zaten yüklenmiş hacim B [mL] ve aday d [mL] için şunu gerektirin:
Yetkilendirmede, komuta geçmeden önce B\leftarrow B+d ve n\leftarrow n+1 kaydedin. Bu kayıt defteri tüketilen yetkilendirme kapasitesini temsil eder, ölçülen teslimatı değil. Bir komuttan hemen sonra iletişim başarısız olursa, sıfır teslimat varsaymayın ve kapasitesini geri ödemeyin. Ölçülen ve belirsiz teslimatı ayrı kaydedin.
| Sentetik işlem | Aday | Karardan sonra yüklenen toplam | Sonuç |
|---|---|---|---|
| İlk | 16 mL | 16 mL | İzin ver |
| İkinci, durma, karışma ve incelemeden sonra | 16 mL | 32 mL | İzin ver |
| Üçüncü, incelemeden sonra | 18 mL | 50 mL | İzin ver |
| Dördüncü | 16 mL | 50 mL | Reddet: deneme sınırı |
32 mL yükledikten sonraki 20 mL'lik bir talep reddedilir çünkü bir deneme kalsa bile 52 mL'ye ulaşır. Dozu kalan kapasiteye otomatik olarak kırpmak yerine gözlemleri ve adayın dayanağını yeniden düşünün.
Burada bir oturum, kaydedilmiş bir başlangıcı ve bitişi olan bir düzeltme dizisidir. Bir döngü yinelemesi, sayfa yenilemesi veya yeniden bağlanma yeni bir oturum değildir. İşletimsel bir sistem, tanımlanmış bir zaman penceresi veya tank değişimi gibi açık bütçe yenileme koşullarına ve yeniden başlatmadan sağ çıkan kayıtlara ihtiyaç duyar. Bu örneğin kalıcılığı yoktur.
Tazeliği stabiliteden ayrı kontrol edin
Yalnızca alım zamanı tazeliği belirlemez. Kaynak ölçüm zamanını, saat senkronizasyonunu ve işleme göre sırayı dikkate alın. Burada age_s, yalnızca sıfır ile beş saniye arasında kabul edilen, zaten dönüştürülmüş bir ölçüm yaşıdır. Gelecekteki bir zaman damgasından gelen negatif bir yaş da reddedilir.
after_stop, gözlemin önceki durdurmanın onaylanmasını takip ettiği anlamına gelir. İlk ekleme için, mevcut ön kontrolün başlamasından sonra elde edilen bir gözlem kullanın. stable, önceki kılavuzda tartışıldığı gibi bir gözlem dizisine dayanan bir üst düzey karardır. Tek bir değişmeyen değer stabiliteyi belirlemez: eksik verileri, sıkışmış sensörleri ve konumlar arasındaki anlaşmazlığı değerlendirin.
Beş saniye öğretici bir varsayımdır. Örnekleme aralığı ve iletişim gecikmesiyle uyumsuz bir sınır, yararlı gözlemleri reddedebilir. Yalnızca artırmak bayat veri sorunlarını çözmez.
Yetkilendirme kapısını Python'da deneyin
dosing_gate.py olarak kaydedin ve python3 dosing_gate.py çalıştırın. Yalnızca standart kütüphane gerekir.
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"
İlk üç karar ALLOW'dur; dördüncüsü ATTEMPTS'tir. Yüklenen toplamlar 16, 32, 50 ve 50 mL'dir. Her yinelemenin sonunda gösteri durumunu CHECK'e sıfırlamak, sentetik başarılı durdurmayı, karıştırmayı ve yeniden değerlendirmeyi temsil eder. Bir uygulama, yalnızca sabit bir zamanlayıcı süresi dolduğu için bu geçişi yürütmemelidir.
Bu fonksiyon, sayısal argümanlarla çevrimdışı bir öğretici kapıdır. İletişim girdilerini ayrıştırmaz, bir doz hesaplamaz, stabilite belirlemez, gerçek akışı izlemez veya durum makinesini yürütmez. NaN'ı, sonsuzluğu, negatif yüklenmiş hacimleri ve geçersiz deneme sayılarını reddeder, ancak eksiksiz bir harici girdi API'si değildir.
Ret sınırlarını deneyin
| Girdi veya durum | Beklenen sonuç |
|---|---|
| WAIT sırasında başka bir aday gelir | STATE; ek bütçe yüklemesi veya komut yok |
| Yaş altı saniye veya negatif | STALE |
| Gözlem durdurmadan önce gelir veya kararlı değil | STALE veya UNSTABLE |
| Dolaşım durmuş veya anormal seviye | INTERLOCK |
| Aday 15 veya 21 mL'dir | DOSE_RANGE |
| 32 mL yüklendikten sonra 20 mL talep edilir | BUDGET |
| Aday veya yüklenen hacim NaN'dır | INVALID |
Bir uygulama, bir işlem kimliğini yeniden göndermenin iki kez yürütülemeyeceğini de test etmelidir. Rakip taleplerin aynı kalan kapasiteyi harcayamaması için bütçe değişikliklerini ve işlem kimliklerini birlikte işleyin. Kesintiden sonra, devam etmeden önce kalıcı komutları gerçek ekipman durumuyla uzlaştırın.
Bunun ortaya koyduğu
Örnek, yetkilendirme kararlarını sağlanan girdilere ve sınırlara karşı kontrol eder. EC'den tekil bileşen açıklarını veya pH farklarından asit miktarlarını çıkarmaz. Ayrıca büyümeyi, verimi, ekipman güvenliğini veya derişim izlemesini doğrulamaz.
Muhasebe, teslimat kalibrasyonu, karışma değerlendirmesi ve yetkilendirmenin rolleri artık birbirine bağlıdır. Ölçülen ekipman kayıtlarıyla doğrulama açık kalır. Sırada, tank ile kökler arasındaki ilişkinin değiştiği NFT, DWC ve damla gibi üretim sistemleri boyunca su yolu var.

Yorumlar
Lütfen önce giriş yapın.
Henüz veri yok.