TIA Comfort Panel TIME Variable als [mm:ss] darstellen

ThoPla

Level-2
Beiträge
10
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten morgen zusammen,

Ich stehe vor einem kleinen Problem:

Ich würde gerne eine Variable des Datentyps TIME nicht nur als sekunde oder minute darstellen sondern als "kombinierte Anzeige, in der ich sowohl die Minuten als auch sekunden sehen kann.
Format soll wie folgt aussehen [mm:ss]

Eingesetzt wird ein TP700 und ein TP1200 Comfort Panel projektiert mit TIA V15 Update 4

Gibt es da Möglichkeiten? Die Suchfunktion hat mit leider nicht geholfen.
 
Moin ThoPla,

du könntest die einzelnen Ziffen jeweils in ein CHAR umwandeln.
Ablegen in ein Array[0..4] of Char und dan in einen String wandeln. Den kannst Du dann anzeigen.

Also:
myTime[0] := Minute 10er
myTime[1] := Minute 1er
myTime[2] := ':'
myTime[3] := Sekunde10er
myTime[4] := Sekunde 1er

Dann kannst Du Dir auch jedes andere beliebige Format zusammenbasteln. Je nach Energie, Lust und akzeptablen Aufwand :cool:.

VG

MFreiberger
 
Die meisten Möglichkeiten und Freiheiten der Formatierung hat man natürlich, wenn die Prozessvariable eine Zeichenkette ist. Da muß man allerdings die anzuzeigende Zeichenkette im SPS-Programm formatieren. Und dieser Weg geht nur von SPS zu HMI (nur Ausgabe).
Wenn es nicht stört, wenn in der Zeitanzeige auch die Stunden angezeigt werden ( 00:12:34 ), dann könnte man die HMI-Variable als Time_Of_Day-Variable anlegen (anstatt Time) und das EA-Feld auf Anzeigeformat "Uhrzeit" einstellen. Falls TIA die Datentyp-Manipulation nicht mag, dann im SPS-Programm den Time-Wert in eine Time_Of_Day-Variable kopieren.

Harald
 
OK, ich habs nun wie folgt gelöst:
1. Variable im Format TIME zerlegt in Tage, Stunden, Minuten, Sekunden und in Zeichenketten konvertiert
2. Aus den zerlegten Variablen habe ich mir dann die Formate gebastelt, die ich brauche.

Danke für eure Hilfe und Denkanstöße

Thorsten
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich verwende DINT-Werte, die mit 2 Kommastellen versehen,
so hat man die Anzeige hh,mm bzw. mm,ss
nicht ganz optimal aber da Simens nichts vernünftiges hinbekommt, was will man machen?

vor kurzem hab ich das noch etwas optimiert und gleich in SCL Code übertragen.

Code:
// **********************************************************************
// **********************************************************************

FUNCTION "m7_DINT_TO_TIME_MinMax" : TIME

TITLE ='Multiformat DINT-Time to IEC-Time with MinMax Limit'
VERSION : '3.0'
AUTHOR  : 'S.Maag'
FAMILY  : 'Maagic7'

(*  ================================================================================

 DINT MultiFormat Time to IEC-Time [ms]
 0 : OUT:=IN; (m7_DINT_TO_TIME_MinMax := dValue)
 1 : 1/10s;   (m7_DINT_TO_TIME_MinMax := dValue *100)
 2 : seconds; (m7_DINT_TO_TIME_MinMax := dValue *1000)
 3 : minutes; (m7_DINT_TO_TIME_MinMax := dValue *60 *1000)
 4 : hours;   (m7_DINT_TO_TIME_MinMax := dValue *60 *60 *1000)
 5 : mm.ss;   (m7_DINT_TO_TIME_MinMax := (mm[dValue] * 60 + ss[dValue])*1000
 6 : hh.mm;   (m7_DINT_TO_TIME_MinMax := (hh[dValue] * 3600 + mm[dValue]*60)*1000
 
  
 DATE: 3/2019

 CHANGELOG:
 --------------------------------------------------------------------------------
 DATE         NAME        DESCRIPTION
 --------------------------------------------------------------------------------
 02.03.2019   S.Maag      
  --------------------------------------------------------------------------------
*)

VAR_INPUT
    dMin: DINT;
    dMax: DINT;
    cfg_Format: INT; // 1:1/10sec; 2:s; 3:m; 4:h; 5:mm.ss; 6:hh.mm
END_VAR

VAR_IN_OUT
    dValue: DINT;
END_VAR

VAR
    m_Val : DINT;
    ret : DINT;
    rest : DINT;
END_VAR


BEGIN
   
    m_Val:= LIMIT(MN:=dMin, IN:=dValue, MX:=dMax);
    IF m_Val<> dValue THEN dValue := m_Val; END_IF;
    
    rest :=0;     
    CASE cfg_Format OF
        1 : // 1/10sec
          ret := m_Val *100;
        
        2 : // sec
             ret := m_Val *1000;
        
        3:  // min
             ret := m_Val *60 *1000;
             
        4:  // h
             ret := m_Val *3600 *1000;
             
        5:  // mm.ss
            rest := (m_Val MOD 100);
            ret := m_Val / 100 * 60 *1000 + rest * 1000 ;
            
        6:  // hh.mm
            rest := (m_Val MOD 100);
            ret := m_Val / 100 * 3600 *1000 + rest * 60 *1000 ;
         
    ELSE:
    
        ret:= m_Val;  // If cfg_Format=0 or unvalid RET_VAL:=dValue;
    END_CASE;

    IF rest >59 THEN dValue := dValue +40; END_IF;  // Overflow correction of DINT Multiformat Input          

    m7_DINT_TO_TIME_MinMax := DINT_TO_TIME(ret);

    OK:=TRUE;

END_FUNCTION

// **********************************************************************
// **********************************************************************

FUNCTION "m7_TIME_TO_DINT" : DINT

TITLE ='IEC-TIME to Multiformat DINT Time'
VERSION : '3.0'
AUTHOR  : 'S.Maag'
FAMILY  : 'Maagic7'

(*  ================================================================================

 DINT MultiFormat Time to IEC-Time [ms]
 0 : OUT:=IN; (m7_TIME_TO_DINT := dValue)
 1 : 1/10s;   (m7_TIME_TO_DINT := dValue /100)
 2 : seconds; (m7_TIME_TO_DINT := dValue /1000)
 3 : minutes; (m7_TIME_TO_DINT := dValue /60 /1000)
 4 : hours;   (m7_TIME_TO_DINT := dValue /60 /60 /1000)
 5 : mm.ss;   (m7_TIME_TO_DINT := (mm[dValue] / 60 + ss[dValue])*1000
 6 : hh.mm;   (m7_TIME_TO_DINT := (hh[dValue] / 3600 + mm[dValue]*60)*1000
 
  
 DATE: 3/2019

 CHANGELOG:
 --------------------------------------------------------------------------------
 DATE         NAME        DESCRIPTION
 --------------------------------------------------------------------------------
 03.03.2019   S.Maag      
  --------------------------------------------------------------------------------
*)

VAR_INPUT
    cfg_Format: INT; // 1:1/10sec; 2:s; 3:m; 4:h; 5:mm.ss; 6:hh.mm
END_VAR

VAR_IN_OUT
    timValue: TIME;
END_VAR

VAR
    m_Val : DINT;
    ret : DINT;
END_VAR


BEGIN
   
    m_VAL := TIME_TO_DINT(timValue);         
    
    CASE cfg_Format OF
        1 : // 1/10sec
          ret := m_Val /100;
        
        2 : // sec
             ret := m_Val /1000;
        
        3:  // min
             ret := m_Val /60 /1000;
             
        4:  // h
             ret := m_Val /3600 /1000;
             
        5:  // mm.ss
            m_Val := m_Val/1000;  // convert to seconds
            ret := m_Val/60*100 + (m_Val MOD 60);
        
        6:  // hh.mm
            m_Val := m_Val/1000/60;  // convert to minutes
            ret := m_Val/60 * 100 + (m_Val MOD 60);
         
    ELSE:
            ret:= m_Val;  // If cfg_Format=0 or unvalid RET_VAL:=dValue;
            
    END_CASE;

    
    m7_TIME_TO_DINT := ret;

    OK:=TRUE;

END_FUNCTION
 
Vielen Dank euch allen,

ich habe es nun folgendermaßen gelöst:
Code:
#VAR."input time" := #TIME;


//Initialisierung
#IW.Tage := 0;
#IW.Stunden := 0;
#IW.Minuten := 0;
#IW.Sekunden := 0;


#VAR.Tage := '00';
#VAR.Stunden := '00';
#VAR.Minuten := '00';
#VAR.Sekunden := '00';


//Berechne die Tage, 1 Tag = 86400s = 86400000ms.
//Subtrahiere solange einen Tag, bis der Wert < 86400000ms.
//Inkrementiere jeweils die Anzahl der Tage um 1.
WHILE #VAR."input time" > 86400000 DO
    #VAR."input time" := #VAR."input time" - 86400000;
    #IW.Tage := #IW.Tage + 1;
END_WHILE;


//Berechne die Stunden, 1 Stunde = 3600s = 36000000ms.
//Subtrahiere solange eine Stunde, bis der Wert < 36000000ms.
//Inkrementiere jeweils die Anzahl der Stunden um 1.
WHILE #VAR."input time" > 3600000 DO
    #VAR."input time" := #VAR."input time" - 3600000;
    #IW.Stunden := #IW.Stunden + 1;
END_WHILE;


//Berechne die Minuten, 1 Minute = 60s = 600000ms.
//Subtrahiere solange eine Minute, bis der Wert < 600000ms.
//Inkrementiere jeweils die Anzahl der Minuten um 1.
WHILE #VAR."input time" > 60000 DO
    #VAR."input time" := #VAR."input time" - 60000;
    #IW.Minuten := #IW.Minuten + 1;
END_WHILE;


//Berechne die Sekunden, 1 Sekunde = 1000ms.
//Subtrahiere solange eine Sekunde, bis der Wert < 1000ms.
//Inkrementiere jeweils die Anzahl der Sekunden um 1.
WHILE #VAR."input time" > 0 DO
    #VAR."input time" := #VAR."input time" - 1000;
    #IW.Sekunden := #IW.Sekunden + 1;
END_WHILE;


//Speichere Millisekunden
#tempSec := #VAR."input time";




// Int zu String konvertieren
// Tage
VAL_STRG(IN:=#IW.Tage,
         SIZE:=2,
         PREC:=0,
         FORMAT:=16#0000,
         P:=1,
         OUT=>#VAR.Tage);
// Stunden
VAL_STRG(IN := #IW.Stunden,
         SIZE := 2,
         PREC := 0,
         FORMAT := 16#0000,
         P := 1,
         OUT => #VAR.Stunden);
// Minuten
VAL_STRG(IN := #IW.Minuten,
         SIZE := 2,
         PREC := 0,
         FORMAT := 16#0000,
         P := 1,
         OUT => #VAR.Minuten);
// Sekunden
VAL_STRG(IN := #IW.Sekunden,
         SIZE := 2,
         PREC := 0,
         FORMAT := 16#0000,
         P := 1,
         OUT => #VAR.Sekunden);


// Wenn Variablen kleiner 10 sind wird die erste Ziffer mit '0' vorbelegt
// Wenn die Variable kleiner oder gleich 0 ist wird die Variable mit '00' vorbelegt
IF #IW.Tage < 10 THEN
    #VAR.Tage[1] := '0';
END_IF;
IF #IW.Tage <= 0 THEN
    #VAR.Tage := '00';
END_IF;
IF #IW.Stunden < 10 THEN
    #VAR.Stunden[1] := '0';
END_IF;
IF #IW.Stunden <= 0 THEN
    #VAR.Stunden := '00';
END_IF;
IF #IW.Minuten < 10 THEN
    #VAR.Minuten[1] := '0';
END_IF;
IF #IW.Minuten <= 0 THEN
    #VAR.Minuten := '00';
END_IF;
IF #IW.Sekunden < 10 THEN
    #VAR.Sekunden[1] := '0';
END_IF;
IF #IW.Sekunden <= 0 THEN
    #VAR.Sekunden := '00';
END_IF;


// Zeichenkette Zusammensetzen
// 
// Format DD:HH:MM:SS
#VAR."DD:HH:MM:SS"[1] := #VAR.Tage[1];
#VAR."DD:HH:MM:SS"[2] := #VAR.Tage[2];
#VAR."DD:HH:MM:SS"[3] := #para.Trennzeichen[1];
#VAR."DD:HH:MM:SS"[4] := #VAR.Stunden[1];
#VAR."DD:HH:MM:SS"[5] := #VAR.Stunden[2];
#VAR."DD:HH:MM:SS"[6] := #para.Trennzeichen[1];
#VAR."DD:HH:MM:SS"[7] := #VAR.Minuten[1];
#VAR."DD:HH:MM:SS"[8] := #VAR.Minuten[2];
#VAR."DD:HH:MM:SS"[9] := #para.Trennzeichen[1];
#VAR."DD:HH:MM:SS"[10] := #VAR.Sekunden[1];
#VAR."DD:HH:MM:SS"[11] := #VAR.Sekunden[2];


// Format DD:HH:MM
#VAR."DD:HH:MM"[1] := #VAR.Tage[1];
#VAR."DD:HH:MM"[2] := #VAR.Tage[2];
#VAR."DD:HH:MM"[3] := #para.Trennzeichen[1];
#VAR."DD:HH:MM"[4] := #VAR.Stunden[1];
#VAR."DD:HH:MM"[5] := #VAR.Stunden[2];
#VAR."DD:HH:MM"[6] := #para.Trennzeichen[1];
#VAR."DD:HH:MM"[7] := #VAR.Minuten[1];
#VAR."DD:HH:MM"[8] := #VAR.Minuten[2];


// Format HH:MM:SS
#VAR."HH:MM:SS"[1] := #VAR.Stunden[1];
#VAR."HH:MM:SS"[2] := #VAR.Stunden[2];
#VAR."HH:MM:SS"[3] := #para.Trennzeichen[1];
#VAR."HH:MM:SS"[4] := #VAR.Minuten[1];
#VAR."HH:MM:SS"[5] := #VAR.Minuten[2];
#VAR."HH:MM:SS"[6] := #para.Trennzeichen[1];
#VAR."HH:MM:SS"[7] := #VAR.Sekunden[1];
#VAR."HH:MM:SS"[8] := #VAR.Sekunden[2];


// Format HH:MM
#VAR."HH:MM"[1] := #VAR.Stunden[1];
#VAR."HH:MM"[2] := #VAR.Stunden[2];
#VAR."HH:MM"[3] := #para.Trennzeichen[1];
#VAR."HH:MM"[4] := #VAR.Minuten[1];
#VAR."HH:MM"[5] := #VAR.Minuten[2];


// Format MM:SS
#VAR."MM:SS"[1] := #VAR.Minuten[1];
#VAR."MM:SS"[2] := #VAR.Minuten[2];
#VAR."MM:SS"[3] := #para.Trennzeichen[1];
#VAR."MM:SS"[4] := #VAR.Sekunden[1];
#VAR."MM:SS"[5] := #VAR.Sekunden[2];


// Ausgänge zuweisen
// 
#"DD:HH:MM:SS" := #VAR."DD:HH:MM:SS";
#"DD:HH:MM" := #VAR."DD:HH:MM";
#"HH:MM:SS" := #VAR."HH:MM:SS";
#"HH:MM" := #VAR."HH:MM";
#"MM:SS" := #VAR."MM:SS";

Der Baustein hat einen Eingang des Typs "TIME" und aktuell 5 Ausgaänge mit diversen Formaten im Typ String ( DD:HH:MM:SS, DD:HH:MM, HH:MM:SS, HH:MM und MM:SS)
 
Zuletzt bearbeitet:
Moin,

ich bin bei der Suche nach einer fertigen Lösung für ein passendes VBScript über diesen Post gestolpert.
Hab dann doch am Ende was selbst gebastelt.
Die ausgegebene Darstellung im Code unten orientiert sich an der TIME-Darstellung der SPS & schneidet überflüssige
Angaben von Teileinheiten nicht weg (was bei meiner Anwendung Absicht ist).
Beispiel: T#2h32m47s wird als '00d_02h_32m_47s' ausgegeben.

Function Func_TimeToString(ByVal iTime)

'REGION DESCRIPTION
'Diese Funktion zerlegt einen Int/DInt als Zeitangabe in Milisekunden in einen String.
'Die Darstellung entspricht etwa dem Time-Format in der SPS.
'END_REGION DESCRIPTION

'#################################################################
'Initialisierung
Dim hTime, hDay, hHour, hMin, hSek, hMs 'Numerische Werte
Dim hDayString, hHourString, hMinString, hSekString, hMsString, hTimeString 'String-Variablen
Dim hTemp, isNegative 'sonstiges

'Konstanten deklarieren
Const kMsInDay = 86400000
Const kMsInHour = 3600000
Const kMsinMin = 60000
Const hMsInSek = 1000

'Eingangswert lesen
'Verarbeitung als Absolutwert & am Ende ggf. Vorzeichen anfügen
If iTime < 0 Then
isNegative = True
Else
isNegative = False
End If
hTime = Abs(iTime)

'#################################################################
'Zeitwert zerlegen
'Tage
hDay = Fix(hTime / kMsInDay)
hTemp = hTime Mod kMsInDay
'Stunden
hHour = Fix(hTemp / kMsInHour)
hTemp = hTemp Mod kMsInHour
'Minuten
hMin = Fix(hTemp / kMsinMin)
hTemp = hTemp Mod kMsinMin
'Sekunden
hSek = Fix(hTemp / hMsInSek)
hTemp = hTemp Mod hMsInSek
'Milisekunden
hMs = hTemp

'Numerische Werte in Strings wandeln, ggf. eine 0 ergänzen & Einheizenbezeichner anfügen
'Tage
If hDay < 10 Then
hDayString = (0 & CStr(hDay) & "d")
Else
hDayString = (CStr(hDay) & "d")
End If
'Stunden
If hHour < 10 Then
hHourString = (0 & CStr(hHour) & "h")
Else
hHourString = (CStr(hHour) & "h")
End If
'Minuten
If hMin < 10 Then
hMinString = (0 & CStr(hMin) & "m")
Else
hMinString = (CStr(hMin) & "m")
End If
'Sekunden
If hSek < 10 Then
hSekString = (0 & CStr(hSek) & "s")
Else
hSekString = (CStr(hSek) & "s")
End If

'Ausgabestring zusammenstellen
If isNegative Then
hTimeString = "-" & hDayString & "_" & hHourString & "_" & hMinString & "_" & hSekString
Else
hTimeString = " " & hDayString & "_" & hHourString & "_" & hMinString & "_" & hSekString
End If
'Uuuund raus mit de Viechers...
Func_TimeToString = hTimeString
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hab dann doch am Ende was selbst gebastelt.
Danke daß Du Deinen Code teilst.
Doch wenn ich solche IF-Orgien sehe, dann kann ich nicht anders und muß zusammenstreichen... ;)
Code:
Function Func_TimeToString(ByRef iTime)
' Diese Function zerlegt einen Int/DInt als Zeitangabe in Millisekunden in einen String.
' Die Darstellung entspricht etwa dem Time-Format in der SPS.
' T#-1h23m45s ---> "-00D_01H_23M_45S" | 123456789 ---> "01D_10H_17M_36S"
'*******************************************************************************

'*** Konstanten
Const kMsInSek  = 1000
Const kMsInMin  = 60000    ' 1000 * 60
Const kMsInHour = 3600000  ' 1000 * 60 * 60
Const kMsInDay  = 86400000 ' 1000 * 60 * 60 * 24

'*** Variablen
Dim hTime, hDay, hHour, hMin, hSek 'numerische Werte
Dim hTimeString, isNegative 'sonstiges

'*** Eingangswert lesen
'Verarbeitung als Absolutwert und am Ende ggf. Vorzeichen anfügen
isNegative = iTime < 0
hTime = Abs(iTime)

'*** Zeitwert zerlegen
hDay  = Fix(hTime / kMsInDay) 'Tage
hHour = Fix((hTime Mod kMsInDay) / kMsInHour) 'Stunden
hMin  = Fix((hTime Mod kMsInHour) / kMsInMin) 'Minuten
hSek  = Fix((hTime Mod kMsInMin) / kMsInSek) 'Sekunden

'*** Ausgabestring zusammenstellen
hTimeString = Right("0" & hDay,2) & "D_" & Right("0" & hHour,2) & "H_" & Right("0" & hMin,2) & "M_" & Right("0" & hSek,2) & "S"
If isNegative Then hTimeString = "-" & hTimeString

'*** Rückgabewert
Func_TimeToString = hTimeString

Harald
 
Ein weiser Programmierer sprach einst:
Suche nicht nach Lösungen.
Poste deine Lösung & es wird irgendjemand kommen um dich zu korrigieren.

Ich treib mich meistens in der SPS rum & mache nur selten was im Panel.
Dachte mir schon, dass das noch etwas....professioneller geht :D

Danke für dein "so gehts besser" Beispiel(y)
 
Zurück
Oben