aus RN-Wissen, der freien Wissensdatenbank
Wechseln zu: Navigation, Suche



Inhaltsverzeichnis

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“ Name „als“ Name

Name bezeichnet eine Speicherstelle, einen Wertebereich oder einen Aufzählungsnamen. Dieser wird in den neuen Namen umbenannt.

löschen ::= „lösche“ Name

Name bezeichnet eine Speicherstelle, einen Wertebereich oder einen Aufzählungsnamen. Dieser wird gelöscht.

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

Ein Prototyp für die Programmierung auf Basis einer C-Control Pro ist unter Roboterzellen: Programmierung C-Control Pro beschrieben.

Quellen

Autor

--ZellRobi 11:19, 2. Aug 2008 (CEST)