PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Daten vom COM-Port auslesen


deloris
2007-06-14, 11:01:57
Hallo zusammen!
Für ein Projekt muss ich u.a. ein NC-Programm schreiben. Ich komme aber im Moment nicht weiter, hab schon alles versucht. Nun zum Problem:

Meine Aufgabe ist es, einen Sensor, der Daten liefert, mit einer Laser-Werkzeugmaschine zu verbinden. Die Daten des Sensors sollen dann zur Steuerung der Maschine verwendet werden.
Der Sensor wird über USB mit dem PC der Werkzeugmaschine verbunden, ein Treiber macht aus dem USB-Port einen COM-Port. Der Sensor schickt permanent die Messdaten mit 4 kHz. Jeder Messwert besteht aus 5 ASCII-Zeichen, nach jedem Messwert kommt ein CR LF (=Zeilenumsprung). Dass der Sensor die Daten sendet und wie sie aussehen, hab ich mit der COM-Port-Betrachtungssoftware Hyperterminal ausprobiert (siehe Anhang). Aus Hyperterminal kann man auch die Daten des Ports ablesen, in der Statusleiste des Bilds.

Jetzt zum Programm:
Laut Dokumentation ist die Programmiersprache G- Code mit zusätzlichen Befehlen, die an die Sprache C angelehnt sind. Die Steuerung ist von der Firma Aerotech. Das Programm sieht folgendermaßen aus:

1 DVAR $hFile ; Deklaration der Variablen
2 DVAR $var1
3 DVAR $anzahl


4 $hFile = FILEOPEN "COM7", 2 ; COM-Port 7 öffnen
5 TaskWarning = ErrCode ; Fehlermeldung anzeigen
6 COMMINIT $hFile, "baud=921600 parity=N data=8 stop=1"; Daten des Ports
7 TaskWarning = ErrCode
8 COMMSETTIMEOUT $hFile, -1, 0, 0 ; Wartezeit vor dem nächsten Schritt
9 TaskWarning = ErrCode
10 RPT 10 ; 10-fache Schleife
11 $anzahl = FILEREAD $hFile 2 $var1 ; Daten auslesen
12 TaskWarning = ErrCode
13 MSGDISPLAY 1, $var1 ; Daten anzeigen am Bildschirm
14 ENDRPT ; Schleifenende
15 FILECLOSE $hFile ; Verbindung zum Port beenden


Zu bestimmten Befehlen:

4 Die Portnummer 7 hab ich aus Hyperterminal ausgelesen, die 2 dahinter ist da, um einen Port zu signalisieren.

6 Die Daten des Ports hab ich aus Hyperterminal abgelesen, stehen auch so im Handbuch des Sensors.

8 Der Befehl bedeutet, dass ich sofort mit dem Auslesen beginne, ich habe auch verschiedene Zeiten ausprobiert.

Bei der Ausführung im Step- Mode bekomme ich folgende Fehlermeldungen:

4 Zugriff verweigert

6,8,11 File Handle ungültig.
Wenn ich die Schleife aber vor Zeile 4 und das Schleifenende ganz ans Ende setzte, bekomme ich richtige Werte, aber nur mit 3 Hz. Bei so einem Programm würde ich dann immer wieder die Verbindung aufbauen, einen Wert auslesen, die Verbindung abbrechen usw.


Falls noch Infos fehlen oder Fragen sind, weil ich was unklar beschrieben habe, gebt Bescheid. Das hier ist ein natürlich keine übliche Programmiersprache, aber vielleicht hat jemand Hinweise, was man ausprobieren könnte.

Mfg
deloris

Xmas
2007-06-14, 14:28:47
Ist HyperTerminal geschlossen während dein Programm läuft? Liest FILEREAD immer nur eine Zeile vom Port? Bist du dir sicher dass bei der großen Schleife die Werte korrekt sind und du keine Fehler bekommst?

Versuche die Schleife auf weniger Befehle zu reduzieren um herauszufinden welcher so lange braucht.

deloris
2007-06-15, 16:34:35
Hyperterminal ist geschlossen, wenn das Programm läuft, sonst kommt eine Fehlermeldung in Hyperterminal, dass der Port schon von jemand anderes benutzt wird.

Fileread liest nur eine Zeile, dazu steht in der Dokumentation:
"The FILEREAD command will read in one CR/LF terminated line"

Die Werte aus der großen Schleife sind korrekt, hab ich überprüft. Es kommt aber bei einer Schleife mit 10 Wiederholungen ein oder selten kein oder selten zwei mal zu einem falschen Wert. In Hyperterminal bekomme ich aber nur korrekte Werte.

Die große Schleife hab ich mal versucht, auf weniger Befehle zu reduzieren. Es funktioniert auch, wenn man die Zeile 8 & 9 und die Zeile 6 & 7 entfernt. Damit geht das Programm schneller mit ca. 4 Hz, aber die Messwerte sind tendenziel öfter falsch, was aber auch schwankt. Das gekürzte Programm mit großer Schleife sieht dann folgendermaßen aus, mehr kann ich ja nicht streichen (die Entfernung der zwei übrigen Taskwarnings bringt keine Temposteigerung):

1 DVAR $hFile
2 DVAR $var1
3 DVAR $anzahl

4 RPT 10
5 $hFile = FILEOPEN "COM7", 2
6 TaskWarning = ErrCode
7 $anzahl = FILEREAD $hFile 2 $var1
8 TaskWarning = ErrCode
9 MSGDISPLAY 1, $var1
10 FILECLOSE $hFile
11 ENDRPT

Bei kleiner Schleife, also
1 DVAR $hFile
2 DVAR $var1
3 DVAR $anzahl
4 $hFile = FILEOPEN "COM7", 2
5 TaskWarning = ErrCode
6 RPT 10
7 $anzahl = FILEREAD $hFile 2 $var1
8 TaskWarning = ErrCode
9 MSGDISPLAY 1, $var1
10 ENDRPT
11 FILECLOSE $hFile

ändert das nix daran, dass die Fehlermeldungen ("Der E/A-Vorgang wurde wegen eines Threadendes oder einer Anwendungsaufforderung abgebrochen") kommen. Die ausgegebenen Zahlen sind immer ungefähr gleich, also beispielsweise 21219, 21217... Der Computer versucht es halt solange, bis er die 10 Werte gemäß der Länge der Schleife abgeholt hat (RPT 10). Wenn man am Sensor, der einen Abstand misst, nix ändert, dann stimmt der Wert sogar.

Falls jemand die Dokumentation zur Lösung braucht, kann ich die gegebenenfalls zur Vefügung stellen.