Auslesen eines nicht Interupt gesteuerten Encoders mit Schrittzeiten > Zykluszeit
Beispiele als schnelle Eingabemöglichkeit von mehrstelligen Zahlen über Encoderschalter (Bild1)
oder Positionsermittlung Spindelachse (Bild2) usw.
Störpulse:
Bei Störpulsen kommt es in kurzer Zeit zu einem Schritt vor und zurück (oder andersherum). Wenn die beiden Schritte zu schnell kommen, wird ggf. nur einmal die Auswertung aufgerufen. Dabei ist dann der alte und neue Wert gleich - so dass kein Schritt erfolgt.
Greycodeänderung
Vorwärts
00 vorher: 01
10 vorher: 00
11 vorher: 10
01 vorher: 11
Rückwärts
00 vorher: 10
01 vorher: 00
11 vorher: 01
10 vorher: 11
FUNCTION_BLOCK Encoder
(*
##################################################################################
Programmbeschreibung:
Auslesen eines Encoders/Drehgebers mit A+B Spur (90° versetzt) mit Richtungserkennung
Nicht Interuptgesteuert!
Funktioniert für Schrittzeiten > Zykluszeit
benötigt:
##################################################################################
Änderungsindex
Name: TL Datum: 18.03.19 Version: 0.1 Grund: neu
##################################################################################
*)
VAR_INPUT
Geber_A: BOOL; (*Spur A*)
Geber_B: BOOL; (*Spur B*)
END_VAR
VAR_OUTPUT
END_VAR
VAR
AB:BYTE; (*2Bit Grey*)
AB_alt:BYTE; (*2Bit Grey letzter Zyklus*)
END_VAR
VAR_IN_OUT
Pos: DINT; (*Positionswert*)
END_VAR
(*Spuren auf 2Bit Grey ablegen*)
AB.0 :=Geber_A;
AB.1 :=Geber_B;
(*hochzählen*)
IF (AB = 0 AND AB_alt = 1) OR (AB = 2 AND AB_alt = 0) OR (AB = 3 AND AB_alt = 2) OR (AB = 1 AND AB_alt = 3)
THEN Pos := Pos + 1;
END_IF
(*runterzählen*)
IF (AB = 0 AND AB_alt = 2) OR (AB = 1 AND AB_alt = 0) OR (AB = 3 AND AB_alt = 1) OR (AB = 2 AND AB_alt = 3)
THEN Pos := Pos - 1;
END_IF
(*Akt.Grey speichern*)
AB_alt := AB;
Have a lot of Fun!