# Edge detector

Przetwarzanie

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

IDSkrótNazwaTypDomyślnieOpis
inputIWejścieBOOLEANfalseSygnał logiczny monitorowany pod kątem zmian zbocza.

# Wyjścia

IDSkrótNazwaTypDomyślnieOpis
outputOWyjścieBOOLEANfalseImpuls wyjściowy. Aktywny przez skonfigurowany czas po wykryciu zbocza.

# Konfiguracja

IDNazwaTypDomyślnieJednostkaOpis
directionKierunekENUM0Rodzaj 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_durationCzas trwania impulsuNUMBER0.1sCzas trwania impulsu wyjściowego generowanego przy każdym wykrytym zboczu.

Szczegóły:

> 0
startup_delayOpóźnienie startoweNUMBER0sCzas 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

IDNazwaTypDomyślnieJednostkaOpis
prev_inputPoprzedni stan wejściaBOOLEANfalsePrzechowuje poprzedni stan wejścia do wykrywania zmian.
initializedZainicjalizowanyBOOLEANfalseŚ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")
    }
}
Wykrywa zbocza narastające, opadające lub oba na wejściu logicznym i generuje impuls wyjściowy o konfigurowalnym czasie trwania.