Step 7 Anzahl belegter Bytes bestimmen

EPaulo

Level-1
Beiträge
91
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich habe einen String der immer unterschiedlich gefüllt wird.
Ich benötige aber immer zum Zeitpunkt x eine Anzahl an belegten bytes. bzw, die Anzahl der der bytes bis zum Letzten belegten byte.
Wenn also Byte 1, 2, 3 und 17 belegt sind mit Inhalten dann sollte er mit 17 ausspucken.
Kennt jemand einen einfachen weg wie man sowas realisiert könnte?

Danke im Voraus
 
ja ... jeder String gibt dir mit seinen Header-Bytes einmal die Information, wie lang der String insgesamt deklariert ist und dann auch noch, wieviele Bytes davon aktuell benutzt werden.
Vielleicht schaust du dir dazu einfach mal in der Siemens-Hilfe den Aufbau eines Strings an - möglicherweise ist das bei Step7-Classic aufschlußreicher wie z.B. bei TIA ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn also Byte 1, 2, 3 und 17 belegt sind mit Inhalten dann sollte er mit 17 ausspucken.
Was meinst Du mit "belegt"? Hast Du mal ein Beispiel?
Ein STRING ist immer ab dem ersten Zeichen lückenlos zusammenhängend "belegt".
Wie ist Dein String deklariert? als STRING oder als ARRAY[...] OF BYTE oder ...?

Harald
 
@Harald:
Ich habe folgendes verstanden (beispielhaft) :
Er hat einen String deklariert z.B. als String[20].
In diesen String schreibt er nun hinein "Test"
Damit hat er im Header stehen : String_Absolut = 20 und String_verwendet = 4

Gruß
Larry
 
Genau das verstehe auch ich unter "belegt".
Dazu passt aber nicht seine Aussage "Byte 1, 2, 3 und 17 belegt" - was ist mit den Bytes 4 bis 16?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Stimmt ... das hatte ich anders interpretiert ... (mal stehen 4 Bytes drin - mal 17).
Du hast schon Recht : es ist immer hilfreich, an Hand von einfachen Beispielen zu verdeutlichen, was man machen möchten und worauf es ankommt ... zumindestens dann, wenn man von Anderen, die nicht mit einem selbst im gleichen Büro sitzen, Hilfe haben möchte ...

Gruß
Larry
 
Was ist denn Inhalt? Ich meine NUL gehört ja auch zu einem String. Gibt ja doch einige Geräte die Strings in bestimmten Längen verlangen und Inhalt an bestimmten Stellen, da füllt man ja dann freien Platz mit NUL und nicht mit SP.
 
Mir geht es darum zu erkennen wo das letzte beschrieben Byte ist und wieveile es dann sind.
Z.B. ich übertrage "Test DB" Dann wäre im 5 byte kein inhalt, ich bräuchte aber als ergebniss 7 da das B im 7 Byte stehen würde.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn denn wirklich ein String im Sinne von Siemens übertragen wird, steht das im Byte0 oder 1 = Header des deklarierten Bereiches,
wenn es letzlich ein Array of CHAR ist, dann musst du dir halt selbst was zusammenbasteln, Schleife, prüfen auf 16#00 ;

Um bei deinem Beispiel "Test DB" zu bleiben, wäre im Byte 5 nicht kein Inhalt, sondern 16#20 also ein Leerzeichen ...
 
im Byte 5 wären nicht zwingend ein Leerzeichen. Wenn ich einzel die Bytes fülle dann wäre nichts enthalten.
Das mit der schleife wäre ja ok, aber ich muss nach dem erkennen von 16#00 noch bis zum ende prüfen ob nicht doch was enthalten ist.
Da hänge ich etwas wie ich das umsetzten soll?
 
Dann musst du halt die komplette Länge mit einer FOR-Schleife durchlaufen, und die Nummer sichern, die als letztes nicht 16#00 ist ... sind ca. 5 Zeilen SCL-Code, wenn überhaupt.
Da du den Tag "Step7" gewählt hast, hast du SCL?
 
Das Problem ist das nicht ich den String befallen werde. Daher muss ich von allem ausgehen.
Aber danke für die Belehrung, hoffe das es ihrem Ego gut getan hat.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Warum lässt du nicht einfach einen Loop von hinten nach vorne laufen und suchst das erste Byte von hinten in dem etwas steht?

Edit: Wenn es sich um einen String im S7 Format handelt mit Header, lese einfach den Header aus.
Wenn nicht und du willst den String auf einem Panel anzeigen und als String im S7 Format übergeben musst du den Header selbst generieren, da es sonst zu Anzeige Fehlern kommen kann.
 
Zuletzt bearbeitet:
Das Problem ist das nicht ich den String befallen werde. Daher muss ich von allem ausgehen.
Aber danke für die Belehrung, hoffe das es ihrem Ego gut getan hat.
Das Problem ist anscheinend, daß Ihr beide nicht die geeigneten Datentypen verwendet. Wieso deklariert Ihr Variablen als STRING, wenn sich der Inhalt gar nicht an die Datentyp-Konventionen von STRING hält? Wenn es in Wahrheit ein Byte-Array oder Char-Array ist, dann deklariert den Speicherbereich auch so, und dann sieht man auch wie die Schleife aussehen muß. Wenn es ein STRING sein soll, dann sorgt dafür daß sich der Inhalt an die Konventionen von STRING hält und dann lassen sich auch fertige String-Funktionen nutzen.

Harald
 
Sorry, wenn ich Dein Ego befallen haben sollte!
Meinem Ego hat es nichts angetan und es war auch schlimmstenfalls als "Belehrung im positiven Sinne" gemeint.

Zumindest konnten wir jetzt aufklären, wo das eigentliche Problem liegt: Du musst etwas Definiertes zaubern aus undefinierten Daten, die Du geliefert bekommst.
Du stehst also vor der Aufgabe, erraten zu müssen, wie weit der String belegt ist. Du musst also den String interpretieren und ggfs reparieren, bevor Du das Rätsel vermeintlich lösen kannst.
Dabei können wir ohne konkretere Angaben nicht wirklich helfen. Und eigentlich auch trotz konkreterer Angaben nicht.
Ich schliesse mich voll Haralds Meinung in #16 an. Am besten ist es wirklich immer, Unklarheiten gar nicht erst entstehen zu lassen.
EndOfBelehrung
Gruss, Heinileini
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Denke die Idee von Hadante den String von hinten nach vorne zu durchsuchen ist gut. (Warum habe ich nicht daran gedacht)
Sobald das erste Byte mit Inhalt kommt kann ich stoppen.

Werde jetzt noch versuchen eine FOR Schleife in AWL zu machen, hoffe ich finde infos hierzu.

Danke an alle
 
(Warum habe ich nicht daran gedacht)
Dieses Forum wäre öd und leer, wenn das Selber-dran-denken sooo einfach wäre ;o)

Das schöne an diesem Forum ist die Fülle der verschiedenen Lösungsansätze, die hier oft zum Vorschein kommt.
Von PatentLösung (na ja, Geschmackssache) bis ... (na ja, auch Geschmackssache).
Das Urteil, welche Lösung gut und welche schlecht ist, kann so unterschiedlich ausfallen. Auch das erleben wir hier im Forum immer wieder.
Unterschiedliche Branchen, unterschiedliche ProgrammierSprachen, unterschiedliche RandBedingungen (z.B. Schnittstellen), unterschiedliche Vorlieben, Abneigungen, Vorschriften, unterschiedliche Erfahrungen u.s.w. ...
Sogar manches, was zunächst nach "völlig am Thema vorbei" aussieht, kann durchaus wertvolle Anregungen enthalten.
Gruss, Heinileini
 
@TE:
Ich bezweifele, dass dein Vorhaben gelingen wird.
Du setzt voraus, dass in deiner Zeichenkette (du hast ja anscheinend nicht wirklich einen STRING) die letzten Zeichen durch Chr(0) überschrieben werden. Das wird aber nach meiner Meinung nicht passieren.
Es kann dir passieren, dass aus deiner Zeichenkette "Test_1234" nach dem Überschreiben mit "Hallo" am Ende inhaltlich "Hallo1234" wird. So findest du dann das wirkliche letzte Zeichen nicht.
Hast du hingegen einen STRING, dann würde in der Header-Information das eine Mal als Wert 9 drin stehen und das andere Mal 5 - und zwar ohne, dass du etwas weiteres machen mußt. Hierfür muss dann aber die hineinschreibende Komponente (siehe auch Beitrag #16 von Harald dazu) sich an die entsprechenden 'Konventionen' halten.
Wer beschreibt den deine Zeichenkette ...?

Gruß
Larry
 
Zurück
Oben