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

Ansprechen der seriellen Schnittstelle

buschi
2014-08-05
2014-08-12
  • buschi - 2014-08-05

    Guten Morgen,

    ich versuche mit CoDeSys die serielle Schnittstelle eines IPCs anzusprechen. Funktionieren tut das leider nicht wirklich. Genauer gesagt kann ich noch nicht mal sagen, was nicht funktioniert, also ob nicht gesendet oder nicht empfangen wird (ist auch am Gerät nicht sichtbar ob irgendwas passiert). Ich spreche ein Steuerungsmodul für verschiedenere Temperaturmessgehänge an. Testweise hab ich auch mal ein .Net Programm geschrieben, bei diesem bekomme ich auch eine Antwort. Vielleicht hat irgendwer von euch Tipps, was ggf. falsch sein kann?

    Parameter im .Net Programm waren mit der Baudrate 9600, 8 Datenbits, 1 Stopbit, kein Paritätsbit eingestellt.
    Als Befehl wird der String "57 65 6E 6E 65 47 0001 00 00 00 05 00 00 00 00" (ja, in der Mitte die 0001 ist so richtig) gefolgt von einem LF (Char Zeichen 10) abgesetzt.

    Zum Senden hab ich folgenden Code geschrieben:
    PROGRAM PLC_PRG
    VAR
    ComSettings : COMSETTINGS;
    _ : _;
    bInit : BOOL := TRUE;
    bWrite : BOOL := TRUE;
    End_init: BOOL;
    port : PORTS:=COM1;
    nWrite : DWORD;
    WriteBuffer : STRING;
    END_VAR

    IF bInit THEN
    ghCOM:=SysComOpen(Port:=port);
    ComSettings.dwBaudRate := 9600;
    ComSettings.byStopBits := 1;
    ComSettings.byParity := 0;
    ComSettings.Port := port;
    ( Einstellung für Data Bits? )
    ( SysComSetSettings(hCOM, ADR(ComSettings)); )

    (* Testweise mit _ *)
    _.dwBaudRate := 9600;
    _.byStopBits := 1;
    _.byParity := 0;
    _.Port := port;
    _.cByteSize := 8;
    _.fOutxCtsFlow := FALSE;
    _.fDtrControl := 0;
    _.fDsrSensitivity := FALSE;
    _.fRtsControl := 0;
    _.fOutxDsrFlow := FALSE;
    
    _(ghCOM, ADR(_));
    bInit := FALSE;
    

    END_IF

    IF bWrite AND ghCOM > 0 THEN
    WriteBuffer:= CONCAT('57 65 6E 6E 65 47 0001 00 00 00 05 00 00 00 00', '$L'); ( $L=Zeilenvorschub $N=Neue Zeile $R=Zeilenumbruch )
    nWrite := SysComWrite(dwHandle:=ghCOM, dwBufferAddress:=ADR(WriteBuffer),
    dwBytesToWrite:=LEN(WriteBuffer), dwTimeOut:=0);
    ( nWrite ist danach größer 0 )
    bWrite:=FALSE;
    END_IF

    Zum Lesen habe ich mittlerweile ein eigenes Programm erstellt:

    IF ghCOM > 0 THEN
    nRead := SysComRead(dwHandle:=ghCOM, dwBufferAddress:=ADR(ReadBuffer), dwBytesToRead:=100, dwTimeout:=1000);
    IF nRead > 0 THEN
    gsRead := ReadBuffer;
    END_IF
    END_IF

    ghCOM = global Double
    gsRead = global String

     
  • buschi - 2014-08-05

    Hab gesehen, dass der Code etwas verändert wurde.

    ComSettings : COMSETTINGS;
    : ;
    = ComSettings Ex : COMSETTINGS EX

    (ghCOM, ADR()); =
    SysComSetSettings Ex(ghCOM, ADR(ComSettings Ex));

     
  • Erik Böhm - 2014-08-07

    Moin

    Bei mir sieht das so aus:

    p_Comsettings.Port := iPort;
    p_Comsettings.dwBaudRate := dwBaudrate;
    (p_Comsettings.cByteSize := cByteSize; )
    p_Comsettings.byParity := byParity;
    p_Comsettings.byStopBits := byStopBits;
    p_Comsettings.dwScan := 0;

    dwPortHandle := SysComOpen(p_Comsettings.Port);
    IF dwPortHandle <> 16#FFFFFFFF THEN
    bPortState := SysComSetSettings(dwPortHandle, ADR(p_Comsettings));

    (* COM erfolgreich geöffnet *)
    IF bPortState = TRUE THEN
        (* COM SetSettings erfolgreich beendet. *)
    

    Erst Port erfolgreich öffnen (das kann mehr als einen Zyklus dauern), dann PortSettings

    Gruß Erik

     
  • buschi - 2014-08-07

    Vielen Dank für die Info. Hab das jetzt mal entsprechend geändert. Also, der Handle ist positiv, Wert z.B. 7780.
    Aber bPortState bleibt auf False und wird durch SysComSetSettings nicht geändert, auch nicht, wenn das danach im Zyklus irgendwann aufgerufen wird.

    Muss ich vielleicht irgendwas in der Konfiguration ändern?
    Also ich habe hier einen kleinen Embedded PC, in dem zwei CAN Anschlüsse per PCI Karte eingebaut wurden. Zusätzlich sind noch zwei normale COM Anschlüsse vorhanden. Die Steuerung selbst läuft in der RTE.

     
  • Erik Böhm - 2014-08-07

    Moin

    Genau so läufts bei uns auf der RTE auch. Sowohl unter Windows als auch unter Linux.
    Bis von SysComSetSettings eine Rückgabe kommt, kanns aber auch mehrere Zyklen dauern.

    Gruß Erik

     
  • buschi - 2014-08-12

    Mhh. Mal schauen, wir haben jetzt nen Termin mit den Herstellern. Vielleicht können die uns nen Tipp geben.

     

Log in to post a comment.