1. Einführung

Die Konfiguration geht von der Theorie zum Gerät über - dem HAL-Gerät. Für diejenigen, die nur ein wenig Erfahrung mit Computerprogrammierung haben, ist dieser Abschnitt das "Hello World" des HAL.

halrun kann verwendet werden, um ein funktionierendes System zu erstellen. Es ist ein Kommandozeilen- oder Textdateiwerkzeug für Konfiguration und Tuning.

2. Halcmd

halcmd ist ein Befehlszeilentool zum Manipulieren von HAL. Eine vollständigere Manpage existiert für halcmd und wird zusammen mit LinuxCNC installiert, aus dem Quellcode oder aus einem Paket. Wenn LinuxCNC als run-in-place kompiliert wurde, wird die Manpage nicht installiert, ist aber im LinuxCNC-Hauptverzeichnis mit dem folgenden Befehl zugänglich:

$ man -M docs/man halcmd

2.1. Notation

In dieser Einführung werden die Befehle für das Betriebssystem in der Regel ohne die Eingabeaufforderung der UNIX-Shell gezeigt, d.h. typischerweise mit einem Dollarzeichen ($) oder einer Raute/Doppelkreuz (#). Bei der direkten Kommunikation mit dem HAL über halcmd oder halrun werden die Eingabeaufforderungen in den Beispielen gezeigt. Das Terminal-Fenster befindet sich unter "Anwendungen/Zubehör" in der Ubuntu-Menüleiste.

Terminalbefehl Beispiel - Eingabeaufforderungen
me@computer:~linuxcnc$ halrun
(wird wie die folgende Zeile angezeigt)
halrun

(die halcmd: Eingabeaufforderung wird beim Ausführen von HAL angezeigt)
halcmd: loadrt Zähler
halcmd: pin anzeigen

2.2. Befehl-Vervollständigung durch Tabulator-Taste

Ihre Version von halcmd enthält möglicherweise die Tabulator-Vervollständigung. Anstatt Dateinamen zu vervollständigen, wie es eine Shell tut, werden Befehle mit HAL-Kennungen vervollständigt. Sie müssen genügend Buchstaben eingeben, um eine eindeutige Übereinstimmung zu erzielen. Versuchen Sie, nach dem Start eines HAL-Befehls die Tabulatortaste zu drücken:

Befehl-Vervollständigung durch Tabulator-Taste
halcmd: loa<TAB>
halcmd: load
halcmd: loadrt
halcmd: loadrt cou<TAB>
halcmd: loadrt counter

2.3. Die RTAPI-Umgebung

RTAPI steht für Real Time Application Programming Interface. Viele HAL-Komponenten arbeiten in Echtzeit, und alle HAL-Komponenten speichern Daten im gemeinsamen Speicher, damit Echtzeitkomponenten darauf zugreifen können. Das normale Linux unterstützt keine Echtzeitprogrammierung oder die Art von gemeinsamem Speicher, die HAL benötigt. Glücklicherweise gibt es Echtzeitbetriebssysteme (RTOS) mit den notwendigen Erweiterungen für Linux. Leider geht jedes RTOS die Dinge ein wenig anders an.

Um diese Unterschiede zu beseitigen, hat das LinuxCNC-Team die RTAPI entwickelt, die einen einheitlichen Weg für Programme bietet, um mit dem RTOS zu kommunizieren. Wenn Sie ein Programmierer sind, der an den Interna von LinuxCNC arbeiten will, sollten Sie vielleicht linuxcnc/src/rtapi/rtapi.h studieren, um die API zu verstehen. Aber wenn Sie eine normale Person sind, ist alles, was Sie über RTAPI wissen müssen, dass es (und das RTOS) in den Speicher Ihres Computers geladen werden muss, bevor Sie etwas mit HAL machen.

3. Ein einfaches Beispiel

3.1. Laden einer Komponente

Für dieses Tutorial gehen wir davon aus, dass Sie die Live-CD erfolgreich installiert haben und, falls Sie eine RIP footnote: [Run In Place, wenn die Quelldateien in ein Benutzerverzeichnis heruntergeladen wurden und direkt von dort aus kompiliert und ausgeführt werden] Installation verwenden, das Skript "rip-environment" aufrufen, um Ihre Shell vorzubereiten. In diesem Fall müssen Sie nur noch die erforderlichen RTOS- und RTAPI-Module in den Speicher laden. Führen Sie einfach den folgenden Befehl in einem Terminalfenster aus:

HAL laden
cd linuxcnc
halrun
halcmd:

Nachdem das Echtzeitbetriebssystem und die RTAPI geladen sind, können wir mit dem ersten Beispiel beginnen. Beachten Sie, dass die Eingabeaufforderung jetzt als "halcmd:" angezeigt wird. Das liegt daran, dass die nachfolgenden Befehle als HAL-Befehle und nicht als Shell-Befehle interpretiert werden.

Für das erste Beispiel werden wir eine HAL-Komponente namens siggen verwenden, die ein einfacher Signalgenerator ist. Eine vollständige Beschreibung der Komponente siggen finden Sie im Abschnitt SigGen dieses Handbuchs. Es handelt sich um eine Echtzeit-Komponente. Um die Komponente "siggen" zu laden, verwenden Sie den HAL-Befehl loadrt.

Laden von siggen
halcmd: loadrt siggen

3.2. Untersuchung der HAL

Nun, nach dem Laden des Moduls, ist es an der Zeit, halcmd vorzustellen, das Kommandozeilenwerkzeug, das zur Konfiguration der HAL verwendet wird. Dieses Tutorial wird nur eine Auswahl der Funktionen von halcmd vorstellen. Eine ausführlichere Beschreibung finden Sie unter man halcmd oder in der Referenz im Abschnitt HAL Befehle (engl. commands) dieses Dokuments. Die erste halcmd-Funktion ist der show-Befehl. Dieser Befehl zeigt Informationen über den aktuellen Zustand der HAL an. Um alle installierten Komponenten anzuzeigen:

Komponenten mit halrun/halcmd anzeigen
halcmd: show comp

    Loaded HAL Components:
    ID     Type  Name                                PID   State
    3      RT    siggen                                    ready
    2      User  halcmd2177                          2177  ready

Da halcmd selbst auch eine HAL-Komponente ist, wird sie immer in der Liste erscheinen. Die Zahl hinter "`halcmd" in der Komponentenliste ist die UNIX-Prozess-ID. Da es möglich ist, mehr als eine Kopie von halcmd gleichzeitig laufen zu lassen (z.B. in verschiedenen Terminalfenstern), wird die PID an das Ende des Namens angehängt, um ihn eindeutig zu machen. Die Liste zeigt auch die Komponente "siggen", die wir im vorherigen Schritt installiert haben. Das "RT" unter "Typ" zeigt an, dass "siggen" eine Echtzeitkomponente ist. Das "User" unter "Type" zeigt an, dass es sich um eine nicht-Echtzeit-Komponente handelt.

Als Nächstes wollen wir sehen, welche Pins siggen zur Verfügung stellt:

Pins anzeigen
halcmd: show pin

Component Pins:
Owner   Type   Dir        Value  Name
     3  float  IN             1  siggen.0.amplitude
     3  bit    OUT        FALSE  siggen.0.clock
     3  float  OUT            0  siggen.0.cosine
     3  float  IN             1  siggen.0.frequency
     3  float  IN             0  siggen.0.offset
     3  float  OUT            0  siggen.0.sawtooth
     3  float  OUT            0  siggen.0.sine
     3  float  OUT            0  siggen.0.square
     3  float  OUT            0  siggen.0.triangle

Dieser Befehl zeigt alle Pins im aktuellen HAL an. Ein komplexes System könnte Dutzende oder Hunderte von Pins haben. Aber im Moment gibt es nur neun Pins. Von diesen Pins sind acht Gleitkomma-Pins und einer ist ein Bit (boolesch). Sechs führen Daten aus der siggen-Komponente heraus, und drei werden verwendet, um Einstellungen in die Komponente zu übertragen. Da de in den Komponente enthaltene Code noch nicht ausgeführt wurde, haben einige der Pins den Wert Null.

Der nächste Schritt ist die Betrachtung der Parameter:

Parameter anzeigen
halcmd: show param

Parameters:
Owner   Type  Dir        Value   Name
     3  s32   RO             0   siggen.0.update.time
     3  s32   RW             0   siggen.0.update.tmax

Der Befehl "show param" zeigt alle Parameter im HAL an. Im Moment hat jeder Parameter den Standardwert, der ihm beim Laden der Komponente zugewiesen wurde. Beachten Sie die Spalte mit der Aufschrift Dir. Die mit -W gekennzeichneten Parameter sind beschreibbare Parameter, die niemals von der Komponente selbst geändert werden, sondern vom Benutzer geändert werden sollen, um die Komponente zu steuern. Wir werden später sehen, wie man das macht. Die mit R- gekennzeichneten Parameter sind schreibgeschützt. Sie können nur von der Komponente geändert werden. Parameter mit der Bezeichnung RW schließlich sind Schreib-Lese-Parameter. Das bedeutet, dass sie von der Komponente geändert werden, aber auch vom Benutzer geändert werden können. Hinweis: Die Parameter siggen.0.update.time und siggen.0.update.tmax sind für Debugging-Zwecke und werden in diesem Abschnitt nicht behandelt.

Die meisten Echtzeitkomponenten exportieren eine oder mehrere Funktionen, um den in ihnen enthaltenen Echtzeitcode tatsächlich auszuführen. Schauen wir uns an, welche Funktion(en) siggen exportiert hat:

Funktionen anzeigen mit halcmd
halcmd: show funct

Exported Functions:
Owner   CodeAddr  Arg       FP   Users  Name
00003   f801b000  fae820b8  YES      0  siggen.0.update

The siggen component exported a single function. It is not currently linked to any threads, so users is zero
[CodeAddr and Arg fields were used during development and should probably disappear.]
.

3.3. Echtzeitcode zum Laufen bringen

Um den in der Funktion siggen.0.update enthaltenen Code tatsächlich auszuführen, benötigen wir einen Echtzeit-Thread. Die Komponente namens threads wird zum Erstellen eines neuen Threads verwendet. Erstellen wir einen Thread namens "test-thread" mit einer Periode von 1 ms (1.000 µs oder 1.000.000 ns):

halcmd: loadrt threads name1=test-thread period1=1000000

Mal sehen, ob das funktioniert:

Threads anzeigen
halcmd: show thread

Realtime Threads:
     Period  FP     Name               (     Time, Max-Time )
     999855  YES    test-thread        (        0,        0 )

It did. The period is not exactly 1,000,000 ns because of hardware limitations, but we have a thread that runs at approximately the correct rate. The next step is to connect the function to the thread:

Funktion hinzufügen
halcmd: addf siggen.0.update test-thread

Bis jetzt haben wir halcmd nur benutzt, um die HAL zu betrachten. Dieses Mal haben wir jedoch den Befehl addf (add function) verwendet, um tatsächlich etwas in der HAL zu ändern. Wir haben halcmd angewiesen, die Funktion siggen.0.update zum Thread test-thread hinzuzufügen, und wenn wir uns die Thread-Liste noch einmal ansehen, sehen wir, dass dies gelungen ist:

halcmd: show thread

Realtime Threads:
     Period  FP     Name                (     Time, Max-Time )
     999855  YES    test-thread         (        0,        0 )
                  1 siggen.0.update

Bevor die Komponente siggen mit der Erzeugung von Signalen beginnt, ist noch ein weiterer Schritt erforderlich. Wenn die HAL zum ersten Mal gestartet wird, laufen die Threads noch nicht. Dies soll Ihnen ermöglichen, das System vollständig zu konfigurieren, bevor der Echtzeitcode startet. Sobald Sie mit der Konfiguration zufrieden sind, können Sie den Echtzeitcode wie folgt starten:

halcmd: start

Jetzt läuft der Signalgenerator. Schauen wir uns seine Ausgangspins an:

halcmd: show pin

Komponenten-Pins:
Owner   Type  Dir         Value  Name
     3  float IN              1  siggen.0.amplitude
     3  bit   OUT         FALSE  siggen.0.clock
     3  float OUT    -0.1640929  siggen.0.cosine
     3  float IN              1  siggen.0.frequency
     3  float IN              0  siggen.0.offset
     3  float OUT    -0.4475303  siggen.0.sawtooth
     3  float OUT     0.9864449  siggen.0.sine
     3  float OUT            -1  siggen.0.square
     3  float OUT    -0.1049393  siggen.0.triangle

Und schauen wir noch einmal hin:

halcmd: show pin

Komponenten Pins:
Owner   Type  Dir         Value  Name
     3  float IN              1  siggen.0.amplitude
     3  bit   OUT         FALSE  siggen.0.clock
     3  float OUT     0.0507619  siggen.0.cosine
     3  float IN              1  siggen.0.frequency
     3  float IN              0  siggen.0.offset
     3  float OUT     -0.516165  siggen.0.sawtooth
     3  float OUT     0.9987108  siggen.0.sine
     3  float OUT            -1  siggen.0.square
     3  float OUT    0.03232994  siggen.0.triangle

Wir haben zwei show pin-Befehle kurz hintereinander ausgeführt, und Sie können sehen, dass die Ausgänge nicht mehr Null sind. Die Ausgänge für Sinus, Kosinus, Sägezahn und Dreieck ändern sich ständig. Der quadratische Ausgang funktioniert auch, aber er wechselt einfach bei jedem Zyklus von +1,0 auf -1,0.

3.4. Ändern von Parametern

Die eigentliche Stärke von HAL ist, dass man Dinge ändern kann. Wir können zum Beispiel den Befehl setp verwenden, um den Wert eines Parameters einzustellen. Ändern wir die Amplitude des Signalgenerators von 1,0 auf 5,0:

Pin einstellen (engl. set)
halcmd: setp siggen.0.amplitude 5
Überprüfen Sie die Parameter und Pins erneut
halcmd: show param

Parameter:
Owner   Type  Dir         Value  Name
     3  s32   RO           1754  siggen.0.update.time
     3  s32   RW          16997  siggen.0.update.tmax

halcmd: show pin

Komponenten-Pins:
Owner   Type  Dir         Value  Name
     3  float IN              5  siggen.0.amplitude
     3  bit   OUT         FALSE  siggen.0.clock
     3  float OUT     0.8515425  siggen.0.cosine
     3  float IN              1  siggen.0.frequency
     3  float IN              0  siggen.0.offset
     3  float OUT      2.772382  siggen.0.sawtooth
     3  float OUT     -4.926954  siggen.0.sine
     3  float OUT             5  siggen.0.square
     3  float OUT      0.544764  siggen.0.triangle

Beachten Sie, dass sich der Wert des Parameters siggen.0.amplitude auf 5 geändert hat und dass die Stifte nun größere Werte haben.

3.5. Speichern der HAL-Konfiguration

Das meiste, was wir bisher mit halcmd gemacht haben, war einfach das Anzeigen von Dingen mit dem show-Befehl. Zwei der Befehle haben jedoch tatsächlich Dinge verändert. Wenn wir komplexere Systeme mit HAL entwerfen, werden wir viele Befehle verwenden, um die Dinge genau so zu konfigurieren, wie wir sie haben wollen. HAL hat ein Gedächtnis wie ein Elefant und behält diese Konfiguration bei, bis wir es abschalten. Aber was ist beim nächsten Mal? Wir wollen nicht jedes Mal, wenn wir das System benutzen wollen, eine Reihe von Befehlen manuell eingeben.

Speichern der Konfiguration des gesamten HAL mit einem einzigen Befehl.
halcmd: save

# Komponenten
loadrt threads name1=test-thread period1=1000000
loadrt siggen
# Pin-Aliase
# Signale
# Netze
# Parameterwerte
setp siggen.0.update.tmax 14687
# Echtzeit-Thread/Funktions-Verknüpfungen
addf siggen.0.update test-thread

Die Ausgabe des Befehls save ist eine Folge von HAL-Befehlen. Wenn Sie mit einer leeren HAL beginnen und alle diese Befehle ausführen, erhalten Sie die Konfiguration, die zum Zeitpunkt der Ausgabe des Befehls save bestand. Um diese Befehle zur späteren Verwendung zu speichern, leiten wir die Ausgabe einfach in eine Datei um:

Speichern der Konfiguration in einer Datei mit halcmd
halcmd: save all saved.hal

3.6. Halrun beenden

Wenn Sie mit Ihrer HAL-Sitzung fertig sind, geben Sie an der Eingabeaufforderung halcmd:`das Kommando `exit ein. Damit kehren Sie zur System-Eingabeaufforderung zurück und beenden die HAL-Sitzung. Schließen Sie nicht einfach das Terminalfenster, ohne die HAL-Sitzung zu beenden.

HAL beenden
halcmd: exit

3.7. Wiederherstellung der HAL-Konfiguration

Um die in der Datei "saved.hal" gespeicherte HAL-Konfiguration wiederherzustellen, müssen wir alle diese HAL-Befehle ausführen. Dazu verwenden wir "-f <Dateiname>'" das die Befehle aus einer Datei liest, und "-I" (Großbuchstabe i), das die halcmd-Eingabeaufforderung nach Ausführung der Befehle anzeigt:

Ausführen einer gespeicherten Datei
halrun -I -f saved.hal

Beachten Sie, dass das Kommando "start" in saved.hal nicht vorhanden ist. Sie müssen dies erneut erteilen (oder die Datei saved.hal bearbeiten, um dies dort hinzuzufügen).

3.8. HAL aus dem Speicher entfernen

Wenn eine HAL-Sitzung unerwartet beendet wird, müssen Sie möglicherweise HAL entladen, bevor eine neue Sitzung beginnen kann. Geben Sie dazu den folgenden Befehl in ein Terminalfenster ein.

Removing HAL
halrun -U

4. Stepgen Beispiel

Bis jetzt haben wir nur eine HAL-Komponente geladen. Die Idee hinter HAL ist jedoch, dass Sie eine Reihe von einfachen Komponenten laden und verbinden können, um ein komplexes System zu bilden. Das nächste Beispiel wird zwei Komponenten verwenden.

Bevor wir mit der Erstellung dieses neuen Beispiels beginnen können, wollen wir einen Neuanfang machen. Wenn Sie gerade eines der vorherigen Beispiele beendet haben, müssen wir alle Komponenten entfernen und die RTAPI- und HAL-Bibliotheken neu laden.

halcmd: exit

4.1. Installieren der Komponenten

Jetzt laden wir die Komponente Schrittimpulsgenerator. Eine detaillierte Beschreibung dieser Komponente finden Sie im Abschnitt stepgen des Integrator-Handbuchs. In diesem Beispiel verwenden wir den Steuertyp velocity von StepGen. Für den Moment können wir die Details überspringen und einfach die folgenden Befehle ausführen.

In diesem Beispiel wird der Kontrolltyp velocity aus der Komponente stepgen verwendet.

halrun
halcmd: loadrt stepgen step_type=0,0 ctrl_type=v,v
halcmd: loadrt siggen
halcmd: loadrt threads name1=fast period1=50000 name2=slow period2=1000000

The first command loads two step generators, both configured to generate stepping type 0. The second command loads our old friend siggen, and the third one creates two threads, a fast one with a period of 50 microseconds (µs) and a slow one with a period of 1 millisecond (ms).

Anmerkung
The fp1= parameter is deprecated and ignored. All threads now unconditionally support floating point.

Wie zuvor können wir halcmd show verwenden, um einen Blick auf die HAL zu werfen. Diesmal haben wir viel mehr Pins und Parameter als zuvor:

halcmd: show pin

Component Pins:
Owner   Type  Dir         Value  Name
     4  float IN              1  siggen.0.amplitude
     4  bit   OUT         FALSE  siggen.0.clock
     4  float OUT             0  siggen.0.cosine
     4  float IN              1  siggen.0.frequency
     4  float IN              0  siggen.0.offset
     4  float OUT             0  siggen.0.sawtooth
     4  float OUT             0  siggen.0.sine
     4  float OUT             0  siggen.0.square
     4  float OUT             0  siggen.0.triangle
     3  s32   OUT             0  stepgen.0.counts
     3  bit   OUT         FALSE  stepgen.0.dir
     3  bit   IN          FALSE  stepgen.0.enable
     3  float OUT             0  stepgen.0.position-fb
     3  bit   OUT         FALSE  stepgen.0.step
     3  float IN              0  stepgen.0.velocity-cmd
     3  s32   OUT             0  stepgen.1.counts
     3  bit   OUT         FALSE  stepgen.1.dir
     3  bit   IN          FALSE  stepgen.1.enable
     3  float OUT             0  stepgen.1.position-fb
     3  bit   OUT         FALSE  stepgen.1.step
     3  float IN              0  stepgen.1.velocity-cmd

halcmd: show param

Parameters:
Owner   Type  Dir         Value  Name
     4  s32   RO              0  siggen.0.update.time
     4  s32   RW              0  siggen.0.update.tmax
     3  u32   RW     0x00000001  stepgen.0.dirhold
     3  u32   RW     0x00000001  stepgen.0.dirsetup
     3  float RO              0  stepgen.0.frequency
     3  float RW              0  stepgen.0.maxaccel
     3  float RW              0  stepgen.0.maxvel
     3  float RW              1  stepgen.0.position-scale
     3  s32   RO              0  stepgen.0.rawcounts
     3  u32   RW     0x00000001  stepgen.0.steplen
     3  u32   RW     0x00000001  stepgen.0.stepspace
     3  u32   RW     0x00000001  stepgen.1.dirhold
     3  u32   RW     0x00000001  stepgen.1.dirsetup
     3  float RO              0  stepgen.1.frequency
     3  float RW              0  stepgen.1.maxaccel
     3  float RW              0  stepgen.1.maxvel
     3  float RW              1  stepgen.1.position-scale
     3  s32   RO              0  stepgen.1.rawcounts
     3  u32   RW     0x00000001  stepgen.1.steplen
     3  u32   RW     0x00000001  stepgen.1.stepspace
     3  s32   RO              0  stepgen.capture-position.time
     3  s32   RW              0  stepgen.capture-position.tmax
     3  s32   RO              0  stepgen.make-pulses.time
     3  s32   RW              0  stepgen.make-pulses.tmax
     3  s32   RO              0  stepgen.update-freq.time
     3  s32   RW              0  stepgen.update-freq.tmax

4.2. Verbinden von Pins mit Signalen

Wir haben also zwei Schrittimpulsgeneratoren und einen Signalgenerator. Nun ist es an der Zeit, einige HAL-Signale zu erzeugen, um die beiden Komponenten zu verbinden. Wir tun so, als ob die beiden Schrittimpulsgeneratoren die X- und Y-Achse einer Maschine antreiben würden. Wir wollen den Tisch im Kreis bewegen. Dazu senden wir ein Kosinussignal an die X-Achse und ein Sinussignal an die Y-Achse. Das siggen-Modul erzeugt den Sinus und den Cosinus, aber wir brauchen "Drähte", um die Module miteinander zu verbinden. Im HAL werden diese "Drähte" Signale genannt. Wir müssen zwei davon erstellen. Wir können sie nennen, wie wir wollen, in diesem Beispiel werden sie X-vel und Y-vel heißen. Das Signal "X-vel" soll vom Cosinus-Ausgang des Signalgenerators zum Geschwindigkeitseingang des ersten Schrittimpulsgenerators führen. Der erste Schritt besteht darin, das Signal mit dem Ausgang des Signalgenerators zu verbinden. Um ein Signal mit einem Pin zu verbinden, verwenden wir den Netzbefehl.

net-Befehl
halcmd: net X-vel <= siggen.0.cosine

Um die Wirkung des Befehls net zu sehen, zeigen wir die Signale erneut.

halcmd: show sig

Signals:
Type          Value  Name     (linked to)
float             0  X-vel <== siggen.0.cosine

Wenn ein Signal mit einem oder mehreren Pins verbunden ist, listet der Befehl show die Pins unmittelbar nach dem Signalnamen auf. Der "Pfeil" zeigt die Richtung des Datenflusses an - in diesem Fall fließen die Daten vom Pin siggen.0.cosine zum Signal X-vel. Schließen wir nun das Signal X-vel an den Geschwindigkeitseingang eines Schrittimpulsgenerators an.

halcmd: net X-vel => stepgen.0.velocity-cmd

Wir können auch das Signal der Y-Achse Y-vel anschließen. Es soll vom Sinusausgang des Signalgenerators zum Eingang des zweiten Schrittimpulsgenerators laufen. Der folgende Befehl erreicht in einer Zeile, was zwei net-Befehle für X-vel erreicht haben.

halcmd: net Y-vel siggen.0.sine => stepgen.1.velocity-cmd

Werfen wir nun einen letzten Blick auf die Signale und die mit ihnen verbundenen Pins.

halcmd: show sig

Signals:
Type          Value  Name     (linked to)
float             0  X-vel <== siggen.0.cosine
                           ==> stepgen.0.velocity-cmd
float             0  Y-vel <== siggen.0.sine
                           ==> stepgen.1.velocity-cmd

Der Befehl show sig macht deutlich, wie genau die Daten durch den HAL fließen. Zum Beispiel kommt das X-vel-Signal von Pin siggen.0.cosine und geht zu Pin stepgen.0.velocity-cmd.

4.3. Einrichten der Echtzeitausführung - Threads und Funktionen

Wenn man sich vorstellt, dass Daten durch "Drähte" fließen, sind Pins und Signale recht einfach zu verstehen. Threads und Funktionen sind da schon etwas schwieriger. Funktionen enthalten die Computeranweisungen, welche die eigentliche Arbeit erledigen. Threads sind die Methode, mit der diese Anweisungen ausgeführt werden, wenn sie benötigt werden. Schauen wir uns zunächst die Funktionen an, die uns zur Verfügung stehen.

halcmd: show funct

Exported Functions:
Owner   CodeAddr  Arg       FP   Users  Name
 00004  f9992000  fc731278  YES      0   siggen.0.update
 00003  f998b20f  fc7310b8  YES      0   stepgen.capture-position
 00003  f998b000  fc7310b8  NO       0   stepgen.make-pulses
 00003  f998b307  fc7310b8  YES      0   stepgen.update-freq

Im Allgemeinen müssen Sie in der Dokumentation der einzelnen Komponenten nachschlagen, um zu erfahren, was ihre Funktionen bewirken. In diesem Fall wird die Funktion siggen.0.update verwendet, um die Ausgänge des Signalgenerators zu aktualisieren. Jedes Mal, wenn sie ausgeführt wird, berechnet sie die Werte der Sinus-, Kosinus-, Dreieck- und Quadratausgänge. Um glatte Signale zu erzeugen, muss sie in bestimmten Intervallen ausgeführt werden.

Die anderen drei Funktionen beziehen sich auf die Schrittimpulsgeneratoren.

Die erste, stepgen.capture_position, wird für die Positionsrückmeldung verwendet. Sie erfasst den Wert eines internen Zählers, der die Schrittimpulse zählt, während sie erzeugt werden. Unter der Annahme, dass keine Schritte ausgelassen werden, zeigt dieser Zähler die Position des Motors an.

The main function for the step pulse generator is stepgen.make_pulses. Every time make_pulses runs it decides if it is time to take a step, and if so sets the outputs accordingly. For smooth step pulses, it should run as frequently as possible. Because it needs to run so fast, make_pulses is highly optimized and performs only a few calculations.

Die letzte Funktion, stepgen.update-freq, ist für die Skalierung und einige andere Berechnungen zuständig, die nur durchgeführt werden müssen, wenn sich der Frequenzbefehl ändert.

Für unser Beispiel bedeutet dies, dass wir siggen.0.update mit einer moderaten Rate ausführen wollen, um die Sinus- und Kosinuswerte zu berechnen. Unmittelbar nachdem wir siggen.0.update ausgeführt haben, wollen wir stepgen.update_freq ausführen, um die neuen Werte in den Schrittimpulsgenerator zu laden. Schließlich müssen wir stepgen.make_pulses so schnell wie möglich ausführen, um gleichmäßige Impulse zu erhalten. Da wir keine Positionsrückmeldung verwenden, brauchen wir stepgen.capture_position überhaupt nicht auszuführen.

Wir führen Funktionen aus, indem wir sie zu Threads hinzufügen. Jeder Thread läuft mit einer bestimmten Geschwindigkeit. Schauen wir uns an, welche Threads wir zur Verfügung haben.

halcmd: show thread

Realtime Threads:
     Period  FP     Name               (     Time, Max-Time )
     996980  YES                  slow (        0,        0 )
      49849  YES                  fast (        0,        0 )

The two threads were created when we loaded threads. The first one, slow, runs every millisecond. We will use it for siggen.0.update and stepgen.update_freq. The second thread is fast, which runs every 50 microseconds (µs). We will use it for stepgen.make_pulses. To connect the functions to the proper thread, we use the addf command. We specify the function first, followed by the thread.

halcmd: addf siggen.0.update slow
halcmd: addf stepgen.update-freq slow
halcmd: addf stepgen.make-pulses fast

Nachdem wir diese Befehle gegeben haben, können wir den Befehl show thread erneut ausführen, um zu sehen, was passiert ist.

halcmd: show thread

Realtime Threads:
     Period  FP     Name               (     Time, Max-Time )
     996980  YES                  slow (        0,        0 )
                  1 siggen.0.update
                  2 stepgen.update-freq
      49849  NO                   fast (        0,        0 )
                  1 stepgen.make-pulses

Nun folgen auf jeden Thread die Namen der Funktionen in der Reihenfolge, in der sie ausgeführt werden sollen.

4.4. Parameter einstellen

Wir sind fast bereit, unser HAL-System zu starten. Allerdings müssen wir noch ein paar Parameter anpassen. Standardmäßig erzeugt die siggen-Komponente Signale, die von +1 bis -1 schwanken. Für unser Beispiel ist das in Ordnung, denn wir wollen, dass die Tischgeschwindigkeit zwischen +1 und -1 Zoll pro Sekunde schwankt. Die Skalierung des Schrittimpulsgenerators ist jedoch nicht ganz richtig. Standardmäßig erzeugt er eine Ausgangsfrequenz von 1 Schritt pro Sekunde bei einem Eingang von 1,0. Es ist unwahrscheinlich, dass ein Schritt pro Sekunde eine Tischbewegung von einem Zoll pro Sekunde ergibt. Nehmen wir stattdessen an, dass wir eine Leitspindel mit 5 Umdrehungen pro Zoll haben, die an einen Schrittmotor mit 200 Schritten pro Umdrehung und 10-fachem Mikroschritt angeschlossen ist. Eine Umdrehung der Spindel erfordert also 2000 Schritte und 5 Umdrehungen, um einen Zoll zu bewegen. Das bedeutet, dass die Gesamtskalierung 10000 Schritte pro Zoll beträgt. Wir müssen die Geschwindigkeitseingabe für den Schrittimpulsgenerator mit 10000 multiplizieren, um die richtige Ausgabe zu erhalten. Genau dafür ist der Parameter stepgen.n.velocity-scale gedacht. In diesem Fall haben sowohl die X- als auch die Y-Achse die gleiche Skalierung, also setzen wir die Skalierungsparameter für beide auf 10000.

halcmd: setp stepgen.0.position-scale 10000
halcmd: setp stepgen.1.position-scale 10000
halcmd: setp stepgen.0.enable 1
halcmd: setp stepgen.1.enable 1

Diese Geschwindigkeitssskalierung bedeutet, dass der Schrittgenerator 10000 Impulse pro Sekunde (10 kHz) erzeugt, wenn der Stift stepgen.0.velocity-cmd 1.0 beträgt. Bei der oben beschriebenen Motor- und Vortriebsschraube führt dies dazu, dass sich die Achse mit genau 1,0 Zoll pro Sekunde bewegt. Dies zeigt ein wichtiges, grundlegendes HAL-Konzept - Dinge wie Skalierung werden auf möglichst niedrigem Niveau durchgeführt, in diesem Fall im Schrittimpulsgenerator. Das interne Signal X-vel ist die Geschwindigkeit der Tabelle in Zoll pro Sekunde, und andere Komponenten wie siggen wissen überhaupt nicht (oder kümmern) über die Skalierung. Wenn wir die Leadcrew oder den Motor ändern, würden wir nur den Skalierungsparameter des Schrittimpulsgenerators ändern.

4.5. Ausführen!

Wir haben nun alles konfiguriert und können es starten. Genau wie im ersten Beispiel verwenden wir den Befehl start.

halcmd: start

Obwohl scheinbar nichts passiert, gibt der Schrittimpulsgenerator im Computer jede Sekunde Schrittimpulse aus, die von 10 kHz vorwärts bis 10 kHz rückwärts und wieder zurück reichen. Später in diesem Lernprogramm werden wir sehen, wie man diese internen Signale ausgibt, um Motoren in der realen Welt zu betreiben, aber zuerst wollen wir uns die Signale ansehen und sehen, was passiert.

5. Halmeter

Sie können sehr komplexe HAL-Systeme erstellen, ohne jemals eine grafische Oberfläche zu verwenden. Es hat jedoch etwas Befriedigendes, das Ergebnis seiner Arbeit zu sehen. Das erste und einfachste GUI-Werkzeug für HAL ist Halmeter. Es ist ein sehr einfaches Programm, das ein HAL-Äquivalent eines handlichen Multimeters darstellt.

Es ermöglicht die Beobachtung von Pins, Signalen oder Parametern, indem es den aktuellen Wert dieser Einheiten anzeigt. Es ist eine sehr einfach zu bedienende Anwendung für grafische Umgebungen. In einer Konsole geben Sie ein:

halmeter

Es erscheinen zwei Fenster. Das Auswahlfenster ist das größte und enthält drei Registerkarten:

  • In der einen werden alle derzeit in HAL definierten Pins aufgelistet,

  • eine Liste aller Signale,

  • eine listet alle Parameter auf,

Klicken Sie auf eine Registerkarte und dann auf eines der Elemente, um es auszuwählen. In dem kleinen Fenster werden der Name und der Wert des ausgewählten Elements angezeigt. Die Anzeige wird etwa 10 Mal pro Sekunde aktualisiert. Um Platz auf dem Bildschirm zu schaffen, kann das Auswahlfenster mit der Schaltfläche Close geschlossen werden. Im kleinen Fenster, das beim Programmstart unter dem Auswahlfenster verborgen ist, öffnet die Schaltfläche Auswählen das Auswahlfenster erneut, und die Schaltfläche Beenden beendet das Programm und schließt beide Fenster.

Es ist möglich, mehrere Halmeter gleichzeitig laufen zu lassen, was die gleichzeitige Visualisierung mehrerer Elemente ermöglicht. Um ein Halmeter zu öffnen und die Konsole freizugeben, indem es im Hintergrund ausgeführt wird, führen Sie den folgenden Befehl aus:

halmeter &

Es ist möglich, halmeter zu starten und sofort ein Element anzeigen zu lassen. Fügen Sie dazu pin|sig|par[am] name Argumente in die Befehlszeile ein. Es wird das Signal, den Pin oder den Parameter name anzeigen, sobald es startet. Wenn das angegebene Element nicht vorhanden ist, wird es normal gestartet.

Wenn ein Element für die Anzeige angegeben wird, kann man -s vor pin|sig|param hinzufügen, um Halmeter anzuweisen, ein noch kleineres Fenster zu verwenden. Der Name des Elements wird dann in der Titelleiste statt unter dem Wert angezeigt, und es gibt keine Schaltfläche. Dies ist nützlich, wenn viele Halmeter auf kleinem Raum angezeigt werden sollen.

Wir werden erneut die Komponente siggen verwenden, um halmeter zu überprüfen. Wenn Sie das vorherige Beispiel gerade beendet haben, können Sie siggen mit der gespeicherten Datei laden. Wenn nicht, können wir es genauso laden wie zuvor:

halrun
halcmd: loadrt siggen
halcmd: loadrt threads name1=test-thread period1=1000000
halcmd: addf siggen.0.update test-thread
halcmd: start
halcmd: setp siggen.0.amplitude 5

Zu diesem Zeitpunkt ist die Komponente siggen geladen und läuft. Es ist an der Zeit, halmeter zu starten.

Halmeter starten
halcmd: loadusr halmeter

Das erste Fenster, das Sie sehen, ist das Fenster "Zu untersuchendes Element auswählen" (engl. select Item to probe).

Halmeter Auswahlfenster
Abbildung 1. Halmeter Auswahlfenster

Dieser Dialog hat drei Registerkarten. Auf der ersten Registerkarte werden alle HAL-Pins des Systems angezeigt. Auf der zweiten Registerkarte werden alle Signale angezeigt, und auf der dritten alle Parameter. Wir möchten uns zuerst den Pin siggen.0.cosine ansehen, also klicken Sie darauf und dann auf die Schaltfläche "Schließen" (engl. close). Das Dialogfeld für die Sondenauswahl wird geschlossen, und das Messgerät sieht ungefähr so aus wie in der folgenden Abbildung.

Halmeter-Fenster
Abbildung 2. Halmeter-Fenster

Um zu ändern, was das Messgerät anzeigt, drücken Sie auf die Schaltfläche "Auswählen", wodurch das Fenster "Zu messendes Element auswählen" wieder angezeigt wird.

Sie sollten sehen, wie sich der Wert ändert, wenn siggen seine Kosinuswelle erzeugt. Das Halmeter aktualisiert seine Anzeige etwa 5 Mal pro Sekunde.

Zum Beenden von Halmeter klicken Sie einfach auf die Schaltfläche Beenden.

Wenn Sie mehr als einen Pin, ein Signal oder einen Parameter auf einmal betrachten wollen, können Sie einfach mehrere Halmeter starten. Das Halmeter-Fenster wurde absichtlich sehr klein gehalten, damit Sie viele davon gleichzeitig auf dem Bildschirm haben können.

6. Halshow

Das Skript halshow kann Ihnen helfen, sich in einer laufenden HAL zurechtzufinden. Es zeigt ausgewählte HAL-Werte an und aktualisiert sie laufend.

Es handelt sich um ein sehr spezialisiertes System, das mit einem funktionierenden HAL verbunden sein muss. Es kann nicht eigenständig laufen, weil es sich auf die Fähigkeit von HAL verlässt, in sich hineinzuhören (engl. introspect) und berichten, was es von sich selbst durch die halcmd Interface-Bibliothek weiß. Wenn sich die Konfiguration von LinuxCNC ändert, wird auch die Ausgabe von halshow anders sein.

Wie wir gleich sehen werden, ist diese Fähigkeit von HAL, sich selbst zu dokumentieren, ein Schlüssel für den Aufbau eines effektiven CNC-Systems.

6.1. Halshow starten

Halshow Ist verfügbar

  • im AXIS-Menü unter Maschine/Zeige HAL-Konfiguration,

  • im TkLinuxCNC-Menü unter Scripts/HAL Show,

  • in GMOCCAPY auf der Seite mit Einstellungen.

halshow kann auch von einer Terminal-Befehlszeile aus gestartet werden und Formate für Integer- und Float-Elemente (Pins oder Signale) angeben sowie eine zu verwendende gespeicherte Watchlist-Datei identifizieren:

$ halshow --help
Usage:
  halshow [Options] [watchfile]
  Options:
           --help    (this help)
           --fformat format_string_for_float
           --iformat format_string_for_int
           --noprefs don't use preference file to save settings

Hinweise:
       Erstellen Sie einen watchfile in halshow mit: 'File/Save Watch List'.
       LinuxCNC muss für die Standalone-Nutzung ausgeführt werden.

Beispiel für die Begrenzung der Anzahl der Dezimalpunkte für Fließkommazahlen und die Verwendung einer Datei namens my.halshow im aktuellen Verzeichnis:

$ halshow --fformat "%.5f" ./my.halshow

Weitere Informationen über das Format finden Sie unter der Tcl-Format-Manpage.

Halshow-Layout
Abbildung 3. Halshow-Layout

Auf der linken Seite des Bildschirms, wie in der obigen Abbildung gezeigt, befindet sich eine Baumansicht, die dem Dateibrowser ähnelt, den Sie vielleicht kennen. Auf der rechten Seite befindet sich ein Notizbuch mit Registerkarten für Anzeigen, Beobachten und Einstellungen.

6.2. HAL Baum-Darstellung (engl. Tree Area)

Filter-Baum

Standardmäßig filtert dieser Eintrag den Baum nach Pin-Namen oder Baum-Knoten durch einen regulären Ausdruck. Zum Beispiel würde die Eingabe von "lim-sw" den Baum nach dem folgenden filtern:

Filterbaum für Pin-Namen mit der Teilzeichenkette "lim-sw".
joint.0.neg-lim-sw-in
joint.0.pos-lim-sw-in
joint.1.neg-lim-sw-in
joint.1.pos-lim-sw-in
joint.2.neg-lim-sw-in
joint.3.pos-lim-sw-in

Wenn Sie alle "joint.0"-Beziehungen anzeigen möchten, müssen Sie auf das Einstellungssymbol klicken und "Full path" (engl. für vollständiger Pfad) auswählen. Achten Sie darauf, die Sonderzeichen für reguläre Ausdrücke zu escapen, d.h. Sie müssen "joint\.1\." eingeben, um explizit den Punkt abzufragen und nicht auch joint 10 zu finden.

Baum

Der Baum zeigt alle wichtigen Teile eines HAL. Vor jedem Teil befindet sich ein kleines Plus- (+) oder Minuszeichen (-) in einem Kästchen, mit dem Sie den entsprechenden Teil des Baums auf- oder zuklappen können.

Sie können die Baumansicht auch über das Menü Baumansicht (engl. tree view) am oberen linken Rand der Anzeige erweitern oder reduzieren.

Unter der Baumansicht finden Sie: Alle aufklappen (engl. expand all), Alle zuklappen (engl. collapse all); Pins aufklappen (engl. expand pins), Parameter aufklappen (engl. expand parameters), Signale aufklappen (engl. expand signals); und Baumansicht neu laden (engl. reload tree view). Baumansicht neu laden ist nützlich, wenn zur Laufzeit neue Komponenten geladen werden und angezeigt werden sollen.

6.3. HAL Show Area

Halshow: Show Tab (engl. für Registerkarte anzeigen)
Abbildung 4. Halshow: Show Tab (engl. für Registerkarte anzeigen)

Wenn Sie auf den Namen des Knotens klicken, z.B. "Komponenten" (engl. components) im Baum, wird Ihnen (unter der Registerkarte "Show") alles angezeigt, was HAL über den Inhalt dieses Knotens weiß. Abbildung Halshow Show Tab zeigt eine Liste, die genau so aussieht, wie wenn Sie auf den Namen "Components" klicken. Die Informationsanzeige ist genau wie bei den traditionellen textbasierten HAL-Analysetools. Der Vorteil hier ist, dass wir per Mausklick Zugriff haben, und zwar so umfassend oder so gezielt, wie Sie es brauchen.

Wenn wir uns die Baumdarstellung genauer ansehen, sehen wir, dass die sechs Hauptteile eines HAL alle um mindestens eine Ebene erweitert werden können. Wenn diese Ebenen erweitert werden, können Sie die Antwort genauer betrachten, wenn Sie auf den ganz rechten Baumknoten klicken. Sie werden feststellen, dass es einige HAL-Pins und Parameter gibt, die mehr als eine Antwort anzeigen. Dies liegt an der Art der Suchroutinen in halcmd selbst. Wenn Sie einen Pin suchen, erhalten Sie möglicherweise zwei Antworten, wie hier:

Komponenten Pins:
Owner  Type  Dir  Value  Name
06     bit    -W   TRUE  parport.0.pin-10-in
06     bit    -W  FALSE  parport.0.pin-10-in-not

Der Name des zweiten Pins enthält den vollständigen Namen des ersten.

Neu in 2.9

Ausgewählter Text auf der Registerkarte Anzeigen kann mit der rechten Maustaste oder STRG-C kopiert werden.
Im Bereich Anzeigen können Sie Stecknadeln aus ausgewähltem Text hinzufügen, indem Sie das Kontextmenü verwenden. Alle gültigen Pins, die in der Auswahl enthalten sind, werden der Registerkarte "Beobachten" (engl. watch) hinzugefügt.

6.4. Watch Area

Wenn Sie auf die Registerkarte "Beobachten" (engl. watch) klicken, wird eine leere Leinwand (engl. canvas) angezeigt. Sie können Signale und Pins zu diesem Canvas hinzufügen und ihre Werte beobachten. Sie können Signale oder Pins hinzufügen, wenn die Registerkarte "Überwachen" angezeigt wird, indem Sie in der Strukturansicht auf den Namen des Signals klicken.

Neu in 2.9

Sie können auch alle Unterpunkte dieses Knotens hinzufügen, indem Sie diese im Rechtsklickmenü auswählen (siehe Abbildung Halshow Watch Tab).

Die folgende Abbildung zeigt diese Leinwand (engl. canvas) mit mehreren Pins.

Halshow Watch Tab
Abbildung 5. Halshow: Watch-Tab

Watch zeigt bitartige (binäre) Werte mit farbigen Kreisen an, die LEDs darstellen. Sie werden dunkelrot angezeigt, wenn ein Bitsignal oder ein Pin falsch ist, und hellgelb, wenn das Signal wahr ist. Wenn Sie einen Pin oder ein Signal auswählen, das nicht vom Bittyp (binär) ist, zeigt watch es als numerischen Wert an. Pins werden schwarz, Signale blau und Parameter braun dargestellt.

Watch ermöglicht es Ihnen, schnell Schalter zu testen oder die Auswirkungen von Änderungen zu sehen, die Sie an LinuxCNC vornehmen, während Sie die grafische Benutzeroberfläche verwenden. Die Bildwiederholfrequenz von watch ist etwas zu langsam, um Stepperimpulse zu sehen, aber Sie können sie für diese verwenden, wenn Sie eine Achse sehr langsam oder in sehr kleinen Entfernungsschritten bewegen.

Neu in 2.9

Die Pins und Signale, die beschreibbar sind, haben auf der rechten Seite Schaltflächen zur Manipulation. Pins, die mit einem Signal verknüpft sind, haben deaktivierte Schaltflächen. Um diese Werte zu setzen, muss der entsprechende Pin vom Signal entkoppelt werden. Dies kann durch Rechtsklick auf den Signalnamen und Auswahl von "Unlink pin" geschehen, siehe Watch Tach Context Menu.

Die Beobachtungsliste wird beim Beenden automatisch gespeichert. Wenn du nicht möchtest, dass Halshow deine Beobachtungsliste speichert, kannst du dies in den Einstellungen (engl. settings) deaktivieren.

Kontextmenü

Neu in 2.9

Das Kontextmenü ermöglicht zudem:

  • Kopieren des Pinnamens in die Zwischenablage

  • Einen Wert einstellen

  • Einen Pin trennen (sofern mit einem Signal verbunden)

  • Apin in der Strukturansicht anzeigen (hebt den Pin hervor, scrollt nicht zur Position)

  • Entfernen eines Pins aus der Liste

Halshow: Kontextmenü der Registerkarte 'Watch'
Abbildung 6. Halshow: Kontextmenü der Registerkarte Watch

6.5. Befehls-Eingabe

Im unteren Teil befindet sich ein Eingabefeld zum Testen von HAL-Befehlen. Die Befehle, die Sie hier eingeben und die Auswirkungen, die sie auf die laufende HAL haben, werden nicht gespeichert. Sie bleiben erhalten, solange LinuxCNC läuft, werden aber gelöscht, sobald LinuxCNC nicht mehr läuft.

Neu in 2.9

Die Befehlseingabe hat einee BASH-ähnliche Historie (während der Sitzung), so dass Sie eingefügte Befehle mit der Pfeiltaste nach oben wiederherstellen können.

Das Eingabefeld "HAL Command:" akzeptiert jeden der für halcmd aufgeführten Befehle. Dazu gehören:

  • loadrt, unloadrt (Laden/Entladen von Echtzeitmodulen)

  • loadusr", "unloadusr" (Laden/Entladen von Nicht-Echtzeit-Komponenten)

  • addf, delf (Hinzufügen/Löschen einer Funktion zu/aus einem Echtzeit-Thread)

  • net (eine Verbindung zwischen zwei oder mehr Elementen herstellen)

  • setp (Parameter (oder Pin) auf einen Wert setzen)

Dieser kleine Editor gibt jedes Mal einen Befehl ein, wenn Sie Enter drücken oder die Schaltfläche Ausführen betätigen. Eine Fehlermeldung von halcmd wird angezeigt, wenn diese Befehle nicht richtig gebildet sind. Wenn Sie nicht sicher sind, wie Sie einen korrekten Befehl eingeben, müssen Sie die Dokumentation zu halcmd und den spezifischen Modulen, mit denen Sie arbeiten, erneut lesen.

6.6. Einstellungen

Neu in 2.9

Die Geometrie (Breite, Höhe und X/Y-Position) des Fensters und die Einstellungen werden beim Beenden in einer Datei im Konfigurationsverzeichnis gespeichert. Wenn dieser Pfad nicht ermittelt werden kann, werden sie im Home-Verzeichnis gespeichert. Der Pfad wird auf der Einstellungsseite angezeigt. Sie können auf die Verwendung der Einstellungsdatei verzichten, indem Sie halshow mit dem Kommandozeilenargument --no-prefs aufrufen.
Die weiteren Einstellungen sollten selbsterklärend sein.

Halshow Einstellungen
Abbildung 7. Halshow Einstellungen

6.7. Beispiel/Tutorial

Lassen Sie uns diesen Editor verwenden, um ein Differenzierungs-Modul (engl. differential module) zu einem HAL hinzuzufügen und es mit der Achsenposition zu verbinden, damit wir die Änderungsrate der Position, d.h. die Beschleunigung, sehen können. Zunächst müssen wir eine HAL-Komponente mit dem Namen ddt laden, sie zum Servo-Thread hinzufügen und sie dann mit dem Positionsstift eines Gelenks verbinden. Danach können wir den Ausgang des Differenzierers in Halscope finden. Also los geht’s.

loadrt ddt

Schauen Sie sich den Komponenten-Knoten an, und Sie sollten dort irgendwo ddt finden.

Geladene HAL Komponenten:
ID Type        Name
10 User halcmd29800
09 User halcmd29374
08   RT         ddt
06   RT hal_parport
05   RT    scope_rt
04   RT     stepgen
03   RT      motmod
02 User   iocontrol

Und tatsächlich, da ist sie. Beachten Sie, dass seine ID 08 ist. Als Nächstes müssen wir herausfinden, welche Funktionen damit verfügbar sind, also schauen wir uns die Funktionen an:

Exportierte Funktionen:
Owner  CodeAddr      Arg  FP Users Name
  08   E0B97630 E0DC7674 YES     0 ddt.0
  03   E0DEF83C 00000000 YES     1 motion-command-handler
  03   E0DF0BF3 00000000 YES     1 motion-controller
  06   E0B541FE E0DC75B8  NO     1 parport.0.read
  06   E0B54270 E0DC75B8  NO     1 parport.0.write
  06   E0B54309 E0DC75B8  NO     0 parport.read-all
  06   E0B5433A E0DC75B8  NO     0 parport.write-all
  05   E0AD712D 00000000  NO     0 scope.sample
  04   E0B618C1 E0DC7448 YES     1 stepgen.capture-position
  04   E0B612F5 E0DC7448  NO     1 stepgen.make-pulses
  04   E0B614AD E0DC7448 YES     1 stepgen.update-freq

Hier suchen wir nach Eigentümer #08 und sehen eine Funktion namens ddt.0. Wir sollten in der Lage sein, ddt.0 zum Servo-Thread hinzuzufügen, und es wird seine Berechnungen jedes Mal durchführen, wenn der Servo-Thread aktualisiert wird. Noch einmal sehen wir uns den addf-Befehl an und stellen fest, dass er drei Argumente wie folgt verwendet:

addf <Funktionsname> <Threadname> [<Position>]

Wir wissen bereits, dass Funktionsname=ddt.0 ist, also müssen wir den Thread-Namen richtig eingeben, indem wir den Thread-Knoten im Baum erweitern. Hier sehen wir zwei Threads, den Servo-Thread und den Basis-Thread. Die Position von ddt.0 im Thread ist nicht entscheidend. Wir fügen also die Funktion ddt.0 zum Servo-Thread hinzu:

addf ddt.0 servo-thread

Dies ist nur zur Ansicht, also lassen wir Position leer und erhalten die letzte Position im Thread. Die folgende Abbildung zeigt den Zustand von halshow, nachdem dieser Befehl erteilt wurde.

Addf-Befehl
Abbildung 8. Addf-Befehl

Als nächstes müssen wir ddt mit etwas verbinden. Aber woher wissen wir, welche Pins verfügbar sind? Die Antwort ist, dass wir unter Pins nachsehen. Dort finden wir ddt und sehen dies:

Komponenten Pins:
Owner Type  Dir Value       Name
08    float R-  0.00000e+00 ddt.0.in
08    float -W  0.00000e+00 ddt.0.out

Das sieht einfach genug aus, um es zu verstehen, aber welches Signal oder welchen Pin wollen wir damit verbinden? Es könnte ein Achsen-Pin, ein Stepgen-Pin oder ein Signal sein. Wir sehen dies, wenn wir uns joint.0 ansehen:

Komponenten Pins:
Owner Type  Dir Value       Name
03    float -W  0.00000e+00 joint.0.motor-pos-cmd ==> Xpos-cmd

Es sieht also so aus, als ob Xpos-cmd ein gutes Signal sein sollte. Zurück zum Editor, wo wir den folgenden Befehl eingeben:

linksp Xpos-cmd ddt.0.in

Wenn wir uns nun das Xpos-cmd-Signal mithilfe des Baumknotens ansehen, sehen wir, was wir getan haben:

Signale:
Type Value Name
float 0.00000e+00 Xpos-cmd
<== joint.0.motor-pos-cmd
==> ddt.0.in
==> stepgen.0.position-cmd

Wir sehen, dass dieses Signal von joint.o.motor-pos-cmd kommt und sowohl an ddt.0.in als auch an stepgen.0.position-cmd geht. Durch die Verbindung unseres Blocks mit dem Signal haben wir jegliche Komplikationen mit dem normalen Ablauf dieses Bewegungsbefehls vermieden.

Der HAL-Anzeigebereich (engl. show area) verwendet halcmd, um herauszufinden, was in einermlaufenden HAL passiert. Er gibt Ihnen vollständige Informationen darüber, was er entdeckt hat. Er wird auch aktualisiert, wenn Sie über das kleine Editor-Panel Befehle zur Änderung des HAL eingeben. Es kann vorkommen, dass Sie andere Dinge angezeigt haben möchten, ohne dass alle Informationen in diesem Bereich verfügbar sind. In diesem Fall ist der HAL-Überwachungsbereich von Nutzen.