# Edge detector
Wykrywa zbocza narastające, opadające lub oba na wejściu logicznym i generuje impuls wyjściowy o konfigurowalnym czasie trwania.
Edge detector
I
O
# Wejścia
| ID | Skrót | Nazwa | Typ | Domyślnie | Opis |
|---|---|---|---|---|---|
input | I | Wejście | BOOLEAN | false | Sygnał logiczny monitorowany pod kątem zmian zbocza. |
# Wyjścia
| ID | Skrót | Nazwa | Typ | Domyślnie | Opis |
|---|---|---|---|---|---|
output | O | Wyjście | BOOLEAN | false | Impuls wyjściowy. Aktywny przez skonfigurowany czas po wykryciu zbocza. |
# Konfiguracja
| ID | Nazwa | Typ | Domyślnie | Jednostka | Opis |
|---|---|---|---|---|---|
direction | Kierunek | ENUM | 0 | Rodzaj wykrywanego zbocza. Narastające wykrywa przejście z false na true, opadające z true na false, oba wykrywają każdą zmianę. Szczegóły: Wartości: Rising, Falling, Both | |
pulse_duration | Czas trwania impulsu | NUMBER | 0.1 | s | Czas trwania impulsu wyjściowego generowanego przy każdym wykrytym zboczu. Szczegóły: > 0 |
startup_delay | Opóźnienie startowe | NUMBER | 0 | s | Czas po uruchomieniu systemu, w którym wykrywanie zboczy jest wstrzymane. Zapobiega fałszywym wyzwoleniom podczas inicjalizacji urządzeń peryferyjnych. Ustaw 0 aby wyłączyć. Szczegóły: ≥ 0 |
# Stan
| ID | Nazwa | Typ | Domyślnie | Jednostka | Opis |
|---|---|---|---|---|---|
prev_input | Poprzedni stan wejścia | BOOLEAN | false | Przechowuje poprzedni stan wejścia do wykrywania zmian. | |
initialized | Zainicjalizowany | BOOLEAN | false | Śledzi czy blok otrzymał co najmniej jedno zdarzenie wejściowe. Pierwsze zdarzenie ustala punkt odniesienia bez wyzwalania detekcji zbocza. |
# Kod źródłowy
Pokaż kod Volang
channel = input::channel()
value = input::value()
extern fn onPulseEnd() {
output::set("output", false)
}
if (channel == "input") {
prev_input = state::get("prev_input")
initialized = state::get("initialized")
if (!initialized) {
state::set("prev_input", value)
state::set("initialized", true)
return
}
startup_delay = config::get("startup_delay")
if (startup_delay > 0 and time::uptime() < startup_delay) {
state::set("prev_input", value)
return
}
direction = config::get("direction") // 0=Rising, 1=Falling, 2=Both
edge_detected = false
if (direction == 0) {
edge_detected = value and !prev_input
} else if (direction == 1) {
edge_detected = !value and prev_input
} else {
edge_detected = (value and !prev_input) or (!value and prev_input)
}
state::set("prev_input", value)
if (edge_detected) {
callback::clear()
output::set("output", true)
pulse_ms = math::round(config::get("pulse_duration") * 1000)
callback::set(pulse_ms, "onPulseEnd")
}
}
