HAL steht für Hardware Abstraction Layer. Auf der höchsten Ebene ist es einfach eine Möglichkeit, eine Reihe von "Bausteinen" zu laden und miteinander zu verbinden, um ein komplexes System zusammenzustellen. Der "Hardware"-Teil kommt daher, dass HAL ursprünglich entwickelt wurde, um die Konfiguration von LinuxCNC für eine Vielzahl von Hardware-Geräten zu erleichtern. Viele der Bausteine sind Treiber für Hardware-Geräte. HAL kann jedoch mehr, als nur Hardware-Treiber zu konfigurieren.
1. HAL-Systementwurf
HAL basiert auf traditionellen Systementwurfstechniken.
HAL basiert auf denselben Prinzipien, die auch für die Entwicklung von Hardware-Schaltungen und -Systemen verwendet werden, so dass es sinnvoll ist, zunächst diese Prinzipien zu untersuchen.
Jedes System, auch eine CNC-Maschine, besteht aus miteinander verknüpften Komponenten. Bei einer CNC-Maschine könnten diese Komponenten die Hauptsteuerung, Servoverstärker oder Schrittmotoren, Motoren, Encoder, Endschalter, Drucktastenschalter, vielleicht ein VFD für den Spindelantrieb, eine SPS für den Betrieb eines Werkzeugwechslers usw. sein. Der Maschinenbauer muss diese Teile auswählen, montieren und miteinander verdrahten, um ein komplettes System zu erhalten.

Abbildung 1 würde wie folgt in HAL-Code geschrieben:
net signal-blue component.0.pin1-in component.1.pin1-out net signal-red component.0.pin3-out component.1.pin3-in component.1.pin4-in
1.1. Teileauswahl
Der Maschinenbauer muss sich nicht darum kümmern, wie jedes einzelne Teil funktioniert. Er behandelt sie als Blackboxen. In der Konstruktionsphase entscheidet er, welche Teile er verwenden will - Stepper oder Servos, welche Marke von Servoverstärker, welche Art von Endschaltern und wie viele, usw. Die Entscheidung des Integrators, welche Komponenten er verwendet, basiert auf der Funktion der jeweiligen Komponente und den vom Hersteller des Geräts angegebenen Spezifikationen. Die Größe eines Motors und die Last, die er antreiben muss, beeinflussen die Wahl des Verstärkers, der für den Betrieb benötigt wird. Die Wahl des Verstärkers kann sich auf die Art der Rückkopplung auswirken, die der Verstärker benötigt, sowie auf die Geschwindigkeits- oder Positionssignale, die von einer Steuerung an den Verstärker gesendet werden müssen.
In der HAL-Welt muss der Integrator entscheiden, welche HAL-Komponenten benötigt werden. In der Regel wird für jede Schnittstellenkarte ein Treiber benötigt. Zusätzliche Komponenten können für die Software-Generierung von Schrittimpulsen, SPS-Funktionen und eine Vielzahl anderer Aufgaben erforderlich sein.
1.2. Verbindungsentwurf
Der Konstrukteur eines Hardwaresystems wählt nicht nur die Teile aus, er entscheidet auch, wie diese Teile miteinander verbunden werden. Jeder schwarze Kasten hat Anschlüsse, vielleicht nur zwei für einen einfachen Schalter oder Dutzende für einen Servoantrieb oder eine SPS. Sie müssen miteinander verdrahtet werden. Die Motoren werden mit den Servoverstärkern verbunden, die Endschalter mit der Steuerung und so weiter. Während der Maschinenbauer an der Konstruktion arbeitet, erstellt er einen großen Verdrahtungsplan, der zeigt, wie alle Teile miteinander verbunden werden sollen.
Bei der Verwendung von HAL werden die Komponenten durch Signale miteinander verbunden. Der Designer muss entscheiden, welche Signale benötigt werden und was sie verbinden sollen.
1.3. Implementierung
Sobald der Schaltplan fertig ist, kann die Maschine gebaut werden. Die Teile müssen beschafft und montiert werden, und dann werden sie entsprechend dem Schaltplan miteinander verbunden. In einem physischen System besteht jede Verbindung aus einem Stück Draht, das abgeschnitten und an die entsprechenden Klemmen angeschlossen werden muss.
HAL bietet eine Reihe von Werkzeugen, die beim "Aufbau" eines HAL-Systems helfen. Mit einigen dieser Werkzeuge können Sie einen einzelnen "Draht" anschließen (oder abziehen). Andere Werkzeuge ermöglichen es Ihnen, eine vollständige Liste aller Teile, Drähte und anderer Informationen über das System zu speichern, so dass es mit einem einzigen Befehl "neu aufgebaut" werden kann.
1.4. Testen
Nur sehr wenige Maschinen funktionieren beim ersten Mal richtig. Bei der Prüfung kann der Konstrukteur ein Messgerät verwenden, um zu sehen, ob ein Endschalter funktioniert, oder um die Gleichspannung an einem Servomotor zu messen. Er kann ein Oszilloskop anschließen, um die Einstellung eines Antriebs zu überprüfen oder um nach elektrischen Störungen zu suchen. Vielleicht findet er ein Problem, das eine Änderung des Schaltplans erfordert; vielleicht muss ein Teil anders angeschlossen oder durch etwas völlig anderes ersetzt werden.
HAL bietet die Software-Äquivalente eines Voltmeters, Oszilloskops, Signalgenerators und anderer Werkzeuge, die zum Testen und Abstimmen eines Systems benötigt werden. Mit denselben Befehlen, die zum Aufbau des Systems verwendet werden, können auch Änderungen vorgenommen werden.
1.5. Zusammenfassung
Dieses Dokument richtet sich an Personen, die bereits wissen, wie man diese Art von Hardware-Systemintegration durchführt, die aber nicht wissen, wie man die Hardware mit LinuxCNC verbindet. Siehe den Abschnitt Remote Start Example in der HAL UI Examples Dokumentation.

Das oben beschriebene traditionelle Hardware-Design endet am Rande der Hauptsteuerung. Außerhalb der Steuerung befinden sich eine Reihe relativ einfacher Kästen, die miteinander verbunden sind, um das zu tun, was erforderlich ist. Im Inneren ist die Steuerung ein großes Rätsel - eine riesige schwarze Box, von der wir hoffen, dass sie funktioniert.
HAL erweitert diese traditionelle Hardware-Design-Methode auf das Innere der großen Blackbox. Es macht Gerätetreiber und sogar einige interne Teile des Controllers zu kleineren Black Boxes, die miteinander verbunden und sogar ersetzt werden können, genau wie die externe Hardware. So kann der "Systemschaltplan" einen Teil des internen Steuergeräts zeigen und nicht nur eine große Blackbox. Und, was am wichtigsten ist, es ermöglicht dem Integrator, den Controller mit denselben Methoden zu testen und zu modifizieren, die er auch für den Rest der Hardware verwenden würde.
Begriffe wie Motoren, Ampere und Encoder sind den meisten Maschinenintegratoren vertraut. Wenn wir über die Verwendung eines besonders flexiblen, achtadrigen, abgeschirmten Kabels sprechen, um einen Drehgeber mit der Servo-Eingangsplatine im Computer zu verbinden, versteht der Leser sofort, worum es sich handelt, und wird zu der Frage geführt, "welche Arten von Steckern ich für die beiden Enden benötige". Die gleiche Art von Denken ist für das HAL wesentlich, aber der spezifische Gedankengang braucht vielleicht ein bisschen, um auf den richtigen Weg zu kommen. Die Verwendung von HAL-Wörtern mag anfangs etwas seltsam erscheinen, aber das Konzept, von einer Verbindung zur nächsten zu arbeiten, ist dasselbe.
Diese Idee, den Schaltplan auf das Innere des Controllers auszudehnen, ist das eigentliche Anliegen von HAL. Wenn Sie mit der Idee, Hardware-Blackboxen miteinander zu verbinden, vertraut sind, werden Sie wahrscheinlich wenig Probleme haben, HAL für die Verbindung von Software-Blackboxen zu verwenden.
2. HAL-Konzepte
Dieser Abschnitt ist ein Glossar, in dem die wichtigsten HAL-Begriffe definiert werden. Er unterscheidet sich jedoch etwas von einem herkömmlichen Glossar, da die Begriffe nicht in alphabetischer Reihenfolge angeordnet sind. Sie sind nach ihrer Beziehung oder ihrem Fluss in der HAL-Welt geordnet.
- Komponente
-
Wenn wir über Hardware-Design sprechen, bezeichnen wir die einzelnen Teile als Teile, Bausteine, Black Boxes, usw. Das HAL-Äquivalent ist eine Komponente oder HAL-Komponente (in diesem Dokument wird HAL-Komponente verwendet, wenn eine Verwechslung mit anderen Arten von Komponenten wahrscheinlich ist, aber normalerweise wird nur Komponente verwendet). Eine HAL-Komponente ist ein Stück Software mit genau definierten Eingängen, Ausgängen und Verhaltensweisen, das installiert und nach Bedarf miteinander verbunden werden kann.
Anmerkung
|
Viele HAL-Komponenten modellieren das Verhalten eines greifbaren Teils einer Maschine, und ein Pin kann tatsächlich mit einem physischen Pin des Geräts verbunden werden, um mit ihm zu kommunizieren, daher die Namen. In den meisten Fällen ist dies jedoch nicht der Fall. Stellen Sie sich eine Nachrüstung einer manuellen Drehmaschine/Fräse vor. Was LinuxCNC implementiert, ist die Art und Weise, wie sich die Maschine der Außenwelt präsentiert, und es ist sekundär, ob die Implementierung, wie man einen Kreis zeichnet, bereits auf der Maschine implementiert ist oder von LinuxCNC bereitgestellt wird. Und es ist üblich, Knöpfe zur imaginären Nachrüstung hinzuzufügen, die eine Aktion signalisieren, wie einen Notstopp. LinuxCNC und die Maschine werden eins. Und das ist durch den HAL. |
- Parameter
-
Viele Hardwarekomponenten verfügen über Einstellmöglichkeiten, die nicht mit anderen Komponenten verbunden sind, auf die aber dennoch zugegriffen werden muss. Zum Beispiel haben Servoverstärker oft Trimmpotis, mit denen sie eingestellt werden können, und Testpunkte, an denen ein Messgerät oder Oszilloskop angeschlossen werden kann, um die Ergebnisse der Einstellung zu überprüfen. Auch HAL-Komponenten können solche Elemente haben, die als "Parameter" bezeichnet werden. Es gibt zwei Arten von Parametern: Eingangsparameter entsprechen Trimmpotentiometern - es handelt sich um Werte, die vom Benutzer eingestellt werden können und nach der Einstellung fest bleiben. Ausgangsparameter können nicht vom Benutzer eingestellt werden - sie entsprechen Testpunkten, mit denen interne Signale überwacht werden können.
- Pin
-
Hardware-Komponenten haben Anschlüsse, über die sie miteinander verbunden werden. Das HAL-Äquivalent ist ein "Pin" oder "HAL-Pin". (Der Begriff "HAL-Pin" wird verwendet, wenn es nötig ist, um Verwechslungen zu vermeiden.) Alle HAL-Pins sind benannt, und die Pin-Namen werden verwendet, wenn sie miteinander verbunden werden. HAL-Pins sind Software-Entitäten, die nur innerhalb des Computers existieren.
- Physikalischer Pin (engl. physical pin)
-
Viele E/A-Geräte haben echte physische Pins oder Anschlüsse, die mit externer Hardware verbunden sind, z. B. die Pins eines Parallelport-Anschlusses. Um Verwirrung zu vermeiden, werden diese als "physische Pins" bezeichnet. Dies sind die Dinge, die in die reale Welt hineinragen.
Anmerkung
|
Sie werden sich vielleicht fragen, welche Beziehung zwischen den HAL_pins, Physical_pins und externen Elementen wie Encodern oder einer STG-Karte besteht: Wir haben es hier mit Schnittstellen vom Typ Datenübersetzung/-umwandlung zu tun. |
- Signal
-
In einer physischen Maschine sind die Anschlüsse der realen Hardwarekomponenten durch Drähte miteinander verbunden. Das HAL-Äquivalent eines Drahtes ist ein "Signal" oder "HAL-Signal". HAL-Signale verbinden HAL-Pins miteinander, wie vom Maschinenbauer gewünscht. HAL-Signale können nach Belieben abgetrennt und wieder angeschlossen werden (sogar während die Maschine läuft).
- Typ
-
Bei der Verwendung echter Hardware würden Sie einen 24-V-Relaisausgang nicht an den +/-10-V-Analogeingang eines Servoverstärkers anschließen. Für HAL-Pins gelten die gleichen Einschränkungen, die auf ihrem Typ basieren. Sowohl Pins als auch Signale haben Typen, und Signale können nur an Pins desselben Typs angeschlossen werden. Derzeit gibt es 4 Typen, wie folgt:
-
bit - ein einzelner TRUE/FALSE- oder ON/OFF-Wert
-
float - eine 64-Bit-Fließkommazahl mit einer Auflösung von etwa 53 Bit und einem Dynamikbereich von über 1000 Bit.
-
u32 - eine 32-Bit-Ganzzahl ohne Vorzeichen, zulässige Werte sind 0 bis 4.294.967.295
-
s32 - eine 32-Bit-Ganzzahl mit Vorzeichen, zulässige Werte sind -2.147.483.647 bis +2.147.483.647
-
- Funktion
-
Echte Hardwarekomponenten reagieren in der Regel sofort auf ihre Eingänge. Wenn sich beispielsweise die Eingangsspannung eines Servoverstärkers ändert, dann ändert sich automatisch auch der Ausgang. Softwarekomponenten können jedoch nicht "automatisch" handeln. Jede Komponente verfügt über einen spezifischen Code, der ausgeführt werden muss, um das zu tun, was die Komponente tun soll. In einigen Fällen wird dieser Code einfach als Teil der Komponente ausgeführt. In den meisten Fällen jedoch, insbesondere bei Echtzeitkomponenten, muss der Code in einer bestimmten Reihenfolge und in bestimmten Abständen ausgeführt werden. So sollten beispielsweise Eingaben gelesen werden, bevor Berechnungen mit den Eingabedaten durchgeführt werden, und Ausgaben sollten erst dann geschrieben werden, wenn die Berechnungen abgeschlossen sind. In diesen Fällen wird der Code dem System in Form von einer oder mehreren "Funktionen" zur Verfügung gestellt. Jede Funktion ist ein Codeblock, der eine bestimmte Aktion ausführt. Der Systemintegrator kann "Threads" verwenden, um eine Reihe von Funktionen zu planen, die in einer bestimmten Reihenfolge und in bestimmten Zeitabständen ausgeführt werden sollen.
- Thread
-
Ein "Thread" ist eine Liste von Funktionen, die in bestimmten Zeitabständen als Teil einer Echtzeitaufgabe ausgeführt werden. Wenn ein Thread zum ersten Mal erstellt wird, hat er ein bestimmtes Zeitintervall (Periode), aber keine Funktionen. Es können Funktionen dem Thread hinzugefügt werden, um diese bei jeder Ausführung des Threads der Reihe nach auch auszuführen.
Angenommen, wir haben eine Parport-Komponente mit dem Namen hal_parport. Diese Komponente definiert einen oder mehrere HAL-Pins für jeden physischen Pin. Die Pins werden im Dokumentabschnitt dieser Komponente beschrieben: ihre Namen, wie sich jeder Pin auf den physischen Pin bezieht, ob sie invertiert sind, ob Sie die Polarität ändern können usw. Aber das allein bringt die Daten nicht von den HAL-Pins zu den physischen Pins. Es braucht Code, um das zu tun, und hier kommen Funktionen ins Spiel. Die Parport-Komponente benötigt mindestens zwei Funktionen: eine, um die physischen Eingangspins zu lesen und die HAL-Pins zu aktualisieren, die andere, um Daten von den HAL-Pins zu nehmen und sie auf die physischen Ausgangspins zu schreiben. Beide Funktionen sind Teil des parport-Treibers.
3. HAL-Komponenten
Jede HAL-Komponente ist ein Stück Software mit genau definierten Eingängen, Ausgängen und Verhaltensweisen, das installiert und nach Bedarf miteinander verbunden werden kann. Der Abschnitt HAL Components List listet alle verfügbaren Komponenten und eine kurze Beschreibung ihrer Funktionen auf.
4. Timing-Probleme in HAL
Im Gegensatz zu den physikalischen Verdrahtungsmodellen zwischen Black Boxes, auf denen HAL, wie wir gesagt haben, basiert, reicht das einfache Verbinden zweier Pins mit einem HAL-Signal bei weitem nicht aus, um die Wirkung des physikalischen Falles zu erreichen.
Echte Relaislogik besteht aus miteinander verbundenen Relais, und wenn sich ein Kontakt öffnet oder schließt, fließt (oder stoppt) sofort Strom. Andere Spulen können ihren Zustand ändern usw., und das alles "passiert". In der SPS-Kontaktplanlogik funktioniert das jedoch nicht so. In der Regel wird in einem einzigen Durchlauf durch den Kontaktplan jede Sprosse in der Reihenfolge ausgewertet, in der sie erscheint, und zwar nur einmal pro Durchlauf. Ein perfektes Beispiel ist ein Kontaktplan mit einem Öffnerkontakt in Reihe mit einer Spule. Der Kontakt und die Spule gehören zum selben Relais.
Wäre dies ein herkömmliches Relais, würden sich die Kontakte öffnen, sobald die Spule erregt ist, und die Spule wieder abschalten. Das heißt, die Kontakte schließen sich wieder, usw. usw. Das Relais wird zu einem Summton.
Wenn bei einer SPS die Spule ausgeschaltet und der Kontakt geschlossen ist, wenn die SPS mit der Auswertung des Strompfads beginnt, dann ist die Spule eingeschaltet, wenn sie diesen Durchgang beendet hat. Die Tatsache, dass das Einschalten der Spule den Kontakt öffnet, der sie speist, wird bis zum nächsten Durchgang ignoriert. Beim nächsten Durchgang sieht die SPS, dass der Kontakt geöffnet ist, und schaltet die Spule ab. Das Relais schaltet also immer noch schnell zwischen Ein und Aus um, allerdings in einem Rhythmus, der davon abhängt, wie oft die SPS den Stromkreis auswertet.
In HAL ist die Funktion der Code, der die Sprosse(n) auswertet. In der Tat exportiert die HAL-fähige Echtzeitversion von ClassicLadder eine Funktion, die genau das tut. In der Zwischenzeit ist ein Thread derjenige, der die Funktion in bestimmten Zeitintervallen ausführt. Genauso wie Sie wählen können, ob eine SPS alle 10 ms oder jede Sekunde alle Sprossen auswerten soll, können Sie HAL-Threads mit unterschiedlichen Zeitabständen definieren.
Was einen Thread von einem anderen unterscheidet, ist "nicht" das, was der Thread tut - das wird dadurch bestimmt, welche Funktionen mit ihm verbunden sind. Der eigentliche Unterschied ist einfach, wie oft ein Thread läuft.
In LinuxCNC könnten Sie einen 50 µs Thread und einen 1 ms Thread haben. Diese würden basierend auf BASE_PERIOD und SERVO_PERIOD erstellt werden, die tatsächlichen Zeiten hängen von den Werten in Ihrer INI-Datei.
Der nächste Schritt ist zu entscheiden, was jeder Thread zu tun hat. Einige dieser Entscheidungen sind die gleichen in (fast) jeder LinuxCNC-System. Zum Beispiel wird motion-command-handler immer Servo-thread hinzugefügt.
Andere Verbindungen werden vom Integrator hergestellt. Dazu könnte gehören, dass die Encoder-Lese- und DAC-Schreibfunktionen des STG-Treibers mit dem Servo-Thread verbunden werden, oder dass die Stepgen-Funktion mit dem Base-Thread verbunden wird, zusammen mit der/den Parport-Funktion(en), um die Steps in den Port zu schreiben.