www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Fahrstuhlsimulation


Autor: G. Geiling (pictorius)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ! Ich hoffe, dass ich hier im Forum richtig bin...

Frage:

Ich wollte gerne ein Fahrstuhlsimulationsprogramm mit Hilfe meines MC
8051 und VisualBasic erstellen.
Ein Fahrstuhl (Fernsehturm) mit den Fahrzielen  EG , 1,2,3 Stock 0m ;
143m; 146m und 149m) soll in C Programmiert werden.
Ein Sekundentakt dient zur simulation der Geschwindigkeit des Korbes.
Pro Sekunde Fährt diese also etwas höher/runter (5 m/s).
Mit den Tastern (8Stück) meiner Testplatine fordere ich den Fahrstuhl an
(Taster 1 EG; Taster 2 = 1Stock; Taster 3 = 2Stock; Taster 4 = 3Stock
diese Taster sind auf den Etagen und
Taster 5 zum EG; Taster 6 = zum 1Stock; Taster 7 = zum 2Stock; Taster 8
= zum 3Stock sind im Fahrstuhl selbst).
Die Höhe und Anforderungen der Etagen werden dann zum Visualisieren an
VB gesendet.

Problem:
Da mein jetziges Programm (läuft nicht rund!) aus "Hunderten"
if-Schleifen besteht würde mich mein Fachlehrer für bescheuert erklären.
Ein weiteres Problem das ich habe ist, dass der Fahrstuhl nicht nach der
reihenfolge der eingehenden Taster fahren soll, sondern wenn er z.B nach
unten fährt nur auf die Etagen anhält, die unterhalb liegen  und nur
dort wo auch vorher der Fahrstuhl angefordert wurde.
Wie kann ich dieses Programm  "sauber" und einfach Programmieren damit
viele if Schleifen wegfallen.

ich bedanke mich im voraus für Eure mithilfe !

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
G. Geiling wrote:

> Da mein jetziges Programm (läuft nicht rund!) aus "Hunderten"
> if-Schleifen besteht würde mich mein Fachlehrer für bescheuert erklären.

"if-Schleifen", nie gehört, was ist das, kann man das essen ?

Schleifen sind "for", "while", "do .. while".

Mach doch mal nen Ablaufplan.
Und erst, wenn der fertig ist und logisch richtig, dann kannst Du auch 
anfangen zu proggen.


> Ein weiteres Problem das ich habe ist, dass der Fahrstuhl nicht nach der
> reihenfolge der eingehenden Taster fahren soll, sondern wenn er z.B nach
> unten fährt nur auf die Etagen anhält, die unterhalb liegen  und nur
> dort wo auch vorher der Fahrstuhl angefordert wurde.

Du hast ja irgendwo ein Richtungsbit und das wechselt eben erst dann, 
wenn keine weitere Anforderung in dieser Richtung besteht.


Peter

Autor: Michael Wolf (mictronics) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie wäre es mit einem Ringbuffer, in dem die Anforderungen abgelegt 
werden. Diese kannst du dann nach geforderten Regeln abarbeiten.

Der Index des Buffers würde dir angeben in welcher Reihenfolge gedrückt 
wurde, und der Wert gibt an wohin der Fahrstuhl fahren soll.

Das einzige was du brauchst sind fixe Regeln zum abarbeiten.

Vielleicht auch was mit selbstlern Effekt um den Fahrstuhl von selbst 
günstig plazieren zu lassen für Wartezeiten.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael Wolf wrote:
> Wie wäre es mit einem Ringbuffer, in dem die Anforderungen abgelegt
> werden. Diese kannst du dann nach geforderten Regeln abarbeiten.


Rinpuffer sagt ja schon sequentiell, also nicht geeignet. Du willst ja 
nicht unnütz an Etagen vorbeifahren, nur weil dort später gedrückt 
wurde.

Du hast 4 Etagen, also 4 möglich Fahrtziele.

Da würde ich dann die enorme Menge von 4 Bitvariablen reservieren, um 
die 4 Anforderungen zu speichern.
Und beim Erreichen wird das zugehörige Bit wieder gelöscht.

Hoffentlich ist noch genug Platz im SRAM für die 4 Bits, ist ja immerhin 
schon 1/2 Byte.

Die Etagentasten und die zugehörenden Kabinentasten kann man einfach 
logisch parallel schalten (OR-Verknüpfung).
Du hast ja keine 2 Etagentasten mit Richtungsauswahl.


Peter

Autor: G. Geiling (pictorius)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mit dem parallel schalten logisch!

Wie genau kann ich den in C programmieren ob er noch nach oben oder nach 
unten fahren muss?? Wie genau ???????
(Quasi das Hochfahr-Bit oder das Runterfahr-Bit setzen/rücksetzen)

Ich verzweifele ich gleich und mein mc fliegt aus dem Fenster !

Sitze daran schon 2 Stunden und habe nur noch 1 Bit im Kopf

wer kann mir helfen!


Autor: Ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In welche Schule gehst du den überhaupt?

Vielleich kann ich so erkennen auf welchem Nivou meine Vorschläge sein 
sollen.

Ich könnte dir ein Teil meines ganzheitlichen Wissens anbieten ;-)

Autor: Obelix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1 einzelnes klitze kleines Bit 1=hoch fahren, 0=runterfahren.

Autor: jonny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also wir hatten das bei uns in der schule so gelöst:

Die aktuelle Position also die Etage ist in einer variable gespeichert. 
Wenn jetzt eine Anfrage kommt, fährt er dort hin. Ob nach oben oder 
unten ist ja einfach zu erkennen, sprich 1 Etage ist teifer als 3 Etage 
;)

Das Problem ist, dass die Leute die spätergedrückt haben einfach 
ignoriert werden und erst nach der Fahrt bearbeitet werden. Deshalb 
regaiert der MC auch beim fahren auf Positionsanfragen.
Wenn er zB. bei Etage 2 ist und in Etage 5 will, dedoch wer aus Etage 1 
mit möchte, fährt er erst in die 1 Etage und dann in die fünfte, damit 
er Zeit spart. Um zu berechnen was kürzer ist also erst runter und alle 
einsammeln oder erst hoch und dann kann man ja einfach 
Wunschetage-aktuelle Etage rechnen.

------------
- Beispiel -
------------
Fahrstuhl: EG
Person_1: 1 Etage
Person_2: 5 Etage

- Person_2 drückt in der 5 Etage den Siganlgeber. Der Fahrstuhl beginnt
  noch oben zu fahren, da er ja im EG ist.
- Der Fahrstuhl ist bei Etage 2 angekommen und Person_1 drückt den
  Signalgeber in der 1 Etage.
- Jetzt rechnet der MC aus ob es längerdauert Person_2 aus dem fünften
  Stock abzuholen oder ob es schneller geht erst Person_1 mitzunehmen.
  (Jetzt wäre es angebracht man hätte Wahlschalter für "nach oben" und
  "nach unten" damit der MC schon weiß wo es hingehen soll)

Naja ich hoffe ich habe dir nen bisschen meine Überlegungen dargestellt.

mfg jonny

Autor: Jupp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich verzweifele ich gleich und mein mc fliegt aus dem Fenster !

Das Gefühl kenne ich :)

> Sitze daran schon 2 Stunden und habe nur noch 1 Bit im Kopf

Mach dir nichts draus. Die Profis sitzen mit Sicherheit auch mehr als 2 
Stunden dran, um ne Aufzugsteuerung zu "proggen".

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jonny wrote:

> Wenn er zB. bei Etage 2 ist und in Etage 5 will, dedoch wer aus Etage 1
> mit möchte, fährt er erst in die 1 Etage und dann in die fünfte, damit
> er Zeit spart.

Das ist Blödsinn !

Wenn ständig Leute von der 1. zur 2. und zurück fahren, können die Leute 
in der 5. verhungern.

Deshalb hat immer die Richtung die höchste Priorität.
Nur so ist gewährleistet, daß auch alle Fahraufträge schnellstmöglichst 
erledigt werden.

Außerdem ist das Fahren garnicht so energieintensiv, sondern das 
Anfahren.
Der Energieunterschied von der 2. zur 5. oder zurück zur 1. zu fahren 
ist also weit unter dem 3-fachen.
Zusätzlich kann er dann noch von der 1. wieder mehr Leute mitnehmen.


Peter

Autor: jonny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@peda

stimmt schon, nur unser Lehrer wolte halt diese option, ich habe ja 
nicht behauptet, dass es die bessere Lösung ist.


jonny

Autor: G. Geiling (pictorius)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es handelt sich um eine IHK Weiterbildung zum E-Meister in 
Niedersachsen.
Egal...


So weit so gut. Das Problem was ich habe ist wahrscheinlich leicht zu 
lösen aber ich komm einfach nicht drauf.

Klar 4 Etagen = 4 Merker
Wenn ich eine Taste Drücke wird der Merker gesetzt und wenn der 
Fahrstuhl dort angekommen ist wird das Bit zurückgesetzt. Logisch!

Also muss ich doch schauen, wenn der Korb unten ist 
(Ausgangsposition)mit einer if - Abfrage feststellen ob oberhalb des EG 
ein Merker gesetzt wurde. Fahre dorthin. (Bit auf null setzen)Mit einer 
If - Abfrage nachschauen ob noch ein höheres Bit gesetzt worden ist. 
Fahre dort hin  .........

wenn nein dann fahre runter und so weiter ......

das sind doch wieder sooooo viele if abfragen!

Wer weiß was besseres??



Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jonny wrote:
> @peda
>
> stimmt schon, nur unser Lehrer wolte halt diese option, ich habe ja
> nicht behauptet, dass es die bessere Lösung ist.

Stimmt ja, Lehrer haben nichts mit Praxis am Hut.


Ich könnte mir vorstellen, daß die Leute in der 5. nicht gerade erfreut 
reagieren, wenn der Aufwärts-Pfeil wieder in Abwärts wechselt.
Da dürfte einiges an Beschädigungsbeseitigung auf die Firma solcher 
Aufzüge zukommen. Die Tasten müßten dann mindestens Fußtritt verträglich 
sein.


Peter

Autor: dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn der erste Auftrag (Aufzuganforderung/Tastendruck) kommt, setzt du 
deine Richtung fest,
und immer wenn du angekommen bist prüfst du, ob noch ein Auftrag da ist,
für den man in die gleiche Richtung fahren muss....

dieter

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach doch erstmal ne einfache Fahrsimulation:

Taste drücken - Tür zu - Anfahren - Fahren - Bremsen - Stop - Tür auf


Du mußt pro Etage 3 Positionskontakte simulieren:

- Bremsen von oben kommend
- Bremsen von unten kommend
- Halt

Und wenn der Bremskontakt überfahren wurde, darf kein Haltebefehl mehr 
von dieser Etage ausgeführt werden, da ja kein ausreichender Bremsweg 
mehr da ist.


Peter

Autor: Roland Praml (pram)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also ich würde es mal mit einem Zustandsdiagramm machen...

die Bits der Stockwerke welche man anfahren muss, kann man in einem 
Array speichern (oder durch Shifts in 1 Byte quetschen, sonst hast du 
bei Aufzugssteuerungen mit 80 Stockwerken SEHR viele if's drin



Ausgangsstatus "idle"
komplettes Arrray durchsuchen, ob Taste gedrückt:
nein -> GOTO idle
ja -> liegt Stockwerk über oder unter aktueller Position -> setze 
Richtung -> GOTO fahren

Status fahren:
es wird beim Vorbeifahren von jedem Stockwerk geprüft, ob das Bit im 
Array gesetzt ist:
nein-> GOTO fahren; //gleiche Richtung weiter fahren,
ja->Bit löschen, GOTO stop;

Status stop:
Tür auf, warten Tür zu -> GOTO testnext


Status testnext:
Array durchsuchen, nach gesetzten Bits:
nein -> GOTO idle  // keiner mehr gedrückt
ja: Bit in der gleichen Richtung:
nein -> idle // liegt in der falschen Richtung, also von vorn an fangen
ja: -> GOTO fahren // liegt in der aktuellen Richtung, also weiter 
fahren


So müsste eigentlich die komplette Aufzugsteuerung klappen.

Gruß
Roland

p.S. moderne Aufzüge haben an jeder Etage 2 Taster, ob man nach oben 
oder unten fahren möchte.
Meist sind da auch mehrere Aufzüge parallel, so dass auch der stehen 
bleibt der gerade in die aktuelle Richtung fährt.

Autor: jonny (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Mir war gerade etwas langweilig. Ich habe mal eine kleine Simulation 
programmiert. Ist noch nicht ganz fertig. Die Priorität des hoch bzw. 
runterfahrens ist noch nicht drin.

Habe ich in VB2005.net geschreiben.
Hoffe es läuft bei euch :)
Der Ordner "Grafiken" muss mit entpackt werden sonst habt ihr keine 
Animation und bekommt Fehler!

mfg jonny

Autor: Axel R. (axelr) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
u.a eine seehr gute Aufzugsimulation enthalten:
http://www.abandonia.com/games/de/341/SimTower.htm

Autor: mag (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das scheint ja ein klassiker zu sein ...ggg

Grundstudium ET-Praktikum 2003 an der TU-Berlin sollte auch nen 
Fahrstuhlsimulator entworfen werden...

Autor: Ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kennt jemand von euch eine Simulation wo z.B. der Student nur die 
Steuerlogik programmieren muss?

Also ein Hochhaus mit 8 Aufzuügen wo ein Tag simuliert wird. Und dann 
geht es darum wer entwickelt die beste Steuerlogik....

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.