TIAN Industrial Automation
EN
All articles

Digitale Eingänge entprellen, ohne deine SPS zu belügen

Mechanische Kontakte prellen. Wer einer rohen Eingangsflanke vertraut, zählt einen Tastendruck als fünf. So entprellst du in der SPS-Logik — richtig, mit Zahlen, die du verteidigen kannst.

Ein Endschalter schließt. Etwa 10 Millisekunden lang schließt der Kontakt nicht, sondern streitet mit sich selbst — offen, geschlossen, offen, geschlossen — bevor er sich beruhigt. Deine SPS scannt schnell genug, um jedes dieser Prellen zu sehen. Also registriert der Teil, der eine Erkennung melden sollte, vier. Der Zähler driftet, und drei Wochen später kommt ein Ticket: „Zählwert ist manchmal falsch.”

Das ist der häufigste Fehler, zu dem ich gerufen werde, der gar keiner ist. Es ist Physik, und du musst dafür konstruieren.

Wie Prellen wirklich aussieht

Hier das Signal, das du zu bekommen glaubst, gegen das, was die Hardware liefert:

Zeitdiagramm: oben ein prellender Roheingang, unten ein sauberes entprelltes Signal, getrennt durch ein Entprellfenster t_d

Die obere Kurve ist der Roheingang — saubere Absicht, hässliche Realität. Die untere ist, was du willst: ein einziger, stabiler Übergang, der sich erst festlegt, wenn das Signal seinen neuen Zustand für ein Entprellfenster t_d gehalten hat.

Ein Entprell-Timer macht das Signal nicht sauberer. Er bringt deine Logik dazu, dem Signal nicht zu glauben, bis es aufgehört hat zu lügen.

Wähle eine Entprellzeit, die du verteidigen kannst

Kopiere nicht t_d = 50ms aus einem Forenbeitrag. Miss es oder schlag es nach, dann gib Reserve dazu.

KontakttypTypisches PrellenSinnvolles t_d
Sprungschalter (Endlage)1–5 ms10–20 ms
Drucktaster (Panel)5–20 ms30–50 ms
Relaiskontakt1–10 ms20 ms
Reed-Schalterbis 1 ms5–10 ms

Die Regel: t_d muss länger als das schlimmste Prellen sein, aber kürzer als das schnellste echte Ereignis, das du erfassen musst. Schreib beide Zahlen auf, bevor du einen Timer wählst.

Das Muster in strukturiertem Text

Ein einschaltverzögerter Timer (TON), der vom Eingang gesteuert wird. Der Ausgang wird erst wahr, wenn der Roheingang t_d lang durchgehend wahr war:

// Einen einzelnen Digitaleingang entprellen.
debounceTimer(IN := (xRaw <> xStable), PT := tDebounce);

IF debounceTimer.Q THEN
    xStable := xRaw;     // Zustand lange genug gehalten — übernehmen
END_IF

xClean := xStable;

Der Timer läuft nur, solange der Roheingang vom übernommenen Zustand abweicht. Sobald sie wieder übereinstimmen — Prellen vorbei — setzt sich der Timer von selbst zurück.

Was dich trotzdem beißen wird

  1. Ein bereits sauberes Signal entprellen. Encoder-Kanäle und vernetzte E/A sind schon aufbereitet. Ein Timer fügt nur Latenz hinzu und verbirgt echte Fehler.
  2. Ein globales t_d für jeden Eingang. 50 ms Entprellung am Not-Halt ist ein Sicherheitsproblem. Stimme pro Signalklasse ab.
  3. Vergessen, dass der Timer pro Instanz ist. Instanziiere einen Timer pro Signal.

Die Ein-Zeilen-Version

Bestimme t_d aus dem schlimmsten Prellen und dem schnellsten echten Ereignis, entprelle beide Flanken, ein Timer pro Eingang — und entprelle nie ein Signal, das schon sauber war.