Integerdaten aus einem DB zu einer Stringkette wandeln

s_alpen

Level-1
Beiträge
11
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo alle zusammen!

Bin noch recht neu hier im Forum aber habe schon sehr viel aus euren Artikeln lernen können. Seit zwei Wochen beschäftige ich mich mit einem Projekt, wo 2 2D-Laserscanner über eine SPS ausgewertet werden sollen und Abstände verschiedener Objekte bzw Statusbits als Stringkette mittels einer CP343-1Lean an einen PC gesendet werden sollen.

Die Auswertung habe ich soweit hin bekommen, dass 10 Integerwerte in einem Datenbaustein abgelegt werden. (siehe screenshot.jpg)

Jetzt sollen diese 10 Integerwerte in einen String zusammengeschrieben werden, damit sie über den AG_Send verschickt werden können.
Zur Zeit habe ich in FUP mit den Bibliothekenbausteinen I-STRING und CONCAT eine etwas zusammen "gefrickelt".
Gibt es da nicht Möglichkeiten das sauberer zu Lösen?Am liebsten in SCL...

Viele Grüße
 

Anhänge

  • screenshot.jpg
    screenshot.jpg
    33,5 KB · Aufrufe: 66
Hallo,
klar kannst du das in SCL machen. Die Umgebung verwendet zwar die gleichen FC's für die Wandlung bzw. zum Verknüpfen - es sieht aber deutlich lesbarer aus.

Gruß
Larry
 
Ja ... im Grundsatz so richtig.
Ich würde allerdings hier die Hilfs-Strings im Speicherbereich des Bausteins abbilden - also z.B. im TEMP-Bereich den/die Strings deklarieren und dann die Zuweisen und hinterher verknüpfen. Den DB für die Zwischenstrings brauchst du im Grunde nicht.

Das Endergebnis würde ich dann nur noch ausgeben ...

Gruß
Larry
 
Hallo,

wie willst Du auf der Pc-seite die Ziffern wieder auseinander pfrimeln?

Mein Vorschlag:
-Wandle jede Integerzahl in String um.
-Erzeuge Dier einen Trennzeichenstring z.B. '#' und einen laaaangen Tempstring (>200Chars)
-dann erzeuge einen TempString mit
1.Concat String1+Trennstring -> Tempstring;
2.1.Concat Tempstring+String2 -> Tempstring;
2.2.Concat Tempstring+Trennzeichen -> Tempstring;
3.1.Concat Tempstring+String3 -> Tempstring

...

10.1 Concat Tempstring+String10 -> Tempstring

Dann Sende den String an PC (Länge Steht in Stringvereinbarung 2.Byte)

Auf der PC-Seite kann man dann die Ziffern anhand der Trennzeichen wieder Trennen, z.B. in PHP mit der explode-Funktion.

Ich hoffe, dass dich diese Infos etwas weiterbringen.

Gruß
S7_Programmer
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen zusammen. Danke für eure Hilfe.
Die Software auf dem anderen PC schreibt eine andere Abteilung und die wollen eine Stringkette...

Habe jetzt in SCL eine Funktion geschrieben, die die Einzelnen Integerwerte ausliest und zu einem String zusammenfügt und in DB201 ablegt.
Beim Compilieren sind keine Fehler oder Warnungen aufgetaucht, daher habe ich dann den den FC-Baustein in den OB1 übernommen.

FUNCTION DATEN_AUFBEREITEN : VOID

VAR_TEMP

// temporäre Variablen
b1:STRING[4];
b2:STRING[4];
b3:STRING[1];
b4:STRING[1];
b5:STRING[1];
b6:STRING[1];
b7:STRING[1];
trenn:STRING[1]; //Trennzeichen
c:STRING; //zu bildene Stringkette

END_VAR

//Überführung von INT nach String
b1 := INT_TO_STRING(DB1.X_OFF);
b2 := INT_TO_STRING(DB1.Y_OFF);
b3 := INT_TO_STRING(DB1.LMS_Stat1);
b4 := INT_TO_STRING(DB1.LMS_Stat2);
b5 := INT_TO_STRING(DB1.STOP);
b6 := INT_TO_STRING(DB1.START_SWITCH);
b7 := INT_TO_STRING(DB1.STOP_SWITCH);
trenn:= '#';

//Erstellen der Zeichenkette mit Trennzeichen
c := CONCAT(IN1 := b1,IN2 := trenn);
c := CONCAT(IN1 := c,IN2 := b2);
c := CONCAT(IN1 := c,IN2 := trenn);
c := CONCAT(IN1 := c,IN2 := b3);
c := CONCAT(IN1 := c,IN2 := trenn);
c := CONCAT(IN1 := c,IN2 := b4);
c := CONCAT(IN1 := c,IN2 := trenn);
c := CONCAT(IN1 := c,IN2 := b5);
c := CONCAT(IN1 := c,IN2 := trenn);
c := CONCAT(IN1 := c,IN2 := b6);
c := CONCAT(IN1 := c,IN2 := trenn);
c := CONCAT(IN1 := c,IN2 := b7);

//Ausgabe der Kette in eine Variable
DB201.Stringkette := c;

END_FUNCTION


DB201 mit Stringkette TYP:String[19] und Anfangswert '' definiert.
Mit Hilfe das Bausteins FB200 [AG_SEND/AG_RECV] sollen die Daten dann über CP343-1 Lean an den externen Rechner versand werden. Daher den Baustein AG_Send mit Send=DB201 und LEN=22 parametreiert(siehe Bild).

Die Verbindng zweischen LEAN und Andere Station ist zuvor mit char-daten getestet worden. Mit der neuen Stringkette sendet die CPU jedoch keine Daten mehr raus.

Woran kann das liegen? Ob der String richtig zusammengefügt wurde, kann ich leider in der Online-Beobachtung nicht kontrollieren...
Gibt es andere Dignosemöglichkeiten oder habe ich noch etwas falsch Parametreiert?

Vielen Dank für eure Hilfe


Gruß
moz-screenshot.png
 

Anhänge

  • AG_Send.JPG
    AG_Send.JPG
    12,2 KB · Aufrufe: 29
Hallo,
ganz generell habe ALLE Siemens FC's Probleme mit nicht initialisierten Strings - selbst die, die den String erst erzeugen (obwohl das da vollkommender Quatsch ist).
Ich weiß jetzt auch nicht, ob das jetzt tatsächlich die Lösung zu deinem Problem ist, du könntest es aber mal probieren. Schreib doch mal vor der Verwendung der TEMP-Strings b1 .. b7 in dein Script das folgende mit hinein :
Code:
b1 := '' ;
b2 := '' ;
etc.
Es könnte sehr gut sein, dass das der Schlüssel ist ...

Gruß
Larry

Nachsatz : das würde dann auch für c gelten ...
 
Hallo,

danke für die Hilfe.
Das Programm läuft jetzt so wie gefordert.
Habe die tempStrings wie Larry Laffer beschrieben initialisiert.
Zwei Dinge musste ich weiterhin ändern.

Zum einen habe ich an dem AG_SEND/AG_RECV Datenblock die zu sendenen Daten aus mit einem POINTER und bestimmter Zeichenlänge übergeben und nicht einach die gesamte Datenbank angegeben und zum anderen hatte ich noch ein Problem mit der Zeichenlänge mit den Stringvariablen b3-b7. Hier sollten quasi boolsche Werte 1 oder 0 übertragen werden. Da diese zuvor im Programm als Integer abgelegt werden, muss der String mindestens 2 Zeichen groß sein, da bei INT_to_STRING das Vorzeichen mitgenommen wird.

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich reiche mal noch den Code nach, den ich dir vorgestern posten wollte, leider hat da mein Netz so gestreikt, dass nichts ging.

Ein wenig kannst du den Code damit noch straffen.
Code:
  Auftrag := '';
  CR := '$r$l';
  Auftrag := CONCAT(IN1 := '' 
                         ,IN2 := Stations_Code_tmp
                         ,IN3 := CR
                         ,IN4 := Auftrag_Order_No_tmp
                         ,IN5 := CR
                         ,IN6 := Product
                         ,IN7 := CR
                         ,IN8 := strDatum
                         ,IN9 := CR
                         ,IN10 := strZeit
                         ,IN11 := CR
                         ,IN12 := Event_tmp
                         ,IN13 := CR
                         ,IN14 := Text_tmp
                        );
 
Ich reiche mal noch den Code nach, den ich dir vorgestern posten wollte, leider hat da mein Netz so gestreikt, dass nichts ging.

Ein wenig kannst du den Code damit noch straffen.
Code:
  Auftrag := '';
  CR := '$r$l';
  Auftrag := CONCAT(IN1 := '' 
                         ,IN2 := Stations_Code_tmp
                         ,IN3 := CR
                         ,IN4 := Auftrag_Order_No_tmp
                         ,IN5 := CR
                         ,IN6 := Product
                         ,IN7 := CR
                         ,IN8 := strDatum
                         ,IN9 := CR
                         ,IN10 := strZeit
                         ,IN11 := CR
                         ,IN12 := Event_tmp
                         ,IN13 := CR
                         ,IN14 := Text_tmp
                        );

Habe ein ähnliches Problem und die Lösung in einen SCL-FB gemacht.
Sobald ich diese Stringauswertung drin habe, geht der Lokaldatenbedarf rauf auf 880Bytes bei mir. Ist ja enorm. Habe nur einen String[17] als Ausgangsparameter. Gibt es da vielleicht andere Möglichkeiten?
 
Zuletzt bearbeitet:
Hallo,
naja ... an deinem einen Ausgabe-String wird das nicht liegen sondern mehr an dem, was du dazwischen machst.
Aber mal anders herum - wo ist das Problem dabei den Lokaldaten-Bereich größer frei zu geben ?

Gruß
Larry
 
Im SCL Editor lässt sich eine Grenze der Zeichen für Strings einstellen.
Soviel ich noch weiss, lässt sich damit in Verbindung mit Stringbearbeitung der Lokaldatenbedarf verringern.
Evtl. da mal runterdrehen?
 
Zurück
Oben