Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 4 von 4

Thema: RS 232 Schnittstelle auslesen

  1. #1
    Registriert seit
    23.03.2009
    Beiträge
    2
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo liebe Forenbenutzer,

    bin blutiger Anfänger und muss eine kleine Aufgabe lösen komm aber gerade auf keinen grünen Zweig.

    Benutze die Bechoff RS232-Schnittstelle EL6001. Diese lese ich bereits aus. Nun muss ich jedoch irgendwie die übermittelten Daten sortieren.
    Der String den ich empfange ist folgendermassen formatiert:

    XYZ={8Byte double 1};{8Byte double 2};{8Byte double 3};END<LF><CR>

    Ich bekomme also drei 64-Bit Fliesskommazahlen (nach IEEE 754) übermittelt.

    Wie kann ich diese Daten am einfachsten Filtern?

    Habe bereits ein ARRAY erstellt das immer die letzten vier übermittelten Zeichen enthält um den Stringanteil: 'XYZ=' zu erkennen weiter komm gerade nicht da mir der Syntax der SPS-Programmierung leider noch nicht klar ist.


    Würde mich über einpaar Programmschnippsel freuen die mit helfen könnten.



    MfG,


    Olli_fr
    Zitieren Zitieren RS 232 Schnittstelle auslesen  

  2. #2
    Registriert seit
    09.11.2007
    Ort
    Rhein Main (Darmstadt)
    Beiträge
    663
    Danke
    61
    Erhielt 112 Danke für 80 Beiträge

    Standard

    Schick doch mal das Programmchen, damit man verstehen kann, wo das Problem ist.

    Welche Sprache wird eigentlich verwendet? Ich hoffe, Du beginnst gleich mit ST, wenn Du anfängst CoDeSys zu lernen.

    MfG Herbert
    Als Freelancer immer auf der Suche nach interessanten Projekten.
    Zitieren Zitieren Zur Aufklärung ...  

  3. #3
    Olli_fr ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    23.03.2009
    Beiträge
    2
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hi,

    im Anhang das Programm. Hab es irgendwo gefunden und versuche es für meine Zwecke anzupassen. Leider funktioniert die Stringerkennung noch nicht zuverlässig.

    Versuche aus dem gesamten String der ständig geschickt wird

    XYZ={8Byte double 1};{8Byte double 2};{8Byte double 3};END<LF><CR>

    die Sequenz "<LF><CR>XYZ=" zu erkennen und anschliessend die drei Double-Zahlen auszulesen die in einem Byte-Array abgespeichert werden sollen. Würde die Zahl noch gerne lesbar, also nicht als Binärwert, anzeigen.

    Danke für die Hilfe.
    Angehängte Dateien Angehängte Dateien
    Geändert von Olli_fr (24.03.2009 um 12:50 Uhr)

  4. #4
    Registriert seit
    09.11.2007
    Ort
    Rhein Main (Darmstadt)
    Beiträge
    663
    Danke
    61
    Erhielt 112 Danke für 80 Beiträge

    Daumen hoch


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    prinzipiell kann ich natürlich ohne Hardware nicht überprüfen, ob das dann so klappt, aber hier einige Hinweise, ohne ganz zu Oberlehrer haft zu klingen:

    1. Variablen Namen sollten nicht aus einem Buchstaben bestehen, das erleichtert ein Review des Codes enorm für einen Fremden.
    Beispiel:
    i, j,k,l,m: INT; (* schlecht zu lesen und zu debuggen*)
    iIndex: INT := 0; (* hier weiss man auch später noch..*)


    2.Variablen sollten möglichst immer initialisiert werden, kost (fast) nix aber mysteriöse Fehler, "gestern gings aber" werden weniger ...

    Beispiel:
    iIndex: INT := 0; (* nix dem Zufall überlassen ...*)

    3. Fest eincodierte Zahlen vermeiden, die haben so etwas wie eine mythische Bedeutung, Codesys kennt Konstanten, die man sinnvoll benennen kann.

    Beispiel:

    VAR CONSTANT
    LF: INT := 10; (* Line Feed *)
    CR: INT := 13; (* Carriage return *)
    CX: INT := 88; (* Character X *)
    CY: INT := 89; (* Character Y *)
    CZ: INT := 90; (* Character Z *)
    CG: INT := 61; (* Character = *)
    END_VAR

    4. Kopieren von Variablen Buffern möglichst vermeiden, über den Buffer ein wanderndes Fenster legen und dann in einem auswerten. Hiermit kommt die "Lösung", wie ich die Wert(e hier nur den ersten) rausziehen möchte:

    Im Deklararionsteil ergänzen:

    pRealData: POINTER TO REAL := 0;
    rData :REAL := 0.0;
    END_VAR

    Im Programm: (bitte beachten, dass noch Array Grenzen sichergestellt werden müssen)

    IF ( iReceiveRequest<>oReceiveAccept) THEN
    iIndex:=0;
    WHILE ( iIndex < BytesIN) DO
    IF ((Auslesen = FALSE)
    AND (DataIN[iIndex ] = LF)
    AND (DataIN[iIndex+1 ] = CR)
    AND (DataIN[iIndex+2 ] = CX)
    AND (DataIN[iIndex+3 ] = CY)
    AND (DataIN[iIndex+4 ] = CZ)
    AND (DataIN[iIndex+5 ] = CG) ) THEN

    pRealData := ADR( DataIN[iIndex+6]); (* die Daten liegen hier*)
    rData := pRealData^; (* dereferenzieren *)
    Auslesen := TRUE; (* fertig für 1 Wert *)
    END_IF;
    iIndex:=iIndex+1;
    END_WHILE


    Viel Spass mit weiterem Lernen.
    Als Freelancer immer auf der Suche nach interessanten Projekten.
    Zitieren Zitieren Ein nicht vollständiger Lösungsvorschlag  

Ähnliche Themen

  1. CAN Schnittstelle
    Von simon86 im Forum CODESYS und IEC61131
    Antworten: 2
    Letzter Beitrag: 07.03.2011, 11:31
  2. EIA-485 Schnittstelle an S7
    Von alpinstief im Forum Feldbusse
    Antworten: 5
    Letzter Beitrag: 30.07.2009, 12:04
  3. S5-Schnittstelle USB - CPU
    Von Kuno im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 23.10.2008, 13:25
  4. RS 232 Schnittstelle
    Von Phil im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 27.02.2008, 13:50
  5. DP Schnittstelle
    Von M-Arens im Forum Feldbusse
    Antworten: 3
    Letzter Beitrag: 10.07.2006, 07:46

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •