Bei LinuxCNC geht es um die Interaktion mit Hardware. Aber nur wenige Benutzer haben die gleichen genauen Hardware-Spezifikationen - ähnlich, aber nicht gleich. Und selbst für die exakt gleiche Hardware, kann es verschiedene Möglichkeiten, diese zu benutzen, sagen wir für verschiedene Materialien oder mit verschiedenen Fräsen, die Anpassungen an der Steuerung eines bereits laufenden Systems erfordern würde. Es wurde eine Abstraktion benötigt, um die Konfiguration von LinuxCNC für eine Vielzahl von Hardware-Geräten zu erleichtern. Auf der höchsten Ebene könnte es einfach eine Möglichkeit sein, eine Reihe von "Bausteinen" zu laden und miteinander zu verbinden, um ein komplexes System zusammenzustellen.
Dieses Kapitel führt Sie in die Hardware-Abstraktionsschicht ein. Sie werden sehen, dass viele der Bausteine tatsächlich Treiber für Hardwaregeräte sind. HAL kann jedoch mehr als nur Hardwaretreiber zu konfigurieren.
1. HAL Overview
Die Hardware-Abstraktionsschicht (oder mit einem Verweis auf den 2001 Space Odyssey Film einfach "HAL") ist eine Software zur
-
stellen die Infrastruktur für die Kommunikation mit und zwischen den zahlreichen Software- und Hardwarekomponenten des Systems bereit.
-
diese Informationen bei ihrem Fluss von Komponente zu Komponente optional verarbeiten und/oder überschreiben.
An sich ist diese Middleware bezüglich seiner Anwendung auf CNC nicht speziell ausgelegt. Eine Internetsuche fand beispielsweise eine astronomische Anwendung zur Steuerung von Teleskopen mit LinuxCNC. Motoren bewegen das Teleskop in die richtige Position, und man muss wissen, wie man die Motoraktivität mit den Auswirkungen dieser Positionierung auf die reale Welt abbildet. Eine solche Synchronisierung der Motorpositionen mit den Positionen in der realen Welt erinnert an das, was CNC-Maschinen tun müssen, oder gar ein Raumschiff.
Jede Maschinensteuerung muss kennen:
-
über ihren internen Zustand und dessen Abbildung auf die Umgebung (Maschinenkoordinaten, Zustand von Schaltern/Reglern),
-
wie die Aktoren diesen Zustand verändern sollen,
-
wie die Aktualisierung des internen Zustands durch Sensoren (Encoder, Sonden) ermöglichen.
Die HAL-Schicht besteht aus Teilen (als „Komponenten“ bezeichnet), die
-
miteinander verbunden sind, z. B. um die Positionsdaten zu aktualisieren oder um den Planungsalgorithmus den Motoren den nächsten Schritt mitteilen zu lassen.
-
wissen vielleicht, wie man mit Hardware kommuniziert,
-
kann einfach eingehende Daten verarbeiten und Datenausgaben für andere Komponenten bereitstellen,
-
werden immer periodisch ausgeführt
-
mit einer sehr hohen Frequenz von wenigen Mikrosekunden (μs) Ausführungszeit, genannt Basis-Thread, z.B. um
-
einen Schrittmotor dazu zu bewegen, einen weiteren Schritt zu machen
-
die von einem Encoder angezeigte Position auslesen.
-
-
mit einer niedrigeren Frequenz pro Millisekunde (ms), z.B. um
-
die Planung für die nächsten Züge anzupassen, um eine G-Code-Anweisung auszuführen.
-
-
als Nicht-Echtzeit-"User-Space"-Komponenten, die wie jede andere Software eine "Hauptschleife" (engl. main loop) ausführen und unterbrochen oder verzögert werden können, wenn der Rest des Systems ausgelastet oder überlastet ist.
-
Zusammengenommen ermöglicht HAL
-
für eine Maschine zu programmieren, die der Programmierer nicht direkt kennt, sich aber auf eine Programmierschnittstelle mit genau spezifizierter Wirkung auf die Maschine verlassen kann. Diese Schnittstelle kann verwendet werden, um
-
der Maschine sagen, was sie tun soll
-
zu hören, was die Maschine über den Zustand sagen will, in dem sie gerade ist.
-
-
Vertikale Abstraktionen: Der menschliche Systemintegrator einer solchen Maschine verwendet HAL
-
um zu beschreiben, wie die Maschine aussieht und wie welches Kabel welchen Motor steuert, der welche Achse antreibt.
-
Die Beschreibung der Maschine, die Schnittstellen des Programmierers und die Benutzerschnittstelle "treffen" sich irgendwie in dieser abstrakten Schicht.
-
-
Horizontale Abstraktionen:
-
Nicht alle Maschinen verfügen über alle möglichen Funktionen
-
Mühlen, Drehmaschinen und Roboter teilen viele
-
Merkmale (Motoren, Gelenke, …),
-
Planungsalgorithmen für ihre Bewegungen.
-
-
HAL hat keine direkte Interaktion mit dem Benutzer. Es wurden jedoch mehrere Schnittstellen bereitgestellt, mit denen HAL manipuliert werden kann
-
über die Kommandozeile mit dem Befehl "halcmd".
-
aus Python-Skripten und
-
aus C/C++-Programmen heraus,
aber keine dieser Schnittstellen ist "HAL selbst".
HAL selbst ist kein Programm, es besteht aus einer oder mehreren Listen geladener Programme (die Komponenten), die periodisch ausgeführt werden (in strenger Reihenfolge), und einem Bereich des gemeinsamen Speichers für den Datenaustausch verwenden. Das Haupt-HAL-Skript läuft nur einmal beim Maschinenstart, die Einrichtung der Echtzeit-Gewinde und der gemeinsamen Speicherplätze, das Laden der Komponenten und die Einrichtung der Datenverbindungen zwischen ihnen (die "Signale" und "Pins").
Im Prinzip könnten sich mehrere Maschinen eine gemeinsame HAL teilen, um ihnen die Zusammenarbeit zu ermöglichen, jedoch ist die aktuelle Implementierung von LinuxCNC auf einen einzigen Interpreter und ein einzelnes Task-Modul beschränkt. Derzeit handelt es sich dabei fast immer um einen G-Code-Interpreter und den "milltask" (der sich auch für Drehmaschinen und für Roboter bewährt hat), aber diese Module sind zur Ladezeit auswählbar. Mit einem zunehmenden Interesse an der Steuerung mehrerer kooperierender Maschinen ist die Überwindung dieser Einschränkung wahrscheinlich einer der wichtigsten Schritte für die zukünftige Entwicklung von LinuxCNC. Es ist jedoch ein bisschen knifflig und die Community ist immer noch dabei, ihre Gedanken dazu zu organisieren.
HAL ist das Herzstück von LinuxCNC und wird von allen Teilen von LinuxCNC, einschließlich der GUIs, verwendet und/oder erweitert. Der G-Code-Interpreter (oder alternative Sprache) weiß, wie der G-Code zu interpretieren ist, und übersetzt ihn in Maschinenoperationen, indem er Signale in HAL auslöst. Der Benutzer kann HAL auf verschiedene Weise abfragen, um Informationen über seinen Zustand zu erhalten, der dann auch den Zustand des Computers darstellt. Während des Schreibens während der Entwicklung von Version 2.9 machen die GUIs immer noch eine kleine Ausnahme von dieser Regel und wissen möglicherweise etwas, das HAL nicht weiß (und auch nicht wissen muss).
2. Kommunikation
HAL ist besonders, da er richtig schnell kommunizieren kann
-
mit anderen Programmen, vor allem aber
-
mit seinen Komponenten, die in der Regel in einem der Echtzeit-Threads ausgeführt werden.
Und während der Kommunikation muss sich der Teil von LinuxCNC, mit dem gesprochen wird, nicht auf die Kommunikation vorbereiten: Alle diese Aktionen werden asynchron ausgeführt, d.h. keine Komponente unterbricht ihre reguläre Ausführung, um ein Signal zu empfangen, und Signale können sofort gesendet werden, d.h. eine Anwendung kann warten, bis eine bestimmte Nachricht angekommen ist - wie ein Enable-Signal, sie muss sich jedoch nicht auf den Empfang dieser Nachricht vorbereiten.
Das Kommunikationssystem
-
repräsentiert und steuert die gesamte Hardware, die an das System angeschlossen ist,
-
startet und stoppt andere kommunizierende Programme.
Die Kommunikation mit der Hardware der Maschine selbst erfolgt durch jeweilige individuell darauf ausgelegte HAL-Komponenten.
Die HAL-Schicht ist ein geteilter Raum, in dem alle vielen Teile, die LinuxCNC bilden, Informations austauschen. Dieser Raum verfügt über Pins, die mit einem Namen identifiziert werden, auch wenn ein LinuxCNC-Ingenieur vielleicht eher die Assoziation mit einem Pin einer elektronischen Schaltung bevorzugt. Diese Pins können numerische und logische Werte tragen, boolean, Gleitkommezahlen sowie ganze Zahlen, jeweils mit oder ohne Vorzeichen. Es gibt auch einen (relativ neuen) Pin-Typ namens hal_port für Byte-Streams, und ein Framework zum Austausch komplexer Daten genannt hal_stream (die einen privaten gemeinsamen Speicherbereich verwendet, anstatt eines HAL-Pin). Diese beiden letztgenannten Typen werden relativ selten eingesetzt.
Mit HAL können Sie ein Signal an diesen benannten Pin senden. Jeder Teil von HAL kann den Pin lesen, der dann diesen zuvor gesendeten Signalwert hält. Dies gilt so lange, bis ein neues Signal an diesen Pin gesendet wird, um den vorherigen Wert zu ersetzen. Das zentrale Nachrichtenaustauschsystem von HAL ist CNC-unabhängig, HAL wird jedoch mit einer großen Anzahl von Komponenten ausgeliefert, die viel über CNC wissen und diese Informationen über Pins präsentieren. Es gibt Pins, die darstellen
-
statische (unveränderliche) Informationen über die Maschine
-
den aktuellen Zustand der Maschine
-
Endschalter (engl. end switches)
-
Positionen, die von Schrittmotoren gezählt oder von Encodern gemessen werden
-
-
Empfänger von Anweisungen
-
manuelle Steuerung der Maschinenposition ("Jogging")
-
Positionen, die Schrittmotoren als nächstes einnehmen sollten
-
In Analogie zu elektronischen Kabeln können Pins verdrahtet werden, sodass die Wertänderung an einem Pin als Eingabe für einen anderen Pin dient. HAL-Komponenten bereiten solche Ein- und Ausgangspins vor und werden so automatisch zur Ausführung veranlasst.
Die vielen "Experten"-Softwareteile von LinuxCNC werden typischerweise als Komponenten von HAL implementiert, konzeptionell auch als Module bezeichnet. Diese computerimplementierten Experten lesen ständig von HAL über einen Zustand, den die Maschine anstreben sollte, und vergleichen diesen gewünschten Zustand mit dem Zustand, in dem sich die Maschine gerade befindet. Wenn es einen Unterschied zwischen dem, was sein sollte, und dem, was der aktuelle Zustand ist, gibt, werden Maßnahmen ergriffen, um diesen Unterschied zu verringern, während ständig Aktualisierungen der aktuellen Zustände zurück in den HAL-Datenraum geschrieben werden.
Es gibt Komponenten, die darauf spezialisiert sind, mit Schrittmotoren zu kommunizieren, und andere Komponenten, die wissen, wie man Servos steuert. Auf einer höheren Ebene wissen einige Komponenten, wie die Achsen der Maschine in 3D angeordnet sind, und wieder andere, wie sie eine gleichmäßige Bewegung von einem Punkt im Raum zum anderen ausführen können. Drehmaschinen, Fräsen und Roboter unterscheiden sich in den LinuxCNC-Komponenten, die gerade aktiv sind, d.h. die von einer HAL-Konfigurationsdatei für diese Maschine geladen wird. Dennoch mögen zwei Maschinen sehr unterschiedlich aussehen, da sie für sehr unterschiedliche Zwecke gebaut wurden, aber wenn beide Servomotoren verwenden, können sie immer noch beide die gleiche HAL-Servokomponente verwenden.
Auf der niedrigsten (nahe an Hardware) Ebene, z.B. für Schrittmotoren, ist die Beschreibung eines Zustands dieses Motors sehr intuitiv: Es ist die Anzahl der Schritte in einer bestimmten Richtung. Ein Unterschied zwischen der Sollposition und der Istposition führt zu einer Bewegung. Geschwindigkeiten, Beschleunigungen und andere Parameter können im Bauteil selbst intern begrenzt sein oder gegebenenfalls durch vorgeschaltete Komponenten begrenzt sein. (In den meisten Fällen wurden z.B. die an die Schrittgeneratorkomponenten gesendeten Moment-zu-Moment-Achsen-Positionswerte bereits begrenzt und entsprechend den konfigurierten Maschinengrenzen bzw. der aktuellen Vorschubrate angepasst.)
Jede G-Code-Linie wird interpretiert und löst eine Reihe von Routinen aus, die wiederum wissen, wie mit Komponenten einer mittleren Schicht kommunizieren, z.B. um auf einem Kreis zu fahren.
HAL hat einen besonderen Platz im Herzen seiner Programmierer für die Darstellung des Datenflusses zwischen Modulen. Wenn traditionelle Programmierer an Variablen, Adressen oder I/O-Ports denken, bezieht sich HAL auf "Pins". Und diese Pins (deutsch auch "Stifte") sind über Signale mit oder mit Werten verbunden. Ähnlich wie ein Elektroingenieur Drähte zwischen Pins von Bauteilen einer Mühle verbinden würde, stellt ein HAL-Ingenieur den Datenfluss zwischen Pins von Modulinstanzen her.
Die LinuxCNC GUIS (AXIS, GMOCCAPY, Touchy, etc.) werden die Zustände einiger Pins (wie Limit Switches) darstellen, aber auch andere grafische Tools zur Fehlerbehebung und Konfiguration existieren: Halshow, Halmeter, Halscope und Halreport.
Der Rest dieser Einleitung präsentiert
-
die Syntax, wie Pins verschiedener Komponenten in den HAL-Konfigurationsdateien verbunden sind, und
-
Software zur Überprüfung der Werte von Pins
-
zu jedem Zeitpunkt,
-
sich im Laufe der Zeit entwickeln.
-
3. HAL System Design
HAL is based on the same principles that are used to design hardware circuits and systems, so it is useful to examine those principles first. Any system, including a CNC machine, consists of interconnected components. For the CNC machine, those components might be the main controller, servo amps or stepper drives, motors, encoders, limit switches, pushbutton pendants, perhaps a VFD for the spindle drive, a PLC to run a toolchanger, etc. The machine builder must aselect, mount and wire these pieces together to make a complete system.
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
3.1. Part Selection
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.
3.2. Interconnection Design
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.
3.3. Implementation
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.
3.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.
3.5. Summary
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.
4. HAL Concepts
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
-
When we talked about hardware design, we referred to the individual pieces as parts, building blocks, black boxes, etc. The HAL equivalent is a component or HAL component. This document uses HAL component when there is likely to be confusion with other kinds of components, but normally just uses component. A HAL component is a piece of software with well-defined inputs, outputs, and behavior, that can be installed and interconnected as needed. + + Many HAL Components model the behaviour of a tangible part of a machine, and a pin may indeed be meant to be connected to a physical pin on the device to communicate with it, hence the names. But most often this is not the case. Imagine a retrofit of a manual lathe/mill. What LinuxCNC implements is how the machine presents itself to the outside world, and it is secondary if the implementation how to draw a circle is implemented on the machine already or provided from LinuxCNC. And it is common to add buttons to the imaginary retrofit that signal an action, like an emergency stop. LinuxCNC and the machine become one. And that is through the HAL.
- Parameter
-
Many hardware components have adjustments that are not connected to any other components but still need to be accessed. For example, servo amps often have trim pots to allow for tuning adjustments, and test points where a meter or scope can be attached to view the tuning results. HAL components also can have such items, which are referred to as parameters. There are two types of parameters: Input parameters are equivalent to trim pots - they are values that can be adjusted by the user, and remain fixed once they are set. Output parameters cannot be adjusted by the user - they are equivalent to test points that allow internal signals to be monitored.
- Pin
-
Hardware components have terminals which are used to interconnect them. The HAL equivalent is a pin or HAL pin. HAL pin is used when needed to avoid confusion. All HAL pins are named, and the pin names are used when interconnecting them. HAL pins are software entities that exist only inside the computer.
- Physikalischer Pin (engl. physical pin)
-
Many I/O devices have real physical pins or terminals that connect to external hardware, for example the pins of a parallel port connector. To avoid confusion, these are referred to as physical pins. These are the things that stick out into the real world.
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 a physical machine, the terminals of real hardware components are interconnected by wires. The HAL equivalent of a wire is a signal or HAL signal. HAL signals connect HAL pins together as required by the machine builder. HAL signals can be disconnected and reconnected at will (even while the machine is running).
- Typ
-
When using real hardware, you would not connect a 24 Volt relay output to the +/-10 V analog input of a servo amp. HAL pins have the same restrictions, which are based upon their type. Both pins and signals have types, and signals can only be connected to pins of ffvthe same type. Currently there are 4 types, as follows:
-
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.648 bis +2.147.483.647
-
u64 - eine 64-Bit-Ganzzahl ohne Vorzeichen, zulässige Werte sind 0 bis 18.446.744.073.709.551.615
-
s64 - eine 64-Bit-Ganzzahl mit Vorzeichen, zulässige Werte sind -9.223.372.036.854.775.808 bis +9.223.372.036.854.775.808
-
- Funktion
-
Real hardware components tend to act immediately on their inputs. For example, if the input voltage to a servo amp changes, the output also changes automatically. However software components cannot act automatically. Each component has specific code that must be executed to do whatever that component is supposed to do. In some cases, that code simply runs as part of the component. However in most cases, especially in realtime components, the code must run in a specific sequence and at specific intervals. For example, inputs should be read before calculations are performed on the input data, and outputs should not be written until the calculations are done. In these cases, the code is made available to the system in the form of one or more functions. Each function is a block of code that performs a specific action. The system integrator can use threads to schedule a series of functions to be executed in a particular order and at specific time intervals.
- Thread
-
A thread is a list of functions that runs at specific intervals as part of a realtime task. When a thread is first created, it has a specific time interval (period), but no functions. Functions can be added to the thread, and will be executed in order every time the thread runs.
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.
5. HAL components
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.
6. Timing Issues 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. 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&8239;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.