WAGO DataLogger mit eigenem STRUCT füttern?

Hans_

Level-1
Beiträge
10
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Tag in die Runde,

ich habe hier einen WAGO 0750-0880 auf dem ich den Datenlogger von WAGO laufen lasse.
Das klappt auch soweit ganz gut.

Jetzt ist es aber so, dass ich die zu loggenden Daten bereits in einem eigenen (Array-of-)STRUCT liegen habe und aktuell einzelne Daten von meinem STRUCT in das STRUCT umkopiere, das die WAGO Lib vom Logger mitbringt.
Was funktioniert, aber unschön ist und mir mehr Retainspeicher raubt als eigentlich nötig.

Kann ich dem Logger auch ein anderes Array-of-Struct zum Loggen übergeben?
Einfach einen eigenen (gleich lautenden Datentypen) anlegen funktioniert nicht, da beim Übersetzen gemeckert wird, dass die Logger-Lib diesen Namen schon belegt. Aber selbst wenn das klappen würde, wären in meinem Struct ja andere und mehr Daten als der Funktionsbaustein an seinem Dateneingang erwartet...?!

Hat jemand eine Idee?

Original-Struct-Logger.jpg

Hans
 
Moin, versteh noch nich ganz warum Du eine eigene Struktur mit gleichem Aufbau anlegen willst, aber grundsätzlich könntest Du auch nur einen Pointer auf Deine Struktur an die Dataloger Stucktur "übergeben". Aber dann muss der Aufbau der Strukturen wirklich passen, weil CODESYS das manchmal nich so hintereinandern in den Speicher packt, wie die Struktur es suggerieren würde.
Gib doch mal ein Bsp. wie das bei Dir ausschaut.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo KLM,

da habe ich mich wohl schlecht ausgedrückt: Ich habe bereits ein ARRAY-OF-STRUCT mit meinem eigenen Datentyp 'TEMP_META' angelegt (siehe unten).
Jeder PT1000 bzw. jeder Raum im Haus hat einen solchen Datensatz, den ich am liebsten komplett loggen würde. In erster Linie interessiert mich der Temperaturverlauf in Kombination mit dem Zustand des Heizkreises.

Der Logger ist erst kürzlich ins Spiel gekommen und erwartet die Datensätze ja wie in meinem Eingangspost angehängt. Aktuell kopiere ich nur den Wert 'rTEMP_live' in ein weiteres ARRAY-OF-STRUCT vom Typ 'typUserInput' wie ihn der Logger verarbeiten kann. Aber im Prinzip habe ich dann zwei recht große Arrays (retain persist) für die gleichen Informationen. Kann ich dem Logger auch irgendwie direkt mein Array-of-Struct unterjubeln?

Code:
TYPE TEMP_META :
STRUCT
    sRaum:STRING(20);     (* ---> Raumbezeichnung fuer den dieser Datensatz gilt *)
    iRaumID:INT;            (* ---> Raumnummer *)
    rTEMP_live:REAL;        (* ---> aktueller Wert *)
    rTEMP_old:REAL;        (* ---> alter/letzter Wert *)
    rTEMP_GRADIENT: REAL;        (* ---> zuletzt berechnete Differenz aus aktuellem und altem Wert (Gradient) *)

    (* ---> SOLL Temperaturen TAG *)
    rTEMP_DAY_OFF : REAL:=22.4;        (* ---> obere Raumtemperatur = Heizkreis schließen*)
                                            (* ---> dazwischen Hysterese; initial=AN; von oben kommend=AUS; von unten kommend=AN *)
    rTEMP_DAY_ON : REAL:=21.0;            (* ---> untere Raumtemperatur = Heizkreis öffnen*)
    rTEMP_DAY_CRITICAL : REAL:=16.0;    (* ---> kritische Raumtemperatur = heizen unter allen Umständen*)

    (* ---> SOLL Temperaturen NACHT --- aktuell UNBENUTZ ---*)
    rTEMP_NIGHT_OFF : REAL:=21.0;        (* ---> obere Raumtemperatur = Heizkreis schließen*)
                                            (* ---> dazwischen Hysterese; initial=AN; von oben kommend=AUS; von unten kommend=AN *)
    rTEMP_NIGHT_ON : REAL:=19.0;        (* ---> untere Raumtemperatur = Heizkreis öffnen*)
    rTEMP_NIGHT_CRITICAL : REAL:=16.0;(* ---> kritische Raumtemperatur = heizen unter allen Umständen*)

    (* ---> Maximalwerte (absolutes MAX und maxGRADIENT) zur Branderkennung *)
    rTEMP_absolut_MAX:REAL;        (* ---> wenn größer, dann unnormal hohe Raumtemperatur *)
    rTEMP_gradient_MAX:REAL;        (* ---> wenn größer, dann unnormale Änderungsgeschwindigkeit *)
    rTEMP_MAX:REAL;                (* ---> Speicher für temporär maximale Temperatur *)
    rTEMP_MIN:REAL;                    (* ---> Speicher für temporär minimale Temperatur *)

    xWohnraum:BOOL;            (* ---> Flag um Wohnräume zu kennzeichnen *)
    xSchlafraum:BOOL;            (* ---> Flag um Schlafräume zu kennzeichnen *)

    xTEMP_critical:BOOL;            (* ---> Flag 'Temperatur viel zu niedrig' = Notheizung *)
    xTEMP_low:BOOL;                (* ---> Flag 'Temperatur niedriger als gewünscht' *)
    xTEMP_ok:BOOL;                (* ---> Flag 'Temperatur OK' *)
    xTEMP_high:BOOL;            (* ---> Flag 'Temperatur unnötig hoch' *)
    xGRADIENT_high:BOOL;        (* ---> Temperatur ändert sich zu schnell *)
    xABSOLUT_TEMP_high:BOOL;(* ---> Raumtemperatur unnormal hoch (absolut) *)

    xHZG_visu: BOOL;                (* ---> Flag zur manuellen Bedienung *)

END_STRUCT
END_TYPE
 
Klares nein für den fertigen Logger-FB. Du könntest Dir natürlich selbst einen Logger bauen, der genau Deine Strucktur nimmt, aber der Aufwand is doch recht hoch. Du wirst also um ein mapping nicht herum kommen. Ich weiß jetzt nich genau, ob die Logger Lib da schon was als Retain vorgibt, aber wenn nicht, brauchst ja nur Dein Struktur-Array als Retain deklarieren. So auf die Schnell weiß ich noch nich wie, aber ich würde versuchen das mapping zur Laufzeit in einen FB oder Aktion auszulagern. Idealerweise so, dass alles konstante nur einmal gemappt wird und nur die sich variablen Variablen :D zyklich umkopiert werden.
Wie hoch wäre der Aufwand Dein Programm auf die Struktur des Loggers anzupassen?
 
Btw, der Logger FB unterstützt glaube ich max. 80 Kanäle - in einem der letzten Updates war glaube ich aber auch eine Erhöhung auf mehr. Aber es bleibt eine max. Grenze. Bevor Du anfängst schau also, ob Dein Strucktur-Array da voll rein passt.
 
Zurück
Oben