41
Automatisiertes Containerlager mit LEGO Mindstorms NXT Maturaarbeit im Fach Anwendungen der Mathematik Vorgelegt von: Fabian Gammenthaler Gymnasium Bern-Neufeld Klasse 1MNb Eingereicht bei: Herrn Heiner Rohner November 2009

Automatisiertes Containerlager mit LEGO Mindstorms NXT · LEGO Mindstorms-Serie (RCX) entwickelt und erfolgreich in den USA auf den Markt gebracht. In Europa wurde LEGO Mindstorms

  • Upload
    others

  • View
    7

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Automatisiertes Containerlager mit LEGO Mindstorms NXT · LEGO Mindstorms-Serie (RCX) entwickelt und erfolgreich in den USA auf den Markt gebracht. In Europa wurde LEGO Mindstorms

Automatisiertes Containerlager mitLEGO Mindstorms NXT

Maturaarbeit im Fach Anwendungen der Mathematik

Vorgelegt von:Fabian Gammenthaler

Gymnasium Bern-NeufeldKlasse 1MNb

Eingereicht bei:Herrn Heiner Rohner

November 2009

Page 2: Automatisiertes Containerlager mit LEGO Mindstorms NXT · LEGO Mindstorms-Serie (RCX) entwickelt und erfolgreich in den USA auf den Markt gebracht. In Europa wurde LEGO Mindstorms
Page 3: Automatisiertes Containerlager mit LEGO Mindstorms NXT · LEGO Mindstorms-Serie (RCX) entwickelt und erfolgreich in den USA auf den Markt gebracht. In Europa wurde LEGO Mindstorms

VORWORT

Vorwort

Der Roboter, eine Maschine, die heute nicht mehr wegzudenken ist. Sie wirdin verschiedensten Bereichen der Industrie eingesetzt, unter anderem fur denBau von Fahrzeugen oder fur das Einlagern von Produkten.Die automatischen Lagersysteme haben mich schon immer fasziniert, nurdurch einen einfachen Befehl des Arbeiters wird der Roboter aktiviert unddas gewunschte Produkt wird geliefert. Im Herbst 2008 hat unsere Klasseihre Kultur- und Naturwissenschaftswoche in Munchen verbracht und dortdie BMW-Werke besichtigt. Ein Ort, an dem die Hauptarbeit von Roboternverrichtet wird. Mir wurde klar, dass ich als Maturaarbeit einen Roboterbauen und programmieren werde. Doch ich wollte ein Lagersystem und keineWerkstrasse. Ohne die richtige Betreuungsperson klappt dies nicht. So gingich zu meinem Mathematiklehrer, Herrn Heiner Rohner, und fragte ihn, ober meine Maturaarbeit betreuen mochte. Zum Gluck hat er dann auch zuge-sagt.An dieser Stelle mochte ich auch Herrn Prof. Dr. Aegidius Pluss danken,ohne dessen Hilfe ich es wohl nicht geschafft hatte, eine Grafikoberflache mitdem Programm des Roboters zu verknupfen und ohne dessen Library es mirnicht moglich gewesen ware, einen solchen Roboter zu programmieren. Einenweiteren Dank mochte ich an Herrn Leander Rigert der Metallform GmbH inHinterkappelen aussprechen, der mir die Metallplattchen, die auf den Con-tainern angebracht sind, zur Verfugung stellte. Fur die Anfertigung der Con-tainer halfen mir die Schreinererfahrungen und Holzbearbeitungsmaschinenmeines Grossvaters, Herrn Alfred Gammenthaler.

F. Gammenthaler Automatisiertes Containerlager i

Page 4: Automatisiertes Containerlager mit LEGO Mindstorms NXT · LEGO Mindstorms-Serie (RCX) entwickelt und erfolgreich in den USA auf den Markt gebracht. In Europa wurde LEGO Mindstorms

INHALTSVERZEICHNIS

Inhaltsverzeichnis

1 Roboter im Alltag 2

2 LEGO Mindstorms NXT 32.1 Ausstattung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32.2 NXT-Stein . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42.3 NXT-Sensoren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

2.3.1 Beruhrungssensor . . . . . . . . . . . . . . . . . . . . . . . . 42.3.2 Ultraschallsensor . . . . . . . . . . . . . . . . . . . . . . . . 52.3.3 Lichtsensor . . . . . . . . . . . . . . . . . . . . . . . . . . . 52.3.4 Gerauschesensor . . . . . . . . . . . . . . . . . . . . . . . . 5

2.4 Interaktiver Servomotor . . . . . . . . . . . . . . . . . . . . . . . . 5

3 Die Entstehung 63.1 Die Halle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63.2 Die Antriebe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73.3 Platzierung des NXT-Steins . . . . . . . . . . . . . . . . . . . . . . 83.4 Platzierung Schaltung Elektormagnet . . . . . . . . . . . . . . . . 93.5 Platzierung der Sensoren . . . . . . . . . . . . . . . . . . . . . . . . 93.6 Die Container . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93.7 Der Containerlastwagen . . . . . . . . . . . . . . . . . . . . . . . . 10

4 Das Koordinatensystem 10

5 Programme 11

6 Programmklassen 126.1 Kontrollzentrum . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

6.1.1 Die GUI-Oberflache . . . . . . . . . . . . . . . . . . . . . . 126.1.2 Schaltflache ”Entfernen“ . . . . . . . . . . . . . . . . . . . . 136.1.3 Schaltflache ”Bestatigen“ . . . . . . . . . . . . . . . . . . . 14

6.2 Brucke und Laufkatze . . . . . . . . . . . . . . . . . . . . . . . . . 146.3 Kranarm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146.4 Hallenkran . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156.5 Betriebsablaufe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

6.5.1 Anlieferung . . . . . . . . . . . . . . . . . . . . . . . . . . . 166.5.2 Auslieferung . . . . . . . . . . . . . . . . . . . . . . . . . . 166.5.3 Kontrolle . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

7 Situationsuberblick 17

8 Der Elektromagnet 188.1 Elektronische Schaltung . . . . . . . . . . . . . . . . . . . . . . . . 18

9 Schlusswort 19

A Wichtige Quellcode 24A.1 Kontrollzentrum.java . . . . . . . . . . . . . . . . . . . . . . . . . . 24A.2 Hallenkran.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

ii Automatisiertes Containerlager F. Gammenthaler

Page 5: Automatisiertes Containerlager mit LEGO Mindstorms NXT · LEGO Mindstorms-Serie (RCX) entwickelt und erfolgreich in den USA auf den Markt gebracht. In Europa wurde LEGO Mindstorms

EINLEITUNG

Einleitung

Diese Arbeit erlautert anhand von Beispielen, wo im Alltag Roboter einge-setzt werden und wie die Idee eines automatisierten Containerlager in einemModell umgesetzt wurde. Dazu werden noch der Midstorms NXT vorgestelltund Programmteile genauer erlautert.Der Roboter und die Lagerhalle wurden mit LEGO R© und LEGO Duplo R©

konstruiert, die Roboterelemente sind vom LEGO Mindstorms R© Set und esbeinhaltet drei Motoren, einen Ultraschallsensor, einen Beruhrungssensor,einen Gerauschesensor und einen Lichtsensor, wobei fur die Arbeit nur diebeiden ersten Sensoren verwendet wurden. Zusatzlich wurde noch ein Relaisals Elektromagneten verwendete.Der LEGO Mindstorms NXT Roboter arbeitet mit einer eigenen Program-miersprache (NXT-G). Um ihn in dieser zu programmieren, benotigt man dieSoftware von LEGO. Fur ein grosseres Projekt ist diese jedoch nicht geeignet.Da LEGO Mindstorms auch in Java programmiert werden kann, entschiedich mich fur diese Programmiersprache, sowie die entsprechende Library vonProf. Dr. Aegidius Pluss und der Firmware von LEJOS.Der Roboter soll fahig sein ein Produkt, das neu in das Lager aufgenom-men wird, einzulagern und sich zu merken wo er es hingestellt hat, um eszu einem spateren Zeitpunkt wieder herausgeben zu konnen. Es soll zudemmoglich sein, das Lager auf mehreren Ebenen zu fuhren, will heissen, dassder Roboter die Kisten stapeln kann. Dazu ist es naturlich notwendig, dassder Roboter weiss, ob auf der gewunschten Kiste noch eine steht. Fur denBenutzer sollte die Bedienung moglichst einfach sein. Zum Beispiel aus einerListe aller Produkte, die zur Zeit im Lager vorhanden sind, kann der Benut-zer das gewunschte Produkt auswahlen und es nach Belieben aus dem Lagerentfernen oder zur Kontrolle ansehen.

F. Gammenthaler Automatisiertes Containerlager 1

Page 6: Automatisiertes Containerlager mit LEGO Mindstorms NXT · LEGO Mindstorms-Serie (RCX) entwickelt und erfolgreich in den USA auf den Markt gebracht. In Europa wurde LEGO Mindstorms

1 ROBOTER IM ALLTAG

1 Roboter im Alltag

Wie schon im Vorwort erwahnt wurde, finden wir in vielen Bereichen derIndustrie Roboter. Wir finden sie in Verpackungsstrassen der Nahrungsmit-telhersteller, in der Autoindustrie und danach auch noch wahrend des Trans-portes. Jeder Roboter ist auf sein Gebiet spezialisiert. Dies sieht man sehrschon am Beispiel einer Verpackungsstrasse. Der erste Roboter durchsuchtdie Ware auf Beschadigungen und sortiert diese aus, danach geht es weiterzum nachsten, dieser packt zum Beispiel sechs Produkte in eine Schachtel,diese Schachtel wird vom nachsten Roboter verschlossen und geht weiter, wosie anschliessend noch etikettiert wird. Dies war ein Beispiel, das Sie sichmit Sicherheit gut vorstellen konnen. Eine weitere Anwendung von automa-tisierten Systemen findet sich bei einer Bank1, dort werden die Dokumente ineinem Hochregallager eingelagert und konnen von den Mitarbeitern jederzeitabgerufen werden, falls sie von einem Kunden benotigt werden. Die Doku-mente gelangen zu einem Sortierroboter, der alle Dokumente, die benotigtwerden, in eine Kiste einschiebt, diese Kiste gelangt mit einem Lift in dieBuros, wo sie von kleinen mit Elektromotoren betriebene AGVs, das sind

”automatic guided vehicles“, auf deutsch automatisch gesteuerte Fahrzeuge,

aufgenommen werden und zum Arbeitsplatz gebracht werden. Auf Grundder hohen Sicherheitsbestimmungen kann man keine weiteren Details zumSystem erwahnen.Doch wussten Sie, dass auch im Guterverkehr Roboter eingesetzt werden,damit zum Beispiel die Container umgeladen werden konnen? Ein Beispieldafur ist der Hafen von Hamburg, der grosste Seehafen Deutschlands. ImHafen von Hamburg, genauer im Container-Terminal Altenwerder (CTA),werden die Container nach dem Loschen, so nennt man das Entladen einesSchiffes, auf lastwagengrosse AGVs gesetzt. Diese fahren mit den Containernauf vordefinierten Fahrstrassen zu den Lagerplatzen. Dort werden die Con-tainer von einem Lagerkran ab den AGVs geladen und auf ihren Lagerplatzgesetzt. Die AGVs fahren dann zuruck auf ihren jeweiligen Parkplatz undwarten dort auf ihren nachsten Auftrag. Haben die AGVs nur noch wenigTreibstoff im Tank, fahren sie automatisch zur Tankstelle, wo sie von einemRoboter betankt werden.Gesteuert wird das ganze aus einer Zentrale, die in einem Kontrollturm ein-gebaut ist. Die Arbeiter mussen nur noch das System uberwachen und beikritischen Situationen eingreifen. Das Restliche wird von einer Software uber-nommen, die auf einem Bildschirm den Status und den Ort jedes AGV angibt.Das ganze CTA darf nicht betreten werden; wird es dennoch von Menschenbetreten, fuhrt dies zu einer vollstandigen Ausschaltung des Systems.All diese oben genannten Systeme beinhalten mehrere kleine Arbeitsschrit-te, die aufeinander abgestimmt werden mussen. Dazu dienen die jeweiligenSoftwares. Eine solche zu entwickeln ist eine grosse Herausforderung, dochsteht sie einmal, kann man stolz auf das Resultat sein.

1Bank dem Verfasser bekannt

2 Automatisiertes Containerlager F. Gammenthaler

Page 7: Automatisiertes Containerlager mit LEGO Mindstorms NXT · LEGO Mindstorms-Serie (RCX) entwickelt und erfolgreich in den USA auf den Markt gebracht. In Europa wurde LEGO Mindstorms

2 LEGO MINDSTORMS NXT

Auch die Robotertechnologie hat ihre Grenzen, so konnen gewisse Arbeits-gange nur von Menschen gesteuert werden. Zum Beispiel im CTA, wenn dieContainer auf die Lastwagen geladen werden: Da ware es zu gefahrlich einenRoboter einzusetzen, denn dieser sieht nicht, ob der Mensch zu nahe amLastwagen steht oder nicht. Denn

”nur Menschen konnen mit Fehlern von

Menschen rechnen“[2]. Eine weitere Zone, in der nur Menschen eingesetztwerden konnen, ist der Loscharbeitsgang. Die kleinen Anderungen des Schif-fes wahrend des Loschens oder bei Wellengang konnen von keinem Computerwahrgenommen werden und schon gar nicht in irgendeiner Form ausgeglichenwerden. Fur diese Arbeit braucht es den erfahrenen Bruckenfahrer.Der Lagerplatz fur die Container des CTA im Hafen von Hamburg ist Vorbildfur diese Maturaarbeit. Im Unterschied zum CTA handelt es sich bei dieserArbeit um eine Halle, in der die Container gelagert werden. Das Ein- undAusfuhren der Container geschieht manuell mit einem Haken-Lastwagen. DieFaszination, ein solches automatisiertes Containerterminal selber zu entwer-fen und zu programmieren, fuhrte schliesslich zu dieser Arbeit. Wenn manein Modell des CTA hatte bauen und programmieren wollen, brauchte manwohl etwas mehr Zeit und ein grosseres Budget. Deshalb entstand nur eineContainerlagerhalle.

2 LEGO Mindstorms NXT

Der LEGO Mindstorms NXT ist der Nachfolger des LEGO Mindstorms RCX(Robotics Command System) und wurde von LEGO entwickelt. Mit diesenbeiden Produkten ist es moglich, mit LEGO-Bausteinen Roboter und andereautonome Fahrzeuge zu bauen und zu programmieren.Diese Idee entstand schon sehr fruh und wurde in Zusammenarbeit mit demMassachusetts Institut of Technology (MIT) erarbeitet. Jedoch schlug sichdie LEGO-Technic-Computer-Control-Serie im Jahre 1986 auf dem Marktnicht durch. Es war wohl noch zu fruh fur eine solche Technologie als Spiel-zeug. Nach einer langeren Pause wurde 1998 wieder mit Hilfe des MIT dieLEGO Mindstorms-Serie (RCX) entwickelt und erfolgreich in den USA aufden Markt gebracht. In Europa wurde LEGO Mindstorms erst Ende 1999auf den Markt gebracht. Es folgte im Herbst 2006 der LEGO MindstormsNXT (Next Generation) der uber bessere Sensoren und Motoren verfugt undauf dem LEGO Technic System basiert.

2.1 Ausstattung

Der LEGO Mindstorms NXT kann in einem Set (LEGO-Nr. 8527) uberalldort gekauft werden, wo es ein breites LEGO-Sortiment gibt. Das Set enthaltden programmierbaren NXT-Stein, einen Beruhrungssensor, einen Lichtsen-sor, einen Ultraschallsensor, einen Gerauschesensor und drei interaktive Ser-vomotoren. Um diese mit dem NXT-Stein verbinden zu konnen, sind auch

F. Gammenthaler Automatisiertes Containerlager 3

Page 8: Automatisiertes Containerlager mit LEGO Mindstorms NXT · LEGO Mindstorms-Serie (RCX) entwickelt und erfolgreich in den USA auf den Markt gebracht. In Europa wurde LEGO Mindstorms

2 LEGO MINDSTORMS NXT

sieben 6-polige Verbindungskabel mit RJ12-Stecker dabei, wobei die Verbin-dungsnase seitlich und nicht in der Mitte des Steckers angebracht ist. DerNXT kann mit dem mitgelieferten USB-Kabel an den PC angeschlossen wer-den.Um gleich ein erstes Modell bauen zu konnen, befindet sich im Set eine Bau-anleitung, 577 LEGO-Teile und die Programmiersoftware fur den NXT-Steinmit Installationshandbuch. Bauanleitungen fur weitere Modelle konnen vonder Website2 von LEGO Mindstorm heruntergeladen werden.

2.2 NXT-Stein

Das Herzstuck jedes Mindstorms-Roboters bildet der NXT-Stein3 (Eigenna-me: NXT-Brick), auf den die Programme ubertragen werden konnen unddurch ihn selbstandig ausgefuhrt werden. Der NXT-Stein verfugt uber einenUSB Full Speed Port (12 Mbit/s), damit er mit dem PC verbunden wer-den kann und so die Programme ubertragen werden konnen. Der NXT-Steinkann auch uber Bluetooth (gemass Bluethooth Class II V2.0) mit einemPC oder einem Bluetooth-fahigen Mobilfunktelefon kommunizieren. Fur diedrei interaktiven Servomotoren sind drei Ausgangsports (A-C) fur 6-poligeVerbindungskabel vorhanden, fur die Sensoren hat es vier Eingangsports (1-4) auch fur 6-polige Verbindungskabel. Ein grafisches LC-Display mit einerAuflosung von 100 × 64 Pixel ermoglicht es, Texte und einfache Grafikenauf dem NXT-Stein wiederzugeben. Es konnen auch Tone auf dem NXT-Stein abgespielt werden, hierfur steht ein Lautsprecher mit 8-Bit-Auflosung,einer Klangqualitat von 8 kHz und einer Sample Rate von 2 bis 16 kHz. Ein32-Bit-Mikrocontroller ARM7 mit 256 KB FLASH, 64 KB RAM, so wie ein8-Bit-Mikrocontroller AVR mit 4 KB FLASH, 512 Byte RAM steuern denNXT-Stein. Die Stromquelle fur den NXT-Stein bilden sechs AA/LR6-Zellen.

2.3 NXT-Sensoren

In den folgenden Abschnitten werden die Sensoren erklart, die im LEGOMindstorms-Set vorhanden sind. Fur die automatisierte Lagerhalle wurdenjedoch nur der Beruhrungs- und der Ultraschallsensor verwendet. Der Licht-sensor sollte zuerst auch verwendet werden, denn dieser sollte die Produkteerkennen. Jedoch kann dieser nur hell und dunkel unterscheiden und somitist er fur eine Produkterkennung nicht zuverlassig genug.

2.3.1 Beruhrungssensor

Der Beruhrungssensor verfugt uber zwei Zustande: Entweder fliesst Stromoder es fliesst kein Strom. Er besteht aus einem Sensorgehause und einemDruckknopf, der durch eine kleine Feder nach aussen gedruckt wird. Betatigt

2http://mindstorms.lego.com/Overview/NXTreme.aspx3ftp://ftp.tik.ee.ethz.ch/pub/students/2006-So/SA-2006-18.pdf

4 Automatisiertes Containerlager F. Gammenthaler

Page 9: Automatisiertes Containerlager mit LEGO Mindstorms NXT · LEGO Mindstorms-Serie (RCX) entwickelt und erfolgreich in den USA auf den Markt gebracht. In Europa wurde LEGO Mindstorms

2 LEGO MINDSTORMS NXT

man nun den Druckknopf des Sensors, so schliesst sich der Stromkreis, unddas Messgerat sendet das entsprechende Signal aus. Wird er wieder losgelas-sen, fliesst kein Strom mehr.

2.3.2 Ultraschallsensor

Der Ultraschallsensor besteht aus einem Sender und einem Empfanger, wobeidie Signale direkt im Sensor verarbeitet werden und nur die Distanzwerte alsdigitales Signal weitergegeben werden. Um diesen Wert zu erhalten, schicktder Sender einen Impuls aus, der wird von einem Hindernis reflektiert undvom Empfanger wieder aufgenommen. Zusatzlich wird die Zeit vom Sendenbis zum Empfangen des Impulses gemessen. Die Formel zur Berechnung derDistanz lautet s = v · t, wobei v die Geschwindigkeit von Schall in der Luftist (v = 340m

s).

2.3.3 Lichtsensor

Ahnlich wie der Ultraschallsensor verfugt auch der Lichtsensor uber einenSender und einen Empfanger. Beim Lichtsensor handelt es sich beim Senderum eine rote LED, beim Empfanger um einen Fototransistor. Das ausgesen-dete Licht wird von einem Hindernis reflektiert, wobei ein Teil dieses Lichtesauf den Fototransistor trifft. Wenn viel Licht auf den Fototransistor fallt,ist dessen elektrischer Wiederstand klein; trifft wenig Licht auf, so ist derelektrische Wiederstand gross. Diese Spannungsschwankungen konnen nungemessen und der Wert an den NXT-Stein weiter gegeben werden. Da derFototransistor auch auf das Umgebungslicht reagiert, ist es sehr schwierig,eine prazise Messung durchzufuhren.

2.3.4 Gerauschesensor

Der Gerauschesensor ist nichts anderes als ein Mikrofon. Er besitzt ein kleinesMikrofon, das als veranderlicher elektrischer Wiederstand arbeitet. Vor demMikrofon wird eine Spannung auf einen Transistor geleitet und steuert dessenStromdurchfluss. Wird das Mikrofon nicht angeregt, so lasst der Transistordie gesamte Spannung durch, wird es jedoch angeregt, so verandert sich dieDurchflussspannung im Transistor stetig, dieses Signal wird dann ausgewertetund der Wert wird an den NXT-Stein weitergegeben.

2.4 Interaktiver Servomotor

Der Servomotor enthalt einen Elektromotor, der uber ein Getriebe eine dreh-bare Scheibe antreibt. An diese Scheibe konnen LEGO Technic-Teile an-gebracht werden. Zusatzlich verfugt der Motor uber einen Rotationssensor.Dieser misst die Umdrehungen des Elektromotors. Dank diesem Sensor ist esmoglich den Motor in 1-Schritten rotieren zu lassen und dessen Geschwin-digkeit zu verandern.

F. Gammenthaler Automatisiertes Containerlager 5

Page 10: Automatisiertes Containerlager mit LEGO Mindstorms NXT · LEGO Mindstorms-Serie (RCX) entwickelt und erfolgreich in den USA auf den Markt gebracht. In Europa wurde LEGO Mindstorms

3 DIE ENTSTEHUNG

3 Die Entstehung der Lagerhalle

In diesem Kapitel wird der genaue Aufbau der verschiedenen Elemente er-klart. Zudem wird auch auf einige Probleme aufmerksam gemacht.

Abbildung 1: Vogelperspektive auf die Halle

3.1 Die Halle

Die Lagerhalle sollte zuerst aus Holz konstruiert werden, doch stellte sichbald heraus, dass dies in Verbindung mit den LEGO-Steinen etwas aufwandigwurde. Es war also besser, die ganze Lagerhalle aus LEGO-Steinen zu kon-struieren. Wenn man die Wande aus Holz gefertigt hatte, ware es schwieriggeworden, die Zahnstangen, auf denen die Brucke lauft, schon nebeneinanderund in einer Linie aufzukleben. Auf die LEGO-Steine konnen die Zahnstan-gen bequem aufgesteckt werden. Fur die Lagerhallenwande wurden die sta-bileren LEGO Duplo-Steine verwendet, ein weiterer Vorteil dieser ist, dasssie grosser sind als die normalen LEGO-Steine, so erreicht man schneller diegewunschte Hohe mit weniger Steinen und kann sie optimal mit den LE-GO und den LEGO Technic-Steinen verbinden. Die Halle wurde auf einequadratische LEGO-Bodenplatte mit der Seitenlange von 38 cm aufgebaut.Darauf wurde eine Kartonplatte gelegt, auf der die Containerabstellplatzeaufgezeichnet sind. In den Ecken und auf zwei gegenuberliegenden Seiten be-finden sich sechs Saulen. Auf den anderen gegenuberliegenden Seiten wurden

6 Automatisiertes Containerlager F. Gammenthaler

Page 11: Automatisiertes Containerlager mit LEGO Mindstorms NXT · LEGO Mindstorms-Serie (RCX) entwickelt und erfolgreich in den USA auf den Markt gebracht. In Europa wurde LEGO Mindstorms

3 DIE ENTSTEHUNG

Querverstrebungen zwischen die Saulen gebaut, um eine bessere Stabilitatund Tragfahigkeit zu erhalten. Auf diesen beiden Wanden sind Zahnstangenmontiert, auf denen die Brucke an ihre Position gleitet. Die Brucke bestehtaus zwei Langsverstrebungen, welche an der Oberseite Zahnstangen aufwei-sen, auf diesen wird die Laufkatze in horizontaler Richtung bewegt. Die Lauf-katze besteht aus einem Schlitten, der parallel zur Brucke Zahnrader befestigthat. In der Mitte befindet sich die Fuhrung des Kranarmes, dieser weist eineLange von 45 cm auf und steht senkrecht auf die Ebene der Laufkatze. Inder Mitte des Armes befinden sich Zahnstangen, mit denen der Arm gesenktund gehoben werden kann. Zudem wurde eine Fuhrung fur die Container an-gebracht. Diese schiebt die Container unter den Kran, falls dieser sich nichtgenau uber den Containern befindet.

3.2 Die Antriebe

Der Antrieb erfolgt durch drei Elektromotoren. Der Motor fur die Brucke be-findet sich auf der rechten Seite der Halle. Mittels einer Antriebswelle werdenzwei Zahnrader angetrieben, diese sind durch eine Kette mit der Brucke ver-bunden und schieben die Brucke uber die Zahnstangen an ihre Position. DerAntrieb fur die Laufkatze befindet sich an einer Seite der Brucke. Der Motortreibt uber eine Antriebswelle zwei Zahnrader an, die durch eine Kette mitder Laufkatze verbunden sind. Auf der Laufkatze befindet sich der Antriebdes Kranarmes. Der Motor treibt eine Zahnradreihe an, welche schlussendlichdas Heben und Senken des Kranarmes bewirkt.

Abbildung 2: Antrieb der Brucke

Es waren nun alle Motoren aufgebraucht, doch es fehlte noch die Greifvorrich-tung fur das Halten der Container. Nach einigen ausgiebigen Recherchen imInternet entdeckte ich dann die Losung. Es war moglich den Lichtsensor mitdem LEGO-Mindstorms-NXT-Brick zu aktivieren und deaktivieren. Wennman diesen Steuerstrom nun nutzen konnte um einen externen Stromkreiszu schliessen, so konnte ein Elektromagnet betrieben werden. Dieser Magnet

F. Gammenthaler Automatisiertes Containerlager 7

Page 12: Automatisiertes Containerlager mit LEGO Mindstorms NXT · LEGO Mindstorms-Serie (RCX) entwickelt und erfolgreich in den USA auf den Markt gebracht. In Europa wurde LEGO Mindstorms

3 DIE ENTSTEHUNG

Abbildung 3: Antrieb der Laufkatze

Abbildung 4: Antrieb des Kranarmes

wurde dann die Container festhalten und zu gegebener Zeit wieder loslassen.Mit der richtigen elektronischen Schaltung (s. Kapitel 8.1) war dies moglichund das Problem behoben.

3.3 Platzierung des NXT-Steins

Das Herzstuck der automatisierten Lagerhalle bildet, wie bei allen Mindstorms-Robotern, der NXT-Stein. Er musste so an der Halle angebracht werden,dass die Verbindungskabel zu den Motoren und Sensoren immer ein wenigdruchhangen, egal wo sich der Kran befindet. Schliesslich wurde er an dereinen verstrebten Seite angebracht. Er wurde mit sechs LEGO-connector-pegs an der Saule angehangt. Diese Stifte erlauben es, ihn jederzeit von derSaule abzutrennen, um zum Beispiel die Batterien zu wechseln.

8 Automatisiertes Containerlager F. Gammenthaler

Page 13: Automatisiertes Containerlager mit LEGO Mindstorms NXT · LEGO Mindstorms-Serie (RCX) entwickelt und erfolgreich in den USA auf den Markt gebracht. In Europa wurde LEGO Mindstorms

3 DIE ENTSTEHUNG

3.4 Platzierung der Schaltung des Elektromagneten

Unmittelbar links neben dem NXT-Stein befindet sich die Plattform, aufder die elektronische Schaltung fur den Elektromagneten platziert ist. DiesePlattform bietet Platz fur die 9-Volt-Batterie und die Schaltung. Die Platt-form ist nichts anderes als eine LEGO-Platte, die sich einfach in die Mauereinbauen lasst. Die darauf aufgebauten LEGO-Steine dienen als Halterungder Batterie und der Schaltung. So kommen auch keine Kabel der Brucke indie Quere.

3.5 Platzierung der Sensoren

In der ganzen Halle wurden zwei Sensoren verbaut. Zum einen der Ultra-schallsensor und zum anderen der Beruhrungssensor; dieser wurde direkt anden NXT-Stein mit Hilfe der connector pegs angebracht. Der Ultraschallsen-sor befindet sich uber dem Eingang zum Eingangsfeld. Er wurde zwischenzwei winkelformigen LEGO Technic-Teilen angebracht.

3.6 Die Container

Fur die Container musste ein leichtes, aber doch stabiles Material her. Zuerstwurden die Container aus Styropor gefertigt, jedoch war es sehr schwierig,gleich grosse Stucke zu schneiden. Es half auch nichts, als ein Styroporschnei-degerat zum Einsatz kam. Auf der Suche nach einem leichten und stabilenMaterial zeigte sich Balsaholz als geeignet. Es war, gegenuber dem Styropor,kinderleicht, gleich grosse Stucke zu sagen. Diese Stucke haben eine Lange

Abbildung 5: Ein Lagercontainer

von 63 mm, eine Breite von 29 mm und eine Hohe von 13 mm. Es wurden im-mer zwei Stucke aufeinander geleimt und danach mit einem Farbspray leichtangespruht. Um die Container gut stapeln zu konnen, haben sie auf der Ober-seite eine Vertiefung und auf der Unterseite das entsprechende Gegenstuck.

F. Gammenthaler Automatisiertes Containerlager 9

Page 14: Automatisiertes Containerlager mit LEGO Mindstorms NXT · LEGO Mindstorms-Serie (RCX) entwickelt und erfolgreich in den USA auf den Markt gebracht. In Europa wurde LEGO Mindstorms

4 DAS KOORDINATENSYSTEM

Damit der Elektromagnet den Container halten kann, braucht es eine metalli-sche Oberflache. Zuerst kamen Unterlagsscheiben zum Einsatz, jedoch stelltesich nach einigen Versuchen heraus, dass sie nicht sehr zuverlassig sind, dasie ein Loch in der Mitte der Scheibe haben und dies genau dort war, wo derElektromagnet ziehen sollte. Es sollten einfache, leichte Metallplattchen sein.Herr Leander Rigert von der Firma Metallform liess kleine Metallplattchenstanzen, mit denen es schliesslich funktionierte.

3.7 Der Containerlastwagen

Zu einem spateren Zeitpunkt wurde die Halle so erweitert, dass es moglichwurde, mit dem Lastwagen einen Container beim Eingang anzuliefern undbeim Ausgang einen Container abzuholen. Dafur benotigte es jedoch einenLastwagen, der fahig war, einen Container aufzuladen. Es wurde also in denLEGO-Auto-Modellen nach einem passenden Stuck gesucht und schliesslichim Modell Nr. 6668 gefunden. Dieses Modell stellt einen Lastwagen dar, dermit einer Seilwinde und einem Haken einen Container aufladen kann. AufGrund der Situation im Lager musste der Lastwagen angepasst werden. So

Abbildung 6: Containerlastwagen

entstand ein Zugfahrzeug, das einem alteren Truck ahnelt, und ein Anhanger,der den gleichen Aufbau besitzt wie der hintere Teil des 6668 Modells. DiePlattform fur die Container wurde nach dem Modell des Mullcontainers desLEGO-Modells gebaut, auch hier waren einige Anpassungen notig.

4 Das Koordinatensystem der Halle

Das Koordinatensystem dient dazu, die Position eines Punktes im Raum zubestimmen. Es besteht aus einer x- und einer y-Koordinate im zweidimensio-nalen Raum, im dreidimensionalen Raum wird zusatzlich eine z-Koordinateverwendet.

10 Automatisiertes Containerlager F. Gammenthaler

Page 15: Automatisiertes Containerlager mit LEGO Mindstorms NXT · LEGO Mindstorms-Serie (RCX) entwickelt und erfolgreich in den USA auf den Markt gebracht. In Europa wurde LEGO Mindstorms

5 PROGRAMME

Das Modell der Halle ist in ein dreidimensionales Koordinatensystem einge-baut, wobei der Ursprung auf das Ausgangsfeld fallt. Die x-Achse ist paral-lel zur Laufrichtung der Brucke ausgelegt, und die y-Achse verlauft parallelzur Laufrichtung der Laufkatze. Die z-Achse ist gleich der Laufrichtung desHebens und Senkens des Kranarmes. In x-Richtung entspricht eine Einheit−633, in y-Richtung 235und in z-Richtung −330. Die Angabe in Grad istnotwendig, weil die Motoren ihre Umdrehungen in Grad messen. Muss derHallenkran an einen bestimmten Platz im Lager hinfahren, so werden die x-und y-Koordinaten des Platzes mit der jeweiligen Gradeinheit multipliziert.Dieses Ergebnis ergibt die gesamte Gradanzahl, um die sich der jeweilige Mo-tor drehen muss. Um die Gesamtgradanzahl der z-Koordinate zu berechnen,wird folgende Rechnung durchgefuhrt:

zreal = 5 - z

Zreal ist dann der Faktor, der mit der z-Einheit multipliziert wird. Die 5ist eine Konstante und ist die maximale z-Koordinate. Der Koordinatenwertwird der Variablen z ubergeben. Liegt zum Beispiel der Container auf derzweiten Etage so lautet die Rechnung wie folgt:

zreal = 5 - 2 = 3

Die z-Einheit −330wird nun mit dem Wert 3 multipliziert und das Ergebnisan den Motor weitergegeben. Dieser weiss nun, dass er drei Einheiten nachunten drehen muss. Die Rechnung ist notwendig, da die Nullposition desKranarmes in der hochsten Stellung ist und die Etagen der Containerebenenvon unten nach oben gezahlt werden.

5 Programme

Nach dem die Lagerhalle erstellt wurde, ging es daran, die verschiedenenFunktionen und Bewegungen zu programmieren. Als Programmierspracheerscheint C++ oder JAVA als sinnvoll. Fur beide Sprachen gibt es Librari-es, die es erlauben, den NXT-Stein auf eine einfache Art zu programmieren.JAVA erschien dann einfacher, vielleicht auch, weil wir im ErganzungsfachInformatik damit programmierten.Zuerst wurde ein Programm geschrieben, das sich nur der Vorwarts- undRuckwartsbewegung der Brucke widmete, danach kam die Bewegung derLaufkatze hinzu und die beiden Programmteile mussten nun aufeinanderabgestimmt werden. Es fehlte noch der Programmteil, der den Hebe- undSenkvorgang des Kranarmes steuert. So entstand nach und nach die ers-te Version des Programmes. Doch bis zur endgultigen Version 6.11 war esnoch ein weiter Weg. Die Versionen von 1.0 bis 3.2 verfugten noch uber kei-ne Steuermoglichkeit des Roboters und waren mehr Programme zum Testender verschiedenen Befehle, welche die Library von Herrn Prof. Dr. Pluss an-bietet. Von der Version 4.0 bis zur Version 5.2 konnte dann schon uber eine

F. Gammenthaler Automatisiertes Containerlager 11

Page 16: Automatisiertes Containerlager mit LEGO Mindstorms NXT · LEGO Mindstorms-Serie (RCX) entwickelt und erfolgreich in den USA auf den Markt gebracht. In Europa wurde LEGO Mindstorms

6 PROGRAMMKLASSEN

Kommandozeile ein Produkt ausgewahlt werden. Doch ohne GUI-Oberflache(s. Kapitel 6.1.1) war das Maximum der Moglichkeiten sehr schnell erreicht.Bis hierhin war es nicht moglich, eine GUI-Oberflache zu gestalten, da sichder PC beim Ausfuhren des Programmes mit einer GUI-Oberflache immerwieder blockierte. Da die Library von Herrn Prof. Dr. Pluss verwendet wurdeund sich der Fehler nur zeigte, sobald ein langeres Programm, das den NXTsteuert, mit einem Button gestartet wurde, wurde eine E-Mail an Herrn Prof.Dr. Pluss geschickt und darin das Problem geschildert. Schon nach gut einerStunde kam eine Antwort mit dem rettenden Losungsvorschlag zuruck. Ererklarte, dass die Anwendungen in einer GUI nicht langer als einige Millise-kunden dauern durfen, falls dies jedoch der Fall ist, mussten diese in neueThreads verpackt werden. Threads sind Teile eines Programms, die nahezuparallel zu den anderen Teilen des Programmes laufen. Nach dieser Methodefunktionieren nun auch die Versionen 6.0 bis 6.11, die uber eine benutzer-freundliche GUI-Oberflache gesteuert werden konnen.

6 Programmklassen

In den folgenden Kapiteln werden die verwendeten Klassen und ihre Aus-fuhrungsmethoden beschrieben. Es schien vernunftig, mehrere Klassen zugenerieren, vor allem deshalb, weil es sich um Bewegungsablaufe handelt, diemit verschiedenen Klassen ubersichtlicher wurden. Zudem werden die beidenSchaltflachenaktionen und die GUI-Oberflache naher beschrieben.

6.1 Kontrollzentrum

Die Klasse Kontrollzentrum ist die ausfuhrende Klasse. Dies heisst, dass inihr die Main-Methode eingebaut ist. Sie verfugt auch uber einen Konstruktor,der in der Main-Methode aufgerufen wird. In diesem Konstruktor wird dieGUI-Oberflache erstellt und der Date-, der Situation- und der newProduct-Thread gestartet. In der Main-Methode wird zudem der wichtigste Array imganzen Programm, der Feld-Array aufgefullt. Es handelt sich hier bei umeinen zweidimensionalen Array, der die Situation des Lagers abspeichert. Inihm sind die Informationen jedes Platzes abgespeichert, ob dieser Platz freiist oder nicht, welches Produkt sich dort befindet, welche Koordinaten derPlatz hat und welche Nummer.

6.1.1 Die GUI-Oberflache

Die GUI-Oberflache stellt die Bedienungsoberflache des Hallenkrans dar. Mitihrer Hilfe ist es moglich, die Produkte im Lager zu verwalten. Eine Listeauf der linken Seite zeigt an, welche Produkte sich zur Zeit im Lager be-finden. Es ist moglich, eines oder mehrere Produkte zugleich in der Listeauszuwahlen. Die Informationen uber die ausgewahlten Produkte erscheinen

12 Automatisiertes Containerlager F. Gammenthaler

Page 17: Automatisiertes Containerlager mit LEGO Mindstorms NXT · LEGO Mindstorms-Serie (RCX) entwickelt und erfolgreich in den USA auf den Markt gebracht. In Europa wurde LEGO Mindstorms

6 PROGRAMMKLASSEN

Abbildung 7: Links: die Bedieneroberflache, rechts: der Situationsuberblick

auf der rechten Seite im Informationsfeld, unter anderem erscheint das An-lieferungsdatum und der Standort im Lager. Uber zwei Buttons kann derBenutzer die Auswahl entweder aus der Liste entfernen, was dazu fuhrt, dassdie Produkte nur zum Ausgang transportiert werden und dort vom Lastwa-gen entfernt werden mussen, oder er kann die Auswahl bestatigen, dies fuhrtdazu, dass das Produkt zum Ausgang transportiert wird und nach Betati-gung des Beruhrungssensors wieder ins Lager zuruck gebracht wird. DieseFunktion dient vor allem dazu, die Produkte zu uberprufen. Des weiterenwird unterhalb der Liste und des Informationsfeldes das aktuelle Datum mitder aktuellen Zeit angegeben.Programmiert wurde die GUI-Oberflache in NetBeans IDE 6.1 mit Hilfe desGUI-Builder, dieser erlaubt es, JAVA Swing und JAVA AWT mittels dragand drop direkt ins Fenster einzubauen. Es mussen dann nur noch die Ak-tionen programmiert werden, die ausgefuhrt werden sollen, nachdem ein Lis-tenelement ausgewahlt oder ein Button gedruckt wurde. Dank dieses Builderist es sehr einfach, ein GUI zu erschaffen.

6.1.2 Schaltflache”Entfernen“

Sobald ein Produkt aus der Liste ausgewahlt wurde, werden die Buttons ak-tiviert. Wird auf den Button zum Entfernen des Produkts gedruckt, wird derDeleteThread gestartet, und die restlichen Schaltflachen werden deaktiviert;es kann zu dieser Zeit auch kein neues Produkt ins Lager aufgenommen wer-den.Zu Beginn des DeleteThread wird gepruft, welche Produkte ausgewahlt wur-den und in einem String-Array abgespeichert, danach werden die Produkt-nummern der Produkte im String-Array abgelesen. Danach wird jedes ein-zelne Produkt mit der selben Methode abgearbeitet.Es wird gepruft, auf welchem Platz sich das Produkt befindet. Danach pruftder Computer, ob sich auf diesem Container noch weitere befinden. Ist diesder Fall, werden diese an einen neuen freien Platz gestellt, jedoch wird dar-auf geachtet, dass nicht ein weiterer abzuholender Container verdeckt wird.Zusatzlich wird noch uberpruft, ob es sich beim Container, der weggestelltwerden muss, um einen handelt, der auch zu entfernen ist. Falls diese Bedin-

F. Gammenthaler Automatisiertes Containerlager 13

Page 18: Automatisiertes Containerlager mit LEGO Mindstorms NXT · LEGO Mindstorms-Serie (RCX) entwickelt und erfolgreich in den USA auf den Markt gebracht. In Europa wurde LEGO Mindstorms

6 PROGRAMMKLASSEN

gung erfullt ist, wird dieser Container zuerst entfernt.Nachdem die Arbeiten erledigt sind, werden die Schaltflachen wieder akti-viert und es kann dem Kran ein weiterer Befehl gegeben werden, oder einneuer Container angeliefert werden.

6.1.3 Schaltflache”Bestatigen“

Diese Schaltflache dient dazu, dass der Arbeiter die Moglichkeit hat, denContainer zu uberprufen und ihn wieder ins Lager zuruckzustellen. Wirddieser Button gedruckt, so wird der DeliverThread gestartet und alle an-deren Schaltflachen deaktiviert. Der DeliverThread funktioniert gleich wieder DeleteThread, jedenfalls bis der Container beim Ausgangsfeld abgestelltwurde. Danach gibt es noch einen Programmteil, der den Container wiederan seinen alten Standort zuruckbringt, es sei denn, es handelt sich beim Con-tainer um einen, der im Zuge einer Freilegung zum Ausgangsfeld gebrachtwurde; dieser wird dann nicht an den alten Standort zuruckgebracht, son-dern an einen neuen freien Platz. Denn sonst wurde er wieder den Weg zumContainer versperren, der ausgeliefert werden muss.

6.2 Brucke und Laufkatze

Der Programmteil der Brucke ist eine eigenstandige Klasse. Diese verfugtuber einen Konstruktor, der die Instanzvariablen ubernimmt und zudem demRoboter die Motoren an den Motorenports A und B anhangt. Im Konstruktorwird auch die Power der Motoren festgelegt, fur dieses Projekt eignet sicheine Powereinstellung von 50. Zudem verfugt die Klasse Brucke uber dreiMethoden. Die Methode Position() bringt die Brucke auf die gewunschtePosition, indem den Instanzvariabeln x und y die Koordinaten uberge-ben werden und ein neuer xPositonThread und ein neuer yPositionThreadgestartet wird. Die beiden Threads lassen die Motoren A und B zu den er-rechneten Winkeln drehen. So wird die Brucke und die Laufkatze auf ihrePosition gebracht. Damit die Brucke und die Laufkatze wieder auf ihre Aus-gangsposition zuruckkehren, gibt es die Methode resetBridge(). Diese setztdie Instanzvariabeln x und y auf 0 und zuletzt loscht sie den Rotations-messwert, der dann wieder den Wert 0 annimmt.

6.3 Kranarm

Wie schon bei der Brucke handelt es sich beim Kranarm auch um eine ei-genstandige Klasse mit dem Namen Lift. Diese verfugt auch uber einenKonstruktor und vier Methoden. Der Konstruktor legt die Powereinstellungdes Motors C auf 30 fest. Es gibt auch eine Methode reset(), die den Kran-arm in seine Nullposition bringt. Die Methode down() bringt den Kranarmauf die gewunschte Hohe runter, indem berechnet wird, wie weit diese Etagevon null entfernt ist. Wenn die Methode up() aufgerufen wird, hebt sich der

14 Automatisiertes Containerlager F. Gammenthaler

Page 19: Automatisiertes Containerlager mit LEGO Mindstorms NXT · LEGO Mindstorms-Serie (RCX) entwickelt und erfolgreich in den USA auf den Markt gebracht. In Europa wurde LEGO Mindstorms

6 PROGRAMMKLASSEN

Kran nach oben in die Nullposition, im Gegensatz zur reset() Methode wirdder Rotationsmesser nicht geloscht. Um den Container auf das Ausgangsfeldabzusetzen, benotigt es die Methode downToField(), welche nur die untersteEtage ansteuert.

6.4 Hallenkran

Die Klasse Hallenkran ist zustandig fur den Transport der Container vonA nach B. Sie verfugt uber zwei Konstruktoren, wobei der zweite nur ei-ne neue Brucke und einen neuen Lift offnet, der andere zusatzlich nochdie Koordinaten einliest. Der zweite Konstruktor wird aufgerufen, wenn esdarum geht, den Container freizulegen. Diese Klasse verfugt zudem uberacht Methoden, die die verschiedenen Funktionen des Hallenkrans ausfuhren.Die Methode getPosition() fragt ab, wo sich die Brucke und die Laufkat-ze zur Zeit befinden. Damit der Arbeiter die Moglichkeit hat die Contai-ner per Knopfdruck wieder ins Lager zuruckzustellen, gibt es die MethodewaitForTouch(). Diese beinhaltet eine While-Schleife, die immer eine Mil-lisekunde wartet, solange der Beruhrungssensor nicht gedruckt wird. Wirddieser betatigt, so ist diese Methode beendet und das Programm arbei-tet den nachsten Befehl ab. Um den Container im Lager abzuholen, gibtes die Methode deliverContainer(). In dieser Methode werden samtlicheSchritte ausgefuhrt, die notig sind um den Container von seinem Platz zumAusgangsfeld zu transportieren. Zusatzlich wird in diesen Ausfuhrungsme-thoden der Elektromagnet angesteuert, der als Lichtsensor angegeben wird.Der Befehl Thread.sleep(3000) nach jedem Position Befehl ist notwen-dig, da sonst der LiftThread zu fruh beginnt und nicht richtig ausgefuhrtwird. Falls der Container uber dem zu liefernden Container auch ausge-liefert werden muss, wird dieser zuerst geliefert. Fur diesen Vorgang wirddie Methode deliverContainerDig() aufgerufen. Diese funktioniert gleichwie die Methode deliverContainer(), ausser dass ihr noch die Etage desContainers ubergeben wird. Muss der Container uber dem auszulieferndennicht auch geliefert werden, wird dieser an einen freien Platz verschoben.Dafur gibt es die Methode setContainer(), der die neuen Standortkoordi-naten ubergeben werden und so der Container an den neuen Platz gebrachtwird. Sobald der Container zuruck gestellt werden muss, wird die Metho-de returnContainer() aufgerufen. Dies ist die Umkehrung der MethodedeliverContainer(). Es ist auch moglich neue Produkte in das Lager auf-zunehmen, hierfur ist die Methode setContainer() verantwortlich. Diesebringt den Kran uber das Eingangsfeld, dort wird der neue Container auf-genommen und an einen freien Platz transportiert und der Kran fahrt amSchluss wieder in die Nullposition uber dem Eingang. Um dies auch in ande-ren Fallen zu ermoglichen, gibt es die reset() Methode.

F. Gammenthaler Automatisiertes Containerlager 15

Page 20: Automatisiertes Containerlager mit LEGO Mindstorms NXT · LEGO Mindstorms-Serie (RCX) entwickelt und erfolgreich in den USA auf den Markt gebracht. In Europa wurde LEGO Mindstorms

6 PROGRAMMKLASSEN

6.5 Betriebsablaufe

Diese Abschnitte zeigen, was geschieht, wenn ein neues Produkt angeliefertwird, ein Produkt aus dem Lager ausgeliefert wird oder ein Produkt zurKontrolle zum Ausgangsfeld gebracht wird.

6.5.1 Anlieferung

Wird ein neues Produkt angeliefert, dann reagiert der Ultraschallsensor aufdie Distanzveranderung. Dieses Signal aktiviert den Listener im Programm.Es wird nun auf dem NXT-Stein ein Ton mit der Frequenz 1760 Hz abgespielt,um darauf aufmerksam zu machen, dass ein neues Produkt im Eingang steht.Danach wird die Methode aufgerufen, die einen freien Platz sucht. Zu diesemZweck wird in einer for-Schleife der Feld-Array an der Stelle feld[i][4]nach einer 0 durchsucht, wobei i gerade der Feldnummer entspricht. Ist einfreies Feld gefunden worden, so wird die for-Schleife abgebrochen und derWert von i als Feldnummer zuruckgegeben. Es wird noch uberpruft, ob derZahler grosser ist als die Anzahl moglicher Abstellplatze, ist dies der Fall,wird eine Warnung ausgegeben, dass das Lager voll ist und der Anlieferungs-vorgang wird abgebrochen. Ansonsten wird dem neuen Produkt die Pro-duktnummer in der Untermethode getSerialNumber() zugewiesen. Dies ge-schieht wiederum in einer for-Schleife. Diese geht die gesamte Produktlistedurch und uberpruft, welche Nummer noch frei ist. Wenn die freie Produkt-nummer kleiner als 10 ist, wird ihr noch eine 0 vorangestellt, ansonsten wirdsie direkt an den Produktnamen angehangt. Dieser wird in einem Dialogfens-ter eingegeben, das beim vorangehenden Test aufgerufen wird. Zuletzt wirddann das Produkt der Liste zugefuhrt und die Untermethode verlassen.Falls der Roboter nicht am Arbeiten ist, werden nun die Koordinaten desfreien Feldes in den Variablen x, y und z gespeichert und das Feld als be-legt markiert. Der Konstruktor der Klasse Hallenkran wird aufgerufen undihm werden die Koordinatenvariablen ubergeben. Zudem werden alle But-tons im GUI deaktiviert. Danach wartet das Programm 10 Sekunden, bises weiter lauft. In dieser Zeit kann der Container beim Eingangsfeld rich-tig positioniert werden. Sind diese 10 Sekunden voruber, wird der BefehlHalle.setContainer() ausgefuhrt. Der Kran begibt sich zum Eingangsfeldund holt den Container ab. Dieser wird nun zu seinem Lagerplatz transpor-tiert und abgestellt. Schliesslich fahrt der Kran zu seiner Ausgangspositionzuruck und die Buttons werden wieder aktiviert. Der Roboter wartet nun aufden nachsten Arbeitsbefehl.

6.5.2 Auslieferung

Wird der Button mit der Aufschrift Entfernen gedruckt, so wird der Aus-lieferungsthread aktiviert. Es werden nun alle Buttons deaktiviert und einInformationsfenster wird geoffnet. Ist dies geschehen, wird gepruft, welcheProdukte aus der Liste ausgewahlt wurden. Es wird nun notig deren Pro-

16 Automatisiertes Containerlager F. Gammenthaler

Page 21: Automatisiertes Containerlager mit LEGO Mindstorms NXT · LEGO Mindstorms-Serie (RCX) entwickelt und erfolgreich in den USA auf den Markt gebracht. In Europa wurde LEGO Mindstorms

7 SITUATIONSUBERBLICK

duktnummern vom Namen abzutrennen und in einer Variablen zu speichern.Dies geschieht mit dem Befehl substring(). Dem Konstruktor Hallenkranwerden nun die Koordinaten des Platzes, auf welchem der Container stehtubergeben. Es muss nun gepruft werden, sofern sich der Container auf Etage0 oder 1 befindet, ob sich noch Container auf ihm befinden. Trifft diese Bedin-gung zu, wird er ausgegraben. Danach wird der Container zum Ausgangsfeldtransportiert und kann dort vom Containerlastwagen abgeholt werden.Diese Anwendung erlaubt es, mehrere Produkte gleichzeitig in der Liste aus-zuwahlen und aus dem Lager zu entfernen. Dank dem, dass die Produkt-nummern in einem Array gespeichert werden und einzeln abgearbeitet wer-den konnen. Zudem merkt der Roboter, wenn der Container uber dem, derausgegraben werden muss, auch ausgeliefert werden sollte. Es wird nun zu-erst dieser obere Container ausgeliefert und erst danach der, der unten dranvergraben war. Dies sollte etwas Zeit und Energie sparen.

6.5.3 Kontrolle

Die Anwendung, die es erlaubt Kontrollen durchzufuhren, ist dazu da, dieContainer zum Ausgangsfeld zu transportieren und sie wieder auf ihren Platzzuruckzustellen. Es kann so kontrolliert werden, ob der Container und derInhalt noch in einem guten Zustand sind, oder wenn Kuhlmaschinen an denContainern an- und ausgeschaltet werden mussen.Die Funktionsweise ist genau gleich wie bei der Auslieferung. Wurde derContainer auf das Ausgangsfeld abgesetzt, so wartet der Roboter, bis derBeruhrungssensor gedruckt wird. Nach der Betatigung des Beruhrungssen-sor wird der Container wieder an seinen ursprunglichen Platz zuruck gestellt.Danach wird im Produkte-Array geschaut, ob es noch mehr Container zuliefern gibt, wenn dies nicht der Fall ist, bringt sich der Kran wieder in Aus-gangsstellung und ist bereit fur den nachsten Auftrag. Sind noch weitereContainer zu kontrollieren, werden diese nach und nach abgearbeitet. Auchbei dieser Methode wird gepruft, ob es sich beim Container, der den Zugangzum Auszuliefernden versperrt, um einen handelt, der auch ausgeliefert wer-den musste. Ist dies der Fall, dann wird dieser zuerst bearbeitet und danachnicht mehr an den selben Ort zuruck gestellt, um Arbeitsweg einsparen zukonnen.

7 Situationsuberblick

Das Grafikfenster, das anzeigt, wo sich der Kran zur Zeit befindet, ist aufeinem GPanel aufgebaut. GPanel ist eine Grafikoberflache aus der Libraryvon Herrn Prof. Dr. Pluss, der mit einfachen Befehlen Quadrate eingesetztwerden konnen. Diese Grundlage war die ideale Losung, um die Position desKrans in einem eigenen Fenster anzuzeigen. Die Information wo sich der Kranbefindet wird mit der Methode getPosition() ermittelt. Diese Funktion liestdie aktuelle Gradzahl vom Tacho des Motors ab und dividiert sie durch den

F. Gammenthaler Automatisiertes Containerlager 17

Page 22: Automatisiertes Containerlager mit LEGO Mindstorms NXT · LEGO Mindstorms-Serie (RCX) entwickelt und erfolgreich in den USA auf den Markt gebracht. In Europa wurde LEGO Mindstorms

8 DER ELEKTROMAGNET

Einheitswinkel. Dieser Winkel gibt an, um wie viel sich der Motor drehenmuss, bis er sich eine Koordinateneinheit weiter bewegt hat. Das Resultatdieser Division ergibt die Koordinate, wo sich der Kran befindet. Da dasGPanel die selben Koordinaten hat wie die Halle, kann die Position eins zueins ubernommen werden und angezeigt werden.

8 Der Elektromagnet

Der Elektromagnet, der aus einem Relais stammt, ist ungefahr in der Mittedes Kranarmes angebracht. Ein Relais ist ein Schalter, der von einem Steu-erstromkreis angesteuert wird, wodurch dessen Magnet aktiviert und so derexterne Stromkreis geschlossen wird.Es war nicht sehr einfach den Magneten so anzubringen, dass er auch halt.

Abbildung 8: Elektormagnet am alten Kranarm

Schliesslich wurde er zwischen LEGO Technic-Teile eingeklemmt und mitDoppelklebeband fixiert. Die Kabel, die vom Magneten zur Schaltung fuhren,kamen dem Kran beim Senken immer in den Weg. Es wurde ein Teil an denKranarm angebaut, an dem dann die Kabel befestigt wurden. Damit konn-te das Problem nicht vollstandig gelost werden. Da die Kabel eine gewisseLange benotigen, ist es nicht moglich, sie optimal zu befestigen.

8.1 Elektronische Schaltung

Um den Elektromagneten ein- und auszuschalten, wurde ausgenutzt, dass esmoglich ist, die LED im Lichtsensor ein- und auszuschalten. Dieser Stromim-puls wird als Steuerstrom auf ein Relais geleitet, das den externen Strom-kreis, der von einer 9-V-Batterie gespiesen wird, einschaltet oder ausschaltetund somit den Magneten aktiviert oder deaktiviert. Der Steuerstrom kommt

18 Automatisiertes Containerlager F. Gammenthaler

Page 23: Automatisiertes Containerlager mit LEGO Mindstorms NXT · LEGO Mindstorms-Serie (RCX) entwickelt und erfolgreich in den USA auf den Markt gebracht. In Europa wurde LEGO Mindstorms

9 SCHLUSSWORT

vom NXT uber den Pin 5, dem gelben Kabel, und hat eine Spannung von3 Volt. Diese 3 Volt fliessen auf den Transistor, der, sobald der Steuerstromauftrifft, den Hauptstrom von 7 Volt durchlasst. Zwischen dem NXT unddem Transistor ist ein 330 kΩ Widerstand eingebaut. Diese Spannung von 7Volt tritt zwischen dem Pin 4, dem grunen Kabel, und dem Pin 2 GND (=ground), schwarzes Kabel, auf. Das zwischengeschaltete Relais schliesst beiden 7 Volt den externen Stromkreis und aktiviert so den Elektromagneten.Wird der Steuerstrom deaktiviert, lasst der Transistor die 7 Volt nicht mehrdurch und das Relais offnet den externen Stromkreis.

9 Schlusswort

Abschliessend ist zu sagen, dass alle Ziele erreicht wurden. Die automa-tische Produkterkennung konnte auf Grund der momentanen technischenAusrustung nicht umgesetzt werden. Dies ware allerdings eine Moglichkeitder Weiterfuhrung, vielleicht mit Barcodes oder mit Transponderchips, furwelche LEGO Mindstorms einen eigenen Lesekopf entwickelt hat. Ansonstenkonnte man eine Optimierung des ganzen Systems durchfuhren.

F. Gammenthaler Automatisiertes Containerlager 19

Page 24: Automatisiertes Containerlager mit LEGO Mindstorms NXT · LEGO Mindstorms-Serie (RCX) entwickelt und erfolgreich in den USA auf den Markt gebracht. In Europa wurde LEGO Mindstorms

GLOSSAR

Glossar

[Antriebswelle] Ein Bauteil, das zur Kraftubertragung zwischen dem Mo-tor und den Zahnradern dient.

[Array] Eine Liste von Variablen des gleichen Typs (Informatik).

[Balsaholz] Leichtes tropisches Nutzholz.

[Bit] Ist die Bezeichnung fur eine Binarstelle, 0 oder 1.

[Bluetooth] Eine Funktechnologie die zur drahtlosen Kommunikation zwi-schen elektronischen Geraten dient.

[Brucke] Hier: Die fahrbare Verbindung zwischen den beiden Hallenwanden,auf der die Laufkatze fahrt.

[Bruckenfahrer] Person, die einen Hafenkran steuert.

[Byte] Besteht aus 8 Bit

[Firmware] Ist eine fest eingebaute Software in einem elektronischen Geratund nur durch spezielle Techniken auszutauschen.

[FLASH-Speicher] Ist ein Medium, auf dem Daten gespeichert und auchjederzeit wieder abgerufen werden konnen. Behalt die Daten auch nachdem Ausschalten des Gerates.

[For-Schleife] In der Programmiersprache JAVA vertretene Zahlschleife, diesolange wiederholt wird, bis der Grenzwert erreicht wird.

[Fototransistor] Aendert den elektrischen Widerstand auf Grund der Lichtin-tensitat.

[Instanzvariablen] In der Informatik handelt es sich hier um eine Grosse,die verschiedene Werte des selben Typs annehmen kann.

[Klasse] Dient als Bauplan fur Abbildung von realen Objekten in Software-objekten und enthalt Eigenschaften und Verhaltensweisen der Objekte.

[Laufkatze] Ist ein bewegliches Kranbauteil, das die Lastseile umleitet.

[LCD] Steht fur Liquid Crystal Displays (Flussigkeitskristalanzeigen).

[LED] Steht fur Light Emitting Diode (Leuchtdiode oder Lumineszenz-Diode).

[LEGO connector peg] Ist ein LEGO Technic Teil, das es ermoglicht LEGOTechnic Teile miteinander zu verbinden.

[Library] Bezeichnet in der Informatik eine Sammlung von Programmfunk-tionen fur gleichartige Aufgaben.

20 Automatisiertes Containerlager F. Gammenthaler

Page 25: Automatisiertes Containerlager mit LEGO Mindstorms NXT · LEGO Mindstorms-Serie (RCX) entwickelt und erfolgreich in den USA auf den Markt gebracht. In Europa wurde LEGO Mindstorms

GLOSSAR

[Listener] Wird in ereignisgesteuerten Programmen verwendet und wartetbis ein bestimmtes Ereignis eintritt.

[Mikrocontroller] Ist ein Ein-Chip-Computersystem, das selbstandig lauft.

[RAM] Steht fur Random Access Memory und ist der Arbeitsspeicher desComputers.

[Relais] Schaltelement, das mit geringer Steuerleistung eine relative hoheArbeitsleistung schaltet; Schaltung mittels Elektromagneten.

[Roboter] Eine Maschine, die in stationarer oder mobiler Position autonomArbeiten verrichtet.

[Robotertechnologie] Dient zur Entwicklung autonom gesteuerten Syste-men.

[Sample Rate] Gibt an wie haufig ein kontinuierliches Signal abgetastetwird und in ein zeitdiskretes Signal umgewandelt wird

[Software] Wird zum Betrieb von EDV-Geraten verwendet.

[Status] Gibt den aktuellen Arbeitszustand an.

[Transistor] Halbleiterbauelement zur Verstarkung von elektrischen Stromenund Spannungen.

[Transponderchips] Ist ein Bauteil, das Funksignale empfangen und sen-den kann.

[USB] Steht fur Universal Serial Bus und ist eine moderne serielle Schnitt-stelle zum Anschliessen externer Gerate an eine Computer.

[While-Schleife] In der Programmiersprache JAVA vertretene Wiederho-lungsschleife; Wiederholt solange, als dass die Abbruchbedingung nichterfullt ist.

[Zahnstangen] Hier: LEGO Bauteil, das eine gerippte Oberflache hat, inder Zahnrader greifen konnen.

F. Gammenthaler Automatisiertes Containerlager 21

Page 26: Automatisiertes Containerlager mit LEGO Mindstorms NXT · LEGO Mindstorms-Serie (RCX) entwickelt und erfolgreich in den USA auf den Markt gebracht. In Europa wurde LEGO Mindstorms

ABBILDUNGEN

Quellenverzeichnis

[1] Claudia Frischknecht & Thomas Other.ETH Zurich und TIK. 7.Juli 2006.Kapitel 2.1 Historischer Hintergrund und Kapitel 2.2.2 Produktinhalt – An-gaben des Herstellers.ftp://ftp.tik.ee.ethz.ch/pub/students/2006-So/SA-2006-18.pdf[Stand: 17.08.2009]

[2] DasErste.de. W wie Wissen. Ruckschau: Hamburg - Hafen der Maschinen.Sonntag, 24. Mai 2009http://www.daserste.de/wwiewissen/beitrag_dyn~uid,3cpmm8ozz5b9nu8j~cm.aspVideo:http://mediathek.daserste.de/daserste/servlet/content/2459992?pageId=487872&moduleId=427262&categoryId=&goto=4&show=[Stand: 24.09.2009]

[3] HHLA Hamburger Hafen und Logistik AG: Umschlag. Container TerminalAltenwerder (CTA).http://www.hhla.de/Umschlag.147.0.html?&no_cache=1[Stand: 24.09.2009]

[4] Lego Mindstorms Education. Der NXT Beruhrungssensor.http://www.nxt-in-der-schule.de/lego-mindstorms-education-nxt-system/nxt-hardware/sensoren[Stand: 16.08.2009]

[5] Lego Mindstorms Education. Der NXT Ultraschallsensor.http://www.nxt-in-der-schule.de/lego-mindstorms-education-nxt-system/nxt-hardware/sensoren[Stand: 16.08.2009]

[6] WWU-Institut fur Technik und ihre Didaktik. Der Gerauschesensor.http://www.uni-muenster.de/EUREGIO-team/team/inhalt_ss_05/nxt/Sensoren_einf.ppt[Stand: 17.08.2009]

[7] WWU-Institut fur Technik und ihre Didaktik. Der Lichtsensor.http://www.uni-muenster.de/EUREGIO-team/team/inhalt_ss_05/nxt/Sensoren_einf.ppt[Stand: 17.08.2009]

[8] WWU-Institut fur Technik und ihre Didaktik. Der Ultraschallsensor.http://www.uni-muenster.de/EUREGIO-team/team/inhalt_ss_05/nxt/Sensoren_einf.ppt[Stand: 16.08.2009]

[9] Lego Mindstorms NXT Bedienungsanleitung. S.11 gelber Kasten.

22 Automatisiertes Containerlager F. Gammenthaler

Page 27: Automatisiertes Containerlager mit LEGO Mindstorms NXT · LEGO Mindstorms-Serie (RCX) entwickelt und erfolgreich in den USA auf den Markt gebracht. In Europa wurde LEGO Mindstorms

ABBILDUNGEN

Abbildungen

Alle Abbildungen in dieser Arbeit wurden vom Verfasser aufgenommen undvon ihm bearbeitet.

Beilage

Dieser Arbeit ist eine CD beigelegt. Die CD enthalt den JAVA Quellcodedes Programmes fur dieses Modell der automatisierten Lagerhalle. Zudementhalt die CD das Video, welches an der Prasentation gezeigt wurde.

Selbstandigkeitserklarung

Ich erklare hiermit, dass ich diese Arbeit selbstandig verfasst und keine an-deren als die angegeben Quellen benutzt habe. Das Informationsblatt

”Plagi-

atserkennung“ ist mir bekannt und somit auch die Konsequenzen eines Teil-oder Vollplagiates.

Hinterkappelen, den 3. November 2009

Fabian Gammenthaler

F. Gammenthaler Automatisiertes Containerlager 23

Page 28: Automatisiertes Containerlager mit LEGO Mindstorms NXT · LEGO Mindstorms-Serie (RCX) entwickelt und erfolgreich in den USA auf den Markt gebracht. In Europa wurde LEGO Mindstorms

A WICHTIGE QUELLCODE

A Wichtige Quellcode

A.1 Kontrollzentrum.java

package ch . h inte rkappe l en . fab ian . KontrollzentrumMA 3 ;

import ch . aplu . nxt . ∗ ;import ch . aplu . u t i l . GPanel ;import java . awt . Color ;import java . t ext . SimpleDateFormat ;import java . u t i l . Calendar ;import java . u t i l . l ogg ing . Level ;import java . u t i l . l ogg ing . Logger ;import javax . swing . JOptionPane ;

/∗∗∗∗ @author Fabian∗ Vers ion 6 .11∗/

pub l i c c l a s s Kontrol lzentrum extends javax . swing . JFrame

/∗∗ Creates new form Kontrol lzentrum ∗/pub l i c Kontrol lzentrum ()

initComponents ( ) ; / / Ruft den Code f u r d i e Gra f i kobe r f l a c h e auff o r ( i n t i = 0 ; i < produkt . l ength ; i++)

produktLis te . add ( produkt [ i ] , i ) ; // f u l l t L i s t e mit Standart Produktennew DateThread ( ) . s t a r t ( ) ; //Der Thread f u r d i e Zeitangabe wird g e s t a r t e t//Der Thread f u r e in neues Produkt wird g e s t a r t e tnew newProductThread ( ) . s t a r t ( ) ;//Der Pos i t i on s th r ead des Krans wird g e s t a r t e tnew Situat ionThread ( ) . s t a r t ( ) ;

@SuppressWarnings (” unchecked ”) // Gener i e r t d i e Gra f i kobe r f l a c h e// <ed i to r−f o l d d e f a u l t s t a t e=”co l l ap s ed ” desc=”Generated Code”>//GEN−BEGIN: initComponentsp r i va t e void initComponents ( )

jLabe l1 = new javax . swing . JLabel ( ) ;jLabe l2 = new javax . swing . JLabel ( ) ;jSeparato r1 = new javax . swing . JSeparator ( ) ;be s tae t i gung = new javax . swing . JButton ( ) ;ent f e rnen = new javax . swing . JButton ( ) ;j S c ro l lPane4 = new javax . swing . JScro l lPane ( ) ;produktInfo = new javax . swing . JTextArea ( ) ;jLabe l3 = new javax . swing . JLabel ( ) ;jLabe l4 = new javax . swing . JLabel ( ) ;produktLi s te = new java . awt . L i s t ( ) ;menu = new javax . swing . JMenuBar ( ) ;da t e i = new javax . swing . JMenu ( ) ;beenden = new javax . swing . JMenuItem ( ) ;h i l f e = new javax . swing . JMenu ( ) ;about = new javax . swing . JMenuItem ( ) ;date = new javax . swing . JLabel ( ) ;menu1 = new javax . swing . JMenuBar ( ) ;da te i 1 = new javax . swing . JMenu ( ) ;beenden1 = new javax . swing . JMenuItem ( ) ;h i l f e 1 = new javax . swing . JMenu ( ) ;about1 = new javax . swing . JMenuItem ( ) ;

s e tDe fau l tC loseOperat ion ( javax . swing . WindowConstants .EXIT ON CLOSE ) ;s e tT i t l e (” Kontrol lzentrum ” ) ;setCursor (new java . awt . Cursor ( java . awt . Cursor .DEFAULT CURSOR) ) ;setExtendedState ( javax . swing . JFrame .MAXIMIZED BOTH) ;setMinimumSize ( nu l l ) ;

jLabe l1 . setText (” Kontrol lzentrum ” ) ;

jLabe l2 . s e t I c on (new javax . swing . ImageIcon ( ge tClas s ( ) . getResource (”/ch/ h inte rkappe l en / fab ian /KontrollzentrumMA 3/Bi ld1 . jpg ” ) ) ) ; // NOI18N

bes tae t i gung . setText (” Best a t i gen ” ) ;be s tae t i gung . setToolTipText (” Hiermit be s t a t i g en S i e Ihre Auswahl ” ) ;be s tae t i gung . setEnabled ( f a l s e ) ;be s tae t i gung . addAct ionListener (new java . awt . event . Act ionL i s t ener ( )

pub l i c void act ionPerformed ( java . awt . event . ActionEvent evt ) bestaet igungAct ionPerformed ( evt ) ;

) ;

ent f e rnen . setText (” Entfernen ” ) ;ent f e rnen . setToolTipText (” Hiermit konnen S ie das ausgewahlte Produkt aus der L i s t e ent f e rnen ” ) ;ent f e rnen . setEnabled ( f a l s e ) ;ent f e rnen . addAct ionListener (new java . awt . event . Act ionL i s t ene r ( )

pub l i c void act ionPerformed ( java . awt . event . ActionEvent evt ) entfernenAct ionPerformed ( evt ) ;

) ;

24 Automatisiertes Containerlager F. Gammenthaler

Page 29: Automatisiertes Containerlager mit LEGO Mindstorms NXT · LEGO Mindstorms-Serie (RCX) entwickelt und erfolgreich in den USA auf den Markt gebracht. In Europa wurde LEGO Mindstorms

A WICHTIGE QUELLCODE A.1 Kontrollzentrum.java

produktInfo . setColumns ( 2 0 ) ;produktInfo . s e tEd i t ab l e ( f a l s e ) ;produktInfo . setRows ( 5 ) ;j S c ro l lPane4 . setViewportView ( produktInfo ) ;

jLabe l3 . setText (” Produkt l i s t e ” ) ;

jLabe l4 . setText (” Produktinformation ” ) ;

produktLi s te . setMultipleMode ( t rue ) ;produktLi s te . setName (” Produkt l i s t e ” ) ; // NOI18NproduktLis te . addItemListener (new java . awt . event . I t emLis tener ( )

pub l i c void itemStateChanged ( java . awt . event . ItemEvent evt ) produktListeItemStateChanged ( evt ) ;

) ;

da t e i . setText (” Datei ” ) ;

beenden . s e tAc c e l e r a t o r ( javax . swing . KeyStroke . getKeyStroke ( java . awt . event .KeyEvent .VK F4 , java . awt . event . InputEvent .ALT MASK) ) ;

beenden . setText (”Beenden ” ) ;beenden . addAct ionListener (new java . awt . event . Act i onL i s t ener ( )

pub l i c void act ionPerformed ( java . awt . event . ActionEvent evt ) beendenActionPerformed ( evt ) ;

) ;da t e i . add ( beenden ) ;

menu . add ( da t e i ) ;

h i l f e . setText (” H i l f e ” ) ;

about . s e tAc c e l e r a t o r ( javax . swing . KeyStroke . getKeyStroke ( java . awt . event . KeyEvent .VK F7 , 0 ) ) ;

about . setText (” Uber Kontrol lzentrum ” ) ;about . addAct ionListener (new java . awt . event . Act ionL i s t ener ( )

pub l i c void act ionPerformed ( java . awt . event . ActionEvent evt ) aboutActionPerformed ( evt ) ;

) ;h i l f e . add ( about ) ;

menu . add ( h i l f e ) ;

date . setText ( ” ” ) ;

da te i 1 . setText (” Datei ” ) ;

beenden1 . s e tAc c e l e r a t o r ( javax . swing . KeyStroke . getKeyStroke ( java . awt . event .KeyEvent .VK F4 , java . awt . event . InputEvent .ALT MASK) ) ;

beenden1 . setText (”Beenden ” ) ;beenden1 . addAct ionListener (new java . awt . event . Act i onL i s t ene r ( )

pub l i c void act ionPerformed ( java . awt . event . ActionEvent evt ) beendenActionPerformed ( evt ) ;

) ;da te i 1 . add ( beenden1 ) ;

menu1 . add ( date i 1 ) ;

h i l f e 1 . setText (” H i l f e ” ) ;

about1 . s e tAc c e l e r a t o r ( javax . swing . KeyStroke . getKeyStroke ( java . awt . event . KeyEvent .VK F7 , 0 ) ) ;

about1 . setText (” Uber Kontrol lzentrum ” ) ;about1 . addAct ionListener (new java . awt . event . Act i onL i s t ene r ( )

pub l i c void act ionPerformed ( java . awt . event . ActionEvent evt ) aboutActionPerformed ( evt ) ;

) ;h i l f e 1 . add ( about1 ) ;

menu1 . add ( h i l f e 1 ) ;

setJMenuBar (menu1 ) ;

javax . swing . GroupLayout layout = new javax . swing . GroupLayout ( getContentPane ( ) ) ;getContentPane ( ) . setLayout ( layout ) ;layout . setHor izonta lGroup (

layout . c r ea tePara l l e lGroup ( javax . swing . GroupLayout . Alignment .LEADING). addGroup ( javax . swing . GroupLayout . Alignment .TRAILING, layout . createSequent ia lGroup ( )

. addContainerGap ( )

. addGroup ( layout . c r ea t ePara l l e lGroup ( javax . swing . GroupLayout . Alignment .LEADING, f a l s e ). addGroup ( layout . createSequent ia lGroup ( )

. addComponent ( bes tae t i gung )

. addPreferredGap ( javax . swing . LayoutStyle . ComponentPlacement .RELATED)

. addComponent ( ent f e rnen ) ). addComponent ( jLabe l3 ). addComponent ( produktListe , javax . swing . GroupLayout .DEFAULT SIZE,

javax . swing . GroupLayout .DEFAULT SIZE, Short .MAX VALUE)). addPreferredGap ( javax . swing . LayoutStyle . ComponentPlacement .RELATED). addGroup ( layout . c r ea t ePara l l e lGroup ( javax . swing . GroupLayout . Alignment .LEADING)

. addComponent ( jScro l lPane4 , javax . swing . GroupLayout .DEFAULT SIZE, 478 , Short .MAX VALUE)

F. Gammenthaler Automatisiertes Containerlager 25

Page 30: Automatisiertes Containerlager mit LEGO Mindstorms NXT · LEGO Mindstorms-Serie (RCX) entwickelt und erfolgreich in den USA auf den Markt gebracht. In Europa wurde LEGO Mindstorms

A.1 Kontrollzentrum.java A WICHTIGE QUELLCODE

. addComponent ( jLabe l4 ) ). addContainerGap ( ) )

. addComponent ( jSeparator1 , javax . swing . GroupLayout . Alignment .TRAILING,javax . swing . GroupLayout .DEFAULT SIZE, 678 , Short .MAX VALUE)

. addGroup ( layout . createSequent ia lGroup ( ). addComponent ( jLabe l1 ). addGap(148 , 148 , 148). addComponent ( date , javax . swing . GroupLayout .PREFERRED SIZE, 210 ,

javax . swing . GroupLayout .PREFERRED SIZE). addPreferredGap ( javax . swing . LayoutStyle . ComponentPlacement .RELATED,

193 , Short .MAX VALUE). addComponent ( jLabe l2 ) )

) ;layout . se tVert i ca lGroup (

layout . c r ea tePara l l e lGroup ( javax . swing . GroupLayout . Alignment .LEADING). addGroup ( layout . createSequent ia lGroup ( )

. addContainerGap ( javax . swing . GroupLayout .DEFAULT SIZE, Short .MAX VALUE)

. addGroup ( layout . c r ea t ePara l l e lGroup ( javax . swing . GroupLayout . Alignment .BASELINE). addComponent ( jLabel3 , javax . swing . GroupLayout .PREFERRED SIZE, 14 ,

javax . swing . GroupLayout .PREFERRED SIZE). addComponent ( jLabe l4 ) )

. addPreferredGap ( javax . swing . LayoutStyle . ComponentPlacement .RELATED)

. addGroup ( layout . c r ea t ePara l l e lGroup ( javax . swing . GroupLayout . Alignment .TRAILING). addComponent ( produktListe , javax . swing . GroupLayout .DEFAULT SIZE, 277 ,

Short .MAX VALUE). addComponent ( jScro l lPane4 , javax . swing . GroupLayout .PREFERRED SIZE, 277 ,

javax . swing . GroupLayout .PREFERRED SIZE) ). addPreferredGap ( javax . swing . LayoutStyle . ComponentPlacement .RELATED). addGroup ( layout . c r ea t ePara l l e lGroup ( javax . swing . GroupLayout . Alignment .BASELINE)

. addComponent ( bes tae t i gung )

. addComponent ( ent f e rnen ) ). addPreferredGap ( javax . swing . LayoutStyle . ComponentPlacement .RELATED). addComponent ( jSeparator1 , javax . swing . GroupLayout .PREFERRED SIZE,javax . swing . GroupLayout .DEFAULT SIZE, javax . swing . GroupLayout .PREFERRED SIZE). addPreferredGap ( javax . swing . LayoutStyle . ComponentPlacement .RELATED). addGroup ( layout . c r ea t ePara l l e lGroup ( javax . swing . GroupLayout . Alignment .LEADING)

. addGroup ( layout . c r ea t ePara l l e lGroup ( javax . swing . GroupLayout . Alignment .BASELINE). addComponent ( date , javax . swing . GroupLayout .PREFERRED SIZE, 14 ,

javax . swing . GroupLayout .PREFERRED SIZE). addComponent ( jLabe l1 ) )

. addComponent ( jLabe l2 ) ) )) ;

pack ( ) ;// </ed i to r−f o ld >//GEN−END: initComponents

p r i va t e void bestaet igungAct ionPer formed ( java . awt . event . ActionEvent evt ) //GEN−FIRST : event bestaet igungAct ionPer formed

// S ta r t e t be i Button Bet at igung den L i e f e rungs th readnew Del iverThread ( ) . s t a r t ( ) ;

//GEN−LAST: event bestaet igungAct ionPer formed

pr i va t e void aboutActionPerformed ( java . awt . event . ActionEvent evt ) //GEN−FIRST : event aboutActionPerformed

new About ( ) . s e tV i s i b l e ( t rue ) ; // S ta r t e t das Fenster About//GEN−LAST: event aboutActionPerformed

pr i va t e void beendenActionPerformed ( java . awt . event . ActionEvent evt ) //GEN−FIRST : event beendenActionPerformed

System . e x i t ( 0 ) ; // S c h l i e s s t das Programm//GEN−LAST: event beendenActionPerformed

pr i va t e void entfernenAct ionPerformed ( java . awt . event . ActionEvent evt ) //GEN−FIRST : event ent fernenAct ionPer formed

// S ta r t e t be i Button Bet at igung den Aus l i e f e rungs th r eadnew DeleteThread ( ) . s t a r t ( ) ;

//GEN−LAST: event ent fernenAct ionPer formed

pr i va t e void produktListeItemStateChanged ( java . awt . event . ItemEvent evt ) //GEN−FIRST : event produktListeItemStateChanged

// item e rh a l t den Namen des ProduktesSt r ing [ ] item = produktLis te . g e tSe l e c t ed I t ems ( ) ;i n t [ ] index = new in t [ item . l ength ] ; // index e rh a l t d i e Lange des item// f u r den Index wird d i e Methode searchProduct ( ) au fge ru f enindex = searchProduct ( ) ;// S c h r i f t f a r b e wird auf Schwarz g e s e t z tproduktInfo . setForeground (new java . awt . Color (0 , 0 , 0 ) ) ;produktInfo . setTabSize ( 7 ) ; / / Die Tabulator g r o s s e wird auf 7 Zeichen g e s e t z t// Al l e Texte in dem Feld produktInfo werden ge l o s ch tproduktInfo . setText ( nu l l ) ;i f ( item . l ength < 1)//Wenn d ie Lange von item 0 oder k l e i n e r i s t e r s c h e i n t

produktInfo . setText (” Kein Prdoukt ausgewahlt ! ” ) ; / / d i e s e r I n f o t e x tbes tae t i gung . setEnabled ( f a l s e ) ; / / und d ie Buttons werden d e ak t i v i e r tent f e rnen . setEnabled ( f a l s e ) ;

e l s e //wenn d i e s n i cht z u t r i e f tbe s tae t i gung . setEnabled ( t rue ) ; / / werden d ie Buttons a k t i v i e r tent f e rnen . setEnabled ( t rue ) ;produktInfo . setText (” Produkte :\ tFeldnr . : \ tAn l i e f e rung :\n ” ) ;f o r ( i n t i = 0 ; i < index . l ength ; i ++)//dem In fo Feld den Text ubergeben

produktInfo . append ( item [ i ] +//Gibt an auf welechm Feld d i e//Produkte zu f inden s ind”\ t ” + ( index [ i ] + 1) + ”\ t\ t ” +

26 Automatisiertes Containerlager F. Gammenthaler

Page 31: Automatisiertes Containerlager mit LEGO Mindstorms NXT · LEGO Mindstorms-Serie (RCX) entwickelt und erfolgreich in den USA auf den Markt gebracht. In Europa wurde LEGO Mindstorms

A WICHTIGE QUELLCODE A.1 Kontrollzentrum.java

//und wann s i e a n g e l i e f e r t wurdende l ivDate [ index [ i ] ] + ”\n ” ) ;

produktInfo . append (”\ nAnzahl ausgewah lter Produkte : ” + item . l ength ) ; //Obenstehender Befeh l f u g t dem Text hinzu , wie v i e l e Produkte ausgewahlt

//wurden//GEN−LAST: event produktListeItemStateChanged

pub l i c s t a t i c void main ( St r ing args [ ] ) //main Methodejava . awt . EventQueue . invokeLater (new Runnable ( ) // S ta r t e t das runnable

pub l i c void run ( ) // de f f u r Runnable// Gra f i kobe r f l a c h e wird s i ch tba rnew Kontrol lzentrum ( ) . s e tV i s i b l e ( t rue ) ;f o r ( i n t i = 0 ; i < anzah lFe lder ; i++)

f e l d [ i ] [ 0 ] = i + 1;// Die Conta in e r f e l d e rf e l d [ i ] [ 4 ] = 0;//1 − anzah lFe lder werden dem Arrayf e l d [ i ] [ 5 ] = 0 ;// e inge s ch r i eb en

f o r ( i n t j = 0 ; j < produkt . l ength ; j++)

//Die be l eg ten Felder werden mit e i n e r 1 versehenf e l d [ j ] [ 4 ] = 1 ;//Die Produktnummern werden e i n g e t e i l tf e l d [ j ] [ 5 ] = j + 1 ;// Anlieferungsdatum wird g e s e t z tde l ivDate [ j ] = ”Mo, 13 . J u l i 2009 10 : 5 5 : 0 0 ” ;

f o r ( i n t z = 0 ; z < anzah lFe lder ; z++)

yachse++;i f ( yachse > 2)//Wenn der y−Achsenabschnitt g r o s s e r a l s 2

yachse = 0;// i s t , wird er wieder auf Nul l g e s e t z t undxachse++; // der x−Achsenabschnitt wird um 1 erhoht .i f ( xachse == 4 && yachse == 0)

yachse++;i f ( xachse > 4)//Wenn der x−Achsenabschnitt g r o s s e r

yachse = 1;// a l s 4 i s t , wird er und derxachse = 0;//y−Achsenabschnitt auf Nul l g e s e t z tzachse++;//und der z−Achsenabschnitt um e in s erhoht

f e l d [ z ] [ 1 ] = xachse ;// x−Achsenabschnitt wird dem Array zugeordnetf e l d [ z ] [ 2 ] = yachse ;// y−Achsenabschnitt wird dem Array zugeordnetf e l d [ z ] [ 3 ] = zachse ;// z−Achsenabschnitt wird dem Array zugeordnet

) ;// Diese Methode searchProduct ( ) sucht nach der Feldnummer des Produktsp r i va t e i n t [ ] searchProduct ( )

i n t z a eh l e r = 0;// Var iab le Z ah ler wird auf Nul l g e s e t z tSt r ing [ ] item = produktLis te . g e tSe l e c t ed I t ems ( ) ; / /Dem Item wird Produktname e i n g e l e s e nSt r ing [ ] zahlen = new Str ing [ item . l ength ] ; / / der St r ing Zahlen e rh a l t d i e Lange von itemin t [ ] f e l d n r = new in t [ item . l ength ] ; / / der int−Array Feldnummer e rh a l t d i e Lange von itemin t [ ] nummer = new in t [ item . l ength ] ; / / der int−Array Nummer e rh a l t d i e Lange von itemf o r ( i n t i = 0 ; i < item . l ength ; i++)

//Der St r ing Zahlen e rh a l t d i e l e t z t e n 2 Zeichen von itemzahlen [ i ] = item [ i ] . s ub s t r i ng ( item [ i ] . l ength ()−2);nummer [ i ] = In t eg e r . pa r s e In t ( zahlen [ i ] ) ; / / d i e St r ing Zahlen werden nun zu In t ege r .

f o r ( i n t j = 0 ; j < anzah lFe lder ; j++) // in d i e s en S ch l e i f e n wird

f o r ( i n t z = 0 ; z < item . l ength ; z++)//gesucht auf welchem Fledi f ( f e l d [ j ] [ 5 ] == nummer [ z ] )// s i ch das Produkt be f i nde t

f e l dn r [ z a eh l e r ] = j ;z a eh l e r++;

re turn f e l dn r ;

// Dieser Thread i s t zust and ig f u r das Entfernen von Produktenpr i va t e c l a s s DeleteThread extends Thread

@Overridepub l i c void run ()

t ry

t e s t = f a l s e ; // Die boolean Var iab le wird auf f a l s e g e s e t z tHal lenkran ha l l e = new Hal lenkran ( c rane ) ; / / e in neuer Hal lenkran wird i n s t a n z i e r tbes tae t i gung . setEnabled ( f a l s e ) ; //Die Buttons werden d e ak t i v i e r tent f e rnen . setEnabled ( f a l s e ) ;setEnabled ( f a l s e ) ; //Das gesamte Fenster wird d e a k t i v i e r t

Status s t a tu s = new Status ( ) ; //Das Fenster Status wird g e o f f n e ts t a tu s . s e tV i s i b l e ( t rue ) ; / / und s i ch tba r gemachti n t [ ] index = produktLis te . g e tSe l e c t ed Indexe s ( ) ; / / Index wird dem// ausgewahlten Produkt entnommenSt r ing [ ] item = produktLis te . g e tSe l e c t ed I t ems ( ) ; / / Item e rh a l t ProduktnameSt r ing [ ] zahlen = new Str ing [ item . l ength ] ; / / der St r ing Zahlen e rh a l t d i e Lange von itemin t [ ] nummer = new in t [ item . l ength ] ; // der int−Array Feldnummer e rh a l t d i e Lange von itemcount = index . l ength ;// Zahlt wie v i e l e Produkte ausgewahlt wurdenin t [ ] f e l d n r = searchProduct ( ) ; / / searchProduct g ib t Feldnummer zuruckf o r ( i n t i = 0 ; i < index . l ength ; i++)

//Ein neuer Hal lenkran wird g e o f f n e th a l l e = new Hal lenkran ( f e l d [ f e l d n r [ i ] ] [ 1 ] , f e l d [ f e l d n r [ i ] ] [ 2 ] ,

F. Gammenthaler Automatisiertes Containerlager 27

Page 32: Automatisiertes Containerlager mit LEGO Mindstorms NXT · LEGO Mindstorms-Serie (RCX) entwickelt und erfolgreich in den USA auf den Markt gebracht. In Europa wurde LEGO Mindstorms

A.1 Kontrollzentrum.java A WICHTIGE QUELLCODE

f e l d [ f e l d n r [ i ] ] [ 3 ] , c rane ) ;// Fa l l s s i c h das Produkt auf Etage 0 oder 1 be f i nde t wird// geschaut ob es ausgegrabeni f ( f e l d [ f e l d n r [ i ] ] [ 3 ] < 2 && f e l d [ f e l d n r [ i ] ] [ 5 ] != 0)//werden muss

digContainerOut ( f e l d [ f e l dn r [ i ] ] [ 3 ] , f e l d n r [ i ] , h a l l e ) ;h a l l e . d e l i v e rConta ine r ( ) ; / / Der Container wird zum ausgangs Feld gebrachti f ( z t e s t )// f a l l s z t e s t true , dann wird

count −= 1;// count r eduz i e r t , damit man noch we i s s //wie v i e l e Produkte zubearbe i t en s indi f ( f e l d [ f e l d n r [ i ] ] [ 3 ] == 2)

ha l l e . d e l i v e rConta ine r ( ) ; / / Der Container wird zum ausgangs Feld gebrachtcount −= 1;// count um e in s r e du z i e r t

f e l d [ f e l d n r [ i ] ] [ 4 ] = 0 ; // Diese r Platz i s t nun wieder f r e i f u r e in neues Produktf e l d [ f e l d n r [ i ] ] [ 5 ] = 0 ; //Die Produktnummer wird wieder f r e i g e g ebende l ivDate [ f e l dn r [ i ] ] = ””;//Das Eingangsdatum wird ge l o s ch t

i f ( count == 0)// Sobald a l l e Produkte b ea rb e i t e t sind , wirdbreak ;// d i e for−S c h l e i f e abgebrochen

ha l l e . r e s e t ( ) ; / / Der Kran wird auf s e i n e Ausgangspos i t ion ge fahrenf o r ( i n t i = 0 ; i < item . l ength ; i++)

//Die 2 l e t z t e n Zeichen werden in Zahlen g e sp e i ch e r tzahlen [ i ] = item [ i ] . s ub s t r i ng ( item [ i ] . l ength ()−2);nummer [ i ] = In t eg e r . pa r s e In t ( zahlen [ i ] ) ; / / St r ing Zahlen wird zu in tproduktLis te . remove ( item [ i ] ) ; / / Das Produkt mit dem Namen ” item [ i ] ” wird en t f e r n t

setEnabled ( t rue ) ; //Das Fenster wird a k t i v i e r tbes tae t i gung . setEnabled ( t rue ) ; / / und d ie Buttons auchent f e rnen . setEnabled ( t rue ) ;s t a tu s . s e tV i s i b l e ( f a l s e ) ; //Das Fenster s t a tu s verschwindett e s t = true ;// der Test wird auf t rue g e s e t z t

catch ( Exception ex ) Logger . getLogger ( Kontrol lzentrum . c l a s s . getName ( ) ) . l og ( Level .SEVERE, nul l , ex ) ;

// Diese Methode digContainerOut raumt den Kontainer f r e ip r i va t e void digContainerOut ( i n t z , i n t f e ldnr , Hal lenkran ha l l e ) throws Exception

i n t etage ;S t r ing [ ] item = produktLis te . g e tSe l e c t ed I t ems ( ) ; / / item bekommt ProduktnameSt r ing [ ] zahlen = new Str ing [ item . l ength ] ; / / Zahlen ubernimmt Lange von itemin t [ ] nummer = new in t [ item . l ength ] ; / / nummer ubernimmt Lange von itemf o r ( i n t i = 0 ; i < item . l ength ; i++)

//Die 2 l e t z t e n Zeichen von item werden in Zahlenzahlen [ i ] = item [ i ] . s ub s t r i ng ( item [ i ] . l ength ()−2);// g e sp e i ch e r t und a l s i n t dem nummer−Array ubergebennummer [ i ] = In t eg e r . pa r s e In t ( zahlen [ i ] ) ;

switch ( z )//Es wird geschaut auf welcher Etage s i ch der zu ent fe rnende Kontainer be f i nde t

case 0 :// Der Container be f i nde t s i c h auf dem Bodeni f ( f e l d [ f e l d n r + 1 3 ] [ 4 ] == 1)// Es wird geschaut ob s i ch auf dem Container

i f ( f e l d [ f e l d n r + 2 6 ] [ 4 ] == 1)// noch we i t e r e be f indenf o r ( i n t i = 0 ; i < anzah lFe lder ; i ++)// wenn ja , werden

i f ( f e l d [ i ] [ 4 ] == 0 && i != f e l dn r )// f r e i e Fe lder Gesuchti f ( f e l d [ i ] [ 3 ] == 1)

f o r ( i n t j = 0 ; j < nummer . l ength ; j++)i f ( f e l d [ i −13 ] [ 5 ] == nummer [ j ] )// Danach wird geschaut

z t e s t = f a l s e ; // ob es s i c h beim Container um einen e l s e // handelt , der so oder so raus muss

z t e s t = true ;

i f ( f e l d [ i ] [ 3 ] == 2)// s e l b e wie oben , andere etage

f o r ( i n t j = 0 ; j < nummer . l ength ; j++)i f ( f e l d [ i −13 ] [ 5 ] == nummer [ j ] | |

f e l d [ i − 2 6 ] [ 5 ] == nummer [ j ] )z t e s t = f a l s e ;

e l s e z t e s t = true ;

f o r ( i n t h = 0 ; h < nummer . l ength ; h++)

i f ( f e l d [ f e l d n r + 2 6 ] [ 5 ] == nummer [ h ] )nummer [ h ] = 0 ;//Der a l t e Standort wird f r e i gegebenf e l d [ f e l d n r + 2 6 ] [ 5 ] = 0 ;f e l d [ f e l d n r + 2 6 ] [ 4 ] = 0 ;//Der Contaienr wird g e l i e f e r th a l l e . de l i ve rConta ine rDig ( f e l d [ f e l d n r + 2 6 ] [ 3 ] ) ;count −= 1;// count um e in s r e du z i e r tbreak ;

i f ( z t e s t )

//Der Kran br ingt d i e s en Container nun zu den f r e i e n Felderetage = 2 ;h a l l e . containerTo ( f e l d [ i ] [ 1 ] , f e l d [ i ] [ 2 ] ,

f e l d [ i ] [ 3 ] , e tage ) ;f e l d [ i ] [ 4 ] = 1 ;//Das neue Feld wird be s e t z t//Die Produktnummer ubergeben

28 Automatisiertes Containerlager F. Gammenthaler

Page 33: Automatisiertes Containerlager mit LEGO Mindstorms NXT · LEGO Mindstorms-Serie (RCX) entwickelt und erfolgreich in den USA auf den Markt gebracht. In Europa wurde LEGO Mindstorms

A WICHTIGE QUELLCODE A.1 Kontrollzentrum.java

f e l d [ i ] [ 5 ] = f e l d [ f e l d n r + 2 6 ] [ 5 ] ;//Und der a l t e Standort f r e i gegebenf e l d [ f e l d n r + 2 6 ] [ 5 ] = 0 ;f e l d [ f e l d n r + 2 6 ] [ 4 ] = 0 ;//das Lieferdatum wird ubergebende l ivDate [ i ] = de l ivDate [ f e l d n r + 2 6 ] ;//und am a l t en Standort g e l o s ch tde l ivDate [ f e l dn r + 26 ] = ”” ;break ;// Beendet d i e i−for−S c h l e i f e

break ;

//Nochmals das s e l b e Sp i e l f u r den Containerf o r ( i n t i = 0 ; i < anzah lFe lder ; i++)

i f ( f e l d [ i ] [ 4 ] == 0 && i != f e l dn r && i != f e l dn r + 26)// auf Etage 1i f ( f e l d [ i ] [ 4 ] == 0 && i != f e l dn r )// f r e i e Fe lder suchen

i f ( f e l d [ i ] [ 3 ] == 1)f o r ( i n t j = 0 ; j < nummer . l ength ; j++)

i f ( f e l d [ i −13 ] [ 5 ] == nummer [ j ] )// I s t conta ine r f u r Aus l i e f e rung bestimmtz t e s t = f a l s e ;

e l s e z t e s t = true ;

i f ( f e l d [ i ] [ 3 ] == 2)

f o r ( i n t j = 0 ; j < nummer . l ength ; j++)i f ( f e l d [ i −13 ] [ 5 ] == nummer [ j ] | |

f e l d [ i − 2 6 ] [ 5 ] == nummer [ j ] )z t e s t = f a l s e ;

e l s e z t e s t = true ;

f o r ( i n t h = 0 ; h < nummer . l ength ; h++)

i f ( f e l d [ f e l d n r + 1 3 ] [ 5 ] == nummer [ h ] )nummer [ h ] = 0 ;// a l t e s Feld wird f r e i g e g ebenf e l d [ f e l d n r + 1 3 ] [ 5 ] = 0 ;f e l d [ f e l d n r + 1 3 ] [ 4 ] = 0 ;h a l l e . de l i ve rConta ine rDig ( f e l d [ f e l d n r + 1 3 ] [ 3 ] ) ;count −= 1;z t e s t = f a l s e ;break ;

i f ( z t e s t )// f a l l s Container n i cht f u r Aus l i e f e rung bestimmt ,

etage = 1;// wird er im Lager verschobenha l l e . containerTo ( f e l d [ i ] [ 1 ] , f e l d [ i ] [ 2 ] , f e l d [ i ] [ 3 ] , e tage ) ;f e l d [ i ] [ 4 ] = 1 ;// neuer Standort wird be s e t z tf e l d [ i ] [ 5 ] = f e l d [ f e l d n r + 1 3 ] [ 5 ] ; / / Feldnummer ubergebenf e l d [ f e l d n r + 1 3 ] [ 5 ] = 0 ;// a l t e r Standort f r e i g e g ebenf e l d [ f e l d n r + 1 3 ] [ 4 ] = 0 ;// Lieferdatum ubergebende l ivDate [ i ] = de l ivDate [ f e l d n r + 1 3 ] ;//und am a l t en Standort g e l o s ch tde l ivDate [ f e l dn r + 13 ] = ”” ;break ;

break ;

break ;// beendet switch

case 1 :// Container i s t in der m i t t l e r en Etagei f ( f e l d [ f e l d n r + 1 3 ] [ 4 ] == 1)// Geschieht das s e l b e wie be i case1

// h i e r wird aber nur e in Container verschobenf o r ( i n t i = 0 ; i < anzah lFe lder ; i++)

i f ( f e l d [ i ] [ 4 ] == 0 && i != f e l dn r && i != f e l dn r + 26)i f ( f e l d [ i ] [ 4 ] == 0 && i != f e l dn r )// f r e i e Fe lder Gesucht

i f ( f e l d [ i ] [ 3 ] == 1)f o r ( i n t j = 0 ; j < nummer . l ength ; j++)

//Wenn conta ine r daruberi f ( f e l d [ i −13 ] [ 5 ] == nummer [ j ] )

//auch zur Aus l i e f e rung besttimmt , dannz t e s t = f a l s e ;

e l s e //wird d i e s e r zue r s t b ea rb e i t e tz t e s t = true ;

i f ( f e l d [ i ] [ 3 ] == 2)//Wird geschaut , ob d i e

// Container am neuen Ort zur Aus l i e f e rung bestimmt sind ,f o r ( i n t j = 0 ; j < nummer . l ength ; j++)

i f ( f e l d [ i −13 ] [ 5 ] == nummer [ j ] | |f e l d [ i − 2 6 ] [ 5 ] == nummer [ j ] )//wenn jaz t e s t = f a l s e ; // wird we i t e r gesucht

F. Gammenthaler Automatisiertes Containerlager 29

Page 34: Automatisiertes Containerlager mit LEGO Mindstorms NXT · LEGO Mindstorms-Serie (RCX) entwickelt und erfolgreich in den USA auf den Markt gebracht. In Europa wurde LEGO Mindstorms

A.1 Kontrollzentrum.java A WICHTIGE QUELLCODE

e l s e z t e s t = true ;

f o r ( i n t h = 0 ; h < nummer . l ength ; h++)

i f ( f e l d [ f e l d n r + 1 3 ] [ 5 ] == nummer [ h ] )nummer [ h ] = 0 ;f e l d [ f e l d n r + 1 3 ] [ 5 ] = 0 ;// a l t e r Standortf e l d [ f e l d n r + 1 3 ] [ 4 ] = 0 ;// wird f r e i g e g ebenha l l e . de l i ve rConta ine rDig ( f e l d [ f e l d n r + 1 3 ] [ 3 ] ) ;count −= 1;break ;

i f ( z t e s t )

etage = 1 ;h a l l e . containerTo ( f e l d [ i ] [ 1 ] , f e l d [ i ] [ 2 ] ,

f e l d [ i ] [ 3 ] , e tage ) ;f e l d [ i ] [ 4 ] = 1 ;// neuer Standort be s e t z t//Prduktnummer wird ubergebenf e l d [ i ] [ 5 ] = f e l d [ f e l d n r + 1 3 ] [ 5 ] ;f e l d [ f e l d n r + 1 3 ] [ 5 ] = 0 ;// a l t e r Standort f r e i g e g ebenf e l d [ f e l d n r + 1 3 ] [ 4 ] = 0 ;// Lieferdatum ubergebende l ivDate [ i ] = de l ivDate [ f e l d n r + 1 3 ] ;//und am a l t en Standort g e l o s ch tde l ivDate [ f e l dn r + 13 ] = ”” ;break ;

break ;

break ;

// Diese Methode sucht das Produkt und g ib t d i e Feldnummer zuruck// ge s ch i eh t das s e l b e wie be i p r i va t e i n t searchProduct ( ) in Z e i l e 294p r i va t e i n t [ ] searchProduct ( )

i n t z a eh l e r = 0 ;St r ing [ ] item = produktLis te . g e tSe l e c t ed I t ems ( ) ;S t r ing [ ] zahlen = new Str ing [ item . l ength ] ;i n t [ ] f e l d n r = new in t [ item . l ength ] ;i n t [ ] nummer = new in t [ item . l ength ] ;f o r ( i n t i = 0 ; i < item . l ength ; i++)

zahlen [ i ] = item [ i ] . s ub s t r i ng ( item [ i ] . l ength ()−2);nummer [ i ] = In t eg e r . pa r s e In t ( zahlen [ i ] ) ;

f o r ( i n t j = 0 ; j < anzah lFe lder ; j++)

f o r ( i n t z = 0 ; z < item . l ength ; z++)i f ( f e l d [ j ] [ 5 ] == nummer [ z ] )

f e l d n r [ z a eh l e r ] = j ;z a eh l e r++;

re turn f e l dn r ;

// Dieser Thread l i e f e r t e in Produkt zum Ausgang und br ingt es wieder an se inen Platz zuruckp r i va t e c l a s s Del iverThread extends Thread

@Overridepub l i c void run ()

t ry Hallenkran ha l l e = new Hal lenkran ( c rane ) ; / / Ein neure Hal lenkrn wird au fge ru f ent e s t = f a l s e ; // boolean Var iab le t e s t wird f a l s e g e s e t z tbes tae t i gung . setEnabled ( f a l s e ) ; / / Buttons und Fenster werdenent f e rnen . setEnabled ( f a l s e ) ; / / d e a k t i v i e r tsetEnabled ( f a l s e ) ;Status s t a tu s = new Status ( ) ; / / neues Status Fenster wird g e o f f n e ts t a tu s . s e tV i s i b l e ( t rue ) ; / / und s i ch tba r gemachti n t [ ] index = produktLis te . g e tSe l e c t ed Indexe s ( ) ; / / index wird ubergebencount = index . l ength ;// d i e anzahl ausgewah lter Produkte wird e rm i t t e l t

i n t [ ] f e l d n r = searchProduct ( ) ; / / Das s e l b e wie searchProduct aus Z e i l e 294f o r ( i n t i = 0 ; i < f e l d n r . l ength ; i++)

// neuer Hal lenkran wird erzeugth a l l e = new Hal lenkran ( f e l d [ f e l d n r [ i ] ] [ 1 ] , f e l d [ f e l d n r [ i ] ] [ 2 ] ,

f e l d [ f e l d n r [ i ] ] [ 3 ] , c rane ) ;// Se lbe Prozedur wie be i DeletThreadi f ( f e l d [ f e l dn r [ i ] ] [ 3 ] < 2 && f e l d [ f e l d n r [ i ] ] [ 5 ] != 0)

// Container wird f r e i g e g r abendigContainerOut ( f e l d [ f e l dn r [ i ] ] [ 3 ] , f e l d n r [ i ] , h a l l e ) ;h a l l e . d e l i v e rConta ine r ( ) ; / / kran l i e f e r t d i e Kisteh a l l e . waitForTouch ( ) ; / / wartet b i s jemand sagt kannst s i e zur uckbr ingenha l l e . re turnConta iner ( ) ; / / Bringt Container zurucki f ( z t e s t )

count −= 1;

30 Automatisiertes Containerlager F. Gammenthaler

Page 35: Automatisiertes Containerlager mit LEGO Mindstorms NXT · LEGO Mindstorms-Serie (RCX) entwickelt und erfolgreich in den USA auf den Markt gebracht. In Europa wurde LEGO Mindstorms

A WICHTIGE QUELLCODE A.1 Kontrollzentrum.java

i f ( f e l d [ f e l d n r [ i ] ] [ 3 ] == 2)ha l l e . d e l i v e rConta ine r ( ) ; / / kran l i e f e r t d i e Kisteh a l l e . waitForTouch ( ) ; / / wartet b i s jemand sagt kannst s i e zur uckbr ingenha l l e . re turnConta iner ( ) ; / / Bringt Container zuruckcount −= 1;

i f ( count == 0)

break ;ha l l e . r e s e t ( ) ;setEnabled ( t rue ) ; // Fenster und Buttons werden a k t i v i e r tbes tae t i gung . setEnabled ( t rue ) ;ent f e rnen . setEnabled ( t rue ) ;s t a tu s . s e tV i s i b l e ( f a l s e ) ; / / Status Fenster verschwindett e s t = true ;

catch ( Exception ex ) Logger . getLogger ( Kontrol lzentrum . c l a s s . getName ( ) ) . l og ( Level .SEVERE, nul l , ex ) ;

//genau das s e l b e wie digContainerOut im DeleteThreadpr i va t e void digContainerOut ( i n t z , i n t f e ldnr , Hal lenkran ha l l e ) throws Exception

i n t etage ;S t r ing [ ] item = produktLis te . g e tSe l e c t ed I t ems ( ) ;S t r ing [ ] zahlen = new Str ing [ item . l ength ] ;i n t [ ] nummer = new in t [ item . l ength ] ;f o r ( i n t i = 0 ; i < item . l ength ; i++)

zahlen [ i ] = item [ i ] . s ub s t r i ng ( item [ i ] . l ength ()−2);nummer [ i ] = In t eg e r . pa r s e In t ( zahlen [ i ] ) ;

switch ( z )

case 0 :i f ( f e l d [ f e l d n r + 1 3 ] [ 4 ] == 1)

i f ( f e l d [ f e l d n r + 2 6 ] [ 4 ] == 1)f o r ( i n t i = 0 ; i < anzah lFe lder ; i++)

i f ( f e l d [ i ] [ 4 ] == 0 && i != f e l dn r )i f ( f e l d [ i ] [ 3 ] == 1)

f o r ( i n t j = 0 ; j < nummer . l ength ; j++)i f ( f e l d [ i −13 ] [ 5 ] == nummer [ j ] )

z t e s t = f a l s e ; e l s e

z t e s t = true ;

i f ( f e l d [ i ] [ 3 ] == 2)

f o r ( i n t j = 0 ; j < nummer . l ength ; j++)i f ( f e l d [ i −13 ] [ 5 ] == nummer [ j ] | |

f e l d [ i − 2 6 ] [ 5 ] == nummer [ j ] )z t e s t = f a l s e ;

e l s e z t e s t = true ;

f o r ( i n t h = 0 ; h < nummer . l ength ; h++)

i f ( f e l d [ f e l d n r + 2 6 ] [ 5 ] == nummer [ h ] )etage = 0 ;nummer [ h ] = 0 ;h a l l e . de l i ve rConta ine rDig ( f e l d [ f e l d n r + 2 6 ] [ 3 ] ) ;h a l l e . waitForTouch ( ) ;h a l l e . containerTo ( f e l d [ i ] [ 1 ] , f e l d [ i ] [ 2 ] ,

f e l d [ i ] [ 3 ] , e tage ) ;f e l d [ i ] [ 4 ] = 1 ;f e l d [ i ] [ 5 ] = f e l d [ f e l d n r + 2 6 ] [ 5 ] ;f e l d [ f e l d n r + 2 6 ] [ 5 ] = 0 ;f e l d [ f e l d n r + 2 6 ] [ 4 ] = 0 ;de l ivDate [ i ] = de l ivDate [ f e l d n r + 2 6 ] ;de l ivDate [ f e l dn r + 26 ] = ”” ;count −= 1;break ;

i f ( z t e s t )

etage = 2 ;h a l l e . containerTo ( f e l d [ i ] [ 1 ] , f e l d [ i ] [ 2 ] ,

f e l d [ i ] [ 3 ] , e tage ) ;f e l d [ i ] [ 4 ] = 1 ;f e l d [ i ] [ 5 ] = f e l d [ f e l d n r + 2 6 ] [ 5 ] ;f e l d [ f e l d n r + 2 6 ] [ 5 ] = 0 ;f e l d [ f e l d n r + 2 6 ] [ 4 ] = 0 ;de l ivDate [ i ] = de l ivDate [ f e l d n r + 2 6 ] ;de l ivDate [ f e l dn r + 26 ] = ”” ;break ;

break ;

f o r ( i n t i = 0 ; i < anzah lFe lder ; i++)

i f ( f e l d [ i ] [ 4 ] == 0 && i != f e l dn r && i != f e l dn r + 26)i f ( f e l d [ i ] [ 3 ] == 1)

f o r ( i n t j = 0 ; j < nummer . l ength ; j++)

F. Gammenthaler Automatisiertes Containerlager 31

Page 36: Automatisiertes Containerlager mit LEGO Mindstorms NXT · LEGO Mindstorms-Serie (RCX) entwickelt und erfolgreich in den USA auf den Markt gebracht. In Europa wurde LEGO Mindstorms

A.1 Kontrollzentrum.java A WICHTIGE QUELLCODE

i f ( f e l d [ i −13 ] [ 5 ] == nummer [ j ] )z t e s t = f a l s e ;

e l s e z t e s t = true ;

i f ( f e l d [ i ] [ 3 ] == 2)

f o r ( i n t j = 0 ; j < nummer . l ength ; j++)i f ( f e l d [ i −13 ] [ 5 ] == nummer [ j ] | |

f e l d [ i − 2 6 ] [ 5 ] == nummer [ j ] )z t e s t = f a l s e ;

e l s e z t e s t = true ;

f o r ( i n t h = 0 ; h < nummer . l ength ; h++)

i f ( f e l d [ f e l d n r + 1 3 ] [ 5 ] == nummer [ h ] )etage = 0 ;nummer [ h ] = 0 ;h a l l e . de l i ve rConta ine rDig ( f e l d [ f e l d n r + 1 3 ] [ 3 ] ) ;h a l l e . waitForTouch ( ) ;h a l l e . containerTo ( f e l d [ i ] [ 1 ] , f e l d [ i ] [ 2 ] ,

f e l d [ i ] [ 3 ] , e tage ) ;f e l d [ i ] [ 4 ] = 1 ;f e l d [ i ] [ 5 ] = f e l d [ f e l d n r + 1 3 ] [ 5 ] ;f e l d [ f e l d n r + 1 3 ] [ 5 ] = 0 ;f e l d [ f e l d n r + 1 3 ] [ 4 ] = 0 ;de l ivDate [ i ] = de l ivDate [ f e l d n r + 1 3 ] ;de l ivDate [ f e l dn r + 13 ] = ”” ;count −= 1;z t e s t = f a l s e ;break ;

i f ( z t e s t )

etage = 1 ;h a l l e . containerTo ( f e l d [ i ] [ 1 ] , f e l d [ i ] [ 2 ] ,

f e l d [ i ] [ 3 ] , e tage ) ;f e l d [ i ] [ 4 ] = 1 ;f e l d [ i ] [ 5 ] = f e l d [ f e l d n r + 1 3 ] [ 5 ] ;f e l d [ f e l d n r + 1 3 ] [ 5 ] = 0 ;f e l d [ f e l d n r + 1 3 ] [ 4 ] = 0 ;de l ivDate [ i ] = de l ivDate [ f e l d n r + 1 3 ] ;de l ivDate [ f e l dn r + 13 ] = ”” ;break ;

break ;

break ;

case 1 :i f ( f e l d [ f e l d n r + 1 3 ] [ 4 ] == 1)

f o r ( i n t i = 0 ; i < anzah lFe lder ; i++)i f ( f e l d [ i ] [ 4 ] == 0 && i != f e l dn r && i != f e l dn r + 26)

i f ( f e l d [ i ] [ 3 ] == 1)f o r ( i n t j = 0 ; j < nummer . l ength ; j++)

i f ( f e l d [ i −13 ] [ 5 ] == nummer [ j ] )z t e s t = f a l s e ;

e l s e z t e s t = true ;

i f ( f e l d [ i ] [ 3 ] == 2)

f o r ( i n t j = 0 ; j < nummer . l ength ; j++)i f ( f e l d [ i −13 ] [ 5 ] == nummer [ j ] | |

f e l d [ i − 2 6 ] [ 5 ] == nummer [ j ] )z t e s t = f a l s e ;

e l s e z t e s t = true ;

f o r ( i n t h = 0 ; h < nummer . l ength ; h++)

i f ( f e l d [ f e l d n r + 1 3 ] [ 5 ] == nummer [ h ] )etage = 0 ;nummer [ h ] = 0 ;h a l l e . de l i ve rConta ine rDig ( f e l d [ f e l d n r + 1 3 ] [ 3 ] ) ;h a l l e . waitForTouch ( ) ;h a l l e . containerTo ( f e l d [ i ] [ 1 ] , f e l d [ i ] [ 2 ] ,

f e l d [ i ] [ 3 ] , e tage ) ;f e l d [ i ] [ 4 ] = 1 ;f e l d [ i ] [ 5 ] = f e l d [ f e l d n r + 1 3 ] [ 5 ] ;f e l d [ f e l d n r + 1 3 ] [ 5 ] = 0 ;f e l d [ f e l d n r + 1 3 ] [ 4 ] = 0 ;de l ivDate [ i ] = de l ivDate [ f e l d n r + 1 3 ] ;de l ivDate [ f e l dn r + 13 ] = ”” ;count −= 1;z t e s t = f a l s e ;

32 Automatisiertes Containerlager F. Gammenthaler

Page 37: Automatisiertes Containerlager mit LEGO Mindstorms NXT · LEGO Mindstorms-Serie (RCX) entwickelt und erfolgreich in den USA auf den Markt gebracht. In Europa wurde LEGO Mindstorms

A WICHTIGE QUELLCODE A.1 Kontrollzentrum.java

break ;

i f ( z t e s t )

etage = 1 ;h a l l e . containerTo ( f e l d [ i ] [ 1 ] , f e l d [ i ] [ 2 ] ,

f e l d [ i ] [ 3 ] , e tage ) ;f e l d [ i ] [ 4 ] = 1 ;f e l d [ i ] [ 5 ] = f e l d [ f e l d n r + 1 3 ] [ 5 ] ;f e l d [ f e l d n r + 1 3 ] [ 5 ] = 0 ;f e l d [ f e l d n r + 1 3 ] [ 4 ] = 0 ;de l ivDate [ i ] = de l ivDate [ f e l d n r + 1 3 ] ;de l ivDate [ f e l dn r + 13 ] = ”” ;break ;

break ;

break ;

//das Se lbe wie schon search Product aus Z e i l e 294p r i va t e i n t [ ] searchProduct ( )

i n t z a eh l e r = 0 ;St r ing [ ] item = produktLis te . g e tSe l e c t ed I t ems ( ) ;S t r ing [ ] zahlen = new Str ing [ item . l ength ] ;i n t [ ] f e l d n r = new in t [ item . l ength ] ;i n t [ ] nummer = new in t [ item . l ength ] ;f o r ( i n t i = 0 ; i < item . l ength ; i++)

zahlen [ i ] = item [ i ] . s ub s t r i ng ( item [ i ] . l ength ()−2);nummer [ i ] = In t eg e r . pa r s e In t ( zahlen [ i ] ) ;

f o r ( i n t j = 0 ; j < anzah lFe lder ; j++)

f o r ( i n t z = 0 ; z < item . l ength ; z++)i f ( f e l d [ j ] [ 5 ] == nummer [ z ] )

f e l d n r [ z a eh l e r ] = j ;z a eh l e r++;

re turn f e l dn r ;

// Dieser Thread nimmt neue Produkte aufpub l i c c l a s s newProductThread extends Thread

@Overridepub l i c void run ()

c rane . addPart ( us ) ; / /dem Roboter wird der Ult raSon ic Sensor angehangt//Der U l t r a son i c L i s t ene r wird a k t i v i e r tus . addUl t ra son i cL i s t ene r (new UltrasonicAdapter ( )

@Overridepub l i c void near ( SensorPort port , i n t l e v e l ) //Wenn er r e a g i e r t

c rane . playTone (1760 , 500) ;// wird e in Ton g e s p i e l tf i n a l S t r ing DATEFORMATNOW = ”EE, dd .MMMM yyyy HH:mm: s s ” ;//Datums Formati n t f e l dn r = isEmpty ( ) ; / / Feldnummer des F r e i e n f e l d e si n t produktNummer = getSerialNumber ( ) ; / / Produktnummer f u r das neue ProduktCalendar ca l = Calendar . g e t In s tance ( ) ; / / Kalender wird abgerufen//Datumsformat wird ubernommenSimpleDateFormat sd f = new SimpleDateFormat (DATEFORMATNOW) ;

i f ( t e s t )// f a l l s ke ine andere Anwendung ausge f uh r t wird//Produktnummer wird in Feld−Array geschr i ebenf e l d [ f e l d n r ] [ 5 ] = produktNummer ;f e l d [ f e l d n r ] [ 4 ] = 1 ;// Feld wird be s e t z tde l ivDate [ f e l dn r ] = sd f . format ( c a l . getTime ( ) ) ;i n t x = f e l d [ f e l d n r ] [ 1 ] ; / / x−Koordinate des Feldesi n t y = f e l d [ f e l d n r ] [ 2 ] ; / / y−Koordinate des Feldesi n t z = f e l d [ f e l dn r ] [ 3 ] ; / / z−Koordinate des FeldesHal lenkran ha l l e = new Hal lenkran (x , y , z , c rane ) ; / / neuer Hal lenkran

bes tae t i gung . setEnabled ( f a l s e ) ; / / Buttons werdenent f e rnen . setEnabled ( f a l s e ) ; / / d e a k t i v i e r tsetEnabled ( f a l s e ) ; // Fenster wird d e a k t i v i e r tStatus1 s ta tu s = new Status1 ( ) ; / / Neues Status Fenster wird g e o f f n e ts t a tu s . s e tV i s i b l e ( t rue ) ; / / und s i ch tba r gemachtproduktInfo . setText ( nu l l ) ; / / Texte im in f o Fenster werden ge l o s ch ttry

Thread . s l e ep (10000) ;// Thread wartet 10 Sekundenha l l e . s e tConta iner ( ) ; // Hal lenkran l a g e r t Container e inh a l l e . r e s e t ( ) ; / / Hal lenkran wird auf ausgangs Pos i t i on gebracht

catch ( Exception ex ) Logger . getLogger ( Kontrol lzentrum . c l a s s . getName ( ) ) .

l og ( Level .SEVERE, nul l , ex ) ;bes tae t i gung . setEnabled ( t rue ) ; / / Buttons und Fenster werden a k t i v i e r tent f e rnen . setEnabled ( f a l s e ) ;setEnabled ( t rue ) ;s t a tu s . s e tV i s i b l e ( f a l s e ) ; / / Status Fenster wird ge s ch l o s s en

, u l t r a s on i cL ev e l ) ; / / Grenzewert f u r Akt iv ierung des L i s t en e r

F. Gammenthaler Automatisiertes Containerlager 33

Page 38: Automatisiertes Containerlager mit LEGO Mindstorms NXT · LEGO Mindstorms-Serie (RCX) entwickelt und erfolgreich in den USA auf den Markt gebracht. In Europa wurde LEGO Mindstorms

A.1 Kontrollzentrum.java A WICHTIGE QUELLCODE

// Diese Methode sucht nach der Produktnummer und g ib t s i e zuruckp r i va t e i n t getSerialNumber ()

i n t ser ialNumber = 1;//Produktnummer wird auf 1 g e s e t z ti n t testnumber ;// testnummer wird d e f i n i e r tS t r ing item , zahlen ;// d i e S t r i ng s item und zahlen werden d e k l a r i e r tS t r ing newProduct = ””;// Der St r ing neues Produkt i s t noch l e e ri f ( t e s t == f a l s e )

t e s t = f a l s e ;ser ialNumber = 0 ;

e l s e f o r ( i n t i = 0 ; i < produktLis te . getItemCount ( ) ; i ++)//Es wird

item = produktLis te . getItem ( i ) ; / / geschaut , welche Produktnummerzahlen = item . subs t r i ng ( item . l ength ()−2);// f r e i i s ttestnumber = In t ege r . pa r s e In t ( zahlen ) ;i f ( ser ia lNumber == testnumber )

ser ialNumber++;

i f ( ser ia lNumber > anzahlFelder −2)//Wenn nix mehr f r e i , geht Warnung raus

// S c h r i f t f a r b e rotproduktInfo . setForeground (new java . awt . Color (255 , 0 , 0 ) ) ;produktInfo . setText (”ACHTUNG! ! \nLAGER IST VOLL! ! \ n” +

” Bi t t e andere Lage rha l l e benutzen ! ” ) ;t e s t = f a l s e ;

e l s e i f ( ser ialNumber < 10)// Fa l l s Produktnummer unter 10 wird e ine 0 vorangese t z t

// D i a l o g f en s t e r zum EingebennewProduct = ( St r ing ) JOptionPane . showInputDialog (

nul l , // des Produktnamens”Ein neues Produkt wurde a n g e l i e f e r t .\n” +”Geben S ie den Produktnamen h i e r e in : ” ) ;

i f ( newProduct . l ength ( ) > 10)newProduct = newProduct . sub s t r i ng (0 , 9 ) ;

newProduct = newProduct + ” 0 ” + ( serialNumber ) ; e l s e // Sonst wirde e in f a ch d ie Produktnummer dem Namen angehangt

// D i a l o g f en s t e r zum EingebennewProduct = ( St r ing ) JOptionPane . showInputDialog (

nul l , // des Produktnamens”Ein neues Produkt wurde a n g e l i e f e r t .\n” +”Geben S ie den Produktnamen h i e r e in : ” ) ;

i f ( newProduct . l ength ( ) > 10)// Fa l l s Produktnummer g r o s s e r a l s 10newProduct = newProduct . sub s t r i ng (0 , 9 ) ; // wird ke ine nu l l vo rangese t z t

newProduct = newProduct + ” ” + ( serialNumber ) ;

//Das Produkt wird der L i s t e angef ugt , s o r t i e r t nach der ProduktnummerproduktLis te . add ( newProduct , serialNumber −1);

re turn ser ialNumber ;// Produktnummer wird zuruck gegeben

// Diese Methode sucht e in f r e i e s Feld f u r das neue Produktp r i va t e i n t isEmpty ()

i n t z a eh l e r = 0 ;i n t f e l d n r = 0 ;f o r ( i n t i = 0 ; i < anzahlFelder −2; i ++)

za eh l e r = i ;i f ( f e l d [ i ] [ 4 ] == 0) //Sucht im Feld−Array e in f r e i e s Feld

f e l dn r = zaeh l e r ;break ;

i f ( z a eh l e r == anzah lFe lder && f e l dn r != anzahlFe lder )// Schaut ob Lager schon v o l l i s t

produktInfo . setForeground (new java . awt . Color (255 , 0 , 0 ) ) ;produktInfo . setText (”ACHTUNG! ! \nLAGER IST VOLL! ! \ n” +

” Bi t t e andere Lage rha l l e benutzen ! ” ) ;t e s t = f a l s e ;

re turn f e l dn r ;

// Dieser Thread z e i g t d i e Ze i t und das Datum im Steuerprogramm anpr i va t e c l a s s DateThread extends Thread

pub l i c s t a t i c f i n a l S t r ing DATEFORMATNOW = ”EEEE, dd .MMMM yyyy HH:mm: s s ” ;@Overridepub l i c void run ()

whi le ( t rue )// Solange a l s wahrdate . setText (now ( ) ) ; / / das a k t u e l l e Datum wird ausgegeben

pub l i c S t r ing now( )

Calendar ca l = Calendar . g e t In s tance ( ) ; / / r u f t s e r v e r Ze i t abSimpleDateFormat sd f = new SimpleDateFormat (DATEFORMATNOW) ;// s e z t Datumsformatreturn sd f . format ( c a l . getTime ( ) ) ; / / g ib t Datum zuruck

// Dieser Thread z e i g t d i e Pos i t i on des Krans in der Hal l e anpr i va t e c l a s s Situat ionThread extends Thread

@Overridepub l i c void run ()

double [ ] xy ;Hal lenkran ha l l e = new Hal lenkran ( c rane ) ; / / neuer Hal lenkran wird i n s t a n z i e r t

34 Automatisiertes Containerlager F. Gammenthaler

Page 39: Automatisiertes Containerlager mit LEGO Mindstorms NXT · LEGO Mindstorms-Serie (RCX) entwickelt und erfolgreich in den USA auf den Markt gebracht. In Europa wurde LEGO Mindstorms

A WICHTIGE QUELLCODE A.1 Kontrollzentrum.java

panel . window(−5 , 1 , −1, 3 ) ; // e in neues GPanel window wird bestimmtpanel . windowPosition (750 , 0 ) ; // d i e Post ion des Fenste r s auf dem Bi ldschirm bestimmtpanel . bgColor ( Color .BLACK) ; // Die Hintergrundfarbe auf schwarz g e s e t z tdo

t ry f o r ( i n t i = 0 ; i > −5; i−−) //Die Hal l e wird geze i chne t

f o r ( i n t j = 0 ; j < 3 ; j++) panel . move( i , j ) ;panel . c o l o r ( Color .GREEN) ;panel . f i l l R e c t a n g l e ( 0 . 5 , 0 . 7 5 ) ;panel . c o l o r ( Color .BLACK) ;panel . r e c t ang l e ( 0 . 5 , 0 . 7 5 ) ;

xy = ha l l e . g e tPo s i t i on ( ) ; / / Die Pos i t i on des Krans wird zuruckgegeben//Die Zahlen werden auf ganze gerundetpanel . move(Math . round ( xy [ 0 ] ) , Math . round ( xy [ 1 ] ) ) ;//An d i e s e r Pos i t i on wird e in we i s s e rechteck geze i chne tpanel . c o l o r ( Color .WHITE) ;panel . r e c t ang l e ( 0 . 5 , 0 . 7 5 ) ; / / Die Bre i t e und Dicke des Rechtecks werden bestimmti f ( c rane . getBatteryLeve l ( ) < 4 .5)//Wenn d ie Ba t t e r i e l e i s t u n g zu t i e f i s t

produktInfo . setForeground (new java . awt . Color (255 , 0 , 0 ) ) ; / / geht e ine//WarnungproduktInfo . setText ( ” ! ! !LOW BATTERY! ! ! \ n ! ! Bat te r i en ueberprue fen ! ! ” ) ;Thread . s l e ep (1000) ; // raus , im i n f o f e l d in r o t e r Farbe und bl inkendproduktInfo . setText ( ” ” ) ;

Thread . s l e ep ( 5 00 ) ;

catch ( Inter ruptedExcept ion ex ) Logger . getLogger ( Kontrol lzentrum . c l a s s . getName ( ) ) . l og ( Level .SEVERE, nul l , ex ) ;

whi le ( t rue ) ; / / so lange a l s das Programm l a u f t

f i n a l s t a t i c i n t k = 6 ; // d e f i n i e r t d i e Lange des Feld−Arrayf i n a l s t a t i c i n t e x i tF i e l d = 11;//Feldnummer des E ingang fe lde sp r i va t e s t a t i c i n t anzah lFe lder = 39;// Anzahl der Felder , d i e be l e g t werden konnenpr i va t e s t a t i c i n t [ ] [ ] f e l d = new in t [ anzah lFe lder ] [ k ] ; / / neuer Feld−Arraypr i va t e s t a t i c S t r ing [ ] de l ivDate = new Str ing [ anzah lFe lder ] ; / / Anl i e f e rungsdatenpr i va t e // Ein ige Produkte f u r d i e L i s t e

s t a t i c S t r ing [ ] produkt = ”Ananas 01 ” , ”Kiwis 02 ” , ”Papayas 03 ” ,”Orangen 04 ” , ”Mangos 05 ” , ”Nektar inen 06 ” ,”Mandarinen 07 ” , ”Avokados 08 ” , ”Birnen 09 ” ,”Erdnusse 10 ” , ” Aepfe l 11 ” , ” Grep f ru i t s 12 ” ,” Hase ln u s se 13 ” , ”Walnusse 14 ” , ”Pflaumen 15 ” ,”Aprikosen 16 ” , ”Radischen 17 ” , ” Sa l a t 18 ” ,”Blumenkohl 19 ” , ”Erdbeeren 20 ” , ”Himbeeren 21 ” ,” Johannesbeeren 22 ” , ” He ide lbee ren 23 ” ;

p r i va t e s t a t i c i n t xachse = 0 ;p r i va t e s t a t i c i n t yachse = 0 ;p r i va t e s t a t i c i n t zachse = 0 ;p r i va t e s t a t i c i n t u l t r a s on i cL ev e l = 7 ;p r i va t e s t a t i c i n t count = 0 ;p r i va t e s t a t i c NxtRobot c rane = new NxtRobot (”TRUCK” ) ;p r i va t e s t a t i c U l t ra son i cSenso r us = new Ul t ra son i cSenso r ( SensorPort . S1 ) ;p r i va t e s t a t i c GPanel panel = new GPanel (” Pos i t i on des Krans ” ) ;p r i va t e s t a t i c boolean t e s t = true ;p r i va t e s t a t i c boolean z t e s t = true ;// Var iab l e s d e c l a r a t i on − do not modify //GEN−BEGIN: v a r i a b l e sp r i va t e javax . swing . JMenuItem about ;p r i va t e javax . swing . JMenuItem about1 ;p r i va t e javax . swing . JMenuItem beenden ;p r i va t e javax . swing . JMenuItem beenden1 ;p r i va t e javax . swing . JButton bes tae t i gung ;p r i va t e javax . swing . JLabel date ;p r i va t e javax . swing . JMenu dat e i ;p r i va t e javax . swing . JMenu date i 1 ;p r i va t e javax . swing . JButton ent f e rnen ;p r i va t e javax . swing . JMenu h i l f e ;p r i va t e javax . swing . JMenu h i l f e 1 ;p r i va t e javax . swing . JLabel jLabe l1 ;p r i va t e javax . swing . JLabel jLabe l2 ;p r i va t e javax . swing . JLabel jLabe l3 ;p r i va t e javax . swing . JLabel jLabe l4 ;p r i va t e javax . swing . JScro l lPane jSc ro l lPane4 ;p r i va t e javax . swing . JSeparator jSeparato r1 ;p r i va t e javax . swing . JMenuBar menu ;p r i va t e javax . swing . JMenuBar menu1 ;p r i va t e javax . swing . JTextArea produktInfo ;p r i va t e java . awt . L i s t produktLis te ;// End o f v a r i a b l e s d e c l a r a t i on //GEN−END: va r i a b l e s

F. Gammenthaler Automatisiertes Containerlager 35

Page 40: Automatisiertes Containerlager mit LEGO Mindstorms NXT · LEGO Mindstorms-Serie (RCX) entwickelt und erfolgreich in den USA auf den Markt gebracht. In Europa wurde LEGO Mindstorms

A.2 Hallenkran.java A WICHTIGE QUELLCODE

A.2 Hallenkran.java

package ch . h inte rkappe l en . fab ian . KontrollzentrumMA 3 ;import ch . aplu . nxt . ∗ ;/∗∗∗∗ @author F . Gammenthaler∗/

pub l i c c l a s s Hal lenkran

f i n a l s t a t i c i n t xAusgang = 0 ; //X−Achsenkoordinate f u r Ausgabefe ldf i n a l s t a t i c i n t yAusgang = 0 ; //Y−Achsenkoordinate f u r Ausgabefe ldf i n a l s t a t i c i n t zAusgang = 0 ; //Z−Achsenkoordinate f u r Ausgabefe ldf i n a l s t a t i c i n t xEingang = 4 ; //X−Achsenkoordinate f u r E ingangs f e ldf i n a l s t a t i c i n t yEingang = 0 ; //Y−Achsenkoordinate f u r E ingangs f e ldf i n a l s t a t i c i n t zEingang = 1 ; //Z−Achsenkoordinate f u r E ingangs f e ld//Der Touchsensor wird dem Port 1 z u g e t e i l tpub l i c s t a t i c TouchSensor touch = new TouchSensor ( SensorPort . S3 ) ;//Der Elektromagnet wird dem Port 4 z u g e t e i l tL ightSensor magnet = new LightSensor ( SensorPort . S4 ) ;pub l i c s t a t i c NxtRobot c rane ;pub l i c s t a t i c Bridge b r idge ;pub l i c s t a t i c L i f t l i f t ;pub l i c s t a t i c i n t [ ] xyz = new in t [ 3 ] ;

//Konstruktor Hal lenkran s e t z t d i e Var iablen in den xyz−Arraypub l i c Hal lenkran ( i n t x , i n t y , i n t z , NxtRobot crane )

c rane = crane ;b r i dge = new Bridge ( crane ) ;l i f t = new L i f t ( crane ) ;xyz [ 0 ] = x ;xyz [ 1 ] = y ;xyz [ 2 ] = z ;

// zwe i t e r Konstruktor f u r s p e z i a l f a l l e , be i denne d i e Koordinaten n icht g e s e t z t werden mussen

pub l i c Hal lenkran (NxtRobot crane )c rane = crane ;b r i dge = new Bridge ( crane ) ;l i f t = new L i f t ( crane ) ;

// Diese Methode g ib t d i e Pos i t i on der Brucke zuruckpub l i c double [ ] g e tPo s i t i on ()

double [ ] xy = new double [ 2 ] ;xy = br idge . g e tPo s i t i on ( ) ;r e turn xy ;

// Diese Methode bewirkt , dass der Kran wartet , b i s der Touchsensor gedr uckt//wirdpub l i c void waitForTouch ( ) throws Inter ruptedExcept ion

c rane . addPart ( touch ) ;whi le ( ! touch . i sP r e s s ed ( ) ) // wartet b i s Touchsensor gedr uckt wird

Thread . s l e ep ( 1 ) ;// in d i e s e r Mehtode de l everConta iner ho l t der Kran den Container zum// Ausgangsfe ldpub l i c void de l i v e rConta ine r ( ) throws Exception

c rane . addPart ( magnet ) ;i n t x = xyz [ 0 ] ; //Koordinaten f u r d i e Brucke (x ) , f u r d i ei n t y = xyz [ 1 ] ; // Laufkatze (y ) und f u ri n t z = xyz [ 2 ] ; //den L i f t ( z )b r i dge . p o s i t i o n (x , y ) ; //Brucke br ingt s i c h in S t e l l ung

Thread . s l e ep (3000 ) ;magnet . a c t i v a t e ( t rue ) ; //Der Magnet wird a k t i v i e r tl i f t . down( z ) ; // L i f t f a h r t zur Kiste runter

Thread . s l e ep ( 5 00 ) ; // L i f t wartet 500msl i f t . up ( ) ; // L i f t f a h r t wieder hochbr idge . p o s i t i o n ( xAusgang , yAusgang ) ; / / Die Kiste wird zum Ausgabefe ld t r a n s p o r t i e r t

Thread . s l e ep (3000 ) ;l i f t . downToField ( ) ; // L i f t s e t z t d i e Kiste auf Feld abmagnet . a c t i v a t e ( f a l s e ) ; //Magnet wird d e a k t i v i e r t

Thread . s l e ep ( 5 00 ) ; // L i f t wartet 500msl i f t . up ( ) ; // L i f t geht rauf , der Arbe i t e r kann

//das Produkt entnehmen// Diese Methode l i e f e r t e in Kontainer der uber einem Steht , der g e l i e f e r t werden s o l lpub l i c void de l ive rConta ine rDig ( i n t z ) throws Exception

c rane . addPart ( magnet ) ;i n t x = xyz [ 0 ] ; //Koordinaten f u r d i e Brucke (x ) , f u r d i ei n t y = xyz [ 1 ] ; // Laufkatze (y ) und f u rb r i dge . p o s i t i o n (x , y ) ; //Brucke br ingt s i c h in S t e l l ung

Thread . s l e ep (3000 ) ;magnet . a c t i v a t e ( t rue ) ; //Magnet wird a k t i v i e r tl i f t . down( z ) ; // L i f t f a h r t zur Kiste runter

Thread . s l e ep ( 5 00 ) ; // L i f t wartet 500msl i f t . up ( ) ; // L i f t f a h r t wieder hochbr idge . p o s i t i o n ( xAusgang , yAusgang ) ; / / Die wird Kiste zum Ausgabefe ld t r a n s p o r t i e r t

Thread . s l e ep (3000 ) ;l i f t . downToField ( ) ; // L i f t s e t z t d i e Kiste auf Feld abmagnet . a c t i v a t e ( f a l s e ) ; //Magnet wird d e a k t i v i e r t

Thread . s l e ep ( 5 00 ) ; // L i f t wartet 500msl i f t . up ( ) ; // L i f t geht rauf , der Arbe i t e r kann

//das Produkt entnehmen// In d i e s e r Methode returnConta iner wird der Container vom Ausgangsfe ld

36 Automatisiertes Containerlager F. Gammenthaler

Page 41: Automatisiertes Containerlager mit LEGO Mindstorms NXT · LEGO Mindstorms-Serie (RCX) entwickelt und erfolgreich in den USA auf den Markt gebracht. In Europa wurde LEGO Mindstorms

A WICHTIGE QUELLCODE A.2 Hallenkran.java

// wieder z u r u c k g e s t e l l tpub l i c void returnConta iner ( ) throws Exception

c rane . addPart ( magnet ) ;i n t x = xyz [ 0 ] ; //Koordinaten f u r d i e Brucke (x ) , f u r d i ei n t y = xyz [ 1 ] ; // Laufkatze (y ) und f u r denin t z = xyz [ 2 ] ; // L i f t ( z )

magnet . a c t i v a t e ( t rue ) ; //Magnet wird a k t i v i e r tl i f t . downToField ( ) ; //Der L i f t ho l t s i c h s e i n e Kiste

Thread . s l e ep ( 5 00 ) ; // wieder und wartet 500ms bevor erl i f t . up ( ) ; // wieder r au f f a h r tb r i dge . p o s i t i o n (x , y ) ; //Brucke und Laufkatze fahren zum

Thread . s l e ep (3000 ) ;l i f t . down( z ) ; //Der L i f t b r ing t d i e Kiste wiedermagnet . a c t i v a t e ( f a l s e ) ; //Magnet wird d e a k t i v i e r t

Thread . s l e ep ( 5 00 ) ; // au f s Feld und wartet 500ms bevorl i f t . up ( ) ;

// In d i e s e r Methode setConta iner wird das neue Produkt an e inen Fre ien Platz// g e s t e l l tpub l i c void setConta iner ( ) throws Exception

c rane . addPart ( magnet ) ;i n t x = xyz [ 0 ] ; //Koordinaten f u r d i e Brucke (x ) , f u r d i ei n t y = xyz [ 1 ] ; // Laufkatze (y )i n t z = xyz [ 2 ] ; //und f u r den L i f t ( z )b r i dge . p o s i t i o n ( xEingang , yEingang ) ;

Thread . s l e ep (3000 ) ;magnet . a c t i v a t e ( t rue ) ; //Magnet wird a k t i v i e r tl i f t . down( zEingang ) ; //Der L i f t ho l t s i c h s e i n e Kiste

Thread . s l e ep ( 5 00 ) ; // wieder und wartet 500ms bevor erl i f t . up ( ) ; // wieder r au f f a h r tb r i dge . p o s i t i o n (x , y ) ; / / Brucke und Laufkatze fahren zum angegebenen Feld

Thread . s l e ep (3000 ) ;l i f t . down( z ) ; //Der L i f t b r ing t d i e Kiste wieder nach untenmagnet . a c t i v a t e ( f a l s e ) ; //Magnet wird d e a k t i v i e r t

Thread . s l e ep ( 5 00 ) ; // L i f t wartet 500ms b i s er wiederl i f t . up ( ) ; // r au f f a h r tb r i dge . p o s i t i o n ( xAusgang , yAusgang ) ;

Thread . s l e ep (3000 ) ;// in d i e s e r Methode wird der Kontainer vom einen Ort zum andern t r a n s p o r t i e r tpub l i c void containerTo ( i n t xNeu , i n t yNeu , i n t zNeu , i n t etageAlt ) throws Exception

c rane . addPart ( magnet ) ;i n t xAlt = xyz [ 0 ] ; // f u r d i e Brucke (x ) , f u r d i ei n t yAlt = xyz [ 1 ] ; // Laufkatze (y )i f ( e tageAlt == 0)

xAlt = 0 ;yAlt = 0 ;

br idge . p o s i t i o n ( xAlt , yAlt ) ; //Brucke f a h r t ans a l t e OrtThread . s l e ep (3000 ) ;magnet . a c t i v a t e ( t rue ) ; //Magnet wird a k t i v i e r tl i f t . down( etageAlt ) ; //Der L i f t ho l t s i c h s e i n e Kiste

Thread . s l e ep ( 5 00 ) ; //und wartet 500ms bevor erl i f t . up ( ) ; // wieder r au f f a h r tb r i dge . p o s i t i o n (xNeu , yNeu ) ; / / Brucke und Laufkatze fahren zum angegebenen Feld

Thread . s l e ep (3000 ) ;l i f t . down( zNeu ) ; //Der L i f t s e t z t d i e Kiste abmagnet . a c t i v a t e ( f a l s e ) ; //Magnet wird d e a k t i v i e r t

Thread . s l e ep ( 5 00 ) ; // L i f t wartet 500ms bevor er wiederl i f t . r e s e t ( ) ; // r au f f a h r tb r i dge . p o s i t i o n ( xAlt , yAlt ) ; //Brucke kehrt an a l t e Pos i t i on zuruck

Thread . s l e ep (3000 ) ;// Diese Methode r e s e t bewirkt , dass d i e Brucke in i h r e AusgangsPosit ion// zuruck f a h r tpub l i c void r e s e t ( ) throws Exception

l i f t . r e s e t ( ) ;b r i dge . r e s e tBr idge ( ) ; //Brucke geht auf Ausgangspos i t ion

F. Gammenthaler Automatisiertes Containerlager 37