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

Die Komponente siggen exportierte eine einzige Funktion. Sie benötigt Fließkomma. Sie ist derzeit mit keinem Thread verknüpft, daher ist users gleich Null
[Die Felder CodeAddr und Arg wurden während der Entwicklung verwendet und sollten wahrscheinlich verschwinden.]
.

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 )

Das tat es. Der Zeitraum beträgt aufgrund von Hardwarebeschränkungen nicht genau 1.000.000 ns, aber wir haben einen Thread, der ungefähr mit der richtigen Rate läuft und Gleitkommafunktionen verarbeiten kann. Der nächste Schritt besteht darin, die Funktion mit dem Thread zu verbinden:

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. 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.

5. Stepgen Example

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

5.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 fp1=0 period1=50000 name2=slow period2=1000000

Der erste Befehl lädt zwei Schrittgeneratoren, die beide so konfiguriert sind, dass sie den Schritttyp 0 erzeugen. Der zweite Befehl lädt unseren alten Freund siggen, und der dritte Befehl erzeugt zwei Threads, einen schnellen mit einer Periode von 50 Mikrosekunden (µs) und einen langsamen mit einer Periode von 1 Millisekunde (ms). Der schnelle Thread unterstützt keine Fließkommafunktionen.

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

5.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.

5.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.

Die Hauptfunktion für den Schrittimpulsgenerator ist stepgen.make_pulses. Jedes Mal, wenn make_pulses läuft, entscheidet es, ob es Zeit ist, einen Schritt zu machen, und wenn ja, setzt es die Ausgänge entsprechend. Um gleichmäßige Schrittimpulse zu erhalten, sollte er so oft wie möglich laufen. Weil es so schnell laufen muss, ist make_pulses stark optimiert und führt nur wenige Berechnungen durch. Im Gegensatz zu den anderen Programmen benötigt es keine Fließkommaberechnungen.

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  NO                   fast (        0,        0 )

Die beiden Threads wurden erstellt, als wir threads geladen haben. Der erste, slow, läuft jede Millisekunde und ist in der Lage, Gleitkommafunktionen auszuführen. Wir werden ihn für siggen.0.update und stepgen.update_freq verwenden. Der zweite Thread ist "schnell" (engl. fast), der alle 50 Mikrosekunden (µs) läuft und keine Fließkommafunktionen unterstützt. Wir werden ihn für stepgen.make_pulses verwenden. Um die Funktionen mit dem richtigen Thread zu verbinden, verwenden wir den Befehl addf. Wir geben zuerst die Funktion und dann den Thread an.

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.

5.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.

5.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.

6. Halscope

Das vorherige Beispiel erzeugt einige sehr interessante Signale. Aber vieles von dem, was passiert, ist viel zu schnell, um es mit dem Halmeter zu sehen. Um einen genaueren Blick auf die Vorgänge im Inneren des HAL zu werfen, brauchen wir ein Oszilloskop. Glücklicherweise verfügt HAL über ein solches, genannt halscope.

Halscope besteht aus zwei Teilen - einem Echtzeit-Teil, der die HAL-Signale liest, und einem Nicht-Echtzeit-Teil, der die grafische Benutzeroberfläche und die Anzeige bereitstellt. Sie müssen sich jedoch nicht darum kümmern, da der Nicht-Echtzeit-Teil den Echtzeit-Teil bei Bedarf automatisch lädt.

Wenn LinuxCNC in einem Terminal läuft, können Sie halscope mit dem folgenden Befehl starten.

Halscope starten
halcmd loadusr halscope

Wenn LinuxCNC nicht läuft oder die Datei autosave.halscope nicht mit den Pins übereinstimmt, die im aktuell laufenden LinuxCNC verfügbar sind, öffnet sich das Scope-GUI-Fenster, unmittelbar gefolgt von einem Dialog Realtime function not linked, der wie die folgende Abbildung aussieht. Um die Abtastrate zu ändern, klicken Sie mit der linken Maustaste auf das Feld Samples.

Dialog 'Echtzeitfunktion nicht verknüpft'
Abbildung 3. Dialog Echtzeitfunktion nicht verknüpft

In diesem Dialogfeld stellen Sie die Abtastrate für das Oszilloskop ein. Für den Moment wollen wir einmal pro Millisekunde abtasten, also klicken wir auf den 989 µs-Thread slow und lassen den Multiplikator bei 1. Wir werden auch die Aufzeichnungslänge bei 4000 Abtastungen belassen, so dass wir bis zu vier Kanäle auf einmal verwenden können. Wenn Sie einen Thread auswählen und dann auf "OK" klicken, verschwindet das Dialogfeld, und das Scope-Fenster sieht ungefähr so aus wie in der folgenden Abbildung.

Fenster für den anfänglichen Geltungsbereich
Abbildung 4. Fenster für den anfänglichen Geltungsbereich

6.1. Anschließen der Oszilloskop-Sonden

An diesem Punkt ist Halscope einsatzbereit. Wir haben bereits eine Abtastrate und eine Aufzeichnungslänge gewählt, so dass der nächste Schritt darin besteht, zu entscheiden, was wir uns ansehen wollen. Dies ist gleichbedeutend mit dem Anschließen von "virtuellen Oszilloskop-Sonden" an den HAL. Halscope verfügt über 16 Kanäle, aber die Anzahl, die Sie gleichzeitig verwenden können, hängt von der Aufzeichnungslänge ab - mehr Kanäle bedeuten kürzere Aufzeichnungen, da der für die Aufzeichnung verfügbare Speicher auf etwa 16.000 Samples festgelegt ist.

Die Kanalschaltflächen befinden sich am unteren Rand des Halskop-Bildschirms. Wenn Sie auf die Schaltfläche "1" klicken, wird das Dialogfeld "Select Channel Source" (Kanalquelle auswählen) angezeigt, wie in der folgenden Abbildung dargestellt. Dieser Dialog ist dem von Halmeter verwendeten Dialog sehr ähnlich. Wir möchten uns die Signale ansehen, die wir zuvor definiert haben, also klicken wir auf die Registerkarte "Signale", und der Dialog zeigt alle Signale im HAL an (in diesem Beispiel nur zwei).

Kanalquelle auswählen
Abbildung 5. Kanalquelle auswählen

Um ein Signal auszuwählen, klicken Sie es einfach an. In diesem Fall möchten wir, dass auf Kanal 1 das Signal "X-vel" angezeigt wird. Klicken Sie auf die Registerkarte "Signale" und dann auf "X-vel". Das Dialogfeld schließt sich und der Kanal ist nun ausgewählt.

Signal auswählen
Abbildung 6. Signal auswählen

Die Taste für Kanal 1 wird gedrückt, und die Kanalnummer 1 und die Bezeichnung "X-vel" erscheinen unter der Tastenreihe. Diese Anzeige zeigt immer den ausgewählten Kanal an - Sie können mehrere Kanäle auf dem Bildschirm haben, aber der ausgewählte Kanal ist hervorgehoben, und die verschiedenen Steuerelemente wie vertikale Position und Skalierung funktionieren immer für den ausgewählten Kanal.

Halscope
Abbildung 7. Halscope

Um ein Signal zu Kanal 2 hinzuzufügen, klicken Sie auf die Schaltfläche "2". Wenn der Dialog angezeigt wird, klicken Sie auf die Registerkarte "Signale" und dann auf "Y-vel". Wir wollen uns auch die Rechteck- und Dreieckswellenausgänge ansehen. Es sind keine Signale mit diesen Pins verbunden, daher verwenden wir stattdessen die Registerkarte "Pins". Für Kanal 3 wählen Sie siggen.0.triangle und für Kanal 4 siggen.0.square.

6.2. Erfassen unserer ersten Wellenformen

Nachdem wir nun mehrere Sonden an den HAL angeschlossen haben, ist es an der Zeit, einige Wellenformen zu erfassen. Zum Starten des Oszilloskops klicken Sie auf die Schaltfläche "Normal" im Abschnitt "Run Mode" des Bildschirms (oben rechts). Da wir eine Aufzeichnungslänge von 4000 Samples haben und 1000 Samples pro Sekunde erfassen, wird halscope etwa 2 Sekunden brauchen, um die Hälfte seines Puffers zu füllen. Während dieser Zeit zeigt ein Fortschrittsbalken direkt über dem Hauptbildschirm an, dass der Puffer gefüllt ist. Sobald der Puffer halb voll ist, wartet das Scope auf einen Trigger. Da wir noch keinen konfiguriert haben, wird es ewig warten. Um es manuell auszulösen, klicken Sie auf die Schaltfläche "Erzwingen" im Abschnitt "Auslöser" oben rechts. Sie sollten sehen, wie sich der Rest des Puffers füllt, und dann werden die erfassten Wellenformen auf dem Bildschirm angezeigt. Das Ergebnis sieht ungefähr so aus wie in der folgenden Abbildung.

Erfasste Wellenformen
Abbildung 8. Erfasste Wellenformen

Das Feld Ausgewählter Kanal am unteren Rand zeigt an, dass die violette Kurve die aktuell ausgewählte Kurve ist, Kanal 4, der den Wert des Pins siggen.0.square anzeigt. Klicken Sie auf die Kanalschaltflächen 1 bis 3, um die anderen drei Spuren zu markieren.

6.3. Vertikale Anpassungen

Die Spuren sind nur schwer zu unterscheiden, da alle vier übereinander liegen. Um dies zu beheben, verwenden wir die "Vertikal"-Steuerungen in der Box auf der rechten Seite des Bildschirms. Diese Regler wirken sich auf den aktuell ausgewählten Kanal aus. Bei der Einstellung der Verstärkung ist zu beachten, dass sie einen riesigen Bereich abdeckt - im Gegensatz zu einem echten Oszilloskop kann dieses Gerät Signale von sehr kleinen (Pico-Einheiten) bis zu sehr großen (Tera-Einheiten) anzeigen. Mit dem Positionsregler wird die angezeigte Kurve nur über die Höhe des Bildschirms nach oben und unten bewegt. Für größere Einstellungen sollte die Offset-Taste verwendet werden.

Vertikale Einstellung
Abbildung 9. Vertikale Einstellung

Die große Schaltfläche Ausgewählter Kanal am unteren Rand zeigt an, dass Kanal 1 der aktuell ausgewählte Kanal ist und dass er mit dem X-vel-Signal übereinstimmt. Versuchen Sie, auf die anderen Kanäle zu klicken, um ihre Spuren sichtbar zu machen und sie mit dem Pos-Cursor verschieben zu können.

6.4. Triggering (automatisches Auslösen)

Die Verwendung des Button "Erzwingen" ist eine eher unbefriedigende Art, das Oszilloskop auszulösen. Um eine echte Triggerung einzurichten, klicken Sie auf die Schaltfläche "Quelle" unten rechts. Daraufhin wird das Dialogfeld "Trigger Source" (Triggerquelle) angezeigt, das einfach eine Liste aller derzeit angeschlossenen Sonden enthält. Wählen Sie eine Sonde für die Triggerung aus, indem Sie auf sie klicken. In diesem Beispiel verwenden wir Kanal 3, die Dreieckswelle, wie in der folgenden Abbildung dargestellt.

Dialogfeld 'Triggerquelle' (engl. trigger source)
Abbildung 10. Dialogfeld Triggerquelle (engl. trigger source)

Nachdem Sie die Triggerquelle eingestellt haben, können Sie den Triggerpegel und die Triggerposition mit den Schiebereglern im Feld "Trigger" am rechten Rand einstellen. Der Pegel kann vom oberen bis zum unteren Rand des Bildschirms eingestellt werden und wird unter den Schiebereglern angezeigt. Die Position ist die Lage des Auslösepunkts innerhalb der gesamten Aufzeichnung. Ist der Schieberegler ganz unten, befindet sich der Auslösepunkt am Ende der Aufzeichnung, und halscope zeigt an, was vor dem Auslösepunkt passiert ist. Wenn der Schieberegler ganz nach oben geschoben ist, befindet sich der Auslösepunkt am Anfang des Datensatzes und es wird angezeigt, was nach dem Auslösen passiert ist. Der Triggerpunkt ist als vertikale Linie in der Fortschrittsanzeige über dem Bildschirm sichtbar. Die Triggerpolarität kann durch Klicken auf die Schaltfläche direkt unter der Triggerpegelanzeige geändert werden. Sie wird dann absteigend. Beachten Sie, dass die Änderung der Triggerposition das Oszilloskop anhält, sobald die Position angepasst wurde, starten Sie das Oszilloskop erneut, indem Sie auf die Schaltfläche Normal des Run-Modus der Gruppe klicken.

Nachdem wir nun die vertikalen Regler und die Triggerung eingestellt haben, sieht die Anzeige des Oszilloskops etwa wie in der folgenden Abbildung aus.

Wellenformen mit Triggerung
Abbildung 11. Wellenformen mit Triggerung

6.5. Horizontale Anpassungen

Um einen Teil einer Wellenform genauer zu betrachten, können Sie den Zoom-Schieberegler am oberen Rand des Bildschirms verwenden, um die Wellenformen horizontal zu erweitern, und den Positionsschieberegler, um zu bestimmen, welcher Teil der gezoomten Wellenform sichtbar ist. Manchmal reicht es jedoch nicht aus, die Wellenformen einfach zu vergrößern, und Sie müssen die Abtastrate erhöhen. Wir möchten uns zum Beispiel die tatsächlichen Schrittimpulse ansehen, die in unserem Beispiel erzeugt werden. Da die Schrittimpulse möglicherweise nur 50 µs lang sind, ist eine Abtastrate von 1 kHz nicht schnell genug. Um die Abtastrate zu ändern, klicken Sie auf die Schaltfläche, welche die Anzahl der Abtastungen und die Abtastrate anzeigt, um das Dialogfeld "Abtastrate auswählen" aufzurufen, Abbildung . In diesem Beispiel klicken wir auf den 50 µs-Thread "schnell", wodurch wir eine Abtastrate von etwa 20 kHz erhalten. Statt 4 Sekunden Daten anzuzeigen, besteht ein Datensatz nun aus 4000 Samples bei 20 kHz, also etwa 0,20 Sekunden.

Dialogfeld für Abtastrate
Abbildung 12. Dialogfeld für Abtastrate

6.6. Weitere Kanäle

Schauen wir uns nun die Schrittimpulse an. Halscope hat 16 Kanäle, aber für dieses Beispiel verwenden wir nur 4 auf einmal. Bevor wir weitere Kanäle auswählen, müssen wir ein paar ausschalten. Klicken Sie auf die Schaltfläche für Kanal 2 und dann auf die Schaltfläche "Kanal aus" am unteren Rand des Feldes "Vertikal". Klicken Sie dann auf Kanal 3, schalten Sie ihn aus, und tun Sie dasselbe für Kanal 4. Auch wenn die Kanäle ausgeschaltet sind, wissen sie immer noch, womit sie verbunden sind, und wir werden weiterhin Kanal 3 als Triggerquelle verwenden. Um neue Kanäle hinzuzufügen, wählen Sie Kanal 5 und den Pin stepgen.0.dir, dann Kanal 6 und stepgen.0.step. Klicken Sie dann auf den Ausführungsmodus Normal, um das Oszilloskop zu starten, und stellen Sie den horizontalen Zoom auf 5 ms pro Teilung ein. Sie sollten sehen, dass sich die Schrittimpulse verlangsamen, wenn sich der Geschwindigkeitsbefehl (Kanal 1) dem Wert Null nähert, dann ändert der Richtungspin seinen Zustand und die Schrittimpulse werden wieder schneller. Erhöhen Sie die Verstärkung von Kanal 1 auf etwa 20 Milli pro Division, um die Änderung des Geschwindigkeitsbefehls besser zu erkennen. Das Ergebnis sollte wie in der folgenden Abbildung aussehen.

Schrittimpulse
Abbildung 13. Schrittimpulse

6.7. Weitere Samples

Wenn Sie mehr Samples auf einmal aufnehmen wollen, starten Sie realtime neu und laden Sie halscope mit einem numerischen Argument, das die Anzahl der Samples angibt, die Sie aufnehmen wollen.

halcmd loadusr halscope 80000

Wenn die Komponente scope_rt noch nicht geladen war, lädt halscope sie und fordert 80000 Gesamtsamples an, so dass bei der Abtastung von 4 Kanälen gleichzeitig 20000 Samples pro Kanal zur Verfügung stehen. (Wenn scope_rt bereits geladen war, hat das numerische Argument für halscope keine Auswirkungen).