TIA Kleinste Wert eines Counters sichern

Kapfe

Level-1
Beiträge
12
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,

ich bin noch recht neu hier und freue mich gerne über Lösungsvorschläge :)

Meine Problemstellung:
Ein Magnetbandsensor liefert mir Inkremente die ich über eine TP Inpuls 1 einlese und mit einem High Speed Counter verarbeite (Ausgang des Zählwerts habe ich über einen DB unter DINT abgespeichert). Die Verarbeitung und Konvertierung in mm funktioniert sehr gut.
Nun möchte ich zwischen einen gewissen Zeitraum, den ich mit 2 Variablen bestimme, den Tiefsten Punkt (=niedrigste Zählwert) speichern. Ich habe mich schon zu FOR-Schleifen informiert, bin aber noch nicht auf die richtige Lösung gestoßen.

Um Lösungsvorschläge wäre ich sehr Dankbar!
Meine Komponenten:
ET200 SP
TIA V15
Programmiersprache: FUP/SCL/AWL
Counter liefert Werte zwischen 0-18500

Viele Grüße,

Tom
 
Zuletzt bearbeitet:
Wie muss man sich denn die zwei Variablen vorstellen? Willst du zwei Uhrzeiten angeben zwischen denen du den niedrigsten Zählwert suchen willst. oder willst du einen Start und einen Endzeitpunkt triggern und dann den Niedrigsten wert speichern?
Letzteres ist ja einfach mit auslösen des Starttriggers speicherst du den aktuellen wert und immer wenn du einen kleineren Wert siehst überschreibst du den gespeicherten Wert, bis der Endtrigger ausgelöst wird.

Bei ersterem musst du halt die Werte mit einem Zeitstempel in einen FIFO speichern und dann im Array nach dem Tiefsten Wert suchen (dafür dann die FOR Schleife)

mfG René
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin Kapfe,

wo speicherst Du die Werte?

Wenn Du in Abhängigkeit einer Zeitangabe einen Bereich auswählen willst, wäre es sicher sinnvoll den gespeicherten Werten noch den Zeitstempel der Speicherung hinzuzufügen.

Dafür am besten einen eigenen Datentypen erstellen. Dieser Datentyp kann dann den Wert und den Zeitstempel enthalten.

Dann einen DB mit einem "Array[0..n] of 'eigener Datentyp'" erstellen.

Jetzt bräuchtest Du noch zwei FOR-Schleifen, um die MIN-/MAX-IDIZES für die Extremwertermittlung zu ermitteln.

Also:
Code:
FOR #i := 0 TO MAX DO
    if Zeitstempel[#i] < ZeitstempelMin THEN
        #IndexMin := #i;
        EXIT;
    end_if;
end_for;

FOR #i := 0 TO MAX DO
    if Zeitstempel[#i] < ZeitstempelMax THEN
        #IndexMax := #i + 1;
        EXIT;
    END_IF;
END_FOR;

MinWert := Wert[#IndexMin];

FOR #i := IndexMin + 1 To IndexMax DO
    IF Wert[#i] < #MinWert THEN
        #MinWert := Wert[#i];
    END_IF;
END_FOR;


Dann steht in MinWert nach den Schleifendurchläufen der kleinste Wert.

ACHTUNG:
1. der Code kann Fehler enthalten, er ist nur als Gedankenanstoss zu verstehen
2. Ggf. muss die Minimalgrenze für den IndexMin
übernommen werden, wenn der Zeitstempel nicht gefunden wird.

VG

MFreiberger
 
Vielen Dank für die schnellen Antworten. Die 2 Variablen sind so zusagen 1 High Signal wenn der Zylinder aktiviert wird zum runterfahren und das zweite Signal, dass die "Überwachung" deaktiviert ist ein weiteres High Signal, quasi wenn der Zylinder wieder in der Anfangsposition ist. Und während diesem Zeitraum möchte ich den Niedrigsten Wert speichern. Der genaue Zeit Stempel ist für dieses Projekt eher uninteressant.

Ich habe schon einmal Versuche mit einer FOR-Schleife probiert, und den #i wie in deinem Beispiel meine Variable hinzugefügt, aber leider funktionierte das nicht so wie im Video...
https://www.youtube.com/watch?v=cvVsTDcT7Uw

Unbenannt.PNG

Auf dem Foto sieht man rechts meine Variable die ich in einem DB geschrieben habe. Diese gibt mir den Zahlenwert von ca. 0-18500 an (Datentyp DINT)


Ich bin sehr unerfahren in SCL-Programmieren.
 
Moin Kapfe,

Die 2 Variablen sind so zusagen 1 High Signal wenn der Zylinder aktiviert wird zum runterfahren und das zweite Signal, dass die "Überwachung" deaktiviert ist ein weiteres High Signal, quasi wenn der Zylinder wieder in der Anfangsposition ist. Und während diesem Zeitraum möchte ich den Niedrigsten Wert speichern. Der genaue Zeit Stempel ist für dieses Projekt eher uninteressant.

diese Beschreibung verstehe ich nicht.
Was macht der Zylinder denn? Wenn er einfach nur "runter" fährt, ist doch die unterste Position der niedrigste Wert, oder?
Oder fährt der Zylinder runter und wieder hoch und willst wissen wie "tief" er gefahren ist?
Fährt der Zylinder vielleicht runter, hoch, runter, hoch, runter und dann wieder in Ausgangsstellung?

Mit dem Inkrementalgeber kannst Du doch die Drehrichtung auswerten, oder?

Dann muss eine Variable in der SPS inkrementiert/dekrementiert werden. je nach Impulsen und Drehrichtung.
Bei jedem Inkrementieren/Dekrementieren eine Extremwertspeicherung vornehmen:

Code:
IF Value < ValueMin THEN
    ValueMin := Value;
END_IF;

oder halt ValueMax, je nach Zählrichtung.

VG

MFreiberger
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielen Dank für die schnellen Antworten. Die 2 Variablen sind so zusagen 1 High Signal wenn der Zylinder aktiviert wird zum runterfahren und das zweite Signal, dass die "Überwachung" deaktiviert ist ein weiteres High Signal, quasi wenn der Zylinder wieder in der Anfangsposition ist. Und während diesem Zeitraum möchte ich den Niedrigsten Wert speichern. Der genaue Zeit Stempel ist für dieses Projekt eher uninteressant.

Wenn du im Laufe eines Zeitraums den tiefsten aktuellen Wert erfassen willst, dann kannst du das ja direkt machen.
Bsp:
überwachung startet:
Speicherwert wird mit aktuellem Wert überschrieben.

überwachung läuft:
Aktueller wert wird mit Speicherwert verglichen. Wenn Aktueller wert niedriger als Speicherwert, dann Speicherwert durch aktuellen Wert ersetzen.

überwachung endet:
Speicherwert wegspeichern für das was du damit halt machen willst.

Dafür ist erstmal keine FOR Schleife nötig. wozu auch?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin Kapfe,



diese Beschreibung verstehe ich nicht.
Was macht der Zylinder denn? Wenn er einfach nur "runter" fährt, ist doch die unterste Position der niedrigste Wert, oder?
Oder fährt der Zylinder runter und wieder hoch und willst wissen wie "tief" er gefahren ist?
Fährt der Zylinder vielleicht runter, hoch, runter, hoch, runter und dann wieder in Ausgangsstellung?

Mit dem Inkrementalgeber kannst Du doch die Drehrichtung auswerten, oder?

Dann muss eine Variable in der SPS inkrementiert/dekrementiert werden. je nach Impulsen und Drehrichtung.
Bei jedem Inkrementieren/Dekrementieren eine Extremwertspeicherung vornehmen:

Code:
IF Value < ValueMin THEN
    ValueMin := Value;
END_IF;

oder halt ValueMax, je nach Zählrichtung.

VG

MFreiberger


Der Zylinder fährt gegen eine Leitung, die unterschiedliche Höhen besitzt. Sobald der Zylinder Aktiviert wurde, fährt dieser auf die Leitung. Nach dem "drauf fahren" quetscht sich die Leitung ein wenig zusammen, und von diesem Vorgang benötige ich dann den kleinsten Wert meines Zählers (Da Zähler mein Magnetbandsensor ist). Diesen werde ich später in eine Strecke in mm umwandeln.
Ich bin nur leider noch nicht dahinter gekommen, wie man so eine Schleife oder sonstige Bedingung programmiert.
 
Moin Kapfe,

es ist immer noch nicht klar, warum Du eine Schleife programmieren willst?

Es ist doch so: Du startest den Messvorgang.
Jetzt einfach in jedem SPS-Zyklus gucken, ob der aktuelle Wert kleiner als der bisher kleinste Wert ist. Dann den neuen, kleineren Wert speichern.
Wenn der Messvorgang jetzt beendet ist, steht in der Speichervariablen der kleinst Wert.

Mit einer Flanke vom Start des Messvorgangs kannst Du die Speichervariable initialisieren.

Also:

Code:
IF #Startflanke THEN
    Speichervariable := 9999; // oder so. muss halt größer sein, als der größtmöcgliche kleinste Wert
END_IF;

IF Aktualwert < Speichervariable THEN
    Speichervariable := Aktualwert;
END_IF;


Also entweder haben wir noch nicht verstanden, was Du willst oder Du hast noch nicht verstanden wie die Lösung funktioniert?


VG

MFreiberger
 
Willst Du etwa einerseits die Min-Position bei jeder dieser AntastVersuche ermitteln und von diesen Minwerten noch den kleinsten aus mehreren Antastungen ermitteln?
Das Verfahren wird dann einfach nur 2mal angewendet und eine Schleife ist weiterhin nicht nötig.
Wichtig ist nur, dass Du bei der allerersten Messung beide MinWerte vorbesetzt und nur den einen davon bei jedem Beginn eines neuen AntastVorgangs.
 
Zuletzt bearbeitet:
Moin Kapfe,

vielleicht noch ein Wort zum Verständnis:

Eine SPS arbeitet ja nach dem EVA-Prinzip (Eingänge einlesen - Verarbeiten - Ausgänge ausgeben). Dies macht die SPS immer wieder und wieder. Einen Durchlauf nennt man auch einen Zyklus. Das ständige wiederholen dieses Ablaufs nennt man zyklische Bearbeitung.
Wenn Du so willst arbeitet die SPS in einer endlosen Schleife. D.h. das Speichern des Extremwertes wird in jedem "Schleifendurchlauf" gemacht.

VG

MFreiberger
 
Habe den Code von euch (IF Value < Value min …) ausprobiert. Jetzt funktioniert alles! Hatte in den ersten Versuchen immer wieder einen ";" Fehler, da ich noch nicht so fitt in SCL bin.

Vielen Dank!
 
Zurück
Oben