# Numeric throttle
Ogranicza częstotliwość zmian wartości numerycznej za pomocą progu minimalnej zmiany (martwa strefa) oraz okresu blokady (cooldown). Istotne zmiany, które nadejdą podczas blokady, są przekazywane na wyjście po jej zakończeniu.
Numeric throttle
V
V
# Wejścia
| ID | Skrót | Nazwa | Typ | Domyślnie | Opis |
|---|---|---|---|---|---|
value | V | Wartość | NUMBER | 0 | Surowa wartość numeryczna, np. z czujnika. |
# Wyjścia
| ID | Skrót | Nazwa | Typ | Domyślnie | Opis |
|---|---|---|---|---|---|
value | V | Wartość | NUMBER | 0 | Wartość wyjściowa po ograniczeniu. Aktualizowana tylko gdy zmiana przekracza próg minimalny i okres blokady upłynął. |
# Konfiguracja
| ID | Nazwa | Typ | Domyślnie | Jednostka | Opis |
|---|---|---|---|---|---|
min_change | Minimalna zmiana | NUMBER | 0 | Minimalna bezwzględna różnica od ostatniej wartości wyjściowej wymagana do przepuszczenia nowej wartości. Ustaw 0, aby wyłączyć filtrowanie martwej strefy. Szczegóły: ≥ 0 | |
discard_period | Okres blokady | NUMBER | 0 | s | Okno blokady w sekundach po każdym wyjściu, podczas którego nowe wartości są pomijane. Ustaw 0, aby wyłączyć ograniczanie czasowe. Szczegóły: ≥ 0 |
# Stan
| ID | Nazwa | Typ | Domyślnie | Jednostka | Opis |
|---|---|---|---|---|---|
discarding | Blokowanie | BOOLEAN | false | Czy blok jest obecnie w oknie blokady. |
# Kod źródłowy
Pokaż kod Volang
channel = input::channel()
value = input::value()
extern fn onCallback(v) {
state::set("discarding", false)
min_change = config::get("min_change")
discard_ms = math::round(config::get("discard_period") * 1000)
current_input = input::get("value")
current_output = output::get("value")
diff = math::abs(current_input - current_output)
if (diff > 0 and diff >= min_change) {
output::set("value", current_input)
if (discard_ms > 0) {
state::set("discarding", true)
callback::set(discard_ms, "onCallback", 0)
}
}
}
if (channel == "value") {
discarding = state::get("discarding")
if (discarding) {
return
}
min_change = config::get("min_change")
discard_ms = math::round(config::get("discard_period") * 1000)
current_output = output::get("value")
diff = math::abs(value - current_output)
if (diff >= min_change) {
output::set("value", value)
if (discard_ms > 0) {
state::set("discarding", true)
callback::clear()
callback::set(discard_ms, "onCallback", 0)
}
}
}
