TIA Analogsensor zu langsam für SCL

Beiträge
16
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin zusammen,

Vorab ich bin neu, Verzeiht mir Fehler.

Ich bin recht neu in SPS Programierung und komme mit FUP gut klar, nun soll ich aber eine Anlage bauen, in der mit Analogen werten gerrechnet und überwacht wird.

Verbaut sind:
CPU S7-300 317-2 PN/DP
Analogmodul AI 8x16BIT (331-NF700-0AB0)

Nun zu meinem Problem:

Ich muss an einer Stelle des Programms einen Messwert aufnehmen, da dieser messwert aber schwankt, wollen wir einen Mittelwert bilden aus 5 Messdaten.
Das ganze Wollte ich über SCL machen. Programm funktoniert auch, aber nicht sobald ich meine Sensordaten einlese, dann werden mir im Array und als ergeniss überall die Selben Messdaten angezeigt. Ich vermute, dass mein Sensor sich langsamer aktulisiert, als die Schleife durchläuft. Mein Sensor hat eine aktualisierungsrate von 5ms.

Nun zur Frage, gibt es eine möglichkeit eine Wartezeit einzubauen, mit der ich der SPS sage, greife alle 0,5s einen wert vom Sensor ab?

Hier mein Akteller Code:

IF "Merker_DB"."Mittelwert erfassen" THEN


#Summe_Temp := 0.0;


FOR #zahler := 0 TO 4 DO


"Mess-Rechen Daten".Messwerte[#zahler] := "Mess-Rechen Daten".Differenzdruck;

#Summe_Temp := #Summe_Temp + #Messwerte[#zahler];


END_FOR;

#Mittelwert := #Summe_Temp / 5;

END_IF;

Schonmal im Vorraus Danke!!!
Gruß Lukas
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Deine Vermutung ist falsch.
In deiner Schleife wird das PA nicht aktualisiert. Somit bleibt dein analoger Eingang gleich.
Das SPS Programm ist eine Schleife.

Moin,

Die eingelesenen Daten vom Sensor Aktualisieren sich. Ich sehe veränderungen( also wie der Wert hin und her Springt). das Problem ist, dass alle 5 Daten im Array gleich bleiben (also hin und herspringen und keine unterschied zueinander haben).

Gruß
 
Es gibt von SIEMENS auch fertige Bausteine dafür LGF_Floating Average, schau dir die mal an.
Hast du dir deinen Eingangswort mal angesehen? Wie stark schwankt es denn überhaupt? Du könntest auch in der Hardwarekonfiguration schon eine gewisse Glättung vornehmen.
 
Flanke Messwert erfassen > Messwert unterschiedlich zuletzt gespeicherter Wert > Aktualwert umkopieren auf eine Arbeitsvariable > Umschreiben auf aktuelles Fach > Zeiger eins hochzählen > Noch mal Wegspeichern für Vergleich > Zeiger erreicht letztes Fach, also raus aus der Schleife
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es gibt von SIEMENS auch fertige Bausteine dafür LGF_Floating Average, schau dir die mal an.
Hast du dir deinen Eingangswort mal angesehen? Wie stark schwankt es denn überhaupt? Du könntest auch in der Hardwarekonfiguration schon eine gewisse Glättung vornehmen.
Da S7-300 verbaut ist, gehe ich von Classic mal aus
 
In deiner Schleife wird das PA nicht aktualisiert. Somit bleibt dein analoger Eingang gleich.
Was holgermaik dir sagen wollte, ist, dass deine Schleife im gleichen Zyklus 4 mal durchlaufen wird. Der Analogwert wird aber in jedem Zyklus nur einmal eingelesen. Du liest immer den gleichen Wert, weil in deiner Schleife der Analogwert nicht aktualisiert wird.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es gibt von SIEMENS auch fertige Bausteine dafür LGF_Floating Average, schau dir die mal an.
Hast du dir deinen Eingangswort mal angesehen? Wie stark schwankt es denn überhaupt? Du könntest auch in der Hardwarekonfiguration schon eine gewisse Glättung vornehmen.
Der Fertige baustein ist doch nur für die 1200/1500 Serie oder täusche ich mich? Bekomm ich den auch für eine S7-300?

Der Sensorwert schwankt, weil es sich um einen Differenzdruck Sensor handel, der schwankt weil der Differenzdruck nicht zu 100% gleich bleibt.
 
Was holgermaik dir sagen wollte, ist, dass deine Schleife im gleichen Zyklus 4 mal durchlaufen wird. Der Analogwert wird aber in jedem Zyklus nur einmal eingelesen. Du liest immer den gleichen Wert, weil in deiner Schleife der Analogwert nicht aktualisiert wird.
Ah okay, und wie müsste ich das dann umprogramieren damit der Wert neu eingelsen wird in der Schleife?
(wie gesagt, wenig erfahrung mit SCL)

Vielen Dank im Vorraus
 
In dem du zum Beispiel nur alle 100ms (Stichwort taktmerker & steigende flanke) den Messwert in dein array eintägst. Vorher musst du natürlich den ältesten Meswert rauslöschen und die restlichen Messwerte aufrücken. Summe bilden und teilen
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich stehe anscheinend auf dem Schlauch, meine verknüpfung im Kopf schaltet mir nicht den zugang frei. Muss ich das in SCL so schreiben, oder in dem FB der den FC aufruft? Und wie bekomme ich den z.B. takmerker abgefragt in SCL einfach über if (M(taktmeker) true oder wie?

Danke im vorraus.
 
2 Fehler:
- du willst in einer Schleife etwas tun, was länger dauern soll - sowas geht nicht in SPS. Das muss über mehrere Zyklen verteilt werden.
- wie man in den technischen Daten der Analogbaugruppe 331-7NF00 nachlesen kann, kann die Baugruppe sowieso nicht in einem Zyklus neue Werte liefern (schon gar nicht 5 verschiedene Werte), selbst wenn man die Peripherieadressen abfragen würde. Die Integrationszeit je Kanal beträgt je nach Projektierung 10ms ... 100ms, oder mindestens 140ms, wenn alle Eingänge der Baugruppe aktiviert sind.

Übrigens: eine Baugruppe 331-NF700 gibt es nicht.
Verbaut sind:
CPU S7-300 317-2 PN/DP
Analogmodul AI 8x16BIT (331-NF700-0AB0)
 
Einen Blinker machst Du z.B. so:

Code:
Blinker : BOOL;
Blink_TON : TON;

Blink_TON(IN:= NOT Blinker, PT:=T#1s);
Blinker := Blink_TON.Q;

IF Blinker THEN
   ... your code ...
END_IF

Oder Du nutzt in der SPS die Taktmerker, die Du in der HWConfig aktivieren kannst.

Und dann das Speichern:

Code:
x : INT;
index : INT := 0;
MaxIndex : INT := 4;
MyArray : Array[0..MaxIndex] OF REAL;
Sum : REAL;
Average : REAL;


(* Daten speichern im Ring *)
MyArray[index] := Eingangswert;
index := index + 1;
IF index > MaxIndex THEN
   index := 0;
END_IF

(* Durchschnitt bilden *)
Sum := 0;
FOR x:=0 TO MaxIndex DO
     Sum := Sum + MyArray[x];
END_FOR
Average := Sum / (MaxIndex + 1);

Das kannst Du jetzt noch verfeinern, indem Du z.B. beim ersten Zyklus den ersten Eingangswert in alle Zellen speicherst, um den Average nicht durch die Nullwerte zu verfälschen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hinweise:
Weil das Array für die Mittelwertbildung sich Werte bis zum nächsten Aufruf des Codes merken muss, muss es in "merkfähigem" Speicher liegen, also z.B. in Stat (von FB) oder in globalem Speicher wie DB.

Ich würde den Wert in der index-Variable vor der Verwendung zur Adressierung ins Array prüfen, und nicht erst danach.

Es gibt auch Glättungsverfahren, die ohne Array für alle Werte auskommen.

nun soll ich aber eine Anlage bauen, in der mit Analogen werten gerrechnet und überwacht wird.
Muss für die Glättung des Analogwertes ein bestimmtes mathematisches Verfahren verwendet werden, oder geht es nur um eine "optische" Glättung, damit eine Anzeige "schöner"/ruhiger aussieht? Eine Glättung verzögert oder verhindert womöglich eine Reaktion auf Extremwerte.
 
2 Fehler:
- du willst in einer Schleife etwas tun, was länger dauern soll - sowas geht nicht in SPS. Das muss über mehrere Zyklen verteilt werden.
- wie man in den technischen Daten der Analogbaugruppe 331-7NF00 nachlesen kann, kann die Baugruppe sowieso nicht in einem Zyklus neue Werte liefern (schon gar nicht 5 verschiedene Werte), selbst wenn man die Peripherieadressen abfragen würde. Die Integrationszeit je Kanal beträgt je nach Projektierung 10ms ... 100ms, oder mindestens 140ms, wenn alle Eingänge der Baugruppe aktiviert sind.

Übrigens: eine Baugruppe 331-NF700 gibt es nicht.
Alles klar, Punkt eins habe ich verstanden, punkt 2 da habe ich eine dreher drin gehabt, ich meinte 331-7NF00-0AB0 :D
 
Einen Blinker machst Du z.B. so:

Code:
Blinker : BOOL;
Blink_TON : TON;

Blink_TON(IN:= NOT Blinker, PT:=T#1s);
Blinker := Blink_TON.Q;

IF Blinker THEN
   ... your code ...
END_IF

Oder Du nutzt in der SPS die Taktmerker, die Du in der HWConfig aktivieren kannst.

Und dann das Speichern:

Code:
x : INT;
index : INT := 0;
MaxIndex : INT := 4;
MyArray : Array[0..MaxIndex] OF REAL;
Sum : REAL;
Average : REAL;


(* Daten speichern im Ring *)
MyArray[index] := Eingangswert;
index := index + 1;
IF index > MaxIndex THEN
   index := 0;
END_IF

(* Durchschnitt bilden *)
Sum := 0;
FOR x:=0 TO MaxIndex DO
     Sum := Sum + MyArray[x];
END_FOR
Average := Sum / (MaxIndex + 1);

Das kannst Du jetzt noch verfeinern, indem Du z.B. beim ersten Zyklus den ersten Eingangswert in alle Zellen speicherst, um den Average nicht durch die Nullwerte zu verfälschen.
Mein Code sieht jetzt so aus, sobald ich diesen in die SPS lade und Starte bekomme ich einen SF.

Den Blinker habe ich in FUP erstellt.

Das Array liegt in einem DB.

IF "Merker_DB".Blinker AND "Merker_DB"."Mittelwert erfassen" THEN
(* Daten speichern im Ring *)
#Messwerte[#index] := #Eingangswert;
#index := #index + 1;

IF #index > 4 THEN
#index := 0;

END_IF;
(* Durchschnitt bilden *)
#Sum := 0;
FOR #x := 0 TO #MaxIndex DO
#Sum := #Sum + #Messwerte[#x];
END_FOR;
#Mittelwert := #Sum / (#MaxIndex + 1);
END_IF;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich würde den Wert in der index-Variable vor der Verwendung zur Adressierung ins Array prüfen, und nicht erst danach.
Das kann man meiner Meinung nach halten, wie man will. Ich gehe davon aus, Du beziehst Dich auf meinen Codevorschlag.
Der Index ist initiallisiert mit 0.
Der Index wird hochgezählt und direkt danach auf Max überprüft und ggf. zurückgesetzt.
Ausgehend davon, daß diese Variable im folgenden Ablauf nicht mehr verändert wird, ist das bereits "vor" der Verwendung.
Wenn Du nun davon ausgehst, daß die Variable bis zur Verwendung "irgendwo" noch verändert wird, wäre das eine vom Programmierer ungewollte Veränderung und Du müßtest theoretisch auch noch auf <Min prüfen, der Vollständigkeit halber.
 
Zurück
Oben