SCL – aus aufeinanderfolgenden CHAR einen STRING bilden - kein array of char!

LittleJack86

Level-1
Beiträge
44
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo und schon mal Danke!

Ich habe schon viel gesucht, allerdings nichts gefunden mit dem ich etwas anfangen kann, daher hoffe ich nun auf eure Hilfe.

Meine Problemstellung ist folgende:
Ich habe in einem DB unter anderem einen Bereich, in welchem 50 einzelne CHAR stehen, aus diesen 50 Zeichen möchte ich ein bestimmtes Segment auslesen, evtl. vorhandene führende Nullen löschen und das Ganze in einen String wandeln.
Anschließend soll der String mit einem zweiten auf gleich oder ungleich verglichen werden.

Mein Ansatz wäre folgender gewesen:

  • In SCL
  • Auszulesenden Bereich in einem ANY-Pointer übergeben
  • Links beginnend Byte für Byte kopieren, Nullen überspringen und gleichzeitig tatsächliche Länge mitzählen
  • Das Ganze in einen String schreiben
  • Anschließend mit einem zweiten String vergleichen evtl. mit dem FC10 EQ_STRNG

Mein Problem, mal abgesehen davon, dass ich SCL-Neuling bin, ist folgendes:
Ich weiß nicht wie ich mithilfe des übergebenen ANY-Pointers die Bytes nun einzeln ansprechen kann.
Ich bin in diesem Zusammenhang immer auf den AT Befehl gestoßen und dass ich damit dem Pointer eine Structur zuweisen kann, ganz klar ist mir die Verwendung allerdings nicht geworden.

Evtl. könnt Ihr mir ja eine Hilfestellung geben, DANKE schon mal!
 
Du hast in deinem DB ein Array of Char?

Hab da mal auf die schnelle einen Ansatz. Ist aber erst eine Idee...
Dann leg doch über deinen neuen STRING eine Sicht mit der AT-Anweisung in der zu die ersten zwei Byte als Header deklarierst und den Rest als Array[1..50] of Char. Dann kopierst du mittels einer Zuweisung das Array in den String und schmeißt die Nullen hinterher wieder raus (Schleife und DELETE).
 
Idee

1) Blockmove einzelne char in ein array of char
2) CHAR_TO_STRING
3) Schleife mit FIND '0' und DELETE
4) EQ_STRING

@Aventinus: gibts die AT-Anweisung nicht nur für S7-1200?

MfG MK
 
Obwohl ich auch auf AT hinweisen wurde, besteht den Frage: Warum sind die Daten nicht zuerst als ein Array von CHAR zerlegt ? Gibt es en Grund dafür ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Mäuseklavier
Ja, grundsätzlich wäre das auch möglich, allerdings würde ich das ganze gerne etwas 'kompakter' machen, durch blockmove, der Wandlung und dem Suchen der Nullen greife ich die Daten immer wieder an, das muss doch auch in einem durch gehen oder?

@JesperMP
Ob es tatsächlich einen guten Grund gibt kann ich nicht 100%ig sagen, die Daten kommen von einem Datenbanksystem über eine TCP Verbindung daher und werden mit weiteren Informationen in einer Wurst aus CHAR, INT und Bits in einem DB abgelegt. Es handelt sich um Zielverfolgungsdaten von (Produkt)Palettendaten welche innerhalb des DBs um jeweils einen kompletten Datensatz verschoben werden wenn die Palette ihrern Stellplatz ändert.
Das ist eigentlich aber nebensächlich, wollte damit nur sagen, dass ich den Aufbau des DBs nicht ändern möchte auch wenn es keinen wirklichen Grund für diesen Aufbau gibt.

Könntes du mir ein Beispiel für die Verwendung des AT befehls in bezug auf den ANY Pointer geben? vor allem wie ich den Pointer dann in scl variabel aufrufen kann?
 
Aber, wo die Daten in ein DB landet, gibt es vermutlich ein Art Struktur, und dies ist fest, oder ?
Wenn da heute nur eine Reihe von Einzel-CHARs gibt, dann ist es einfach dies ins ein ARRAY von CHARs zu wandeln.
Den DB wird nicht wirklich geändert, nur den Interpretation von die CHARs.
Es hat keine Bedeutung für den sendende Datenbank Teilnehmer wenn du dies nur auf den empfängende Seite änderst.
Wenn du das nicht willst, dann sind beide BLOCKMOVE und AT Lösungen dafür.
 
Ja richtig, die Struktur ist fest und ich stimme dir auch zu, dass es für den sendenden Teilnehmer egal ist.
Meine Unsicherheit hängt an einer Visu welche ebanfalls auf die Daten zugreift, auf diese habe ich leider keinen Zugriff, möglicherweise ist es dieser auch egal, die absulute Adresse wird ja nicht verändert, allerdings die Symbolische.
Testen könnte ich es auf jeden fall.

Da mich die AT Lösung sehr interessiert, würde ich diese ebenfalls gerne testen, allerdings weiß ich eben nicht wie es damit funktioniert!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich hätte es so probiert:
Du kopierst per Blockmove die 50 Zeichen in ein lokales Array of Char "deinechars".
Jetz wär intressant wie lang der String sein muss mit dem du am Ende vergleichen willst.
Nehmen wir mal an, dass immer 10 Nullen drin sind, dann wirds ein 40 Zeichen String.
Jetzt eine For Schleife auf das lokale Array of Char von 1 bis 50.
deincharstring muss ein Array of Char 52 zeichen sein.Hier werden erst ab Byte 2 Zeichen geschrieben.(Zählung mit Byte 0)


J=1;
For I=1 TO 50
//Darin eine If abfrage auf >< '0'.
If deinechars ><'0' then
deincharstring[i-j+2]:=deinechars
j:=j+1;
End_if;
END_FOR;
deinchartstring[0]=int_to_byte(50) //absolute Stringlänge
deinchartstring[1]=int_to_byte(j) //tatsächliche Stringlänge

Jetzt Blockmove von deincharstring in deinstring(50 zeichen lang).

Mit absoluter und tatsächlicher Stringlänge könnt ich noch nen Dreher drin haben.
Aber mit 6 Bier bin ich jetz zu Faul zum suchen :ROFLMAO:
Ich hoff mein Prinzip ist klar, ich hätts so Probiert.
Gruss Andi
 
Guten Morgen!

@Zefix: DANKE!
Habe gerade etwas Zeit zum Testen und versuche jetzt die Zeichen ohne blockmove zu kopieren und zu prüfen, falls ich scheiteren werde ich deine Version nehmen, sieht vernünftig aus! :)
 
Zurück
Oben