| | Lösungen für das Modell Schweißroboter des Computing Starter
Aufbau : M1 mit Säulenmotor und I1 Endtaster, I2 Impulstaster,
M4 mit Schweißlampe.
Bei mir war das eine Abwandlung des Hanoi-Roboters
bei dem zusätzlich auf dem Arm eine Birne(M4) montiert wurde.
Vorgestellt werden verschiedene Lösungsmöglichkeiten,
beginnend auf Level 2 mit einer einfachen sequentiellen Lösung bis hin zu einer
komplexeren, listengesteuerten Lösung auf Level 3.
Auf der nächsten Seite wirds dann richtig schön : es kommt noch eine
TeachIn-Lösung hinzu.
Schweissroboter1L2
|
Sieht beinahe wie ein LLWin-Programm aus. Es
geht hier alles schön der Reihe nach :
- Anfahren der Home-Position (bis Pause)
- Anfahren Position 56 und Schweißen
- Anfahren Position 94 (56 + 38)
- Anfahren Position 144 (94 + 50)
und das in einer Endlosschleife.
Neu (gegenüber LLWin) ist hier :
- die gelbe 1 : Warten auf Taster an I1 = true
man spart also den bei LLWin üblichen Abfragekringel
- die gelben Pfeile : Zählen von Impulsen am angegebenen
Eingang, hier werden alle gezählt (nur fallende, steigende
sind auch möglich). Hier wird gegenüber LLWin konsequent
der Gebrauch von externen Variablen vermieden. |
Das Schweißen
|
Interessant ist hier das
Zählschleifenkonstrukt :
Hier wird eine Schleife 12 mal durchlaufen. Beim Start (Eingang =1)
wird der interne Zähler auf 1 gesetzt, bei den weiteren
Schleifendurchläufen jeweils um (+1) 1 erhöht.
Auch hier werden externe Variable vermieden. Die Konstruktion ist
einfacher als die bei LLWin übliche Variablenabfrage und Incrementierung. |
Schweißroboter2L3
|
Sequentieller Ablauf wie gehabt, aber :
- Auslagerung der Positionierung in ein Unterprogramm
Das Unterprogramm bekommt die anzufahrende
Position über einen Parameter mitgeteilt.
- Ebenso wurde das Anfahren der Home-Position in ein
Unterprogramm verlagert.
- neues Element Konstanten, die über gelbe Linien mit
dem Zielelement verbunden werden.
- Level 3 bringt eine Trennung von Kontrollfluß
(schwarze Linien) und Datenfluß (gelbe Linien, sie
werden in den weiteren Programmteilen vermehrt
auftreten).
- Damit verbunden ist die Einführung von Konstanten,
globalen und lokalen Variablen.
- Ebenso wird jetzt zwischen Befehlen (im Kontrollfluß)
und Ein- und Ausgängen (z.B. Interface M1 - M4 und
I1 - I8) sowie Operatoren (im Datenfluß) unter-
schieden.
- Level 1/2 Symbole können mit Level 3 Symbolen gemischt verwendet. Ob
mans dann tut, ist Geschmackssache (und eine der Bequemlichkeit, siehe
nachfolgende Routine Schweissen).
|
Das renovierte Schweißen
|
Der Ablauf ist wie in Level 1.
Die Schweißbirne wird jetzt aber über Level 3-Elemente angesteuert.
Mit dem grünen Kreis geht es mit voller Helligkeit (8) los, warten und
aus. Diese Befehle befinden sich im Kontrollfluß und senden über den
Datenfluß (gelb) entsprechende Nachrichten an die Birne.
Das Zählelement wurde (faulheitshalber) beibehalten. Es wäre sonst
eine Zählvariable, ein Additionbefehl und eine Abfrage fällig gewesen
(mit gelben und schwarzen Linien). Das kann man dann weiter unten
bewundern. |
Anfahren der Home-Position
|
Hier mit dem gelben "J" die gelbe
"1" von Level 1 in neuem Gewand : Warten auf I1 = true. Die
Varianten Warten auf false oder steigende (0->1), fallende(1->0)
Flanke sind ebenfalls möglich
Der Säulenmotor an M1 wird jetzt durch separate Befehle angesteuert
(roter Linksdreh, Fullspeed und STOP).
Neu sind hier auch der "=" Befehl, der die Nachricht 0 an die
(globale) Variable ActPos sendet. D.h. die Säule steht auf Position 0
gerechnet ab Endtaster an I1.
Mit dem Wert 0 (bei ActPos) wird die Variable bei Programmstart auf 0
initialisiert. Das =0 ist hier erforderlich, das Home mehrfach aufgerufen
wird (und natürlich der Ordnung halber).
|
Anfahren einer vorgegebenen Position
|
Ist schon etwas vertrackter.
Die anzufahrende Position wird über den Parameter ZielPos vorgegeben
(immer gerechnet ab Endtaster). Die aktuelle Position (auch ab Endtaster)
wird in der globalen Variablen ActPos gehalten (im Hauptprogramm tritt sie
gar nicht in Erscheinung, sie hier und in Home genutzt).
Zentraler Befehl ist die Abfrage A?B mit der ZielPos und ActPos
verglichen werden. Bei Gleichheit ist zu Ende, Motor Aus.
Ist ZielPos > ActPos gehts nach rechts mit M1, die bei I2
auftretenden Impulse werden gezählt ("Pfeil"-Befehl) und ActPos
wird jeweils um 1 erhöht bis es dann gleich ist.
Bei ZielPos < ActPos gehts nach links in Richtung Endtaster,
ansonsten sinngemäß.
Man könnte hier natürlich (vorsichtshalber) auch noch den Endtaster
an I1 abfragen und die maximal mögliche Fahrstrecke. Das kriegen
wir später.
|
Schweißroboter3L3
|
Ist schon beinahe eine Luxusausführung. Hier
werden die anzufahrenden Positionen in der Tabelle (oder Liste) Positionen
gespeichert. In diesem Beispiel schon bei der Programmerstellung.
Die Tabelle erhält über den I-Eingang die Nummer (Index, ab 0) des
Tabellenelementes das über den R-Ausgang auszugeben ist. Hier landet es
dann als Parameter bei DriveTo.
Der I-Ausgang gibt bei einem Indexwert kleiner der Anzahl
Tabellenelemente (hier 3) die aktuelle Anzahl der Tabellenelemente (hier
also 3) aus, bei Index 3 oder größer wird 0 ausgegeben. Das wird zur
Schleifensteuerung bei A>0 genutzt.
Die verwendeten Unterprogramme entsprechen denen vom vorhergehenden
Beispiel.
Der aktuelle Index wird in einer Variablen gehalten (augenscheinlich
erforderlich, da der +1 Befehl sonst nicht ankommt, der =0 tuts).
|
Stand : 05.10.2009
|