:Revision=17
:html
<<
128.110
DateTime-Objekt|DateTime
--
Das IP-Objekt <!RW>DateTime stellt Methoden zur Verfgung um Datums und Zeitangaben abzufragen und zu verarbeiten.

Auerdem stellt es 100 Timer zur Verfgung, mit deren Hilfe festgestellt werden kann, ob eine bestimmte Zeit seit dem Start der Timer verstrichen ist.
>>
<<
128.110.1
Funktionen des DateTime-Objekts|Funktionen
--
>>
<<
128.110.1.1
DateTime.TimerExpired|TimerExpired
!128.110.3 - Timer
--
<!DEF>
function <!TW>DateTime.TimerExpired (rNr : real) : real;
<!TXT>
Liefert <!RW>TRUE, wenn der Timer <!PW>rNr abgelaufen ist.

Ein noch nie gestarteter Timer ist immer abgelaufen. Ein angehaltener Timer ist nie abgelaufen. Beim Nutzenstart werden alle Timer zurckgesetzt.
>>
<<
128.110.1.2
DateTime.TestTime|TestTime
--
<!DEF>
function <!TW>DateTime.TestTime : real;
<!TXT>
Liefert die Testdauer der aktuellen Prflingsgruppe in Sekunden [s].

Im Simultanprfmodus <!SW>Single gibt es bei diesem Befehl keine nderung gegenber der alten Implementation. Fr die Modi <!SW>ContactPos und <!SW>Panel wird die Zeit seit dem Start des ersten Prfschrittes geliefert.

Beispiel
<!CODE>
var
  vrDateTime  : Real;
step
  // Gibt die dauer des letzten oder des aktuellen Tests an.
  vrDateTime := DateTime.TestTime;
  // Zeigt die oben ermittelte Zeit in der Debugging Anzeige an.
  Debug.SHOW(1,'Dauer des Test: ',vrDateTime);
  System.SetValue(0);
end.
<!TXT>

>>
<<
128.110.1.3
DateTime.ReadTimer|ReadTimer
--
<!DEF>
function <!TW>DateTime.ReadTimer : real;
<!TXT>
Liefert die Systemzeit in Millisekunden [ms]. Bezugszeitpunkt ist der Zeitpunkt des letzten Resets oder Typwechsels. Der zurckgegebene Wert kann als Referenzwert fr Timeout dienen, aber nicht in eine absolute Zeit (UTC, MEZ) umgerechnet werden.

Beispiel
<!CODE>
var
  vrDateTime  : Real;
step
  // Gibt die Vergangene Zeit seit dem letztem System Start bzw. Reset zurck.
  vrDateTime := DateTime.ReadTimer;
  // Zeigt die oben ermittelte Zeit in der Debugging Anzeige an.
  Debug.SHOW(1,'Vergangene Zeit seit System Start bzw. Reset: ',vrDateTime);
  System.SetValue(0);
end.
<!TXT>

>>
<<
128.110.1.4
DateTime.TimeString|TimeString
--
<!DEF>
function <!TW>DateTime.TimeString (sFormat : string) : string:
<!TXT>
Liefert die aktuelle Zeit/das aktuelle Datum als String zurck.

<!PW>sFormat legt die Formatierung fest.

<!TXT>

Beispiel
<!CODE>
var
  vsDateTime  : String;
step
  // Gibt das Aktuelle Datum und die Zeit ausgeschrieben als String zurck.
  vsDateTime := DateTime.TimeString('dddd yyyy-mm-dd hh:nn:ss');
  // Zeigt die oben ermttelte Angabe in der Debugging Anzeige an.
  Debug.SHOW(1,'Aktuelles Datum und Zeit: ',vsDateTime);
  System.SetValue(0);
end.
<!TXT>

<!STBL>
<!+>Code<!+>Ergebnis<!>
<!>c<!>Standardformat, wie fr Windows festgelegt<!>
<!>d<!>Tag als Zahl ohne fhrende Null (1-31)<!>
<!>dd<!>Tag als Zahl mit fhrender Null (01-31)<!>
<!>ddd<!>Tag als Abkrzung (Son - Sam)<!>
<!>dddd<!>Tag mit seinem vollstndigen Namen<!>
<!>m<!>Monat als Zahl ohne fhrende Null (1-12)<!>
<!>mm<!>Monat als Zahl mit fhrender Null (01-12)<!>
<!>mmm<!>Monat als Abkrzung (Jan - Dez)<!>
<!>mmmm<!>Monat mit vollem Namen<!>
<!>yy<!>Jahr als zweistellige Zahl (00-99)<!>
<!>yyyy<!>Jahr als vierstellige Zahl (0000-9999)<!>
<!>h<!>Stunde ohne fhrende Null (0-23)<!>
<!>hh<!>Stunde mit fhrender Null (00-23)<!>
<!>n<!>Minute ohne fhrende Null (0-59)<!>
<!>nn<!>Minute mit fhrender Null (00-59)<!>
<!>s<!>Sekunde ohne fhrende Null (0-59)<!>
<!>ss<!>Sekunde mit fhrenden Null (00-59)<!>
<!>t<!>Zeit im Standardformat<!>
<!>w<!>MCD-Kalenderwoche ohne fhrende Null (1..52)<!>
<!>ww<!>MCD-Kalenderwoche mit fhrender Null (01..52)<!>
<!>f<!>Tag des Jahres ohne fhrende Nullen (1..366)<!>
<!>ff<!>Tag des Jahres mit fhrenden Nullen (001..366)<!>
<!>x<!>Tag der Woche 1..7, Montag=1<!>
<!>z<!>Tag der Woche 1..7, Sonntag=1<!>
<!>'xx', &quot;xx&quot;<!>Zeichen, die in einfache oder doppelte Anfhrungszeichen eingeschlossen sind, werden wie eingegeben angezeigt und beeinflussen die Formatierung nicht<!>
<!ETBL>
<!REM>
Die Sprache der Tagesnamen (Montag, Monday, Lundi) und Monatsnamen (Januar, January, Janvier) hngt von den Windows Einstellungen ab.
<!TXT>

>>

<<
128.110.1.4
DateTime.Now|Now
--
<!DEF>
function <!TW>DateTime.Now : real;
<!TXT>
Liefert das aktuelle Datum und die Uhrzeit im DateTime-Format.

Beispiel
<!CODE>
var
  vrDateTime  : Real;
step
  vrDateTime := DateTime.Now;                                   // Gibt das Aktuelle Datum im Real Format zurck.
  Debug.SHOW(1,'Datum und Zeit im Real Format: ',vrDateTime);   // Zeigt das Aktuelle Datum im Real Format in der Debugging Anzeige an.
  System.SetValue(0);
end.
<!TXT>

>>

<<
128.110.1.5
DateTime.Encode|Encode
--
<!DEF>
function <!TW>DateTime.Encode ( rYear, rMonth, rDay : real [; rHour, rMinute, rSecond : real [; rMSec : real ]]): real;
<!TXT>
Kodiert ein Datum/Uhrzeit in das DateTime-Format.

Beispiel
<!CODE>
var
  vrDateTime     : Real;

  vrYear         : Real;
  vrMonth        : Real;
  vrDay          : Real;
  vrHour         : Real;
  vrMinute       : Real;
  vrSeconds      : Real;
  vrMilliseconds : Real;
step
  // Setzen des Datums das in das real Datums Format gewandelt werden soll.
  vrYear         := 2009;
  vrMonth        := 5;
  vrDay          := 21;
  vrHour         := 14;
  vrMinute       := 35;
  vrSeconds      := 48;
  vrMilliseconds := 250;
  // Wandlung des Datums und der Zeit ins Real Format.
  vrDateTime := DateTime.Encode(vrYear, vrMonth, vrDay, vrHour, vrMinute, vrSeconds, vrMilliseconds);
  // Gibt Datum und Zeit als Real in der Debugging anzeige aus.
  Debug.SHOW(1,'Datum und Zeit als Real: ',vrDateTime);
  System.SetValue(0);
end.
<!TXT>

>>

<<
128.110.1.6
DateTime.DayOfWeek|DayOfWeek
--
<!DEF>
function <!TW>DateTime.DayOfWeek ( rDateTime : real ) : real;
<!TXT>
Gibt den Wochentag zu <!PW>rDateTime zurck (Montag = 1, Dienstag = 2, ..., Sonntag = 7).

Beispiel
<!CODE>
var
  vrDateTime  : Real;
  vrDayOfWeek : Real;
  vsDayOfWeek : String;
step
  vrDateTime := DateTime.Now;                     // Gibt das Aktuelle Datum in real Format zurck.
  vrDayOfWeek := DateTime.DayOfWeek(vrDateTime);  // Ermittelt den Wochentag aus dem Aktuellen Datums (1-7).
  case vrDayOfWeek of                             // Wandelt den Wochentag im Zahlenformat in die ausgeschriebene Form.
    1 : vsDayOfWeek := 'Montag';
    2 : vsDayOfWeek := 'Dienstag';
    3 : vsDayOfWeek := 'Mittwoch';
    4 : vsDayOfWeek := 'Donnerstag';
    5 : vsDayOfWeek := 'Freitag';
    6 : vsDayOfWeek := 'Samstag';
    7 : vsDayOfWeek := 'Sonntag';
    else  vsDayOfWeek := 'Error';
  end;
  Debug.SHOW(1,'Wochentag: ',vsDayOfWeek);        // Gibt den Wochentag in der Debugging Anzeige aus.
  System.SetValue(vrDayOfWeek);
end.
<!TXT>

>>

<<
128.110.1.7
DateTime.DayOfYear|DayOfYear
--
<!DEF>
function <!TW>DateTime.DayOfYear ( rDateTime : real ) : real;
<!TXT>
Gibt den Tag im Jahr zu <!PW>rDateTime zurck (01.01. = 1).

Beispiel
<!CODE>
var
  vrDateTime  : Real;
  vrDayOfYear : Real;
step
  vrDateTime := DateTime.Now;                     // Gibt das Aktuelle Datum in real Format zurck.
  vrDayOfYear := DateTime.DayOfYear(vrDateTime);  // Ermittelt den Tag des Jahres aus dem Aktuellen Datum (1-365).
  Debug.SHOW(1,'Tag des Jahres: ',vrDayOfYear);   // Gibt den ermittelten Tag des Jahres in der Debugging Anzeige aus.
  System.SetValue(vrDayOfYear);
end.
<!TXT>

>>

<<
128.110.1.8
DateTime.WeekOfYearISO|WeekOfYearISO
--
<!DEF>
function <!TW>DateTime.WeekOfYearISO ( rDateTime : real ) : real;
<!TXT>
Gibt die Kalenderwoche zu <!PW>rDateTime zurck (nach DIN 1355 / ISO 8601).

Jeden Montag und nur montags beginnt eine neue Kalenderwoche. Die erste Kalenderwoche ist diejenige, die mindestens 4 Tage des neuen Jahres enthlt. Es gibt keine unvollstndigen Kalenderwochen, ausnahmslos jede KW enthlt genau 7 Tage. Jedes Jahr hat entweder 52 oder 53 Kalenderwochen. Der 29., 30. und 31. Dezember knnen schon zur ersten Kalenderwoche des Folgejahres gehren. Der 1., 2. und 3. Januar knnen noch in der letzten Kalenderwoche des Vorjahres liegen. 

Beispiel
<!CODE>
var
  vrDateTime  : Real;
  vrWeekOfYear : Real;
step
  vrDateTime := DateTime.Now;                          // Gibt das Aktuelle Datum in real Format zurck.
  vrWeekOfYear := DateTime.WeekOfYearISO(vrDateTime);  // Ermittelt die Kalenderwoche aus dem Aktuellen Datum (1-53).
  Debug.SHOW(1,'Kalenderwoche: ',vrWeekOfYear);        // Gibt die ermittelte Kalenderwoche des Jahres in der Debugging Anzeige aus.
  System.SetValue(vrWeekOfYear);
end.
<!TXT>

>>

<<
128.110.2
Prozeduren des DateTime-Objekts|Prozeduren
--
>>
<<
128.110.2.1
DateTime.Delay|Delay
--
<!DEF>
procedure <!TW>DateTime.Delay (rMSDelay : real [; rYield : real);
<!TXT>
Wartet die in rMSDelay angegebene Zeit n Millisekunden.

<!REM>
Achtung:
  Windows - typisch schlechte Auflsung.
  Unter Windows NT etwa 10ms, unter Win95/98 etwa 55ms
  (Zeiten nicht garantiert)
<!TXT>

Der Parameter <!PW>rYield gibt an, ob whrend der Wartezeit andere Prozesse ausgefhrt werden drfen.
Vorteil: Der Rechner wird nicht blockiert, die CPU Belastung sinkt.
Nachteil: Die Wartezeit wird ungenauer.

Ist <!PW>rYield nicht angegeben, so wird bei Wartezeiten ber 200ms die CPU fr andere Prozesse freigegeben, bei Wartezeiten unter 200ms nicht.

<!TXT>

Beispiel
<!CODE>
var
  vrLoops  : Real;
step
  vrLoops := 0;
  // Schleife bis Step beendet wird oder 4 durchlufe ausgefhrt wurden.
  repeat
    Inc(vrLoops);
    Debug.SHOW(1,'Loop: ', vrLoops);
    // Hlt den Prozess fr die Angegebene Zeit an und gibt anderen Prozessen die Chance zu arbeiten.
    DateTime.Delay(250, true);
  until ((stepcontinue) or (vrLoops=4));
  System.SetValue(0);
end.
<!TXT>

>>
<<
128.110.2.2
DateTime.Date|Date
!128.110.2.4 - Time
!128.110.2.3 - Week
--
<!DEF>
procedure <!TW>DateTime.Date (var rJahr, rMonat, rTag : real);
<!TXT>
Liefert das aktuelle Datum in den drei Variablen zurck.

Beispiel
<!CODE>
var
  vrYear  : Real;
  vrMonth : Real;
  vrDay   : Real;
step
  // Gibt das Aktuelle Datum in den 3 bergabe parameteren zurck.
  DateTime.Date(vrYear, vrMonth, vrDay);
  // Zeigt die oben ermttelten Angaben in der Debugging Anzeige an.
  Debug.SHOW(1,'Aktuelles Datum: ', vrYear, '-', vrMonth, '-', vrDay);
  System.SetValue(0);
end.
<!TXT>

>>
<<
128.110.2.3
DateTime.Week|Week
!128.110.2.2 - Date
--
<!DEF>
procedure <!TW>DateTime.Week (var rWeek [, rWochtentag] : real);
<!TXT>
Liefert die aktuelle Kalenderwoche und falls eine zweite Variable angegeben ist, den Wochentag (1..7, Sonntag=1).

Hinweis:
Sorgt dafr, dass die Kalenderwochen in einem Jahr immer aufsteigend sind. Liefert im Dezember fr die letzen Tage nicht KW 1 des neuen Jahres, auch wenn dies nach Kalender so sein mte, sondern KW 53. Umgekehrt wird fr die ersten Tage im Januar immer KW 1 geliefert, auch, wenn diese nach Kalender in KW 52 / 53 des Vorjahres liegen.

<!TXT>

Beispiel
<!CODE>
var
  vrWeekOfYear : Real;
  vrDayOfWeek  : Real;
  vsDayOfWeek  : String;
step
  // Gibt den beiden bergebenen Parametern die Kalenderwoche und den Wochentag zurck.
  DateTime.Week( vrWeekOfYear, vrDayOfWeek );
  // Wandelt den Wochentag vom Zahlenformat in die ausgeschriebene Form.
  case vrDayOfWeek of
    1 : vsDayOfWeek := 'Sonntag';
    2 : vsDayOfWeek := 'Montag';
    3 : vsDayOfWeek := 'Dienstag';
    4 : vsDayOfWeek := 'Mittwoch';
    5 : vsDayOfWeek := 'Donnerstag';
    6 : vsDayOfWeek := 'Freitag';
    7 : vsDayOfWeek := 'Samstag';
    else  vsDayOfWeek := 'Error';
  end;
  // Gibt die Kalenderwoche und den Tag in der Debugging anzeige aus.
  Debug.SHOW(1,'Kalenderwoche: ',vrWeekOfYear, ' Tag: ', vsDayOfWeek );
  System.SetValue(vrDayOfWeek);
end.
<!TXT>

>>
<<
128.110.2.4
DateTime.Time|Time
!128.110.2.2 - Date
--
<!DEF>
procedure <!TW>DateTime.Time (var rStunde, rMinute [, rSekunde [, rMSec]] : real);
<!TXT>
Liefert die aktuelle Uhrzeit zurck. (Systemzeit des Rechners)

<!TXT>

Beispiel
<!CODE>
var
  vrHour        : Real;
  vrMinute      : Real;
  vrSecond      : Real;
  vrMillisecond : Real;
step
  // Gibt die Aktuelle Zeit an die 3 bergabe parameter zurck.
  DateTime.Time (vrHour, vrMinute, vrSecond, vrMillisecond);
  // Zeigt die oben ermttelten Angaben in der Debugging Anzeige an.
  Debug.SHOW(1,'Aktuelles Zeit: ', vrHour, ':', vrMinute, ':', vrSecond, '.', vrMillisecond);
  System.SetValue(0);
end.
<!TXT>

>>
<<
128.110.2.5
DateTime.SetTimer|SetTimer
!128.110.3 - Timer
--
<!DEF>
procedure <!TW>DateTime.SetTimer (rNr, rZeitInMs : real);
<!TXT>
Setzt den Timer <!PW>rNr (1..100) auf eine Laufzeit von <!PW>rZeitInMs Millisekunden.

Startet oder stoppt den Timer aber nicht. Auch wird ein bereits laufender Timer nicht in seiner Restlaufzeit beeinflusst. Die Laufzeit wirkt sich erst beim nchsten Start des Timer aus.
>>
<<
128.110.2.6
DateTime.StartTimer|StartTimer
!128.110.3 - Timer
--
<!DEF>
procedure <!TW>DateTime.StartTimer (rNr : real);
<!TXT>
Startet den Timer <!PW>rNr. Das heit, ab jetzt luft der Timer und wird entsprechend seiner mit <!RW>DateTime.SetTimer gesetzten Laufzeit ablaufen.

Sollte der Timer bereits laufen oder war er angehalten, so wird er neu gestartet.
>>
<<
128.110.2.7
DateTime.PauseTimer|PauseTimer
!128.110.3 - Timer
--
<!DEF>
procedure <!TW>DateTime.PauseTimer (rNr : real);
<!TXT>
Hlt den Timer <!PW>rNr an. Der Timer speichert die Restlaufzeit. Dies hat keine Auswirkung auf die mit <!RW>DateTime.SetTimer gesetzte Laufzeit.

War der Timer nicht aktiv (also bereits angehalten oder abgelaufen) so hat der Aufruf keine Wirkung.
>>
<<
128.110.2.8
DateTime.ResumeTimer|ResumeTimer
!128.110.3 - Timer
--
<!DEF>
procedure <!TW>DateTime.ResumeTimer (rNr : real);
<!TXT>
Lt dem Timer <!PW>rNr weiterlaufen, wenn er zuvor angehalten war. Der Timer wird dann nach Ablauf der bei <!RW>DateTime.PauseTimer gespeicherten Restlaufzeit ablaufen.

War der Timer nicht angehalten, so hat der Aufruf keine Auswirkung.
>>
<<
128.110.2.9
DateTime.Sleep|Sleep
--
<!DEF>
procedure <!TW>DateTime.Sleep (rMSDelay : real);
<!TXT>
Wartet die in <!PW>rMSDelay angegebene Zeit in Millisekunden.

hnlich <!RW>DateTime.Delay, aber mit schlechterer Auflsung (typ. 10 ms) bei kurzen Wartezeiten.
Dafr sinkt die Prozessorbelastung whrend des Wartens, da Rechenzeit fr andere Prozesse freigegeben wird.

Mit <!RW>DateTime.Sleep (0) kann der Rest der Zeitscheibe an andere Prozesse freigegeben werden.

<!TXT>

Beispiel
<!CODE>
var
  vrLoops  : Real;
step
  vrLoops := 0;
  // Schleife bis Step beendet wird oder 4 durchlufe ausgefhrt wurden.
  repeat
    Inc(vrLoops);
    Debug.SHOW(1,'Loop: ', vrLoops);
    // Hlt den Prozess fr die Angegebene Zeit an und gibt die Zeit fr andere Prozesse frei.
    DateTime.Sleep(250);
  until ((stepcontinue) or (vrLoops=4));
  System.SetValue(0);
end.
<!TXT>

>>

<<
128.110.2.10
DateTime.Decode|Decode
--
<!DEF>
procedure <!TW>DateTime.Decode ( rDateTime : real; var rYear, rMonth, rDay : real [; var rHour, rMinute, rSecond : real [; var rMSec : real ]]);
<!TXT>
Dekodiert ein Datum/Uhrzeit im DateTime-Format in der Variable <!PW>rDateTime in seine einzelnen Bestandteile.

Beispiel
<!CODE>
var
  vrDateTime     : Real;

  vrYear         : Real;
  vrMonth        : Real;
  vrDay          : Real;
  vrHour         : Real;
  vrMinute       : Real;
  vrSeconds      : Real;
  vrMilliseconds : Real;
step
  // Gibt das Aktuelle Datum in Real Format zurck.
  vrDateTime := DateTime.Now;
  // Wandlung des Datums und der Zeit vom Real Format in einzelne Werte.
  DateTime.Decode(vrDateTime, vrYear, vrMonth, vrDay, vrHour, vrMinute, vrSeconds, vrMilliseconds);
  // Ausgabe des Datum und der Zeit in einzelnen Werten in der Debugging anzeige.
  Debug.SHOW(1, 'Datum: ', vrYear, '-', vrMonth, '-', vrDay, ' ', vrHour, ':', vrMinute, ':', vrSeconds, '.', vrMilliseconds);
  System.SetValue(0);
end.
<!TXT>

>>

<<
128.110.3
Funktionsbeschreibung der 'Timer'|Timer
!128.110.2.5 - SetTimer
!128.110.2.6 - StartTimer
!128.110.1.1 - TimerExpired
!128.110.2.7 - PauseTimer
!128.110.2.8 - ResumeTimer
--
Das IP-Objekt DateTime stellt 100 Timer zur Verfgung, die ber ihre Nummer angesprochen werden und voneinander unabhngig arbeiten.

Ein Timer besitzt:
<ul indent=12>
<li>eine Laufzeit</li>
<li>die Eigenschaft 'abgelaufen', die wahr oder falsch sein kann</li>
<li>einen Zustand der sein kann :
  <ul indent=12>
  <li>luft</li>
  <li>angehalten</li>
  <li>abgelaufen</li>
  </ul></li>
</ul>

Die Eigenschaft 'abgelaufen' kann ber <!RW>DateTime.TimerExpired abgefragt werden.

Die Laufzeit kann ber <!RW>DateTime.SetTimer gesetzt werden.

Der Zustand kann ber die Prozeduren <!RW>DateTime.StartTimer, <!RW>DateTime.PauseTimer und <!RW>DateTime.ResumeTimer manipuliert werden.

Vor jedem Prfdurchlauf werden die Timer auf den Zustand abgelaufen und eine Laufzeit von 0ms gesetzt (-> sie mssen also auf jeden Fall initialisiert werden).

Beispiele:
<!CODE>
// Abfrage mit Timeout von 1000ms
DateTime.SetTimer (1,1000);     // Timer 1 auf 1000ms Laufzeit setzen
DateTime.StartTimer (1);        // Timer 1 wird in 1000ms ablaufen
repeat
  rMessungOK:=...               // Messung durchfhren
until rMessungOK or DateTime.TimerExpired (1);

// Aktion 1 alle 100ms ausfhren, Aktion 2 alle 350 ms
DateTime.SetTimer (1,100);      // Timer 1 auf 100ms Laufzeit setzen
DateTime.SetTimer (2,350);      // Timer 2 auf 350ms Laufzeit setzen
DateTime.StartTimer (1);        // Timer 1 starten
DateTime.StartTimer (2);        // Timer 2 starten
repeat
  if DateTime.TimerExpired (1) then begin
    ...Aktion 1
    DateTime.StartTimer (1);    // Timer 1 neu starten
  end;
  if DateTime.TimerExpired (2) then begin
    ...Aktion 2
    DateTime.StartTimer (2);    // Timer 2 neu starten
  end;
  rMessungOK:=...               // Messung durchfhren
until rMessungOK;
<!TXT>
>>
