Sechs Beine und ein Linux-Hirn

Transcrição

Sechs Beine und ein Linux-Hirn
Sechs Beine und ein Linux-Hirn
— Steuerung eines Industriehexapoden mit Linux —
Ingenieurgemeinschaft IgH
Essen
Februar 2003
Dieser Text1 ist in der Zeitschrift Linux-Magazin“, Ausgabe 03/03, erschienen.
”
Die Wiedergabe erfolgt mit freundlicher Genehmigung des Verlages.
Der Text ist urheberrechtlich geschützt.
Der Text ist urheberrechtlich geschützt.
Ingenieurgemeinschaft IgH
Heinz-Bäcker-Str. 34
D-45356 Essen
Tel.: +49-201-619931
Fax.: +49-201-619836
E-mail: [email protected]
1
hexapod, Revision: 1.1 , Stand: Date: 2003/05/09 13:27:37
Zusammenfassung
Ein Linux-System steuert eine Prüfmaschine für Wagenheber. Um die komplexen Bewegungsabläufe und Kräfteverhältnisse beim Heben eines Autos in Echtzeit
nachstellen zu können, genügt ein Kernel-Modul. Gleichzeitig überwacht das LinuxSytem noch den Prüfstand und bietet weitreichende Steuermöglichkeiten über das
Internet sowie webbasierte Dokumentenpräsentation.
Ein Wagenheber muss handlich und preiswert sein, aber auch sicher. Deshalb treiben
die Automobil-Zulieferer erheblichen Aufwand, um ihn unter allen denkbaren Belastungszuständen zu prüfen. Schwierig wird das, weil die anzuhebenden Autos manchmal noch
gar nicht existieren, wenn der Wagenheber dazu entwickelt wird.
Ein Prüfstand muss also das Verhalten des Autos nachbilden. Zu diesem Zweck wandert der angenommene Aufnahmepunkt des Fahrzeugs auf einer räumlichen Bahnkurve
und simuliert dabei das Fahrzeuggewicht. Diese Aufgabe ist geradezu prädestiniert für
einen Hexapoden. Das griechische Wort steht für einen Sechsbeiner. Das Funktionsprinzip beruht darauf, dass die sechs räumlichen Freiheitsgrade einer Bewegung, nämlich die
Verschiebungen längs dreier Raumachsen und die Drehungen um drei Körperachsen durch
sechs Hydraulikzylinder abgebildet werden. Diese sechs Zylinder stehen auf einem gemeinsamen Fundament und sind kopfseitig über eine Platte gekoppelt. Sie können unabhängig
voneinander ein- und ausfahren und ermöglichen damit nahezu beliebige Bewegungen der
Kopfplatte. Diese fährt auf und nieder, hin und her, vor und zurück und taumelt dabei
nach Belieben um ihre Achsen. Dieses trickreiche Prinzip wird gern in Flugsimulatoren
und auch zur hochpräzisen Steuerung von Werkzeugmaschinen verwendet. Anspruchsvoll
ist jedoch die Ansteuerung eines solchen Hexapoden; im vorliegenden Fall erledigt sie
ein Linux-System. Alle Steueraufgaben im engeren Sinne sind in einem Kernel-Modul
ausgeführt.
In der Steuertechnik existiert generell ein Trend hin zum PC. Prozessoren, Bussysteme
und entsprechende I/O-Karten sind flexibel und leistungsfähig. Die PC-Architektur erlaubt außerdem den Einsatz gängiger, verbreiteter und durch massenhaften Einsatz gut
getesteter Software.
Obwohl Linux eigentlich für Zwecke der Datenverarbeitung konzipiert wurde, besitzt es
auch für Steuerungs- und Regelungsaufgaben viele Vorteile: Der verfügbare Quellcode
1
Abbildung 1: Hexapode im Wagenheberprüfstand - sechs Hydraulikzylinder belasten den
Wagenheber längs der Hubkurve
ermöglicht Anpassungen an spezielle Hardware, Skalierbarkeit, gezielte Optimierungen,
um etwa Latenzzeiten zu verringern, sowie tiefreichende Diagnose. Kernel-Module lassen
sich unkompliziert einbinden, Linux erlaubt zudem umfangreiche Einblicke in die Kernelstrukturen zur Laufzeit. Gnu-Tools und aller anderen unix-typischen Entwicklungswerkzeuge stehen für Analyse, Test und Optimierung bereit.
2
1
Echtzeit – eine echte Herausforderung
Ein System arbeitet echtzeitfähig, wenn es garantiert innerhalb einer definierten maximalen Antwortzeit auf ein Ereignis reagiert. Die Dauer dieser Antwortzeit ist naturgemäß
vom Prozess abhängig, der kontrolliert werden soll. Echtzeitfähigkeit ist nicht notwendig
gleichzusetzen mit Schnelligkeit! Zwischen einem Ereignis und der Antwort des Echtzeitsystems verstreicht grundsätzlich eine gewisse Zeit, die sogenannte Latenzzeit. Die Streuung
der Latenzzeit bei wiederkehrenden Ereignissen wird Jitter genannt.
Echtzeitverhalten ist eine notwendige Eigenschaft eines Betriebssystems für Steuerungsaufgaben. Für Linux existiert eine Reihe von Erweiterungen, die eine tatasächliche Echtzeitfähigkeit verbessern oder gewährleisten, zum Beispiel RT-Linux [1] oder RTAI [2].
Allerdings stellte sich in der vorliegenden Aufgabe zunächst die Frage, ob diese Erweiterungen für steuerungtechnische Aufgaben wirklich erforderlich sind. Der Vorteil der har”
ten“ Echtzeitfähigkeit wird bei diesen Systemen durch Einschränkungen hinsichtlich der
verfügbaren Software und lizenzrechtliche Probleme erkauft. Aus diesem Grunde entschieden wir uns, sehr gut beraten von Professor Quade von der Fachhochschule Niederrhein,
einen Standard-Kernel zu verwenden. Als Experte für Embedded Systeme ermutigte er
uns unumwunden, auf Linux zu setzen. Er sollte Recht behalten.
Digitale Steuerungen und Regelungen verfügen über einen Taktgeber, der die entsprechenden Berechnungsroutinen in äquidistanten Zeitschritten aufruft. Dabei liegen die Abtastraten für die hier betrachteten Systeme zwischen 100 Hz und 10 kHz. Die weitaus
überwiegende Zahl der industriellen digitalen Regelungen arbeiten mit Abtastraten in
diesem Bereich.
2
Eigenschaften von Linux beim Echtzeiteinsatz
Alle Berechnungen, die in Echtzeit ausgeführt werden müssen, führt ein Kernelmodul als
Interruptroutine aus. Als Interruptquelle dient ein Timer, der zyklisch die Abarbeitung
der Routine auslöst.
Jeder PC verfügt über einen programmierbaren Timerbaustein, der zyklische Interrupts
generieren kann. Multitasking-Betriebssysteme nutzen diesen Timer grundsätzlich, um
zum Beispiel regelmäßig den Scheduler zum Taskwechsel aufzurufen. Die Taktfrequenz
wird so gering wie möglich gehalten, damit der Anteil der Taskwechselzeit an der CPULast gering ist, aber so hoch, dass flüssiges Arbeiten mehrerer Prozesse nebeneinander
möglich wird. Bei i386-kompatiblen Rechnern unter Linux hat der Timerinterrupt eine
Frequenz von 100 Hz. Diese Frequenz lässt sich einfach ändern. Sie steht zentral in der
Datei /usr/src/linux/include/asm-i386/param.h. Ein Auszug ist in Abbildung 2 wiedergegeben.
3
Abbildung 2: Frequenz des Timerinterrupts
/* Die Frequenz des Timerinterrupts wird eingestellt in
/usr/src/linux/include/asm-i386/param.h: */
#ifndef _ASMi386_PARAM_H
#define _ASMi386_PARAM_H
#ifndef HZ
#define HZ 100
#endif
<----------- hier
#define EXEC_PAGESIZE
4096
#ifndef NGROUPS
#define NGROUPS
#endif
32
#ifndef NOGROUP
#define NOGROUP
#endif
(-1)
#define MAXHOSTNAMELEN
64
#ifdef __KERNEL__
# define CLOCKS_PER_SEC 100
#endif
#endif
/* max length of hostname */
/* frequency at which times() counts */
Bei einigermaßen schnellen Rechnern, (ab 500 MHz CPU-Geschwindigkeit) kann diese
Rate ohne weiteres bis auf 1000 Hz erhöht werden. Die Änderung der Taktrate erfordert die
Neukompilation des Kernels und aller Module. Das System fühlt“ sich bei der praktischen
”
Arbeit danach nahezu unverändert an.
Um den Takt für die Regelung zu nutzen, gibt es zwei Möglichkeiten,
die
Standard“-Timerqueue oder eine eigene Interrupt-Routine. Im einfach”
sten Fall registriert man also die Regelroutine durch den Systemaufruf
queue_task(&meineRegelroutine, &tq_timer); in der
Standard“-Timerqueue
”
des Kernels, die bei jedem Auslösen des Timer-Interrupts in dessen Bottom-Half des
Timerinterrupts aufgerufen wird. Die Routine wird dann jeweils in der Bottomhalf des
Timerinterrupts ausgeführt. Die Reihenfolge, in der die Queue abgearbeitet wird, lässt
sich nicht beeinflussen. Daher muss man mit einem erhöhten Jitter rechnen. Reduzieren
lässt sich der Jitter hingegen durch das Registrieren einer eigenen Interrupt-Routine
neben der Standard-Interrupt-Routine. Eigene Messungen haben das bestätigt.
4
3
Ein Interrupt, viele Routinen
Seit dem Aufkommen des PCI-Buses ist es gang und gäbe, dass sich mehrere Komponenten
eine Interruptleitung teilen. Deshalb können auch mehrere Routinen für einen Interrupt
registiert werden. Die einzelnen Routinen müssen dann jedoch selbständig entscheiden,
ob der gerade ausgelöste Interrupt für sie bestimmt war. Dies tun sie üblicherweise indem sie ein Flag auf der eigenen“ Hardware abfragen, anhand dessen sie erkennen, ob
”
der Interrupt von dort kam. Um eine zweite Interruptroutine für den Timerinterrupt zuzulassen muss, dieser das Flag SA_SHIRQ (sharable) bekommen. Hierzu ist in der Datei
/usr/src/linux/arch/i386/kernel/time.c etwa in Zeile 560 die Strukturdefinition zu
ändern:
static struct irqaction irq0 =
{ timer_interrupt,
SA_INTERRUPT, 0, "timer", NULL, NULL};
nach
static struct irqaction irq0 =
{ timer_interrupt, SA_SHIRQ | SA_INTERRUPT, 0,
"timer", NULL, NULL};
Diese Änderungen am Kernel sind marginal, nachteilig ist jedoch die erforderliche Neukompilierung des Kernels und aller Module.
Verwendet man eine weitere Interruptquelle, zum Beispiel eine I/O-Karte mit eigenem
Timer, dann kann man sogar den unmodifizierten Kernel verwenden. Die Regelroutine
wird für den verwendeten Interruptkanal registriert und arbeitet dann in der Taktrate,
die man komfortabel zur Laufzeit einstellen kann, indem man das Timingverhalten der
gewählten Interruptquelle justiert.
4
Jittermessungen
Der Jitter des Aufrufes der Interruptroutine resultiert daraus, dass der Steuerrechner
üblicherweise nur über einen Prozessor verfügt, der auch die Interruptanforderungen nur
nacheinander verarbeiten kann. Unter Linux ab Kernel 2.4.x werden Interrupts ununterbrechbar bearbeitet. Für die Dauer der aktuellen Interruptroutine werden also alle anderen
gesperrt. Auch verfügen vielen Systemaufrufe über Interruptsperren. Dabei stellt sich die
Frage nach der Dauer der längsten Sperre. Diese Zeit ist nicht a priori bestimmbar, weil
sie sich durch das Eintreten mehr oder weniger stochastischer Ereignisse ergibt und deshalb mit statistischen Methoden ermittelt werden muss. Sie bestimmt letztendlich die
5
Latenzzeit und gibt eine Aussage über die Echtzeitfähigkeit des Systems. Es stehen einige
Tools in Form von Patches für ältere Kernel zur Verfügung, um beim laufenden System
die Dauer von Interruptsperren zu messen [3].
Im vorliegenden Fall zeichnet aber ein eigens dafür geschriebens kleines Kernelmodul
den Jitter der Timerinterruptroutine auf. Tabelle 1 zeigt typische Ergebnisse nach einem
mehrstündigen Testlauf auf einer 500 MHz Pentium III Maschine, die unter der Last von
Benchmark-Tests ächzte. Man sieht, dass 99,8% aller Interruptanforderungen innerhalb
von 42 µs nach Anforderung bearbeitet werden. Es gibt aber auch einige wenige Verzögerungen von bis zu 1 ms. Weitergehende Experimente zeigen, dass es nur zwei Quellen
von langen Sperren gibt, die sich einfach vermeiden lassen. Lange Sperren von mehr als
1 ms werden vom Consolentreiber beim Wechsel der Console verursacht. Der Festplattentreiber verursacht sehr lange Sperren von über 100 µs, wenn DMA deaktiviert ist.
Alle anderen relevanten Treiber wie zum Beispiel Netzwerk- und Grafikkarte, Maus und
Tastatur arbeiten ihre Interrupts in sehr kurzer Zeit ab.
Tabelle 1: Jittermessung eines nicht optimierten Systems
Dauer der Messung:
120 min
Anzahl der Interrupts: 21699717
Klasse(µs)
Anzahl Prozent Summe-Prozent
2 17175311 78.7410
78.7410
4
3712813 17.0216
95.7626
10
754003
3.4568
99.2194
21
62944
0.2886
99.5079
42
65874
0.3020
99.8099
107
28255
0.1295
99.9395
214
7767
0.0356
99.9751
300
2133
0.0098
99.9848
429
2026
0.0093
99.9941
1074
1279
0.0059
100.0000
2149
0
0.0000
100.0000
4298
0
0.0000
100.0000
Vermeidet man Konsolenwechsel und optimiert den Festplattenzugriff mit hdparm dann
bleibt der Jitter auf einer 500 MHz-Maschine sehr zuverlässig unter 40 µs. Abhängig vom
Anwendungsfall ist dies akzeptabel, so dass die für eine Steuerung erforderlichen Echtzeitbedingungen bereits auf einem Standardkernel mit einigen wenigen Einschränkungen
erfüllt sind.
6
5
Floating Point Operationen im Kernel
Im Standard-Linuxkernel und auch in den Modulen ist keine einzige Floating-Point Berechnung zu finden. Dies ist in der Regel auch nicht notwendig, da keine Betriebssystemfunktionalität zwingend auf Fließkommaberechnungen angewiesen ist. In einigen wenigen
Fällen, wie zum Beispiel bei der Berechnung von Zeiten wird Festkomma-Berechnung auf
Integerarithmetik abgebildet. Aus diesem Grund ist die Zeit in einer Struktur kodiert:
struct timeval {
long tv_sec;
long tv_usec;
};
/* seconds */
/* microseconds */
Für Steuerungsaufgaben, bei denen wie im Falle des Hexapoden komplexe Regelungen und
Koordinatentransformationen durchgeführt werden, sind jedoch Fließkommatberechnungen unverzichtbar. Allein die räumlichen Berechnungen erfordern massenhaft trigonometrische Kalkulationen. Da die gesamte Steuerungssoftware als Kernelmodul realisiert ist,
müssen nun auch im Kernelspace Fließkommaberechnungen durchgeführt werden. Dabei
sind zwei Punkte zu beachten. Die mathematischen Routinen müssen verfügbar sein, um
auch im Kernel etwa trigonometrische Funktionen nützen zu können. Die Math-Bibliothek
ist also statisch zum Kernelmodul zu linken. Dazu dient die Linker-Option
LDFLAGS =
-L/usr/lib -lm
Der zweite Punkt betrifft das Retten der Floating-Point Register. Aus Geschwindigkeitsgründen werden bei Interruptaufrufen des Kernels die Floating-Pointregister nicht gesichert, weil sie normalerweise unverändert bleiben.
Anders ist dies im Falle der Hexapodensteuerung. Hier werden alle echtzeitrelevanten Programmteile, also Regler, Koordinatentransformation und Zustandsmaschine in einer Interruptroutine ausgeführt. Da diese zyklisch die Userspace-Applikationen, also Anwenderprogramme und Daemonen unterbricht, in denen Fließkommaberechnungen durchgeführt
werden, müssen in der Interruptroutine alle Floating-Point-Register gesichert und am
Ende der Routine wiederhergestellt werden.
Abbildung 5 zeigt den Rumpf einer Routine, die Fließkommarechnung nutzt.
Floating-Point-Berechnungen im Kernel, die nicht in einer Interruptroutine, sondern im
Kontext eines Userprozesses ausgeführt werden, müssen nicht gesondert behandelt werden,
da die Register vom Betriebssystem schon beim Taskwechsel für den Userprozess gesichert
wurden. Dies gilt beispielsweise für Berechnungen in den Read/Write-Funktionen eines
Kernel-Moduls.
7
Abbildung 3: Fließpunktarithmetik im Kernel
*/ Quellcodeauszug nach Vorlage von P. Mantegazza
([email protected]), um
im Kernel Fließpunktoperationen ausführen zu
können. (Retten und Wiederherstellen der
Floating-Point-Register) */
#define
#define
#define
#define
save_cr0_and_clts(x)
restore_cr0(x)
save_fpenv(x)
restore_fpenv(x)
__asm__
__asm__
__asm__
__asm__
__volatile__
__volatile__
__volatile__
__volatile__
("movl %%cr0,%0; clts" :"=r" (x))
("movl %0,%%cr0": :"r" (x));
("fnsave %0" : "=m" (x))
("frstor %0" : "=m" (x));
/* Interruptroutine */
void msr_run_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
/* Variablen für temporäre Sicherung der notwendigen Register */
unsigned long cr0;
unsigned long linux_fpe[27];
/* Register sichern */
save_cr0_and_clts(cr0);
save_fpenv(linux_fpe);
/* ab hier Floating Point Berechnungen */
....
/* bis hier Floating Point Berechnungen */
/* Register wiederherstellen */
restore_fpenv(linux_fpe);
restore_cr0(cr0);
}
8
6
Struktur des Kernelmoduls
Initialisierung
1. Initialisieren und Parametrieren der I/O-Karten
2. Registrieren der Interruptroutinen beim Betriebssystem
3. Registrieren der Kommunikationsschnittstelle beim Betriebssystem
4. Initialisierung vom proc-Filesystem
5. Registrierung von Parametern und Kanälen an der Kommunikationsschnittstelle
6. Start des Steuer- und Regelteils.
Steuerung und Regelung
1. Auslesen der I/O-Karten (digital und analog)
2. Skalieren der analogen Werte
3. Dekodieren der digitalen Werte
4. Grenzwertüberwachung
5. Berechnung von Zwischengrößen
6. Ausführung der Zustandsmaschinen
7. Berechnung der Regler
8. Berechnung der Ausgabewerte (analog und digital)
9. Beschreiben der Ausgangskanäle
10. Ablegen der Messdaten in einem Kanalringpuffer
Kommunikation
1. Schreiben von Parametern
2. Auslesen von Kanälen
3. Darstellung von Diagnose-Informationen
9
7
Kommunikation über ein Device
Die Kommunikation mit dem Modul erfolgt über ein Character-Device, das von beliebig
vielen Prozessen zum Lesen und Schreiben geöffnet werden kann und dabei diese Prozesse
jeweils getrennt verwaltet. Dieses Verfahren wird ganz ähnlich für /dev/tty angewandt.
Der Datenaustausch geschieht rein ascii-basiert mit einer XML-ähnlichen Syntax. Hierzu verfügt das Kernelmodul über einen vereinfachten XML-Parser und Interpreter. Der
Userprozess greift über simple Standard-IO-Funktionen auf das Device-File zu, das beispielsweise den Namen /dev/msr besitzen kann. Um den Steuerrechner etwa anzuweisen,
Messdaten zu senden, genügt ein
echo <start_data> > /dev/msr
Anschließend können die Daten endlos vom Device gelesen werden:
cat /dev/msr
...
<D 1.05, 3.64, 2.98>
<D 1.23, 3.55, 3.07>
...
Über das Device-File können entsprechend Parameter auf dem Modul gelesen und geschrieben werden, sowie das dauerhafte Senden von Messwerten gestartet und gestoppt
werden. Diagnose-Informationen des Moduls werden in guter Linux-Tradition über Dateien im Verzeichnis /proc präsentiert.
Variablen auf dem Modul können wahlweise als Parameter oder Kanäle registriert werden. Dies geschieht bereits im Quellcode, da die Bedeutung einer Variablen bereits bei
Programmerstellung zugewiesen wird. Parameter sind überlicherweise Einstellwerte von
Reglern. Kanäle sind in der Regel von der I/O-Karten erfasste Messwerte. Während Parameter sowohl gelesen als auch geschrieben werden können, können Kanäle nur gelesen
werden. Da die Daten in den Kanälen im Takt der Abtastrate anfallen, verfügt jeder Kanal über einen eigenen Ringpuffer, in dem alle aufgenommenen Werte abgelegt werden.
Umfang und Takt der Kanaldaten, die der Kernel über das Device-File sendet, werden
zur Laufzeit per Kommando festgelegt. Dabei kann eine Untermenge aller registrierten
Kanäle bei reduzierter Abtastrate zum Senden ausgewählt werden.
Alle Kanäle und Parameter werden während der Initialisierung des Moduls von den Registierungsfunktionen in entsprechend verkettete Listen eingetragen, die dann der Kommunikationsschnittstelle zur Verfügung stehen. Der prinzipielle Aufbau des Kernelmoduls
ist in Abbildung 4 wiedergegeben.
10
Abbildung 4: Kernelmodul – Aufbau, Funktion und Anbindung
11
8
Kommunikation via Netzwerk
Nachdem es verhältnismäßig einfach ist, per Device- oder Proc-File mit dem Kernel zu
kommunizieren, stellt sich die nächste Aufgabe nach der netzwerkbasierten Kommunikation mit dem Kernel. In unserem Falle war sowohl eine Fernbedienung des Prüfstandsystems
als auch eine Fernbeobachtung wünschenswert. Die betreuenden Ingenieure sollten also die
Möglichkeit erhalten, von ihrem Arbeitsplatz oder von zu Hause aus das Prüfgeschehen
zu verfolgen und gegebenenfalls einzugreifen.
Da aber nicht nur die Tester selbst, sondern auch Entwickler und Konstrukteure sind
am Prüfgeschehen interessiert sind, stellt die zusätzliche Möglichkeit der netzbasierten
Online-Beobachtung auch über große Strecken hinweg einen enormen Vorteil dar. Das
Netzwerkkonzept ist in Abbildung 5 dargestellt.
Die Kommunikation mit dem Kernelmodul erfolgt lokal über das oben beschriebene
Device-File. Als Schnittstelle zum Netz dient ein kleines Perlscript, das als Daemon zwischen Netzwerk-Socket und Device-File nach dem Prinzip des Multithreaded Server arbeitet, um auch eine Vielzahl von Clients bedienen zu können.
Via Netzwerk erhält der Steuerrechner vom Bedien-Rechner, der ein beliebiger PC im
Netzwerk sein kann, Anweisungen zur Prüfstandsarbeit. Erhält er den Befehl zum Beginn
einer Prüfung, dann zeichnet er alle relevanten Messwerte in einer ASCII-Datei auf. Nach
Anforderung übermittelt er diese Daten auch online auf beliebige PC im Netz, die damit
das Prüfgeschehen beobachten können. Ein Eindruck von einer derartigen Prüfstandsbeobachtung ist in Abbildung 6 wiedergegeben. Der Screenshot zeigt die Betriebsdaten
in verschiedenen Diagrammen. Links ist etwa die Last auf den Wagenheber über der
Hubhöhe dargestellt. Rechts daneben ist der zeitliche Verlauf mehrerer Hübe erkennbar.
Unten werden mit Balkenanzeigen aktuelle Werte online präsentiert und rechts liegt ein
Feld mit diversen Statusanzeigen.
Nach Ablauf der Prüfung wird das Abnahmeprotokoll geschlossen und auf einen Fileserver
übertragen. Idealerweise übernimmt dieses System weitere Dienste wie Backup und Zeitsynchronisation, zwei oft sträflich vernachlässigte Dienste. Arbeitet der Fileserver unter
Unix, dann erfolgt der Transfer via NFS. Alternativ steht Samba zur Verfügung, das den
Mount einer UNC-Share erlaubt.
Das Dateisystem des Fileservers dient dem Webserver des Prüfstandsrechners als Datenquelle. Die Prüfprotokolle werden bei Anfrage dynamisch erzeugt und physikalisch auf
dem Fileserver hinterlegt. Außerdem präsentiert der Webserver das Bild einer Webcam
im Prüfraum.
Der Steuerrechner ist bei Bedarf über Ssh zur Fernwartung und -diagnose erreichbar. Der
Vorteil dieser Option führt gar zum Verzicht auf den Einsatz einer Industrie-SPS, die sich
gegen internetbasierte Fernwartung in der Regel sehr widerborstig zeigt.
12
Optional lässt sich das Netzwerkskonzept auch bis hin zur Anbindung von Außenstellen
oder Kunden erweitern. Prüfprotokolle werden hier auf Mirror-Servern abgelegt, während
gesicherte Verbindungen via Internet die Online-Beobachtung ermöglichen.
13
Abbildung 5: Netzwerkkonzept des Prüfstands - Bedienung, Dokumentationssystem und
Fernwartung
14
Abbildung 6: Screenshot der Prüfstandsfernbeobachtung – Last- und Hubverlüfe,
Prüfstandsparameter und -zustände
15
9
Und der Client?
Das Bedienprogramm läuft standardmäßig unter Windows und ist in Delphi geschrieben.
Um das Programm flexibel an unterschiedliche Prüfaufgaben anpassen zu können, sind
spezielle Delphikomponenten entwickelt worden, die selbständig über TCP/IP mit dem
Steuerungsrechner die für sie bestimmten Informationen austauschen. Beispielsweise kann
eine Edit-Komponente direkt einer Parametervariablen auf dem Echtzeitprozess zugeordnet werden. Die Komponente ist dann selbst dafür verantwortlich, sich den Inhalt der
Variablen vom Echtzeitprozess zu holen, zu aktualisieren und zu schreiben. In ähnlicher
Weise lassen sich Plotfenster unterschiedlichen Kanälen des Echtzeitprozesses zuordnen,
um Signalverläufe online zu visualisieren.
Aktuell wird bei der IgH an einer Portierung der Kommunikationsbibliotheken nach Kylix gearbeitet, so dass in Zukunft die Clientsoftware auch unter Linux laufen wird, soweit
dies vom Kunden gewünscht wird. Abbildung 7 zeigt die Portierung des Diagnosetools
Taskbrowser“ mit dem die Kanäle und Parameter eines Echzeitprozesses zu Diagnose”
zwecken beobachtet, eingestellt und modifiziert werden können. Im linken Teil des Hauptfensters befindet sich eine Baumdarstellung aller verfügbaren Parameter und Kanäle. Diese können per Drag and Drop auf ein Instrument, welches sich auf der rechten Fensterseite befindet, gezogen werden. Es steht eine Sammlung verschiedener Instrumente zur
Verfügung, die dynamisch auf dem Arbeitsblatt positioniert werden können.
16
Abbildung 7: Diagnosetool für das Linux-Echtzeitmodul – hier dargestellt sind Aufrufund Laufzeiten des Kernelmoduls
17
10
Fazit
Linux als Betriebssystem für industrielle Steuerungsaufgaben hat mehrfach seine hervorragende Eignung unter Beweis gestellt. Selbst in nahezu unveränderter Fassung arbeitet
es außerordentlich zuverlässig auch unter hoher Belastung durch umfangreiche Fließkommaberechnungen und intensiven Netztraffik inklusive webbasiertem Dokumentenmanagement. Der hohe Entwicklungsstand dieses Betriebssytems in Kombination mit dem
Open-Source-Prinzip bildet die ideale Voraussetzung zur Realisierung auch komplexer
Steuerungs-, Regelungs- und Dokumentationsaufgaben.
Literatur
[1] FSM-Labs RT-Linux Projekt: www.fsmlabs.com
[2] www.aero.polimi.it/~rtai/index.html RTAI Homepage
[3] Kernel Latency Patches:
http://www.mvista.com/realtime/latency/results-analysis.html
[4] www.hs-niederrhein.de/fb03/ Fachhochschule Niederrhein - Krefeld
[5] Beck, M.: Linux-Kernelprogrammierung, Algorithmen und Strukturen der Version
2.4; Addison Wesley
[6] Herold, H.: Linux- Unix- Systemprogrammierung; Addison Wesley
[7] Rubini, A.: Linux-Gerätetreiber; O’Reilly 2002
A
Die Autoren
Wilhelm Hagemeister und Torsten Finke arbeiten als Geschäftsführer und Entwicklungsingenieure in der Ingenieurgemeinschaft IgH in Essen www.igh-essen.com an Projekten
des Sondermaschinenbaus. Ein Schwerpunkt liegt im Bereich der Spezialprüftechnik. Beide
Autoren verfügen über langjährige und umfangreiche Erfahrungen mit Linux. Bei Interesse an den Quelltexten möge man sich mit den Autoren in Verbindung setzen.
18