WinCC Archiv nur bei Wertänderung-Schreibt aber gleiche Werte.

mista

Level-2
Beiträge
147
Reaktionspunkte
9
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, ich habe ein Archiv aus einem Array [0..80].
Jedes Element habe ich einzeln dem Variablenarchiv hinzugefügt.


1759831878797.png
Wenn ich die CSV in Excel einlese und nach einem Datenpunkt filtere, erhalte ich innerhalb einer Minute (nach Timestamp) ca. 10–12 Einträge mit demselben Wert, z. B. 71.65364. 71.65364 wäre in diesem Fall die Vorlauftemperatur der Heizung.

1759835494994.png

Ich habe das mit einem Array gelöst, da ich jede Sekunde mit einem zyklischen Interrupt-OB überprüfe, ob der Wert die Hysterese über- oder unterschreitet. Erst dann schreibe ich in DB_ArchiveData.Data[x].archiveData. Meine Vermutung ist, dass DB_ArchiveData.Data[x].archiveData ins Archiv geschrieben wird. So wie es aussieht, schreibt er jedoch das komplette Archiv, sobald sich ein Datenpunkt im Array ändert???

Muss ich das Array wieder auf einzelne Variablen mappen und nur diese archivieren?

40.000 Datenpunkte in nicht einmal einer Stunde. Daher habe ich zunächst die Hysteresen angepasst und den OB von 1 s auf 5 s erhöht.

Komisch ist es trotzdem. Oder verstehe ich das falsch?

VG mista
 
Zuletzt bearbeitet:
Mit welchem WinCC und welcher Version arbeitest du?
Was mich wundert: wieso steht in der csv-Datei der Name der Prozessvariable und nicht der Name der Archivvariable (HMI-Variable)?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
TIA V17, Comfort Panel TP 1500. Frag mich bitte nicht, welche WinCC Version. :unsure:Ich wüste nicht, dass Panels mehrer haben. Ich kenn das nur von HMI PCs mit Advance oder Professional Runtime.
 
ja, reicht. Es geht also um TIA WinCC für Comfort Panels, V17.

Meines Erachtens sollte da nicht das ganze Array archiviert werden, wenn sich nur eine einzeln projektierte Archiv-Variable ändert. Beim Zugriff auf eine Array-Variable wird allerdings immer das ganze Array aktualisiert/gelesen - das sollte aber m.E. keinen Einfluss auf die Archivierung einzelner Variablen haben. Kannst du uns mal zeigen, wie die Projektierung einer einzelnen Archiv-Variable und deren Archivierungs-Einstellung bei dir ist?
Vielleicht komme ich heute oder morgen dazu, das mal mit TIA V16 auszuprobieren (ich habe kein TIA V17).
Oder du fragst den Siemens Support. (Gibt es den Support für TIA V17 noch ohne Münzeinwurf?)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Initialisierung:
Code:
// BHKW VL
"DB_ArchiveData".Data[0].isBool := FALSE;
"DB_ArchiveData".Data[0].deadband := 0.5;
"DB_ArchiveData".Data[0].scaleFactor := 1.0;
"DB_ArchiveData".Data[0].srcReal := "AI30_BHKW_VL_Temp".MeasuringValue;
"DB_ArchiveData".Data[0].srcBool := FALSE;

// BHKW RL
"DB_ArchiveData".Data[1].isBool := FALSE;
"DB_ArchiveData".Data[1].deadband := 0.5;
"DB_ArchiveData".Data[1].scaleFactor := 1.0;
"DB_ArchiveData".Data[1].srcReal := "AI31_BHKW_RL_Temp".MeasuringValue;
"DB_ArchiveData".Data[1].srcBool := FALSE;

// BHKW Gas (Nm³/h)
"DB_ArchiveData".Data[2].isBool := FALSE;
"DB_ArchiveData".Data[2].deadband := 1.0;
"DB_ArchiveData".Data[2].scaleFactor := 1.0;
"DB_ArchiveData".Data[2].srcReal := "AI15_BHKW_GZ".MeasuringValue;
"DB_ArchiveData".Data[2].srcBool := FALSE;


... bis Array Index 77 und dann in einer Forschleife:

Code:
FOR #i := 0 TO 77 DO
    
    IF "DB_ArchiveData".Data[#i].isBool THEN
        // Bool -> 0.0 oder scaleFactor (z. B. 100.0)
        IF "DB_ArchiveData".Data[#i].srcBool THEN
            #rSample := "DB_ArchiveData".Data[#i].scaleFactor;
        ELSE
            #rSample := 0.0;
        END_IF;
        
        IF "DB_ArchiveData".Data[#i].archiveData <> #rSample THEN
            "DB_ArchiveData".Data[#i].archiveData := #rSample;
        END_IF;
    ELSE
        // Analog: nur bei Überschreiten des Totbands schreiben
        IF ABS("DB_ArchiveData".Data[#i].srcReal - "DB_ArchiveData".Data[#i].archiveData) > "DB_ArchiveData".Data[#i].deadband THEN
            "DB_ArchiveData".Data[#i].archiveData := "DB_ArchiveData".Data[#i].srcReal;
        END_IF;
        
    END_IF;
    
END_FOR;



Ich hab das jetzt so vorbereitet, dass ich die Array Variable mappe in nicht Array eigene Real variablen. Morgen an der Anlage teste ich dann.

Code:
"DB_ArchiveData".BHKW_VL := "DB_ArchiveData".Data[0].archiveData;
"DB_ArchiveData".BHKW_RL := "DB_ArchiveData".Data[1].archiveData;
"DB_ArchiveData".BHKW_Gas := "DB_ArchiveData".Data[2].archiveData;
...
1760003917870.png
[...]Kannst du uns mal zeigen, wie die Projektierung einer einzelnen Archiv-Variable und deren Archivierungs-Einstellung bei dir ist?
Vielleicht komme ich heute oder morgen dazu, das mal mit TIA V16 auszuprobieren (ich habe kein TIA V17).
Oder du fragst den Siemens Support. (Gibt es den Support für TIA V17 noch ohne Münzeinwurf?)

Ich weiß nicht was du meinst, die Einstellung ist, "Bei Änderung" genauso wie beim Array vorher auch.
 
Ich weiß nicht was du meinst, die Einstellung ist, "Bei Änderung" genauso wie beim Array vorher auch.
Ich wollte sehen, ob du im WinCC wirklich mit einzelnen Variablen arbeitest, und nicht doch irgendwie mit dem ganzen Array. Was du in der SPS machst, sollte dafür nicht relevant sein.
 
Ne ne, wie im Eingangspost habe habe ich tatsächlich 78 mal das Array einzeln aufgerufen von 0 bis 77.
Ich werde auf jeden Fall nochmal berichten ob es mit den nicht Arrayvariablen jetzt besser ist.

Ich koppiere das varibalenarchiv und speichere das ab. Das klappt das löschen des Archivs aber leider nicht,.

debugNo ist 800 => Ziel ist es immer nur die letzte Stunde zu speichern und archiv neustarten. ChatGPT meinte, dass löschen der Datei und Öffnen so wie starten würde eine frische neue Datei erstellen.


Code:
CloseAllLogs
SmartTags("debugNo") = 800
SmartTags("storage") = StoragePath & "Variablenarchiv0.csv"
' --- NEU: alte/n aktuelle/n File(s) löschen, damit garantiert frisch begonnen wird
fs.Kill(StoragePath & "Variablenarchiv0.csv")
fs.Kill(StoragePath & "Variablenarchiv1.csv") : Err.Clear ' falls vorhanden

SmartTags("debugNo") = 900
' --- NEU: wieder öffnen und NUR dein Variablenarchiv starten
'OpenAllLogs
'StartLogging hmiDataLog, "Variablenarchiv"   ' nur dein Zielarchiv starten
SmartTags("debugNo") = 1000
'Verwendeten Speicher wieder freigeben
Set fs = Nothing

ACHSO Das Array ist ja ein Array of UDT. Vielleicht hat es ja was damit zu tun, denn .srcReal hat ja immer einen anderen Wert.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich verstehe das nicht! Schon wieder werden die gleichen werte für eine Archivvariable geschrieben.
So hält auch ein Siemens Stick keine 2 Wochen aus... :(

Kann es daran liegen, da ich das Archiv in einer Kurvenanzeige lese (welche btw richtig laaaaaaaaaaaangsam ist)?1760077535079.png

Oder Weil es kein RDB ist sondern:
1760078992855.png

Oder weil es zyklisch 1s erfasst wird, denn in der Hilfe steht:
"Bei Änderung":
Die Variablenwerte werden archiviert, sobald das Bediengerät eine Wertänderung der Variablen feststellt.

Oder sollte ich mehrer kleine Variablenarchive erstellen, damit es auch perfomanter läuft???

Kann es sein, dass jedes mal alle Archivvariablen geschrieben werden, wenn sich eins ändert?

1760079934315.pngIch muss das heute zum laufen bringen.
1760076827342.png
 
Zuletzt bearbeitet:
Zurück
Oben