Step 7 String in einem Datenbaustein

joe_bvb

Level-1
Beiträge
57
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
ich schreibe ein Wort in einen Datenbaustein ab DB10.DBX14.0 fängt ein String von 10 Bytes (Siehe Foto). Das Problem dass der erste Buchstabe wird ins erste Byte (Byte 14) reingeschrieben und der zweite ins zweite (Byte 15)... Während das erste Byte für die maximale Zeichenkettelänge und das zweite für die tatsächliche Länge geeignet wäre. Die Frage jetzt wie kann ich ab dem Byte 16 anfangen zu schreiben und nicht ab Byte 14 d.h. E kommt in Byte 16 und N in Byte 17?
Mit freundlichen Grüßen.
Unbenannt.png
 
Ich kann deine Frage nicht wirklich nachvollziehen, im Datenbaustein stimmt doch alles.
Der erste String[10] fängt bei 14 an, der zweite bei 26.
Das sind also 12 Byte. Byte 0 und 1, wie von dir richtig beschrieben für die Längenangaben, ab Byte 2 dann 10 Byte für die Char des Strings.
Wenn du das erste Char des 1. Strings beschreiben willst, dann wäre das im DB Byte 16, für den 2. String Byte 28.
Wenn du Blockmove (SFC20) nutze, passiert das automatisch, du schreibst eine Stringvariable eines DB symbolisch an Source und einen symbolisch an Dest, dann wird das korrekt kopiert.
Gleiches gilt für concat und die restlichen Stringfunktionen. "Zu Fuß" (Byte, Word, DWord umkopieren) mußt du selbst darauf achten,die richtigen Bytes zu beschreiben.
Nicht vergessen, wenn du einzelne Char per Lade/Transferriere in den String schreibst, mußt du auch die tatsächliche Länge anpassen (Byte1), wenn sich die Länge des Strangs ändert.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich kann deine Frage nicht wirklich nachvollziehen, im Datenbaustein stimmt doch alles.
Der erste String[10] fängt bei 14 an, der zweite bei 26.
Das sind also 12 Byte. Byte 0 und 1, wie von dir richtig beschrieben für die Längenangaben, ab Byte 2 dann 10 Byte für die Char des Strings.
Wenn du das erste Char des 1. Strings beschreiben willst, dann wäre das im DB Byte 16, für den 2. String Byte 28.
Wenn du Blockmove (SFC20) nutze, passiert das automatisch, du schreibst eine Stringvariable eines DB symbolisch an Source und einen symbolisch an Dest, dann wird das korrekt kopiert.
Gleiches gilt für concat und die restlichen Stringfunktionen. "Zu Fuß" (Byte, Word, DWord umkopieren) mußt du selbst darauf achten,die richtigen Bytes zu beschreiben.
Nicht vergessen, wenn du einzelne Char per Lade/Transferriere in den String schreibst, mußt du auch die tatsächliche Länge anpassen (Byte1), wenn sich die Länge des Strangs ändert.

Ich danke dir für die Antwort. Du hast doch meine Frage nachvollzogen. Mit SFC20 würde es gehen, ja. Aber warum wenn ich einen Anfangswert eingebe wird ab Byte 14 belegt und nicht wie du gesagt hast ab Byte 16?Ich will nur Anfangswert eingeben und nicht mit SFC20, geht das?
 
... Das Problem dass der erste Buchstabe wird ins erste Byte (Byte 14) reingeschrieben und der zweite ins zweite (Byte 15)...
Wie hast Du das denn fest gestellt? Zeig das mal als Screenshot.
Bei mir wird der erste Buchstabe in Byte 16 geschrieben, davor werden die beiden Längenbytes eingetragen..
Gruß
Erch
 
Die Stringkopf-Bytes 14 und 15 zeigt der DB-Editor garnicht an, ich meine auch nicht bei Ansicht > Datensicht.
Lade Deinen DB in PLCSIM oder eine echte CPU und schaue Dir mit der Variablentabelle die Bytes 14, 15, 16, 17 an.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie hast Du das denn fest gestellt? Zeig das mal als Screenshot.
Bei mir wird der erste Buchstabe in Byte 16 geschrieben, davor werden die beiden Längenbytes eingetragen..
Gruß
Erch

Hi,
ich habe die Bytes in einer variablentabelle beobachtet und habe festgestellt dass, "E" in Byte 14 und "N" in Byte 15 reingeschrieben werden.
Gruß
 
ich schreibe ein Wort in einen Datenbaustein ab DB10.DBX14.0 fängt ein String von 10 Bytes (Siehe Foto). Das Problem dass der erste Buchstabe wird ins erste Byte (Byte 14) reingeschrieben und der zweite ins zweite (Byte 15)
Wie schreibst Du das "Wort" in den DB? Zu welcher Adresse? Kannst Du uns Deinen Programmcode zeigen?

Mit SFC20 würde es gehen, ja. Aber warum wenn ich einen Anfangswert eingebe wird ab Byte 14 belegt und nicht wie du gesagt hast ab Byte 16?Ich will nur Anfangswert eingeben und nicht mit SFC20, geht das?
Mit "Anfangswert" meinst Du, daß Du schon beim Erstellen des DB den STRING mit 'EN' belegen willst? Und das tut es anscheinend nicht?
Normalerweise geht das.
Hast Du den DB auch initialisiert bevor Du ihn in die CPU geladen hast?
(Ansicht > Datensicht + Bearbeiten > Datenbaustein initialisieren)

ich habe die Bytes in einer variablentabelle beobachtet und habe festgestellt dass, "E" in Byte 14 und "N" in Byte 15 reingeschrieben werden.
Direkt nach dem Laden des DB in die CPU oder läuft da schon das Programm welches eventuell falsch in den DB schreibt?
Bist Du sicher daß Du den richtigen DB beobachtest?

Kannst Du die CPU in STOP setzen? Oder hast Du PLCSIM?
Lade den DB in die gestoppte CPU und beobachte die Bytes bevor Du die CPU in RUN setzt.
In STOP ist alles richtig und in RUN ist es um 2 Byte verschoben? --> prüfe die Programmstelle, welche in den STRING schreiben soll.

Harald
 
So sieht das bei mir aus.
Unbenannt.jpg
Poste das doch mal in Deinem Fall.
CPU bitte dabei in STOP, und dann erst den Baustein ins AG laden.
Gruß
Erich
 
Zuletzt bearbeitet:
Zurück
Oben