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

ThoPla

Level-2
Beiträge
10
Reaktionspunkte
0
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 .

VG

MFreiberger
 
Moin,

ich hatte ja gehofft, dass es eine komfortablere Möglichkeit gibt.
Vielen Dank für deinen Lösungsansatz. Ich werde mich mal dran auslassen.
 
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
 
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.

 
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

Danke für dein "so gehts besser" Beispiel
 
Für die Nutzung dieser Website sind Cookies erforderlich. Du musst diese akzeptieren, um die Website weiter nutzen zu können. Erfahre mehr…