Unitman

Ein flexibler Einheiten-Manager für den HP49G/HP49+
integriert und entfernt Einheiten und ihre Verzeichnisse im Menüsystem UNITS

Unter Einheiten (engl.: units) seien hier die in Physik, Technik, Handel und Gewerbe üblichen Maßeinheiten verstanden. Viele davon sind im eingebauten Einheiten-Menüsystem UNITS vorhanden und davon sind viele in Europa entbehrlich. Die ersten vier Befehle der kleinen Bibliothek Unitman sind die wichtigsten und werden in Beispielen erklärt. Dank Unitman kann jede vom Benutzer definierte Einheit in einem Einheitenverzeichnis (im folgenden kurz UDir genannt) erscheinen und wird wie eine eingebaute Einheit behandelt. Dies bewirkt der Befehl AddU (Add Unit). Jedes Einheitenmenü kann durch den Befehl roUM (reorganize Unit Menu) vollkommen reorganisiert werden. Das heißt, Einheiten können umgeordnet, unerwünschte Einheiten entfernt oder vielleicht umbenannt werden. Ähnlich ist roUDs (reorganize Unit Directories). Es reorganisiert das gesamte Verzeichnissystem von UNITS. Auch können neue Einheitenverzeichnisse beliebig hinzugefügt werden. Wenn man ExpU (expand Units system) oder irgend einen anderen Befehl verwendet, erweitert sich  das System automatisch um das Einheitenverzeichnis MONEY zur Umrechnung von Währungen.

Ein Hauptvorteil von Unitman besteht darin, dass die berühmte und hoch-effiziente 3-fach Funktionalität von Einheiten-Tasten, bekannt vom HP 48 (siehe Bemerkung 1 unten), bei den benutzerdefinierten Einheiten ebenso funktioniert wie bei den eingebauten. Die meisten Unitman-Befehle setzen den RPN-Modus. Der algebraische Modus ermöglicht kein intelligentes Einheiten-Management. Unitman setzt auch den USR-Modus und den Soft-Menü-Modus, um richtig arbeiten zu können. Ihre ROM Version darf nicht älter sein als 1.19-3. Getestet auch in ROM 1.22 auf dem HP49+.


Was ist Neu?

Version 3.2003: Befehl EditU modifiziert. Siehe Beispiel 7. Dieses Dokument aktualisiert.

Version 2.2003: Befehl EditU hinzugefügt. Erlaubt, um eine vom Benutzer definierte Einheit zur Neudefinition zu editieren, siehe unten. Beispiele 6 und 7 hinzugefügt.

Version 1.2003: DelUK löscht nicht nur die Belegung der Einheiten-Tasten, sondern holt sie auch für eine spätere Wiederzuweisung zurück.

Version 1.2002: Da Unitman immer wichtiger im EURO-Zeitalter wird, ist dieser Text gänzlich revidiert worden.

Version 9.2001: Kleinere Änderung in ROMPTR 167 D (der einzige, der in der Tastenzuweisung der UNITs-Taste vorkommt). Keine Änderung in der Funktionalität.

Version 8.2001: Der Befehl Upgrd wurde durch DelUK ersetzt und löscht jede Zuordnung der UNITS-Taste. Diese Zuordnung sollte gelöscht werden, falls sie durch frühere Versionen erstellt wurde. Vorher definierte Einheiten müssen nicht neu definiert werden, sondern können einfach mit AddU (Add Unit) per Liste in ihre Kategorie zurückversetzt werden. Eine durch diese Version gemachte UNITS-Tastenbelegung funktioniert in allen HP49G-Betriebssystem-Versionen von 1.19-3 aufwärts


Abkürzungen:
 
NS = noshift  (nicht-umgeschaltete Taste,
RS =  rightshift   LS = leftshift     ein + bedeutet Shift-Taste festhalten
Beisspiel: Die Taste 84.31 entspricht der Tastenfolge [RS]+[6] 

Bitte belegen Sie die Taste 84.31 mit « 359 MENU », weil die Unitman-Befehle in den Beispielen unten laufend benötigt werden. Man könnte auch jede andere Taste wählen, außer 84.3, die von Unitman selbst verwaltet wird. EditU (Edit Unit) editiert eine vom Benutzer definierte Einheit, um sie, wie in Beispiel 7 gezeigt, zu aktualisieren. DelUK (Delete User Key) löscht die Tastenbelegung an 84.3 und stellt sie in den Stack, etwa zum Komprimieren für eine erneute Zuordnung von Hand.

1. Zuerst wollen wir die Währung EUR im neuen MONEY-Verzeichnis definieren, das nach einem ersten Programmlauf von AddU oder ExpU nur den (US)$ enthält. Eine neue Einheit definierenEin Aufruf von ExpU ist nicht erforderlich. Das Verzeichnis MONEY wird automatisch durch Aufruf von AddU und anderen Befehlen erzeugt. Man drückt einfach AddU und füllt das AddU-Dialogfeld nach Auswahl des Namens MONEY aus. EUR kann eingegeben werden wie geschrieben, aber besser ist, man verwendet das Eurosymbol , das mit der Tastenfolge [ALPHA][RS][4] aufgerufen wird. In das Feld UnitName muss der Einheitenname als String (oder Liste von solchen) eingegeben werden, weil der Name illegal (z.B. 'kg/m^2') sein kann. Das Feld Define ist hier auszufüllen, weil EUR oder dem HP49 als Einheit unbekannt ist. Das Define-Feld akzeptiert nur Einheiten. Diese beginnen mit einer reellen Zahl, gefolgt von Unterstrich und Einheitenbezeichnung, wie im Bild gezeigt. Um das $-Zeichen zu erhalten, drückt man [ALPHA][LS][4] und anschließend [OK]. Dann erscheint in MONEY! Jeder Dollar-Betrag wird jetzt sofort in EUR umgerechnet und umgekehrt. Gibt man z.B. 100 gefolgt von ein, dann erhält man nach Drücken von [LS][$] das Ergebnis 107_$.

Achtung! Sowohl $ als auch erscheinen jetzt auch als Namen im HOME-Verzeichnis, falls das Beispiel in HOME ausgeführt wurde. Wir empfehlen, diese kleinen Einheiten-Dateien später (z.B. mit HIDE oder einem Filer) zu verstecken. Wenn ein Name wie '$' bereits in einem anderen Kontext verwendet wurde, wird er nicht überschrieben, aber der neue Einheitenname hat Priorität in der Ausführung. Ein benutzerdefinierter Einheitenname in einem Einheitenmenü muss mit seinem globalen Namen übereinstimmen. Dies ist bei Änderung von Einheitennamen zu beachten. Siehe Ende von Beispiel 3.

2. Als nächstes wollen wir, dass die wichtige Einheit "ms" (Millisekunde) im TIME-Einheitenmenü erscheint. Das Dialogfeld sollte schon ausgefülllt sein wie im Bild gezeigt. Das Define-Feld kann jetzt bedenkenlos übersprungen werden. Hinzufügen einer dem System bekannten EinheitEine Eingabe ist dort nicht notwendig, weil das System das Präfix "m" und die Einheit "s", und folglich auch "ms" kennt, obgleich eine Einheit "ms" im eingebauten TIME-Menü nicht erscheint. Mit AddU erzwingen wir gewissermaßen die Anzeige von "ms". Im Allgemeinen sind Einheiten durch die Präfixe d (deka), h (hekto)... oder d (dezi), m (milli)... von existierenden Einheitennamen abgeleitet und dem Befehl CONVERT und anderen Befehlen bekannt, selbst wenn sie in eingebauten Menüs nicht vorkommen. In einem solchen Fall wird nichts ins HOME-Verzeichnis geschrieben. Das UnitName-Feld akzeptiert auch eine Liste aus Strings von Einheitennamen. Aber alle müssen korrekt definierte Einheiten sein, entweder eingebaut oder vom Benutzer definiert, etwa in einer vorhergehenden Version von Unitman. Man kann eine eigene Menüseite für Frequenzeinheiten setzen (siehe nächstes Beispiel), oder ein neues Verzeichnis für Frequenzen schaffen, ähnlich wie in Beispiel 4. Jedenfalls kann man {"kHz" "rpm"} in einem Arbeitsgang zur Menüseite der Frequenzen in TIME hinzufügen, ohne etwas ins Define-Feld zu schreiben. Beide Einheiten sind dem HP49 bekannt. Die Einheit "rpm" (Umdrehungen pro Minute) kommt in 117 MENU vor. Die Umrechnung ist hier: 1_Hz = 60_rpm.

3. Die Reihenfolge in vorhandenen Menü ist manchmal etwas unpraktisch. Es scheint besser, in TIME eine eigene Menüseite für Frequenzeinheiten wie Hz, MHZ etc zu schaffen. Das kann mit roUM (reorganize Unit Menu) getan werden. Der spezielle Stack ermöglicht Umbenennen und LöschenMan drückt roUM, wählt das UDir TIME und drückt [OK]. Dies erzeugt einen speziellen Stack (ähnlich dem interaktiven Stack), der wie im Bild links gezeigt aussieht. Dies ist eine Kopie des vorhandenen TIME-Menüs, dem "ms" bereits hinzugefügt wurde. Der Cursor steht auf "ms". Wir bewegen ihn aufwärts zu "Hz" und drücken ROLL, was "Hz" auf Position 1 rollt. Am Schluss drücken wir [ON] oder [ENTER], um den Stack zu verlassen und uns im TIME-Menü von der Änderung zu überzeugen. Dieses Menü wird yr, d, h, min, s, ms auf Seite 1 zeigen, und Hz auf Seite 2. Es spricht einiges dafür, Frequenzen im UDir TIME unterzubringen, denn eine Einheit ist eng verbunden mit ihrer inversen. Wenn z.B. die Taste 1/x bei Stackinhalt 440_Hz (Kammerton a) gedrückt wird, erhält man 0.00227 ..._1/Hz  (= 0.0027 .._s = 2.7...ms). Siehe hierzu auch Beispiel 6.

Man kann die zweite Seite des TIME-Menüs durch Hinzufügen der Einheiten "kHz", "MHz" und "GHz" ergänzen. Diese bedürfen keiner Definition. Auch ist es nützlich einen Frequenz-Tick als 1_tic = 8192_Hz zu definieren. Das ist der Takt der internen Systemuhr von HP4X Rechnern. Wenn man die Uhr-Ticks als Zeit-Einheiten verstehen will, muß 1_s = 8192_tic gelten. Dies wird erreicht indem man tick als Frequenz-Einheit wie in Beispiel 7 editiert und umdefiniert.
Wichtig: Benutzen Sie im speziellen Stack nur folgende Optionen: Die Rücktaste (Backspace 45.1) zum Löschen, ROLL und ROLLD um umzuordnen, sowie EDIT für kleine Änderungen (etwa um "kW" in "KW" umzubenennen).
Wird z.B,  ""  auf diese Weise in "EUR" umbenannt, muß auch der globale Name '' entsprechend umbenannt werden. Am besten mit dem Filer, falls es sich um versteckte Variablen handelt. Der spezielle Stack kann nicht abgebrochen werden. Die Prozedur läuft weiter, gleichgültig, ob man [ENTER] oder [CANCEL] drückt. Bei Änderungen sollte man deshalb Vorsicht walten lassen.

4. Wir wollen noch ein UDir, genannt InfU (Informatic Units), hinzufügen. Dazu drücken wir einfach AddUD und schreiben InfU (als String) in die Editierzeile, wie im folgenden Bild gezeigt. Ein schließendes Anführungszeichen (string delimiter) ist unwichtig. Hinzufügen eines neuen Informatik-EinheitenverzeichnissesDann drücken wir [OK] (oder [ENTER], um zu vermeiden, "F" zu tippen, wenn  vergessen wurde, die ALPHA-Taste rechtzeitig zu deaktivieren). Dieses Vorgehen fügt InfU zu den Einheitenmenüs hinzu, zunächst ohne jede Einheit. Solche können mit AddU wie folgt definiert werden: 1_bit = 1_$, 1_byte = 8_bit, 1_Kbyte = 1024_byte, etc. Das Define-Feld für "Kbyte" sollte nicht übersprungen werden, denn nachdem die Byte-Einheit schon vorhanden ist, würde der HP49 1_Kbyte = 1000 Bytes setzen! Die obengenannte Definition 1_bit ist nicht ganz willkürlich. 1_$ ist eine dimensionlose Einheit, folglich gilt dies auch für 1_bit. Aber der Benutzer ist frei, 1_bit unterschiedlich zu verwenden. Eine mögliche Definition wäre, 1_bit durch eine winzige Längeneinheit, etwa entsprechend der Packungsdichte der Information auf einer Compact Disc zu definieren. Andere könnten eine noch winzigere Einheit bevorzugen, beispielsweise die Packungsdichte der Information in einem DNS-Strang.

5.Der spezielle Stack aller UDir-Namen Einige User wollen vielleicht das UDir MONEY an Platz 1 haben. Kein Problem. Einfach roUDs (reorganize UDirs) drücken. Dann zeigt der Bildschirm einen speziellen Stack, der die Namen aller UDirs enthält. Jetzt kann man mit ROLL und ROLLD wie in Beispiel 3 umordnen. Man bewegt einfach den Cursor zu "LENG" (vermutlich auf Level 17) und drückt ROLLD, und schon ist man fertig. Man kann ein UDir auch mit der Rücktaste entfernen, z.B. RAD, wenn man sich nie mit Strahlung befasst. Sollte es dennoch einmal vorkommen, ist dies kein Problem. Man kann ja den USR Modus einfach verlassen.

Nur die Umbennenung eines Verzeichnisnamens ist etwas aufwendiger. Wir erläutern dies an einem Beispiel. Ein Deutscher möchte vielleicht das Menü TIME in ZEIT umbenennen. Wir verwenden die EDIT-Option, während wir uns in der roUDs-Umgebung mit dem Cursor auf "TIME" befinden. Umbenennung von TIME IN ZEITDas editiert den String "TIME". Jetzt fügen wir den neuen Namen "ZEIT" hinzu, wie im linken Bild gezeigt.  Es ist hier wichtig, den alten Namen und den neuen Namen in einem String zu vereinen, aber in verschiedenen Zeilen, ohne Leerzeichen davor und dahinter. Man verlasse nun den Editor mit [ENTER] und kehre in den speziellen Stack zurück. Dann nochmals [ENTER] und siehe da, "TIME" wurde tatsächlich in "ZEIT" umbenannt. Auch ein englisch sprechender Benutzer kann dieses Beispiel ohne Risiko nachspielen. Er kann "ZEIT" jederzeit wieder in "TIME" zurück benennen. Man beachte, mit roUDs kann das Umordnen und Umbenennen von Einheiten-Kategorien, sowie das Eliminieren einzelner Kategorien in nur einem einzigen Schritt erledigt werden.

6. Die meisten Europäer geben den Kraftstoffverbrauch ihrer Autos in "Litern pro 100 km" an. In Großbritannien wird er in "mi/galUK" angegeben, das ist die gefahrene Strecke in Meilen pro 1_galUK. Wie rechnet man diese nicht-konvertiblen Einheiten ineinander um? Man erzeugt einfach ein neues UDir, z.B. DRIVE. Die Einheit "1 Liter pro 100 km" entspricht 1_cl/km. Man ruft einfach AddU auf und stellt {"cl/km" "km/l" "mi/gaUK"} ins Eingabefeld UDirName. Es ist keine Definition dieser Einheiten erforderlich, da sie dem Einheitensystem wohlbekannt sind. So wird nichts ins HOME-Verzeichnis geschrieben. Unter DRIVE erscheint jetzt folgendes Menü:

     cl/km           km/l      mi/galUK                                        UNITS    

"km/l" ist eine sehr nette Verbrauchseinheit, vielleicht die beste. Sie erzählt uns, wieviele "km" wir mit einem Liter Kraftstoff fahren können (km-Leistung). Sie ist direkt konvertierbar in "mi/galUK". Zum Beispiel entspricht 12_km/l dem Wert 33.9_mi/galUK. Um zu diesem Ergebnis zu kommen, setzt man 12_km/l in den Stack und drückt einfach [LS][mi/galUK]. Das ist alles. Um in die tranditionelle Einheit umzurechnen, drückt man [1/x] und das Resultat sagt uns, dass das 8.3_cl/km bedeutet.

7.  Wir nehmen an, dass $ und im Menü MONEY enthalten sind und der Wechselkurs des aktualisiert werden muss. Kein Problem mit dem Befehl EditU. Der EditU-Bildschirm in MONEYDiesen Befehl drücken, welcher das UNITS-Menü setzt. Nun mit [NXT] zu MONEY gehen und dieses Menü öffnen. Während EditU läuft (aktiv ist, "EditU" wird angezeigt), einfach [] drücken. Das erzeugt eine Editierzeile, wie im linken Bild gezeigt. Nun kann man etwa 1.07_$ zu 1.17_$ ändern. Drücken auf [ENTER] überschreibt den Einheitennamen '' mit dem neuen Wechselkurs. Das läuft auch perfekt, wenn der Name '' versteckt ist. Nicht nur der numerische Wert, sondern auch die Definition der edititierten Einheit kann geändert werden Die EditU-Umgebung kann nur durch Drücken von CANCEL verlassen werden. Außer der Taste NXT und den Menütasten reagieren die meisten anderen Tasten mit einem akustischen Fehlbedienungs-Signal.

Wichtig: Das Editieren einer Einheit durch direktes Drücken einer Einheitentaste arbeitet nur im EditU-Modus, und nur für eine vom Benutzer definierte Einheit, deren Name im Pfad gefunden wird. Es macht keinen Sinn, die hart-codierten eingebauten Einheiten zu editieren. Außerhalb EditU arbeitet eine Einheitentaste wie in Bemerkung 1 beschrieben. Um eine andere benutzerdefinierte Einheit zu modifizieren, muss EditU wieder neu aufgerufen werden.


Bemerkung 1. Vom Benutzer definierte und in UNITS integrierte Einheiten funktionieren in der gleichen Weise wie eingebaute Einheiten. Eine Einheiten-Taste arbeitet im RPN-Modus wie folgt (Details siehe Kapitel 10 des HP48 (!) Handbuchs. Dies ist in den HP49G-Dokumenten nicht erklärt):


Bemerkung 2. Während eine Eingabemaske aktiv ist, kann man bequem durch die Einheiten-Menüs blättern, um zu sehen, was sie enthalten oder um Stringteile von Einheiten in den Editor zu holen. Bei der Wahl von Einheitennamen ist Sorgfalt angebracht. Zum Beispiel kann der Einheitenname PS (= PetaSiemens = 1015 Siemens) nicht umdefiniert werden, obwohl diese Einheit nie in Gebrauch war. Namen von Einheiten, die mit einem Rechenzeichen (+, - , * , / oder : ) anfangen oder aus einem leeren String bestehen, können ernste Probleme verursachen, wenn sie gemäß Bemerkung 1 verwendet werden. Vor einer Änderung im Einheitensystem sollte immer eine Sicherung des HOME-Verzeichnisses erfolgen. Man beachte auch, dass der Name 'e' für die Ladungs-Einheit des Elektrons Probleme verursachen kann, da die Zahl e (Basis der natürlichen Logarithmen, Eulersche Zahl) eine Konstante auf dem HP49G ist.

 Bemerkung 3. Man sollte alle unerwünschten Einheiten entfernen, z.B "miUS^2" oder "galUK". Das Betriebssystem erinnert sich stets an sie. Man kann sogar ganze Menüs zu löschen. Sie gehen nicht verloren. Wenn man zwischendurch mit den eingebauten Einheiten arbeiten will, verlässt man einfach den USR-Modus, denn benutzerdefinierten Einheiten sind nur im USR-Modus aktiv.

Bemerkung 4. Wenn Sie die Tastenbelegung der UNITS-Taste versehentlich, z.B. durch Drücken auf DelUK, gelöscht haben und die Zuordnung auch nicht im Stack oder als HOME-Sicherung verfügbar ist, dann sind Sie noch nicht vollkommen verloren. MONEY erscheint nach dem ersten Aufruf jedes Befehls. Die benutzerdefinierten Udirs müssen neu erstellt werden. Dann sind alle Einträge (eingebaute/implementierte sowie solche, die als globale Variablen im aktuellen Verzeichnispfad stehen) wieder im HOME-Verzeichnis verfügbar. So genügt es, das UnitName-Feld in AddU mit einer einzelnen Liste der verlorenen Einheitennamen (Strings) zu füttern. Sie alle sind noch Ihrem persönlichen System bekannt. Folglich ist keine Neudefinition erforderlich.

Bemerkung 5. Die Tastenbelegung der RS-UNITS-Taste 84.3 kann sehr umfangreich werden. Aber sie kann mit BZ auf ungefähr 1 Kilobyte komprimiert werden. Man hole die Tastenbelegung mit S?UK (aus OT49) in den Stack und komprimiere sie mit dem BZ-toggler ~ und verwende dann BZCE aus diesem Menü, um einen selbst-extrahierenden Code der Tastenbelegung zu erzeugen. Das Resultat ordne man mit ASSIGN der Taste 84.3 zu. Dies soll aber erst gemacht werden, wenn sich benutzerdefinierte Einheiten nicht mehr ändern. Man beachte, dass jede Änderung in der Einheitenstruktur die Belegung der Taste 84.3 dekomprimiert aber nicht automatisch rekomprimiert. Unitman wird von der Bibliothek UTOOL (siehe hpcalc.org) unterstützt.


Wolfgang Rautenberg  -  raut@math.fu-berlin.de

  http://www.math.fu-berlin.de/~raut/ - ftp://ftp.math.fu-berlin.de/pub/usr/raut/

Danksagung: Vielen Dank an Heiko Arnemann und Otto Praxl für die Hilfe bei Erstellung der HTML-Dokumente, sowie für Hinweise und Beta-Tests in ROM 19-6. Otto Praxl entwarf auch die Übersetzung ins Deutsche.