Herauslösen von Stunde,Minute,Sekunde aus Zeit in CPU

apachler

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


So nun muss ich euch schon wieder mal auf die "Probe" stellen! :D


Muss für mein Programm eine Auswertung machen, für die ich
die Stunden,Minuten,Sekunden aus der CPU brauche.


Das ganze sollte also extra in MW liegen ...
also zum Beispiel:
Stunden -> MW1
Minuten -> MW2
Sekunden -> MW3

Habe mittels SFC1 (Read System Clock) und FC8 (DT_to_TOD)
die Zeit als Time_Of_Day Variable.


Nun wie kann ich aus dieser Variable meine benötigten Daten "extrahieren"?



mfg Andreas
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Aus der Siemens Hilfe:

In nachfolgender Tabelle ist der Inhalt der Bytes aufgeführt, die die Information zu Datum und Uhrzeit enthalten. Das Beispiel zeigt Datum und Uhrzeit für Donnerstag, den 25. Dezember 1993, 8:01 Uhr und 1,23 Sekunden.


Byte
Inhalt
Beispiel

0
Jahr
B#16#93

1
Monat
B#16#12

2
Tag
B#16#25

3
Stunde
B#16#08

4
Minute
B#16#01

5
Sekunde
B#16#01

6
Die beiden höchstwertigen Ziffern von MSEC
B#16#23

7
(4MSB)
Die niederwertigen Ziffern von MSEC

B#16#0

7
(4LSB)
Wochentag
1 = Sonntag
2 = Montag
...
7 = Samstag
B#16#5

Jetzt musst du dir aus der Struktur Date_And_Time welche du vom SFC1 erhältst nur noch die oben beschriebenen Bytes herauslösen.

In meinem Fall Stand bei DB2.DW0 das Format Date_And_Time
Code:
      L     DB2.DBB    2
      BTI   
      T     "DB2 Uhrzeit".Tag_Aktuell

      L     DB2.DBB    1
      BTI   
      T     "DB2 Uhrzeit".Monat_Aktuell

      L     DB2.DBB    0
      BTI   
      T     "DB2 Uhrzeit".Jahr_Aktuell

      L     DB2.DBB    7
      L     B#16#F
      UW    
      T     "DB2 Uhrzeit".Wochentag_Aktuell

      L     DB2.DBB    3
      BTI   
      T     "DB2 Uhrzeit".Stunden_Aktuell

      L     DB2.DBB    4
      BTI   
      T     "DB2 Uhrzeit".Minuten_Aktuell

      L     DB2.DBB    5
      BTI   
      T     "DB2 Uhrzeit".Sekunden_Aktuell
 
Code:
// TOD (Zeit seit Mitternacht in Millisekunden) in Akku 1
L 1000
/D
T #temp // Zeit in Sekunden merken (Doppelwort das my. 86400)
L 60 
MOD // Sekundenanteil  berechnen ...
T MB 3 // ... und merken
L #temp // Gesamtsekunden holen 
L 60 
/D // Zeit in Minuten berechnen ...
T #temp // ... und merken
L 60 
MOD // Minutenanteil berechnen ...
T MB 2 // ... und merken
L #temp 
L 60
/D // Zeit in Stunden berechnen ...
T MB 1 // ... und merken
Zu beachten: Nicht die angegebenen MWs verwenden wegen Überlappung, MBs genügen vom Wertebereich auch, ansonsten MW6, MW4 und MW2 verwenden.

PS: Codiert und nicht getestet :wink:
 
danke

hallo nochmal ...


so hab mich für den code von rainer hönle entschieden, ist leichter in mein
programm aufzunehmen ...


danke für EURE bemühungen ... mfg Andreas
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@rainer

hallo

@rainer
ich glaube im code von dir ist ein fehler und zwar als erstes

L #temp // Gesamtsekunden holen
L 60 -> L 6 und nicht 60!?
/D // Zeit in Minuten berechnen ...
T #temp //

und wenn ich damit nun was berechnen will kommt ein
#falsches ergebnis raus :cry:


mfg
 
Es gibt da noch eine Möglichkeit, müsste dann aber im OB1 stehen:

Code:
      L     LB14
      BTI   
      T     MW0 //Tag

      L     LB13
      BTI   
      T     MW2 //Monat

      L     LB12
      BTI   
      T     MW4 //Jahr

      L     LB19
      L     B#16#F
      UW   
      T     MW6 Wochentag

      L     LB15
      BTI   
      T     MW8 //Stunden

      L     LB16
      BTI   
      T     MW10 //Minuten

      L     LB17
      BTI   
      T     MW12 //Sekunden

Alternativ können die MW's auch durch MB's zu ersetzen, du kannst auch beliebig weglassen, falls dir die Uhrzeit genügt.

Mfg
Manuel
 
Re: @rainer

apachler schrieb:
L #temp // Gesamtsekunden holen
L 60 // Pass schon, denn eine Minute hat 60 Sekunden-> L 6 und nicht 60!?
/D // Zeit in Minuten berechnen ...
T #temp //

und wenn ich damit nun was berechnen will kommt ein
#falsches ergebnis raus :cry:
Habe das ganze auf der SPS getestet. Bei mir funktioniert es wie gedacht. Was zeigt denn der Status an? Ist TOD auch in Akku1?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
aha das sieht gut aus ...

hallo!

hab jetzt die sache mal so gelöst:

Code:
L TOD
T MD 23

      L     MB    23
      BTI   
      T     #Stunden

      L     MB    24
      BTI   
      T     #Minuten

      L     MB    25
      BTI   
      T     #Sekunden

müsste doch auch gehen, oder nicht?


@MSB
Ist auch eine gute Lösung doch möchte ich das nicht im OB1 stehen haben.

@Rainer
An der SPS hab ich es nicht getestet, hab es mir nur durch den kopf gehen lassen. Aber wenn es dann in der Steuerung funzt hab ich nix dagegen. Gefällt mir doch am besten die Lösung ...



Danke an alle ... mfg Andreas
 
Dein Code kann nicht gehen,

da im TOD die Zeit nich in einzelnen Bytes steht, sowie im Date_AND_Time sondern als Vorzeichenlose Ganzzahl in Millisekunden.

Entweder so wie von Rainer oder von mir.

Mfg
Manuel
 
Re: aha das sieht gut aus ...

apachler schrieb:
Code:
L TOD
T MD 23

      L     MB    23
      BTI   
      T     #Stunden

      L     MB    24
      BTI   
      T     #Minuten

      L     MB    25
      BTI   
      T     #Sekunden

müsste doch auch gehen, oder nicht?
Laut Doku: Der Datentyp TOD wird als vorzeichenlose Ganzzahl in Millisekunden gespeichert, wobei Null gleich Mitternacht ist.
Dann muss die Umrechnungwie in meinem Beispiel (o.ä.) erfolgen. bei Datentype DATE_AND_TIME kann die Umrechnung wie oben angegeben erfolgen, wenn der richtige Bereich transferiert wurde.
 
Zurück
Oben