Erstellen eines Strings (>80 Zeichen) aus mehreren Teilstrings

Begonnen von Bergland, 13. Februar 2017, 13:41:51

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 3 Gäste betrachten dieses Thema.

Bergland

Hallo Zusammen

Hier steht eigentlich die Lösung für mein Problem, doch mit meinem Nichtwissen kann ich die nicht umsetzen.
Wie genau verbaue ich z.B. oscat_STRING250 zu einem eigenen CONCAT FB? Wenn ich das richtig sehe, kann ich bei der Original FB nicht einfach den Typ ändern....

Danke
Bergland

peewit

dein problem habe ich noch wirklich verstanden

die string bausteine des systems können ja damit umgehen

string = standard string mit 80 zeichen maximaler länge

oscat_string250 ist nichts anderes als ein string mit 250 zeichen maximaler länge


was ist den dein eigener concat fb kongret ?

Bergland

Hallo peewit

Ich wollte eigentlich nix anderes machen als ein FB, der längere Strings als die 80 Zeichen verarbeiten kann.

Was ich eigentlich wirklich beräuchte wär ein gutes Lehrbuch. Leider kann mir der Lieferant der Soft (Phoenix) keines empfehlen....

Hättest Du eine Empfehlung für ein Anfänger?

Besten Dank

peewit

buch - ISBN-10: 3642002684


eigene baustein , das kannst du ja auch machen

zuerst überlegst du dir wie viele zeichen du maximal benötigst

wenn du mehr als 80 zeichen (standard string) benötigst kannst du einen eigenen string type deklarieren

unter datentypen legst du ein neues blatt an und schreibst das hinein

TYPE
  mein_string   : STRING(120);
END_TYPE

dann exisitiert eine datentype mit dem namen mein_string und der string kann maximal 120 zeichen aufnehmen

wenn du dann damit arbeiten möchtest musst du variablen mit der type "mein_string anlegen" und damit arbeiten
mehr ist das nicht

alle string bausteine die das system schon hat können automatisch mit string variabler typenlänge umgehen
das ist aber eine eigenschaft die nur diese systembausteine haben


Bergland

Hallo peewit

Danke für den Buch Tip.
Aktuell erstelle ich den XML-String mit dem original CONCAT FB. Für mich der einfachste Weg Fehler im Stringaufbau schnell zu erkennen. Nur reichen die 80 Zeichen nicht aus, darum wollte ich mir einen eigenen CONCAT FB mit z.B. 250 Zeichen langen String's bauen. Obwohl das eigentlich keine grosse Geschichte ist, will mir dies nicht gelingen.

Mit dem Buch, so hoffe ich, komme ich weiter (bis zur nächsten Baustelle...  :D)

Danke

Bergland

#5
Hallo Zusammen

Habe mir das Buch, welches mir peewit empfohlen hat, gekauft. Leider hilft es nicht so wie erwartet...

Mein Problem ist immer noch, dass ich verschiedene Teilstrings zu einem ganzen zusammenfügen und dann über den STRING_TO_BUFFER FB von PC-Worx via IP_USEND an das Modem senden möchte. Habe mit String_250 von Oscat den String in der gewünschten Länge erzeugen können. Der FB im PC-Worx kann jedoch nicht verwendet werden, weil die Eingangsstring-Variable zu klein ist.

Die Versuche mit dem Oscat _STRING_TO_BUFFER schlugen fehl, weil die Funktionen ADR(Array) oder SIZEOF(Array) sowie angeblich Pointer-Operationen in PC-Works nicht unterstützt werden.

In ST soll das so aussehen:
_STRING_TO_BUFFER(STR:=(* oscat_STRING250 *),POS:=(* INT *),SIZE:=(* UINT *),PT:=(* oscat_arb_0_249 *));
(* INT *):=_STRING_TO_BUFFER_2._STRING_TO_BUFFER;
(* oscat_arb_0_249 *):=_STRING_TO_BUFFER_2.PT;


Ich habe einen Buffer wie folgt definiert:
TYPE
   Send_SMS_Buffer: ARRAY[0..255] OF BYTE;
END_TYPE


Wie erhalte ich die Adresse also den Pointer für den Parameter PT und wie die Grösse meines Array für den SIZE Parameter in _STRING_TO_BUFFER?

Einem Beispiel, wie _STRING_TO_BUFFER im PC-Worx in ST aufgerufen wird, bin ich auch nicht abgeneigt.

Danke aus dem Bergland

peewit

ZitatDer FB im PC-Worx kann jedoch nicht verwendet werden, weil die Eingangsstring-Variable zu klein ist.

beschreibe mal genauer was du gemacht hast da ich erkenne nkann was du falsch machst

ZitatDie Versuche mit dem Oscat _STRING_TO_BUFFER schlugen fehl, weil die Funktionen ADR(Array) oder SIZEOF(Array) sowie angeblich Pointer-Operationen in PC-Works nicht unterstützt werden

in der network lib für pcworx gibt es ja einen string_to_buffer der ohne ADR und SIZEOF und Pointer arbeitet
diesen baustein kopiert man und passt ihn auf den PT byteararray zielbereich an

du musst deine probleme darstellen, eventuell durch posten deines codes

Bergland

Hallo peewit

Danke für Deine schnelle Antwort.

Zitat von: peewit
beschreibe mal genauer was du gemacht hast da ich erkenne nkann was du falsch machst

Ich möchte einen über 80 Zeichen langen XML-String via IP_USEND an das Modem senden. Aktuell mache ich dies zu Testzwecken, indem ich die verschiedenen Teilstrings via CONCAT zusammensetze und dann dem STRING_TO_BUFFER übergebe. Dieses erfolgt in FBS und funktioniert.

Da ich jedoch mit Arrays und Schleifen arbeiten möchte, versuchte ich diese Funktion in ST zu erstellen.
Hier der Versuch mit länderen Strings zu arbeiten

sSMSCallNumber := Array_Alarmempfaenger_cfg[1].F_Telefonnummer;
sSMSMessage := Array_Alarmmeldungen_cfg[1].F_Text_SMS;

sSendSMSText := CONCAT('<?xml version="1.0"?><cmgs destaddrs="', sSMSCallNumber);
sSendSMSText := CONCAT(sSendSMSText, '">');
sSendSMSText := CONCAT(sSendSMSText, sSMSMessage);
sSendSMSText := CONCAT(sSendSMSText, '</cmgs>');

xSendSMSText_LEN := LEN(sSendSMSText);
iSendSMSText_Buffer := STRING_TO_BUFFER(sSendSMSText,rvSendSMSText_Buffer, xSendSMSText_LEN);


Variablen:
======
Arrays:
Array_Alarmempfaenger_cfg
Array_Alarmmeldungen_cfg

oscat_STRING250:
sSMSCallNumber
sSMSMessage
sSendSMSText

INT:
xSendSMSText_LEN
iSendSMSText_Buffer

BYTE:
rvSendSMSText_Buffer

Wo mache ich den Fehler?
Grüsse Bergland

peewit

hallo

die infos sind immer noch halb....

BYTE:
rvSendSMSText_Buffer
das muss doch array of byte sein  und hast du den string_to_buffer angepasst

exportiere doch mal deinen baustein und stelle ihn mir zur verfügung (und alles was dazu gehört)
du kannst aber auch das gepackte zwt-projekt mir geben

was sagt denn der compiler beim übersetzen ?

schau dir in der oscat-network lib den baustein "TELNET_LOG" an !



Bergland

Hallo peewit

Der Compiler gibt aktuell keine Fehlermeldung mehr aus, aber es funktioniert immer noch nicht.
Von Phoenix habe ich den Tip erhalten, es mit STRING_TO_BUF zu versuchen. Die Stringübergabe scheint zu funktionieren, jetzt meckert das Kommunikationstool....

Kann denn TELNET_LOG mit einem Socketserver kommunizieren?

Werde mich frühesters gegen Ende nächster Woche wieder um die SPS kümmern können, denn zum Glück habe ich noch "einfachere" Arbeit... :-)

Grüsse
Bergland

Bergland

Hallo zusammen

Danke für die Hilfe, welche ich in diesem Forum erhalten habe.
So wie es ausschaut, ist für das aktuelle Projekt eine SPS nicht das richtige System.

Werde mich deshalb von diesem Forum zurückziehen.

Grüsse
Bergland