Bug: UTC_TO_LTIME (FC403)

Begonnen von Duerap, 18. Januar 2017, 11:07:19

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 1 Gast betrachten dieses Thema.

Duerap

Hallo OSCAT Community,

Hab aus der OSCAT 3.32 Bibliothek für STEP 7 den UTC_TO_LTIME Block in Verwendung, dabei hab ich einen Fehler in der Funktion entdeckt.
Der ms- Zeitwert wird in der Lokalzeit verworfen. Somit ist dieser beim RET_VAL Ausgang immer 0.

peewit

Hallo

Bin mir nicht sicher ob ich dein Problem richtig verstanden habe.... aber

als Eingangsparameter hast du UTC vom Type Date_Time

Die Type Date_Time erfasst die Anzahl an Sekunden seit  1.1.1970
Da bedeutet das in dieser Datentype keine ms enthalten sind und beim Ergebnis diese auch immer als 0ms angesehen werden müssen

Duerap

#2
Vielen Dank für deine rasche Antwort:

Anbei der Daten Type Date_And_Time von der Siemens Hilfe:

Datentyp   Länge (Bit)   Format
DATE_AND_TIME   64   Jahr-Monat-Tag-h:min:s:ms
oder       
DT      Beispiel für das Format
DT#1995-02-02-08:30:01.999
Der Datentyp Date_And_Time wird im BCD-Format gespeichert:
Bytes    Inhalt   Bereich
0   Jahr   1990 ... 2089
1   Monat   01 ... 12
2   Tag   1 ... 31
3   Stunde   0 ... 23
4   Minute   0 ... 59
5   Sekunde   0 ... 59
6   2 MSD von ms   00 ... 99
7 (4 MSB)   LSD von ms   0 ... 9
7 (4 LSB)   Wochentag   1 ... 7      (1 = Sonntag)

Darstellung der Bytes 6 und 7:

MSD: Most Significant Decade
LSD: Least Significant Decade

Also Date_and_Time beinhaltet den ms Wert schon (siehe Byte 6 und 7). Habe den FC etwas angepasst und nun funktioniert es soweit, kann mir aber nicht erklären warum dies so ist.
Update: Soweit ich es verstand habe ist es dem Block DT_DINT geschuldet. Dieser rechnet die "Date and Time" in einen Sekundenwert um. Danach kommt die DST und Lokalzeit Offset Manipulation und dann wird zurück gerechnet (Sekunden in Date and Time). Dadurch gehen die Millisekunden verloren.


A7d1: NOP   0
      L     LW     8
      SRW   4
      SLD   16
      L     LW    16
      SLW   12
      OD   
      SRD   12
      T     LW    16

      L     LD    10
      L     P##RET_VAL
      LAR1 
      TAK   
      L     W [AR1,P#0.0]
      T     LW    20
      TAK   
      AUF   DB [LW 20]
      L     D [AR1,P#2.0]
      LAR1 
      TAK   
      T     D [AR1,P#0.0]
      L     LD    14
      T     D [AR1,P#4.0]
      CLR   
      U     L     18.1
      SAVE 
      BE   


Mit der Abänderung in dem kompilierten AWL Code kopiere ich nun den Millisekundenwert von der UTC in die Lokale Zeit dazu. Nun sollte alles funktionieren. Ob dies ebenso in der SCL Quelle möglich ist kann ich nicht sagen.

peewit

nachdem es nach oscat standard und bei allen anderen plattformen bei DATE_TIME keine ms gibt dürfte das so gelöst worden sein damit es einheitlich ist
Date_time Type hat normalerweise 32 Bit und kann unmöglich die ms enthalten -> siemens hat hier hat wieder seinen eigenen Standard

Aber das dürfte die ursache sein

aber ich bin kein simatic-fuzzy....

mattsches

Aber spricht denn etwas gegen die Übernahme der obigen Lösung? Vielleicht mag Duerap sie ja direkt in die Quellen einarbeiten, und es gibt ein Update.

Duerap, ich würde gleich das komplette Byte 6 und 7 übernehmen. Dann bleibt die Wochentagsinformation ebenfalls erhalten.

peewit

du kannst natpürlich anpassen und ändern was du möchtest

aber bei der oscat bibliothek geht es darum das bei allen plattformen (sps) ein baustein bei gleichen input die gleichen output ausgibt

das wäre dann nicht mehr gegeben somit wird es kein teil des standards werden

aber du darfst dich ja austoben

darum ist oscat ja open source...