Hallo zusammen!
Ich habe in den letzten Tagen den Programmcode für meine neue Schnittstelle LabVIEW -> Roboter fertiggestellt.
Getestet habe ich den Code auch schon, es scheint ganz gut zu klappen. Zumindest sind keine Fehler aufgetreten.
Allerdings war im Test nur ein Roboter direkt über Crosslink mit dem PC verbunden.
Zuerst mein Startprogramm (star.mb4):
10 'START - PROGRAMM
20 CLOSE
30 DLY 1.0
40 M_00# = 0 ' Startvariable für Unterprogramme
50 M_01# = 0 ' Startvariable für Roboterschritt
60 M_02# = 0 ' Daten für Roboterschritt wurden empfangen
70 M_03# = 0 ' Roboter arbeitet Schritt ab
80 M_04# = 0 ' Zeitmessung aktiv
90 M_05# = 0 ' Satusveriable für die Servos
100 C_00$ = "" ' Variable mit den zu sendenden Daten
110 C_01$ = "" ' Variable mit den eingelesenen Daten
120 C_02$ = "" ' Variable mit den Parametern
130 XLOAD 2, "SSER.MB4"
140 XLOAD 3, "LSER.MB4"
150 XLOAD 4, "SICH.MB4"
160 XLOAD 5, "HAUPT.MB4"
170 DLY 1.0
180 XRUN 2
190 XRUN 3
200 XRUN 4
210 XRUN 5
220 HLT
SSER.MB4 ist für das Senden von Daten zuständig, LSER.MB4 für das Lesen. SICH.MB4 überwacht den kontinuierlichen Datenempfang, im Programm HAUPT.MB4 sind die verschiedenen Roboteraktionen als Schritt hinterlegt.
Hier als erstes das Programm LSER.MB4:
10 ' LESEN - SERVER
20 DEF INTE LAENGE
30 LAENGE% = 0
40 OPEN "COM2:" AS #1
50 INPUT #1, C_01$
60 IF C_01$ = "STA" THEN M_00# = 1 ELSE GOTO 90
80 GOTO 50
90 IF C_01$ = "ARB" THEN GOTO 100 ELSE GOTO 120
100 IF M_04# = 0 AND C_02$ <> "" THEN M_01# = 1
110 M_04# = M_04# + 1
120 LAENGE% = LEN (C_01$)
130 IF LAENGE% = 18 AND M_01# = 0 THEN GOTO 140 ELSE GOTO 50
140 C_02$ = C_01$
150 M_02# = 1
160 GOTO 50
Zeile 60: Wenn LabVIEW das Datenwort "STA" sendet, dann fangen die anderen Unterprogramm auf dem Robbi an zu laufen.
Zeile 90: Solange der Roboter die Abarbeitung fortsetzten soll, muss er von LabVIEW das Datenwort "ARB" empfangen. Empfängt der Robbi "ARB" zum ersten Mal, wird im Programm "SICH" die "Zeitmessung" aktiviert. Der Zähler M_04 wird inkrementiert, dazu später mehr.
Zeile 120: Wird weder "STA" noch "ARB" empfangen, dann müssten es Parameter für den Robbi sein. Diese haben von LabVIEW immer die Datenlänge 18.
Zeile 130: Ist die Länge wirklich 18, dann werden die Daten umkopiert und im Programm "SSER" zur Absicherung an LaBVIEW zurückgeschickt.
Hier das Programm SSER.MB4:
10 ' SENDEN - SERVER
20 IF M_00# = 1 GOTO 30 ELSE GOTO 20
30 OPEN "COM3:" AS #2
40 IF M_03# = 1 THEN C_00$ = "AKTIV" ELSE GOTO 70
50 M_02# = 0
60 GOTO 90
70 IF M_05# = 1 THEN C_00$ = "IDLEON" ELSE C_00$ = "IDLEOFF"
80 M_04# = 0
90 IF M_02# = 1 THEN PRINT #2, C_01$ ELSE GOTO 120
100 DLY 0.5
110 GOTO 40
120 PRINT #2, C_00$
130 DLY 0.5
140 GOTO 40
Zeile 20: Wird "ARB" empfangen, dann startet diese Programm.
Zeile 30: Solange der Robbi arbeitet, wird "AKTIV" gesendet.
Zeile 70: Wenn er nicht arbeitet, dann IDLEON wenn Servos an, sonst IDELOFF wenn Servos off. Der Status wird im Programm "HAUPT.MB4" ermittelt.
Zeile 90: Wenn die Datenlänge 18 war (M_02 = 1), dann werden diese Daten (C_01) gesendet. Wenn nicht, dann wird n
Zeile 120 "IDLEON", IDLEOFF" oder "AKTIV" gesendet.
Hier das Programm SICH.MB4:
10 'Programm zur Überwachung des Empgangs
20 DEF INTE ZV
30 IF M_04# > 0 AND M_03# = 1 THEN GOTO 40 ELSE GOTO 30
40 ZV% = M_04#
50 DLY 1.0
60 IF ZV% = M_04# THEN GOTO 80
70 GOTO 20
80 SERVO OFF
Zeile 30: Wenn "ARB" empfangen wurde, dann wird der aktuelle Wert von M_04 in ZV gespeichert (Zeile 40).
Zeile 60: Nach einer Pause von einer Sekunde wird verglichen, ob in der Zwischenzeit ein weiteres Mal "ARB" empfangen wurde, ob M_04 sich in der Zwischenzeit geändert hat. Wenn ja, dann ist alles OK und es erfolgt ein Rücksprung. Wenn nein, denn erfolgt ein Sprung in Zeile 80.
Zeile 80: Dieser Befehl ist hier falsch und führt beim Robbi zu einer Fehlermeldung. Dann wird der Programmablauf gestoppt. Hat jemand an dieser Stelle eine bessere Idee?
Hier das Programm HAUPT.MB4:
10 ' STEUERUNG ROBOTER
20 GETM 1
30 DEF INTE SCHRITT, GESCHW, BESCHLB, BESCHLA
40 IF M_00# = 1 GOTO 100 ELSE GOTO 40
100 M_03# = 0
110 SCHRITT% = 0
120 GESCHW% = 0
130 BESCHLB% = 0
140 BESCHLA% = 0
200 IF M_01# = 1 THEN GOTO 230
210 M_05# = M_SVO(1)
220 GOTO 200
230 M_01# = 0
240 M_03# = 1
250 SCHRITT% = VAL(MID$(C_02$,2,3))
260 GESCHW% = VAL(MID$(C_02$,6,3))
270 BESCHLB% = VAL(MID$(C_02$,11,3))
280 BESCHLA% = VAL(MID$(C_02$,16,3))
290 C_02$ = ""
400 IF SCHRITT% = 0 THEN GOTO 100
410 IF SCHRITT% = 1 THEN GOTO 1000
420 IF SCHRITT% = 2 THEN GOTO 2000
999 '*************************
1000 'Schritt 1
1010 OVRD GESCHW%
1020 ACCEL BESCHLB%,BESCHLA%
1030 CNT 0
1040 MOV P1
1045 MOV P2
1050 GOTO 100
1999 '*************************
2000 'Schritt 2
2010 OVRD GESCHW%
2020 ACCEL BESCHLB%,BESCHLA%
2030 CNT 0
2040 MOV P1
2042 MOV P2
2043 MOV P3
2050 GOTO 100
2999 '*************************
Zeile 40: Wenn "STA" empfangen wurde, dann startet diese Programm.
Zeile 200: LabVIEW sendet ARB, dann geht M_01 auf 1, die Abarbeitung eines Schrittes kann beginnen!
Ab Zeile 250: Das 18-stellige Datenwort wird in die Bestandteile Schritt, Geschwindigkeit, Beschleunigungen aufgeteilt.
Ab Zeile 400: Der abzuarbeitende Schritt wird überprüft und dann entsprechend gesprungen.
Zeile 1050 oder 2050: Nach der Abarbeitung gehts zurück zum Start zur Zeile 200 (vorher werden noch Variablen zurückgesetzt ab Zeile 100).
Die Programmierung in LabVIEW ist so, dass bei Timout - Verletzungen die Verbindungen zu Port 10002 (COM2) und zu Port 10003 (COM3) neu aufgebaut werden. LabVIEW sendet Daten im 300ms Takt, so können fehlerhafte Nachrichten kompensiert werden. Der Robbi sendet immer Daten (IDELON, IDLEOFF, AKTIV oder das Datenwort der Form S001G010B+100B-100 (Schritt 1, Geschwindigkeit 10, Beschleunigung Losfahren 100, Beschleunigung Abbremsen 100). Der PC sendet nur, wenn Aktionen anstehen oder weiterlaufen sollen.
Falls wirklich jemand die Lust hat, sich in mein Modell einzudenken, über Kommentare, Tipps, ... würde ich mich sehr freuen.
Falls etwas unklar ist, bitte nachfragen.
Viele Grüße, Dank an Urmel für die Mithilfe und ein schönes Wochenende!
Vogster