TIA Warum braucht ein String beim serialiezieren soviel Datenspeicher?

F.G

Level-1
Beiträge
4
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
ich habe eine Frage und zwar ich habe das Problem, dass beim übertragen von einem string viel speicher benötige für den De-/Serialize Datenpuffer min. ca 250 Byte, obwohl ich eigentlich nur 2 ziffern und 1 buchstabe übertragen möchte(siehe Bild), laut Tia Hilfe benötigt ein string nur n+2 byte also in meinem Fall 5 byte, wieso zeigt mir der serialize Baustein den 8253 Fehlercode? reicht ein array of byte von 100 nicht?
 

Anhänge

  • Screenshot 2024-02-08 211101.png
    Screenshot 2024-02-08 211101.png
    144,9 KB · Aufrufe: 42
  • Screenshot 2024-02-08 211232.png
    Screenshot 2024-02-08 211232.png
    101,7 KB · Aufrufe: 45
  • Screenshot 2024-02-08 211326.png
    Screenshot 2024-02-08 211326.png
    365,3 KB · Aufrufe: 42
  • Screenshot 2024-02-08 211454.png
    Screenshot 2024-02-08 211454.png
    174,8 KB · Aufrufe: 44
Weil Du Deinem String keine Längenbegrenzung mitgegeben hast, z.B. String[5]:
1707425320480.png
Damit wird für ihn die volle Länge von 254 Byte + die 2 Byte Head reserviert, auch wenn Du sie nicht benutzt.

Wenn man also vorher schon weiß, wieviele Zeichen lang der String max. wird, empfiehlt es sich auch, ihm diese Längenbegrenzung mitzugeben.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Weil Du Deinem String keine Längenbegrenzung mitgegeben hast, z.B. String[5]:
Anhang anzeigen 75274
Damit wird für ihn die volle Länge von 254 Byte + die 2 Byte Head reserviert, auch wenn Du sie nicht benutzt.

Wenn man also vorher schon weiß, wieviele Zeichen lang der String max. wird, empfiehlt es sich auch, ihm diese Längenbegrenzung mitzugeben.
Danke das hat funktioniert! Gibt es eine Möglichkeit, dass das Programm automatisch den benötigten Speicher dynamisch anpasst ?z.B wenn ich nur 2 buchstaben übertragen möchte, soll er 4 bytes übertragen und nicht 5.
 
Danke das hat funktioniert! Gibt es eine Möglichkeit, dass das Programm automatisch den benötigten Speicher dynamisch anpasst ?z.B wenn ich nur 2 buchstaben übertragen möchte, soll er 4 bytes übertragen und nicht 5.
Nein, das geht nicht. Der String hat ja eine Länge von 254+2. Wobei in den 254 Bytes Zeichen drin stehen und in den "+2" ein Byte für die maximale Länge (Deine Angabe oder 254) und tatsächliche Länge. Aber der Baustein "Serialize" nimmt die maximale Länge an.
Wofür wäre es (in einer SPS(!)) hilfreich, wenn Du die Länge dynamisch anpassen könntest?
Wenn es mir um Strings (nicht wString(!)) gehen würde, würde ich einfach das Maximum (254) zulassen. Warum auch nicht?

Falls ein "Abkürzen" für die weitere Verarbeitung notwendig ist, kann man da dann auch einfacher mit dem serialisierten Array hantieren.

Gruß
MFreiberger
 
Nein, das geht nicht. Der String hat ja eine Länge von 254+2. Wobei in den 254 Bytes Zeichen drin stehen und in den "+2" ein Byte für die maximale Länge (Deine Angabe oder 254) und tatsächliche Länge. Aber der Baustein "Serialize" nimmt die maximale Länge an.
Wofür wäre es (in einer SPS(!)) hilfreich, wenn Du die Länge dynamisch anpassen könntest?
Wenn es mir um Strings (nicht wString(!)) gehen würde, würde ich einfach das Maximum (254) zulassen. Warum auch nicht?

Falls ein "Abkürzen" für die weitere Verarbeitung notwendig ist, kann man da dann auch einfacher mit dem serialisierten Array hantieren.

Gruß
MFreiberger
Ich möchte die Daten in einem Transponder speichern mit RFID, deswegen ist jedes gesparrte Byte wichtig.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich möchte die Daten in einem Transponder speichern mit RFID, deswegen ist jedes gesparrte Byte wichtig.
Verstehe. Aber dann ist es doch das Beste, dass man beim Schreiben der Daten zu dem Transponder ansetzt, oder?
Wie wird das gemacht? Wie wird da die Länge zum Schreiben festgelegt? Hängt das nur am String?

Ein bisschen unorthodox, aber möglich wäre es, wenn Du 254 Strings anlegst. String[1], String[2], String[3] ... String[254]. Dann müsste der Sendebaustein entsprechend aufgerufen werden. In einer Schleife. Wenn der Schleifenzähler dann die Länge erreicht hat, den Baustein aufrufen.

Aber ich denke, dass das einfacher gehen wird. Zeig doch mal, wie das Senden erfolgt.
 
Ich möchte die Daten in einem Transponder speichern mit RFID, deswegen ist jedes gesparrte Byte wichtig.
In dem Fall würde ich vermutlich eine maximal mögliche String-Länge festlegen und die Daten als Char-Array der maximalen Länge in den Transponder speichern. Kürzere Strings im Char-Array hinten mit B#16#00 auffüllen oder falls nötig mit Leerzeichen ' ' (B#16#20).
 
Verstehe. Aber dann ist es doch das Beste, dass man beim Schreiben der Daten zu dem Transponder ansetzt, oder?
Wie wird das gemacht? Wie wird da die Länge zum Schreiben festgelegt? Hängt das nur am String?

Ein bisschen unorthodox, aber möglich wäre es, wenn Du 254 Strings anlegst. String[1], String[2], String[3] ... String[254]. Dann müsste der Sendebaustein entsprechend aufgerufen werden. In einer Schleife. Wenn der Schleifenzähler dann die Länge erreicht hat, den Baustein aufrufen.

Aber ich denke, dass das einfacher gehen wird. Zeig doch mal, wie das Senden erfolgt.
Das mit dem Schleifenzähler funktioniert wahrscheinlich nur mit SCL oder?
Hier ist mein kleines Programm; (mein Ziel ist es beide Arrays of chars durch strings zu ersetzen)
 

Anhänge

  • FC Write.pdf
    65,3 KB · Aufrufe: 5
  • DB Write.png
    DB Write.png
    156,4 KB · Aufrufe: 7
Das mit dem Schleifenzähler funktioniert wahrscheinlich nur mit SCL oder?
Nein, Schleifen sind prinzipiell auch in anderen Programmiersprachen möglich, beispielsweise mit bedingten Sprüngen.
Da würde ich aber sehr vorsichtig sein, da du hier mit etwas Pech/Unaufmerksamkeit in einer Endlos-Schleife steckst. SCL bietet sich für Schleifen stärker an.

Im Grund nimmst du für jedes Problem das passende Werkzeug. Bits zu verUNDen oder zu verODERn macht sich in KOP/FUP am besten, komplizierte Schrittketten sind mit Graph am intuitivsten, aber Schleifen passen am besten in SCL.
 
Zurück
Oben