Easter-Egg Befehle im MPR Part I - Zeit und Datumsrechnung

Moderator: MVogt

Post Reply
User avatar
Theo_Gottwald
Posts: 367
Joined: 03. Oct 2009, 08:57
Location: Herrenstr.11 * 76706 Dettenheim
Contact:

Easter-Egg Befehle im MPR Part I - Zeit und Datumsrechnung

Post by Theo_Gottwald » 12. Feb 2017, 11:59

Letzte Woche habe ich mal alte Entwickler-Unterlagen nachgesehen von vor etlichen Jahren.
Und tatsächlich es gibt Befehle, die der MPR kann und die gar nicht in der Hilfe stehen.
Undokumentierte "Geheimbefehle".

Thema in Part I: Datumsberechnung und Zeitberechnung.
Es gibt hier so viele Befehle daß man alle Datums- und Zeitrechnungen mit dem MPR problemlos machen kann.

****************************
m_is_leapyear
****************************

Die Funktion ermittelt, ob das angegebene Jahr (im Bereich 0 bis 5000) ein Schaltjahr ist oder nicht.
Die Rückgabe ist dementsprechend 1 oder 0.
Fehlt die Jahresangabe, dann wird das aktuell auf dem PC eingestellte Datum zugrunde gelegt.

Beispiel:

Code: Select all

GRN\m_is_leapyear|1968>$$RES
GRN\m_is_leapyear|2015
VAR\$$RES=$v1$
' Im Folgenden wird das aktuelle Jahr zugrunde gelegt, da die Jahresangabe fehlt:
GRN\m_is_leapyear>$$RES
****************************
m_get_time
****************************

Die Funktion "m_get_time" ermittelt Zeit und/oder Datum. Darüber hinaus können auch Datumsberechnungen ausgeführt werden.
Da es hierbei wichtig ist, dass man genau das gewünschte Format erhält, unabhängig von den jeweiligen Ländereinstellungen, kann man hier das Format selbst angeben.
Dies geschieht unter Verwendung der folgenden Buchstaben:
y - Jahr
m - Monat
d - Tag
h - Stunde
n - Minute
s - Sekunde
t - Tick (Mikrosekunde)
Ein einfacher Aufruf der Funktion sieht so aus:

Code: Select all

GRN\m_get_time|dd>$$RES
Ergebnis: 23 - wenn gerade der 23.te des Monats ist.

Code: Select all

GRN\m_get_time|dddd>$$RES
Ergebnis: In diesem Fall 0023 da vier "d" angegeben wurden.

Code: Select all

' Ein komplettes Datum erhält man so:
GRN\m_get_time|dd/mm/yyyy>$$RES
Ergebnis in $$RES ist hier zum Beispiel: 03/02/2011

Auf die gleiche Weise kann man die Zeit ermitteln:

Code: Select all

GRN\m_get_time|nn>$$RES
Ergebnis wäre zum Beispiel 03 (falls es gerade 7:03 ist). 

GRN\m_get_time|nn-ss-tttt>$$RES
' Hier erhält man zum Beispiel Minuten, Sekunden und Ticks.

' Zeitpunkt in 4 Jahren in einem User-definierten Format
GRN\m_get_time|dd/mm/yyyy|AY:4>$$RES
Die Funktion bietet außerdem die Möglichkeit, ausgehend von der jetzigen Zeit Datums-Berechnungen auszuführen.
Dazu kann man als zweiten Parameter angeben, welcher Betrag von Tag, Monat, Jahr etc. abgezogen oder hinzuaddiert werden soll.
Diese Angabe erfolgt durch Buchstabenkombinationen von "A" (Add) oder "S" (Subtract) und dem jeweiligen Zeitbuchstaben wie folgt:

AY:(Zahl) ' Jahre hinzuzählen
SY:(Zahl) ' Jahre abziehen

AM:(Zahl) ' Monate hinzuzählen
SM:(Zahl) ' Monate abziehen

AD:(Zahl) ' Tage hinzuzählen
SD:(Zahl) ' Tage abziehen

AH:(Zahl) ' Stunden hinzuzählen
SH:(Zahl) ' Stunden abziehen

AN:(Zahl) ' Minuten hinzuzählen
SN:(Zahl) ' Minuten abziehen

AS:(Zahl) ' Sekunden hinzuzählen
SS:(Zahl) ' Sekunden abziehen

AT:(Zahl) ' Ticks hinzuzählen
ST:(Zahl) ' Ticks abziehen

Beispiele:

Code: Select all

GRN\m_get_time|yy-mm-dd|AH:200,SN:400>$$RES
' Es werden zum aktuellen Datum 200 Stunden hinzugezählt und dann 400 Sekunden abgezogen.
' Das  Ergebnis wird im gewünschten Format ausgegeben. 

Code: Select all

GRN\m_get_time|dd;mm;hh|AD:50,SH:90>$$RES
' Es werden zum aktuellen Datum 50 Tage hinzugezählt und dann 90 Stunden abgezogen.
' Das  Ergebnis wird im gewünschten Format ausgegeben in die Variable $$RES.
Der Befehl kann auch für Datumsberechnungen verwendet werden.
Dazu wird die Startzeit mit den folgenden Optionen geändert:

NY: (geänderte Jahreszahl 0 ... 5000)
NM: (Monatszahl: 1 ... 12)
ND: (Tag: 1 ... 31)
NN: (Minute: 0 ... 59)
NS: (Sekunde: 0 ... 59)
NT: (Millisekunde: 0 ... 999)

Beispiel:

Code: Select all

 GRN\m_get_time|yy-mm-dd|NY:2013,NM:5,ND:5,AH:200,SN:400>$$RES

Man kann so auch einfach ein Datum formatieren (ohne Berechnung):

Code: Select all

 GRN\m_get_time|yy-mm-dd|NY:2013,NM:5,ND:5>$$RES

****************************
"dtn.","m_date_to_number"
****************************

Der Befehl wandelt ein Datum in eine 32 bit-Zahl um. Dadurch können Datumsvergleiche einfach mittels IVB\ erfolgen.

Beispiel 1:

Code: Select all

GRN\dtn.|15-03-2005
VAR\$$DAT=$v1$
GRN\ntd.|$$DAT
MBX\$v1$

Beispiel 2:
GRN\dtn.|15-03-2005
VAR\$$DAA=$v1$

GRN\dtn.|19-04-2005
VAR\$$DAB=$v1$

GRN\dtn.|20-04-2005
VAR\$$DAC=$v1$

IVB\$$DAC|$$DAA|$$DAB
   MBX\Datum ist innerhalb des Zeitraumes
ELSE
   MBX\Datum ist nicht innerhalb des Zeitraumes
EVB\
Beispiel 3:

Code: Select all

' Lässt man das Datum weg, wird das heutige "Local Time" Datum verwendet.
GRN\dtn.|
VAR\$$DAA=$v1$

GRN\dtn.|17-04-2011
VAR\$$DAB=$v1$

CAL\$$DIF=$$DAB-$$DAA
MBX\$$DAA-$$DAB--$$DIF
****************************
"ntd.","m_number_to_date"
****************************

Der 15-03-2011 ergibt zum Beispiel 149823.
Der 16-04-2011 ist 32 Tage später ergibt also 149855.
Auf diese Weise kann man auch leicht DAtumsberechnungen ausführen, auf Tagesbasis.
Mit der "number_to_date" Funktion kann man dann die berechneten Werte wieder in Reale Daten zurückumwandeln.

****************************
"rdi.","m_return_date_info"
****************************

Returns Date-Info (Systemunabhängig). Je nach Angabe eines Zahlenparameters werden unterschiedliche Informationen zum aktuellen Zeitpunkt ermittelt und zurückgegeben:
0 - dayname,
1 - Monthname,
2 - Datenum,
3 - yearnum,
4 - time,
5 - Time + Milliseconds,
6 - DayOfWeek (as number 0-6),
7 - Datum (deutsche Schreibweise),
8 - Wochentag (immer Englisch!),
9 - Wochetag (nur 2 Buchstaben, gross)
10 - Zeit - nur Stunde und Minute


Beispielskript Datumsfunktionen:

Code: Select all

' Diese Angabe könnte in einer INI-Datei stehen. 
' Sie sagt aus in welchen zeiträumen ein Unterskript ausgeführt werden soll (oder nicht)
VAR\$$INT=Mo*7:00-12:00,Di*9:00-10:00

FEM\1,|$$INT|DoIt|$$INA
MBX\Fertig
@

:DoIt
' Heutiger Tag als Zahl
GRN\m_return_date_info|6>$$DAN

' Erste Zwei Buchstaben aus Ini-Zeile sind der Tag
GSS\1,2|$$INA>$$DAY
GSB\Daynum
' Wenn nicht heutiger Tag gemeint ist
JIV\$$RES!$$DAN:enz

' Ab hier Uhrzeit prüfen
' Aktuelle Zeit holen
GRN\m_return_date_info|10>$$TIM

' Zeitangaben holen
SBD\|$$INA|*|2>$$TMS

' In von / bis aufspalten
SBD\|$$TMS|-|1
' Von-Zeit
VAR\$$TMA=$v1$
' Bis Zeit
VAR\$$TMB=$v2$

GRN\m_verify_time_format|$$TMA>$$TMA
GRN\m_verify_time_format|$$TMB>$$TMB
GRN\m_verify_time_format|$$TMS>$$TMS

GRN\m_time_to_number|$$TMA>$$TAN
GRN\m_time_to_number|$$TMB>$$TBN
GRN\m_time_to_number|$$TMS>$$TSN

IVB\$$TSN|$$TAN|$$TBN
  ' Zeit ist innerhalb der genannten Parameter
ELSE
  ' Zeit ist nicht innerhalb der genannten Parameter
EVB\


:enz
@

:Daynum
SLC\$$DAY
CSE\MO
   VAR\$$RES=1
CSE\DI,TU
   VAR\$$RES=2
CSE\MI,WE
   VAR\$$RES=3
CSE\DO,TH
   VAR\$$RES=4
CSE\FR
   VAR\$$RES=5
CSE\SA
   VAR\$$RES=6    
CEL\
   VAR\$$RES=7
ESL\
RET\

****************************
"vdf.","m_verify_date_format"
****************************

Der Befehl stellt sicher, dass ein String das notwendige deutsche Datumsformat DD-MM-YYYY hat.
Es wird auch geprüft ob die Zahlen im erforderlichen Bereich sind.
Der String wird falls erforderlich um führende "0" ergänzt und so zurückgegeben.

Beispiel:

Code: Select all

GRN\vdf.|41-2-99
MBX\$v1$
' Da 41 keine gültige Datumsangabe wirde der Wert auf 31 reduziert.
Ausgabe: 31-02-0099

****************************
"vtf.","m_verify_time_format"
****************************


Der Befehl stellt sicher, dass ein String das notwendige deutsche Zeitformat HH:MM:SS hat.
Es wird auch geprüft ob die Zahlen im erforderlichen Bereich sind.
Der String wird falls erforderlich um führende "0" ergänzt und so zurückgegeben.

Beispiel:

Code: Select all

GRN\vtf.|24-1-9
MBX\$v1$
@
Rückgabe: 23:01:09

****************************
"ttn.","m_time_to_number"
****************************


Erzeugt eine Zahl, die die Anzahl der Dekunde nseit Mitternacht angibt.
Dadurch lassen sich Zeitabfragen leicht via IVB\ ausführen.
Ebenso werden Zeitberechnungen mit Sekunden vereinfacht.

Beispiel:

Code: Select all

GRN\ttn.|10:09:00
VAR\$$DAT=$v1$
MBX\$$DAT
' Ausgabe: 36540

GRN\ntt.|$$DAT
MBX\$v1$
' Ausgabe: 10:09:00
@
****************************
"ntt.","m_number_to_time"
****************************

Gegenfunktion zu "m_time_to_number". Nach einer Zeitberechnung läßt sich damit die Anzahl der Sekunden wieder in die Tageszeit umrechnen.

Beispiel:

Code: Select all

GRN\ttn.|10:09:00
VAR\$$DAT=$v1$
MBX\$$DAT
' Ausgabe: 36540

GRN\ntt.|$$DAT
MBX\$v1$
' Ausgabe: 10:09:00
@
Aber noch Mal der Hinweis: Die Befehls stehe nicht in der Hilfe und sind derzeit offiziell nicht vorhanden obwohl sie jeder MPR Nutzer sofort nutzen kann. Also dazu ist kein Update nötig die Befehle sind da schon drin und zwar seit Jahren.

Post Reply

Return to “Package Robot”

Who is online

Users browsing this forum: No registered users and 3 guests