Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 10 von 10

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

  1. #1
    Registriert seit
    09.04.2008
    Beiträge
    42
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Standard


    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!
    Zitieren Zitieren SCL – aus aufeinanderfolgenden CHAR einen STRING bilden - kein array of char!  

  2. #2
    Registriert seit
    19.07.2010
    Beiträge
    1.289
    Danke
    213
    Erhielt 267 Danke für 233 Beiträge

    Standard

    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).
    mfG Aventinus

  3. #3
    Registriert seit
    09.04.2008
    Beiträge
    42
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Im DB ist kein Array, die CHAR sind einzeln nacheinander im DB angeordnet und ich benötige nur einen bestimmten Bereich daraus.

  4. #4
    Registriert seit
    25.11.2008
    Ort
    Westpfalz
    Beiträge
    1.550
    Danke
    187
    Erhielt 212 Danke für 186 Beiträge

    Standard

    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
    and we all support the team (S.King - Die Arena)

  5. #5
    Registriert seit
    06.10.2004
    Ort
    Kopenhagen.
    Beiträge
    4.639
    Danke
    377
    Erhielt 803 Danke für 644 Beiträge

    Standard

    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 ?
    Jesper M. Pedersen

  6. #6
    Registriert seit
    09.04.2008
    Beiträge
    42
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Standard

    @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?

  7. #7
    Registriert seit
    06.10.2004
    Ort
    Kopenhagen.
    Beiträge
    4.639
    Danke
    377
    Erhielt 803 Danke für 644 Beiträge

    Standard

    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.
    Jesper M. Pedersen

  8. #8
    Registriert seit
    09.04.2008
    Beiträge
    42
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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!

  9. #9
    Registriert seit
    27.08.2003
    Ort
    Schweitenkirchen
    Beiträge
    472
    Danke
    101
    Erhielt 73 Danke für 59 Beiträge

    Standard

    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[i] ><'0' then
    deincharstring[i-j+2]:=deinechars[i]
    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
    Ich hoff mein Prinzip ist klar, ich hätts so Probiert.
    Gruss Andi
    Wenn ich einen meiner Finger in eines deiner Nasenlöcher stecke, haben wir beide nen Finger in der Nase

  10. #10
    Registriert seit
    09.04.2008
    Beiträge
    42
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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!

Ähnliche Themen

  1. Antworten: 50
    Letzter Beitrag: 09.08.2012, 09:31
  2. einzelne CHAR aus String lesen in ST
    Von Gerri im Forum CODESYS und IEC61131
    Antworten: 6
    Letzter Beitrag: 15.04.2012, 11:19
  3. Antworten: 5
    Letzter Beitrag: 10.12.2011, 13:58
  4. S7-1200-Array of Char in string
    Von Diplomand11 im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 21.01.2011, 08:44
  5. Das Array und Char/String Geheimnis...
    Von Percival im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 12.10.2007, 11:10

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •