TIA Geschwindigkeitserfassung

michi*

Level-2
Beiträge
100
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Abend,

ich habe die Suche bemüht, jedoch komm ich nicht wirklich zurecht.
Daher frag ich hier nocheinmal

Ich habe eine 1214 CPU und einen Drehgeber angeschlossen.
A Spur an 0.0 und B Spur an 0.. Auch den HSC_1 eingerichtet "Zählen", klappt auch alles Wunderbar.

Jetzt würde ich gerne über diesen Drehgeber auch die aktuelle Geschwindigkeit ermitteln und an meinem KTP anzeigen.
Da ich ja keinen 2ten HSC mit dem gleichen Eingang Füttern kann und einfach auf "Frequenz" Messung umstellen kann, muss ich einen Umweg gehen.

Mein Sensor hat eine auflösung von 1024 Impulsen,
Antriebsrad Duchmesser von 800mm, macht einen Umfang von Rund 2,5m ( 0.8x 3,14)
Ein Impuls entspricht dann also ca 2,4mm.

Ich will jetzt
- mit der Positive Flanke von einem 1Hz Takt, den aktuellen Drehgeber in einen Zwischenspeicher 1 schieben
- mit der negativen Flanke von dem 1Hz Takt, den aktuellen Drehgeber in einen Zwischenspeicher 2 schieben.

Zwischenspeicher 1 vom zwischenspeicher 2 abziehen und in Zwischenspeicher 3 Schieben.
Das ganze entsprechend verrechnen, dann kenn ich ja die Strecke die in einer Sekunde zurück gelegt wird.
Umgerechnet, fertig.


Nun hab ich aber das Problem das z.B. der Zwischenspeicher 1 neu gefüttert wird und bis der zweite neu gefüttert wird, der Wert natürlich nicht stimmt.
Wie bekomm ich das hin, dass immer nur ein neuer Geschwidigkeits Wert geschrieben wird wenn die Erfassung von Wert 1 und 2 und das Rechnen abgeschlossen ist?
Versteht ihr mein Problem und habt vll einen Ansatz?

Michi
 
Siemens ist bi mir schon 'ne kleine Weile her. Ich glaube der Weck-OB ist der OB 50.
In den schreibst Du den Code für das zyklische HSC-auslesen. Das wird vermutlich genauer als Dein Taktmerker-Versuch.
Der Weckalarm wird auf sagen wir mal 100ms parametriert.

Im OB50
1. Schritt
Den gemerkten Zählerwert aus dem letzten Zyklus umkopieren in eine andere Variable.

2. Schritt
Den HSC-Zählerwert auslesen und speichern

3. Schritt
Subtraktion neuer Wert - alter Wert = Differenz
Dabei Zählerüberlauf beachten.

Differenz ist an der Stelle alles was berechnet wird. Hast Du eine niedrige Programmauslastung oder großzügige Weckzyklen, kannst Du das weitere auch hier berechnen. Ich verschiebe weitere Berechnungen in den Programmzyklus, wo es hingehört.

Also im zyklischen Programm jetzt den Differenzwert aufrufen und nach gusto in Gecshwindigkeit umrechnen.

Zu Deinem oben genannten Problem: Die Berechnungen darfst Du dann natürlich auch nur einmal je Taktmerkerzyklus machen, wenn Du bei der Berechnung die Ursprungswerte veränderst. Ein auslesen von zusammengehörenden Werten mit einem zeitlichen Abstand (pos. Fl - neg. Fl) ist unschön. In Deinem Beispiel müsstest Du oben genannte Schritte nacheinander in der Reihenfolge mit der positiven Flanke ausführen. Dadurch hast Du immer konsistente Werte.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich will jetzt
- mit der Positive Flanke von einem 1Hz Takt, den aktuellen Drehgeber in einen Zwischenspeicher 1 schieben
- mit der negativen Flanke von dem 1Hz Takt, den aktuellen Drehgeber in einen Zwischenspeicher 2 schieben.

Zwischenspeicher 1 vom zwischenspeicher 2 abziehen und in Zwischenspeicher 3 Schieben.
Das ganze entsprechend verrechnen, dann kenn ich ja die Strecke die in einer Sekunde zurück gelegt wird.
Umgerechnet, fertig.

Der Ansatz mit der "konstanten Abtastzeit" von 1 Hz ist grundsätzlich schon richtig.
Erster Ansatz:
Berechne Zwischenspeicher 3 ebenfalls bei der negativen Flanke des 1 Hz Taktes neu (gleich eine Zeile nach dem zu Zwischenspeicher 2 aktualisiert hast).
Code:
IF (#FL_POS_1Hz) THEN
  #Zs1 := #Istwert;
ELSIF (#FL_NEG_1Hz) THEN
  #Zs2 := #Istwert;
  #Zs3 := (#Zs2 - #Zs1)/0.5;
END_IF;
#Geschwindigkeit := #Zs3;

Dabei wird allerdings nur die 500 ms lange High-Phase des Taktes genutzt. Eleganter wird das ganze, wenn du bei beiden Taktflanken die Geschwindigkeit akktualisierst.

Code:
IF (#FL_POS_1Hz) THEN
  #Zs1 := #Istwert;
  #Zs3 := (#Zs1 - #Zs2)/0.5;
ELSIF (#FL_NEG_1Hz) THEN
  #Zs2 := #Istwert;
  #Zs3 := (#Zs2 - #Zs1)/0.5;
END_IF;
#Geschwindigkeit := #Zs3;

Damit bekommst du alle 500 ms einen Geschwindigkeitswert. Das ganze nennt sich Rückwärtsdifferenzenquotient und kann hier (https://de.wikipedia.org/wiki/Differenzenquotient#R.C3.BCckw.C3.A4rtsdifferenzenquotient) nachgelesen werden.

Beide Methoden haben den Nachteil, dass in der ersten Sekunde der Geschwindigkeitswert ungültig ist, aber für eine reine Anzeige ist das ziemlich egal.

lg
 
Subtraktion neuer Wert - alter Wert = Differenz
Dabei Zählerüberlauf beachten.

Werden "alter Wert" und "neuer Wert" als Ganzzahlen gespeichert, also als Geberrohwerte, dann muss man sich über einen Überlauf bei der Diffferenzenbildung keine Gedanken machen. z.B.
Code:
// alle Variablen sind vom Typ INT
#a := 16383      // positivste zahle 2^15-1
#b := -16384     // negativste Zahl -2^16
#c := b-a;        // Differenz bilden

Das Ergebnis für #c = 1. Das funktioniert natürlich bei 32bit und 64bit Ganzzahlen genauso.

lg
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielen Dank.
Ich werde das morgen mal ausprobieren. Ich hab das ganze mal im FUP probiert.
Mit dem Weckalarm muss ich mich nochmal einlesen.
Mal sehen ob es funktioniert.

schönen Abend
Geschwindigkeitsberechnung_1.jpg
Geschwindigkeitsberechnung_2.jpg
 
Leute, ich verstehe nicht, warum Ihr da was bei positiven und negativen Flanken macht.
Auf einer Flanke auswerten reicht völlig aus, Ihr müsst nur die Reihenfolge beachten.

Code:
IF (#FL_POS_1Hz) THEN
  #Zs1 := #Istwert;
  #Geschwindigkeit := (#Zs1 - #Zs2);
  #Zs2 := #Zs1;
END_IF;

Gruß
Erich
 
@michi*
Da sind gleich mehrere Fehler drin.
z. B. darfst Du für Variablen, die im nächsten Zyklus den Wert des letzten Zyklus haben sollen, keine Temp-Variablen verwenden.
Außerdem hast du bei Verwendung eines 2-Hz Taktes und Auswertung auf beiden Flanken eine Messzeit von 0,25 Sekunden, war das beabsichtigt?
Vorschlag: Setz meine fünf Zeilen in FUP um, dann klappts.
 
Bloß hat's der TE nicht verstanden, wie Du an seinem FUP-Beispiel siehst.
Aber ich arbeite dran :)

Vielen Dank für euren Input.

Mit den 2Hz, da hab ich irgedwie gepennt.
Mit den Variablen Temp, hab ichs geändert.

Hab jetzt den Code vom Erich benutzt aber
Code:
#Zs2 := #Zs1;
umgedreht, glaub ich.

Es fuktioniert jetzt jedenfalls,
NW1_speed.jpgNW2_speed.jpgDB_speed.jpg

Vielen Dank
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hab jetzt den Code vom Erich benutzt aber
Code:
#Zs2 := #Zs1;
umgedreht, glaub ich.
Nö, das stimmt schon so, und Du hast es ja auch so programmiert.
Es fuktioniert jetzt jedenfalls,
Schön, noch eine Bemerkung:
Statisch muss #Zs2 sein, weil hier die alte Position für den nächsten Zyklus gespeichert wird, bei den andern Variablen sollte es egal sein.
Gruß
Erich
 
Zurück
Oben