HoLiCS

Technische Dokumentation

Inhaltsverzeichnis

  1 Einführung

2  Die Programmteile

2.1 Das Hauptprogramm

  2.1.1  Klassenstruktur

  2.1.2 Funktionsprinzip

2.2   Implementation der CAN-Kommunikation

  2.2.1   Einbinden eines neuen CAN-Gerätes

  2.2.2   Einbinden des zweiten CAN-Busses

2.3 Die Low-Level Hardware-Treiber

  2.3.1  Hardwarekomponenten

  2.3.2  Linux-Besonderheiten

  2.3.3 Funkuhr

 2.3.4 Winkelencoder

 2.3.5 CAN-Interface 

 3 Anhang

 3.1 Bedienung des Programms

 3.1.1 Ergänzung zum Setzen neuer Zielkoordinaten

3.2 Konfigurationsdateien

3.3 Regelmäßige Wartungsaufgaben

3.3.1 Beobachtungsparameter einstellen

3.3.2 Schaltsekunden: Neue SLALIB-Version

3.3.3 Jedes Jahrhundert

3.4 Organisation der HoLiCS-Dateien

3.4.1 Neue Dateien und Verzeichnisse hinzufügen

3.5 Entwicklungsumgebung

3.6 Build-Prozeß (make)

3.7 Versionskontrolle (cvs)

3.8 Automatische Dokumentationsgenerierung (Doxygen) 

3.9 Systemvoraussetzungen 18

3.10 Verwendete Bibliotheken 19

3.11 Konfiguration der Lenze-Servoumrichter 20

3.12 Kalibration der Motor-Koordinaten 20

1 Einführung

Dieses Dokument beschreibt die interne Struktur und Funktionsweise des neuen Steue­rungssystems „HoLiCS“ (Hoher List Control System) für das 1m-Cassegrain-Teleskop am Observatorium Hoher List der Universität Bonn.

Die Software des Systems ist in C/C++ geschrieben und läuft auf einem Pentium-PC unter Linux, der mit CAN-Bus- und Winkelencoder-Interfacekarten sowie einer Funk­uhrenkarte ausgerüstet ist.

Im folgenden werden die einzelnen Software-Module vor allem im Hinblick auf ihr Zusammenwirken besprochen; die aus speziell formatierten Quelltext-Kommentaren erzeugte Referenz-Dokumentation ist auf dem Entwicklungsrechner verfügbar unter file:///HOLICS/src/backend/doc/doxygen/html/index.html .
 
 
  

 

2 Die Programmteile


Im wesentlichen besteht die Software des Steuerungssystems aus einem monolithischen Programm (namens backend 1 ), welches als einzelner Prozeß (single threaded) ausge­führt wird. Innerhalb dieses Prozesses erfolgt sowohl die astronomische Positionsbe­rechnung, die Hardware-Ansteuerung, als auch die Interaktion mit dem Benutzer.Das Steuerprogramm ist weitgehend nach objektorientierten Grundsätzen entworfen worden 2 . Die bereits vorhandenen oder an Linux angepaßten Hardware-Treiber sind durch Wrapper-Klassen gekapselt worden, um die Handhabung zu vereinfachen und die Übersichtlichkeit des Systems zu erhöhen.

Nachfolgend wird zunächst ein Überblick über die Klassenstruktur gegeben und die prinzipielle Funktionsweise des Systems anhand des Zusammenspiels der wichtigsten Klassen erläutert. Insbesondere wird der Ablauf der CAN-Kommunikation dargestellt , da diesem Punkt im Hinblick auf hardwareseitige Erweiterungen (Handset, Kuppel-, Fokussteuerung) besondere Bedeutung zukommt. Schließlich folgen einige Informa­tionen zu den Hardware-Treibern.

2.1 Das Hauptprogramm

2.1.1 Klassenstruktur

Das folgende Diagramm zeigt die im System verwendeten Klassen und ihre Bezie­hungen in UML-Notation 3 :


 
 

Die „Schaltzentrale“ ist die Klasse Telescope. Sie beinhaltet die zentrale Steuer­schleife control_loop() und ist damit für die Koordination und Ablaufsteuerung des gesamten Systems verantwortlich. Des weiteren übernimmt sie die astronomische Positionsberechnung 4 . Sehr eng mit ihr verwoben 5 ist die Klasse Telescope­View­Controller. Sie ist für die Benutzerschnittstelle zuständig, d. h. sie zeigt den Systemzustand auf dem Bildschirm an und nimmt Eingaben des Benutzers entgegen.

Auf der rechten Seite des Diagramms befinden sich die für die CAN-Kommunikation verantwortlichen Klassen. Im Hinblick auf CAN-basierte Hardware-Erweiterungen ist hier zunächst die Vererbungsstruktur dieser Klassen wesentlich: LenzeMotor (z. Zt. die einzige konkrete Implementierung eines CAN-Gerätes) erbt von CANopen_­Device , das wiederum von CAN_Device abgeleitet ist (beides abstrakte Basis-Klassen 6 ). Nach diesem Schema können auch weitere CAN- bzw. CANopen-Geräte in das System integriert werden.

Für jede physisch vorhandene Geräteart existiert in der Software eine entsprechende Klasse - und für jedes Gerät ein Objekt (eine Instanz) der jeweiligen Klasse (DCFClock, HeidenhainEncoder , LenzeMotor, CAN_Controller). Teilweise sind diese konkreten Geräteklassen von abstrakten Basisklassen abgeleitet, die die Schnittstellen definieren bzw. grundlegende Funktionen für die abgeleiteten Klassen bereitstellen (z. B. Encoder, CAN_Device , CANopen_Device).

Daneben existieren noch Hilfsklassen, z. B. ein PID-Controller sowie austauschbare Pointing-Modelle.

Die *_Exception-Klassen dienen zur strukturierten Fehlerbehandlung. So kann z. B. eine Timeout-Bedingung in einem umgebenden try...catch -Block abgefangen und bearbeitet werden (siehe z. B. Telescope­View­Controller::update­Screen() ).

Anmerkung: Die Stereotypen „Publisher“ bzw. „Subscriber“ bei CAN_Controller und CANopen_Device weisen darauf hin, daß das Zusammenspiel dieser Klassen dem „Publisher-Subscriber-Muster“ folgt, siehe z. B. [4], [2].

2.1.2 Funktionsprinzip

Den Kern des Steuerprogramms bildet eine Schleife (die sog. „control loop“) in der Telescope-Klasse, die periodisch mit einem festen Zeittakt (z. Zt. 50ms) wiederholt wird.

Darin werden nacheinander die Positionsberechnung durchgeführt, die aktuelle Position gemessen, die Bildschirmanzeige aktualisiert, anstehende CAN-Nachrichten verarbeitet, die Motoren gesteuert und schließlich Tastatureingaben verarbeitet.

Die folgende Grafik zeigt noch einmal die Geräte-Klassen und -Objekte, mit denen die Telescope-Klasse direkt kooperiert:
 
 


Abbildung 1
 

Abbildung 1: Kollaboratoren der Telescope-Klasse.
Die Beschriftungen der gestrichelten Beziehungs-Pfeile geben die Instanz-Variablen an, über die der Zugriff auf das entsprechende Objekt der angegebenen Klasse erfolgt. Die unbe­schrifteten, durchgezogenenen Pfeile stellen die Vererbungsbeziehungen dar.

Die Kommunikation der Telescope-Klasse mit allen Kollaboratoren läuft synchron ab, d. h. mittels normaler Funktions- bzw. Methodenaufrufe. Daher darf die gesamte Laufzeit aller aufgerufenen Methoden nicht über der Periodendauer der Steuerschleife liegen.

Im folgenden wird gezeigt, wie die die Kommunikation über den CAN-Bus in die Steuerschleife integriert ist.

2.2 Implementation der CAN-Kommunikation

Die Objektstruktur für die Realisation der CAN-Kommunikation spiegelt die physische Struktur des CAN-Systems wider: Es existiert jeweils ein Objekt für den CAN-Bus und jedes angeschlossene Gerät.

Ein Objekt der Klasse CAN_Controller kümmert sich um Empfang und Versand von Nachrichten über den physischen CAN-Bus. Bei jedem Aufruf der dispatch()-Methode wird geprüft, ob beim physischen CAN-Controller neue Nachrichten (Klasse: CAN_Message ) eingegangen sind. Falls ja, werden sie dort abgeholt und an die Ge­räte-Objekte verteilt, die sich für den Empfang von Nachrichten mit der entsprechenden ID angemeldet haben, indem deren receive()-Methode mit der Nachricht als Pa­rameter aufgerufen wird.

Welche Nachrichten (IDs) die Geräte-Objekte empfangen wollen, teilen sie dem CAN_Controller-Objekt mit Hilfe der subscribe() -Methode mit. Diese kann z. B. im Konstruktor des Geräte-Objektes aufgerufen werden. (Eine Nachricht kann also auch von mehreren Geräten empfangen werden.) Über die unsubscribe()-Methode können sich die Geräte-Objekte auch wieder beim CAN-Controller ab­melden. Dies geschieht übrigens automatisch im Destruktor von CAN_Device , so daß davon abgeleitete Klassen sich nicht darum kümmern müssen.

Für das Senden von Nachrichten zum CAN-Bus stellt die Geräte-Oberklasse CAN_Device die send()-Methode bereit. Diese reicht die Nachricht an das zu dem Geräte-Objekt gehörige CAN_Controller-Objekt weiter, das sie schließlich an die Hardware sendet.

Zur Fehlerbehandlung: Falls die Nachricht nicht abgesetzt werden konnte (z. B. wegen eines Bus-Fehlers), wird eine CAN_Send_Exception geworfen.

2.2.1 Einbinden eines neuen CAN-Gerätes

Um ein neues CAN-Gerät in die Software einzubinden, sind folgende Schritte nötig:

2.2.2 Einbinden des zweiten CAN-Busses

Um den zweiten CAN-Bus in Betrieb zu nehmen, braucht man nur ein neues Objekt der Klasse CAN_Controller zu instanziieren und dieses den Konstruktoren der für an diesem Bus angeschlossene Geräte zuständigen Objekte als Argument zu übergeben.

Natürlich muß nun noch regelmäßig (z. B. in Telescope::control_loop() ) die dispatch()-Methode des neuen Controller-Objektes aufgerufen werden, um eventuell über den CAN-Bus empfangene Nachrichten an die Geräte-Objekte weiterzu­reichen.

Sollen an diesem Bus CANOpen-Geräte betrieben werden, muß zudem regelmäßig die sendSync()-Methode aufgerufen werden, um die für die PDO-Kommunikation er­forderliche Synchronisation sicherzustellen.

2.3 Die Low-Level Hardware-Treiber

Als „Low-Level-Treiber“ werden hier die Treiber bezeichnet, die direkt auf die Hardware zugreifen. Sie befinden sich in der Verzeichnishierarchie oberhalb des Steu­erprogramms unter „drivers“, also typischerweise: /HOLICS/src/drivers.

Da es wesentlich weniger Aufwand bedeutet, die Hardware direkt aus dem Steuerpro­gramm heraus anzusprechen, als vollständige Linux-Gerätetreiber für den Kernel-Modus zu erstellen, werden die meisten Geräte auf diese Weise angesteuert 7 . Eine Ausnahme bildet das CAN-Interface. Hierfür stand bereits ein fertiger Linux-Geräte­treiber zur Verfügung.

Für Implementierungsdetails der Low-Level-Treiber sei auf die Hardware-Dokumen­tation der Hersteller bzw. die im Quelltext mitgelieferten Treiberprogramme verwiesen. Für den Betrieb unter Linux wurde hier nur die Syntax der Port-I/O-Funktionen angepaßt.

2.3.1 Hardwarekomponenten

Die Hardware des neuen Steuerungssystems besteht aus folgenden Komponenten (siehe auch Diplomarbeit P. Hirsch / AG-Poster 1999 u. 2000, P. Hirsch, K. Reif, Ph. Müller):

2.3.2 Linux-Besonderheiten

Unter Linux kann man aus dem User-Mode heraus fast genau so einfach per Port-I/O auf die Hardware zugreifen wie unter DOS bzw. Windows (allerdings nur mit „root“-Privilegien).

Da einige Abläufe beim Hardware-Zugriff zeitkritisch sind (insbesondere die I2C-Bus-Ansteuerung bei der Initialisierung der Heidenhain-Encoder), funktioniert die Hardware-Steuerung aus dem User-Mode in diesen Fällen nur dann zuverlässig, wenn der POSIX-Real-Time-Scheduler von Linux mit der SCHED_FIFO Scheduling Policy eingesetzt wird. Dabei läuft die Zeitscheibe des betroffenen Prozesses nur dann ab, wenn dieser blockierend wartet (z. B. bei Ein-/Ausgaben) oder ein höher priorisierter Real-Time-Prozeß lauffähig wird. Der Prozeß wird allerdings immer noch vom Kernel zur Bearbeitung von Inter­rupts unterbrochen. Das läßt sich nur im Kernel-Mode verhindern. Details zum Scheduler finden sich in [3], weitere Informationen zur Hardware-Ansteuerung unter Linux in [5] und [1].

2.3.3 Funkuhr

Der Treiber für die Funkuhr des Typs Hopf 6036 ist in der Klasse DCFClock reali­siert. Diese greift direkt per Port-I/O auf die Hardware der Uhr zu. Die Dokumentation der Harware befindet sich im Verzeichnis file:///HOLICS/doc/Hardware/Hopf .

2.3.4 Winkelencoder

Der Low-Level-Treiber für die Heidenhain-Winkelencoder-Interfacekarte IK-121 ist eine modifizierte Version der mitgelieferten DOS-Treiber. Für weitere Informationen sei auf die Dokumentation zur IK-121 und auf die Quelltextdateien von Heidenhain verwiesen.

Da einige Abläufe in diesem Treiber (insbesondere bei der I 2C-Bus-Kommunikation während der Initialisierung) zeitkritisch sind, ist er nur unter dem SCHED_FIFO-Scheduler lauffähig.

2.3.5 CAN-Interface

Für die Ansteuerung des Phytec CAN-Interfaces (basierend auf dem Philips SJA-1000) wird der Linux-Kern-Gerätetreiber von Heiko Wolf eingesetzt. Dieser wurde so modi­fiziert, daß er unter Linux-Kernen der Version 2.2.x funktioniert (ursprünglich war er für 2.0.x vorgesehen).

Dieser Treiber stellt zwei Devices zur Verfügung: /dev/can0, /dev/can1

Auf diese Devices wird mittels normaler Datei-Ein/Ausgabe-Befehle zugegriffen, um CAN-Messages zu senden bzw. zu empfangen. Die Messages selbst müssen dafür allerdings im SJA-1000-spezifischen Binärformat vorliegen (siehe http://www.semi­conductors.com/pip/SJA1000/N1 ).

Auf diesem Treiber setzt die CAN_Controller-Klasse auf, um die CAN-Kommuni­kation zu vereinfachen.
 
 
 

3 Anhang

3.1 Bedienung des Programms

Hinweise zur Bedienung des Steuerprogramms finden sich in der „HoLiCS-Kurzanleitung“.

3.1.1 Ergänzung zum Setzen neuer Zielkoordinaten

Neben den in der Kurzanleitung genannten Koordinatensystemen für die Zielkoordinaten gibt es noch ein weiteres, das ausschließlich für technische Zwecke sinnvoll ist:

Zielpositionen lassen sich im Encoder-System angeben, indem den Koordinaten der Buchstabe „E“ vorangestellt wird:

E <deg_HA> <min_HA> <sec_HA> <deg_DEC> <min_DEC> <sec_DEC>

Die Koordinaten werden für beide Achsen im Bogenmaß angegeben.

Achtung: Im Encoder-System eingegebene Zielkoordinaten werden nicht auf Zulässigkeit geprüft – Man kann das Teleskop so also leicht in die Endschalter fahren!

3.2 Konfigurationsdateien

Zur Zeit verwendet HoLiCS einfache Textdateien zur Speicherung der Konfigurati­onsdaten 8 und Programmparameter. Diese Dateien werden in dem Verzeichnis gesucht - und bei Bedarf angelegt - von dem aus das Steuerprogramm gestartet wurde.

Einige Parameter können noch nicht über die Benutzerschnittstelle interaktiv gesetzt werden. Diese müssen von Hand in der Datei „ Observation.dat“ eingetragen werden.

Diese Parameter sind: Die atmosphärischen Bedingungen (Druck, Temperatur, rel. Luftfeuchte), beobachtete Wellenlänge und DUT, die Zeitdifferenz zwischen UT und UTC (siehe Diplomarbeit). Normalerweise müssen diese Parameter nur für Beobach­tungen mit besonderen Anforderungen an die Positionsgenauigkeit (z. B. Langzeit-Aufnahmen in Horizontnähe oder Pointingmessungen) genau eingestellt werden; am kritischsten ist noch der Luftdruck, da sich die Refraktion proportional dazu verhält. Im Normalfall liegt die erreichbare Nachführpräzision auch ohne angepaßte Parameter deutlich über der des alten Systems. Ideal wäre natürlich eine on-line-Kopplung an eine elektronische Wetterstation.

Achtung: Die Zuordnung der Parameter erfolgt z. Zt. nur über ihre Position in der Datei. Daher sind Unstimmigkeiten zwischen Dokumentation und Quelltext sehr leicht möglich!

Reihenfolge und Einheiten der Parameter:

  1. Temperatur (K)
  2. Druck (hPa)
  3. Rel. Feuchte (Bruchteil: 1 = 100%)
  4. DUT (s)
  5. Polar Motion, X-Komponente (mas)
  6. Polar Motion, Y-Komponente (mas)
  7. Beobachtete Wellenlänge (m m (!))
Daneben gibt es noch kleine Dateien, die dazu dienen, den letzten Programmzustand nach einem Neustart wiederherzustellen. Diese sollten normalerweise nicht vom Benutzer verändert werden. Im einzelnen sind dies:

3.3 Regelmäßige Wartungsaufgaben

3.3.1 Beobachtungsparameter einstellen

Vor jeder Beobachtung, bei der es auf höchstmögliche Positionsgenauigkeit ankommt (z. B. für die Erstellung neuer bzw. die Verbesserung bestehender Pointing-Modelle) sollte der aktuelle Zeitoffset D UT (aus dem IERS Bulletin A, siehe Diplomarbeit) in der Konfigurationsdatei eingetragen werden (s. o.). Geschieht dies nicht, resultiert ein für die jeweilige Nacht konstanter Offset in RA von maximal 15´´. Allerdings verändert sich DUT nur relativ langsam (typisch: <= 1s / Jahr), siehe Statistiken beim IERS ( http://www.iers.org ).
 
 
 

3.3.2 Schaltsekunden: Neue SLALIB-Version

Wichtig: Bei jeder Einfügung einer Schaltsekunde muß die SLALIB-Bibliothek (oder zumindest die darin enthaltene Datei dat.c, die die Funktion sla_dat() zur Berechnung der Differenz DAT=TAI-UTC enthält) auf den neuesten Stand gebracht - und das Steuerprogramm neu übersetzt bzw. gelinkt - werden (da Schaltsekunden nicht vorhersagbar sind). Andernfalls resultiert ein RA-Fehler von 15´´ bei einer verpaßten Schaltsekunde. Eine Alternative zu dieser manuellen Wartung wäre die automatische Übertragung und Auswertung der entsprechenden IERS Bulletins, in denen neben DUT auch DAT angegeben ist.

3.3.3 Jedes Jahrhundert

Nicht zu vergessen: Zu beginn eines jeden neuen Jahrhunderts muß die Konstante century_base im Funkuhrentreiber dcfclock.cc angepaßt werden ;-)

3.4 Organisation der HoLiCS-Dateien

Die gesamten Dateien zu HoLiCS befinden sich im Verzeichnis /HOLICS (typischer­weise ein Link, z. B. auf /home/ccd/HOLICS ).

Die Dokumentation zum Gesamtsystem findet sich unter /HOLICS/doc ,

die Referenzdokumentation zum Hauptprogramm „backend“ unter /HOLICS/src/doc/backend/doxygen.

Die Quelltextdateien sind den Aufgaben nach in verschiedenen Verzeichnissen unterhalb von /HOLICS/src ab­ge­legt:
 
  • backend 
Hauptprogramm, Initialisierung, Utilities
  • Telescope 
Teleskopsteuerung
  • CAN 
CAN-Bus Ansteuerung
  • Motors 
Motorsteuerung
  • Encoders 
Encoder-Ansteuerung
  • drivers 
Low-Level Hardware-Treiber
  • clock 
  • hopf 
Treiber-Klasse für Hopf-Funkuhr
  • encoders 
  • Heidenhain 
Adaptierte DOS-Treiber für Heidenhain-Encoder
  • motors 
  • Lenze 
(nur Daten-Files von Lenze, keine Treiber)
  • slalib 
SLALIB - Positionsastronomische Routinensammlung
  • tpm 
TPM - Positionsastronomische Routinensammlung
  • Utils 
Hilfs-Routinen (libgpl, ...)

  3.4.1 Neue Dateien und Verzeichnisse hinzufügen

Wenn man neue Dateien und Verzeichnisse zum Quelltext hinzufügt, müssen diese an folgenden Stellen eingetragen werden, damit sie beim Übersetzungsvorgang und bei der Dokumentationserstellung berücksichtigt werden:
  1. Im Makefile: Die Dateinamen dem Eintrag „SRCS= “ (für Sources) hinzufügen. (Anschließend „make depend“ ausführen, um die Abhängigkeiten auf den neuesten Stand zu bringen.)
  2. Im „Doxyfile“: Neue Verzeichnisse unter „Input=“ eintragen.
  3. Versionskontrollsystem: cvs add <Dateiname>

3.5 Entwicklungsumgebung

Für die Entwicklung kann z. B. die freie Entwicklungsumgebung „Source Navigator“ (siehe http://sources.redhat.com ) eingesetzt werden. Dafür existiert bereits ein sog. Projekt-File („ backend.proj“).

Starten des Source Navigators:

snavigator /HOLICS/src/backend/backend.proj

Der Name der Projektdatei kann auch entfallen; dann wird eine Auswahlliste der zuletzt bearbeiteten Projekte angezeigt.

3.6 Build-Prozeß (make)

Zur Automatisierung des Build-Prozesses wird GNU-make eingesetzt.

Ein neues Executable läßt sich durch einen Aufruf von

make
im Verzeichnis /HOLICS/src/backend erstellen.

Die Referenz-Dokumentation wird erst durch einen Aufruf von

        make doc
im Quelltextverzeichnis mit der Konfigurationsdatei „Doxyfile “ (z. B. /HOLICS/src/backend) erzeugt.

Der Window-Manager auf dem Datenaufnahme-PC im Rechnerraum von Turm 6 ist so konfiguriert, daß unter dem Menüpunkt „Astro“ das Executable ausgeführt wird, wel­ches sich unter

/HOLICS/src/backend.working/backend

befindet.

Daher muß das entstandene Programm nach dem Test noch dorthin kopiert – und mit den notwendigen root-Rechten ausgestattet – werden. Dazu sind folgende Schritte nötig (als root):

cd /HOLICS/src/backend
cp backend ../backend.working
cd ../backend.working
chmod u+s backend

Achtung: Die verwendeten Bibliotheken (slalib, tpm, ...) werden bei diesem Vorgehen nicht neu übersetzt. Falls dies aus irgendeinem Grund nötig sein sollte (z. B. zur Feh­lerbeseitigung), muß die jeweilige Bibliothek entsprechend der zugehörigen Dokumen­tation übersetzt werden. Danach muß das Steuerprogramm wie beschrieben neu über­setzt bzw. gelinkt werden.

3.7 Versionskontrolle (cvs)

Zur Versionsverwaltung wird GNU cvs eingesetzt. Der Quelltext des Steuerungssys­tems ist mitsamt dem der verwendeten Bibliotheken in einem CVS-Repository gespei­chert.

Zur Zeit befindet sich das aktuelle Repository auf dem UPC81 unter

/home/ccd/CVSROOT.

3.8 Automatische Dokumentationsgenerierung (Doxygen)

Die Referenzdokumentation zur Software wird automatisch aus speziell formatierten Kommentaren im Source-Code erzeugt. Dafür wird das frei verfügbare Dokumenta­tionssystem „Doxygen“ eingesetzt. Dessen Dokumentation findet sich unter:
http://www.stack.nl/~dimitri/doxygen/index.html

Dort ist sowohl das Format der Quelltextmarkierungen als auch der Aufbau der Konfi­gurationsdatei "Doxyfile" beschrieben.

Die erzeugte Dokumentation kann in verschiedenen Formaten ausgegeben werden, u. a. HTML, Unix man-pages, RTF, LaTeX.

Zum Aktualisieren der Dokumentation siehe Abschnitt   "Build-Prozeß (make)" .

3.9 Systemvoraussetzungen

Kernel

Das System wurde bisher mit den Kernel-Versionen 2.0.36 und 2.2.10 un­ter SuSE-Linux 6.2 getestet.
 

Bibliotheken

Die benötigten Bibliotheken werden im nächsten Abschnitt einzeln be­sprochen.

3.10 Verwendete Bibliotheken

Allgemein: Positionsastronomie:
Die TPM ist ein endlicher Automat für astronomische Positionsberechnungen. Sie wurde von Jeffrey W. Perival ursprünglich für das WIYN-Teleskop entwi­ckelt. Der Autor hat sie uns freundlicherweise für den Einsatz in HoLiCS zur Verfügung gestellt.

Sie wurde auf der ADASS III vorgestellt, siehe ASP Conference Series, Vol. 61, 1994. Dieser Artikel ist auch online verfügbar:
http://cadcwww.dao.nrc.ca/ADASS/adass_proc/adass3/papers/percivalj/percivalj.html

3.11 Konfiguration der Lenze-Servoumrichter

Die Dokumentation zu den Lenze-Servo-Umrichtern ist auf dem Entwicklungsrechner verfügber unter file:///HOLICS/doc/Hardware/Lenze/93_start.pdf .

Um einen möglichst gleichmäßigen Rundlauf zu erhalten, wird (wie von Lenze vorge­schlagen) die Grundkonfiguration „Leitfrequenzkaskade / Master“ eingesetzt,

da in dieser Konfiguration der Winkelregler aktiv ist.

Die verwendeten Steuerungsparameter (z. B. Proportionalfaktor des Winkelreglers) sind in einer relativ frühen Phase des HoLiCS-Projektes durch Ausprobieren (über manuelle Parameteränderungen am Bedienfeld) ermittelt worden. Mit Hilfe ausführlicher programmgesteuerter Meßreihen dürften daher noch Optimierungen möglich sein. (Ähnliches gilt aufgrund der wechselseitigen Beeinflussung damit auch für die Para­meter der von Telescope::control_loop() verwendeten PID-Controller.) Möglicherweise ist es auch erforderlich, einige Parameter, wie z. B. den maximal zulässigen Motor-Strom, dynamisch anzupassen, um z. B. Anlaufschwierigkeiten bei kaltem Wetter bzw. Schwingungsneigung bei warmem Wetter zu vermeiden.

Kopien der aktuellen Parametersätze sind in den Hand-Bedien-Einheiten sowie auf dem BUSCA-Notebook gespeichert.

3.12 Kalibration der Motor-Koordinaten

Die Koordinatensysteme der Motorsteuerungen müssen mit denen der Heidenhain-Encoder abgeglichen werden, weil Teleskopposition über die Heidenhain-Encoder gemessen wird, die Positionierung des Teleskops aber durch die Motorsteuerungen erfolgt (aufgrund von Sicherheitserwägungen, wie in der Diplomarbeit beschrieben).

Um den Nullpunkt des internen Koordinatensystemn der Lenze-Motorsteuerungen mit dem der Teleskopachsen (Heidenhain-Encoder) abzugleichen, muß man – so lange noch keine automatische Kalibration implementiert ist – wie folgt vorgehen:

Voraussetzung für das folgende Vorgehen ist, daß die Heidenhain-Encoder kalibriert sind, d. h. der Zähler-Anteil der gemessenen Koordinaten null ist, wenn die Encoder auf der Referenzmarke stehen 9 .

Zunächst fährt man das Teleskop so, daß die Heidenhain-Encoder auf ihrer jeweiligen Referenzmarke stehen:

  1. Steuerprogramm starten und Teleskop in Betrieb nehmen wie in der Kurzanleitung beschrieben.
  2. Als neue Zielkoordinaten eingeben: „E 0 0 0 0 0 0“ und Ziel aktivieren.

  3. Damit werden beide Achsen auf den Nullpunkt des jeweiligen Encoders positioniert – also auf die Referenzmarke.
  4. Prüfen, ob Referenzposition erreicht ist: Wenn die Referenzmarke erreicht ist, springt die „Refmark Level“-Anzeige der jeweiligen Achse auf „1“. Wenn die erreichte Position sehr weit von der Referenzposition entfernt ist,
  5. Ziel deaktivieren (Nachführung ausschalten)
  6. Motorfreigaben sperren.
  7. Interne Motorposition auf Null zurücksetzen.

  8. Dazu muß der „REF-MARK“-Eingang des REF-Blocks (siehe Lenze-Dokumentation) eine steigende Flanke aufweisen.
    Die Steuerungen sind z. Zt. so konfiguriert, daß dieser Eingang auf das Anschluß-Terminal gelegt ist. Die geforderte steigende Flanke läßt sich also erzeugen, indem man mit einem Draht die Anschlüsse „ X5/A1 “ und „ X5/E2 “ kurzzeitig miteinander verbindet. (Die frühere Beschreibung ist fehlerhaft: X5/28 = Freigabe hat nur bei Schalterstellung „Hand“ High-Pegel, d.h. bei gesperter Motorfreigabe hat die Verbindung X5/28 - X5/E2 keine Wirkung! )
    Mit Hilfe des Global-Drive-Control-Programmes kann man den Erfolg kontrollieren: Das Feld „REF-ACTPOS“ im REF-Block enthält die aktuelle Motorposition und sollte nach dem Zurücksetzen um den Wert 0 schwanken.

 

Danach kann das Teleskop wieder wie gewohnt betrieben werden.
 
 
 
 
 

Literatur

[1] Beck, Michael et al., Linux-Kernelprogrammierung, 1998

[2] Buschmann, Frank et al., Pattern-Orientierte Softwareentwicklung, 1998

[3] Gallmeister, Bill, Programming for the real world, 1995

[4] Gamma, Erich, et al., Entwurfsmuster, 1996

[5] Rubini, Alessandro, Linux Gerätetreiber, 1998

[6] Stroustrup, Bjarne, Die C++-Programmiersprache, 2000
 
 
 

Stichwortverzeichnis

CAN

Interface 12

SJA-1000 12

control_loop() 6

CTASSERT 19

cvs 16, 18

Doxyfile 16ff

Doxygen 18

Encoder-System 13

Kalibration 20

Kernel 18

LIBGPL 19

make 17

make

Makefile 16

NCURSES 19

Real-Time

POSIX-Real-Time-Scheduler 11

SCHED_FIFO 11

REF-Block 21

Referenz-Dokumentation 4

Referenzmarke 21

REF-MARK 21

Schaltsekunde 15

SLALIB 19

STL 19

Telescope-Klasse 6

TelescopeViewController-Klasse 7

TPM 19
 

 
 

Ursprünglich war eine Aufteilung des Systems in Back-End (für Positionsastronomie und Hardware-Ansteuerung) sowie (evtl. mehrere) Front-Ends (für die Benutzer-Inter­aktion bzw. für Batch-Steuerung) geplant (daher auch der Name des Executables). Im Zuge einer möglichen Erweiterung des Systems um eine graphische Benutzerschnitt­stelle wäre es sicher sinnvoll, diese Aufteilung nachträglich vorzunehmen, um mehrere GUIs gleichzeitig an verschiedenen Orten ablaufen lassen zu können - zumindest im Anzeige-Betrieb (z. B. Haupt-Haus, Rechnerraum und evtl. Kuppel - bzw. sogar entfernt in Bonn für Wartungs- oder Diagnosezwecke).

Bedingt durch die Entwicklungshistorie ist die Objektorientierung nicht überall konsequent durchgehalten worden. Ein konsequent objektorientiertes Redesign der betroffenen Stellen dürfte Verständlichkeit und Robustheit des Systems deutlich verbessern.

Unified Modeling Language - näheres z. B. unter http://www.rational.com/uml

Im Hinblick auf eine bessere „Separation of Concerns“ (um das System einfacher und verständlicher zu machen) sollte diese Funktionalität möglichst ausgelagert werden.

TelescopeViewController ist als „friend“ von Telescope deklariert, hat also Zugriff auf dessen private Elemente. Dies rührt daher, daß sie aus der Aufteilung der Te­lescope-Klasse entstanden ist. Diese enge Kopplung sollte nach Möglichkeit bei einer zu­künftigen Bearbeitung des Quelltextes aufgehoben werden, um die Robustheit des Systems zu erhöhen.

Näheres zu abstrakten Basisklassen siehe [6].

Dieses Vorgehen hat den Nachteil, daß man nicht ohne das Steuerprogramm auf die Ge­räte zugreifen kann; insbesondere kann man die Standard-Unix-Tools nicht für Debug­ging- oder Konfigurations-Zwecke einsetzen.

Eine einfache Möglichkeit, eine bessere, sicherere und bedienerfreundlichere Verwaltung der Konfigurationsdateien (z. B. im .INI-Format) zu realisieren, bietet die „parsecfg“-Bi­bliothek von Yuuki NINOMIYA ( http://www.enjoy.ne.jp/~gm/program/parsecfg/ ).

Wie man diese Kalibration durchführt, ist in der Kurzanleitung beschrieben (Referenzmarken bei eingeschalteter Referenzmarken-Suche überfahren). Sollten die Koordinatensysteme jemals so weit voneinander abweichen, daß dieses Verfahren nicht praktikabel ist, muß man die Referenzmarken-Suche starten und die Motoren manuell steuern (z. B. mit Hilfe des Global-Drive-Control-Programmes von Lenze), um die Referenzmarken zu überfahren.

P. Hirsch - (Version: 13.09.2001,Henning Poschmann)
1

 

2
 

3
 

4
 

5
 

6
 

7
 

8
 

9