TIA String mit falscher Länge umkopieren

the_elk

Level-2
Beiträge
150
Reaktionspunkte
20
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich bin gerade dabei ein Bestandsprojekt zu überarbeiten. Das Ganze läuft auf einer S7-1518 unter TIA V18. Von einem Fremdsystem empfange ich mehrfach Strings, die 14 Zeichen lang sind.
Leider werden die Strings vom Fremdsystem nicht sauber übergeben. Dier ersten 2 Byte, also die String-Maximallänge und die tatsächliche Länge sind 0.
An dem Empfangs-DB kann ich nichts ändern. Die Daten sollen in einen anderen DB in ein Array of String kopiert werden. Soweit funktioniert das. Allerdings sind die Strings dann leer, da ja die beiden String-Längen im Ursprungsstring 0 sind.
Wenn ich die Chars einzel über StringNeu[1] := StringAlt[1] … umkopiere, sind die einzelnen Chars danach leer. Wenn ich den Kopiervorgang online beobachte, sehe ich noch, wie im Ursprungsstring das richtige Zeichen gelesen wird, es wird dann aber ‚‘ also ein leeres Char geschrieben.
Per Slice lässt sich wohl nicht auf einen String zugreifen, das wird nicht zugelassen.
Wenn ich den sehr unschönen, und bei der Menge an Strings auch nicht praktikablen Umweg über Pointer gehe und die Chars so einzeln umkopiere, erhalte ich den korrekten String.
Hat jemand eine Idee, wie ich die „defekten“ Strings ohne den Einsatz von Pointern umkopiert bekomme, so dass sie hinterher lesbar sind?

Gruß
the_elk
 
Bausteine optimiert oder nicht optimiert? Bei Fremdsystem wohl eher letzteres. Dann würde ich mir mal das "AT" anschauen.
 
Kannst du im Empfangs DB vor dem kopieren nicht einfach die String Länge auf 14 setzen.

Zu S7-300 Zeiten hab ich so schon defekte Strings repariert.



StringNeu[1] := StringAlt[1]
Das sollte eigentlich gehen
Hat der neue string eine ist länge?
Eventuell vorher mal mit 14 dummy zeichen inizialisieren
 
Du weißt aber wieviele Zeichen übertragen worden sind - also die max. mögliche Länge des gesendeten Strings. Diese Info solltest du, wie schon vorgeschlagen in den String-Header übergeben. Ich nehme mal an, dass dein empfangener String nicht immer gleich viele Zeichen enthält - was für Zeichen stehen denn hinter dem letzten Nutzzeichen ? Chr(0) ? In dem Fall könntest du einfach danach suchen und diesen Wert dann als tatsächliche Länge eintragen. Der richtige Ansatz wäre hier, auch wie schon vorgeschlagen, dass du dir auf den empfangenen String via AT ein Array of Byte legst - dann hast du die Möglichkeit zu verfahren wie von mir beschrieben ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bausteine optimiert oder nicht optimiert? Bei Fremdsystem wohl eher letzteres. Dann würde ich mir mal das "AT" anschauen.
Das AT kann er sich auch bei optimierten Bausteinen anschauen:
 
Hallo zusammen,
den originalen DB darf ich leider nicht verändern oder beschreiben. Die Stringlänge ist immer identisch. Die Strings sind als String[14] definiert und werden auch immer mit 14 Zeichen befüllt.
Ich hatte dann versucht eine Kopie des originalen DBs anzulegen und den kompletten Inhalt zu spiegeln, so dass ich ihn bearbeiten kann. Leider bekomme ich keine Überlagerung mit AT in dem DB hin. Kann es sein, dass die Überlagerung nur in den Instanzdaten funktioniert?
Es liegt definitiv an den Steuerzeichen, welche beide 0 sind. Nur wie greife ich symbolisch auf die Steuerzeichen zu um sie zu korrigieren?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hab gerade noch einen Beitrag gefunden, der das Verhalten eines defekten Strings erklärt. Harald erklärt das hier ganz gut:
Beitrag

Auf den defekten String habe ich leider keinen Einfluss, ich muss nur an die Zeichen kommen.
 
Ich habs jetzt mit deinem Problem nicht getestet, aber vielleicht funktioniert eine der Zeichenkettenfunktionen.
Mit Strg_to_Char kann man zb. einzelne Zeichen aus einem String auslesen, beliebig verändern und mit Chars_to_string wieder einen String herstellen. Meine String Quelle ist allerdings ein korrekter String mit Header.

1688665680607.png
 
Leider bekomme ich keine Überlagerung mit AT in dem DB hin. Kann es sein, dass die Überlagerung nur in den Instanzdaten funktioniert?
Soweit ich es weiß funktioniert die Überlagerung NUR in einem Baustein und nicht in einem DB - macht ja auch nur so Sinn weil daraus dann ja ein andersartiger Code werden muss.
In diesem Zusammenhang : hol dir doch den "korrupten" String in deinen Baustein in dessen Speicherbereich - dort kannst du dann ja mit AT arbeiten und du wolltest doch auch sicherlich mit dem String irgend etwas machen ...
 
Du könntest das so machen. Das sind leider unqualifzierte Zugriffe aber es funktioniert
1688713335964.png
 
Wenn die immer gleich lang sind, dann in DB kopieren und die 1. 2 Byte richtig befüllen.
Danach sollte doch alles funktionieren.
 
Ich glaube dass dein Problem ist, du hast mit der Programmierer von das Fremdsystem abgeklärt dass er ein STRING[14] sendet, was er in die Realität nicht tut.
Die beste Lösung ist, in das Fremsystem sendet er ein Array of CHARs.
Wenn das nicht geht, dann erstellst du in dieselben Struktur wo die Daten landet, nicht ein STRING sondern ein Struktur welche ein 'dummyheader' von 2 Bytes enthält, gefolgt von ein Array of CHARs mit die Nutzdaten. Dann kannst du einfach den Array an Chars_TO_Strg übergeben.
 
Zuletzt bearbeitet:
Vielen Dank für eure Hilfe. Der Vorschlag von Thomas mit dem Serialize hat geklappt. Da ich das ganze 20 mal ausführen muss, wollte ich das ganze in einen FC packen und den dann mehrfach verwenden. Das funktioniert leider nicht. Sobald der defekte String einmal umkopiert wird, verliert er seine Daten.

Das ganze ist eine Bestandanlage und ja, der Fehler liegt auf der Seite des Fremdsystems. Mit der Lösung kann ich jetzt erstmal leben, bis die irgendwann einfach richtige Strings schicken.
 
Zurück
Oben