Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched.
Close
ich habe einen WAGO-Controller 750-841 mit einer RS485-Schnittstelle 750-653 003-000. An dieser RS485 Schnittstelle ist Solarstrahlungssensor angeschlossen, der mir Daten liefern soll.
Nach Aussage des Lieferanten muss ich den String #070<cr> schicken. So weit so gut. Dann soll ich eine Antwort erhalten: >LF>*077<cr>.</cr></cr>
Danach schicke ich den String, um die Daten zu bekommen. Der lautet #077<cr>.</cr>
Ich bekomme aber mit dem Baustein SERIAL_INTERFACE keine vernünftigen Daten in den Empfangsbuffer. Ich bekomme nur das wieder in den Empfangsbuffer was ich selbst geschickt habe.
Ich habe den Quellcode als Basis genommen, der hier im Forum bereits an anderer Stelle erwaähnt wurde.
IF pReceiveStr = 0 THEN (Empfangspuffer mit Adresse von Empfangsstring initialisieren)
pReceiveStr:=ADR(ReceiveString);
END_IF;
IF ReceiveBuffer.Index>0 THEN (Neue Daten empfangen)
IF ReceiveBuffer.Data[ ReceiveBuffer.Index-1 ] = 16#0A THEN (16#0A=LF(Linefeed) )
FORi:=0TO255DOpReceiveStr^[i]:=16#00; (*Empfangspuffer löschen*)END_FOR;FORi:=0TOReceiveBuffer.Index-1DOpReceiveStr^[i] :=ReceiveBuffer.Data[ i ]; (*Ringpufferdaten in Empfangspuffer kopieren*)END_FOR;M_RECVSTR:=TRUE;ReceiveBuffer.Index:=0; (*Index des Ringpuffers zurücksetzen*)
Das war der entscheidene Hinweis! Vielen, vielen Dank. Ich bekomme jetzt in meinem Empfangs-Buffer jede Menge Daten, die ich jetzt nur noch zu Messdaten im REAL-Format zusammenführen muss.
Viele Grüße
Arne
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hallo an Alle!
ich habe einen WAGO-Controller 750-841 mit einer RS485-Schnittstelle 750-653 003-000. An dieser RS485 Schnittstelle ist Solarstrahlungssensor angeschlossen, der mir Daten liefern soll.
Nach Aussage des Lieferanten muss ich den String #070<cr> schicken. So weit so gut. Dann soll ich eine Antwort erhalten: >LF>*077<cr>.</cr></cr>
Danach schicke ich den String, um die Daten zu bekommen. Der lautet #077<cr>.</cr>
Ich bekomme aber mit dem Baustein SERIAL_INTERFACE keine vernünftigen Daten in den Empfangsbuffer. Ich bekomme nur das wieder in den Empfangsbuffer was ich selbst geschickt habe.
Ich habe den Quellcode als Basis genommen, der hier im Forum bereits an anderer Stelle erwaähnt wurde.
PROGRAM RS485_SerialInterface
VAR
PT_SendStr : POINTER TO ARRAY[0..255] OF BYTE;
PT_TmpStr : POINTER TO ARRAY[0..255] OF BYTE;
SendString : STRING:='070';
M_RECVSTR : BOOL:=FALSE;
M_SENDSTR : BOOL:=TRUE;
( Communicationparams for 750-65x/003-000 only)
wBaudRate : WORD := 960;
bDataBits : BYTE := 8;
bParity : BYTE := 0; (0=NO)
bFlowControl : BYTE := 1; (1=XON/XOFF)
i : INT;
in_COM_Port : INT := INT#2;
( COM *******)
COM : SERIAL_INTERFACE;
xOpenPort : BOOL := TRUE;
xInitPort : BOOL;
xSendActive : BOOL;
ReceiveBuffer: typRing_Buffer;
ReceiveBufferOldIndex : INT;
ReceiveString : STRING(255);
pReceiveStr : POINTER TO ARRAY[0..255] OF BYTE;
bERROR : BYTE :=16#00;
Messwert01: REAL;
END_VAR
( Send and Receive for COM2 )
COM( bCOM_PORT_NR := INT_TO_BYTE(in_COM_Port),
bERROR:=COM.bERROR;
IF pReceiveStr = 0 THEN (Empfangspuffer mit Adresse von Empfangsstring initialisieren)
END_IF;
IF ReceiveBuffer.Index>0 THEN (Neue Daten empfangen)
IF ReceiveBuffer.Data[ ReceiveBuffer.Index-1 ] = 16#0A THEN (16#0A=LF(Linefeed) )
END_IF;
END_IF;
Messwert01 := (WORD_TO_REAL(WPACK(ReceiveBuffer.Data[0], ReceiveBuffer.Data[1])));
Hat einer eine Idee was ich eventuell verkehrt mache!
Related
Talk.ru: 1
070<cr> und '070' ist ja wohl nicht das Gleiche.</cr>
Ich würde da eher '#070$n' schreiben.
Das war der entscheidene Hinweis! Vielen, vielen Dank. Ich bekomme jetzt in meinem Empfangs-Buffer jede Menge Daten, die ich jetzt nur noch zu Messdaten im REAL-Format zusammenführen muss.
Viele Grüße
Arne