Step 7 Berechnungen im SCL zu einer fest gelegten Uhrzeit

PuiPui

Level-1
Beiträge
4
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen!

Ich habe folgendes Problem:
Ich möchte, dass zu einer bestimmten Uhrzeit in einem SCL Berechnungen erfolgen sollen

Der Code sieht folgendermaßen aus:
Geisterstunde := TIME_OF_DAY#00:00:0.0; // Geisterstunde entspricht 0.00 Uhr Mitternacht

i := READ_CLK(CDT := CPUDaTi); // Aktuelle(s) CPU-Zeit und Datum im Format DT#1990-01-01-00:00:00:000 erfragen
TimeOfDay := DT_TOD(IN :=CPUDaTi); // Aktuelle CPU-Zeit im Format TOD#00:00:00.000 erfragen


IF TimeOfDay = Geisterstunde THEN
...mach das und das...

Das Problem liegt darin, dass aufgrund der Zykluszeit die Abfrage auf exakt 0:00 Uhr gelingt, da man immer ein paar ms daneben liegt.

Wie kann ich das richtig umsetzen?

Vielen Dank für eure Hilfe m Voraus!
 
Ganze einfach wäre nun (TOD / 1000) * 1000, damit eliminierst du die ms.
Allerdings benötigst du dann beim IF vielleicht noch eine Flanke, wenn die Berechnung wirklich nur einmalig ausgeführt werden soll.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Exakt auf Zeit geht einfach nicht. Aber wenn du einfach direkt nach dem Wechsel die Ausführung machen willst, dann mit einem Hilfmerker.

Ich mach das so.
Code:
  // Transfer to Dayvalue und convert to kWh. Actual Value / actual Sec of Hour = Dayvalue in kWh
  IF USINT_TO_INT(#dateandtime.DAY) <> #sTag THEN
      FOR #index := 0 TO 24 DO
          #Tageswert.stunde[#index].woSaving := 0;
          #Tageswert.stunde[#index].wSaving := 0;
      END_FOR;
      #sTag := USINT_TO_INT(#dateandtime.DAY);
  END_IF;

Das wäre jetzt ein einfacher Tageswechsel. Du kannst da natürlich noch die Stunde dazunehmen.

mfG René
 
Du könntest Dir merken ob die Aktion bereits durchgeführt wurde. Oder wann (an welchem Tag) die Aktion das letzte mal ausgeführt wurde (siehe #3 von vollmi). Und dann nur ausführen, wenn "heute noch nicht ausgeführt" wurde.

Code:
WENN Uhrzeit >= Ausführungszeitpunkt  //oder in einem Zeitfenster von...bis
  WENN NICHT wurde_ausgeführt DANN
    wurde_ausgeführt := TRUE;
    Tue_was ... ;
  ENDE_WENN;
SONST
  wurde_ausgeführt := FALSE;  //außerhalb des Zeitfensters wieder rücksetzen
ENDE_WENN;

Wenn die Aktion exakt um Mitternacht sein soll (also Beginn des neuen Tages), dann reicht es oft, nur den Tag des Datums auszuwerten - wenn aber das SPS-Programm um Mitternacht nicht lief, dann wird die Aktion beim nächsten Programmstart zu irgendeiner Uhrzeit ausgeführt.

Harald
 
Zurück
Oben