TIA Abtastrate einstellen

Big_Rob_Baan

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

ich muss einen Temperaturwert auf 120s glätten und den Durchschnittswert der letzten 120 Werte mit einer Abtastrate von 1s einstellen. Die eigentliche Durchschnittwertberechnung habe ich schon in SCL programmiert. Es fehlt nur noch der Fakt, dass das Programm nur ein mal pro Sekunde durchläuft.

Kennt da jemand eine entsprechende Funktion zu und kann mir helfen?

Vielen Dank und lieber Gruß

Rob
 
Es gibt da zum Einen die Zeit-OB's für die du in der Konfiguration das gewünschte Aufrufintervall einstellen kannst ... zum Anderen kannst du es aber auch ganz einfach über einen Timer lösen - das wäre für ein 1s-Intervall auch immer noch genau genug ...
 
Ich kann dir gerade nicht folgen ... du wirst, egal wie du es anstellst, keine Realtime-Anwendung hinbekommen - ein kleiner Jitter von ein paar Millisekunden wird immer bleiben ... egal wie du es anstellst.
Aber da wir hier ja von Temperaturen sprechen, die die Angewohnheit haben sich nicht in Millisekunden zu ändern, und du eine Glättung über 2 Minuten machen willst - wo siehst du gerade ein Problem ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was sagt dein Compiler zu
Code:
FOR Timer_Ausgang := TRUE;
?

PS:
Was soll hier gemacht werden?
Der Indexzugriff kann ja nur 0 sein?

Code:
currentIndex = temporäre Variable


currentIndex := 0;
currentIndex als Indexvariable verwendet
currentIndex := (currentIndex + 1) MOD 120;
...
currentIndex := i;
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Was sagt dein Compiler zu
Code:
FOR Timer_Ausgang := TRUE;
?

PS:
Was soll hier gemacht werden?
Der Indexzugriff kann ja nur 0 sein?

Code:
currentIndex = temporäre Variable


currentIndex := 0;
currentIndex als Indexvariable verwendet
currentIndex := (currentIndex + 1) MOD 120;
...
currentIndex := i;
Zur ersten Frage: Der Compiler sagt: "Ungültige FOR-Anweisung. TO erwartet"

Zur zweiten Frage: Stimmt. Da hast du recht so würde currentindex bei jedem Zyklus auf 0 zurückgehen und maximal 1 werden.

Eigentlich sollen die Temperaturwerte stufenweise eingelesen werden. CurrentIndex soll mit jedem Zyklus um 1 steigen, sodass nach 120s der Array der Temperatur aus 120 Messwerten besteht und der letzte jeweils imme erneuert wird.

Gruß
 
Schau dir mal in der Hilfe an wie die For Schleife in SCL aufgebaut ist.

Was ist der Sinn dahinter nur das letzte Fach immer wieder zu aktualisieren und die anderen 119 alten Werte zu behalten?

Generelle Frage: Wozu die Modulo Funktion beim Schreiben des aktuellen Indexzeigers?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
In der LGF Bibliothek gibt es einen FloatingAverage Baustein

Hat es einen Grund wieso du mit temporären Variablen arbeitest? Diese sind nur für den Baustein und auch nur für den aktuellen Zyklus gültig, da würde ich eher mit einem DB arbeiten in dem das Array definiert ist
Den FloatingAverage Baustein habe ich auch in Betracht gezogen. Dort kann man aber auch nirgends einstellen, in welchem Abstand die Werte eingelesen werden. Und die Anzahl ist nicht verstellbar, was allerdings kein Problem wäre bei etwas größerer Abtastrate.

Die Temps habe ich gewählt, weil es bausteininterne Variablen sind, die jeweils nur von den Eingängen abhängig sind. Ich versuche im Baustein nur interne Variablen zu werden, und dann im Main die externen Ein- und Ausgänge zuzuordnen. So kann ich den Baustein mehrfach verwenden und behalte Ordnung.
 
Schau dir mal in der Hilfe an wie die For Schleife in SCL aufgebaut ist.

Was ist der Sinn dahinter nur das letzte Fach immer wieder zu aktualisieren und die anderen 119 alten Werte zu behalten?

Generelle Frage: Wozu die Modulo Funktion beim Schreiben des aktuellen Indexzeigers?
1. Das macht kein Sinn. Aber wie kann ich einstellen das mein Indexwert bei 0 anfängt außerhalb des Programmdurchlaufs, so dass er nicht immer auf 0 aktualisiert wird?

2. Modulo Funktion, damit der Wert nicht 120 übersteigt. Wird der Index 119 so ergibt sich 0 für den Index und die Temperaturwerte werden von hinten wieder aktualisiert.
 
Die Temps habe ich gewählt, weil es bausteininterne Variablen sind, die jeweils nur von den Eingängen abhängig sind. Ich versuche im Baustein nur interne Variablen zu werden, und dann im Main die externen Ein- und Ausgänge zuzuordnen. So kann ich den Baustein mehrfach verwenden und behalte Ordnung.
vielleicht solltest Du Dich erstmal mit den einfachen Grundlagen der Siemens-SPS-Programmierung befassen, bevor Du gleich nen Baustein für gleitenden Mittelwert schreiben willst ;)

Wenn Variablen ihren Wert für länger als einen SPS-Zyklus behaltens sollen, musst Du nen DB verwenden. Entweder nen Global-DB oder halt nen Instanz-DB zu nem FB. In nem FC kannst Du keine Werte für länger als die Laufzeit dieses FC-Aufrufes speichern.
Temp-Variablen sind zu Beginn jeder Bausteinbearbeitung undefiniert solange bis sie nen Wert zugewiesen bekommen. Bei Ende des Bausteins sind sie dann wieder gelöscht.




Seite 11/12
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
vielleicht solltest Du Dich erstmal mit den einfachen Grundlagen der Siemens-SPS-Programmierung befassen, bevor Du nen Baustein für gleitenden Mittelwert schreiben willst ;)

Wenn Variablen ihren Wert für länger als einen SPS-Zyklus behaltens sollen, musst Du nen DB verwenden. Entweder nen Global-DB oder halt nen Instanz-DB zu nem FB. In nem FC kannst Du keine Werte für länger als die Laufzeit dieses FC-Aufrufes speichern.
Temp-Variablen sind zu Beginn jeder Bausteinbearbeitung undefiniert solange bis sie nen Wert zugewiesen bekommen. Bei Ende des Bausteins sind sie dann wieder gelöscht.
Zusatz:
Information aus Programmierleitfaden (@Big_Rob_Baan, solltest du durchlesen):
1689689445944.png
 
Den FloatingAverage Baustein habe ich auch in Betracht gezogen. Dort kann man aber auch nirgends einstellen, in welchem Abstand die Werte eingelesen werden. Und die Anzahl ist nicht verstellbar, was allerdings kein Problem wäre bei etwas größerer Abtastrate.
Hab nicht gesehen, dass er nur bis 100 geht, dennoch besitzt der Bausteinen einen fortlaufenden und einen getriggerten Modus. Ich glaube die Bausteine sind quelloffen, d.h. du könntest schauen wie er aufgebaut ist und evtl die Mittelwertrechnung auf 120 hochsetzen

Die Temps habe ich gewählt, weil es bausteininterne Variablen sind, die jeweils nur von den Eingängen abhängig sind. Ich versuche im Baustein nur interne Variablen zu werden, und dann im Main die externen Ein- und Ausgänge zuzuordnen. So kann ich den Baustein mehrfach verwenden und behalte Ordnung.
Temporäre Variablen sind nur einen Zyklus lang gültig, das was du meinst sind die Variablen der Bausteinschnittstelle, das sind schon interne Variablen die du außen beschalten kannst (In/Out/InOut).

1. Das macht kein Sinn. Aber wie kann ich einstellen das mein Indexwert bei 0 anfängt außerhalb des Programmdurchlaufs, so dass er nicht immer auf 0 aktualisiert wird?
Du kannst i frei definieren, im Handbuch ist nur ein Beispiel welches bei 1 beginnt und nicht bei 0.
Ich glaube irgendwie dass du die Schleife gar nicht brauchst sondern nur eine Abfrage auf True deines Taktmerkers

2. Modulo Funktion, damit der Wert nicht 120 übersteigt. Wird der Index 119 so ergibt sich 0 für den Index und die Temperaturwerte werden von hinten wieder aktualisiert.
Hab ich so tatsächlich noch nicht gesehen, ich nutze für sowas immer dynamische Arrays und berechne mir untere und obere Grenze.


Schreib dir mal den Ablauf deiner Funktion auf und dann schau wie du es wirklich umsetzen kannst.
 
Ja, gerne.

1. 1s Verzögerung
2. Überprüfung, ob die Verzögerung geschehen ist
3. Einlesen des Temperaturwertes
4. Berechnung der Summe der Temperaturwerte
5. Division durch bisherige Anzahl an Abtastungen/maximal 120
6. Aktualisierung des Indexes
7. Einschränkung des Indexes auf max. 120

Ich hoffe das ist soweit verständlich
 
Zurück
Oben