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:
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.
| Kontakttyp | Typisches Prellen | Sinnvolles t_d |
|---|---|---|
| Sprungschalter (Endlage) | 1–5 ms | 10–20 ms |
| Drucktaster (Panel) | 5–20 ms | 30–50 ms |
| Relaiskontakt | 1–10 ms | 20 ms |
| Reed-Schalter | bis 1 ms | 5–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
- 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.
- Ein globales
t_dfür jeden Eingang. 50 ms Entprellung am Not-Halt ist ein Sicherheitsproblem. Stimme pro Signalklasse ab. - 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.