hier mal ein Schnipsel aus einem Projekt, in dem ich genauso die Geschwindigkeit+Position bestimme:
Code:
(*aktuelle systemzeit bei pos. Flanke des Kettenradinis speichern und
Zeitdifferenz berechnen*)
IF
INI_kettenrad=TRUE AND flankenmerker_ini=FALSE
THEN
diff:=timelow-timeold;
timeold:=timelow;
tmr2.IN:=TRUE; (*Stillstandserkennung*)
ELSE
tmr2.IN:=FALSE;
END_IF;
flankenmerker_ini:=INI_kettenrad;
Dieser Schnipsel steht in einer schnelle Task. Ist natürlich nicht vollständig, ohne die Systemzeitfunktionen und Variablendeklaration.
In der (langsameren) Main-Task steht dann nur noch:
Code:
(************************************************************
geschwindigkeit berechnen*)
diff1:=UDINT_TO_REAL(diff);
speed_sbm:=(1000000/diff1)*60; (*takt/sec*)
(*********************************************************)
In diese Berechnung geht gleich die Zahnanzahl mit ein.
PS: Ich erfasse die Inkremente an einem Kettenrad, das durch die Kette getrieben wird. Da es eine Transportkette ist, habe ich hier ein durch das Produkt verursachtes Rucken mit entsprechendem Jitter im Signal. Also schliesst sich noch eine Konditionierung mittels Tiefpass und STAIR2-Funktion aus OSCAT an. Der Jitter fällt kleiner aus, wenn man am direkt angetriebenen Ritzel die Messung betreibt.
Bei mir synchronisiere ich auf diese Art und Weise zwei Maschinen und bin sehr zufrieden damit.
PPS: Hier handelt es sich um eine Periodendauermessung. Diese Art der Auswertung eignet sich nach meiner Erfahrung eher für Maschinen mit variablen Drehzahlen, die von nahe 0 bis zu moderaten Geschwindigkeiten arbeiten. Die Genauigkeit nimmt mit höheren Geschwindigkeiten ab, da Zyklusjitter und Signalverzögerung in der DI-Baugruppe dann stärker in die Messung eingehen. Für höhere Drehzahlen empfielt sich eine Frequenzmessung, also das Impulszählen mit fester Torzeit.
PPPS: Für die Auswahl des Verfahrens würde ich zum Taschenrechner raten. Ist die Zeit zwischen zwei Zähnen (Periode) größer als 10x Zykluszeit, dann Periodendauer. Ansonsten Frequenzzählung.