Autor Thema: "langsame" Encoder auslesen  (Gelesen 11988 mal)

Offline radar17892

  • Sr. Member
  • ****
  • Beiträge: 788
  • Think easy!
    • mollgruppe
"langsame" Encoder auslesen
« am: März 24, 2019, 12:35:39 Nachmittag »
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!
Weil Einfach einfach Einfach ist!