PLCWin_NT oder RTE und die COM1

Gerhard63
2008-03-03
2008-03-13
  • Gerhard63 - 2008-03-03

    Hallo zusammen,

    habe schon alle Beiträge über die Serielle Schnittstelle im Forum gelesen aber habe es noch nicht geschaft einen String bzw. aun Array of Byte über die Serielle Schnittstelle auszugeben.

    Wenn ich doch den entscheidenen Beitrag übersehen habe, bitte ich um Nachsicht und bitte um einen Link auf diesen Beitrag.

    Habe die PLCWin_NT bzw. RTE gestartet, (beide als Demo) und bekomme bei beiden Systemen das gleiche Fehlverhalten.

    Die COM kann geöffnet werden.

    Die Function SysComSettings meldet immer nur FALSE zurück,

    Die Function SysComWrite gibt als Rückgabewert immer eine 0 zurück,

      und schreibt keine Bytes auf die Serielle Schnittstelle.
    

    Die Function SysComClose meldet wieder TRUE, wenn die COM geschlossen wird.

    Was mache ich falsch, bzw. welche Einstellungen habe ich übersehen.

    Besten Dank im vorraus

    COM_CYCLE.ZIP [1.29 KiB]

     
  • Gerhard63 - 2008-03-04

    Hallo zusammen, Question Question

    hier nochmals den Source-code,

    Nochmals

    Besten Dank im vorraus

    (* @NESTEDCOMMENTS := 'Yes' *)
    (* @PATH := '\/04 COM\/10 COM' *)
    (* @SYMFILEFLAGS := '2048' *)
    PROGRAM COM_Cycle  (* ST *)
    VAR  (* COM_Cycle *)
        (* Variablen-definition */  /* Addr */  : Typ */ /* Wert */     /* Kommentar 12345678901234*)
        (* Variablen-definition */  /* Addr */  : Typ *//* Kommentar 123456789012345678901234567890*)
        (*123456789012345678901234*/                       Courier New9 *)
        xStart                      : BOOL      := FALSE;
        uiState                     : UINT;
        dwHandle                    : DWORD;
        pt_comsettings              : COMSETTINGS := (port := 1, dwBaudRate := 9600, byStopBits :=1, byParity :=0,
                                                    dwTimeout := 0, dwBufferSize := 8 ,dwScan := 0 );
        _            : _ :=(Port := COM1, dwBaudRate := 38400, byStopBits := 1, byParity := 2,
                                                        dwTimeout := 2000, dwBufferSize := 8, dwScan := 0, cByteSize := 8,
                                                        fOutxCtsFlow := FALSE, fOutxDsrFlow := TRUE,
                                                        fDtrControl := 2, fRtsControl := 2);
        abWriteBuffer               : ARRAY[0..6] OF BYTE := 50,1,0,3,0,0,54;
        dwWriteBytes                : DWORD := 7;
        abReadBuffer                : ARRAY[0..6] OF BYTE;
        dwReadBytes                 : DWORD := 7;
        xSysComSettings             : BOOL;
        uiErrorState                : UINT;
        dwSysComWrite               : DWORD;
        dwSysComRead                : DWORD;
        xSysComClose                : BOOL;
        tonNext                     : TON;
    END_VAR
    (* @END_DECLARATION := '0' *)
        (*  ## Erstellt: Gerhard63 / Vers. 1.00 / 03.03.08     Beschreibung
            ## Änderung: ______ / __________ / __.__.__     _______________
         *)
        (* Netzwerk Überschrift */                          /* Kommentar *)
        COM_INIT();
        (*//////////////////////////////////////////////////////////////////////// *)
        (* COM Settings vorbelegen *)
        gstCOM_Settings.Port := COM1;
        gstCOM_Settings.dwBaudRate := 38400;
        gstCOM_Settings.byStopBits := 1;
        gstCOM_Settings.byParity := 2;
        gstCOM_Settings.dwTimeout := 0;
        gstCOM_Settings.dwBufferSize := 8;
        gstCOM_Settings.dwScan := 0;
        (*//////////////////////////////////////////////////////////////////////// *)
        CASE uiState OF
        (*//////////////////////////////////////////////////////////////////////// *)
            0: (* Open COM1: *)
            IF( dwHandle = 0 ) AND xStart THEN
                dwHandle := SysComOpen(Port:=COM1);
                IF dwHandle > 0 THEN
                    uiState := uiState+1;
                ELSE
                    uiErrorState := uiState;
                    uiState := 99;
                END_IF;
            END_IF
        (*//////////////////////////////////////////////////////////////////////// *)
            1:  (* Parameter setzen *)
    (*      xSysComSettings := SysComSetSettings(  dwHandle := dwHandle,
                                                ComSettings := ADR(gstCOM_Settings)); *)
            _.Size := SIZEOF(_);
            xSysComSettings := _(dwHandle := dwHandle, _ := ADR(_));
            uiState := 11;
        (*//////////////////////////////////////////////////////////////////////// *)
            11: (* Write COM1 *)
        
            dwSysComWrite := SysComWrite(dwHandle := dwHandle,
                                    dwBufferAddress := ADR(abWriteBuffer),
                                    dwBytesToWrite := dwWriteBytes,
                                    dwTimeout := 0);
            uiState := 12;
        (*//////////////////////////////////////////////////////////////////////// *)
            12: (* Read COM1 *)
            dwSysComRead := SysComRead( dwHandle := dwHandle,
                                dwBufferAddress := ADR(abReadBuffer),
                                dwBytesToRead := dwReadBytes,
                                dwTimeout := 0);
            IF( xStart = TRUE )THEN
                uiState := 11;
            ELSE
                uiState := 30;
            END_IF;
        (*//////////////////////////////////////////////////////////////////////// *)
            30: (* Close COM1 *)
            xSysComClose := SysComClose(dwHandle := dwHandle);
            IF( xSysComClose = TRUE ) THEN
                dwHandle := 0;
                uiState := 99;
            END_IF
        END_CASE
        (*//////////////////////////////////////////////////////////////////////// *)
        tonNext(IN := uiState = 90,
                PT := t#500ms);
        IF( tonNext.Q )THEN
            uiState := 0;
        END_IF;
        (* Ende der Datei *)
    END_PROGRAM
    
     
  • Erik Böhm - 2008-03-04

    Mahlzeit

    1, Die Definitionen sind ja folgendermassen:

    Parity: 0 = NOPARITY, 1 = ODDPARITY, 2 = EVENPARITY

    StopBits: 0 = 1 STOPBIT, 1=1.5 STOPBITS, 2=2 STOPBITS

    1. Um einen Com Port zu öffnen:

    p_Comsettings.Port := COM1;

    p_Comsettings.dwBaudRate := 9600;

    p_Comsettings.byParity := 0;

    p_Comsettings.byStopBits := 0;

    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. *)
    
        iRetVal := 1;
    
        iCmd    := 0;
    
    ELSE
    
        (* Fehler: COM SetSettings fehlgeschlagen! *)
    
        iRetVal := -10;
    
        iCmd    := 0;
    
    END_IF
    

    ELSE

    (* Fehler: COM konnte nicht geöffnet werde *)
    
    iRetVal := -11;
    
    iCmd    := 0;
    

    END_IF

    Hoffe das hilft dir, ansonsten hätt ich auch ne Library, um z.B. einen Scanner anzusteuern, die auch den Empfang der Antwort übernimmt.

    Gruss Erik

     
  • gravieren - 2008-03-04

    Hi

    @Erik Böhm

    Zitat:
    Hoffe das hilft dir, ansonsten hätt ich auch ne Library, um z.B. einen Scanner anzusteuern, die auch den Empfang der Antwort übernimmt.
    Interesse

    Kannst du uns mal zukommen lassen.

    Danke

     
  • Gerhard63 - 2008-03-04

    Hallo zusammen,

    es hat geklappt.

    Habe wohl die Stoppbits falsch gesetzt gehabt.

    Jetzt habe ich nur noch einen Punkt zur Kopplung.

    Das gleiche Programm läuft auf der RTE fehlerfrei,

    auf der PLCWinNT kommt immer der Fehler 16#FFFFFFFF

    kann COM-Port nicht öffnen.

    Was mache ich bei der PLCWin_NT falsch.

    Die PLCWinNT währe zum Testen besser, da diese 2 Stunden fäuft und die RTE nur 1 Stunde oder sogar noch kürzer.

    Welche Unterschiede gibt es sonst noch zwischen den beiden Versionen. ???

    Nochmals Besten Dank im vorraus.

    (* @NESTEDCOMMENTS := 'Yes' *)
    (* @PATH := '\/04 COM\/10 COM' *)
    (* @SYMFILEFLAGS := '2048' *)
    PROGRAM COM_Cycle_Test_1  (* ST *)
    VAR  (* COM_Cycle_Test_1 *)
       (* Variablen-definition */   /* Addr */   : Typ */ /* Wert */      /* Kommentar 12345678901234*)
       (* Variablen-definition */   /* Addr */   : Typ *//* Kommentar 123456789012345678901234567890*)
       (*123456789012345678901234*/                       Courier New9 *)
       xTestPort               : BOOL;
       p_Comsettings            : COMSETTINGS;
       dwPortHandle            : DWORD;
       bPortState               : BOOL;
       iRetVal                  : INT;
       xSysComClose            : BOOL;
    END_VAR
    (* @END_DECLARATION := '0' *)
       (*   ## Erstellt: Gerhard63 / Vers. 1.00 / 03.12.07      Beschreibung
          ## Änderung: ______ / __________ / __.__.__      _______________
        *)
       (* Netzwerk Überschrift */                     /* Kommentar *)
       (*//////////////////////////////////////////////////////////////////////// *)
       (* COM Settings vorbelegen *)
       p_Comsettings.Port := 2;
       p_Comsettings.dwBaudRate := 38400;
       p_Comsettings.byParity := 2;
       p_Comsettings.byStopBits := 0;
       p_Comsettings.dwScan := 0;
       IF( xTestPort ) THEN
          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. *)
                iRetVal := 1;
             ELSE
                (* Fehler: COM SetSettings fehlgeschlagen! *)
                iRetVal := -10;
             END_IF
          ELSE
             (* Fehler: COM konnte nicht geöffnet werde *)
             iRetVal := -11;
          END_IF
          xSysComClose := SysComClose(dwHandle := dwPortHandle);
       END_IF;
       xTestPort := FALSE;
       xSysComClose := FALSE;
       (*//////////////////////////////////////////////////////////////////////// *)
       (* Ende der Datei *)
    END_PROGRAM
    
     
  • Gerhard63 - 2008-03-04

    Hi

    @Erik Böhm

    Interesse an der Lib für den Scanner besteht,

    Da ich meine Kopplung gerade Neu aufbaue, kann ich Informationen immer gebrauchen.

    Danke

     
  • Erik Böhm - 2008-03-06

    Dann will ich mal nicht so sein...

    Eine Doku hab ich leider keine, bin bei Rückfragen aber zur Auskunft bereit...

    AsysScannerLib.zip [4.68 KiB]

     
  • gravieren - 2008-03-06

    Cool Danke

     
  • Gerhard63 - 2008-03-13

    Besten Dank für die Vorlage,

    werde diese erst noch durcharbeiten müssen,

    bis weitere Fragen kommen.

    Bis dahin Danke nochmals

     

Log in to post a comment.