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

WAGO 750-851 mit 750-653 RS485 SERIAL_INTERFACE Probleme

sha
2010-02-23
2023-09-15
  • sha - 2010-02-23

    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),

      cbBAUDRATE        := wBaudRate,
    
      cbsBYTESIZE       := bDataBits,
    
      cpPARITY          := bParity,
    
      csSTOPBITS        := STOPBITS_1,
    
      cfFLOW_CONTROL    := bFlowControl,
    
      utRECEIVE_BUFFER  := ReceiveBuffer,
    
      ptSEND_BUFFER     := ADR(SendString),
    
      xINIT             := xInitPort,
    
      xOPEN_COM_PORT    := xOpenPort,
    
      iBYTES_TO_SEND    := LEN(SendString)+1,
    
      xSTART_SEND       := M_SENDSTR);
    

    bERROR:=COM.bERROR;

    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) )

         FOR i:=0 TO 255 DO
    
            pReceiveStr^[i]:=16#00;  (*Empfangspuffer löschen*)
    
         END_FOR;
    
         FOR i:=0 TO ReceiveBuffer.Index-1 DO
    
            pReceiveStr^[i] :=  ReceiveBuffer.Data[ i ]; (*Ringpufferdaten in Empfangspuffer kopieren*)
    
         END_FOR;
    
         M_RECVSTR:=TRUE;
    
         ReceiveBuffer.Index:=0; (*Index des Ringpuffers zurücksetzen*)
    

    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

  • Oberchefe - 2010-02-23

    070<cr> und '070' ist ja wohl nicht das Gleiche.</cr>

    Ich würde da eher '#070$n' schreiben.

     
  • sha - 2010-02-24

    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

     

Log in to post a comment.