Contents — find the section you need

CEA 영양분 탱크 — 보충과 희석의 회계

부피와 농도를 함께 복원하기

탱크에 추적 대상 성분이 80 mg/L 농도로 90 L 들어 있습니다. 해당 성분이 없는 물을 10 L 추가하면 부피는 100 L로 복원되지만 농도는 72 mg/L로 낮아집니다. 따라서 낮은 수위와 성분 부족은 별도로 회계 처리해야 합니다.

이 가이드는 근권 기초를 이산적인 조작으로 확장합니다. 모든 값은 가상값이며, 100 mg/L는 작물 권장값이 아니라 산술적 목표값입니다. 우리는 비료 배합, EC로부터의 농도, 산/염기 투입량을 계산하지 않고, 알려진 농도를 가진 하나의 성분만을 추적합니다.

경계를 정의하십시오

작물 루프의 공급과 회수가 정지된, 완전히 혼합된 하나의 탱크를 가정합니다. 각 조작 동안 흡수, 증발, 침전, 반응은 없으며 액체 부피는 가산적입니다. 운영 중인 탱크는 수지 계산에 공급과 회수 부피 및 성분 유량이 필요합니다. 경계가 전체 순환 시스템을 둘러싼다면, 내부 순환은 외부 보충이 아닙니다.

부피 V [L], 농도 C [mg/L], 용존 성분 질량 M [mg]에 대해 M=VC입니다. 농도 C_a인 부피 V_a를 추가하면

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

추가하는 물에 추적 대상 성분이 전혀 없을 때만 C_a=0을 사용하십시오. OSU의 영양 관리 가이드는 수원수 분석과 염 농도, pH, 알칼리도, 영양소 비율에 대한 주의를 설명합니다.

세 가지 추가 방식을 비교하십시오

80 mg/L의 90 L, 즉 7,200 mg에서 시작합니다. 이 성분의 원액 농도를 10,000 mg/L로 가정합니다.

조작 최종 부피 최종 성분 질량 최종 농도
성분이 없는 물 10 L 추가 100 L 7,200 mg 72.00 mg/L
원액만 약 0.181818 L 추가 약 90.181818 L 약 9,018.18 mg 100.00 mg/L
원액 0.28 L와 물 9.72 L 추가 100 L 10,000 mg 100.00 mg/L

원액도 부피를 더합니다. 목표 농도 C_t, 원액 농도 C_s, 원액 부피 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}

농도를 높이려면 C_s>C_t>C_0이 필요합니다. 목표 농도와 같은 원액으로는 유한한 추가량으로 더 낮은 초기 농도를 정확히 그 목표까지 끌어올릴 수 없습니다. 음의 해는 제안된 추가가 목표를 달성할 수 없음을 나타냅니다.

최종 부피 V_f도 함께 지정되고 보충수에 해당 성분이 전혀 없다면,

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

두 추가량 모두 음이 아니어야 하며 최종 부피는 용기에 맞아야 합니다. 여기서는 원액 0.28 L와 물 9.72 L입니다. 농도만 지정하는 경우와 농도와 부피를 함께 지정하는 경우는 서로 다른 답을 줍니다.

배수와 희석은 효과가 다릅니다

이번에는 120 mg/L의 100 L, 즉 12,000 mg에서 시작합니다. 잘 혼합된 용액 10 L를 배수하면 1,200 mg이 제거됩니다. 남은 것은 90 L, 10,800 mg이며 여전히 120 mg/L입니다. 이후 성분이 없는 물 10 L를 추가하면 100 L, 108 mg/L가 됩니다.

배수 없이 물 20 L를 추가하면 대신 120 L, 100 mg/L가 됩니다. 탱크에는 여전히 12,000 mg이 들어 있으며 더 많은 여유 용적이 필요합니다.

조건 방정식 경계
먼저 D L를 배수한 뒤 물로 교체 C_1=C_0(1-D/V_0) 완전 혼합; 성분이 없는 보충수
배수 없이 물 W L 추가 C_1=V_0C_0/(V_0+W) 부피가 증가함
일정 부피에서 동시 유입·유출 C(t)=C_{in}+(C_0-C_{in})e^{-Qt/V} 완전 혼합, 일정 유량, 흡수나 반응 없음

10 L의 동시 교체에서 Qt/V=0.1이고 C_{in}=0이면 약 108.58 mg/L가 됩니다. 이는 먼저 배수하여 얻은 108 mg/L와 다릅니다. 조작 순서는 기록에 남겨야 할 항목입니다.

회계를 Python으로 재현하십시오

tank_accounting.py로 저장하고 python3 tank_accounting.py를 실행하십시오. 표준 라이브러리만 사용합니다.

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")

출력값은 72.00 mg/L; 0.181818 L와 100.00 mg/L; 0.28 L와 9.72 L; 108.00 mg/L; 100.00 mg/L입니다. 다른 원액 농도로 실험하기 전에 위의 도달 가능 조건을 확인하고 분모가 0이 아닌지 확인하십시오.

회계에서 제어로

OSU의 관개수 검사 가이드는 EC와 TDS가 개별 염 농도를 식별하지 못함을 설명합니다. C 대신 EC를 대입해서는 특정 성분의 보충을 계산할 수 없습니다. 혼합 비료는 여러 성분을 동시에 변화시키므로, 하나의 목표를 충족한다고 해서 전체 조성이 복원되는 것은 아닙니다.

센서도 완전 혼합 예측값에 즉시 도달할 필요는 없습니다. OSU의 영양 관리 가이드는 교반과 측정값 안정화를 기다릴 것을 요구합니다. 이러한 구분을 바탕으로, 이 글은 제어 설계를 위한 다음의 출발점을 제안합니다.

  1. 초기 시각, 부피, 샘플링 위치, 성분 농도의 근거, EC, 액체 온도, pH를 기록하십시오.
  2. 원액 조성, 실제 추가 및 배수 부피, 순환 상태를 기록하십시오. 펌프 명령 지속 시간만으로는 실제 유량이 확정되지 않습니다.
  3. 재평가 전에 장비에서 확립된 혼합 대기 시간과 안정된 측정값을 기다리십시오. 주입 직후의 국소 측정값에 대응해 추가 명령을 쌓아 올리지 마십시오.
  4. 예측 오차를 보존하십시오. 비정상적인 수준, 유량 불일치, 오래된 측정값을 조사하기 위해 추가 투입을 중단하십시오. 실제 설비에서 허용 오차와 투입 한도를 설정하십시오.

이는 완전한 투입 시스템 사양이 아닙니다. 이 예제들은 명시된 가정 아래에서 부피, 성분 질량, 농도의 산술적 일관성을 검증합니다. 다음 단계는 측정된 펌프 유량과 혼합 응답을 이용해 명령된 조작을 관찰값과 연결하는 것입니다.

CEA 투입 펌프 — 부피 교정과 혼합 대기 시간

"20 mL"라고 부르기 전의 두 가지 점검

탱크 회계 가이드는 물과 성분 수지로부터 추가량을 계산했습니다. 계산된 20 mL는 아직 펌프 가동 시간을 특정하지 않습니다. 주입 완료도 탱크 측정값이 대표성을 가진다는 것을 의미하지 않습니다.

이 가이드는 명령-부피 교정과 주입 이후 측정값을 언제 재평가할 수 있는지 확인하는 것을 분리합니다. 아래의 모든 데이터셋은 독자적인 가상 예제이며, 실제 장비나 작물의 측정 성능이 아닙니다. 이 코드는 장비를 조작하거나 비료 배합을 계산하지 않습니다.

교정 조건을 일정하게 유지하십시오

조지아 대학교의 비료 주입기 가이드는 정기적인 교정 및 유지 관리, 운전 유량 범위, 압력 조건을 설명합니다. 물 비례식 주입기의 비율은 여기서 다루는 시간 명령식 펌프의 mL/s와 다릅니다.

수집 실험을 위해서는 장비 매뉴얼을 따르고 조건을 일관되게 기록하십시오.

기록 목적
펌프, 속도 설정, 튜빙, 밸브, 정비 이력 교정된 구성을 식별
액체, 온도, 사용한다면 밀도 물 시험을 원액 시험과 구분
흡입 수위, 토출 높이/압력, 배관 수집과 운전 간의 차이를 보존
프라이밍, 기포, 이전의 유휴 시간 시동 시 차이를 식별
명령 시작/정지, 수집 종료, 수집 부피 정지 후 적하 포함 여부를 정의

수집을 위해 토출 배관을 분리하면 배압이 바뀔 수 있습니다. 간편한 수집 설비만으로는 설치된 시스템에서의 토출량이 확립되지 않습니다. 예비 물 점검은 목적 액체를 이용한 확인 시험과 별도로 유지하십시오.

무게를 측정할 때는 순 수집 질량 \Delta m [g]을 액체 밀도 \rho [g/mL]로 변환하십시오. V=\Delta m/\rho [mL]. 모든 액체의 밀도가 1 g/mL라고 가정하지 마십시오. 저울 분해능, 교정 상태, 타이밍 정확도를 기록하십시오.

장시간 평균은 짧은 추가를 잘못 나타낼 수 있습니다

각 지속 시간마다 동일한 상태에서 시작한 세 번의 시행을 가정합니다.

명령 [s] 세 번의 가상 부피 [mL] 평균 [mL]
10 15, 16, 17 16
20 35, 36, 37 36
30 55, 56, 57 56
60 115, 116, 117 116

평균값은 V(t)=at+b=2t-4 [mL]를 따르며, a의 단위는 mL/s, b의 단위는 mL입니다. 20 mL 목표는 (20-b)/a=12초를 줍니다. 기울기만 사용하면 이 예에서 10초, 겨우 16 mL가 나옵니다.

대신 60초 평균 유량 116/60 mL/s를 사용하면 20 mL에 대해 약 10.34초가 나옵니다. 가상의 방정식은 이 지속 시간에서 약 16.69 mL를 예측합니다. 어떤 "유량"을 사용하느냐가 중요합니다.

−4 mL 절편은 샘플링된 범위에 대한 회귀 계수일 뿐, 실제 2초의 순수 지연을 증명하지 않습니다. 특히 0을 향해서는 10–60초 범위 밖으로 외삽하지 마십시오. 측정 데이터에서는 잔차를 검사하고, 관계가 휘어진다면 짧은 지속 시간용 별도 모델을 고려하십시오.

각 가상 행의 표본 표준편차는 1 mL입니다. 평균에 대한 회귀 오차가 0이라고 해서 개별 시행의 변동이 사라지는 것은 아닙니다. 세 번의 반복만으로는 일별 변동성이나 저울의 편향도 확립되지 않습니다. 피팅에서 제외된 추가 지속 시간과 시행으로 측정된 예측값을 점검하십시오.

주입 완료와 혼합 확인을 분리하십시오

OSU의 영양 관리 가이드는 평가 전에 교반과 안정된 측정값을 요구합니다. 대기 시간을 확립하려면 부피 교정과는 별개의 주입 이후 시계열이 필요합니다.

주입 지점에서 떨어진 곳과 근처 모두에서 동기화된 측정값을 기록하십시오. 부피, 순환 유량, 주입 및 센서 위치, 온도, 센서 필터링을 문서화하십시오. 혼합, 이송, 센서 응답이 모두 관측된 동특성에 기여하므로, 하나의 피팅된 응답 시간이 곧바로 순수한 혼합 시간이 되는 것은 아닙니다.

예시로, 초기값 y_0에서 알려진 최종값 y_\infty로의 변화를 정규화합니다.

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

시각 0은 주입 완료 시점입니다. 이는 가상의 국소 측정 응답이며, 질량 보존 탱크 모델이 아닙니다. 위치 A와 B의 시상수를 각각 40초, 80초로 가정합니다. 이들의 연속시간 응답은 약 120초와 240초 후에 최종 변화량의 5% 이내 대역에 진입합니다.

Diagram 1 · Use the button to switch views
Synthetic command-volume data and two normalized responses. The dashed line marks the illustrative 95% response threshold.

위: 각 지속 시간마다 수집된 세 개의 부피와 그 평균에 피팅된 직선. 아래: 가상의 응답 A와 B. 시간은 초, 부피는 mL, 정규화 응답은 무차원입니다. 측정 데이터는 표시되지 않았습니다.

이제 교육용 규칙을 부과합니다. 10초 간격 샘플링으로, 두 위치 모두 확인 전에 30초 동안 5% 이내를 유지해야 합니다. B는 240초에 처음으로 조건을 만족합니다. 240, 250, 260, 270초의 네 샘플이 270초에 확인을 제공합니다. A만 점검했다면 150초에 조건을 만족해 B를 놓쳤을 것입니다.

5%도 30초도 보편적인 승인 기준이 아닙니다. 측정 잡음/정확도, 허용 가능한 농도 편차, 샘플링 간격을 이용해 기준을 선택하십시오. 예를 들어 충분히 긴 기록으로부터 최종값을 독립적으로 추정하고, 위치 간 최종값의 차이도 함께 점검하십시오. 각 위치를 개별적으로 정규화하면 지속적인 공간적 농도 차이가 가려질 수 있습니다. 초기값 대비 최종값의 변화가 잡음에 비해 작을 때는 이 정규화를 사용하지 마십시오.

계산을 재현하십시오

pump_mixing.py로 저장하고 python3 pump_mixing.py를 실행하십시오. 표준 라이브러리만 필요합니다.

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")

출력값은 기울기 2.00, 절편 −4.00, 20 mL에 대한 명령 12.00초, 40초에서 76.00 mL, 그리고 270초에서의 확인입니다. 제외 검증에 쓰인 40초 참조값도 동일한 가상 방정식에서 나온 것이므로, 실제 장비에 대한 일반화의 증거는 아닙니다. 80초 시상수를 120초로 바꾸면 확인 시각은 390초가 됩니다. 기록에서 조건을 만족하는 구간이 없으면 코드는 None을 반환합니다.

점검 결과를 추가 투입 허가와 연결하십시오

제어 구현에는 타이머 이상의 것이 필요합니다. 이 글은 사전 점검, 한 번의 추가, 혼합/측정 대기, 재평가를 위한 별도의 단계를 제안합니다. 범위를 벗어난 명령, 결측 또는 오래된 측정값, 정지된 순환, 비정상 수준, 관찰 기간 내 안정화 실패는 조사가 완료될 때까지 추가 투입을 막아야 합니다. 결측 샘플을 이전 값으로 채우고 이를 지속적인 안정 상태로 취급하지 마십시오.

대기 후에도 EC 값이 목표보다 낮다고 해서 즉시 특정 성분의 부족이 확립되는 것은 아닙니다. 근권 기초에서 설명한 EC와 조성의 구분을 유지하십시오. 다음 단계는 개별 추가, 누적, 재시도 한도를 갖는 투입 제어를 설계하기 전에, 측정된 로그를 이용해 전달 예측과 대기 기준을 평가하는 것입니다.

CEA 투입 제어 — 한도, 측정 대기, 오류 상태

낮은 측정값이 반복적인 추가를 정당화하지 않습니다

펌프 교정과 혼합 대기는 전달된 부피를 관찰값이 안정되는 시점과 분리했습니다. 다음 질문은 지금 추가 투입이 허가되는지 여부입니다. 혼합 중의 낮은 측정값, 오래된 샘플, 정지된 순환만으로는 그 허가가 확립되지 않습니다.

이 가이드는 별도의 운영 상태와 부피, 시도 횟수, 관찰값에 대한 점검을 갖춘 교육용 설계를 제안합니다. 모든 값과 입력은 가상값이며, 운전 한도나 비료 권장값이 아닙니다. Python 예제는 인가 게이트만을 재현하며 펌프를 조작하지 않습니다.

후보값을 계산한 뒤 실행 가능 여부를 판단하십시오

탱크 회계에서 도출된 후보값도 교정 범위, 장비 상태, 이전 조작을 평가할 수 있는 관찰값에 대한 점검이 여전히 필요합니다.

UGA의 주입기 가이드는 정기적인 교정 및 유지 관리를 설명합니다. OSU의 영양 관리 가이드는 평가 전에 교반과 안정된 측정값을 요구합니다. 아래의 상태와 한도는 두 출처가 제공한 제어기 사양이 아니라 이 글이 제안하는 설계입니다.

여섯 가지 운영 상태를 분리하십시오

상태 활동 전환 조건
CHECK 관찰값, 후보값, 남은 예산, 장비를 검증 DOSE 전에 예약을 기록; 목표가 이미 충족되었으면 DONE으로
DOSE 고유한 조작 ID로 하나의 명령을 발행 WAIT 전에 정지를 확인; 시간 초과나 유량 불일치는 FAULT로
WAIT 새로운 추가를 금지하고 정지 이후 관찰값을 수집 조건을 만족하는 관찰값은 REVIEW로; 기한 내 안정화 실패는 FAULT로
REVIEW 관찰값과 이력을 재평가 충족되면 DONE, 새 후보가 정당하면 CHECK, 불일치는 FAULT
DONE 출력을 정지 상태로 유지하고 기록을 마감 이후의 조작에는 새로운 운영 결정이 필요
FAULT 정지를 요청하고 추가 투입을 금지 원인, 전달된 양, 장비를 확인한 뒤 명시적으로 복구

정지 명령을 내리는 것과 유량이 정지되었음을 확인하는 것은 다릅니다. 소프트웨어 상태 이름만으로는 밸브나 펌프의 고장을 막을 수 없습니다. 구현체에는 출력 피드백, 장비 측 정지 메커니즘, 정의된 재시작 동작도 필요합니다.

FAULT가 짧은 대기 후 자동으로 CHECK로 돌아가게 만들지 마십시오. 원인을 해결하지 않고 조작을 반복하면 의도하지 않은 추가가 누적될 수 있습니다.

명령을 발행하기 전에 예산을 충전하십시오

예시로 1회 추가당 16–20 mL, 운영 세션당 50 mL, 최대 세 번의 인가라는 한도를 사용합니다. 16 mL 최솟값은 이전 글의 10초 가상 교정에 대응합니다. 이 숫자들은 장비 설정값이 아닙니다.

이미 충전된 부피 B [mL]와 후보값 d [mL]에 대해 다음이 필요합니다.

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

인가 시점에 명령으로 넘어가기 전에 B\leftarrow B+d와 n\leftarrow n+1을 기록하십시오. 이 장부는 소진된 인가 용량을 나타낼 뿐, 측정된 전달량이 아닙니다. 명령 직후 통신이 끊기더라도 전달량을 0으로 가정하고 그 용량을 환불하지 마십시오. 측정된 전달량과 불확실한 전달량은 별도로 기록하십시오.

가상 조작 후보값 결정 이후 누적 충전량 결과
첫 번째 16 mL 16 mL 허가
두 번째, 정지·혼합·검토 이후 16 mL 32 mL 허가
세 번째, 검토 이후 18 mL 50 mL 허가
네 번째 16 mL 50 mL 거부: 시도 한도

32 mL를 충전한 상태에서의 20 mL 요청은 시도 횟수가 남아 있더라도 52 mL에 도달하게 되므로 거부됩니다. 남은 용량에 맞춰 투입량을 자동으로 잘라내는 대신 관찰값과 후보값의 근거를 재검토하십시오.

여기서 세션이란 기록된 시작과 종료를 가진 하나의 교정 시퀀스를 의미합니다. 루프 반복, 페이지 새로고침, 재접속은 새로운 세션이 아닙니다. 실제 시스템에는 정의된 시간 창이나 탱크 교체와 같은 명시적인 예산 갱신 조건, 그리고 재시작 후에도 남아 있는 기록이 필요합니다. 이 예제에는 영속성이 없습니다.

신선도와 안정성을 별도로 점검하십시오

수신 시각만으로는 신선도가 확립되지 않습니다. 원본 측정 시각, 시계 동기화, 조작에 대한 상대적 순서를 고려하십시오. 여기서 age_s는 이미 변환된 측정 경과 시간이며 0초에서 5초 사이일 때만 허용됩니다. 미래 타임스탬프로 인한 음의 경과 시간도 거부됩니다.

after_stop은 관찰값이 이전 정지의 확인 이후에 얻어졌음을 의미합니다. 첫 번째 추가에서는 현재 사전 점검이 시작된 이후에 얻어진 관찰값을 사용하십시오. stable은 이전 가이드에서 논의한 것처럼 일련의 관찰값을 바탕으로 한 상위 단계의 판단입니다. 변화가 없는 단일 값 하나만으로는 안정성이 확립되지 않습니다. 결측 데이터, 고착된 센서, 위치 간 불일치를 평가하십시오.

5초는 교육용 가정입니다. 샘플링 간격 및 통신 지연과 맞지 않는 한도는 유용한 관찰값을 거부할 수 있습니다. 단순히 한도를 늘리는 것으로는 오래된 데이터 문제가 해결되지 않습니다.

Python으로 인가 게이트를 시도해 보십시오

dosing_gate.py로 저장하고 python3 dosing_gate.py를 실행하십시오. 표준 라이브러리만 필요합니다.

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"

처음 세 결정은 ALLOW이고 네 번째는 ATTEMPTS입니다. 충전 누적량은 16, 32, 50, 50 mL입니다. 각 반복의 끝에서 시연용 상태를 CHECK로 재설정하는 것은 정지, 혼합, 재평가가 가상으로 성공했음을 나타냅니다. 구현체는 고정된 타이머가 만료되었다는 이유만으로 그 전환을 실행해서는 안 됩니다.

이 함수는 숫자 인수를 받는 오프라인 교육용 게이트입니다. 통신 입력을 파싱하거나, 투입량을 계산하거나, 안정성을 확립하거나, 실제 유량을 모니터링하거나, 상태 기계를 실행하지 않습니다. NaN, 무한대, 음의 충전 부피, 잘못된 시도 횟수를 거부하지만 완전한 외부 입력 API는 아닙니다.

거부 경계를 시험해 보십시오

입력 또는 상황 예상 결과
WAIT 상태에서 새로운 후보값이 도착 STATE; 추가 예산 충전이나 명령 없음
경과 시간이 6초이거나 음수 STALE
관찰값이 정지보다 앞서거나 불안정함 STALE 또는 UNSTABLE
순환 정지 또는 비정상 수위 INTERLOCK
후보값이 15 또는 21 mL DOSE_RANGE
32 mL 충전 이후 20 mL 요청 BUDGET
후보값 또는 충전량이 NaN INVALID

구현체는 조작 ID를 재전송했을 때 두 번 실행되지 않음도 테스트해야 합니다. 경쟁하는 요청들이 동일한 남은 용량을 동시에 소비하지 못하도록 예산 변경과 조작 ID를 함께 커밋하십시오. 중단 이후에는 재개하기 전에 영속화된 명령을 실제 장비 상태와 대조하여 정합성을 확인하십시오.

이것이 확립하는 것

이 예제는 제공된 입력과 한도에 대해 인가 결정을 점검합니다. EC로부터 개별 성분의 부족을 추론하거나 pH 차이로부터 산의 양을 추론하지 않습니다. 또한 생장, 수확량, 장비 안전, 농도 추적을 검증하지도 않습니다.

이제 회계, 전달 교정, 혼합 평가, 인가의 역할이 서로 연결되었습니다. 측정된 장비 로그를 이용한 검증은 아직 남아 있습니다. 다음으로는 NFT, DWC, 드립과 같은 생산 시스템을 통한 물 경로를 다루며, 여기서 탱크와 뿌리의 관계가 달라집니다.

What to read next

EC, pH, 성분 질량의 차이를 복습합니다.CEA 센싱 및 이미지 추정 — 센서 배치와 투영 잎 면적Continue the seriesCEA 물 경로와 다단 수리학 — NFT, DWC, 드립, 수두 균형Explore another aspect of this fieldCEA 아쿠아포닉스 — 어류, 미생물, 식물을 위한 수질 경계