3. SPS-Programmierung am Beispiel eines Getränkeautomaten

3.1. Zielsetzung

Dieses Kapitel beschäftigt sich mit dem SPS-Teil der Aufgabenstellung. Wir entwickeln einen einfachen Getränkeautomaten und zeigen seine Programmierung sowohl unter Verwendung der SPS-Programmiersprache STEP5 von Siemens als auch als NQC-Programm für den Lego RCX.

Der Getränkeautomat soll auf Knopfdruck ein Wasserglas mit Wasser füllen, ohne dass das Glas überläuft oder nur halb voll wird. Dies schließt ein, dass bereits volle oder nicht ganz leere Gläser erkannt werden und die Füllmenge entsprechend angepaßt wird. Ebenso ist die Größe des Glases zu berücksichtigen, da unterschiedlich große Gläser ein unterschiedliches Fassungsvermögen haben. Auch wenn das Glas gewisse Mindestanforderungen erfüllen muss, um mit der Mechanik des Automaten kompatibel zu sein, wollen wir die Anpassungen an den Glastyp so gering wie möglich halten. Wenn sich kein Glas im Automaten befindet, soll der Vorgang abgebrochen werden.

Der Automat soll über einen Drucktaster verfügen, mit dem sich der Füllvorgang starten und auch vorzeitig abbrechen lässt, falls eine geringere Wassermenge gewünscht ist.

3.2. Hardware

Die Hardware unseres Automaten besteht aus einem Turm, an dem die Sensoren, die Aktoren und sonstige Komponenten befestigt sind. Er bietet in seinem Inneren Platz für ein handelsübliches Getränkeglas und ist vorne offen, um die Entnahme des Glases zu ermöglichen.

Oberhalb des Glases befindet sich ein Wagen, der von oben in das Glas hineinfahren kann und einen Feuchtigkeitssensor enthält, mit dem der Füllstand des Glases festgestellt wird.

Steuerzentrale des Automaten ist der Lego-RCX, der die Daten der Sensoren auswertet und die Aktoren ansteuert.

3.2.1. Sensoren

Der Automat verfügt über 4 Sensoren:

Da der RCX über lediglich 3 Sensoreingänge verfügt, sind der Starttaster und der Feuchtigkeitssensor parallel geschaltet. Dies ist möglich, da sich die Aktivitätsbereiche beider Sensoren nicht überlappen, und hat den Vorteil, dass für die Abbruchfunktion keine zusätzliche Schaltlogik nötig ist, da ein Tastendruck das gleiche Ergebnis wie ein volles Glas liefert. Eine Unterscheidung zwischen beiden Sensoren ist somit hier nicht nötig. Da der Taster und das Wasser verschiedene Widerstandswerte besitzen, wäre sie technisch jedoch realisierbar.

3.2.2. Aktoren

Der Automat verfügt über die folgenden 3 Aktoren: Bei der Lampe handelt es sich um eine handelsübliche Legolampe, die abhängig von der angelegten Polarität blinkt oder auf Dauerlicht schaltet.

Mit Ausnahme der Pumpe handelt es sich bei allen Aktoren um Lego-Zubehör, deren Anschluss an den RCX unkritisch ist. Das Kapitel "Spezialfunktionen" befasst sich im Detail mit dem Wassersensor und der Pumpensteuerung. Desweiteren enthält die beigefügte CD Bilder und Videos unseres Automaten.

3.3. Spezialfunktionen

3.3.1. Wassersensor


Zur Ansicht von hinten

Der Wassersensor besteht aus zwei einfachen blanken Drähten in Form einer Lego-Leiterplatte, die in das Wasser eintauchen. Die Eingänge des RCX sind empfindlich genug, um die elektrische Leitfähigkeit des Wassers zuverlässig messen zu können.

3.3.2. Positionsbestimmung des Wagens (anstelle von Endschaltern)

Die Positionsbestimmung erfolgt über ein 22k Potentiometer, das über einen 1k-Widerstand mit dem Eingang des RCX verbunden ist. Die Verbindung zwischen der Achse des Potis und der Lego-Achse erfolgt über eine leere Tintenpatrone für Lami-Füller, die von uns passend zurechtgesägt wurde. Der 1k-Widerstand ist eine Schutzmaßnahme für den Fall, dass der RCX-Ausgang irrtümlich für einen Lichtsensor (und nicht für einen Temperatursensor) konfiguriert wird, da der RCX in diesem Fall eine Versorgungsspannung für die LED des Lichtsensors anlegen würde, die das Potentiometer je nach Schleiferstellung kurzschließen könnte. Es ist zwar unwahrscheinlich, dass dies den RCX beschädigen könnte, da es sich bei Lego Mindstorms um ein Spielzeug für Technik-Laien und Kinder handelt und jemand aus Versehen auch einen Schalter (oder gar einen Motorausgang) anschließen könnte. Der Schutzwiderstand wurde aus Sicherheisgründen eingebaut, schaden kann er nicht. (Vergleiche hierzu http://www.plazaearth.com/usr/gasperi/lego.htm, wo die technischen Daten der RCX-Ports beschrieben sind.)

3.3.3. Pumpensteuerung

Die Ansteuerung der Faller-Modellbaupumpe ist dagegen schon komplizierter. Es handelt sich dabei um eine 16-Volt-Wechselspannungspumpe, die sich nicht direkt an den RCX anschliessen lässt. Wir haben deswegen eine Schaltung entwickelt, die den RCX um einen leistungsfähigen Schaltausgang erweitert. Der RCX ist dabei durch einen Optokoppler galvanisch vom Rest der Schaltung getrennt:

Da die Schaltung leicht verständlich ist, nur eine Anmerkung zur Diode parallel zum Relais: Diese Diode hat die Aufgabe, die in der Relaisspule beim Ein- und besonders beim Ausschalten entstehenden Spannungen kurzzuschliessen, damit sie die restliche Schaltung nicht beschädigen können. Dies ist bei dieser Anwendung ganz besonders wichtig, da der RCX keine richtigen analogen Spannungen an seinen Ausgänge bereitstellt, sondern die verschiedenen Spannungspegel für die verschiedene Motorgeschwindigkeiten durch schnelles Ein-/Ausschalten mit unterschiedlichen Tastverhältnissen realisiert.

3.4. SPS-Programmierung in STEP5 mittels WinSPS

Dieses Kapitel beschreibt die Software-Programmierung unseres Automaten in der Programmiersprache Siemens STEP5 im SPS-Simulator WinSPS-S5 1.70f.

3.4.1. Vorstellung des Programms WinSPS-S5

Das Programm WinSPS-S5 von MHJ-Software ist ein Entwicklungssystem für Programme der S5-SPS-Serie von Siemens. Das Programm enthält einen Editor, einen Simulator und Tools zum Download der Programme in reale SPS und zur Verwaltung der Programme. Man kann sich Programme sowohl als Anweisungslisten (AWL) als auch als Funktionspläne (Schaltbilder) anzeigen lassen, was die Übersicht erhöht.

3.4.2. Source-Code

Hier folgt der Source-Code unseres Programms. Alle Quellcodes befinden sich ebenfalls auf der Downloadseite.

Dieses Programm verwendet eine simplifizierte Hardware, die Endpunkte des Wagens werden somit nicht durch ein Potentiometer sondern durch einen Schalter gemeldet. Außerdem wird der Feuchtigkeitssensor als boolscher Sensor betrachtet, da die Erfassung analoger Größen für diese Anwendung zu aufwendig wäre. Ein weiterer Kompromiss ist bei den Motorausgängen nötig, da die SPS mit digitalen Ausgängen arbeitet und weder einen Polaritätswechsel noch verschiedene Ausgangsspannungen für unterschiedliche Motordrehzahlen erzeugen kann.

Belegung der Eingänge
EingangFunktionBemerkung
0.0ENDSWIst HIGH, wenn der Wagen am oberen oder unteren Endpunkt angekommen ist.
0.1GLASDETECTHIGH, sobald der Wagen gegen das Glas drückt
0.2RUN/FEUCHTHIGH, wenn der Starttaster gedrückt wird oder der Feuchtigkeitssensor Wasserkontakt hat.
0.7ERRORRESETSetzt das Programm nach einem Fehler fort

Belegung der Ausgänge
AusgangFunktionBemerkung
0.0MOT_UPWagen nach oben fahren
0.1MOT_DOWNWagen nach unten fahren
0.2PUMPEPumpe einschalten
0.3ACTIVEKontrolleuchte, die leuchtet, solange der Automat arbeitet
0.6DBG: M0.0Zeigt den aktuellen Inhalt des Merkers 0.0 an (nur zum Debuggen)
0.7ERRORSignalisiert, dass sich der Automat in einem Fehlerzustand befindet, der durch den ERRORRESET-Eingang zurückgesetzt werden muss. Dieser Ausgang signalisiert interne Fehler, die im Nomalbetrieb eigentlich nicht vorkommen dürfen. (z.B. wenn der Wagen in Folge eines Fehlers gleichzeitig nach unten und nach oben gefahren werden soll.)

Belegung der Merker
MerkerBemerkung
0.0Dieser Merker speichert die Postition des Wagens, da dieser Lösungsansatz mit einem Endschaltereingang auskommt (oberen und unteren Endschalter parallel schalten oder Mechanik so designen, dass ein Schalter in beiden Endpositionen gedrückt wird) und unterschieden können werden muss, ob der Schalter "immer noch" oder "schon wieder" gedrückt wurde.

Es folgt Organisationsbaustein OB001, der das SPS-Hauptprogramm enthält:

OB001.AWL
Kommentar :Getraenkeautomat
Autor     :Lars Struss <lstruss@gmx.net>
Erstellt  :29.08.2001  Geaendert am:            BIB:

NETZWERK   1
0000      :UN  A  0.7   Befinden wir uns in Err-Cond?
0001      :UN  E  0.7   Ist Error-Reset aktiv?
0002      :SPB PB 001   Automaten-Programm
0003      :SPA PB 099   Errorhandling
0004      :***

NETZWERK   2            Debugging: Merker 0.0 ausgeben
0005      :U   M  0.0
0006      :=   A  0.6
0007      :BE

Dieser Baustein hat zwei Funktionen:

Netzwerk 1:

Netzwerk 2 gibt den Zustand von Merker 0.0 über den Ausgang 0.6 aus. Dies dient in erster Linie der Programmkontrolle und ist für den laufenden Betrieb nicht erforderlich.

PB001.AWL
Kommentar :Automaten-Hauptprogramm
Autor     :Lars Struss <lstruss@gmx.net>
Erstellt  :29.08.2001  Geaendert am:            BIB:

NETZWERK   1            Automat aktivieren
0000      :U   E  0.0   Endswitch gedrueckt?
0001      :UN  E  0.1   Kein Glas detektiert?
0002      :U   E  0.2   RUN gedrueckt ?
0003      :UN  A  0.2   Pumpe aus?
0004      :S   A  0.3   Active-LED einschalten
0005      :S   A  0.1   Wagen runterfahren
0006      :S   M  0.0   Merken, dass Wagen noch oben
0007      :***

NETZWERK   2            Automat-Aktiv-Baustein aufrufen
0008      :U   A  0.3
0009      :SPB PB 002
000A      :BE

Das Automaten-Hauptprogramm gliedert sich in zwei Netzwerke:

Netzwerk 1 prüft, ob alle Voraussetzungen erfüllt sind, um den Befüll-Vorgang zu starten. Dazu muss der (obere) Endschalter geschlossen sein (der Wagen ist oben), es darf kein Glas gegen den Wagen drücken (GLASDETECT ist LOW), der Start-Knopf muss gedrückt und die Pumpe ausgeschaltet sein. Der Pumpenausgang 0.2 dient der Differenzierung, ob das Signal am Eingang 0.2 als Startsignal (vom Starttaster) oder als Abbruchsignal (vom Feuchtigkeitssensor bzw. Starttaster) betrachtet werden soll, da ein Start nur sinnvoll ist, wenn die Pumpe aus ist, und ein Abbruch nur nötig ist, wenn die Pumpe eingeschaltet ist.

Sind alle Voraussetzungen für den Start erfüllt, wird die Aktiv-LED eingeschaltet, der Wagen heruntergefahren und der Merker 0.0 gesetzt, um zu markieren, dass sich der Wagen noch in der oberen Position befindet.

Netzwerk 2 hat die Aufgabe, den Programmbaustein PB002 zyklisch aufzurufen, solange der Automat aktiv ist. (Ausgang 0.3 ist HIGH)

PB002.AWL
Kommentar :Aufruf, wenn Automat aktiv
Autor     :Lars Struss <lstruss@gmx.net>
Erstellt  :29.08.2001  Geaendert am:            BIB:

NETZWERK   1            Pumpen, sobald Glas detektiert
0000      :U   A  0.1   Faehrt Wagen gerade runter?
0001      :U   E  0.1   Haben wir ein Glas entdeckt?
0002      :R   A  0.1   Motor-Down aus
0003      :S   A  0.2   Pumpe ein
0004      :***

NETZWERK   2            Wagen nicht mehr an Endposition
0005      :U   M  0.0
0006      :UN  E  0.0
0007      :R   M  0.0
0008      :***

NETZWERK   3            Pumpe aus, sobald Glas voll
0009      :U   A  0.2   Pumpen wir ueberhaupt?
000A      :U   E  0.2   Glas voll?
000B      :R   A  0.2   Pumpe aus
000C      :S   A  0.0   Motor-Up ein
000D      :S   M  0.0   Merken, dass Wagen unten ist
000E      :***

NETZWERK   4            Arbeit getan, Automat wieder deaktivieren
000F      :U   A  0.0   Faehrt Wagen nach oben?
0010      :UN  M  0.0   Wagen im oberen Bereich?
0011      :U   E  0.0   Obere Endpostion erreicht?
0012      :R   A  0.0   Motor-Up aus
0013      :R   A  0.3   Active-LED aus
0014      :***

NETZWERK   5            Abbruch, wenn kein Glas vorhanden
0015      :U   A  0.1   Faehrt Wagen nach unten ?
0016      :UN  M  0.0   Ist Wagen im unteren Bereich?
0017      :U   E  0.0   Endschalter gedrueckt?
0018      :R   A  0.1   Motor-Down aus
0019      :S   A  0.0   Motor-Up ein
001A      :S   M  0.0   Merken, dass Wagen unten ist
001B      :BE

Der Programmbaustein PB002 enthält die eigentliche Automatenlogik. Er besteht aus 5 Netzwerken, die auf bestimmte Zustände warten und bei deren Eintreffen, geeignete Aktionen auslösen. Wir stellen die Eingangsbedingungen und Ausgangsaktionen in einer Tabelle dar:

NetzEingangsvoraussetzungenAktionen
1
  1. Der Wagen fährt nach unten
  2. Der Glas-Sensor hat ein Glas erkannt
  1. Der Motor (MOTDOWN) wird ausgeschaltet
  2. Die Pumpe wird eingeschaltet
2
  1. Der Merker 0.0 befindet sich noch in seiner Eingangsstellung HIGH
  2. Der Endschalter ist nicht mehr gedrückt
  1. Der Merker 0.0 wird zurückgesetzt um kenntlich zu machen, dass der nächste Zustandswechsel am Endschaltereingang das Erreichen der gegenüberliegenden Position signalisiert.
3
  1. Die Pumpe ist eingeschaltet
  2. Das Glas ist voll
  1. Die Pumpe wird ausgeschaltet
  2. Der Wagen wird nach oben gefahren
  3. Der Merker 0.0 wird gesetzt, um zu markieren, dass der Wagen die erste Hälfte der Strecke noch nicht verlassen hat.
4
  1. Der Wagen fährt nach oben
  2. Der Wagen befindet sich im oberen Bereich (Merker 0.0 ist LOW)
  3. Der Endschalter ist gedrückt (obere Position)
  1. Der Motor wird gestoppt (MOTUP auf LOW)
  2. Die Aktiv-LED wird ausgeschaltet, so dass dieser Programmbaustein nicht länger zyklisch aufgerufen wird.
5
  1. Der Wagen fährt nach unten
  2. Der Wagen befindet sich im unteren Bereich (Merker 0.0 ist LOW)
  3. Der Endschalter ist gedrückt (untere Position)
  1. Motorrichtung umgekehren (MOTDOWN auf LOW und MOTUP auf HIGH)
  2. Der Merker 0.0 wird gesetzt, um zu markieren, dass der Wagen die erste Hälfte der Strecke noch nicht verlassen hat.

PB099.AWL
Kommentar :Errorhandling
Autor     :Lars Struss <lstruss@gmx.net>
Erstellt  :29.08.2001  Geaendert am:            BIB:

NETZWERK   1
          :; Verhindern, dass Motor gleichzeitig auf Up und Down gestellt wird
0000      :U   A  0.0   Errorcondition, wenn beide
0001      :U   A  0.1   Motorausgaenge High sind
0002      :R   A  0.0   Motor Up Notaus
0003      :R   A  0.1   Motor Down Notaus
0004      :R   A  0.2   Pumpe Notaus
0005      :R   A  0.3   "Active"-LED Notaus
0006      :S   A  0.7   Error-LED einschalten
0007      :***

NETZWERK   2
0008      :U   E  0.7   Error resetten
0009      :R   A  0.7
000A      :BE

Der Baustein PB099 dient der Fehlererkennung und -behandlung. Wenn beide Motorausgänge gleichzeitig HIGH sind, der Wagen also gleichzeitig nach oben und nach unten fahren soll, wird die ERROR-LED aktiviert und alle anderen Ausgänge werden abgeschaltet, um evtl. weiteren Schaden durch den Fehler zu vermeiden. Dieser Fehlerzustand bleibt solange erhalten, bis ein Techniker den ERRORRESET-Eingang (0.7) kurzzeitig manuell auf HIGH gelegt hat.

3.4.3. Testlauf

Dieser Abschnitt beschreibt, wie das Programm im WinSPS-Simulator getestet werden kann.

Vorbereitung: Projekt in WinSPS öffnen, alle Bausteine in den Simulator laden (ALT+PGUP), Simulatorfenster öffnen (STRG+K) und Simulation durch Klicken auf die grüne LED starten. Der ENDSW-Eingang sollte auf HIGH gesetzt werden (weil sich der Wagen am Anfang in der oberen Endposition befindet), alle anderen Eingänge auf LOW.

Test ohne Glas

  1. RUN/FEUCHT auf HIGH setzen, um den Automaten zu starten.
    Die Ausgänge ACTIVE und MOTDOWN werden aktiviert und der Wagen bewegt sich nach unten.
  2. ENDSW auf LOW, da der Endschalter infolge der Bewegung des Wagens geöffnet wird.
  3. RUN/FEUCHT auf LOW setzen, d.h. der Benutzer lässt den Startknopf los.
  4. ENDSW auf HIGH, denn der Wagen erreicht den unteren Endpunkt.
    MOTDOWN wird ausgeschaltet und MOTUP wird eingeschaltet, der Wagen fährt also wieder nach oben.
  5. ENDSW auf LOW, da der Endschalter infolge der Bewegung des Wagens geöffnet wird.
  6. ENDSW auf HIGH, der Wagen hat seine obere Endposition.
    Der Motor und ACTIVE werden deaktiviert, der Automat befindet sich wieder im Ruhezustand.

Test mit Glas

  1. RUN/FEUCHT auf HIGH setzen, um den Automaten zu starten.
    Die Ausgänge ACTIVE und MOTDOWN werden aktiviert und der Wagen bewegt sich nach unten.
  2. ENDSW auf LOW, da der Endschalter infolge der Bewegung des Wagens geöffnet wird.
  3. RUN/FEUCHT auf LOW setzen, d.h. der Benutzer lässt den Startknopf los.
  4. GLASDETECT auf HIGH, da der Glassensor ein Glas erkennt.
    Der Motor wird ausgeschaltet und die Pumpe beginnt, das Glas zu füllen.
  5. RUN/FEUCHT geht auf HIGH, da das Glas voll ist oder der Benutzer vorzeitig abgebrochen hat.
    Die Pumpe wird ausgeschaltet und der Wagen fährt nach oben (MOTUP auf HIGH)
  6. GLASDETECT geht auf LOW, da der Wagen nicht mehr gegen das Glas drückt
  7. RUN/FEUCHT geht auf LOW, da der Wassersensor nicht länger ins Wasser eintaucht bzw. der Benutzer den Startknopf losgelassen hat.
  8. ENDSW auf HIGH, der Wagen hat seine obere Endposition
    Der Motor und ACTIVE werden deaktiviert, der Automat befindet sich wieder im Ruhezustand.

3.4.4. Kritik an WinSPS

Das Programm ist für SPS-Einsteiger sehr gewöhnungsbedüftig (u.a. wegen der verwirrenden Menüführung), bietet aber eine ganze Menge Funktionen. Das Programm ist nur schwierig einzuordnen, da uns die Vergleichsmöglichkeiten zu anderen SPS-Entwicklungsumgebungen fehlen.

3.5. Programmierung des Modells mit NQC

In diesem Kapitel zeigen wir die Programmierung anhand der von uns entwickelten Hardware.

3.5.1. Die Programmiersprache NQC

Wir verwenden hierzu die Programmiersprache "Not Quite C" (NQC, Homepage: http://www.enteract.com/~dbaum/nqc), einen einfachen C-Dialekt zur Programmierung des RCX. Da NQC den Byte-Code der Lego-Firmware verwendet, hat die Sprache leider ein paar elementare Einschränkungen, so stehen gerade mal 32 Integer-Variablen (16 Bit signed) zur Verfügung, alle Prozeduren sind inline und können keine Funktionswerte übergeben. Diese Beschränkungen spielen jedoch für unseren Getränkeautomaten keine Rolle und werden erst im weiteren Verlauf dieses Berichtes bei unserem Roboter-Projekt relevant.

3.5.2. NQC im Vergleich mit der Lego-Programmiersprache und LegOS

Trotz aller Einschränkungen ist NQC immer noch wesentlich leistungsfähiger als die von Lego mitgelieferte grafische Programmiersprache, die den selben Einschränkungen bzgl. des Byte-Codes unterliegt, zudem aber noch sehr umständlich zu bedienen ist.

Der Lego-Software muss allerdings auch zu Gute gehalten werden, dass sie für Kinder und PC-Laien entwickelt wurde und beide Sprachen aufgrund ihrer unterschiedlichen Zielgruppen nur schwer miteinander verglichen werden können.

Das zur Zeit leistungsfähigste Programmiersystem für den RCX ist LegOS, das die Firmware des RCX komplett ersetzt und ein echtes Entwicklungsystem mit Compilern für Native-Code, Assemblern und vollem Zugriff auf die RCX-Hardware bietet. Der Einarbeitungsaufwand liegt allerdings auch beträchtlich höher, so dass wir uns für dieses Projekt auf NQC beschränkt haben.

3.5.3. Source-Code

Hinweis: Alle Quellcodes befinden sich ebenfalls auf der Downloadseite.

GA.NQC
/* Konfigurationsteil */
#define ENDPOTI SENSOR_1 // Port, an dem das Poti angeschlossen ist
#define GLASDETECT SENSOR_2 // Port des Glassensors
#define WSENSOR SENSOR_3 // Port des Wassersensors/Startknopfes
#define MOTOR OUT_A // Port für den Motor zur Bewegung des Wagens
#define PUMPE OUT_B // Port um die Pumpe ein/aus zu schalten
#define LIGHT OUT_C // Port für die Kontrolleuchte

void MachVoll() { // Prozedur zum Füllen eines Glases
 int Success=0;   // War die Prozedur erfolgreich? Erstmal 'nein' annehmen
 OnFwd(MOTOR);    // Wagen nach unten fahren
 while(ENDPOTI>100 && GLASDETECT==0); // Warten, bis Wagen ganz unten ist
                                      // oder ein Glas erkannt wurde
 Off(MOTOR); // Wagen stoppen
 if(GLASDETECT) { // Wurde ein Glas erkannt?
  OnFwd(PUMPE);   // Ja, also Pumpe einschalten
  while(WSENSOR>600); // Warten bis das Glas voll ist.
  Off(PUMPE);         // Pumpe wieder abschalten
  Success=1;          // Merken, dass die Aktion erfolgreich war
 }
 OnRev(MOTOR);        // Wagen wieder nach oben fahren
 while(ENDPOTI<700);  // Warten bis der Wagen oben ist
 Off(MOTOR);          // Wagen anhalten
 if(Success) {        // War die Aktion erfolgreich?
  int i;
  for(i=0;i<3;++i) {  // Ja, dann schalten wir die Kontrollampe dreimal
   OnFwd(LIGHT);      // kurz auf Dauerlicht.
   Wait(20);
   Off(LIGHT);
   Wait(20);
  }
 }
 else {               // Misserfolg, wir melden den Fehler indem wir die
  OnRev(LIGHT);       // die Kontrollampe für 1 Sekunde auf Wechselblinken
  Wait(100);          // schalten
  Off(LIGHT);
 }
}

int Display=0;        // Variable, die auf dem LCD-Display des RCX
                      // angezeigt werden soll. (zur Zeit nicht benutzt.)

task main() {
 SetSensorType(ENDPOTI,SENSOR_TYPE_TEMPERATURE); // Poti-Eingang
 SetSensorMode(ENDPOTI,SENSOR_MODE_RAW);         // konfigurieren
 SetSensor(GLASDETECT,SENSOR_TOUCH);   // Glas-Detect-Eingang konfigurieren
 SetSensorType(WSENSOR,SENSOR_TYPE_TEMPERATURE); // Wasser-Sensor-Eingang
 SetSensorMode(WSENSOR,SENSOR_MODE_RAW);         // konfigurieren
 SetUserDisplay(Display,0); // Variable 'Display' zyklisch ausgeben lassen
 while(true) {              // Endlosschleife
  while(WSENSOR>120);       // Warten, bis jemand auf den Startknopf drückt
  OnFwd(LIGHT);             // Kontrollampe zur Quittierung auf Dauerlicht
  while(WSENSOR<200);       // Warten, bis Startknopf wieder losgelassen
  Off(LIGHT);               // Kontrollampe wieder aus
  MachVoll();               // Füllvorgang starten
 }
}

Da sich das Programm selbst erklärt, gehen wir an dieser Stelle nicht näher auf seine Funktionsweise ein.


Zurück


Letztes Update: 23.02.2002; © by LST