TIA Analogsensor zu langsam für SCL

Zuviel Werbung?
-> Hier kostenlos registrieren
Lass mich raten.. dein Array geht von 0..4?
wäre plausibel, da Du bei >4 den Index zurücksetzt, aber die FOR-Schleife bis MaxIndex laufen läßt.
Wenn man kopiert, dann komplett... mein Array ist auch bis MaxIndex definiert und die IF-Abfrage benutzt auch MaxIndex... damit paßt alles. Wenn Du überall Zahlenkonstanten einsetzt, kann das zu solchen Verschiebungen kommen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
IF "Merker_DB".Blinker AND "Merker_DB"."Mittelwert erfassen" THEN
    (* Daten speichern im Ring *)
    #Messwerte[#index] := #Eingangswert;
    IF #index < #MaxIndex THEN
        #index := #index + 1;
    ELSE
        #index:= 0;
    END_IF;
END_IF;

(* Durchschnitt bilden *)
// Hier evtl noch Abfrage ob alle Werte =/= 0 sind
#Sum:= #Messwerte[0] + #Messwerte[1] + #Messwerte[2] + #Messwerte[3] + #Messwerte[4];
#Mittelwert := #Sum / (#MaxIndex + 1);

Wäre meine Idee
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Habe den Index im Input, also in einem DB hinterlegt.
:eek: Was soll der da denn?
1. Wenn Du den nicht beschaltest, bekommt der immer den Default-Wert aus der Definition, vermutlich 0
2. Wenn Du den dann intern hoch zählst, müßtest Du ihn dann ja über einen Output wieder rausgeben, damit er über den Input wieder reingegeben werden kann

Input = Variablen, die rein gehen
Output = Variablen, die raus gehen
InOut = Variablen, die rein gehen, aber verändert werden können
Var = Variablen, die im DB für den nächsten Aufruf zwischengespeichert werden
Temp = Variablen, deren Wert am Ende des Bausteins verloren geht
 
:eek: Was soll der da denn?
1. Wenn Du den nicht beschaltest, bekommt der immer den Default-Wert aus der Definition, vermutlich 0
2. Wenn Du den dann intern hoch zählst, müßtest Du ihn dann ja über einen Output wieder rausgeben, damit er über den Input wieder reingegeben werden kann

Input = Variablen, die rein gehen
Output = Variablen, die raus gehen
InOut = Variablen, die rein gehen, aber verändert werden können
Var = Variablen, die im DB für den nächsten Aufruf zwischengespeichert werden
Temp = Variablen, deren Wert am Ende des Bausteins verloren geht
AHA,

meinst du mit VAR-> Static? Wenn ja dann muss ich das in einem FB Schreiben. Aktuell steht es ja nur in einem FC. bei dem hätte ich nur die möglichkeiten, Input; Output; InOut; Temp; Constant; Return
 
Wenn das ein FC ist, dann ist auch der Input nicht in einem DB... in welchem denn Deiner Meinung nach?
Du kannst ja einen DB anlegen und dann den Index dort hineinschreiben.
Auch wenn einige mich jetzt schlagen: Nur der Vollständigkeit halber: Du kannst auch über die Variablentabelle einen Merker als Index deklarieren. Macht man aber nicht mehr.
Also ja: Entweder das Ganze in einen FB packen oder aber einen Global-DB deklarieren, in dem Du solche Variablen speicherst.
Ich würde einen FB machen. Dann mach den Analogwert als Eingang, dann kannst Du den FB als "Average" für mehrere Analogwerte benutzen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn das ein FC ist, dann ist auch der Input nicht in einem DB... in welchem denn Deiner Meinung nach?
Du kannst ja einen DB anlegen und dann den Index dort hineinschreiben.
Auch wenn einige mich jetzt schlagen: Nur der Vollständigkeit halber: Du kannst auch über die Variablentabelle einen Merker als Index deklarieren. Macht man aber nicht mehr.
Also ja: Entweder das Ganze in einen FB packen oder aber einen Global-DB deklarieren, in dem Du solche Variablen speicherst.
Ich würde einen FB machen. Dann mach den Analogwert als Eingang, dann kannst Du den FB als "Average" für mehrere Analogwerte benutzen.
Ja die werte im input kamen aus einem globalen DB, aber alles klar, vielen dank für die Aufklärung.

Ich werde das nochmal in einen FB packen und ausprobieren.

Ich bedanke mich schonmal für all die Hilfe. Ich habe heute viel gelernt!
 
Als Info zu diesem Beitrag:

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

Schau dir das mal an: Software-Tiefpassfilter in STEP 7 V5.x

Den Code kannst du auch ganz einfach in TIA umsetzen.
Falls du kein Step 7 5.x (Classic) hast, hier der Code aus Step 7 5.x:

Code:
(* ============================================================================= *)
(* PURPOSE : To filter a value by applying a first-order exponential filter      *)
(*           with a user-selectable time period, F-tau. The filter is calculated *)
(*           using the following formula -                                       *)
(*                                                                               *)
(*                                 Rate                    Rate                  *)
(*           FiltOut := FiltOut * e     + RawValue * (1 - e     )                *)
(*                                                                               *)
(*           where Rate := (-0.1 / F_tau )                                       *)
(*                                                                               *)
(*           The Function Block is intended to be triggered every 100mS (hence   *)
(*           the 0.1 in the formula) from cyclic interrupt Organization Block    *)
(*           OB35. If a different resolution is required, use a different OB as  *)
(*           the trigger, and adjust the formula to reflect this.                *)                                                               
(*                                                                               *)
(* ============================================================================= *)

FUNCTION_BLOCK FB200
TITLE = 'Low Pass Filter'
VERSION : '1.0'
AUTHOR  : KenMuir
NAME    : LowPass
FAMILY  : Filter

(* ----------------------------- *)
(* DEFINITION OF LOCAL VARIABLES *)
(* ----------------------------- *)

VAR_INPUT
  RawValue          : REAL;     // Incoming unfiltered value
  F_tau             : REAL;     // Time interval (in seconds) for filter period
END_VAR

VAR_OUTPUT
  FiltOut           : REAL;     // Filtered output value
  ZRError           : BOOL;     // Error flag if F_tau is set to zero (invalid rate)
END_VAR

VAR
  LastFV            : REAL;     // Static variable holds value of FiltOut from previous
END_VAR                         // execution cycle.

VAR_TEMP
  ExpRate           : REAL;     // Equals exp(-0.1 / F_tau)
END_VAR

(* ----------------------------- *)
(*     START OF CODE SECTION     *)
(* ----------------------------- *)

BEGIN

IF     F_tau = 0.0 THEN                                        // If the filter period is set to zero ...
       ZRError := true;                                     // .. . set the Zero Rate Error bit true
ELSE
       ZRError := false;                                       // Error bit reset to false
       ExpRate := EXP(-0.1 / F_tau);
       FiltOut := LastFV * ExpRate + (RawValue * (1 - ExpRate)); // Calculate new output
       LastFV  := FiltOut;                                       // Store output value for next cycle of calculation
END_IF;
END_FUNCTION_BLOCK
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Mal ganz am Rande gefragt:
Bei Beckhoff kenn ich ein Statusbit "TXPDOToggle", welches ganz allgemein die Verfügbarkeit neuer Daten im PA anzeigt. Damit lassen sich sehr effektiv z.B. Filter triggern.
Gibt es ein solches Bit bei Siemens auch, oder muss man stur ins Datenblatt schauen, um maximal sinnvolle Scanwerte für Analoginputs zu berücksichtigen?
 
Mal ganz am Rande gefragt:
Bei Beckhoff kenn ich ein Statusbit "TXPDOToggle", welches ganz allgemein die Verfügbarkeit neuer Daten im PA anzeigt. Damit lassen sich sehr effektiv z.B. Filter triggern.
Gibt es ein solches Bit bei Siemens auch, oder muss man stur ins Datenblatt schauen, um maximal sinnvolle Scanwerte für Analoginputs zu berücksichtigen?
Togglebit gibts nicht bei Siemens.
 
@learning by doing
Mach mal einen Screenshot von der Hardware-Konfiguration deiner Analogkarte und dem besagten Kanal.
Deine verwendete Karte kann selbstständig den Analogeingang glätten mit einer Glättung auf 100ms. Oder auf relativ schnell konfiguriert werden, was bei Dir ja eher nicht gewünscht ist.

Zum Thema FIFO etc.
Entweder denke ich zu einfach, aber wenn ich eine Glättung über 5 Werte haben will, mach ich mir eine Taktflanke und schiebe die (Roh-)Werte einfach weiter. Also als ungewandelten Integer.
Im Anschluss Summe über die 5 Werte als DINT und durch 5 teilen.
Fertig.



Trigger
Int5 := Int4
Int4 := Int3
Int3 := Int2
Int2 := Int1
Int1 := AnalogIN

Count := Int1 + Int2 + Int3 + Int4 + Int5
RawValue := Count / 5
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@learning by doing
Mach mal einen Screenshot von der Hardware-Konfiguration deiner Analogkarte und dem besagten Kanal.
Deine verwendete Karte kann selbstständig den Analogeingang glätten mit einer Glättung auf 100ms. Oder auf relativ schnell konfiguriert werden, was bei Dir ja eher nicht gewünscht ist.

Zum Thema FIFO etc.
Entweder denke ich zu einfach, aber wenn ich eine Glättung über 5 Werte haben will, mach ich mir eine Taktflanke und schiebe die (Roh-)Werte einfach weiter. Also als ungewandelten Integer.
Im Anschluss Summe über die 5 Werte als DINT und durch 5 teilen.
Fertig.



Trigger
Int5 := Int4
Int4 := Int3
Int3 := Int2
Int2 := Int1
Int1 := AnalogIN

Count := Int1 + Int2 + Int3 + Int4 + Int5
RawValue := Count / 5
Analogbaugruppe kanal.pngInformation analogbaugruppe.png
 
"Störfrequenzunterdrückung: 50 Hz" - da liefert die Baugruppe nur alle 260 ms einen neuen Messwert, siehe technische Daten der Baugruppe, Link in Beitrag #13
Und da willst du noch "glätten"? Wie schnell musst du auf Extremwerte des Messwertes reagieren? (die Frage war bereits in Beitrag #15, aber bisher keine Antwort)
 
"Störfrequenzunterdrückung: 50 Hz" - da liefert die Baugruppe nur alle 260 ms einen neuen Messwert, siehe technische Daten der Baugruppe, Link in Beitrag #13
Und da willst du noch "glätten"? Wie schnell musst du auf Extremwerte des Messwertes reagieren? (die Frage war bereits in Beitrag #15, aber bisher keine Antwort)
Okay weiß ich bescheid. vielen dank für die aufklärung. Ich konnte noch nichts so richtig damit anfangen am Anfang. (bin neu was Analog Signale angeht)

Ich wollte einen Durchschnittswert haben.

Extremstwerte werden "eigentlich" nicht erwartet, zumindest nicht so das es kritisch für die Anlage wird. Da reichen 260ms vollkommen aus.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
nun soll ich aber eine Anlage bauen, in der mit Analogen werten gerrechnet und überwacht wird.
Du schreibst "überwacht". Wenn du z.B. über 5 Werte alle 250 ms glättest/Mittelwert bildest, dann dauert es ein paar Sekunden, bevor eine Überschreitung eines Grenzwertes bemerkt wird.
 
Um das Thema abzuschließen,

ich habe es nun hinbekommen, dank eurer aller Hilfe.
Ich bedanke mich für die Detailreiche aufklärung! Bei Allen!

Ich wünsche euch ein schönes Wochenende!
 
Du schreibst "überwacht". Wenn du z.B. über 5 Werte alle 250 ms glättest/Mittelwert bildest, dann dauert es ein paar Sekunden, bevor eine Überschreitung eines Grenzwertes bemerkt wird.
Der Einzelwert wird überwacht, der darf am Ende nicht über 10.0 gehen. (alle 260ms)

Die Mittelwert bildung dient zum Rechnen in abhängigkeit zu einem anderen Mittelwert.
 
Zurück
Oben