MultiThread

ftComputing : Programme für die fischertechnik-Interfaces und -konstruktionskästen
  
ftComputing.de
Home
Back
Sitemap
Index
Links
Impressum
Mail
 

Simultane Prozesse

Problemstellung Betrieb eines "Funkturmes, der im oberen Teil drehbar (M4, E1, E2) ist und an der Spitze "BlinkFeuer" (M1 - M3) und "Sensoren" (EX, EY, Photowiderstände) trägt. Verwendet wurde das parallele fischertechnik Interface 30 520.   mit LLWin 2.1 (fischerwerke) und FiPro Win 1.0 (Cornelsen).

Modell Funkturm LLWin 2.0
LLWin : Funkturum
FiPro Win 1.0
FiPro Win : Funkturm

Die LLWin Lösung nutzt drei Prozesse (Kennzeichung durch Start), die endlos laufen. Der Prozeß Turm enthält (im Gegensatz zur LLWin-Lösung) auch die Initialisierung. Durch die Darstellung mit Verzweigungen und einem aufwendigen "Position" Befehl wirkt dieser Zweig recht "technisch". Die weiteren Prozesse sind recht ähnlich. Start und Ende des Programms durch die Entwicklungsumgebung.

FiPro zeigt hier vier verblüffend einfache Prozesse, die die gleiche Aufgabe wie LLWin erledigen. Hier gibt es einen separaten Init-Prozeß, der als erstes die anderen Prozesse sperrt und den Turm auf Nullstellung fährt, die anderen Prozesse wieder freigibt und sich selbst beendet. Die weitereren Prozeß laufen endlos. Start und Ende des Programmes erfolgt über die Entwicklungsumgebung. Der Prozeß "TurmDreh" läuft hier wie bei LLWin 120 Impulse vom Endtaster 1 weg und dann wieder zurück zum Endtaster. Der automatisch vom System erstellte "Programmtext" liest sich so (Auszug) :

Prozess : Init
Prozessvorrang! Parallele Prozesse ruhen
Motor 4 auf Linkslauf schalten
warte bis Taster 2 gedrückt
Motor 4 ausschalten
Prozessvorrang aufheben
einfach

Prozess : TurmDreh
Motor 4 auf Rechtlauf schalten
warte bis 120 Impulse an Eingang 1
Motor 4 auf LinksLauf schalten
warte bis Taster 2 gedrückt
Motor 4 ausschalten
3 Sekunden warten
Schleife

Prozess: Sensoren
warte auf Ey: Y>5
Wertzuweisung an Variable: A=Y
Variable A anzeigen
Schleife

Prozess : BlinkFeuer
Lampe 1(gelb) einschalten
...
1 Sekunde warten
...
Lampe 5 ausschalten
1 Sekunde warten
Schleife

Der Funktionsumfang beider Systeme erlaubt sowohl einen Ausbau in Richtung Komfort, wie auch den Einsatz interaktiver Funktionen. FiPro kennt ebenfalls Verzweigungen. Beide Systeme kennen Variable (freidefinierbare und Systemvariable).

Vergleich mit einer Visual Basic Lösung :

Source-Ausschnitt (ft. : Methoden von FishN632.DLL wurde genutzt):

' --- Fahren auf Grundstellung ---

ft.SetMotor TurmMotor, ftiRechts ' --- nach rechts zum TurmEnde-Taster
Do: Loop Until ft.GetInput(TurmEnde)
ft.SetMotor TurmMotor, ftiAus ' Grundstellung erreicht

' --- TurmDreh ---

Do
ft.SetMotor TurmMotor, ftiLinks ' --- weg vom TurmEnde-Taster
ft.WaitForChange TurmImpuls, 240, NotAus ' 240 Impulse
ft.SetMotor TurmMotor, ftiRechts ' --- zurück zum TurmEnde-Taster
Do: Loop Until ft.GetInput(TurmEnde)
ft.SetMotor TurmMotor, ftiAus ' --- Pause
ft.WaitForTime 3000 ' 3 Sekunden
Loop

' --- BlinkFeuer, abwechselnd An/Aus bei jedem TimerAufruf ----

Static BlinkAn As Boolean

If BlinkAn Then
ft.SetMotorList ftiEin, ftiEin, ftiEin
BlinkAn = False
Else
ft.SetMotorList ftiAus, ftiAus, ftiAus
BlinkAn = True
End If

' --------- Anzeige der Sensorwerte ----------

lblEX = Format$(ft.GetAnalog(0), "0000")
lblEY = Format$(ft.GetAnalog(1), "0000")

Die Lösung spricht vom Aufbau her am ehesten der LLWin-Lösung. Da Visual Basic standardmäßig kein MultiThreading (mehrere Prozesse) anbietet, wurde hier für BlinkFeuer und Sensor auf Timer ausgewichen (Aufruf einmal pro Sekunde). Deswegen ist in der Routine auch kein "Warte" mehr erforderlich. Bei BlinkFeuer mußte zusätzlich noch der An/Aus-Wechsel zwischen zwei Aufrufen gemerkt werden (Souce : FunkMini.VBP, kleine Lösung, die eigentlich nur in der Entwicklungumgebung laufen sollte).

Da ein Visual Basic Programm auch außerhalb der Entwicklungsumgebung laufen kann, sollte hier außerdem für eine gute Bedienbarkeit gesorgt werden (FunkDreh.VBP).Hier wurde z.B. auch eine Synchronisation der Timer-Prozesse vorgenommen, wie sie in der FiPro-Lösung ebenfalls vorhanden sind. LLWin erlaubt ebenfalls eine Synchronisation (über die Abfrage von Variablen), sie wurde aber der Übersichtlichkeit wegen nicht aufgenommen.

Der Vergleich zeigt, daß eine Visual Basic-Lösung deutlich aufwendiger ist, als eine LLWin bzw. FiPro Win-Lösung. Die Erstellung mit LLWin/FiPro (nach einer Eingewöhnungszeit) ist einfacher und übersichtlicher aber auch auf die Möglichkeiten für dieser spezialisierten Systeme beschränkt.

Nachtrag : WinLogo 2.0

So ganz habe ich es mir denn doch nicht verkneifen können auch eine WinLogo-Lösung vorzustellen. Hier die wichtigsten Ausschnitte :

pr AnzeigeSensoren
Drucke "Sensor " DZ Sensor 1
ende

pr BlinkFeuer
Setze "AZ" Letztes .Zeit
Wenn :AZ <> :LZ Dann ( Wenn :BlinkAn
Dann Ausschalten [1 3 5] Setze "BlinkAn" falsch
Sonst Einschalten [1 3 5] Setze "BlinkAn" wahr )
Setze "LZ" :AZ
ende

pr FunkTurm
Init
TurmDreh
ende

pr Init
Setze "LZ" Letztes .Zeit
Setze "BlinkAn" falsch
Setze "ImpulsAn" falsch
AllesAus
Motor 4 1 ;* TurmMotor links
WarteAufTaster 2
Motor 4 0 ;* TurmMotor aus
ende

pr TurmDreh
Motor 4 2 ;* TurmMotor rechts
WarteAufImpulse 1 120
Motor 4 1 ;* TurmMotor links
WarteAufTaster 2
AllesAus
Pause 30
TurmDreh
ende

pr WarteAufImpulse :Nr :Anzahl
AnzeigeSensoren
BlinkFeuer
Wenn :Anzahl = 0 Dann Rückkehr
Setze "AI" Schalter? 1
Wenn :ImpulsAn = :AI Dann WarteAufImpulse :Nr :Anzahl Sonst Setze "ImpulsAn" :AI WarteAufImpulse :Nr :Anzahl-1
ende

pr WarteAufTaster :Nr
AnzeigeSensoren
BlinkFeuer
Pause 1
Wenn Schalter? :Nr Dann Rückkehr
WarteAufTaster :Nr
ende

Da WinLogo kein parallelen Prozesse (MultiThreading) unterstützt auch hier eine Ein-Prozeßlösung unter Verzicht auf Timer (es wurde der mit WinLogo gelieferte Treiber Fischer.DLL eingesetzt). Die Funktionen AnzeigeSensoren und BlinkFeuer mußten deshalb kunstvoll in den Funktionen WarteAufImpulse und WarteAufTaster eingebaut werden. Anmerkung : Das vorgestellte Programm erreichte unter WinNT auf einem Pentium 400 die Grenzen des Einsatzes mit WinLogo. Die Plazierung der Funktionen AnzeigeSensoren und BlinkFeuer waren ausschlaggebend für die Erkennung des Ende-Tasters (deswegen auch die Pause 1 in WarteAufTaster).

Nachtrag 2 : WinLogo 2.0 und der Turm von Hanoi

Im fischertechnik Kasten "Computing" von 1984 findet sich eine Bauanleitung für einen Roboter "Turm von Hanoi" bei dem ein Arm mit einem gefedert aufgehängten Magneten vier Stahlscheiben stapelt. Das Programm ist in viele kleine - logogerechte - procedures aufgeteilt :

  1. PR Main : Das Hauptprogramm
  2. PR Init : Setzen der Anfangswerte
  3. PR Hanoi : das eigentliche Hanoi-Programm (rekursiv)
  4. PR Ziehe : Umlegen einer Scheibe
  5. PR Hole : Holen einer Scheibe
  6. PR Bringe : Ablegen einer Scheibe
  7. PR SauleNach : Positionieren der Säule auf den zutreffenden Stapel
  8. PR NachRechts : Fahren der Säule nach rechts (im Uhrzeigersinn).
  9. PR NachLinks : Fahren nach links
  10. PR ArmSenken : Senken des Arms (mit dem gefederten Magneten) auf den Stapel
  11. PR ArmHeben : Heben des Arms in eine neutrale Position
  12. PR ScheibeLegen : Ablegen einer Scheibe
  13. PR ScheibeGreifen : Greifen einer Scheibe

Die vollständige Source dazu ist in Schule.ZIP zu finden. Wer keinen Robot von 1984 mehr auftreiben kann, kanns auch mit dem Industry Robot 3 machen : Beispiel in Visual Basic. Und wers etwas exotisch liebt : das gleiche Beispiel für einen Lynxmotion 5 Axis Robot.

Die Sources zu allen vorgestellten Programmen (auch Ampel) sind in Schule.ZIP zu finden.