# Aktuelle Zeit und Datum auslesen ?



## Anonymous (27 April 2005)

Hallo zusammen,

kann mir jemand sagen wo und wie ich das aktuelle Datum und die aktuelle Zeit aus dieser CPU auslesen kann ? 

Wird eigentlich auch irgendwo eine Zeit mitgeführt die mir anzeigt wie lange die SPS z.B. nach einem Stromausfall oder nach dem Einschalten läuft ?

Besten Dank
  Uwe


----------



## RMA (27 April 2005)

Wenn Du das meinst, kannst Du das in Simatic Manager:

Zielsystem -> Diagnose/Einstellung -> Uhrzeit stellen

Zur zweiten Frage, mir ist nichts bekannt - aber ich bin auch kein Guru! :lol:


----------



## Anonymous (27 April 2005)

Das ist klar, aber ich möchte die Zeit und den Tag im Programm auslesen und z.b. in 4 Merker Bytes abspeichern.

Trotzdem Danke.


----------



## cmm1808 (27 April 2005)

*SPS Uhrzeit*

Hallo,

als erstes brauchst Du aus der Bibliothek des Simatikmanagers folgendende Bausteine:
SFC20 BLKMOV
SFC1 Read_clk clk_func
(Beschreibung des Bausteins in der Hilfe beachten)


Diese Bausteine kopierst Du in dein Projekt.
Um die Daten zu speichern benötigst Du einen DB.
Hier erstellst Du einen Datenbereich mit dem Format DAT oder auch DT (beides ist gleuch)
Dieser Bereich wird 8 Bytes belegen.

Format DT:
JJ-MM-TT-STDSTD:MINMIN:SECSEC:MSMSMS 

Am CDT Ausgang des SFC1 kanst Du nur lokal in dem Baustein ablegen,
in dem Du den SFC1 aufrufst.
Diesen Lokalbereich must du als Date_AND_TIME  Format im TEMP Register kennzeichnen.
Jetzt muß dieses TEMP Register global nutzbar gemacht werden.
Dazu wird das Register in den DB übertragen.
Hierzu braucht man den SFC20.
An den Parametereingang SRCBLK trägst Du nun dein TEMP Register an.
Für den Parameterausgang musst Du einen Zeiger in AWL schreiben.
Dieser Zeiger zeigt dann auf den Datenbereich im DB.(z.B. DB1 ab DBX0.0)
Der Zeiger wird auch lokal im TEMP Register abgelegt.
z.B. Name:"Zeiger", Datentyp:Any, Adresse:0

AWL Anweisung für den Zeiger auf DB1 mit Anfang DBX0.0

L B#16#10--         Codierung für Any Zeiger
T LB 0 --                Transferiert Code in Lokalbyte 0 (Adresse 0)
L B#16#E--           Code für Datentyp DT
T LB 1 --               Transferiert Code in Lokalbyte 1
L 8 --                    Anzahl der zu übertragenden Bytes
T LW 2 --               Transferiert 8 in Lokalwort 2
L 1  --                    Nummer des DB (hier DB1) auf dem gezeigt wird
T LW 4 --               Transferiert 1 in Lokalwort 4
L P#DBX0.0 --        Pointer des Anfangsbit des DT Formats im DB1
T LD 6  --                Transferiert Pointer in Lokaldoppelwort 6

Dieser Zeiger heißt "Zeiger" und wird an DSTBLK vom SFC20 angetragen.
Das aktuelle Datum mit Uhrzeit wird nin zyklisch in den DB geschrieben.
Kann für S7 300 und 400 angewendet werden.

Es gibt auch die Möglichkeit das Datum und die Uhrzeit vom SPS Programm zu ändern.
Schau mal in die Bibliothek rein.

MFG


----------



## RMA (27 April 2005)

Es geht auch einfacher. In den Lokaldaten für OB1 findest Du die Zeit (und Datum, glaube ich) wann OB1 gestartet wurde, ich bin zu Hause im Moment, also kann ich die genaue Variablennamen nicht nennen, aber sie müssen leicht zu erkennen sein.

Gegenüber eine weit verbreitete Meinung, diese Zeit ist *nicht *die Zeit wann OB1 zum 1. mal nach Power-Up gestartet wurde, sondern wird jeden Zyklus aktualisiert. Dann kannst Du SFC1 getrost vergessen!

Ansonsten weiter wie von cmm1808 geschildert.


----------



## Onkel Dagobert (27 April 2005)

Hallo,



			
				RMA schrieb:
			
		

> ...Gegenüber eine weit verbreitete Meinung, diese Zeit ist *nicht *die Zeit wann OB1 zum 1. mal nach Power-Up gestartet wurde, sondern wird jeden Zyklus aktualisiert....


Stimmt, diesen Irrtum unterlag ich auch einmal  . Ich war fälschlicherweise der Ansicht, dass der OB1 nicht jeden Zyklus neu gestartet wird.




			
				s7-312C user schrieb:
			
		

> ...Wird eigentlich auch irgendwo eine Zeit mitgeführt die mir anzeigt wie lange die SPS z.B. nach einem Stromausfall oder nach dem Einschalten läuft ?...


Der Zeitstempel des letzten Neustarts müsste in den Lokaldaten des OB100 abgelegt sein. Man kann diese Daten im OB100 z.Bsp. in einen DB übertragen.

Gruss, Onkel


----------



## Anonymous (27 April 2005)

Hallo zusammen,

danke schon mal für Eure Antworten. 
Ich habe mal folgendes daraus gemacht:

Und zwar habe ich ganz dreist in der Funktion eine temp var vom Typ DATE_AND_TIME angelegt und an die Funktion SFC 1 übergeben.
Die dort enthaltenen Zeiten von BCD nach int konvertiert und in globale Merker transferiert. (siehe Source) Und ich kann die Zeit und das Datum sehen. Ist das mit den Pointern was cmm1808 geschrieben hat den zwingend ? Sprich stürtzt mir das Programm irgendwann ab wenn ich das so wie unten geschrieben mache ?

FUNCTION "ZeitUndDatum" : VOID
TITLE =
VERSION : 0.1


VAR_TEMP
  reti : INT ;	
  zeit : DATE_AND_TIME ;	
END_VAR
BEGIN
NETWORK
TITLE =


      CALL "READ_CLK" (
           RET_VAL                  := #reti,
           CDT                      := #zeit);


NETWORK
TITLE =
      L     LB     4; 
      BTI   ; 
      T     "Tag"; 

      L     LB     5; // Stunde
      BTI   ; 
      T     "Stunde"; 

      L     LB     6; // Minute
      BTI   ; 
      T     "Minute"; 

      L     LB     7; // Sekunde
      BTI   ; 
      T     "Sekunde"; 

END_FUNCTION


Genaueres sehe ich erst morgen in der Früh wenn die "Kiste" noch läuft. (Hoffnung)

@Onkel Dagobert

Das mit dem OB100 habe ich so ähnlich heute auch noch gehört. Der OB100 wird doch nur einmal am Start durchlaufen und dann könnte ich da ja auch einmal die Zeit auslesen und abspeichern falls es nicht schon in den lokalen Daten steht.
Wo finde ich den solche Informationen was wo wie steht ? 

Beste Grüße
  Uwe


----------



## Onkel Dagobert (27 April 2005)

Hallo Uwe,

dein code müsste so funktionieren. Den Pointer (cmm1808) brauchst du nicht, wenn du die Daten direkt adressierst, so wie du es getan hast. Sinnvoll wäre ein Pointer z.Bsp. dann, wenn du die Daten über einen Bausteinparameter in einen globalen Datenbereich (z.Bsp. DB) schreiben würdest.

Informationen über die Lokaldaten eines OB findest du, wenn du die Onlinehilfe in Step7 verwendest (OB100 selektieren und Taste F1).


Gruss, Onkel


----------

