Inhaltsverzeichnis
- 1 Elemente zur Beschreibung
- 1.1 Ganze_Zahl
- 1.2 Positive ganze Zahl
- 1.3 Kommazahl
- 1.4 Zahl
- 1.5 Wort
- 1.6 „Zeichenfolge“
- 1.7 Bezeichner
- 1.8 Ausdruck ::= Bezeichner
- 1.9 Ausdruck ::= Ausdruck Ausdruck
- 1.10 Ausdruck ::= Ausdruck „|“ Ausdruck
- 1.11 Ausdruck ::= „(“ Ausdruck „)“
- 1.12 Ausdruck ::= „[“ Ausdruck „]“
- 1.13 Ausdruck ::= Ausdruck „…“
- 2 Die Definitionen einer Zelle
- 2.1 Name ::= Wort …
- 2.2 Zelldefinition ::= [Wertebereich | Speicherstelle | Zusammenhang ] …
- 2.3 Wertebereich ::= „Wertebereich“ WName „=“ ( Aufzählung | Zahlenbereich )
- 2.4 WName ::= Name
- 2.5 Aufzählung ::= „{“ AName [ „,“ AName ] … „}“
- 2.6 AName ::= Name
- 2.7 Zahlenbereich ::= ( Ganze_Zahl „..“ Ganze_Zahl ) | ( Kommazahl „..“ Kommazahl )
- 2.8 Speicherstelle ::= („Element“ EName „:“ WName ) | („Gemeinsam“ EName „:“ Slave „,“ EName)
- 2.9 EName::= Name
- 2.10 Zusammenhang ::= „Zusammenhang“ Elementbeschreibung [ „und“ Elementbeschreibung ] … „Ende“
- 2.11 Elementbeschreibung ::= EName „=“ Gewicht „=“ (Zahlenbereich | AName | Term)
- 2.12 Term ::= VzZahl | "(" Term ")" | PlusMinus | MalDiv
- 2.13 VzZahl ::= Zahl | ["-"] EName
- 2.14 PlusMinus ::= ( Term "+" Term ) | ( Term "-" Term )
- 2.15 MalDiv ::= ( Term "*" Term ) | ( Term "/" Term )
- 2.16 Gewicht ::= Ganze_Zahl
- 3 Steuerbefehle
- 4 Beispiel
- 5 Verweise
- 6 Quellen
- 7 Autor
Elemente zur Beschreibung
Da ich nicht so genau weiß, wie die formale Definition einer syntaktischen Beschreibung aussieht, werden hier die Beschreibungselemente vorgestellt. Hier wird also die Sprache aufgezeigt, mit der in den nachfolgenden Kapiteln die Definitionen einer Zelle oder die Steuerbefehle beschrieben werden.
Zum Schluss gibt es ein Beispiel, wie die Steuerbefehle für den Aufbau und die Programmierung der Roboterzellen verwendet werden können. Für Eilige also bitte hinten mit dem Lesen anfangen. Das davor ist sehr trocken…
Ganze_Zahl
Eine ganze Zahl ist eine positive (1, 2, …) oder negative (-1, -2, …) ganze Zahl oder der Wert 0.
Positive ganze Zahl
Eine positive ganze Zahl ist eine ganze Zahl größer oder gleich 0.
Kommazahl
Eine Kommazahl ist eine Zahl mit einem Komma oder in exponentieller Schreibweise (Zahlentyp Float).
Zahl
Eine Zahl ist eine ganze Zahl oder eine Kommazahl.
Wort
Ein Wort besteht aus einem Buchstaben, gefolgt von beliebig vielen Buchstaben, Zahlen oder bestimmten Sonderzeichen, wie z.B. das „_“. Die anderen zulässigen Sonderzeichen sollen jetzt noch nicht näher ausgeführt werden und gelten als kein Bestandteil eines Wortes mehr. Insbesondere beendet ein Leerzeichen ein Wort. (Sonderzeichen werden bei Bedarf ergänzt.)
„Zeichenfolge“
Die in Klammern gesetzte Zeichenfolge muss vorkommen. Dann natürlich ohne die Anführungszeichen („“).
Bezeichner
Ein Bezeichner ist ein Wort und kennzeichnet das jeweilige syntaktische Element.
Ausdruck ::= Bezeichner
Diese Schreibweise bedeutet: Ein Ausdruck kann ein Bezeichner sein.
Ausdruck ::= Ausdruck Ausdruck
Ein Ausdruck kann eine Folge von Ausdrücken sein. Mit A B wird beschrieben, dass nach dem Ausdruck A der Ausdruck B zutreffen muss.
Ausdruck ::= Ausdruck „|“ Ausdruck
Mit A | B wird beschrieben, dass der Ausdruck entweder A oder B ist. Eine der Alternativen muss jedoch zutreffen.
Ausdruck ::= „(“ Ausdruck „)“
Man darf Ausdrücke klammern, um eine Rangordnung festzulegen. So beschreibt z.B. (A B) | C, dass entweder A B oder C zutreffen, aber nicht A alleine.
Ausdruck ::= „[“ Ausdruck „]“
Beschreibt optionale Elemente. A [B] beschreibt, dass entweder A alleine, oder A gefolgt von B auftreten darf.
Ausdruck ::= Ausdruck „…“
Der Ausdruck darf beliebig oft wiederholt werden. So beschreibt (0 | 1)… die binären Ziffern: 0 oder 1 oder 10 oder 11 oder … Da es mittels der Klammern [] möglich ist, optionale Elemente zu beschreiben, muss bei beliebig oft („…“) das Element mindestens einmal vorkommen. Sonst kann man ja [Ausdruck …] schreiben.
Die Definitionen einer Zelle
Name ::= Wort …
Ein Name besteht aus einem oder mehreren Wörtern. Hier soll gelten, dass zwischen Wörtern beliebig viele Leerzeichen folgen können, bei der Anzeige aber lediglich ein trennendes Leerzeichen ausgegeben wird.
Zelldefinition ::= [Wertebereich | Speicherstelle | Zusammenhang ] …
Eine Zelle enthält beliebig viele (d.h. solange der Speicherplatz ausreicht) Definitionen von Wertebereichen, Speicherstellen oder Zusammenhängen.
Wertebereich ::= „Wertebereich“ WName „=“ ( Aufzählung | Zahlenbereich )
Ein Wertebereich besteht aus einem Namen, dem eine Aufzählung oder ein Zahlenbereich zugeordnet wird.
WName ::= Name
Der Bezeichner eines Wertebereichs. Wertebereiche sind über alle Zellen eines Roboters (Zellverbundes) hinweg gültig.
Aufzählung ::= „{“ AName [ „,“ AName ] … „}“
Eine Aufzählung ist eine Menge (eigentlich Folge) von Namen, die über Kommas getrennt werden. Dem ersten Namen wird einer 0 zugeordnet, dem zweiten eine 1 usw., so dass eine Reihenfolge definiert ist.
AName ::= Name
Ein Name aus der Aufzählung eines Wertebereichs.
Zahlenbereich ::= ( Ganze_Zahl „..“ Ganze_Zahl ) | ( Kommazahl „..“ Kommazahl )
Ein Zahlenbereich besteht aus einer unteren und einer oberen ganzen Zahl. Er kann jedoch auch über eine untere und eine obere Kommazahl definiert werden. Je nach dem, beinhaltet der Zahlenbereich lediglich ganze Zahlen, oder alle darstellbaren Kommazahlen in dem entsprechenden Intervall.
Speicherstelle ::= („Element“ EName „:“ WName ) | („Gemeinsam“ EName „:“ Slave „,“ EName)
Die Speicherstelle erhält einen in der Zelle eindeutigen Namen. Diesem wird in der ersten Alternative ein Speicherbereich zugeordnet, dessen Größe über den Wertebereich festgelegt ist. (Alles ist natürlich vom verfügbaren Speicherplatz der Zelle abhängig.) Bei der zweiten Alternative wird auf eine andere Zelle im aktuellen Ring verwiesen (Beschreibung s.u.) und eine dort bereits verwendete Definition zugrundegelegt. Nun ist es gleichgültig, welche der Zellen die Speicherstelle beschreibt oder von ihr liest: das Betriebssystem sorgt dafür, dass jede Änderung weitergereicht wird. Es ist so, als ob beide auf die selbe Speicherstelle zugreifen würden.
EName::= Name
Der Bezeichner einer Speicherstelle. Die Namen „und“ bzw. „Ende“ sind nicht zulässig.
Zusammenhang ::= „Zusammenhang“ Elementbeschreibung [ „und“ Elementbeschreibung ] … „Ende“
Ein Zusammenhang besteht aus einer oder mehreren Elementbeschreibungen. Zur Vereinfachung für kleine Eingabegeräte kann eine Elementbeschreibung auch mit Return beendet werden, dann promptet das System mit „und“ und man gibt die nächste Elementbeschreibung oder ein „Ende“ ein.
Alle Zusammenhänge werden permanent nacheinander ausgeführt. Wenn ein Zusammenhang ausgeführt wird, dann erfolgt zuerst die Berechnung der Anwendbarkeit: Hierzu wird für jede Elementbeschreibung ein Wert ermittelt. Alle Werte werden zusammenaddiert. Ist das Ergebnis über dem fest eingestellten Schwellwert von 10.000 (man könnte auch einen anderen festen Wert nehmen), so wird der Zusammenhang angewendet. Dabei wird nacheinander jede Elementbeschreibung angewendet.
Elementbeschreibung ::= EName „=“ Gewicht „=“ (Zahlenbereich | AName | Term)
Der Wert einer Elementbeschreibung ist das Gewicht, sofern die benannte Speicherstelle einen Wert innerhalb des angegebenen Zahlenbereichs besitzt, dem angegebenen Namen der Aufzählung, oder dem Ergebnis der Berechnung des Terms entspricht. Andernfalls ist der Wert gleich 0. Die Anwendung einer Elementbeschreibung setzt die Speicherstelle auf die angegebene Zahl oder den Namen der Aufzählung bzw. die Mitte vom Zahlenbereich. Der Term wird nur einmal berechnet, so dass es zu keiner Verfälschung vom Ergebnis kommen kann.
Term ::= VzZahl | "(" Term ")" | PlusMinus | MalDiv
Dert Term ist eine vorzeichenbehaftete Zahl oder ein geklammerter Term, eine Addition bzw. Subtraktion bzw. Miltiplikation oder Division.
VzZahl ::= Zahl | ["-"] EName
Eine vorzeichenbehaftete Zahl ist eine Zahl (die ja auch ein vorangesteltes "-" haben kann), oder der Name einer Speicherstelle mit ggf. einem vorangestellten Minuszeichen.
PlusMinus ::= ( Term "+" Term ) | ( Term "-" Term )
Hier können Additionen bzw. Subtraktionen durchgeführt werden.
MalDiv ::= ( Term "*" Term ) | ( Term "/" Term )
Hier können Multiplikationen bzw. Divisionen durchgeführt werden.
Gewicht ::= Ganze_Zahl
Eine positive Zahl befürwortet die Anwendung eines Zusammenhangs, bei 0 hat der aktuelle Wert der Speicherstelle keine Bedeutung für die Prüfung der Anwendbarkeit und ein negativer Wert behindert die Anwendung des Zusammenhangs.
Steuerbefehle
Nachfolgend sind die für die Ein-/Ausgabeeinheit zur Programmierung der Zellen erforderlichen Befehle zusammengestellt.
Aktueller Ring
Ein Ring besteht aus mehreren logisch unmittelbar miteinander verbundenen Zellen. Dabei ist eine Zelle ein Master, die anderen Zellen sind Slaves. Ein Slave kann gleichzeitig auch für einen anderen Ring ein Master sein. Der kleinste Ring besteht nur aus dem Master. Eine Zelle kann höchstens einmal Master und einmal Slave sein. Der aktuelle Ring ist ein Ring, der gerade betrachtet wird.
Zellenname_vergeben ::= „neu“ Slave
Im aktuellen Ring wird der zuletzt neu hinzugefügten Zelle ein Name vergeben. Eine Zelle mit einem Namen gilt nicht mehr als neu hinzugefügt. Der Name ist auf den Ring beschränkt.
Slave ::= Name
Der Name einer Zelle innerhalb eines Rings. Der Name ist in dem Ring eindeutig zu wählen.
Ring_wechseln ::= „zu“ Slave
Der Slave im aktuellen Ring wird zum neuen Steuerelement. Der Ring, für den er der Master ist, wird zum aktuellen Ring. Seine Zelldefinitionen können nun erstellt bzw. geändert werden. Das System antwortet mit dem Namen des Masters im aktuellen Ring. Dies ist sein Slave-Name, also der angegebene Name nach „zu“. Kann der Wechsel nicht erfolgen, so antwortet der alte Master mit seinem Namen. Die Ein-/Ausgabeeinheit hat einen eigenen Namen.
Name_der_EA ::= „EA“ Name
Der Name der Ein-/Ausgabeeinheit wird auf den angegebenen Namen gesetzt. Die Ein-/Ausgabeeinheit ist immer ein Master, an dem die neuen Zellen nach und nach zu einem Zellverbund (Roboter) zusammengeschaltet werden.
Zurückgehen ::= „weg“
Der Master im aktuellen Ring ist Slave für einen anderen Ring. Dieser Ring wird zum aktuellen Ring. Das System antwortet mit dem Namen des neuen Masters.
umbenennen ::= „bezeichne“ EName „als“ EName
Die Speicherstelle EName erhält die neue Bezeichnung nach dem Schlüsselwort „als“.
auflisten ::= „Elemente“ | „Zusammenhänge“
Die Speicherstellen bzw. Zusammenhänge des Masters im aktuellen Ring werden aufgelistet.
Beispiel
Das Zusammenwirken der Steuerbefehle beim Aufbau und der Programmierung soll anhand eines Beispiels aufgezeigt werden. Dabei wird ein Roboter konstruiert, der einer Linie auf dem Boden folgen kann. Hierzu werden nachfolgende Zellen benötigt:
- Stromversorgung: Sie versorgt den Roboter mit Energie. Über einen Ein-/Ausschalter kann der Roboter gestartet werden.
- Radzelle (2 fach): Ein mit Motor angetriebenes Rad.
- Logikzelle: Die Steuerzentrale des Roboters.
- Stützrad: Wie bei kleinen Modellen üblich, wird zur Abstützung ein rein passives Stützrad eingesetzt.
- Sensorzelle: Mit der Sensorzelle sind zwei bewegliche Photozellen verbunden, über die die Steuerlinie detektiert werden kann. Für den Aufbau und die Programmierung wird zusätzlich noch eine Ein-/Ausgabeeinheit benötigt. Sie ist gleichzeitig Stromversorgung beim Aufbau und Besitzt einen Master-Anschluss.
Der Aufbau
Die Ein-/Ausgabeeinheit wird eingeschaltet und mit dem Befehl
EA Linienbot
mit einem Namen versehen.
Dann wird die Stromversorgung angeschlossen. Über
neu Strombasis
erhält die Stromversorgung ihren Namen. Mit
zu Strombasis
wird diese als Master angegeben.
Nun kann die linke Radzelle befestigt werden und über
neu Rad links
ihren Namen erhalten. Gleichzeitig wird damit festgelegt, dass sich das Rad als Slave mit der Stromversorgung als Master in einem Ring befindet.
Dem rechten Rad wird der Name vergeben:
neu Rad rechts
Mittig an der Stromversorgung wird nun die Logikzelle gegenüber der Ein-/Ausgabeeinheit angefügt. Auch hier ein Name:
neu Denkstation
zu Denkstation
Der letzte Befehl macht die Logikzelle zu einem Master. Dabei wird von der Vorstellung ausgegangen, dass ein Master nur die unmittelbar angrenzenden Zellen als Slave versorgen kann.
Das Stützrad wird angebracht:
neu Stützrad
Es hat jedoch keine eigenständige Logikfunktion und leitet die Steuerbefehle einfach weiter. Der Befehl wird ignoriert und hätte auch weggelassen werden können.
Die Sensorzelle wird nach dem Stützrad in Linie mit der Logikzelle verbunden.
neu Sensor
Dies geht, da das Stützrad kein Slave bzw. Master sein kann. An der Unterseite der Sensorzelle werden nun die beiden Photozellen angebracht, Die Photozellen 1 links und die Photozellen 2 rechts daneben parallel zu der Radachse. Der Abstand ist etwas schmäler als die Linienbreite zu wählen. Dadurch kann die exakte Positionierung auf der Linie durch das Ansprechen beider Photozellen detektiert werden. Spricht lediglich eine an, so ist entsprechend gegenzulenken.
Nun ist der Roboter aufgebaut und kann programmiert werden.
Einrichtung der Speicherzellen
Gemäß obiger Sequenz ist die Denkstation aktueller Master.
zu Sensor
bringt uns in den Sensor, so dass dieser programmiert werden kann.
Elemente
liefert eine Übersicht, über die dort vordefinierten Speicherstellen:
Sensor 1 : Photosensor
Sensor 1 : Photosensor
bezeichne Sensor 1 als Sensor links
bezeichne Sensor 2 als Sensor rechts
Elemente
liefert nun die umbenannten Speicherstellen:
Sensor links : Photosensor
Sensor rechts : Photosensor
Da hier jetzt nichts mehr zu tun ist, wird auf den vorherigen Master, die Logikzelle positioniert:
weg
Es folgt die Antwort: Denkstation
Mit
Gemeinsam Links : Sensor, Sensor links
Gemeinsam Rechts : Sensor, Sensor rechts
werden die Sensorinformationen der Denkstation zur Verfügung gestellt.
Fürs erste nun weiter zu den Motoren:
weg
Es folgt die Antwort: Strombasis
zu Rad links
bringt uns zum einen Motor.
Elemente
liefert eine Übersicht, über die dort vordefinierten Speicherstellen:
Sollbewegung : Motorstärke
Istbewegung : Motorstärke
Der Wertebereich Motorstärke ist dabei definiert als -100 .. 100. Die Namen sollen hier unverändert beibehalten werden.
weg
Es folgt die Antwort: Strombasis
Mit
Gemeinsam Motor links : Rad links, Sollbewegung
Kann das linke Rad von der Strombasis angesteuert werden.
Da es sich bei den Radzellen um den gleichen Zelltyp handelt, sind auch die gleichen Namen für die Speicherstellen vorprogrammiert: Gemeinsam Motor rechts : Rad rechts, Sollbewegung
Hierüber ist die Steuerung vom rechten Rad der Strombasis bekannt gegeben worden.
zu Denkstation
Hierüber wird in die Logikzelle gewechselt.
Gemeinsam Motor rechts : Strombasis, Motor rechts
Gemeinsam Motor links: Strombasis, Motor links
Diese Befehle machen die Motoren der Logikzelle verfügbar. Jede Änderung bei diesen Speicherstellen wird in die betreffende Speicherstelle der Radzelle automatisch übertragen.
Die Programmierung
Nun müssen in der Logikzelle noch die Zusammenhänge aufgezeigt werden. Wir befinden uns in der Denkstation.
Elemente
liefert eine Übersicht, über die dort vordefinierten Speicherstellen:
Links : Photosensor
Rechts : Photosensor
Motor links : Motorstärke
Motor rechts : Motorstärke
Photosensor sei definiert als { frei, detektiert } und Motorstärke (-100 .. 100) stellt gleichmäßig die Geschwindigkeit von Rückwärtsfahren (-100) zu Stillstand (0) bis zu Vorwärtsfahren (100) ein.
Nun zu den Zusammenhängen:
Wenn beide Sensoren ansprechen, fahre ich richtig:
Zusammenhang Links = 6000 = detektiert und Rechts = 6000 = detektiert und Motor links = 0 =100 und Motor rechts = 0 = 100 Ende
Die Gewichte mit 0 tragen nichts für die Berechnung der Anwendbarkeit bei. Wird nur einer der Sensoren angesprochen, liegt das Gesamtgewicht bei 6.000 und damit unterhalb des Schwellwertes von 10.000. Bei der Anwendung des Zusammenhangs werden zwar die Sensoren auf 6.000 eingestellt, die Sensorzelle überschreibt jedoch den Wert mit den neuen Eingangsdaten. Zum Zeitpunkt der Anwendung ist die Linie bereits detektiert.
Wenn der linke Sensor anspricht, der rechte jedoch nicht, sollte nach links gesteuert werden:
Zusammenhang Links = 11000 = detektiert und Rechts = -6000 = detektiert und Motor links = 0 =50 und Motor rechts = 0 = 100 Ende
Der linke Sensor würde alleine den Schwellwert übersteigen, trifft jedoch der rechte Sensor auch zu, so werden wieder 6000 Gewichtespunkte abgezogen. Die Regel kann nicht angewendet werden. Die Linkskurve wird durch die unterschiedlichen Geschwindigkeiten erreicht.
Wenn der rechte Sensor anspricht, der linke jedoch nicht, sollte nach rechts gesteuert werden:
Zusammenhang Links = 6000 = frei und Rechts = 6000 = detektiert und Motor links = 0 =100 und Motor rechts = 0 = 50 Ende
Einfach eine andere Art der Berechnung.
Wenn kein Sensor anspricht, fahre ich einen Kreis:
Zusammenhang Links = 6000 = frei und Rechts = 6000 = frei und Motor links = 0 =60 und Motor rechts = 0 = 30 Ende
Nach erfolgter Programmierung wird die Ein-/Ausgabeeinheit ausgeschaltet und vom Roboter gelöst. Mit Einschalten der Stromversorgung kann die Fahrt beginnen.
Verweise
Quellen
Autor
--ZellRobi 11:19, 2. Aug 2008 (CEST)