Array of Byte in String mit Step 7 V10.5

Lord Cartman

Level-1
Beiträge
71
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
es gibt zwar bereits einige Treads mit dem gleichen Thema, nur konnte ich darin leider keine ausreichende Hilfe finden.
Wie im Kopf schon zu sehen ist, soll ein Array mit 49 Stellen in einen String geschrieben werden, um ihn anschließend auf einem Panel (KTP400) ausgeben zu lassen.
Meine Idee war zuerst, jedes einzelne Byte in ein Integer umzuwandeln und dann diesen Int in den ensprechenden String zu kopieren.
Die erstellung der einzelnen Ints funktioniert auch soweit mit dem "conv-baustein".
Um diese ints in den string zu kopieren wollte ich den baustein "val_strg" verwenden, der eig genau diese funktion erfüllen sollte. leider schreibt er anschließend keinen einzigenwert in den string:confused:

Nebenbei: gibt es vlt auch eine elegantere Lösung als meine, da ich hierbei ja wirklich 49 stellen umwandeln und kopieren müsste...

Lg
 
Hallo,
ich nehme mal an, dass in deinem ARRAY_of_Byte schon Zeichen des ASCII-Zeichensatzes drin stehen ... ? In dem Fall einfach die Zeichen so wie sie sind in dem String kopieren und beim String (den der ist letztlich auch nur ein ARRAY_of Byte) den Header initialisieren (also deklerierte Länge des String und benutzte Länge desselben).

Gruß
Larry

Nachsatz:
Falls es keine ASCII-Zeichen in deinem ARRAY sind - was ist dann drin ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zunächst mal danke für die schnelle antwort.
Die Idee mit dem "simplen" kopieren von dem Array in den string hatte ich auch schon, nur meckert der entsprechende baustein hierbei immer.
Mit dem baustein "move_blk" lassen sich bereiche kopieren, wobei am eingang ein Array und am Ausgang ein Array angegeben werden muss. Bei einem String am Ausgang kommt immer die Fehlermeldung dass ein Zugriff an den Datentyp String an dieser Stelle unzulässig ist.
Die Daten innerhalb des Arrays sind Ascii kodiert, jedoch im hex-format.
 
Woher kommt denn dein Array_of_Byte ?
Kannst du nicht direkt in den String [+ Offset 2] schreiben ?

Hex ist nur eine andere Ansichtsform (also OK) - das ändert nichts am Inhalt ...

Gruß
Larry
 
Um die Herkunft des Arrays zu erklären müsst ich leider weit ausholen, da es von einer speziellen Siemens Applikation kommt, die so nicht erwerblich ist (Arbeite in ner großen Firma, deswegen der Aufwand).

Direkt in den String schreiben geht leider nicht. Wenn ich den String am Ausgang direkt auswähle kommt der oben genannte Fehler und wenn ich über Pointer gehe (=> P#DB6.DBX93.0 BYTE49) kommt die meldung dass der aktualparameter any nicht zum datentyp arrayelement [...] passt.

Das direkte übertragen der daten von array in string will einfach nicht funktionieren, deswegen war meine idee noch über eine umwandlung zu gehen un dann mühsam alle bytes in ints zu konvertieren und dann die ints in dem string zusammenzufassen.
komischerweise werden die Integer nicht in den string geschrieben:confused:

Lg
Cartman
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Naja ...

der Blockmove würde auch arbeiten, wenn du am Ausgang dessen (Ziel) nicht den String-Anfang hinschreibst sondern den Nutzdatenbereich dessen als ANY-Pointer.

Du kannst aber auch in einer Scheife die Inhalte übertragen - Byteweise.
Int geht hier nicht - wie machst du das überhaupt ?

Achja ... das Ganze ist natürlich ein Fall für AWL ... (falls du mit FUP oder so herummachst ...)

Gruß
Larry
 
Das obige Beispiel des Pointers (=> P#DB6.DBX93.0 BYTE49) bezog sich leider schon auf den Nutzdatenbereich. Der String geht bereits ab der Adresse 91 los.
Zu deiner Idee mit der Schleife: mit welchem Baustein würdeste das realisieren?
Über den Baustein "Val_Strg" kann ein numerischer Wert in eine Zeichenkette konvertiert werden. Theoretisch zumindest, praktisch klappts nicht, wobei der baustein einen mir noch unklaren eingang hat (format), an dem das ausgabeformat der zeichen angegeben werden muss. Der hierfür erforderliche Datentyp ist word.

Mit AWL wäre das ganze mit sicherheit einfacher zu lösen, nur hat siemens ja gemeint bei der neuen 1200er Reihe brauch man kein AWL mehr...

Lg
Cartman
 
"Val_Strg" erzeugt dir aus einem Zahlenwert einen String - also aus der Zahl 12345 (die du in deiner Quell-variablen drin hast) wird dir der String "12345" gebildet. Das ist aber ja gar nicht, was du haben willst. Du möchtest ja Zeichen für Zeichen aus dem einem Speicherbereich in den nächsten kopieren.

Wegen dem BlockMove noch einmal : worüber und vor Allem was meckert denn der Baustein ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Muss dir erstmal noch für deine Bemühungen danken, hast mir ja bereits schon mehrmals geholfen :)

Also ich zähl ma den aktuellen Stand auf:
Der Array of Byte (alias: return_fehler_text)befindet sich im DB6 an der Stelle 154: Array [0 .. 53] of Byte
Der String (alias: Fehlertext) liegt bei der Adresse 93 im selben DB: String [54].
Die "meckerei" geht bei dem baustein los, sobald der string als ausgang definiert wird. Der Fehlertext lautet: "An dieser Stelle sind keine Zugriffe auf ELemente des Datentyps string zulässig.

Zu verdeutlichung hängen zwei Screenshots an.
 

Anhänge

  • DB6.JPG
    DB6.JPG
    47,6 KB · Aufrufe: 20
  • Netzwerk.JPG
    Netzwerk.JPG
    14,7 KB · Aufrufe: 23
Direkt in den String schreiben geht leider nicht. Wenn ich den String am Ausgang direkt auswähle kommt der oben genannte Fehler und wenn ich über Pointer gehe (=> P#DB6.DBX93.0 BYTE49) kommt die meldung dass der aktualparameter any nicht zum datentyp arrayelement [...] passt.

Hast du das mal in AWL versucht ?
 
Zurück
Oben