RS232-Schnittstellenprogrammierung mit CoDeSys

Conrad
2010-05-06
2010-05-14
  • Conrad - 2010-05-06

    Hi,

    Möchte mich gerne einmal bedanken. Das Forum hat mir bereits sehr oft weitergeholfen.

    Ich hätte 2 Fragen.

    Ich soll auf einem Festo-Controller eine RS232-Schnittstelle programmieren zwischen Controller und Peripheriegerät. Ich habe ein Beispiel-Programm erhalten, dass aber leider keine Übertragung liefert. Da ich Programmieranfänger bin, kann ich leider mit dem Quelltext nichts anfangen.

    Ich möchte Sie gerne fragen, ob eine Anleitung zur Erstellung eines RS232-Schnittstellen-Quelltextes bzw. eine Beschreibung der Bibliotheksfunktionen existiert.

    2.

    Ausserdem suche ich eine Anleitung, wie man eine TCP/IP(nicht UDP)-Schnittstelle zwischen 2 Controllern auf aufbaut.

    Vielen Dank!!

    Gruß

    Conrad

     
  • Schuero - 2010-05-12

    Hallo.

    Zu 1. Kannst du den Quelltext mal posten?

    Hast du schon mal die Verdrahtung kontrolliert? (RxD, TxD, GND richtig angeklemmt evtl. muß mann RxD & TxD Leitungen tauschen ? (Thema: Nullmodemkabel?)

    Zu 2. Frag mal den Hersteller, was die sich zu diesem Thema denken. Wago SPS'n z.B. kommunizieren über eine Modbus Kommunikation miteinander.

     
  • raadya - 2010-05-13

    hallo,

    Default ist ein COM-Stecker für Kommunikation zwischen PLC und CoDeSys-Editor verwendet.

    Wenn auf deiner PLC mehr COM-Stecker hast, kannst du andere versuchen. Falls du nur einen hast, du musst den COM-port in der Konfiguration freigeben.

    Beispiel mit SIO Kommunikation:

    VAR
      handle : DINT;
      comSet : COMSETTINGS;
      str_read, str_write : STRING;
    END_VAR
    str_write := 'diese Daten werden geschrieben';
    (* port öffnen und Handle für weitere Arbeit bekommen: *)
    handle := SysComOpen(COM1);
    (* einstellungen für SIO Kommunikaiton *)
    comSet.byParity := 0;
    comSet.byStopBits := 0;
    comSet.dwBaudRate := 57600;
    (* Parametern für port einstellen: *)
    SysComSetSettings(handle, comSet);
    (* Daten schreiben: *)
    SysComWrite(handle, ADR(str_write), LEN(str_write), 1000);  (* 1000 = 1s timeout *)
    (* Daten in die Variable "str_read" lesen: *)
    SysComRead(handle, ADR(str_read), 80, 1000);
    (* Port schliessen: *)
    SysComClose(handle);
    
     
  • Conrad - 2010-05-14

    Hi, da ich nicht nur komplett neu im Bereich CoDeSys, sondern auch in diesem Forum bin, weiss ich nicht, ob das, was ich hier gerade schreibe, ein Beitrag zu diesem Thread, oder eine Private Message wird.. Also meine aufgabe ist es, Daten einer Waage via rs232 auf mein PLC einzulesen und zu Verarbeiten..Schreiben muss ich nicht.. Verwendet wird ein FESTO Controller CPX-CEC-RS232, .. Die Verdrahtung ist soweit korrekt, da andere Systeme..(zB. Beckhoff EL6001) mit der Verdrahtung Daten empfangen.

    der Quelltext, den ich erhalten habe, ist:

    (*
    Die Protokolldaten der Schnittstelle lauten:
    Baudrate : 9600
    1 Stopbit
    Parity EVEN
    7 Datenbits
    kein handshake
    *)
    VAR
    port:DWORD;
    ComPortSettings : comsettings(ex):=(Port:=COM2,dwBaudRate:=9600,byStopBits:=0,byParity:=2,dwTimeout=0,dwBufferSize:=0,dwScan:=0,cbytesize:=7
    );
    status:      INT;
    i:                       INT;
    writeString   :   STRING   ;
    writeLength:   INT   ;
    readString   :   STRING;
    readLength:   DWORD;
    readFragment   :   STRING;
    p_readFragment:   POINTER TO ARRAY[0..81] OF BYTE;
    p_readString   :   POINTER TO ARRAY[1..80] OF BYTE;
    timeout:            DWORD:=0;
    maxReadSize:            DWORD;
    END_VAR
    CASE status OF
    0:    (*init state*)
        maxReadSize := SIZEOF(readFragment);
        p_readFragment:=ADR(readFragment);
        p_readString:=ADR(readString);
        status:=status+10;
    10:    (*open COM*)
        port := SysComOpen( comSettings.Port );
        IF ( port <> 16#FFFFFFFF ) AND ( port <> 0 ) THEN
            SysComSetSettings( port, ADR( comSettings ) );
            status:=status+10;
        ELSE
            status:=100;
        END_IF
    20:    (*read from port until CR or LF appears*)
        readLength := SysComRead( port, p_readFragment, maxReadSize, timeout );
        IF readLength > 0 THEN
            (*set string delimiter (0)*)
            p_readFragment^[readLength]:=0;
            readString:=CONCAT(readString,readFragment);
            readLength:=0;
        END_IF
        (*search for a command delimiter (LF or CR)*)
        FOR i:=0 TO LEN(readString) DO
            IF p_readString^[i]=10 OR p_readString^[i]=13 THEN
                (*write a string delimiter*)
                p_readString^[i]:=0;
                status:=status+10;
                EXIT;
            END_IF
        END_FOR
    30:    (*write an answer*)
        IF readstring = 'exit' THEN
            SysComClose( port );
            status:=100;
        ELSE
    (*
            writeString:=CONCAT('The PLC recived the string: ',readString);
            writeString:=CONCAT(writeString, '$R');
            writeLength:=LEN(writeString);
            SysComWrite( port, ADR( writeString), writeLength, timeout );
            readString:='';
    *) 
           status:=20;
        END_IF
    100: (*error status*)
        ;
    END_CASE
    
     

Log in to post a comment.