// **********************************************************************
// **********************************************************************
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
#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";
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
Danke daß Du Deinen Code teilst.Hab dann doch am Ende was selbst gebastelt.
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
War auch mein Gedanke gestern.Danke daß Du Deinen Code teilst.
Doch wenn ich solche IF-Orgien sehe, ...
Harald
Suche nicht nach Lösungen.
Poste deine Lösung & es wird irgendjemand kommen um dich zu korrigieren.
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?