ich möchte über die RS 232 Schnittstelle versch. Strings an einen Thermostaten senden bzw. die entsprechenden Antworten empfangen. Zusätzlich muss ich die empfangenen Strings in Real-Variablen konvertieren um diese in bspw. IF-Funktionen einzubinden.
Da ich weiss, was ich senden muss damit es der Thermostat auch versteht und was er mir genau zurückschickt, habe ich versch. Tests mit dem HyperTerminal durchgeführt.
Ich habe nun das Problem, dass wenn ich den Thermostaten mit Hilfe des HyperTerminals über die Tastatur simuliere, mir das Programm nach der ersten eingegebenen Ziffer schon komplett durchlaufen wird. Dies Obwohl ich bei Schritt 8 eine Bedingung programmiert habe, bei der der Wert 'rAntwortReal' grösser als 030.00 sein muss (Die Antwort erfolgt immer im Format XXX.XX).
Die empfangenen Zahlen können in den globalen Variablen unter ReceiveBuffer.Data angeschaut werden.
Hat jemand eine Idee wo mein Fehler liegen könnte?
Ich hab den betreffenden Ausschnitt aus dem Programm beigelegt.
Vielen Dank!
isom
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Der Fehler liegt im CASE 6.
ReceiveBuffer2.Index beinhaltet die Anzahl der empfangenen Zeichen.
Bei einer seriellen Übertragung trudeln die Zeichen nacheinander ein.
Der Empfangsbaustein schaut zwischendurch bei der Schnittstelle vorbei,
holt die inzwischen eingtrudelten Zeichen ab, trägt sie im ReceiveBuffer ein und
erhöht entsprechend den Index.
Wenn du also z.B. 'Hallo Welt' schickst,
dann steht im ReceiveBuffer nach dem ersten Aufruf z.B.
'Ha' und der Index steht auf 2
nach dem 2. Aufruf z.B.
'Hallo' und der Index steht auf 5 u.s.w.
Der Empfangsbaustein weiss ja nicht was und wieviel du ihm schickst,
es ist ja keine Schleife um dein Paket.
Du musst also in deiner Applikation nachschauen ob du hinreichend
Zeichen erhalten hast und ob diese deiner geforderten Syntax entsprechen.
Zurück zum CASE 6
Wenn du in der FOR-Schleife 10 Zeichen erwartest (0..9) dann
musst du in der Abfrage davor erst gucken ob du überhaupt
schon mindestens 10 Zeichen empfangen hast.
Also IF ReceiveBuffer2.Index >= 10 THEN
Weiterhin würde ich zumindest einen Timeout darüber legen ...
damit neu synchronisiert wird falls die Übertragung mal schief läuft
und ein Zeichen verloren geht.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hallo zusammen,
ich möchte über die RS 232 Schnittstelle versch. Strings an einen Thermostaten senden bzw. die entsprechenden Antworten empfangen. Zusätzlich muss ich die empfangenen Strings in Real-Variablen konvertieren um diese in bspw. IF-Funktionen einzubinden.
Da ich weiss, was ich senden muss damit es der Thermostat auch versteht und was er mir genau zurückschickt, habe ich versch. Tests mit dem HyperTerminal durchgeführt.
Ich habe nun das Problem, dass wenn ich den Thermostaten mit Hilfe des HyperTerminals über die Tastatur simuliere, mir das Programm nach der ersten eingegebenen Ziffer schon komplett durchlaufen wird. Dies Obwohl ich bei Schritt 8 eine Bedingung programmiert habe, bei der der Wert 'rAntwortReal' grösser als 030.00 sein muss (Die Antwort erfolgt immer im Format XXX.XX).
Die empfangenen Zahlen können in den globalen Variablen unter ReceiveBuffer.Data angeschaut werden.
Hat jemand eine Idee wo mein Fehler liegen könnte?
Ich hab den betreffenden Ausschnitt aus dem Programm beigelegt.
Vielen Dank!
isom
ich glaube, Du hast das REAL Format nicht verstanden, zumindest sieht das bei der Abfrage unter Case 8 so aus.
Der Fehler liegt im CASE 6.
ReceiveBuffer2.Index beinhaltet die Anzahl der empfangenen Zeichen.
Bei einer seriellen Übertragung trudeln die Zeichen nacheinander ein.
Der Empfangsbaustein schaut zwischendurch bei der Schnittstelle vorbei,
holt die inzwischen eingtrudelten Zeichen ab, trägt sie im ReceiveBuffer ein und
erhöht entsprechend den Index.
Wenn du also z.B. 'Hallo Welt' schickst,
dann steht im ReceiveBuffer nach dem ersten Aufruf z.B.
'Ha' und der Index steht auf 2
nach dem 2. Aufruf z.B.
'Hallo' und der Index steht auf 5 u.s.w.
Der Empfangsbaustein weiss ja nicht was und wieviel du ihm schickst,
es ist ja keine Schleife um dein Paket.
Du musst also in deiner Applikation nachschauen ob du hinreichend
Zeichen erhalten hast und ob diese deiner geforderten Syntax entsprechen.
Zurück zum CASE 6
Wenn du in der FOR-Schleife 10 Zeichen erwartest (0..9) dann
musst du in der Abfrage davor erst gucken ob du überhaupt
schon mindestens 10 Zeichen empfangen hast.
Also IF ReceiveBuffer2.Index >= 10 THEN
Weiterhin würde ich zumindest einen Timeout darüber legen ...
damit neu synchronisiert wird falls die Übertragung mal schief läuft
und ein Zeichen verloren geht.
Moin
Und wo wir grade dabei sind, woztu eigentlich REAL ???
Vergleiche doch: IF sAntwort = '030.00$R$L' then
....
Gruß Erik
Hallo miteinander
Danke für eure Antworten!
Werde die erwähnten Sachen versuchen und mich hier im Forum melden, sobald das Problem gelöst wurde.
Grüsse
isom