# siemens und sps timer

**URL:** <https://oscat.discourse.group/t/siemens-und-sps-timer/130>\
**Category:** oscat.lib fuer Step 7\
**Created:** [7. Mai 2007 um 10:15 UTC](https://oscat.discourse.group/t/siemens-und-sps-timer/130 "2007-05-07T10:15:43Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![hugo](https://yyz2.discourse-cdn.com/free1/user_avatar/oscat.discourse.group/hugo/32/133_2.png) [@hugo](https://oscat.discourse.group/u/hugo)\
**Post date:** [7. Mai 2007 um 10:15 UTC](https://oscat.discourse.group/t/siemens-und-sps-timer/130/1 "2007-05-07T10:15:43Z")

</div>

hi kann mir jemand sagen wie bei siem,ens der sps timer (1ms auflösung) ausgelesen wird?  
bei codesys ist dies time(); ist dies bei siemens auch so?  
hat der hardwaretimer auch 1ms auflösung?

wie wird bei siemens die adresse einer variable ermittelt? bei codesys ist dies adr();  
wie wird bei siemens die größe einber variable ermittelt? bei codesys ist dies sizeof();

danke, hugo

---

<div class="post-metadata">

**Author:** ![system](https://global.discourse-cdn.com/free1/uploads/oscat/original/1X/2efdfb9c592ff9a666c94dff124ee84fa863dae5.jpeg) [@system](https://oscat.discourse.group/u/system)\
**Post date:** [7. Mai 2007 um 12:27 UTC](https://oscat.discourse.group/t/siemens-und-sps-timer/130/2 "2007-05-07T12:27:37Z")

</div>

Hallo Hugo,

Systemzeit kann mittels TIME\_TCK() gelesen werden.

Auszug S7-Hilfe:  
Mit der SFC 64 “TIME\_TCK” (time tick) lesen Sie die Systemzeit der CPU. Die Systemzeit ist ein “Zeitzähler”, der von 0 bis max. 2147483647 ms zählt. Bei einem Überlauf der Systemzeit wird wieder ab 0 gezählt. Das Zeitraster und die Genauigkeit der Systemzeit betragen bei S7-400 und bei der CPU 318 1 ms, bei allen anderen CPUs der S7-300 10 ms. Die Systemzeit wird nur von den Betriebszuständen der CPU beeinflußt.

Die Adresse einer Variable läst sich z.B. so ermitteln:

```auto

VAR_INPUT
    pt: POINTER;
    at_pt AT pt: STRUCT // sicht auf die Variable pt
        DBNr: WORD;
        Adr: DWORD;
    END_STRUCT;    
    size : INT;
END_VAR

```

im Programm kann dann mittels at\_pt.DBNr und at\_pt.Adr darauf zugegriffen werden.

mfg  
Daniel

---

<div class="post-metadata">

**Author:** ![system](https://global.discourse-cdn.com/free1/uploads/oscat/original/1X/2efdfb9c592ff9a666c94dff124ee84fa863dae5.jpeg) [@system](https://oscat.discourse.group/u/system)\
**Post date:** [7. Mai 2007 um 12:51 UTC](https://oscat.discourse.group/t/siemens-und-sps-timer/130/3 "2007-05-07T12:51:15Z")

</div>

Hallo Hugo,

beim Datentyp ANY ist die Struktur dann folgende.

```auto

pt: ANY;
at_pt AT pt: STRUCT // sicht auf die Variable pt
    Id : BYTE; // ist immer 16#10
    DataType:BYTE;  
    Lenght:WORD;  
    DB_Nummer:WORD;  
    Byte_Pointer:DWORD;
END_STRUCT;  

```

DataType:  
Hexadezimal code | Datentyp | Beschreibung  
b#16#00 NIL Null pointer  
b#16#01 BOOL Bits  
b#16#02 BYTE Bytes (8 Bits)  
b#16#03 CHAR Zeichen (8 Bits)  
b#16#04 WORD Wörter (16 Bits)  
b#16#05 INT Ganz zahlen (16 Bits)  
b#16#06 DWORD Wörter (32 Bits)  
b#16#07 DINT Ganz zahlen (32 Bits)  
b#16#08 REAL Gleitpunkt zahlen (32 Bits)  
b#16#09 DATE Datum  
b#16#0A TIME\_OF\_DAY (TOD) Uhrzeit  
b#16#0B TIME Zeit  
b#16#0C S5TIME Daten typ S5TIME  
b#16#0E DATE\_AND\_TIME (DT) Datum und Zeit (64 Bits)  
b#16#13 STRING Zeichen kette

mfg  
Daniel

---

<div class="post-metadata">

**Author:** ![hugo](https://yyz2.discourse-cdn.com/free1/user_avatar/oscat.discourse.group/hugo/32/133_2.png) [@hugo](https://oscat.discourse.group/u/hugo)\
**Post date:** [7. Mai 2007 um 14:56 UTC](https://oscat.discourse.group/t/siemens-und-sps-timer/130/4 "2007-05-07T14:56:47Z")

</div>

was passiert beim system tck mit dem höchstwertigen bit?  
falls der counter nur bis 2 milliarden zählt hat er nur 31 bit und das 32. bit bleibt immer null.  
das hat zur folge das eine differenz zweier timer ticks beim überlauf schiefgeht.

katastrophe…

oder zählt der timer vielleicht doch bis volle 32 bit ?

---

<div class="post-metadata">

**Author:** ![system](https://global.discourse-cdn.com/free1/uploads/oscat/original/1X/2efdfb9c592ff9a666c94dff124ee84fa863dae5.jpeg) [@system](https://oscat.discourse.group/u/system)\
**Post date:** [7. Mai 2007 um 16:33 UTC](https://oscat.discourse.group/t/siemens-und-sps-timer/130/5 "2007-05-07T16:33:05Z")

</div>

Hallo Hugo,

anbei ein Beispiel wie ich das Problem gelöst habe:

```auto

  // Regler Abtastzeit ermitteln
  tx1 := tx; // Altwert speichern
  tx := Time_TCK();
  ST := tx - tx1;
  
  IF ST < t#0ms THEN
    ST := ST + T#24D_20H_31M_23S_647MS;
  END_IF;
  
  TA := DINT_TO_REAL(TIME_TO_DINT(ST))/1000;

```

mfg  
Daniel

---

<div class="post-metadata">

**Author:** ![hugo](https://yyz2.discourse-cdn.com/free1/user_avatar/oscat.discourse.group/hugo/32/133_2.png) [@hugo](https://oscat.discourse.group/u/hugo)\
**Post date:** [7. Mai 2007 um 17:05 UTC](https://oscat.discourse.group/t/siemens-und-sps-timer/130/6 "2007-05-07T17:05:35Z")

</div>

klar so gehts natürlich, ich schlage folgendes vor:

unter codesys ist die funtion time() zum auslesen des timers.  
wir schreiben eine funktion time() die nur bei step 7 verwendet wird.  
damit muessen wir in der oscat lib nichts veraendern und alles läuft.  
damit der überlauf funktioniert muessen wir nur das bit 32 generieren und alles läuft wie gehabt.  
der große vortail ist das wir keinerlei funktionen anpassen müssen und alles kompatibel ist.  
was denkst du?  
ich kann diese funktion sehr schnell schreiben.

das nächste große problem ist das datum:  
wenn ich das richtig verstanden habe ist bei siemens das datum nur 16 bit und in codesys ist es 32 bit. auflösung tage zu auflösung sekunden.  
ich kann ganz einfach ein sdate\_to\_idate uznd ein idate\_to\_sdate schreiben.  
allerdings muss ich dann in vielen funktionen die datum benutzen folgende abfrage einbauen:  
if step\_7 then x := sdate\_to\_idate  
damit würden dann wieder alle funktionen funktionieren.

allerdings habe ich eventuell ein ueberlaufproblem denn siemens ist nur 16bit

was schlägst du vor?

---

<div class="post-metadata">

**Author:** ![hugo](https://yyz2.discourse-cdn.com/free1/user_avatar/oscat.discourse.group/hugo/32/133_2.png) [@hugo](https://oscat.discourse.group/u/hugo)\
**Post date:** [7. Mai 2007 um 17:21 UTC](https://oscat.discourse.group/t/siemens-und-sps-timer/130/7 "2007-05-07T17:21:35Z")

</div>

noch eine frage zum datentyp time?

ist time bei siemens auch nur 31 bit oder nutzt es die vollen 32 bit? oder ist es gar ein signed datentyp?  
wenn time unsigned 32 bit ist schlage ich folgendes vor:

funktion time() (\* nur unter step7 \*)

if überlauf then toggle bit32  
time := time\_tck and bit32

natuerlich noch nicht ganz ausformuliert, aber sinngemäß.  
damit erzeugen wir einen 32 breiten system timer der keine überlaufprobleme mehr hat.  
zusätzlich fnktionieren alle time() aufrufe aus der lib ohne aenderungen

---

<div class="post-metadata">

**Author:** ![system](https://global.discourse-cdn.com/free1/uploads/oscat/original/1X/2efdfb9c592ff9a666c94dff124ee84fa863dae5.jpeg) [@system](https://oscat.discourse.group/u/system)\
**Post date:** [7. Mai 2007 um 17:26 UTC](https://oscat.discourse.group/t/siemens-und-sps-timer/130/8 "2007-05-07T17:26:13Z")

</div>

Hallo,

also der Datentyp ist signed somit wäre dann Bit 32 Vorzeichen kommt glaub ich vom Typ DINT.  
Das S7 Time Format geht von -T#24D\_20H\_31M\_23S\_647MS bis T#24D\_20H\_31M\_23S\_647MS.  
(DINT -2 147 483 648 bis +2 147 483 647)

mfg  
Daniel

---

<div class="post-metadata">

**Author:** ![hugo](https://yyz2.discourse-cdn.com/free1/user_avatar/oscat.discourse.group/hugo/32/133_2.png) [@hugo](https://oscat.discourse.group/u/hugo)\
**Post date:** [7. Mai 2007 um 19:23 UTC](https://oscat.discourse.group/t/siemens-und-sps-timer/130/9 "2007-05-07T19:23:19Z")

</div>

naja warum einfach.

damit ist die oscat lib praktisch unter s7 unbrauchbar.  
alle datunsfunktionen haben das problem 16 bit datum siemens und 32 bit datum codesys  
alle time funktionen haben ein problem unsigned bei codesys und signed bei siemens

denke es wird eine langwierige und schwere arbeit für eine release 2.0 in 2-3 monaten

---

<div class="post-metadata">

**Author:** ![gravieren](https://avatars.discourse-cdn.com/v4/letter/g/54ee81/32.png) [@gravieren](https://oscat.discourse.group/u/gravieren)\
**Post date:** [8. Mai 2007 um 18:20 UTC](https://oscat.discourse.group/t/siemens-und-sps-timer/130/10 "2007-05-08T18:20:01Z")

</div>

Hi Hugo und Dalbi

Interesanter LINK zu Thema

[http://www.sps-forum.de/showthread.php?t=656](http://www.sps-forum.de/showthread.php?t=656)

Wir sollten uns mal “zusammensetzen”, vieleicht macht uns Hugo hier einen geschützten “Entwicklerbereich”
