TIA Min; Max & Mittel- Tagestemperaturwert mit Datum und Uhrzeit ermitteln

Systembote

Level-2
Beiträge
9
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen !

Ich bräuchte da mal Unterstützung bei einem Problem.

Aufgabe:
Ermitteln der minimal, maximal und Mittelwert- Tagestemperatur.
bei dem Minimalwert und dem Maximalwert wird auch der Zeitstempel benötigt, das heißt mit Datum und Uhrzeit. Die Startzeit der Neuberechnung wäre in diesem Fall immer um 0:00 (Datumswechsel).
Zusätzlich sollen die Werte vom Vortag, hier in der Deklaration mit "VT" gekennzeichnet mit ausgegeben werden.
Das Ganze soll in TIA V15 und auf einer 314C 2DP in AWL realiesiert werden.

Danke im Voraus für Eure Hilfe
 

Anhänge

  • Bild 004.jpg
    Bild 004.jpg
    229,3 KB · Aufrufe: 44
  • Bild 005.jpg
    Bild 005.jpg
    51,9 KB · Aufrufe: 46
Ich bin noch ganz am Anfang und die Zeiten wo ich mit indirekter Adressierung, Pointer und dem ganzen Kram zu tun hatte ist schon eine ganze Weile her. . . .

Ich bin gerade mal dabei die Systemzeit auszulesen umzuwandeln in Lokalzeit und sie in Time_of_Day und Date aufzuschlüsseln und da hapert es schon:rolleyes:

Wie kann ich Hier eigentlich Bilder hochladen ???
Drag and Drop funktioniert ja nicht . . .
 
Zukunftssicher AWL und 300er, aber dann TIA.

Wie oft soll die Temperatur abgefragt werden? Einmal am Tag, dann ist es einfach der Wert ist dann min, max und Mittelwert zugleich und die Uhrzeit weißt du auch.

Das man euch auch immer die Hausaufgaben komplett aus er Nase ziehen muss...
 
Ich habe für den "BT_LT Baustein" die WS_Rules als Static Parameter angelegt und müsste jetzt beim Eingang WS_Dat vom BT_LT Baustein deklarieren wo die Werte herkommen sollen.
So wie ich mich noch ganz schwach erinnern kann Die Adresse von dem DB dann den Anfangspunkt und die Länge, aber wie nur . . .
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zukunftssicher AWL und 300er, aber dann TIA.

Wie oft soll die Temperatur abgefragt werden? Einmal am Tag, dann ist es einfach der Wert ist dann min, max und Mittelwert zugleich und die Uhrzeit weißt du auch.

Das man euch auch immer die Hausaufgaben komplett aus er Nase ziehen muss...
Also es geht zum Beispiel um die Aussentemperatur und der Zeitpunkt für erreichen des Minwertes kann nicht der gleiche sein wie der für denn Maxwert. Der Mittelwert braucht keinen Zeitstempel
Die Temperatur ist ein Real Wert und Kommt direkt vom Sensor - Temperatur Aussenfühler PT1000
 
Zuletzt bearbeitet:
Min: auf Datentyp maxwert initialisieren und dann prüfen ob der messwert kleiner ist. Dann speichern mit Uhrzeit

Max: auf Datentyp minimalwert initialisieren und dann prüfen ob der messwert größer ist. Dann speichern mit Uhrzeit

Avg: alle Messwerte summieren und durch Anzahl Messwerte Teilen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also als erstes wollte Ich mich um die Uhrzeit kümmern. Die benötige ich ja um den Zeitpunkt für erreichen der Min und Max-werte festlegen zu können.

die Zeiten wo ich mit indirekter Adressierung, Pointer und dem ganzen Kram zu tun hatte ist schon eine ganze Weile her. . . .

Ich bin gerade mal dabei die Systemzeit auszulesen umzuwandeln in Lokalzeit und sie in Time_of_Day und Date aufzuschlüsseln und da hapert es schon :rolleyes:

Ich habe für den "BT_LT Baustein" die WS_Rules als Static Parameter angelegt und müsste jetzt beim Eingang WS_Dat vom BT_LT Baustein deklarieren, wo die Werte dafür herkommen sollen.
So wie ich mich noch ganz schwach erinnern kann, die Adresse von dem DB dann den Anfangspunkt und die Länge, aber wie nur . . .

Pointer, Any Bla bla bla ?????:rolleyes:
 

Anhänge

  • Bild 006.jpg
    Bild 006.jpg
    210,4 KB · Aufrufe: 8
  • Bild 007.jpg
    Bild 007.jpg
    107,5 KB · Aufrufe: 10
Ich wurde als Eingang den aktuellen Messwert und den Zeitstempel nehmen.
Wenn der Zeitstempel sich geändert hat,dann liegt ein neuer Messwert an.
Wenn es ein neuer Tag ist, schiebe die Min, Max und Avgwerte in die dementsprechenden Variabelen und initialisiere die alten neu.
Dann prüfe und ermittle wie @DOD666 bereits beschrieben hat.

Nachtrag: Warum AWL? Nimm SCL und du hast in ca. 15 Codezeilen alles drin.
 
Min: auf Datentyp maxwert initialisieren und dann prüfen ob der messwert kleiner ist. Dann speichern mit Uhrzeit

Max: auf Datentyp minimalwert initialisieren und dann prüfen ob der messwert größer ist. Dann speichern mit Uhrzeit
Min auf maxwert initialisieren und Max auf minimalwert initialisieren?
Woher nehmen minimalwert und maximalwert?
Klarer finde ich, beim Schreiben des ersten Messwertes einer MessPeriode, Min und Max mit dem aktuell gemessenen Wert vorzubesetzen.
 
Min auf maxwert initialisieren und Max auf minimalwert initialisieren?
Woher nehmen minimalwert und maximalwert?
Klarer finde ich, beim Schreiben des ersten Messwertes einer MessPeriode, Min und Max mit dem aktuell gemessenen Wert vorzubesetzen.
Dann muss ich ja bei initialisieren für die erste Messung einen Spezialfall schaffen anders funktioniert immer der normale Vergleich.

Bei Temperatur im Haus würde auch folgendes gehen:
IF reset then
statMin := 100.0;
statMax:= - 100.0;
End_if;

If neueMessung then
If aktTemp < statMin then
statMin :=aktTemp;
End_if;
End_if;

So in der Art.
 
Zuletzt bearbeitet:
Wie muss ich den WS_DAT Eingang am BT_LT Baustein beschreiben damit der Baustein sich die Werte aus dem IDB holt??
 

Anhänge

  • Bild 006.jpg
    Bild 006.jpg
    216,5 KB · Aufrufe: 17
  • Bild 007.jpg
    Bild 007.jpg
    198 KB · Aufrufe: 17
Nimm am besten Loc_Time, dann bekommst du direkt die lokale Zeit.
Ich vermute, bei CPU 314C wird Loc_Time nur einen Fehler melden, weil die Uhr keinen Uhrzeitstatus hat.


@Systembote
In welcher Zeitzone läuft denn die Uhr Deiner CPU 314C? Hast Du da auch einen CP343-1 und/oder eine Uhrzeitsynchronisation?

Wenn Du mit dem BT_LT nicht klarkommst, da gibt es auch eine abgespeckte Version BT_LT_3 von mir:
Wenn man bei einer S7-300-PN-CPU oder S7-400-PN-CPU oder ET200-PN-CPU die Uhrzeitsynchronisation per NTP aktiviert, dann läuft die CPU-Uhr in UTC - weil man für diese CPU keine Zeitzone einstellen kann und NTP ja UTC liefert.

Wenn man bei einem IE-CP CP343-1 oder CP443-1 die Uhrzeitsynchronisation per NTP aktiviert, dann berücksichtigt der CP eine einstellbare Zeitzonenkorrektur, so daß die CPU-Uhr bei standardmäßig eingestellter Zeitzone "(GMT +01:00)" "trotz" NTP-Synchronisation in UTC+1 läuft. (...) Damit auch bei NTP-Synchronisation via CP die CPU-Uhr in UTC läuft, müßte man die Korrektur abschalten, indem man die Zeitzone auf "(GMT)" einstellt.
(...)
Weil nun wegen dieser CP-Geschichte manche meiner SPS-Uhren in UTC und manche in UTC+1 laufen, gibt es meinen Baustein BT_LT_3 in 2 Versionen, einmal für UTC+1 bei CP in GMT+1, und einmal für UTC bei PN-CPU oder CP mit GMT-Einstellung.

Harald
 
Dann muss ich ja bei initialisieren für die erste Messung einen Spezialfall schaffen anders funktioniert immer der normale Vergleich.
Ja, das ist leider so. Und das ist auch so, wenn man mit dem MinWert und MaxWert eines vorgegeben DatenTyps "initialisiert".
Aber, da ich nicht die MinWerte und MaxWerte aller numerischen DatenTypen im Kopf habe (für BYTE 0/255, SINT -128/127, USINT 0/255, INT -32768/32767 und UINT 0/65535 reicht es gerade so eben), finde ich das Vorbesetzen mit dem ersten MessWert dennoch "bequemer".
Übrigens sehe ich noch nicht, wie man das Initilisieren im NormalFall gezielt steuern soll.
Irgendein Kriterium muss man schon für den Start einer neuen MessPeriode vorgeben/beinflussen können.
Im Falle dieses Thread drängt sich die laufende Nummer der aktuellen Messung dafür auf, indem ich sie bei Bedarf auf 0 (zurück-)setze.
Gebraucht wird sie zwar nur für die MittelwertBildung, aber die ist ja ohnehin im "Paket" der Wünsche enthalten.
... So in der Art.
Oder so in der Art:
Code:
VAR_INPUT
    irActVal  : REAL ; // aktueller MessWert
END_VAR

VAR_IN_OUT
    ioiNumVal : INT  ; // laufende Nummer der aktuellen Messung 1..32767 (0 oder negativ -> neue MessPeriode starten)
    iorMinVal : REAL ; // kleinster aufgetretener MessWert der MessPeriode
    iorMaxVal : REAL ; // groesster aufgetretener MessWert der MessPeriode
END_VAR

VAR_OUTPUT // alternativ FC-RückgabeWert
    orMedVal  : REAL ; // aktueller MittelWert der MessPeriode
END_VAR

VAR_STAT // alternativ als VAR_IN_OUT
    srSumVal  : REAL ; // aktuelle Summe aller MessWerte der MessPeriode
END_VAR

ioiNumVal := MAX(ioiNumVal, 0) + 1 ; // Werte < 1 durch 0 ersetzen und 1 addieren
srSumVal  := srSumVal + irActVal ;   // Summe aktualisieren

IF ioiNumVal < 2 THEN           // Start einer neuen MessPeriode ?
    srSumVal  := irActVal ;       // ggfs erste Messung einer MessPeriode
    iorMinVal := irActVal ;       // srSumVal, iorMinVal und iorMaxVal "initialisieren"
    iorMaxVal := irActVal ;
//    iorMaxVal := iorMinVal := srSumVal := irActVal ; // alternative Schreibweise?
ELSIF iorMaxVal < irActVal THEN // neuer MaxWert ?
    iorMaxVal := irActVal ;       // ggfs als neuen MaxWert übernehmen
ELSIF iorMinVal > irActVal THEN // neuer MinWert ?
    iorMinVal := irActVal ;       // ggfs als neuen MinWert übernehmen
END_IF ;
orMedVal  := srSumVal / INT_TO_REAL(ioiNumVal) ; // MittelWert aktualisieren
 
Zuletzt bearbeitet:
Zurück
Oben