Mein Problem ist nun: Es müssten bei jeder Antwort ein STRING 15 Bytes empfangen und ausgewertet werden. Beim 1. Durchlauf klappt dies auch wunderbar, nur ab dem zweiten Durchlauf werden immer nur 8 Bytes empfangen.
Mir ist schon klar, dass "dwBytesGelesen_COM1 >= 15" stehen müsste, aber dann wird das Empfangen quasi nie beendet.
Kann mir jemand weiterhelfen?
Gruß, Dom
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Die Funktion SYSCOMREAD gibt ja als Rückgabewert dwBytesGelesen_COM1 die Anzahl der gelesenen Bytes an. Laut diesem Wert bekomme ich maximal 8 Bytes eingelesen. Ich kann über ein Programm zum Testen quasi jede erdenkliche Anzahl an Bytes schicken. Alles unter 8 Bytes wird korrekt empfangen. Sobald ich mehr als 8 Bytes sende, werden die ersten 8 Empfangen und es stehen 8 gelesene Bytes im Rückgabewert.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
strEingabeString ist wie der Name schon sagt als String deklariert ohne feste Größenangabe. Ich hatte es aber auch schon mit einem Byte-Array probiert - mit dem gleichen Erfolg
Ich denke fast, dass es an dem Empfangsbuffer liegt.
"FIFO mit Puffererweiterung" - Ehrlich gesagt, verstehe ich nicht was damit gemeint ist?!
Ich mach mich diesbezüglich aber mal bei MI kundig.
Gruß, Dom
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Also ich hab jetzt was gemacht und es funktioniert - zumindest momentan...
Vielleicht bekomme ich es hier auch gleich wieder ausgeredet...
Ausgegangen davon, dass ich nur einen 8 Byte Empfangsbuffer habe, rufe ich die SysComRead einfach nochmal auf, nachdem Sie bereits 8 Bytes empfangen hat. Die Daten schreibe ich in zwei verschiedene Arrays, die ich anschließend auswerten kann:
Hallo,
ich habe ein Problem bei der seriellen Kommunikation. Ich verwende ein Micro Innovation / Moeller / Eaton XV400 Panel mit integr. SPS.
Muss gestehen, dass ich noch nicht lange mit CoDeSys arbeite und schon gar nicht was Kommunikation angeht.
Nun habe ich den unten angezeigten Code benutzt, der in abgewandelter Form hier auch bekannt sein müsste.
Mein Problem ist nun: Es müssten bei jeder Antwort ein STRING 15 Bytes empfangen und ausgewertet werden. Beim 1. Durchlauf klappt dies auch wunderbar, nur ab dem zweiten Durchlauf werden immer nur 8 Bytes empfangen.
Mir ist schon klar, dass "dwBytesGelesen_COM1 >= 15" stehen müsste, aber dann wird das Empfangen quasi nie beendet.
Kann mir jemand weiterhelfen?
Gruß, Dom
Hi
Kann es sein, dass du die ersten 7 Bytes mit den nächsten 8 Bytes überschreibst ?
Also
1.Zyklus 7 Bytes gelesen.
2.Zyklus 8 Bytes gelesen (und somit die ersten 7 überschrieben)
Die CPU wartet nicht mit der "Anzeige".
Ich würde abfragen ob empfangene Bytes > 0 und gleich der Anzahl empfangenen Bytes beim letzten Programmzyklus.
Hallo,
das ist es beides leider nicht.
Die Funktion SYSCOMREAD gibt ja als Rückgabewert dwBytesGelesen_COM1 die Anzahl der gelesenen Bytes an. Laut diesem Wert bekomme ich maximal 8 Bytes eingelesen. Ich kann über ein Programm zum Testen quasi jede erdenkliche Anzahl an Bytes schicken. Alles unter 8 Bytes wird korrekt empfangen. Sobald ich mehr als 8 Bytes sende, werden die ersten 8 Empfangen und es stehen 8 gelesene Bytes im Rückgabewert.
Hi
Mach doch mal folgenden Test:
Sende mal 0,1,2,3,4,5,6,7,8,9
Nun frage ab, wieviele Zeichen du im Puffer hast.
Dann lese den Puffer aus.
Wieviel und welche Zeichen kannst du nun auslesen ?
Hi,
das mache ich schon die ganze Zeit....
Ergebnis:
Buffer: 8 Zeichen
Inhalt: 0,1,2,3,4,5,6,7
[???]
Dom
Hi
O.k.
Dann hast du einen Empfangspuffer mit 8 Zeichen.
Holst du die empfangenen Zeichen nicht rechtzeitigt ab, gehen alle Zeichen verloren.
Also:
Schau doch mal, ob der Herstellen einen FIFO mit Puffererweiterung hat.
Falls ja, installiere ihn.
Oder
Schreibe dir eine eigenständige Task, die abfrägt, ob Zeichen im Empfangspuffer sind und diese in einen grösseren Puffer umkopiert.
Diesen neuen Puffer frägst du dann ab.
Die Abtastrate der Task berechne dir Aufgrund der Baudrate und den 8 Zeichen, die in den Empfangspuffer passen.
Hi
Wie gross ist "strEingabeString1".
Zeig doch mal die Zuweisung.
Hallo,
danke für die schnellen (& vielen) Antworten!!!
strEingabeString ist wie der Name schon sagt als String deklariert ohne feste Größenangabe. Ich hatte es aber auch schon mit einem Byte-Array probiert - mit dem gleichen Erfolg
Ich denke fast, dass es an dem Empfangsbuffer liegt.
"FIFO mit Puffererweiterung" - Ehrlich gesagt, verstehe ich nicht was damit gemeint ist?!
Ich mach mich diesbezüglich aber mal bei MI kundig.
Gruß, Dom
Also ich hab jetzt was gemacht und es funktioniert - zumindest momentan...
Vielleicht bekomme ich es hier auch gleich wieder ausgeredet...
Ausgegangen davon, dass ich nur einen 8 Byte Empfangsbuffer habe, rufe ich die SysComRead einfach nochmal auf, nachdem Sie bereits 8 Bytes empfangen hat. Die Daten schreibe ich in zwei verschiedene Arrays, die ich anschließend auswerten kann:
Ich werd mich aber trotzdem nochmal beim Hersteller erkundigen, ob es da nix besseres gibt....
Dom
Hi
Das kann funktionieren.
Jedoch wenn du in der Zykluszeit 9 Zeichen empfängst kann bereits 1 Zeichen verloren gehen.
Sinnvoller wäre es, bereits bei 1 oder 2 Zeichen umzuspeichern.
Damit verlierst du keine empfangenen Zeichen.
Zur Info:
FIFO --> First In First Out.