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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
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
schau dir die open source lib oscat an dort findest du eine funktion ft_min_max die macht genau das was du suchst
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
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
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
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
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
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
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
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
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
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
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
Wie wärs damit...