| |
TeachIn für die Industry Robots : ganz einfach
Schöne, komplizierte und große Programme finden sich mehrere auf der Site, aber ein ganz
einfaches mit Pfiff fehlte noch, hier die Visual Basic Version - Schritt für Schritt.
- Was man dazu braucht :
+ Visual Basic 6.
+ Einen fischertechnik Industry Robot : Rob3 Säulenrobot oder Rob4 Knickarmrobot
+ Ein fischertechnik Interface (Parallel (Unversal) oder Seriell (Intelligent))
+ Einen einfachen analogen JoyStick mit X- und Y-Achse und vier Knöpfen.
oder einfach mit Maus und num. Tastatur.
+ Das neue FishFa50.OCX (enthält auch die Beispiele).
- Beginnen des VB6 Projektes
+ Anlegen eines Standard-Projektes mit einer einfachen Form
+ Markieren von FishFace Control 5.0 (FishFa50.OCX) in Projekt | Komponenten. Wenn es
nicht zu finden ist auf Durchsuchen Klicken und in der Fileliste markieren (sollte bei der
Installation von FishFa50.ZIP in \Windows\System bzw. \WinNT\System32 gelandet sein.
+ Die Controls FishFace und FishJoy / FishKey auf die Form ziehen und ft bzw. jy /ky
taufen.
+ Und dann (Hinweise später) noch einige Buttons und Labels plazieren.
- Die globalen Daten
Option Explicit
Dim PortName$
Dim Takte(1 To 100, 1 To 4) As Long, TaktAnz&
Die Tabelle Takte enthält die während des TeachIn aufgezeichneten
Robot-Positionen, TaktAnz die Anzahl der Positionen, die in Takte eingetragen wurden.
- Initialisieren
Private Sub Form_Load()
With ft.MotCntl
.Name(1) = "Säule"
.EndPosition(1) = 240
.Name(2) = "ArmHorizontal"
.EndPosition(2) = 140
.Name(3) = "ArmVertikal"
.EndPosition(3) = 112
.Name(4) = "Greifer"
.EndPosition(4) = 26
End With
TaktClear
End Sub
Das FishFace Objekt ft.MotCntl (Bestandteil des FishFace Controls) enthält eine
kompakte Beschreibung des Robots. Aufgeführt wurden nur die von den Defaults abweichenden
Werte Name der Robot-Komponente und die Anzahl der Impulse, die sich die Komponente vom
Endtaster wegbewegen darf, hier die Werte für Rob3. Die Ende(Taster) sind 1, 3, 5, 7 und
die Impuls(Taster) 2, 4, 6, 8, die Motoren 1 - 4. Sie (die Motoren) sollten so gepolt
sein, dass sie beim Klicken auf "L" im InterfacePanel (ft.ShowPanel)
in Richtung Endtaster laufen. TaktClear setzt die Tabelle Takte auf Anfangswerte.
- Starten des Interface
Dazu Button comAction (Caption : START) anlegen und in cmdAction_Click dann :
If ft.OpenInterface("COM1") = ftifehler Then
MsgBox "Interface-Problem", vbCritical + vbOKOnly, App.ProductName
Exit Sub
End If
Öffnen der Verbindung zum Interface ("COM1" ggf. entsprechend Interface
und Anschluß ändern), wenn das Open nicht klappt wird die Sub mit einer Meldung
verlassen.
Ab hier wird nur noch die JoyStick-Variante beschrieben, die Maus/Keyboard-Variante
funktioniert ganz ähnlich und ist in FishKeyTest.VBP zu finden.
- Verbindung zum JoyStick
Set jy.FishFaceControl = ft
Damit sind die beiden Controls FishFace und FishJoy miteinander verbunden und die
JoyStick-Positionen führen zum Fahren der Robot-Komponenten (immer eine Komponente zur
einer Zeit).
- Fahren zur Home-Position
ft.MoveHome
D.h. der Robot fährt mit allen seinen Komponenten bis zum Erreichen der jeweiligen
Endtaster. Im Beispiel werden noch Buttons Enabled ... das ist sinnvoll, aber nicht
unbedingt erforderlich.
- Aktivieren des JoySticks
jy.StartJoy
Damit wird intern ein Timer gestartet, der regelmäßig (ft.ControlInterval)
die JoyStick-Positionen abfragt und ggf. Motoren des Robots startet oder stoppt. Nun
läuft das Programm und man kann mal (vorsichtig) den JoyStick bewegen um mal zu sehen,
was sich so tut (der Robot sollte dem JoyStick folgen).
- Speichern von Robot-Positionen
Private Sub cmdAdd_Click()
TaktAdd
End Sub
Mit dem neuen Button Speichern (cmdAdd_Click). Die Routine TaktAdd fügt die
aktuelle Robot-Position in die Tabelle Takte ein und zwar in die Zeile TaktAnz (das wird
gleichzeitig hochgezählt)
Private Sub TaktAdd()
If TaktAnz > UBound(Takte) Then Exit Sub
TaktAnz = TaktAnz + 1
Takte(TaktAnz, 1) = ft.MotCntl.Position(1)
Takte(TaktAnz, 2) = ft.MotCntl.Position(2)
Takte(TaktAnz, 3) = ft.MotCntl.Position(3)
Takte(TaktAnz, 4) = ft.MotCntl.Position(4)
lblTaktAkt = TaktAnz
End Sub
Die aktuelle TaktAnz wird im Label lblTakAkt angezeigt. Es ist nur möglich Takte
(Positionen) "hinten" anzufügen oder alles zu löschen. Das ist einfach und
reicht fürs erste.
- Löschen der Takte-Tabelle
Private Sub TaktClear()
TaktAnz = 1
Takte(1, 1) = 0
Takte(1, 2) = 0
Takte(1, 3) = 0
Takte(1, 4) = 0
lblTaktAkt = TaktAnz
End Sub
Das ist gleichzeitig ein Eintrag zum Anfahren der Home-Position.
Aufruf über den neuen Button Löschen (cmdClear_Click)
Private Sub cmdClear_Click()
TaktClear
End Sub
- Abfahren der gelernten Positionen mit dem Robot
Private Sub cmdRun_Click()
Dim i&
ft.NotHalt = False
For i = 1 To TaktAnz
If ft.MoveTo(Takte(i, 1), Takte(i, 2), Takte(i, 3), Takte(i, 4)) _
= ftifehler Then Exit Sub
lblTaktAkt = i
Next i
End Sub
Aufruf über den neuen Button Run (cmdRun_Click). ft.NotHalt wird hier auf False
gesetzt um die Abbruchbedingung von ft.MoveTo zurückzusetzten. Die Positionen werden in
einer For Next Schleife abgefahren. Dazu wird die Methode ft.MoveTo genutzt, die die
benötigten Werte aus der Takte-Tabelle erhält. Tritt ein Fehler auf oder wird manuell
abgebrochen (zB. mit der Escape-Taste), wird die Sub beendet. Das wars eigentlich schon
- Das Ende
Private Sub cmdHalt_Click()
jy.StopJoy
ft.NotHalt = True
cmdHalt.Enabled = False
cmdEnde.Enabled = True
End Sub
Der neue Button HALT beendet den JoyStick-Betrieb, das Abfahren der Takte-Tabelle
und dann die Verbindung zum Interface.
Private Sub cmdEnde_Click()
jy.StopJoy
ft.CloseInterface
Unload Me
End Sub
Der neue Button ENDE beendet das Programm. In der Beispiel-Source wird noch mit
Enabled ... gearbeitet um Fehlbedienungen einzuschränken. Man sollte darauf achten, daß
immer eine laufende Abfahren-Schleife beendet wird, bevor das Programm ganz beendet werden
soll, sonst wird nur die Form gelöscht, aber nicht die Schleife.
- Noch mehr Anzeigen
Private Sub PositionAkt()
lblPos(0) = ft.MotCntl.Position(1)
lblPos(1) = ft.MotCntl.Position(2)
lblPos(2) = ft.MotCntl.Position(3)
lblPos(3) = ft.MotCntl.Position(4)
End Sub
Private Sub ft_OnFishPosition()
PositionAkt
End Sub
Private Sub jy_OnJoyPosition()
PositionAkt
End Sub
Die Sub PositionenAkt zeigt die aktuelle Position der Robot-Komponenten in Impulsen
ab Endtaster in den Labels lblPos() an. Sie wird von den
Ereigniss-Routinen ft_OnFishPosition (FishFace) und jy_OnJoyPosition (FishJoy) aufgerufen.
Das war schon alles und soll gleichzeitig der Ausgangspunkt für ein viel schöneres,
größeres und komplizierteres eigenes Programm sein.
Stand : 18.01.2008
|