# Byte Array in der Visualisierung darstellen



## isaridum (12 März 2022)

Guten tag zusammen,
ich möchte beispielsweise eine BYTE Zahl welche in einem Array gespeichert ist, in der Visualiserung darstellen, nur hab ich keine idee mehr wie ich das mache.
Zum beispiel:
tmp: ARRAY [0..3] OF BYTE := [0,0,16#C8,16#42]; // realwert =100

Hat jemand eine Idee?
Danke im Voraus!


----------



## PN/DP (12 März 2022)

Allgemeine Lösung: Kopiere die 4 Bytes in der richtigen/von Dir benötigten Byte-Reihenfolge in eine REAL-Variable und zeige den Wert dieser REAL-Variable in der Visu an. REAL#100.0 = 16#42C80000
Details: können wir nennen, wenn Du uns verrätst, mit welcher Visualisierung und welcher Steuerung und Programmiersoftware Du arbeitest. Vielleicht hilft eine Union, vielleicht müssen Bytes getauscht werden, ...?

Harald


----------



## isaridum (12 März 2022)

Ich arbeite ausschließlich mit CODESYS und dessen CODESYS Visualiesierung. Ich arbeite zurzeit in einem Projekt mit und meine Aufgabe  derzeit ist die Visualisierung. Dort habe ich ein Array von Byte das ich in der Visualiserung als Zahl darstellen will. Im Array werden entweder ganzahlige( int) oder gleitkommazahlen(real) sein. Also bei einem Aufruf kann 30 rauskommen und bei nächsten aufruf 33,3. Diese in der Visualiserung darzustellen ist meine aufgabe. Desshalb teste ich gerade in der SIMULATION ein einfaches Programm um die Zahlen darzustellen.


----------



## KLM (12 März 2022)

Ich würde einfach immer die 4 Byte in ein Real umwandeln und das in der Visu anzeigen. Die Frage ist, ob Du ein Merkmal hast, um zu entscheiden, ob die Rohdaten (4 Byte im Array) ein Integer oder Real repräsentieren.


----------



## isaridum (13 März 2022)

Ich habe lange überlegt, doch leider kein Verfahren gefunden um zu entscheiden ob die Rohdaten als Integer oder Real im Array abgespeichert sind. Deshalb habe ich mir als Notlösung vorgestellt zwei anzeigen in der Visualiserung zu haben, welche jeweils eine Typ anzeigt. Das sieht zwar nicht schön aus aber mir fällt nichts dazu ein. Gibt es vielleicht ein Verfahren um diese zu erkennen ? Und wie genau kann ich die 4 Bytes in ein Real umwandeln ?


----------



## wollvieh (13 März 2022)

Siehe Datentyp Union ... 
https://infosys.beckhoff.com/index.php?content=../content/1031/tc3_plc_intro/2529421195.html&id=


----------



## isaridum (13 März 2022)

Danke schön. Aber leider verstehe ich nicht wie mir das helfen soll um zu unterscheiden ob die Rohdaten im Array integer oder Real Werte sind?
Die Datem werden immer automatisch und selbstständig im Array befüllt und im nächsten Zyklus ersetzt.


----------



## PN/DP (13 März 2022)

Warum sind da mal Ganzzahlen und mal Gleitpunktzahlen drin? Der Empfänger der Daten muß dieses Kuddelmuddel doch unterscheiden können. Gibt es irgendein Signalbit oder ähnliches? Oder wurde diese "Sparlösung" extra erfunden, um Deine Aufgabe schwieriger zu machen? 

Gibt es vielleicht einen beschränkten Wertebereich, den die INT-Werte annehmen können? Und außerhalb des Bereiches müssen es Gleitpunktzahlen sein? Sind die INT-Werte vielleicht nur 16 Bit Werte? Dann müssten in dem Fall die oberen 16 Bit (in temp[2] und temp[3]) alle 0 oder alle 1 sein. Bei REAL-Werten ist das praktisch eher unwahrscheinlich (technisch unsinnige extrem kleine Zahl wenn alle Bits 0) bzw. signalisiert eine unzulässige Zahl (NaN) oder "unendlich", wenn alle Bits des Exponenten 1 sind.

https://de.wikipedia.org/wiki/IEEE_754


			IEEE-754 Konverter für Fließkommazahlen
		


Harald


----------



## isaridum (13 März 2022)

Also um meine Aufgabe zu beschreiben: ich erstelle eine Visualiserung einer CoE-Parameterverwaltung. Das heißt ich gebe ein welchen Index und Subindex bekomme den entsprechenden Wert. Dieser Wert kann entweder Real sein oder Integer. Der Wert wird in ein Byte Array gespeichert. Gibt es ein verfahren wie ich rausfinden kann ob die Rohdaten im Array ein integer oder Realwert ist ?


----------



## PN/DP (13 März 2022)

isaridum schrieb:


> Also um meine Aufgabe zu beschreiben: ich erstelle eine Visualiserung einer CoE-Parameterverwaltung. Das heißt ich gebe ein welchen Index und Subindex bekomme den entsprechenden Wert. Dieser Wert kann entweder Real sein oder Integer.


Dann mache noch ein Auswahlfeld in die Visu, wo man auswählen kann/muß, ob man den Wert als Ganzzahl oder Gleitpunktzahl angezeigt bekommt. Oder zeige grundsätzlich beide Interpretationen an und überlasse die Entscheidung dem Beobachter. Oder hinterlege eine Liste, welcher Index/Subindex welchen Datentyp liefert.



isaridum schrieb:


> Gibt es ein verfahren wie ich rausfinden kann ob die Rohdaten im Array ein integer oder Realwert ist ?


Nein, nicht wirklich. Da gibt es keine eindeutige Kennung, nur Wahrscheinlichkeiten, welche Präsentation des 32 Bit Bitmusters plausibel ist. Siehe meinen Beitrag #8 und die Links, wo Du den Aufbau des REAL-Datentyps sehen und experimentieren kannst.

Harald


----------



## KLM (13 März 2022)

Weil ich es immer schon mal machen wollte, anhängend ein Beispiel, das ein REAL in seine Komponenten (Vorzeichen, Mantisse, Exponent) aufschlüsselt und aus den Komponenten ein REAL zurück liefert.
Nebenbei fällt auch Dein REAL/INT-Problem als Lösung mit ab.


----------



## wollvieh (13 März 2022)

Wenn Du ne Parameterverwaltung machst, dann sind die COE Parameter ja durch die Objekte bestimmt  .
https://infosys.beckhoff.com/index.php?content=../content/1031/ethercatsystem/2469073803.html&id=


----------



## PN/DP (13 März 2022)

KLM schrieb:


> anhängend ein Beispiel, das ein REAL in seine Komponenten (Vorzeichen, Mantisse, Exponent) aufschlüsselt und aus den Komponenten ein REAL zurück liefert.
> Nebenbei fällt auch Dein REAL/INT-Problem als Lösung mit ab.


Ähem, was hat das jetzt mit dem Problem hier zu tun oder ist irgendwie hilfreich??  

Harald


----------



## Heinileini (13 März 2022)

isaridum schrieb:


> ich erstelle eine Visualiserung einer CoE-Parameterverwaltung.


Aha, CAN over ETHERNET. Also irgendeine wohldefinierte "Liste" von Daten, wobei insbesondere wohldefiniert ist, welche der Daten als welcher DatenTyp zu interpretieren sind.


isaridum schrieb:


> Das heißt ich gebe ein, welchen Index und Subindex [ich sehen will und] bekomme den entsprechenden Wert.


Wo gibst Du ein, welchen Index und Sub-Index Du sehen willst und - insbesondere - welche Software benutzt Du, um mit dem Index und SubIndex das gewünschte Datum zu isolieren? Hier ist schon die Stelle, wo der DatenTyp bekannt sein muss. Ein Erraten des DatenTyps aufgrund des Inhalts der gelesenen Bytes ist denkbar, viel zu abenteuerlich und viel zu ungewiss, um ernsthaft in Erwägung gezogen zu werden.


isaridum schrieb:


> Dieser Wert kann entweder Real sein oder Integer.


Wirklich nur diese beiden DatenTypen stehen zur Auswahl? Die haben immerhin unterschiedliche Längen: INT 2 Byte und REAL 4 Byte.
Aber, ich gehe mal davon aus, dass Du nicht weisst, ob Du nur die nächsten 2 Byte (bei INT) oder die nächsten 4 Byte (bei REAL) zusammenfassen und auswerten sollst. Sonst wäre dieser Thread gegenstandslos.


isaridum schrieb:


> Der Wert wird in ein Byte Array gespeichert.


Wer tut das und hinterlässt er Dir auch die Information, ob die nächsten beiden oder die nächsten vier Elemente des Array das nächste Datum beinhalten? Wenn Du diese Information nicht übermittelt bekommst und Du diese Information auch nicht irgendwie selbst aus Index und SubIndex ermitteln (z.B. aus einer Tabelle entnehmen) kannst, dann bist Du "aufgeschmissen".


isaridum schrieb:


> Gibt es ein verfahren wie ich rausfinden kann ob die Rohdaten im Array ein integer oder Realwert ist ?


Nein, ein zuverlässiges Verfahren gibt es nicht. Ein Ratespiel aufgrund von PlausibilitätsBetrachtungen wäre denkbar, aber Schwachsinn.
Und, wenn die PlausibilitätsBetrachtungen von Index zu Index und von SubIndex zu SubIndex variieren würden und jeweils individuell angepasst werden müssten, dann steht der sehr hohe Aufwand dafür in keinem Verhältnis zum Nutzen, nämlich ein leider sehr fragliches/ungewisses Ergebnis zu erhalten.
Ich möchte mal behaupten, wenn Du es überhaupt schaffst, diese individuellen PlausibilitätsBetrachtungen für den jeweiligen Index und SubIndex zu ermitteln, dann solte es für Dich ein Leichtes sein, stattdessen gleich den DatenTyp in Erfahrung zu bringen.

Und ich vermute/befürchte ferner, dass es in Wirklichkeit nicht nur um zwei verschiedene DatenTypen geht. Aber ich kenne CoE nicht.



isaridum schrieb:


> Und wie genau kann ich die 4 Bytes in ein Real umwandeln ?


Gar nicht! Da gibt es nichts umzuwandeln. 
Der Inhalt der Bytes wird nicht verändert bzw. darf nicht verändert werden! 
Du schaufelst die 4 Bytes in einen "Behälter" der mit "DWORD" beschriftet ist.
Dann wechselst Du nur die "Beschriftung" des Behälters aus gegen "REAL" und der nächste, der den Inhalt des Behälters lesen will, weiss dann, dass er ihn als REAL zu deuten hat.
Die Beschriftung des Behälters ist in keiner Weise im Inhalt des Behälters hinterlegt.

Dies im Programm umzusetzen, gibt es je nach CPU, Sprache, ... verschiedene Möglichkeiten.
Man kann dafür die "Konvertierung" DWORD_TO_REAL verwenden, wenn diese in Wirklichkeit nicht konvertiert, sondern "nur" einen "TypeCast" ausführt, also im Endeffekt nur die Beschriftung des Behälter ändert, ohne den Inhalt zu ändern.
Man kann (bei der Deklaration mit AT) dafür sorgen, dass dieselben 4 aufeinanderfolgen Bytes wahlweise als "DWORD" oder als "REAL" (oder als ARRAY OF BYTE) angesprochen werden können, sofern der Compiler dieses unterstützt.


----------



## KLM (13 März 2022)

PN/DP schrieb:


> Ähem, was hat das jetzt mit dem Problem hier zu tun oder ist irgendwie hilfreich??


Weil man mit dem Wissen, wie ein REAL im Speicher dargestellt ist, z.B. eine Unterscheidung treffen kann, ob ein REAL oder INT die Datenquelle ist. Schau rein, dann siehst Du, dass ich neben meiner eigenen Motivation eben auch zeige, wie man mit UNION aus dem 4-Byte-Array ein REAL und INT herausholt und unterscheiden kann welchen Datentyp die Quelle haben muss.


----------



## PN/DP (13 März 2022)

Heinileini schrieb:


> Man kann dafür die "Konvertierung" DWORD_TO_REAL verwenden, wenn diese in Wirklichkeit nicht konvertiert, sondern "nur" einen "TypeCast" ausführt, also im Endeffekt nur die Beschriftung des Behälter ändert, ohne den Inhalt zu ändern.
> Man kann (bei der Deklaration mit AT) dafür sorgen, dass dieselben 4 aufeinanderfolgen Bytes wahlweise als "DWORD" oder als "REAL" (oder als ARRAY OF BYTE) angesprochen werden können, sofern der Compiler dieses unterstützt.


Hier geht es um Codesys, Version ???, da können die 4 Bytes nur mit Umspeichern per Pointer oder mit einer Union (ab Codesys 3) in eine REAL-Variable gespeichert werden. Interpretieren als REAL "ohne Konvertieren" (??_TO_REAL) gibt es in Codesys nicht. Diese Aufgabe wurde hier im Forum schon öfters behandelt.



KLM schrieb:


> Weil man mit dem Wissen, wie ein REAL im Speicher dargestellt ist, z.B. eine Unterscheidung treffen kann, ob ein REAL oder INT die Datenquelle ist.


Das kann man eben nicht unterscheiden. Man kann einem 32 Bit Bitmuster nicht sicher ansehen, ob das ein REAL oder eine Ganzzahl ist (abgesehen von ein paar Bitkombinationen, die keine als Zahl darstellbare REAL-Zahl ergeben).
Welcher Wert versteckt sich Deiner Meinung nach in 16#0000FFFF ?



KLM schrieb:


> Schau rein, dann siehst Du, dass ich neben meiner eigenen Motivation eben auch zeige, wie man mit UNION aus dem 4-Byte-Array ein REAL und INT herausholt und unterscheiden kann welchen Datentyp die Quelle haben muss.


Wie kann man in Dein spezielles Dateiformat hineinschauen, wenn man nicht die spezielle Software hat, die zum Öffnen der Datei nötig ist?
Zeig doch mal Deinen Code als normale Textdatei.

Ob der OP überhaupt eine UNION verwenden kann, wissen wir nicht. Er hat nicht angegeben, mit welcher Codesys-Version er arbeitet.

Harald


----------



## KLM (13 März 2022)

PN/DP schrieb:


> Das kann man eben nicht unterscheiden. Man kann einem 32 Bit Bitmuster nicht sicher ansehen, ob das ein REAL oder eine Ganzzahl ist (abgesehen von ein paar Bitkombinationen, die keine als Zahl darstellbare REAL-Zahl ergeben).
> Welcher Wert versteckt sich Deiner Meinung nach in 16#0000FFFF ?


Bei einem 32 Bit Real und 32 Bit Integer kann man es nicht, steht außer Frage. Und das es nicht sinnvoll ist den Datentyp aus der Werten abzuleiten, wie @Heinileini bereits ausführlich dargelegt hat, ebenso wenig.
Aber das hier ist das CODESYS Unterforum und bei CODESYS ist ein Integer nur 16 Bit groß. Unter der Voraussetzung, dass die 16 Bit vom Integer nicht in den beiden most significant Bytes vom Array liegen (dazu macht @isaridum leider keine Angaben) kann man aber eben doch REAL von INT unterscheiden. Bei einem REAL liegt in den beiden most significant Bytes der Exponent und der ist nur in Sonderfällen null.


PN/DP schrieb:


> Wie kann man in Dein spezielles Dateiformat hineinschauen, wenn man nicht die spezielle Software hat, die zum Öffnen der Datei nötig ist?
> Zeig doch mal Deinen Code als normale Textdatei.


Nachdem ich eben nicht weiß, welche Entwicklungsumgebung der OP verwendet, habe ich es als Exportdatei im Standard-Format der CODESYS bereitgestellt. Das sollte der OP in jeder CODESYS basierten Entwicklungsumgebung wieder importieren können.


PN/DP schrieb:


> Ob der OP überhaupt eine UNION verwenden kann, wissen wir nicht. Er hat nicht angegeben, mit welcher Codesys-Version er arbeitet.


Nachdem @wollvieh den Weg über Union bereits vorgeschlagen hat und der OP offenkundig nicht damit anfangen konnte, habe ich eben das Bsp. erstellt. Und nachdem das eigentlich, seien wir ehrlich, Kinderkram ist, brauchte ich eine Motivation ein Bsp. zu erstellen und das war eben das Aufteilen in die Einzelteile. Hab ich vorher nicht gebraucht und brauch ich später sicher auch nicht, aber zur Motivation hat es gereicht.
Und wenn der OP Union nicht verwenden kann, weil er noch auf der seit Jahren abgekündigten CODESYS 2.3 unterwegs ist, dann hätte er das ja hoffentlich gesagt.


----------



## PN/DP (13 März 2022)

Wissen wir, ob der OP 16-Bit-Int meint? Ich habe den OP in #8 danach gefragt, der OP hat die Frage nicht beantwortet.
Wissen wir, ob in dem Fall die beiden letzten Bytes im Array gelöscht sind oder irgendwelchen nicht zum Int gehörenden Inhalt haben?
Wenn es wirklich um 16 Bit Integer und 32 Bit Real geht, wo ist denn da das Problem? Dann müsste doch der in das Byte-Array hineinschreibende Programmteil wissen ob er Int oder Real hineinschreibt.
Wissen wir, ob der OP Codesys 3 hat und ob er eine Steuerung hat, die überhaupt mit Codesys 3 programmierbar ist? Die Nachfragen aus #2 wurden lediglich mit dem Wort "Codesys" beantwortet ...
Union hatte ich auch schon in #2 angedeutet, aber wegen den sehr spärlichen Angaben des OP nicht weiter erläutert. Diese Aufgabe wurde hier im Forum aber schon öfters behandelt und Codebeispiele findet man z.B. mit den Suchwörtern codesys union real, z.B. hier eine Union-Variante und eine Pointer-Variante (allerdings mit DWord anstatt Byte-Array, was aber kein Problem sein sollte, wenn man weiß was man will).



KLM schrieb:


> Nachdem ich eben nicht weiß, welche Entwicklungsumgebung der OP verwendet, habe ich es als Exportdatei im Standard-Format der CODESYS bereitgestellt. Das sollte der OP in jeder CODESYS basierten Entwicklungsumgebung wieder importieren können.


Tja, dann kann das halt nur jemand lesen, der eine Codesys basierte Entwicklungsumgebung hat und erstmal diese Software hochfährt und die Datei in ein Testprojekt importiert, falls er überhaupt weiß wie das geht. Das ist das Problem von proprietären Dateiformaten. Einen Code-Quelltext als Standard Textdatei könnte jeder sofort lesen ... und auch in irgendeine Entwicklungsumgebung kopieren wenn er will ... oder ist dein Code in einer grafischen Programmiersprache FUP/KOP/CFC/...?

Harald


----------



## Heinileini (14 März 2022)

isaridum schrieb:


> Ich habe lange überlegt, doch leider kein Verfahren gefunden um zu entscheiden ob die Rohdaten als Integer oder Real im Array abgespeichert sind. Deshalb habe ich mir als Notlösung vorgestellt zwei anzeigen in der Visualiserung zu haben, welche jeweils eine Typ anzeigt.


Nein, nicht zwei Anzeigen in der Visualisierung, sondern (mindestens) DREI Anzeigen:
- eine für REAL (4 Byte)
- eine für INT (die beiden ersten Byte) UND
- noch eine für INT (die beiden nächsten Byte des 4-Byte-Blockes!!!).

Und auch damit ist niemandem gedient.
Sieh um Himmelswillen zu, dass bzw. wie Du an die Information kommst, welches der angelieferten Bytes Bestandteil von was ist!

WurstKäseSzenario:
Du kriegst 4 Byte angeliefert. Die beiden ersten Byte stellen ein INT dar. So weit, so gut.
ABER: Kannst Du sicher sein, dass das dritte und vierte Byte nicht das erste und zweite Byte der folgenden REAL-Zahl sind? Dann fehlt Dir doch noch die zweite Hälfte Deiner REAL-Zahl?!?!?

Du musst dem Übel an die Wurzel packen und nicht nutzlos die Zeit und die Energie damit vertun, an den Symptomen herumzudoktern!

PS:
Wir diskutieren hier darüber, nach welchen Strohhalmen Du greifen könntest, wenn es Dir darum ginge, unbekanntes Terrain zu erforschen.
Aber ist das denn die Aufgabe, die Du lösen sollst? Sollst Du nicht in Wirklichkeit eine verlässliche Anzeige von Daten realisieren?

PPS:


PN/DP schrieb:


> Warum sind da mal Ganzzahlen und mal Gleitpunktzahlen drin?


Gibt es wirklich nur diese beiden Typen?
Woher nimmt man die Information, ob es sich bei einer Ganzzahl um eine signed oder unsigned handelt?
Wie sieht es aus mit FestpunktZahlen? Also Ganzzahlen, bei denen man sich definitionsgemäss ein Komma denken muss.
Wenn man diese Definition nicht kennt, genügt es nicht einmal, den DatenTyp zu kennen.
Woher nehmen wir die Information, ob eine Zahl eine BCD-Zahl ist oder nicht? Mal ganz abgesehen von diversen noch "exotischeren" Codierungen.
Können wir ausschliessen, dass ASCII-Zeichen enthalten sind? Um ASCII-Zeichen "plausibel" (aber nicht sicher!) zu erkennen, könnte man zumindest unterstellen, dass keine oder nur wenige Werte < 32 pro Byte enthalten sind.


----------



## isaridum (15 März 2022)

Vielen Dank an euch alle für eure Antworten. Habe mit meinem Vorgesetzten geredet und das Problem geklärt. Ich wünsche jedem einen schönen Tag.


----------



## Heinileini (15 März 2022)

isaridum schrieb:


> Vielen Dank an euch alle für eure Antworten. Habe mit meinem Vorgesetzten geredet und das Problem geklärt. Ich wünsche jedem einen schönen Tag.


Falls die Klärung mit Deinem Vorgesetzten darin besteht, dass ihr dem Problem aus dem Wege gehen könnt, OK.

Falls aber eine Lösung gefunden wurde, die eine "Erhellung" (= happy end?) für diesen Thread darstellen könnte, wäre es interessant zu erfahren, welche.


----------



## isaridum (15 März 2022)

Die Lösung ist das der Anwender die möglichkeit haben soll die Zahl entweder als integer oder Real zu sehen. Mit einer einfachen IF Anweisung war das Problem auch schon geklärt.


----------



## PN/DP (15 März 2022)

isaridum schrieb:


> Die Lösung ist das der Anwender die möglichkeit haben soll die Zahl entweder als integer oder Real zu sehen. Mit einer einfachen IF Anweisung war das Problem auch schon geklärt.


Ja, ganz einfach wurde Dir auch schon empfohlen

```
IF der_Anwender_wuenscht_Darstellung_als_REAL THEN
    ShowAsReal()
ELSE
    ShowAsInt()
END IF
```
Oder wie lautet Deine einfache IF-Anweisung?

Harald


----------

