# Pulse counter
Zlicza impulsy zboczy narastających w górę i/lub w dół w konfigurowalnych limitach.
Pulse counter
I+
I-
R
V
UL
LL
# Wejścia
| ID | Skrót | Nazwa | Typ | Domyślnie | Opis |
|---|---|---|---|---|---|
increment | I+ | Inkrementuj | BOOLEAN | false | Wejście impulsowe. Każde zbocze narastające zwiększa licznik o 1. |
decrement | I- | Dekrementuj | BOOLEAN | false | Wejście impulsowe. Każde zbocze narastające zmniejsza licznik o 1. |
reset | R | Resetuj | BOOLEAN | false | Wejście impulsowe. Zbocze narastające resetuje licznik. |
# Wyjścia
| ID | Skrót | Nazwa | Typ | Domyślnie | Opis |
|---|---|---|---|---|---|
value | V | Wartość | NUMBER | 0 | Bieżąca wartość licznika. |
at_upper_limit | UL | Przy górnym limicie | BOOLEAN | false | Prawda gdy licznik równa się górnemu limitowi. |
at_lower_limit | LL | Przy dolnym limicie | BOOLEAN | false | Prawda gdy licznik równa się dolnemu limitowi. |
# Konfiguracja
| ID | Nazwa | Typ | Domyślnie | Jednostka | Opis |
|---|---|---|---|---|---|
start_value | Wartość początkowa | NUMBER | 0 | Początkowa wartość licznika. Szczegóły: ≥ lower_limit≤ upper_limit | |
lower_limit | Dolny limit | NUMBER | 0 | Minimalna wartość licznika. Szczegóły: < upper_limit | |
upper_limit | Górny limit | NUMBER | 1000 | Maksymalna wartość licznika. Szczegóły: > lower_limit | |
overflow_mode | Tryb przepełnienia | ENUM | 0 | Zachowanie przy osiągnięciu limitu. Szczegóły: Wartości: Clamp, Wrap |
# Stan
| ID | Nazwa | Typ | Domyślnie | Jednostka | Opis |
|---|---|---|---|---|---|
prev_increment | Poprzedni stan inkrementacji | BOOLEAN | false | Przechowuje poprzedni stan wejścia inkrementacji. | |
prev_decrement | Poprzedni stan dekrementacji | BOOLEAN | false | Przechowuje poprzedni stan wejścia dekrementacji. | |
prev_reset | Poprzedni stan resetu | BOOLEAN | false | Przechowuje poprzedni stan wejścia resetu. |
# Kod źródłowy
Pokaż kod Volang
channel = input::channel()
value = input::value()
// Handle "reset" input first (dominant input)
if (channel == "reset") {
prev_reset = state::get("prev_reset")
if (value and !prev_reset) {
// Rising edge on reset - restore start value
start_value = config::get("start_value")
output::set("value", start_value)
output::set("at_upper_limit", start_value == config::get("upper_limit"))
output::set("at_lower_limit", start_value == config::get("lower_limit"))
}
state::set("prev_reset", value)
return
}
// Handle "increment" input
if (channel == "increment") {
prev_increment = state::get("prev_increment")
if (value and !prev_increment) {
// Rising edge on increment
current = output::get("value")
upper_limit = config::get("upper_limit")
lower_limit = config::get("lower_limit")
overflow_mode = config::get("overflow_mode") // 0=Clamp, 1=Wrap
if (current < upper_limit) {
current = current + 1
} else if (overflow_mode == 1) {
// Wrap around to lower limit
current = lower_limit
}
// else: Clamp - no change
output::set("value", current)
output::set("at_upper_limit", current == upper_limit)
output::set("at_lower_limit", current == lower_limit)
}
state::set("prev_increment", value)
return
}
// Handle "decrement" input
if (channel == "decrement") {
prev_decrement = state::get("prev_decrement")
if (value and !prev_decrement) {
// Rising edge on decrement
current = output::get("value")
upper_limit = config::get("upper_limit")
lower_limit = config::get("lower_limit")
overflow_mode = config::get("overflow_mode") // 0=Clamp, 1=Wrap
if (current > lower_limit) {
current = current - 1
} else if (overflow_mode == 1) {
// Wrap around to upper limit
current = upper_limit
}
// else: Clamp - no change
output::set("value", current)
output::set("at_upper_limit", current == upper_limit)
output::set("at_lower_limit", current == lower_limit)
}
state::set("prev_decrement", value)
return
}
