ASCII Code der Serielle Schnittstelle in REAL umzuwandeln und ausgeben

lacosta19

Level-1
Beiträge
16
Reaktionspunkte
0
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
 
Zuletzt bearbeitet:
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 ;)
 
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
 
Zuletzt bearbeitet:
Zurück
Oben