Mobiler Schaukasten (Aufzug) als Schattenbahnhof

Ansicht alter Aufzug von 1990

Projektbeschreibung

Beim Bau einer N-Spur (1:160) Modellbahnanlage 1989/90 wurde schon die Idee umgesetzt, einen mobilen Schaukasten mit 10 Gleisen als Schattenbahnhof zu nutzen. Der Schaukasten wurde wie ein Aufzug an der Wand verfahrbar angebracht und je nach Position konnte der entsprechende Zug auf die Anlage fahren. Der Kasten wurde an der Wand durch zwei Alu-Rohre geführt, der Antrieb erfolgte mittels Gewindestange über einen alten Scheibenwischermotor. Dieser prinzipielle Aufbau wurde bis heute beibehalten und ist auf dem nebenstehenden Bild zu erkennen.

Bei der ersten Ausführung erfolgte die elektrische Ansteuerung manuell über einen Wahlschalter für die Etagen und zwei Tasten für die AUF- und AB-Fahrt. Problematisch war jedoch immer der Schienenübergang vom Schaukasten zur Bahn. Bei einer Spurweite von nur 9 mm machte sich natürlich jede horizontale und vertikale Abweichung negativ bemerkbar. Ungenauigkeiten von ca. 1 mm beim Gleisübergang waren auch bei präzise ausgeführter Mechanik nicht vermeidbar und führten natürlich zu Entgleisungen.

Im Laufe der Jahre wurde immer wieder an diesem Problem „gefeilt“, letztlich aber ohne ein zufriedenstellendes Ergebnis. Im Rahmen der Digitalisierung der gesamten Anlage wurde das Projekt nochmals neu aufgegriffen und sowohl mechanisch wie auch elektrisch eine neue Lösung gefunden.

Ausführung mit manueller Betätigung

Mechanischer Aufbau

Mechanik des alten Aufzugs Der Rahmen des Aufzugskastens wurde aus 18 mm Sperrholz in einer Breite von 100 mm mit den Aussenabmessungen B = 720 mm und H = 630 mm gefertigt. Die Rückwand wurde auf einer Tiefe von 65 mm eingezogen. Somit war im hinteren Bereich genug Platz für die Rohrführung sowie die Verdrahtung gegeben, im vorderen Bereich stand eine Breite von 50 mm für die Schienenführung und 15 mm für die Aufnahme einer Glasscheibe zur Verfügung.

Die nebenstehende Abbildung zeigt den rechten Rand des Kastens sowie die Schienenverbindung zur Anlage.

Die Montage des Kastens an der Wand ist aus der Abbildung im Kap. „Projektbeschreibung“ ersichtlich.

Für die Rohrführung wurden 15 mm Alu-Rohre sowie 16 mm Kunststoffrohre aus dem Baumarkt eingesetzt. Diese Kombination passte optimal zusammen und ließ sich ohne erkennbares Spiel gut ineinander verschieben. Die Kunststoffrohre wurden jeweils rechts und links hinten in den Schaukasten eingeklebt. Die Alu-Rohre wurden mit aus Holz gefertigten Abstandshaltern an der Wand befestigt. Hierbei wurde auf eine lotrechte Montage geachtet und Unebenheiten der Wand entsprechend ausgeglichen.

Für den Antrieb wurde ein gebrauchter 12 V – Scheibenwischermotor eingesetzt. Über eine Untersetzung mit zwei Zahnrädern wirkte dieser auf eine 10 mm Gewindestange. Im hinteren Teil des Kastens war eine entsprechende Mutter befestigt, somit konnte der Kasten durch die Gewindestange AUF und AB bewegt werden.

Für jede Etage war es erforderlich, durch einen Kontakt festzustellen, wann die gewählte Etage erreicht war. Dieser Kontaktschalter wurde aus einer Kugelschreibermine mit Feder selbst gefertigt und auf dem feststehenden Teil der Anlage angebracht. Das entsprechende Gegenstück bildete ein auf jeder Etage des Kastens quer angebrachtes Drahtstück. Dieser simple Kontaktschalter funktionierte hinreichend genau und stoppte den Aufzug an der vorgewählten Etage.

Die Abweichungen beim Gleisübergang ergaben sich aus den Summe aller Ungenauigkeiten des gesamten Systems. Ein Nachjustieren war erfolglos, da allein schon der Einfluss der Raumtemperatur sich soweit auswirkte, dass das System manchmal funktionierte oder auch nicht. Die Anlage war im Dachzimmer montiert, d.h. im Sommer konnte es relativ warm werden und im Winter (der Raum wurde nicht regelmäßig benutzt und geheizt) relativ kalt. Auswirkungen auf Verzug beim Holz waren somit unvermeidbar und führten zu Verschiebungen beim Gleisübergang.

Elektrische Ansteuerung

Die elektrische Ansteuerung des Aufzugskastens wurde durch folgende Schaltung ausgeführt:

Elektrik des alten Aufzugs
  • Vorwahl der Etage (0 bis 9) über einen Drehschalter
  • Anzeige der gewählten Etage über eine 7-Segment Anzeige
  • Start des Aufzuges über Taster und Flip-Flop und Relaissteuerung des 12 V - Motors
  • Stop des Aufzuges (Reset) über Etagenschalter (Kugelschreiber-Schalter), Endschalter oben und unten oder manuell
  • Einschalten der Gleisspannung der entsprechenden Etage über Relais
  • Die grau hinterlegten Teile der Schaltung waren in das Bedienpult der Anlage integriert.

Ausführung nach Digitalisierung der Anlage

Änderungen am mechanischen Aufbau

Im Rahmen der Digitalisierung der gesamten Modellbahnanlage sollten auch die mechanischen Probleme bei der Schienenverbindung des Aufzugskastens endgültig gelöst werden.

Da alle Versuche zur Optimierung der bisherigen Ausführung fehlgeschlagen waren, konnte die Lösung nur in einer zusätzlichen Einrichtung liegen, welche nach Erreichen der angewählten Etage eine exakte Schienenverbindung an der Übergangsstelle gewährleistete. Das Prinzip dieser Justiereinrichtung bestand aus zwei Messingstäben mit bleistiftartigen Spitzen. Als Gegenstücke wurden am Aufzugskasten für jedes Gleis zwei Messingrohre zur Aufnahme der Stifte angebracht. Nach Erreichen der Gleisposition wurden die Stifte vorgefahren und es erfolgte eine automatische Zentrierung der Gleisstücke. Das war zu diesem Zweck auf dem feststehenden Teil der Anlage als Flexgleis mit der entsprechenden Mechanik „schwimmend“ gelagert.

Mechanik des neuen Aufzugs

Elektrische Ausführung nach Digitalisierung

Im Rahmen der Digitalisierung der Anlage wurde die elektrische Ansteuerung des Aufzugskastens auf Microcontroller umgestellt. Es sollten 3 Betriebsmodi verwirklicht werden:

  • Manuell Steuerung des Aufzuges über ein Bedienpanel
  • Automatische Steuerung über ein Bedienpanel
  • Automatische Steuerung über die Maus am Bildschirm

Die Automatik-Funktionen wurden über eine Conrad C-Control mit der entsprechenden Software realisiert. Der gesamte Aufbau der Schaltung gliedert sich in folgende Einzelbausteine:

  • C-Control Experimentierplatine mit Ansteuerung der Ports über Optokoppler
  • Steuerplatine für die Mechanik der Schienenverbindung
  • Platine im Aufzugsschrank für die Gleiserkennung
  • Platine für das Bedienpanel mit LCD-Display
  • Decoder Platine für die Verbindung zum Digitalsystem
  • Netzteil
Gesamtschaltung des Aufzugs

Die C-Control Experimentierplatine mit Ansteuerung der Ports über Optokoppler sowie die Steuerplatine für die Mechanik der Schienenverbindung sind in den folgenden Bildern nochmals im Detail dargestellt.

C-Control Platine Platine Schienenverbindung

Das Bedienpanel wird in der folgenden Abbildung dargestellt. Hieraus erklären sich die verschiedenen Bedienfunktionen der Anlage:

  • Links die automatische Vorwahl des Gleises
  • Rechts der manuelle „AUF“ oder „AB“ Betrieb sowie der Netzschalter
  • Mitte die Funktionen des Microcontrollers sowie das LCD-Display
Bedienpanel

Videos

Zugfahrt aus und in den Aufzug

Software

Programmablauf

Das Bedienpanel wird in der folgenden Abbildung dargestellt. Hieraus erklären sich die verschiedenen Bedienfunktionen der Anlage:

Programmablauf

Quellcode

  
'---------2---------3---------4----------5----------6---------7---------8---------9
'
'  Programm für C-Control Mega 128 zur Steuerung des Aufzuges der Modellbahn
'  =========================================================================
'
'  Projektname:         Moba_Aufzug.cprj
'  Funktionen:          - Aktuelle Position des Aufzuges lesen und auf LCD ausgeben
'                       - Tastaturbefehle erfassen und AUF / AB Bewegung einleiten
'                       - Anzeige der Bewegung auf dem LCD Display
'                       - Stop bei Erreichen der vorgewählten Position
'                       - Gleisverbindung herstellen
'  Benötigte Libs:      IntFunc_lib.cc, LCD_Lib.cc, Key_Lib.cc
'  Autor:               Karl-Josef Schneider
'  Erstelldatum:        16.11.2011
'  Letzte Bearbeitung:  11.02.2015
'---------2---------3---------4----------5----------6---------7---------8---------9

'  Zuordnung der Ports für Input und Output
'  --------------------------------------------------------------------------------
'
'       Port    Port    Zuordnung   Zuordnung           I / O   Portzustand
'               Bit     original    hier                        Passiv  Aktiv
'       ---------------------------------------------------------------------
'       D.0     24      I2C         Gleismotor ZU       Output  High    Low
'       D.1     25      I2C         Gleismotor AUF      Output  High    Low
'       E.0     32      RS232       Gleis 4             Input   High    Low
'       E.1     33      RS232       Gleis 5             Input   High    Low
'       E.4     36      SW1         Endschalter unten   Input   High    Low
'       E.6     38      SW2         Endschalter oben    Input   High    Low
'       F.0     40                  Gleis 0             Input   High    Low
'       F.1     41                  Gleis 9             Input   High    Low
'       F.2     42                  Gleis 8             Input   High    Low
'       F.3     43                  Gleis 7             Input   High    Low
'       F.4     44                  Gleis 6             Input   High    Low
'       F.5     45                  Gleis 3             Input   High    Low
'       F.6     46                  Gleis 2             Input   High    Low
'       F.7     47                  Gleis 1             Input   High    Low
'       G.3     51      LED1        Fahrmotor AUF       Input   High    Low
'       G.4     52      LED2        Fahrmotor AB        Input   High    Low

'  Variablendeklaration
'  --------------------------------------------------------------------------------
   Dim Gleis0 As Integer                     'Rückmeldewert für die Gleisposition 0
   Dim Gleis1 As Integer                     'Rückmeldewert für die Gleisposition 1
   Dim Gleis2 As Integer                     'Rückmeldewert für die Gleisposition 2
   Dim Gleis3 As Integer                     'Rückmeldewert für die Gleisposition 3
   Dim Gleis4 As Integer                     'Rückmeldewert für die Gleisposition 4
   Dim Gleis5 As Integer                     'Rückmeldewert für die Gleisposition 5
   Dim Gleis6 As Integer                     'Rückmeldewert für die Gleisposition 6
   Dim Gleis7 As Integer                     'Rückmeldewert für die Gleisposition 7
   Dim Gleis8 As Integer                     'Rückmeldewert für die Gleisposition 8
   Dim Gleis9 As Integer                     'Rückmeldewert für die Gleisposition 9
   Dim End_oben As Integer                   'Rückmeldewert für Endschalter oben
   Dim End_unten As Integer                  'Rückmeldewert für Endschalter unten
   Dim GleisZU As Integer                    'Gleiskopplung ZU
   Dim GleisAUF As Integer                   'Gleiskopplung AUF
   Dim MotorAUF As Integer                   'Fahrmotor AUF
   Dim MotorAB As Integer                    'Fahrmotor AB
   Dim Pos As Integer                        'Aktuelle Position des Aufzuges
   Dim Zeile1(12), Zeile2(12) As Char        'Display variablen definieren
   Dim Zieleingabe As Word                   'Zieleingabe über Tastatur
   Dim Taste As Integer                      'Zieletage als ASCII-Zeichen
   Dim Ziel As Integer                       'Zieletage als ASCII-Zeichen

'  Hauptprogramm
'  ================================================================================
   Sub main()

'      Input Ports definieren
'      Syntax: Port_DataDirBit(portbit,val);(val=0=in, val=1=out)
'      ----------------------------------------------------------------------------
       Port_DataDirBit(32,0)                 'PortE.0 = Eingang Rückmeldung Gleis 4
       Port_DataDirBit(33,0)                 'PortE.1 = Eingang Rückmeldung Gleis 5
       Port_DataDirBit(36,0)                 'PortE.4 = Eingang Endschalter unten
       Port_DataDirBit(38,0)                 'PortE.6 = Eingang Endschalter oben
       Port_DataDirBit(40,0)                 'PortF.0 = Eingang Rückmeldung Gleis 0
       Port_DataDirBit(41,0)                 'PortF.1 = Eingang Rückmeldung Gleis 9
       Port_DataDirBit(42,0)                 'PortF.2 = Eingang Rückmeldung Gleis 8
       Port_DataDirBit(43,0)                 'PortF.3 = Eingang Rückmeldung Gleis 7
       Port_DataDirBit(44,0)                 'PortF.4 = Eingang Rückmeldung Gleis 6
       Port_DataDirBit(45,0)                 'PortF.5 = Eingang Rückmeldung Gleis 3
       Port_DataDirBit(46,0)                 'PortF.6 = Eingang Rückmeldung Gleis 2
       Port_DataDirBit(47,0)                 'PortF.7 = Eingang Rückmeldung Gleis 1

'      Initialisierung von LCD und Tastatur
'      ----------------------------------------------------------------------------
       LCD_Init()                            'LCD Initialisieren
       LCD_ClearLCD()                        'Display löschen
       LCD_CursorOff()                       'Display Cursor ausschalten
       Key_Init()                            'Tastatur initialisieren

'      Output Ports definieren und Startbedingungen festlegen, die beim Einschalten
'      der Anlage erfüllt sein müssen
'      Syntax: Port_WriteBit(portbit,val);(val=0 >> Port=Low, val=1 >> Port=High)
'      ----------------------------------------------------------------------------
'      Der Fahrmotor muß abgeschaltet sein:
       MotorAUF = 1                          'Variable MotorAUF = Stop
       MotorAB  = 1                          'Variable MotorAB  = Stop
       Port_DataDirBit(51,1)                 'PortG.3 = Output  Fahrmotor AUF
       Port_DataDirBit(52,1)                 'PortG.4 = Output  Fahrmotor AB
       Port_WriteBit(51,MotorAUF)            'Wert MotorAUF auf Port übertragen
       Port_WriteBit(52,MotorAB)             'Wert MotorAB  auf Port übertragen
'      Der Gleismotor muß abgeschaltet sein:
       GleisAUF = 1                          'Variable GleisAUF = Stop
       GleisZU  = 1                          'Variable GleisZU  = Stop
       Port_DataDirBit(24,1)                 'PortD.0 = Output  Gleiskopplung ZU
       Port_DataDirBit(25,1)                 'PortD.1 = Output  Gleiskopplung AUF
       Port_WriteBit(24,GleisAUF)            'Wert GleisAUF auf Port übertragen
       Port_WriteBit(25,GleisZU)             'Wert GleisAB  auf Port übertragen
'      Es darf kein Ziel definiert sein, d.h. der Aufzug darf sich nicht bewegen:
       Ziel = 0                              'kein Ziel definiert

'      Endlosschleife
'      ----------------------------------------------------------------------------
       Do While (1)
          Zielsteuerung()                    'Abfrage ob Ziel erreicht ist
          Anzeige()                          'Ausgabe der Texte auf LCD-Display
          Position_zuordnen()                'Input-Ports lesen & Position zuordnen
          Tastatur()                         'Tastaturabfrage auf Eingangsbefehle
       End While

   End Sub
'  ================================================================================

'  Abfrage Rückmeldewerte Gleise 0 - 9 und Endschalter und Position zuordnen
'  ********************************************************************************
'  Die Lichtschranken für die einzelnen Gleispositionen des Aufzuges bzw. die End-
'  schalter liefern bei Aktivierung ein positives Signal(+12V). Eine Digitalanzeige
'  am Aufzug zeigt an, wenn eine Position erkannt wurde. Die entsprechenden Ports
'  sind über Optokoppler verbunden, dieser schaltet Masse durch auf den zugehörigen
'  Port, gleichzeitig wird der Schaltzustand der Ports über Leuchtdioden angezeigt.

   Sub Position_zuordnen()

'      Lesen der Eingangsports
'      ----------------------------------------------------------------------------
       Gleis0    = Port_ReadBit(40)          'F.0 Rückmeldewert Gleis 0 lesen
       Gleis1    = Port_ReadBit(47)          'F.7 Rückmeldewert Gleis 1 lesen
       Gleis2    = Port_ReadBit(46)          'F.6 Rückmeldewert Gleis 2 lesen
       Gleis3    = Port_ReadBit(45)          'F.5 Rückmeldewert Gleis 3 lesen
       Gleis4    = Port_ReadBit(32)          'E.0 Rückmeldewert Gleis 4 lesen
       Gleis5    = Port_ReadBit(33)          'E.1 Rückmeldewert Gleis 5 lesen
       Gleis6    = Port_ReadBit(44)          'F.4 Rückmeldewert Gleis 6 lesen
       Gleis7    = Port_ReadBit(43)          'F.3 Rückmeldewert Gleis 7 lesen
       Gleis8    = Port_ReadBit(42)          'F.2 Rückmeldewert Gleis 8 lesen
       Gleis9    = Port_ReadBit(41)          'F.1 Rückmeldewert Gleis 9 lesen
       End_oben  = Port_ReadBit(38)          'E.6 Rückmeldewert Endschalter oben
       End_unten = Port_ReadBit(36)          'E.4 Rückmeldewert Endschalter unten

'      Positionen in Abhängigkeit von den Eingangszuständen zuordnen
'      ----------------------------------------------------------------------------
       If End_unten = 0 Then Pos = 40: End If  'End_unten erkannt > Position = 40
       If Gleis0    = 0 Then Pos = 48: End If  'Gleis 0 erkannt   > Position = 48
       If Gleis1    = 0 Then Pos = 49: End If  'Gleis 1 erkannt   > Position = 49
       If Gleis2    = 0 Then Pos = 50: End If  'Gleis 2 erkannt   > Position = 50
       If Gleis3    = 0 Then Pos = 51: End If  'Gleis 3 erkannt   > Position = 51
       If Gleis4    = 0 Then Pos = 52: End If  'Gleis 4 erkannt   > Position = 52
       If Gleis5    = 0 Then Pos = 53: End If  'Gleis 5 erkannt   > Position = 53
       If Gleis6    = 0 Then Pos = 54: End If  'Gleis 6 erkannt   > Position = 54
       If Gleis7    = 0 Then Pos = 55: End If  'Gleis 7 erkannt   > Position = 55
       If Gleis8    = 0 Then Pos = 56: End If  'Gleis 8 erkannt   > Position = 56
       If Gleis9    = 0 Then Pos = 57: End If  'Gleis 9 erkannt   > Position = 57
       If End_oben  = 0 Then Pos = 60: End If  'End_oben erkannt  > Position = 60
       If Ziel = 35 And Pos <> 0 Then          'Wenn "AB" gewählt wurde
          Ziel = Pos + 1                       'Ziel = nächste erreichbare Position
       End If
       If Ziel = 42 And Pos <> 0 Then          'Wenn "AUF" gewählt wurde
          Ziel = Pos - 1                       'Ziel = nächste erreichbare Position
       End If

'      Textausgabe für die einzelnen Positionen festlegen
'      ----------------------------------------------------------------------------
       Select Case Pos
         Case = 40                              'Endschalter unten wurde erkannt
             MotorAB = 1                        'Variable MotorAB = Stop
             Port_WriteBit(52,MotorAB)          'Wert MotorAB auf Port übertragen
             Zeile1 = "> Stop <"                'Text Zeile 1
             Zeile2 = "  unten "                'Text Zeile 2
         Case = 48                              'Gleisposition 0 erkannt
             If GleisAUF = 1 Then               'Wenn kein Fahrbefehl erteilt
                Zeile1 = "Position"             'Text Zeile 1
                Zeile2 = "Gleis  0"             'Text Zeile 2
             End If
         Case = 49                              'Gleisposition 1 erkannt
             If GleisAUF = 1 Then               'Wenn kein Fahrbefehl erteilt
                Zeile1 = "Position"             'Text Zeile 1
                Zeile2 = "Gleis  1"             'Text Zeile 2
             End If
         Case = 50                              'Gleisposition 2 erkannt
             If GleisAUF = 1 Then               'Wenn kein Fahrbefehl erteilt
                Zeile1 = "Position"             'Text Zeile 1
                Zeile2 = "Gleis  2"             'Text Zeile 2
             End If
         Case = 51                              'Gleisposition 3 erkannt
             If GleisAUF = 1 Then               'Wenn kein Fahrbefehl erteilt
                Zeile1 = "Position"             'Text Zeile 1
                Zeile2 = "Gleis  3"             'Text Zeile 2
             End If
         Case = 52                              'Gleisposition 4 erkannt
             If GleisAUF = 1 Then               'Wenn kein Fahrbefehl erteilt
                Zeile1 = "Position"             'Text Zeile 1
                Zeile2 = "Gleis  4"             'Text Zeile 2
             End If
         Case = 53                              'Gleisposition 5 erkannt
             If GleisAUF = 1 Then               'Wenn kein Fahrbefehl erteilt
                Zeile1 = "Position"             'Text Zeile 1
                Zeile2 = "Gleis  5"             'Text Zeile 2
             End If
         Case = 54                              'Gleisposition6 erkannt
             If GleisAUF = 1 Then               'Wenn kein Fahrbefehl erteilt
                Zeile1 = "Position"             'Text Zeile 1
                Zeile2 = "Gleis  6"             'Text Zeile 2
             End If
         Case = 55                              'Gleisposition 7 erkannt
             If GleisAUF = 1 Then               'Wenn kein Fahrbefehl erteilt
                Zeile1 = "Position"             'Text Zeile 1
                Zeile2 = "Gleis  7"             'Text Zeile 2
             End If
         Case = 56                              'Gleisposition 8 erkannt
             If GleisAUF = 1 Then               'Wenn kein Fahrbefehl erteilt
                Zeile1 = "Position"             'Text Zeile 1
                Zeile2 = "Gleis  8"             'Text Zeile 2
             End If
         Case = 57                              'Gleisposition 9 erkannt
             If GleisAUF = 1 Then               'Wenn kein Fahrbefehl erteilt
                Zeile1 = "Position"             'Text Zeile 1
                Zeile2 = "Gleis  9"             'Text Zeile 2
             End If
         Case = 60                              'Endschalter oben wurde erkannt
             MotorAUF = 1                       'Variable MotorAUF = Stop
             Port_WriteBit(51,MotorAUF)         'Wert MotorAUF auf Port übertragen
             Zeile1 = "> Stop <"                'Text Zeile 1
             Zeile2 = "  oben  "                'Text Zeile 2
         Else                                   'Wenn keine Position erkannt wird
             Pos = 0                            'Gleisposition = 0
             If Ziel = 0 Then                   'Wenn kein Ziel definiert wurde
                Zeile1 = " keine  "             'Text Zeile 1
                Zeile2 = "Position"             'Text Zeile 2
             End If
       End Case
   End Sub
'  ********************************************************************************

'  Abfrage der Tastatur und Festlegen der entsprechenden Aktionen
'  ********************************************************************************
   Sub Tastatur()
      ' Ziel = Pos                           'Startwert für Ziel
'      Abfrage der Tastatur
'      ----------------------------------------------------------------------------
       Zieleingabe=Key_Scan()                'Abfrage der Tastatureingaben
       Taste=Key_TranslateKey(Zieleingabe)   'Eingabe wird in ASCII umgewandelt
       If Taste > 30 Then                    'Wert fixieren, da wenn keine Taste
          Ziel = Taste                       'gedrückt wird der Rückmeldewert der
       End If                                'Tastatur -1 beträgt!

'      Aktionen und Textausgabe für die einzelnen Tastatureingaben festlegen
'      ----------------------------------------------------------------------------
       Select Case Ziel
         Case = 42                            'Taste "*" = AUF, d.h. Ziel = 42
             Zeile2 = "  AUF   "              'Text Zeile 2
             Ziel = 42
             Fahrt_AUF()                      'Fahrt aufwärts
         Case = 35                            'Taste "#" = AB, d.h. Ziel = 35
             Zeile2 = "   AB   "              'Text Zeile 2
             Ziel = 35
             Fahrt_AB()                       'Fahrt abwärts
         Case = 48                            'Taste "0" erkannt, d.h. Ziel = 48
             If Pos <> 0 And Ziel <> Pos Then 'wenn Position definiert und Ziel neu
                Zeile2 = " nach 0 "           'Text Zeile 2
             End If
         Case = 49                            'Taste "1" erkannt, d.h. Ziel = 49
             If Pos <> 0 And Ziel <> Pos Then 'wenn Position definiert und Ziel neu
                Zeile2 = " nach 1 "           'Text Zeile 2
             End If
         Case = 50                            'Taste "2" erkannt, d.h. Ziel = 50
             If Pos <> 0 And Ziel <> Pos Then 'wenn Position definiert und Ziel neu
                Zeile2 = " nach 2 "           'Text Zeile 2
             End If
         Case = 51                            'Taste "3" erkannt, d.h. Ziel = 51
             If Pos <> 0 And Ziel <> Pos Then 'wenn Position definiert und Ziel neu
                Zeile2 = " nach 3 "           'Text Zeile 2
             End If
         Case = 52                            'Taste "4" erkannt, d.h. Ziel = 52
             If Pos <> 0 And Ziel <> Pos Then 'wenn Position definiert und Ziel neu
                Zeile2 = " nach 4 "            'Text Zeile 2
             End If
         Case = 53                            'Taste "5" erkannt, d.h. Ziel = 53
             If Pos <> 0 And Ziel <> Pos Then 'wenn Position definiert und Ziel neu
                Zeile2 = " nach 5 "           'Text Zeile 2
             End If
         Case = 54                            'Taste "6" erkannt, d.h. Ziel = 54
             If Pos <> 0 And Ziel <> Pos Then 'wenn Position definiert und Ziel neu
                Zeile2 = " nach 6 "           'Text Zeile 2
             End If
         Case = 55                            'Taste "7" erkannt, d.h. Ziel = 55
             If Pos <> 0 And Ziel <> Pos Then 'wenn Position definiert und Ziel neu
                Zeile2 = " nach 7 "           'Text Zeile 2
             End If
         Case = 56                            'Taste "8" erkannt, d.h. Ziel = 56
             If Pos <> 0 And Ziel <> Pos Then 'wenn Position definiert und Ziel neu
                Zeile2 = " nach 8 "           'Text Zeile 2
             End If
         Case = 57                            'Taste "9" erkannt, d.h. Ziel = 57
             If Pos <> 0 And Ziel <> Pos Then 'wenn Position definiert und Ziel neu
                Zeile2 = " nach 9 "           'Text Zeile 2
             End If
       End Case

       If Pos <> 0 And Ziel <> Pos Then       'wenn Position bekannt und Ziel neu
          If Ziel > Pos And Ziel > 42 Then    'wenn Ziel größer als Position
             Fahrt_AB()                       'Fahrt abwärts
          End If
          If Ziel < Pos And Ziel <> 0 Then    'wenn Ziel kleiner Position und <> 0
             Fahrt_AUF()                      'Fahrt aufwärts
          End If
       End If
   End Sub
'  ********************************************************************************

'  Auzugsfahrt aufwärts
'  ********************************************************************************
   Sub Fahrt_AUF()
       GleisAUF = 0                          'Variable GleisAUF = Go
       GleisZU  = 1                          'Variable GleisZU  = Stop
       Port_WriteBit(24,GleisAUF)            'Wert GleisAUF auf Port übertragen
       Port_WriteBit(25,GleisZU)             'Wert GleisZU auf Port übertragen
       AbsDelay(1000)                        'nach 1 Sekunde
       MotorAUF = 0                          'Variable Motor AUF = Go
       MotorAB  = 1                          'Variable Motor AB  = Stop
       Port_WriteBit(51,MotorAUF)            'Wert MotorAUF auf Port übertragen
       Port_WriteBit(52,MotorAB)             'Wert MotorAB  auf Port übertragen
       Zeile1 = " Fahrt  "                   'Text Zeile 1
   End Sub
'  ********************************************************************************

'  Aufzugsfahrt abwärts
'  ********************************************************************************
   Sub Fahrt_AB()
       GleisAUF = 0                          'Variable GleisAUF = Go
       GleisZU  = 1                          'Variable GleisZU  = Stop
       Port_WriteBit(24,GleisAUF)            'Wert GleisAUF auf Port übertragen
       Port_WriteBit(25,GleisZU)             'Wert GleisZU auf Port übertragen
       AbsDelay(1000)                        'nach 1 Sekunde
       MotorAUF = 1                          'Variable Motor AUF = Stop
       MotorAB  = 0                          'Variable Motor AB  = Go
       Port_WriteBit(51,MotorAUF)            'Wert MotorAUF auf Port übertragen
       Port_WriteBit(52,MotorAB)             'Wert MotorAB  auf Port übertragen
       Zeile1 = " Fahrt  "                   'Text Zeile 1
   End Sub
'  ********************************************************************************

'  Abfrage ob Ziel erreicht ist und Ansteuerung der Motoren
'  ********************************************************************************
   Sub Zielsteuerung()
       If Pos = Ziel And Ziel > 0 Then       'wenn Ziel ereicht wurde
          MotorAUF = 1                       'Variable MotorAUF = Stop
          Port_WriteBit(51,MotorAUF)         'Wert MotorAUF auf Port übertragen
          MotorAB = 1                        'Variable MotorAB  = Stop
          Port_WriteBit(52,MotorAB)          'Wert MotorAB  auf Port übertragen
          AbsDelay(1000)                     'nach 1 Sekunde
          GleisAUF = 1                       'Variable GleisAUF = Stop
          GleisZU  = 0                       'Variable GleisZU  = Go
          Port_WriteBit(24,GleisAUF)         'Wert GleisAUF auf Port übertragen
          Port_WriteBit(25,GleisZU)          'Wert GleisZU auf Port übertragen
          AbsDelay(3000)                     'nach 3 Sekunden
       End If
   End Sub
'  ********************************************************************************

'  Ausgabe der Tastatureingaben auf dem LCD-Display
'  ********************************************************************************
   Sub Anzeige()
       LCD_CursorPos(0)                      'LCD Cursor auf 1.Zeile positionieren
       LCD_WriteText(Zeile1)                 'Zeile 1 ausgeben
       LCD_CursorPos(&H40)                   'LCD Cursor auf 2.Zeile positionieren
       LCD_WriteText(Zeile2)                 'Zeile 2 ausgeben

           Msg_WriteText("Pos=")
           Msg_WriteWord(Pos)
           Msg_WriteText(" Ziel=")
           Msg_WriteWord(Ziel)
           Msg_WriteText(Zeile1)
           Msg_WriteText(Zeile2)
           Msg_WriteText(" GlAUF=")
           Msg_WriteWord(GleisAUF)
           Msg_WriteText(" GlZu=")
           Msg_WriteWord(GleisZU)
           Msg_WriteText(" MotAUF=")
           Msg_WriteWord(MotorAUF)
           Msg_WriteText(" MotAB=")
           Msg_WriteWord(MotorAB)
           Msg_WriteChar(13)
   End Sub
'  ********************************************************************************