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

Ergebnis 1 bis 3 von 3

Thema: ASCII Code der Serielle Schnittstelle in REAL umzuwandeln und ausgeben

  1. #1
    Registriert seit
    07.07.2014
    Beiträge
    16
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ich bin auch ein unerfahrener Benutzer von CodeSys und habe folgendes Problem: ich kann nun die Serielle Schnittstelle auslesen und die Daten werden in ASCII CODE in ein Buffer "Array" (0-255) gespeichert. Nun müssen diese Werte in Datentyp REAL umgewandelt werden, und ausgegeben werden. Ich habe ähnliche Probleme im Forum gefunden, aber richtig fündig wurde ich nicht. Dieser Wert besteht aus einer Adresse: ->1A01 und der Zahl 177,34. Wobei nur die Zahl für die Auswertung interessant ist. ->1A01177,34
    Unbenannt.JPG
    Den Einsatz für die Umrechnung habe ich im Forum folgenden Beitrag gefunden:
    "Ich würde jeden "x" in Peter L's BYTE Array in ein INT wandeln, und dann multiplizieren mit ein Faktor abhängig von Position (100x, 10x, 1x) und dann suzammen addieren in ein INT für "ganzzahlteil".
    Und dann jeden "y" in Peter L's BYTE Array in ein INT wandeln, und dann multiplizieren mit ein Faktor abhängig von Position (1000x, 100x, 10x, 1x) und dann suzammen addieren in ein INT für "nachkommateil"."


    Ich wollte fragen ob jemand mir dabei helfen könnte, wie man das Problem lösen kann.

    Vielen Dank im vorraus
    Geändert von lacosta19 (10.07.2014 um 22:21 Uhr)
    Zitieren Zitieren ASCII Code der Serielle Schnittstelle in REAL umzuwandeln und ausgeben  

  2. #2
    Registriert seit
    24.02.2009
    Beiträge
    1.244
    Danke
    23
    Erhielt 276 Danke für 235 Beiträge

    Standard

    Ein kleiner Ansatz auf die Schnelle wie ich es evtl. lösen würde (nur 10min drüber gegrübelt, geht also wahrscheinlich noch besser)

    1. alten Index des Ring-Puffers merken
    2. Daten empfangen
    3. Bei dem Ringpuffer musst du auf den Rücksprung am Ende des Buffer-Arrays achten. Wenn der Index > 255 wird springt er auf 0 zurück. Deshalb würde ich die Bytes aus dem Puffer von IndexStart an (unter Beachtung des Rücksprungs) in ein anderes Puffer-Array kopieren damit du im weiteren Verlauf nicht mehr auf den Möglichen Umbruch achten musst.
    4. Ist die Adresse immer 4 Byte lang? Wenn ja, kannst du die ersten 4 Byte beim Kopieren auch weg lassen.
    5. Jetzt solltest du ein Array haben das den Realwert als ASCII-Code-Byte-Array beinhaltet.
    6. Das Puffer-Array nach dem ASCII-Code für Punkt (46) oder Komma (44) durchsuchen (Je nachdem was für ein Dezimal-Trennzeichen verwendet wird)
    Das machst du am besten mit einer For-Schleife von 0 bis IndexEnde (die Anzahl der kopierten Bytes)
    7. Findet die Schleife ein Punkt oder Komma => Position (IndexDez) merken und Schleife Abbrechen (EXIT)
    8. Bau dir eine Funktion die als Look-Up Tabelle aus einem ASCII-Byte für einen Zahlenwert ein Int macht (z.B. mit einer CASE -Struktur). Nennen wir sie z.B. ASC_TO_INT(Byte).
    9. Jetzt gehst du wieder in einer For-Schleife rückwärts im Puffer von IndexDez bis 0. Die Elemente des Puffers wandelst du dabei mit der ASC_TO_INT Funktion in Integerwerte um. Das wird die Seite links vom Komma deines Reals. Wenn du in der For-Schleife eine Zählvariable aufaddierst, kannst du diese nutzen um die 10er-Potenz der einzelnen Werte zu erhöhen. Das gleiche machst du mit den Byte von IndexDez bis IndexEnde um den Nachkomma-Wert zu erhalten.

    Code:
    rWert:REAL;
    
    Die linke Seite vom Komma
    
    k:=0;
    FOR i := IndexDez - 1 TO 0 BY -1 DO
      rWert := rWert + ASC_TO_INT(Puffer[i]) * EXPT(10,k);
      k:=k+1;
    end_for
    
    Die rechte Seite vom Komma
    
    k:=-1;
    FOR i := IndexDez + 1 TO IndexEnde DO
      rWert := rWert + INT_TO_REAL(ASC_TO_INT(Puffer[i])) * EXPT(10,k);
      k:=k -1;
    end_for
    Jetzt sollte rWert dein REAL Wert sein.

    !!! Ungestestet ... nur ein Ansatz !!!

    Alternativ suchst du in der OSCAT Lib ob es da schon eine fertige Funktion gibt die das kann. Ich mache sowas lieber selber, das hält geistig fit

  3. Folgender Benutzer sagt Danke zu MasterOhh für den nützlichen Beitrag:

    lacosta19 (11.07.2014)

  4. #3
    lacosta19 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    07.07.2014
    Beiträge
    16
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Frage


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Unbenannt1.JPGUnbenannt2.JPG
    Nach paar Stunden Einlesen und Durchsuchen von Forum-Beiträgen, habe ich OSCAT Bibliothek benutzt und wie auf dem Bild zu sehen ist, parametriert.
    Kann mir jemand ein Tipp geben ob es richtig ist? Bzw. ich habe eine Angabe (MagicWord: 0x1D0F) mit dieser Eingabe kann ich nichts anfangen und die Suche im Internet war leider erfolgslos
    Geändert von lacosta19 (25.07.2014 um 17:09 Uhr)

Ähnliche Themen

  1. Antworten: 6
    Letzter Beitrag: 08.01.2016, 13:30
  2. MC7-Code in AWL umzuwandeln
    Von SPS_PC im Forum Hochsprachen - OPC
    Antworten: 70
    Letzter Beitrag: 24.12.2015, 17:22
  3. Antworten: 0
    Letzter Beitrag: 18.06.2013, 21:07
  4. TwinCAT und serielle Schnittstelle
    Von o-bi-wan-knobi im Forum CODESYS und IEC61131
    Antworten: 4
    Letzter Beitrag: 18.03.2008, 20:31
  5. Antworten: 8
    Letzter Beitrag: 06.02.2008, 18:19

Lesezeichen

Berechtigungen

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