TIA Variable vom Datentyp TIME in Tage, Stunden, Minuten zerlegen

Neurorancer

Level-2
Beiträge
572
Reaktionspunkte
4
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Tag,

habe folgendes Problem:

Ich möchte eine Variable vom Datentyp TIME in Tage, Stunden, Minuten, Sekunden zerlegen.

Der Wert der Variable ist z.B. T#50S_259MS
Nach der Umrechnung sollte rauskommen: Tage = 0, Stunden=0, Sekunden=50

Leider finde ich im Netz keine Information, wie ich das erledigen soll.

Gibt es dazu bereits fertige Bausteine?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Leider finde ich im Netz keine Information, wie ich das erledigen soll.

Gibt es dazu bereits fertige Bausteine?
Wo hast Du denn gesucht? :confused: Wenn man im Siemens Online Support die Suchbegriffe "tia time tage stunden" eingibt, dann findet man diese
FAQ: Wie können Sie in STEP 7 (TIA Portal) die Anzahl der Millisekunden in Tage, Stunden, Minuten und Sekunden umwandeln?
Allerdings kann man diesen Praktikanten-Müll nicht wirklich empfehlen... ;)

Suche mal lieber hier im SPS-Forum nach "time tage stunden", da findest Du u.A. https://www.sps-forum.de/simatic/74...en-umrechnen.html?highlight=time+tage+stunden und da im Beitrag #6
Für Step7 Classic gibt es auch was fertiges zum Zerlegen in Stunden und Minuten. Da scheint wohl tatsächlich Bedarf zu bestehen ... ;)

Wie kann ein vorhandener Sekundenwert in die benötigten Tage, Stunden, Minuten und Sekunden berechnet werden?

Allerdings benötigt der Baustein Sekunden am Eingang. Du müsstest es also zunächst erstmal schaffen, die Millisekunden in Sekunden umzurechnen. Oder Du änderst den Baustein so, daß er gleich mit TIME (Millisekunden) am Eingang klarkommt. Wenn Du Dir den Baustein genauer ansiehst, dann wird Dir aber vielleicht klar, warum wahre Profis die simple Umrechnung lieber gleich selber programmieren, statt sich solche umständlichen Fremdbausteine ins Projekt zu holen.

Übrigens bringt mich die Forumssuche nach "millisekunden stunden" zu fertigen Formeln für die Umrechnung.
Code:
seconds := (milliSeconds / 1000) mod 60 ;
 minutes := (milliSeconds / 60000) mod 60;
 hours := (milliSeconds / 3600000) mod 24 ;
 days := milliSeconds / 86400000 ;

Aus dem Praktikanten-Baustein von Siemens und den fertigen Formeln von Larry Laffer könntest Du Dir ziemlich einfach einen effizienten Baustein zusammenbasteln.

Für welche SPS soll der Code eigentlich sein?

Harald
 
Time# Millisekunden in Tage, Stunden, Minuten, Sekunden zerlegen

Mit den Formeln von Larry Laffer selbst zusammengebastelte Bausteine.
nur positive TIME# zerlegen:
Code:
FUNCTION "MillisecToTimeParts" : Void
AUTHOR : PN_DP
VERSION : 0.1
  VAR_INPUT
    IN : Time;
  END_VAR

  VAR_OUTPUT
    days    : Int;  // 0..24
    hours   : Int;  // 0..23
    minutes : Int;  // 0..59
    seconds : Int;  // 0..59
  END_VAR

  VAR_TEMP
    temp_ms : DInt;
  END_VAR

BEGIN
  //Time# in Tage, Stunden, Minuten, Sekunden zerlegen
  //IN: 0 .. T#+24d_20h_31m_23s_647ms
  //Wenn der Time#-Wert negativ ist, dann 0 zurückgeben.

  #temp_ms := #IN;

  IF #temp_ms < 0 THEN
      #temp_ms := 0;
  END_IF;

  #seconds := DINT_TO_INT( (#temp_ms / 1000) MOD 60 );
  #minutes := DINT_TO_INT( (#temp_ms / (60*1000)) MOD 60 );
  #hours   := DINT_TO_INT( (#temp_ms / (60*60*1000)) MOD 24 );
  #days    := DINT_TO_INT(  #temp_ms / (24*60*60*1000) );

END_FUNCTION
komplett möglichen Wertebereich von TIME# zerlegen:
Code:
FUNCTION "TimeToTimeParts" : Void
AUTHOR : PN_DP
VERSION : 0.1
  VAR_INPUT
    IN : Time;
  END_VAR

  VAR_OUTPUT
    days    : Int;  // 0..24
    hours   : Int;  // 0..23
    minutes : Int;  // 0..59
    seconds : Int;  // 0..59
    sign    : Int;  // -1 / +1
  END_VAR

  VAR_TEMP
    temp_s : DInt;
    signvalue : Int;
  END_VAR

BEGIN
  //Time# in Tage, Stunden, Minuten, Sekunden zerlegen
  //IN: T#-24d_20h_31m_23s_648ms .. T#+24d_20h_31m_23s_647ms

  #temp_s := #IN;

  IF #temp_s < 0 THEN
      #signvalue := -1;
  ELSE
      #signvalue := 1;
  END_IF;

  #temp_s := (#temp_s / 1000) * #signvalue;

  #sign    := #signvalue;
  #seconds := DINT_TO_INT(  #temp_s MOD 60 );
  #minutes := DINT_TO_INT( (#temp_s / 60) MOD 60 );
  #hours   := DINT_TO_INT( (#temp_s / (60*60)) MOD 24 );
  #days    := DINT_TO_INT(  #temp_s / (24*60*60) );

END_FUNCTION
Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Alles klar! Danke für die Hinweise!

Dachte, dass es vielleicht schon was fertiges von Siemens gibt. Ist ja eine Funktion mit der Jeder irgendwann in Berührung kommt.

Der Hinweis von Larry trifft den Nagel auf den Kopf:
„Die TIME ist eine andere Darstellung eines DINT„ und hat die Einheit ms.

Jetzt werde ich ein wenig rechnen...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo PN/DP,

habe deine Rechnung benutz, funktioniert wunderbar! :)

Bin noch nicht lange im Forum, aber Sie, ChristophD und Larry haben immer eine Lösung parat.

Mal so eine Frage nebenbei, wie lange beschäftigst du dich schon mit der Materie?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
TIME kann aber 24 Tage, 20 Stunden.....

Bei einem Wandel von TIME auf TIME_OF_DAY verlierst du doch alles >23:59:59.999
Du hast natürlich vollkommen recht, das war im wahrsten Sinne des Wortes zu kurz gedacht von mir ;)
Statt Time_Of_Day könnte man auch LDT nehmen, aber dann stünde im Ergebnis noch ein "offset" vom 01.01.1970....

Dann doch lieber die Variante von PN/DP!
 
Zurück
Oben