Auf Encoder-Schwellwert triggern

Guenne

Level-1
Beiträge
8
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe einen Messtaster an eine Inkrementalencoder-Klemme angeschlossen, und als Steuerung Beckhoff TwinCAT 3.
Der Wert vom Messtaster stellt sich mir in TwinCAT als Integer dar, z.B. 32767 entspricht 10mm.
Nun möchte ich beim Überschreiten einer Schwelle möglichst zeitlich sofort eine Aktion ausführen.
Wie programmiere ich das am besten?
Schreibe ich z.B. IF (Messtaster value = 200) THEN ...
klappt das i.d.R. nicht, da je nach Zykluszeit und Abtastung des Werts dieser nie exakt auf dem Schwellwert steht.
Beholfen habe ich mir mit: IF (Value > Schwelle) AND (Value < Schwelle+x) THEN ...
das tut erstmal (im Rahmen der Genauigkeit), gefällt mir aber nicht so..
Noch schwieriger wird es wenn ich nur auf die steigende Flanke reagieren will, der Wert also zunächst unter die Schwelle kommen muss.
 
Beholfen habe ich mir mit: IF (Value > Schwelle) AND (Value < Schwelle+x) THEN ...
das tut erstmal (im Rahmen der Genauigkeit), gefällt mir aber nicht so..
Noch schwieriger wird es wenn ich nur auf die steigende Flanke reagieren will, der Wert also zunächst unter die Schwelle kommen muss.
Statt "IF (Value > Schwelle) AND (Value < Schwelle+x) THEN ..." einfach "IF Value > Schwelle THEN ..." nehmen.
Was stört Dich an "... der Wert also zunächst unter die Schwelle kommen muss."?
Das muss er doch sowieso, wenn Du den MessTaster nicht kaputtfahren willst?
Oder habe ich die Aufgabe falsch verstanden?
Eigene, schnellere Task verwenden?

PS:
Du könntest Dir den Wert abspeichern, bei dem Deine Abfrage wirksam wurde, wenn Du nachvollziehen möchtest, welche Fälle auftreten können.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo und Danke!
Also der Encoder-Wert vom Messtaster bewegt sich periodisch auf und ab, von 0 bis 32767.
Sobald er 200 überschreitet, will ich ein Ereignis auslösen, aber nur wenn er von unten kommt.
Schreibe ich nur IF (Value = Schwelle), dann läuft er mir über die Schwelle ohne sie zu erkennen, wenn der Wert zum Zeitpunkt der Abfrage nicht zufällig exakt auf der Schwelle stand.
Schreibe ich IF (Value > Schwelle), dann ist die Bedingung auch wahr, wenn er schon oben steht, oder von oben kommt, d.h. er wird mir zyklisch (bei jedem Aufruf) auslösen.
Gut, da könnte ich was drum herum programmieren und irgendwie verriegeln... wenn's nicht schöner geht?
Zyklische Programmierung ist etwas neu für mich, aber wenn das so sein muss bzw. so üblich ist, dann mache ich es halt so.
Beispiel: IF (Value > 200) AND (Value < 205) THEN ... würde also funktionieren, und wäre mit einer schnellen Task auch relativ genau, d.h. es müsste spätestens bei 201 oder 202 die Bedingung erfüllen. Etwas Verzögerung ist halt drin, je nachdem wie schnell die Werte reinkommen. Das war ja mein ursprüngliches Problem, dass ich nicht exakt die Schwelle angeben kann. Nun mach ich es so. Fehlt nur noch die Unterscheidung auf steigende Werte, denn das Beispiel würde auch auf fallende Werte reagieren, also von oben kommend ab 204.
 
Wenn Du sowieso noch eine Verriegelung auf "nur wenn von unten kommt" machst, dann reicht die Abfrage "IF (Value > Schwelle)" - Du brauchst dann kein "AND (Value < 205)"

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also der Encoder-Wert vom Messtaster bewegt sich periodisch auf und ab, von 0 bis 32767.
Sobald er 200 überschreitet, will ich ein Ereignis auslösen, aber nur wenn er von unten kommt.
Code:
HöheErreicht := (MesswertAlt < Messwert) AND (Messwert > Schwelle) ;
Ereignis := HöheErreicht AND NOT HöheErreichtAlt ;
MesswertAlt := Messwert ;
HöheErreichtAlt := HöheErreicht ;
MesswertAlt und HöheErreichtAlt: statisch (nicht temporär!)
 
Weil ich die doppelte Wirksamkeit nicht verstehe. HöheErreicht ist doch schon ein Trigger.
Deine Lösung ist zweifelsfrei kompakter, direkter und raffinierter, da sie ohne einen boolschen FlankenMerker auskommt.
Hätte ich Deinen Beitrag rechtzeitig entdeckt, hätte ich mir meinen erspart.
"HöheErreicht" ist aber kein Impuls, sondern das Signal, dessen positive Flanke erst noch detektiert werden muss. Es bleibt anstehen, solange noch weiter aufwärts gefahren wird.
Wahrscheinlich habe ich Dich mit der Benennung des Bits irritiert - ich hätte es "MessTasterFährtAufwärtsOberhalbDerSchwelle" nennen sollen.
Wie man es letztendlich programmiert, hängt sicherlich auch davon ab, welche ZwischenErgebnisse jeweils anfallen und noch anderweitig ausgewertet werden sollen ...
Meine Variante triggert auch beim Umschalten der FahrtRichtung auf aufwärts bei einer beliebigen Position oberhalb der Schwelle.
Wahrscheinlich habe ich die Abneigung des TE gegen ein UnterschreitenMüssen der Schwelle falsch interpretiert oder sie einfach zu ernst genommen?
 
Zurück
Oben