TIA Takt generieren aus Zähler

Invisible

Well-known member
Beiträge
48
Punkte Reaktionen
1
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo zusammen,

Stehe gerade vor folgendem Problem. Meine "Anlage" (Kleiner Prüfaufbau) besteht aus einer Seiltrommel und einem Sensor der den Durchmesser des Seiles messen soll.
An der Welle der Seiltrommel ist ein Absolutwert-Encoder befestigt, dieser gibt mir die Länge des ausgezogenen Seils aus. Ist das Seil komplett aufgewickelt hat der Encoder Wert 0, ist das Seil auf 1m ausgefahren hat der Encoder z.B. den Wert 19805.

Mein Ziel ist es unabhängig davon wie viele Meter des Seiles ich ausziehe, alle 0,5cm den Durchmesser und die Länge des Seils zu speichern.
Um das Ergebnis sauber ablegen zu können, habe ich einen Datentyp "Messergebnisse" erstellt, und dann ein Array erstellt.

Array.PNG

Da ich aber nie so genau weiß wie viele Meter ich vom Seil ausziehen soll, kann ich ja auch keine feste Größe des Arrays definieren, kann ich diese Größe variabel gestalten?

Im weiteren, fehlt mir noch die richtige Speicher Aufforderung, wie kann ich der sps klar machen, wann sie die Ergebnisse speichern soll.
Mein erster Ansatz war es die Menge der benötigten Schritte für 0,5cm zu bestimmen, dann wollte ich mir mit folgendem Aufbau einen Takt generieren.
In der Variable AHM36 wird die aktuelle Position ausgegeben, die "100" ist die Anzahl der Schritte für 0,5 cm Seilauszug. Lässt sich die aktuelle Position ohne Rest durch 100 teilen, wäre der Takt für die Speicherung ja gegeben.

Taktbestimmung.PNG

Da die Lösung aber viel zu träge und auch nicht wirklich genau ist, hoffe ich auf eine passende Idee von euch.

Vielen Dank vorab!:cool:
 
Zuletzt bearbeitet:

Ingmar64

Well-known member
Beiträge
266
Punkte Reaktionen
36
Array geht nur mit festen Grenzen, im Rahmen des Arbeitsspeichers aber [-2 147 483 648..2 147 483 647] of <Datentyp
Die Modulo-Operation wird nur fehlerhaft 0 liefern, weil der entsprechende genaue Encoderwert einfach fast nie von der SPS gelesen werden wird (Zykluszeit!). Also besser DIV und auf Änderung überprüfen.
Der Index des Arrays könnte für ganze oder eben auch halbe Zentimeter stehen ...
 
OP
Invisible

Invisible

Well-known member
Beiträge
48
Punkte Reaktionen
1
Zuviel Werbung?
->Hier kostenlos registrieren
Danke für deine Antwort.
Wie prüf ich das am schlausten auf eine Änderung?
Ich will ja eine positive Flanke, wenn das Ergebnis der Division größer wird mir ist da gerade keine Funktion bewusst...
Gerne auch in SCl.
 

Ingmar64

Well-known member
Beiträge
266
Punkte Reaktionen
36
Den alten Wert in einer statischen Variablen merken und dann mit dem neuen vergleichen:
In SCL:

Wert := Encoder / 100;
Impuls := (Wert <> Alt);
Alt := Wert;
 
OP
Invisible

Invisible

Well-known member
Beiträge
48
Punkte Reaktionen
1
Code:
REGION Takt bestimmen
    (*
    Der Messseildurchmesser,soll alle 0,5cm gespeichert werden. = Gegeben: Anzahl der Schritte 100
    *)
   
    #Speichertakt := #Dint_MesswertEncoderUmdrehungen / 100;
    #Testtakt := (#Speichertakt <> #Alt);
    #Alt := #Speichertakt;
   
   
END_REGION

Hab das so mal probiert, aber dadurch wird mir ja kein Takt generiert, sondern nur ein Dauersignal das auf TRUE steht.
Irgendwie steh ich da gerade auf dem Schlauch.

Ich hab aktuell ja ein Signal des Encoders, welches mir alle 0.5 cm +1 rechnet.

0,5 cm = 1
1 cm = 2
1,5 cm = 3 usw....

Ich muss nun aus diesen Zahlen einen Takt generieren bzw. immer bei einer Änderung in + Richtung eine Positive Flanke generieren.
Heißt ich will bei jedem Wechsel von 1 auf 2 oder von 2 auf 3 usw. immer eine Flanke generieren, hoffe man versteht mein Anliegen.

Bei jeder Änderung in + Richtung soll für kurze Zeit ein Takt generiert werden. Mit diesem Takt, will ich dann die SPS dazu auffordern den Messwert an der gegebenen Stelle in das Array zu speichern.
 
Zuletzt bearbeitet:

Ingmar64

Well-known member
Beiträge
266
Punkte Reaktionen
36
Zuviel Werbung?
->Hier kostenlos registrieren
Ich dachte, ich hätte irgendwo was mit 100 Impulsen pro 0,5cm gelesen ... .
Dein Anliegen ist schon klar und nichts besonderes.
Gut dann eben ohne Division, sondern den direkt den Encoderwert mit Alt vergleichen (wenn nur in Plusrichtung dann eben nur mit größer) und dann auf Alt spiegeln. Dann bekommst Du alle 0,5cm für einen Zyklus auf Testtakt eine 1.
Grad nochmal getestet.
1669284082825.png
1669284052375.png
 

PN/DP

User des Jahres 2011-2013; 2015-2017; 2020-2021
Beiträge
19.525
Punkte Reaktionen
5.880
direkt den Encoderwert mit Alt vergleichen (wenn nur in Plusrichtung dann eben nur mit größer) und dann auf Alt spiegeln. Dann bekommst Du alle 0,5cm für einen Zyklus auf Testtakt eine 1.
Außer an der Stelle wo der Encoder überläuft... :cool:
Besser ist, wenn man die Differenz zwischen "Encoder" und "Alt" auswertet. Das kann man Richtungs-unabhängig machen (Differenz <> 0) oder Richtungs-abhängig (Differenz > 0 (oder < 0) ).

Harald
 
OP
Invisible

Invisible

Well-known member
Beiträge
48
Punkte Reaktionen
1
Ich steh immer noch stark auf dem Schlauch.
Habe das ganze mal direkt versucht ohne die Division durch die 100.
Erhalte dann aber ein ständigen Wechsel der Impulsvariable von True auf False und nicht wie gewünscht nur alle 0,5cm.

Also wieder zurück und die Anzahl der Schritte geteilt, dann erhalte ich ein dauerhaftes TRUE Signal.
Bei mir haben die #Alt Variable und der #Wert, immer dieselbe zahl gespeichert.
Was mache ich falsch? wie speichere ich den alten wert richtig ?

1669290634641.png 1669290680242.png
 

PN/DP

User des Jahres 2011-2013; 2015-2017; 2020-2021
Beiträge
19.525
Punkte Reaktionen
5.880
Zuviel Werbung?
->Hier kostenlos registrieren
Erhalte dann aber ein ständigen Wechsel der Impulsvariable von True auf False und nicht wie gewünscht nur alle 0,5cm.
Die Impulsvariable wird normal immer nur einen Zyklus lang True und ansonsten False sein. Es sei denn, der Encoderwert (bzw. der Wert in #Wert) ändert sich im nächsten Zyklus schon wieder, dann bleibt (!) die Impulsvariable auf True.
Wie schnell ändert sich denn der Encoderwert? Wie oft/wann wird der Baustein aufgerufen?

Bei mir haben die #Alt Variable und der #Wert, immer dieselbe zahl gespeichert.
Das ist vermutlich nur ein Problem des Beobachtens. Nach dem Programmcode muß #Alt = #Wert sein. Vor dem Programmcode kann #Alt <> #Wert sein, daß ist aber normalerweise nur einen Zyklus lang und deshalb nur schwer zu beobachten.

Harald
 
OP
Invisible

Invisible

Well-known member
Beiträge
48
Punkte Reaktionen
1
Der Baustein wird aktuell nur einmal im OB1 aufgerufen. Habe die Impuls-Variable mal an einen Zähleingang gesetzt und der zählt sie.
War also tatsächlich ein Problem des Beobachtens. Der Encoder ändert sich sehr schnell, ist sehr sensibel eingestellt. Nur mit den Schritten passt da noch was nicht ganz so genau aber das bekomm ich hin.

danke für eure Hilfe!
 

Michitronik

Well-known member
Beiträge
279
Punkte Reaktionen
90
Hier mal eine Idee. Nimm den Encoderwert Modulo 100 oder wieviel inkremente dein Encoder für 5cm ausgibt. Wenn das Ergebnis 0 ist, sind 5cm erreicht.
 

Michitronik

Well-known member
Beiträge
279
Punkte Reaktionen
90
Man kann auch den aktuellen Modulo Wert mit dem letzten vergleichen und wenn der kleiner ist, dann muss es einmal 0 gewesen sein.

*Edit*
Auch könnte man CamTrack konfigurieren und den Encoder als Modulo Encoder einstellen und über seinen Modulo die Cams verteilen.
1669582984113.png
 
Zuletzt bearbeitet:
OP
Invisible

Invisible

Well-known member
Beiträge
48
Punkte Reaktionen
1
Hab das so gelöst, wie Ingmar und PN/DP gesagt haben, den alten Encoder wert mit dem aktuellen vergleichen, ist quasi dasselbe wie du meinst nur direkt mit dem Encoder wert. Trotzdem Danke für den Tipp 😃
 
Oben