TIA Stringlänge > 254 Zeichen

Krumnix

Level-3
Beiträge
1.464
Reaktionspunkte
192
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

im Zuge von OPC-UA wollen wir diverse Infos für die Kunden zur Verfügung stellen.
Nun sollen 3 Daten-Strings in einen kopiert werden und dann über OPC-UA übertragen werden.

Habe einen Opencontroller mit Softcontroller und programmiere mit TIA v15.1.

TIA sagt mir, dass ich einen String mit max [254] definieren kann.
Es kann aber sein, dass die 3 Strings zusammen größer werden. Aktuell ist dies 3 Mal "passiert".
Da hätte ich einen String mit 260 Zeichen gebraucht.

Wie kann ich den String in dem DB, welcher auf den OPC-UA Server des Opencontrollers geladen wird,
größer einstellen? Funktioniert das überhaupt?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ist das, was Du senden sollst, ganz sicher ein S7-String (mit 2 Header-Bytes) oder wird da ein CHAR/BYTE-Array erwartet?
Wenn für die Längenangabe im Header nur 1 Byte vorgesehen ist, dann kann der folgende String-Inhalt nicht länger als 254 Zeichen sein, weil sich dann die Länge nicht codieren ließe.

Harald
 
... ein S7-String (mit 2 Header-Bytes) ...
Wenn für die Längenangabe im Header nur 1 Byte vorgesehen ist, dann kann der folgende String-Inhalt nicht länger als 254 Zeichen sein, weil sich dann die Länge nicht codieren ließe.
Sorry Harald, das ist aber sehr siemensisch gedacht und deshalb(?) nicht schlüssig.
Die magische Grenze für die StringLänge in Anzahl Byte = Anzahl Zeichen ist bei einer LängenAngabe in 1 Byte die Zahl 255 - "normalerweise".
Das hätte Siemens auch bei Verwendung 2 LängenAngaben von je 1 Byte Länge umsetzen können, aber offenbar nicht gewollt. Es war ihnen wichtiger, die maximale GesamtLänge (HeaderBytes + "NutzBytes") auf eine im BinärSystem "runde" Zahl (z.B. 256) festzulegen - daher maximal 254 Bytes "NutzDaten" - wegen der 2 Bytes, die im Header verbraten werden.

Gruss, Heinileini

PS:
Die "magische Zahl" von 254 Byte NutzDaten pro "Einheit" gab es schon früher, nämlich bei Commodore 5 1/4-Zoll Disketten(-Laufwerken), weil 2 Byte der 256 Byte langen Sektoren benutzt wurden, um die zu einer Datei gehörenden Sektoren miteinander (vorwärts) zu verketten.
 
Hallo,

im Zuge von OPC-UA wollen wir diverse Infos für die Kunden zur Verfügung stellen.
Nun sollen 3 Daten-Strings in einen kopiert werden und dann über OPC-UA übertragen werden.

Habe einen Opencontroller mit Softcontroller und programmiere mit TIA v15.1.

TIA sagt mir, dass ich einen String mit max [254] definieren kann.
Es kann aber sein, dass die 3 Strings zusammen größer werden. Aktuell ist dies 3 Mal "passiert".
Da hätte ich einen String mit 260 Zeichen gebraucht.

Wie kann ich den String in dem DB, welcher auf den OPC-UA Server des Opencontrollers geladen wird,
größer einstellen? Funktioniert das überhaupt?

Ich hab mich selber damit noch nicht auseinandergesetzt, aber in den OPC-UA Einstellungen kannst du sowas wie Schemas zusammenbauen.
Kann sein, dass da was in der Richtung geht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Sorry Harald, das ist aber sehr siemensisch gedacht und deshalb(?) nicht schlüssig.
Die magische Grenze für die StringLänge in Anzahl Byte = Anzahl Zeichen ist bei einer LängenAngabe in 1 Byte die Zahl 255 - "normalerweise".
Ich weiß, daß man theoretisch auch eine Zahl/Länge 255 in ein Byte codieren könnte, doch die Siemens-Definition des Datentyps S7-STRING legt nun mal fest, daß die Länge maximal 254 sein kann/darf. Würde man in den Header-Bytes 255 eintragen, dann wäre das unzulässig und eine ordnungsgmäße Verarbeitung durch die S7-Firmware oder Kommunikations-Partner wäre nicht mehr sichergestellt.

Harald
 
Warum nicht wie schon vorgeschlagen die Variante mit WSTRING verwenden ?
OPC UA unterstützt WSTRING.
WSTRING kann bis zu 16384 Zeichen.
Man kann WSTRING in SCL programmieren, z.B.: #myWSTRING := WSTRING#'123abc';
 
Für mich ist noch nicht ganz klar, wie ich WSTRING in Variant verwenden kann. Sprich, im Moment wird in der ODK-SCL Quelle ein Variant definiert, damit ich nicht immer alle Datenpunkte anpassen muss, und da ich nur einen IN/OUT am Baustein haben will (ansonst wäre der Baustein beim Aufruf mit zig Parameter versehen).
Hier Baue ich mir die Inhalte im Variant in C++ zusammen und schicke sie rüber, bzw. ich lese die Daten dann aus und weise sie meine Punkten in C++ zu.
Da ich die Länge der Daten ja alle kenne, ist die Zuweisung "einfach". D.H. dass der S7-String im Variant (DB) z.B. DB1200.DBB1200 startet. Der 2. String wäre dann 256 Byte (254 Zeichen) später dran.
Mit dem WSTRING weiß ich dass erstmal nicht.
Wie verhält sich das in dem DB/Variant, wenn die Länge des WSTRING "variable" ist?!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin,
vielleicht nochmal ganz allgemein: Ein WString und ein String sind vom Konzept her total identisch. Nur die einzelnen Datenbereiche [Header + Zeichen] sind doppelt so groß -> also nicht mehr je ein Byte, sondern je ein Word groß. Dadurch das folglich auch die beiden Header-Einträge (String-Länge und Genutzte-Zeichen) nun keine Bytes, sondern je ein Word sind, kann man natürlich auch die maximale länge größer als 254 definieren.
Es ändert sich also für dein C++-Programm eigentlich nur die Berechnung der absoluten Adressen. Also um deine Adress-Pointer ein Zeichen weiter zu stellen, musst du jetzt die Byte-Adresse nicht um 1 Byte, sondern um ein Word erhöhen.
Wie verhält sich das in dem DB/Variant, wenn die Länge des WSTRING "variable" ist?!
Was meinst du jetzt in diesem Zusammenhang mit variabel? Bei der Deklaration des W/-Strings gibt man entweder eine explizite Länge an, oder halt nicht. Gibt man keine an, sind sowohl String als auch WString 254 Zeichen lang - ein String belegt dann 256 Byte im Speicher, ein WString 512 Byte...
wie gesagt, so recht verstehe ich dein Problem nicht :confused:
 
Zurück
Oben