Was ist das? YADRO benutzen Im Detail |
Arbeiten mit Macros der Digitalanzeige:Will man eigene Macros für die Digitalanzeige schreiben, existierende modifizieren oder vorhandene übersetzen, dann ist hier die richtige Informationsquelle. Dieser Teil ist noch nicht im endgültigen Zustand, da er noch nicht alle Möglichkeiten zeigt. Am besten sieht man sich eine cfg-Datei an, um Lösungsansätze zu finden.
Macros übersetzenBeinahe alles der Benutzerschnittstelle der Digitalanzeige das Sprachabhängig ist findet sich in den Macros (also im yadro.cfg). Es ist keine schwarze Magie sie in eine andere Sprache zu übersetzen. Man muss nur nach 3 Schlüsselwörtern suchen. Zuerst die Macro-Namen: Keine Macros übrsetzen die mit internal beginnen! Eine typische Zeile in der yadro.cfg die übersetzt werden kann, sieht so aus: Macro:AA Absolute all (X, Y, Z) Der Text direkt hinter dem "Macro:" ist der Text der übersetzt werden muss (in grün). Ich übersetze nach Deutsch: Französich: Als nächstes Benutzerabfragen: getnext("Move to X/Y = 0.0"); Nach Deutsch: Die andere Funktion (input) und gleichzeitig ein längeres Beispiel: input("Hole Circle", "Center X (Disp1):", HCCenterX, "Center Y (Disp2):", HCCenterY, "Number of holes:", HCHoles, "Diameter:", HCDiam, "Starting angle:", HCAngle); Nach Deutsch: input("Lochkreis", "Mittelpunkt X (Disp1):", HCCenterX, "Mittelpunkt Y (Disp2):", HCCenterY, "Lochzahl:", HCHoles, "Durchmesser:", HCDiam, "Startwinkel:", HCAngle);
Eigene Macros schreibenIch gehe hier anhand einer Konfigurationsdatei die interessanten Punkte durch und erkläre die Kommandos "ambulant". Nachdem YADRO Fortschritte macht, spiegelt diese Beispiele nicht den exakten Zustand einer aktuellen Konfigurationsdatei wieder. Es kann aber immer noch als Beispiel dienen. Die ersten paar Zeilen:
Die ganze YADRO.CFG besteht aus einer Liste von Anweisungen. Um das Leben etwas zu erleichtern, kann man Kommentare zwischen Macros oder Interpreter-Kommandos setzen. Kommentare beginnen mit einem ";" an der äußerst linken Position einer Zeile. Aber wer braucht schon Kommentare?
Alles zwischen den Symbolen Interp: und :EndI (ganz links!) wird direkt an den Interpreter geschickt. Es wird nicht gespeichert und man kann später nicht darauf zurückgreifen. Es wird hauptsächlich zum Konfigurieren verwendet.
Achsen benötigen Bezeichnungen/Namen. Diese Bezeichnungen sind nicht fest einprogrammiert, sie werden definiert. Intern werden Achsen von 1
3 durchnumeriert. Achse 1 ist die oberste in der Anzeige. Man benahmst Achsen mit display("AxName", 1, "X") (hier: Achse 1 wird X genannt). Theoretisch kann man Achsen nennen wie man will, praktisch stehen z.Zt. nur die Buchstaben X, Y, Z, A, D, R, O zur Verfügung. Zusätzlich das Durchmesserzeichen, das als "/O" bei der Benamsung geschrieben wird.
Wie schon erwähnt gibt es Variablen. Variablen müssen definiert und deklariert werden. Variablen haben kein Scope, sie sind immer Global. Man mag das unschön nenne, hier ist es aber passend, da der Code eher monolithisch ist.
Hier ist ein Macro. Macros werden von Macro: :EndM eingeklammert. Macros haben Namen und brauchen Namen. Der Name eines Macros steht direkt hinter dem Macro:. Macro-Namen können Leerzeichen usw. enthalten. (Fast) Alle Macros können vom Benutzer in einer Liste ausgewählt ausgewählt werden. Jedoch werden Macros (wie dieses hier) nicht dem Benutzer gezeigt, wenn sie mit "internal" beginnen. Diese Macros arbeiten als Werkzeuge/Unterprogramme. Der Befehl display("Status", 1, 2, "abs"); ist ein weiterer zu Ansteuerung der Anzeige. Hinter jeder Achsanzeige ist Platz für Statusinformationen wir "abs", "rel", "neg", "mm" usw. Der erste Parameter (hier: 1) gibt die Achsennummer an, der zweite (hier: 2) die Zeile innerhalb der Achse. Jede Achse hat 6 solcher Statuszeilen. Um eine Statusanzeige zu löschen, wird ein Leerstring ("") gesendet.
Hier ein Macro das zwischen Metrisch und Zöllig umschaltet. Es ist auch ein internes Macro. Man findet ein display mit neuem Parameter. display("Precision", 1, PrecisionMetric); stellt die Anzeigegenauigkeit (Anzahl Nachkommastellen) für jede Achse ein. Ja, man kann (könnte) für jede Achse verschiedene Auflösungen und Einheiten haben. Man sieht auch, daß die Variable PrecissionMetric von weiter oben verwendet wird. So verhindert man, daß für eine Änderung an mehreren Stellen nach "magic numbers" gesucht werden muß.
Hier ist der Code-Teil der die Hauptarbeit der Konfiguration von YADRO übernimmt. Der Code wird wieder direkt ausgeführt. Nochmal, das Ergebnis der ANweisungen geht nicht verloren, nur de Code. Dazu gibt es einiges zu sagen: Variablen können beliebig oft redeklariert werden. Existiert die Variable, dann wird das fvar ignoriert und die Variable auch nicht 0 gesetzt. Man sollte Variablen nicht in Macros deklarieren die in Schleifen verwendet werden, da es Zeitverschwendung ist. Die Anweisung execmacro("internalMetric") führt das Macro "internalMetric" aus. Macros können Leerzeichen im Namen haben, der Parameter für execmacro muss aber genau gleich geschrieben werden. Es ist keine gute Idee, user-Macros mit execmacro aufzurufen. Man denke nur an den Änderungsaufwand, wenn ein YADRO.CFG an eine andere Sprache angepaßt wird. Am Besten packt man also Macros in interne Macros, sobald sie sowohl User-Macros als auch interne Macros sind. Die Anweisung display("Source", 1, "Dev0 * Dev0Scaling * SignX + OffsetX") ist eine der wichtigsten und muß genauer erklärt werden: Man kann beliebige Werte anzeigen indem man das Statement ändert. Will man z.B. 2 Achsen addieren, könnte die Anweisung so aussehen: "Dev0 * Dev0Scaling + Dev2 * Dev2Scaling". Das geht natürlich für primäre und sekundäre Achsen. Diese Bindung einer Datenquelle an eine Achse kann jederzeit geändert werden. Was bis jetzt vorgestellt wurde, ist für eine einfache Anzeige genug. Aber YADRO wäre nicht YADRO, wenn das alles wäre.
Hier noch ein interessantes Macro. Zunächst zum ersten "SM Metric". Benutzer-Macros werden in einer alphabetisch sortierten Pop-Up-Liste angezeigt. Es ist also angebracht zusammengehörige Macros so zu benennen, daß sie auch zusammen sortiert angezeigt werden. Man erreicht das mit Abkürzungen wie "SM". Zusätzlich wird, sobald der Benutzer eine Taste drückt, die Macroliste angezeigt und das erste Macro das mit der Taste übereinstimmt (Groß/Kleinschreibung egal) ausgewählt. Schreibt der Benutzer weiter, wird die Auswahl fortgesetzt (solange ein passendes Macro vorhanden ist). In diesem Beispiel wird also durch tippen von "s" + "m" das Macro "SM" angewählt. Drückt man dann Ret, wird das Macro ausgeführt. Das ist schon ganz gut für wenig benutzte Macros, aber es liegt auf der Hand für häufig verwendete Macros Funktionstasten zu verwenden. Man kann Macros an Funktionstasten mit :BindKey binden. Im ersten Macro wird also mit BindKey:F1 da Macro "SM Metric" an die Funktionstaste F1 gebunden. Das dritte Macro verwendet den neuen Befehl senddevice. Senddevice schickt einen beliebigen String an das Digitale Interface. Man muß wissen, welchen String man schickt, und dazu diesen Teil lesen. In dem Beispiel setzt "c0C" die Meßleiste #0 auf 0. Jedes senddevice wartet auf ein "OK" vom Digitalen Interface. Sieht man in der Doku nach, sieht man, daß die Antwort ca. 1 Sekunde dauert. Somit dauern diese drei Kommandos 3 Sekunden. Man sollte sich das aktuelle CFG-File ansehen um zu sehen wie ich das Problem umging. Tip:ShdwOffs.
Hier ein Beispiel mit Neuem zu lernen. ´Das SX-Macro addiert einen Wert zur Achsen-Verschiebung. Es führt Schritte aus, oder erhöht/erniedrigt die Verschiebung. Läßt man das Macr laufen, dann sieht man, daß SXoffs das erste Mal 0 ist, beim nächsten Aufruf hat es den Wert des vorherigen Aufrufes. Die Benutzereingaben mit der Anweisung input("Offset rel-X by value", "offset:", SXoffs); abgefragt. Input kann eine variable anzahl von Parametern haben. Die Anzahl ist aber stets ungerade. Die kürzest mögliche Form hat einen String als Parameter. Dieser erste Parameter ist die Titelzeile in einem PopUp-Fenster das die anderen Parameter (soweit vorhanden) und einen OK-"Knopf" anzeigt. Verlässt der Benutzer dieses EIngabefenster mit Return, dann liefert input eine 1 als Ergebnis, bricht er es mit Esc ab, dann eine 0. Wenn input mehr als ein Argument hat, folgt ein wiederholendes Muster von Strings und Variablen. Ein <string> <string> <variable> ist richtig, ebenso wie ein <string> <string> <variable> <string> <variable> Input ordnet die Argumente in Zeilen an. Links ein String, rechts der Inhalt der übergebenen Variablen. Die Eingabefelder für den Wert geben die EIngabe an den Interpreter weiter. Es ist also möglich ein Disp1 als Wert einzugeben. Oder "sin(30) + 111.033".
Obiges Macro ist mit dem bisherigen Wissen recht gut zu verstehen. Es macht einen Lochkreis mit einem vorgegebenen Mittelpunkt, mit einer vorgegebenen Anzahl Löchern, einem Durchmesser und einem Startwinkel. Das Macro wird mit F3 aufgerufen (:BindKey:F3). Man beachte was mit HCHoles passiert. Ist es 0, dann wird es mit 4 vorbelegt. Man beachte die ungerade Anzahl an Parametern in input. Verläßt der Benutzer das input mit OK (Ret), dann wird der folgende code ausgeführt. Falls nicht, wurde nur ein Teil der Vorbereitung ausgeführt, aber nichts am Status verstellt. Der Code nach dem input macht weitere Voreinstellungen. Z.B. den alten Status von abs/rel merken. getnext hat das gleiche Muster an Parametern wie input. Mit diesen Wissen lassen sich alle anderen Macros die man in den CFGs findet verstehen.
Noch ein letztes Beispiel, das sich ganz am Ende der CFGs findet. Weil es am Ende ist, wird es auch zuallerletzt ausgeführt. (NB: Interp:). Das ist die richtige Stelle für letzte Initialisierungen. Hier wird abgefragt, ob die Meßleisten initialisiert werden sollen. Damit wird also der Nullpunkt nicht verloren. Weitere Befehle:Es gibt (inzwischen) zwei weitere Befehle (ohne Code-Beispiel). Sie dienen der Messwertmittelung. Man wird bald feststellen, daß die Ablesungen, je nach Qualität der Meßleisten, keine stabilen Werte liefern. Sieht man noch mal im Teil 2 nach, erkennt man auch, daß die Meßleisten auch eine höhere Auflösung als 1/100 mm haben können. Werden diese Werte gemittelt, dann bekommt man eine stabilere Anzeige und evtl. sogar eine höhere Auflösung. Es sieht so aus, als könnte man mit den Leisten aus Teil 2 2/1000mm erreichen. display("Average", "GAT", 20, 0.01); ist einer der Mittlungsmethoden. "GAT" steht für Gliding Average with Threshhold (Gleitender Durchschnitt mit Schwellwert). GAT benutzt einen Puffer (hier: 20 Werte lang), in dem die jeweils letzte Ablesung den ältesten Wert ersetzt. Alle Werte werden aufsummiert und durch die Anzahl Werte im Puffer geteilt. Der Puffer sollte nicht zu groß werden 10
20 Elemente ist ein vernünftiger Wert. Je größer der Puffer wird, um so länger dauert es, bis er auf Änderungen reagiert. Um bei kleinen Bewegungen die Anzeige nicht zu träge zu machen, gibt es den Schwellwert. Weicht der aktuelle Lesewert vom Durchschnitt mehr als dem Schwellwert ab, wird der Puffer verworfen und eine neue Mittelung angeworfen. Man muß etwas mit den Werten experimentieren. Sie hängen von der Rechnergeschwindigkeit und der Messrate der Meßleisten ab. |