Maximal- und Minimalwert einer Variable speichern?!

DunkDream
2009-03-14
2009-03-25
  • DunkDream - 2009-03-14

    Hallo liebe Community,

    auch diesmal stehe ich, als CoDeSys-Neuling, vor einem Problem.

    Ich möchte eine Überwachungsfunktion automatisieren. Leider fehlen mir dazu jedoch die Mittel bzw. ich kenne die Funktionen nicht

    Meine Funktion soll wie folgt aussehen:

    Es soll der Druck in einem System über eine bestimmte Zeitdauer gemessen werden. Der Druck würde dann über eine Variable in CoDeSys eingelesen werden. Nun sollen der Maximalwert und der Minimalwert der Variable gespeichert werden, sodass am Ende die zwei Variablen "Max_p" also Maximaldruck und "Min_p" Minimaldruck mit den entsprechenden Werten zur Verfügung stehen.

    Gibt es eine Möglichkeit dies leicht zu realisieren?

    Danke im Voraus und liebe Grüße

    DunkDream

     
  • DunkDream - 2009-03-14

    Bin nun einen kleinen Schritt weitergekommen.

    Undzwar gibt es in der Util Bibliothek die Mathematische Funktion STATISTIC_REAL.

    Lege ich an diesen Funktionsblock an IN meine Varibale des Druckeinganges, so würde mir diese Funktion den Maximal- und Minimalwert ausgeben. Soweit schonmal gut.

    Leider stehe ich dann noch vor dem Problem Zeit. Ich würde gerne realisieren, dass diese Messung nur eine bestimmte Zeit lang durchgeführt wird, sodass am Eingang IN von STATISTIC_REAL nur eine geiwsse Zeit die Variable Druck_input (Also der gemessene Druck im System) ankommt.

    liebe Grüße

    DunkDream

     
  • hugo - 2009-03-14

    schau dir die open source lib oscat an dort findest du eine funktion ft_min_max die macht genau das was du suchst

     
  • DunkDream - 2009-03-15

    Hallo,

    danke für den Tipp mit der Oscat Bibliothek.

    Leider habe ich diesen Beitrag erst sehr spät gesehen, sodass ich vorher eigentlich schon eine Lösung gefunden habe, die aber anscheinend keine ist.

    Ich habe hier mal ein Bild dazu:

    Warum werden bei Min und Max derarte Werte ausgegeben? Es liegt doch ein negiertes 0 Signal am Reset Eingang des FB's an, daher verstehe ich das ganze nicht.

    Außerdem liegt bei IN 0 als Real an. Irgendwas stimmt hier doch nicht

    Kann mich jemand eventuell aufklären und mir sagen wie ich das Problem lösen kann?

    liebe Grüße

    DunkDream

    IMG: Bild

     
  • SPS-Fuzzi - 2009-03-16

    Du hast Dir die Antwort doch schon selbst gegeben - es liegt ein negiertes 0-Signal am Reset Eingang an, also eine 1, sprich ein TRUE.

    Und True am Reset Eingang von STATISTICS_REAL setzt nun mal die Min- und Max-Werte auf die zulässigen Werte für REAL: 1.175494351e-38F bis 3.402823466e+38F zurück.

    Gruß SPS-Fuzzi

     
  • DunkDream - 2009-03-23

    Hallo,

    leider funktioniert diese Funktion nicht, was an dem Funktionsblock Statistics_Real liegt.

    Also für meinen Anwendungsfall leider gänzlich unbrauchbar.

    Könnte nun also dennoch hilfe brauchen. Weiß leider überhaupt nicht wie ich mein Vorhaben, siehe oben, realisieren kann

    Ich würde mich freuen wenn Ihr mir dabei helfen würdet.

    liebe Grüße

    DunkDream

     
  • Matze001 - 2009-03-23

    Hallo,

    das Programm einfach mal in Worten ausgedrückt.

    Ist die Eingangsvariable kleiner als die gemerkte kleinste Variable schreibe die Eingangsvariable in die gemerkte. Ist die Eingangsvariable größer als die gemerkte größte Variable schreibe sie in die gemerkte.

    Das sind zwei Netzwerke die genau das tun was du willst.

    MfG

    Marcel

    P.S:

    In CFC Programmieren und Move mit Enable nutzen

     
  • DunkDream - 2009-03-23

    Hallo Marcel,

    soviel zu der Theorie, das einzige was noch zu beachten wäre, ist, dass ich diese Messung noch über eine bestimmte Zeitdauer machen möchte. Sollte aber das kleinste Problem sein, einfach nen "TP" Timer setzen, also eine speichernde Ausschaltverzögerung, dann sollte das funktionieren.

    Leider wüsste ich auf Anhieb überhaupt nicht wie ich deine Worte in ein Programm in CFC fassen sollte

    Bin halt blutiger Anfänger und das ist mein erstes wirklich großes CoDeSys Projekt, welches auf unsere eigens entwickelte Steuerung für einen Versuchsaufbau aufgespielt werden soll.

    Ich würde mich freuen wenn du mir noch etwas auf die Sprünge helfen könntest.

    Ich habe noch einige Bedenken bei der Aufzeichnung des Min Wertes. Mein Anfangswert wäre ca. 50bar (direkt nach dem einschalten) und Min kann also wohl kaum kleiner als der Eingangswert sein (ich denke min würde mit 0 beim starten initialisiert werden oder? )

    Ich danke euch für die starke Mithilfe hier!

    Mit freundlichem Gruß

    DunkDream

     
  • Matze001 - 2009-03-23

    Hier mal ein Beispiel.

    Wenn man es abrunden will muss man das AND mit Messung_aktiv natürlich auch beim Max einfügen.

    Willst du die Messung zurücksetzen machst du jwls. einen weiteren Move und an den Enable "reset" und als Wert einfach 0 .

    MfG

    Marcel

    IMG: cfc.jpg

     
  • DunkDream - 2009-03-23

    Hallo Marcel,

    viele Dank!!!

    Ich werde das ganze gleich mal programmieren und simulieren.

    Habe jedoch noch eine kurze Frage dazu.

    Also wenn mein Eingangswert beim einschalten z.B. 50 ist, dann ist der Maxwert 50, steigt der Wert weiter an, dann wird max dementsprechend auch ansteigen, wenn Messung aktiv ist.

    Was macht aber mein Min wert? Wird der dann nicht einfach auf 0 verharren?

    Kleiner als 0 kann der Eingangswert doch garnicht werden, also kann Min sich doch nicht ändern oder habe ich einen Denkfehler?

    liebe Grüße

    DunkDream

     
  • Matze001 - 2009-03-23

    Ist doch logisch.

    Wenn dein erster Wert 50 ist und du keinen anderen hattest sind Min und Max beide 50. Es ist der kleinste, sowie auch der größte Wert der jmls. da war.

    MfG

    Marcel

     
  • DunkDream - 2009-03-23

    Ok, gerade programmiert und mir das in der Realität angeschaut, läuft wunderbar

    Habe anscheinend noch viel zu lernen in Sachen programmieren.

    Muss Probleme wohl anders anpacken und meine Denkweise etwas umstrukturieren.

    Ich danke dir.

    Das war das letzte Problem meiens Programmes, scheinbar läuft nun alles, wie vorher definiert.

    liebe Grüße und Danke für die effektive Hilfe!!

    DunkDream

     
  • DunkDream - 2009-03-24

    Matze001 hat geschrieben:
    Ist doch logisch.
    Wenn dein erster Wert 50 ist und du keinen anderen hattest sind Min und Max beide 50. Es ist der kleinste, sowie auch der größte Wert der jmls. da war.
    MfG
    Marcel

    Hallo Marcel,

    ich muss doch nochmal kurz stören.

    Habe heute das Programm an meiner Hardware testen können und das ganze nochmal genau analysiert.

    Also mein Anfangswert ist 50. Es ist richtig, dass mein Max Wert dann ebenfalls 50 ist, aber mein Min Wert leider nicht Mein Min Wert bleibt bei 0. In diesem Fall aber doch auch logisch, weil 50 größer als 0 ist, also wird mein Min Wert nicht geschrieben. Es liegt nämlich an EN von Move eine 0 an, weil die LT-Bedingung nicht erfüllt ist.

    Kann man das Problem noch irgendwie lösen?

    liebe Grüße

    DunkDream

     
  • Matze001 - 2009-03-24

    Hallo,

    stimmt du hast recht.

    Dann initialisiere doch den min mit einer Zahl die so hoch ist das sie nie als Anfangswert auftreten kann...

    z.B. 99999

    Dann ist die LT Bedingung erfüllt.

    Nicht sauber, aber rein

    MfG

    Marcel

     
  • Else - 2009-03-25

    Wie wärs damit...

    IMG: Bild

     

Log in to post a comment.