Funktion mit dynamischer String-Länge

mgl

Level-2
Beiträge
82
Reaktionspunkte
12
Zuviel Werbung?
-> Hier kostenlos registrieren
In TwinCAT ist man bei den meisten String-Funktionen auf T_MaxString von 255 Zeichen begrenzt.

Wäre es möglich, ähnlich wie bei Arrays (ARRAY[*] OF <type>) mit dynamisch langen Strings zu arbeiten?
 
Nimm die extended-- Varianten der Bausteine. E.g concat2.
Findest du in der TC2_Utilities-Lib.

Die "Standard-Befehle" sind übrigens genormt und du wirst sie in allen IEC-kompatiblen Steuerungen nur mit den 255-Zeichen finden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Schau dir mal die __NEW und __DELETE Operatoren an. Damit kannst du zur Laufzeit Speicher allozieren bzw. wieder freigeben, auch für Strings. Die meisten Standard-Funktionen/FB kommen mit solchen Strings aber nicht klar, du musst dann damit fast alles "händisch" manipulieren. Wenn die Länge wirklich dynamisch sein soll, gibt es meines Wissens keinen anderen Weg.

pString := __NEW(BYTE, cLength);
__DELETE(pSTRING);
 
Schau dir mal die __NEW und __DELETE Operatoren an. Damit kannst du zur Laufzeit Speicher allozieren bzw. wieder freigeben, auch für Strings. Die meisten Standard-Funktionen/FB kommen mit solchen Strings aber nicht klar, du musst dann damit fast alles "händisch" manipulieren. Wenn die Länge wirklich dynamisch sein soll, gibt es meines Wissens keinen anderen Weg.

pString := __NEW(BYTE, cLength);
__DELETE(pSTRING);
Ist das bei TwinCat OnlineChangeSafe?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Konzeptionell bedingt muss es das sein...
Das ist es ja gerade nicht, zumindest die Hersteller die ich kenne, aber wenn das in TwinCat funktioniert ist das eine super Sache.

In codesys funktioniert es nur, wenn man Allokiere und lösche innerhalb eines Task-Zyklus durchführt, sodass am Ende alles bereinigt ist, ansonsten kommt es höchstwahrscheinlich zum Crash beim OnlineChange.
 
Du musst da mit den Methoden "FB_Init" etc. arbeiten. Diese werden vor einem Onlinechange aufgerufen. Grundsätzlich werden die Pointer zu den dynamischen Instanzen bei einem Onlinechange nicht angepasst. Dies weil sie in einem anderen Speicher untergebracht sind. (Routerspeicher). Das bedingt aber das keine Onlinechanges von FBs und dergleichen möglich sind, welche dynamisch instanziert sind. Ebenfalls können die aktualwerte dieser FBs nicht eingesehen werden wenn man online ist. Ist aber ein ziemlich kompliziertes Thema und vorallem sehr schwer zu debuggen. Wir haben die meisten dynamischen Speicher wieder zurückgebaut. Wenn, dann nur über die TC3_DynamicMemory Bibliothek
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@samus: OnlineChanges mit dynamischen FBs sind möglich wenn man einen "Memory reserver" definiert hat und diese noch nicht aufgebraucht hat. Aktualwerte des FBs kann man über den Pointer zum FB anschauen.
Beim Debuggen kannst du aber in den Code meines Wissens nur per "Step in" hineinspringen.

Ich stimmte dir somit 100%ig zu dass das Thema kompliziert ist.

Bei dynamische Daten bin ich ziemlich entspannt. Man muss verstehen was passiert und wo der Speicher herkommt, das wars aber auch.
De facto setze ich dynamischen Speicher aber fast nie ein.
 
Mein Framework unterstützt das. Es ist in der TwinCAT.OpenFramework.Core-Bibliothek implementiert. Sieh dir die Klassen an StringHelper/WideStringHelper und StringBuilder/WideStringBuilder here. Wenn Sie Funktionen benötigen, die fehlen, schreiben Sie mir, und ich werde versuchen, sie umzusetzen, sobald ich Zeit habe.
 
Aktualwerte des FBs kann man über den Pointer zum FB anschauen.
Beim Debuggen kannst du aber in den Code meines Wissens nur per "Step in" hineinspringen.
Kann es sein, dass beim Code beobachten nur Fragezeichen dargestellt werden? Ich habe seit etwa der 4024.17 keinen Onlinecode eines dynamisch instanzierten FBs mehr beobachtet. Bis dahin war es so, dass du keine Werte im Code sehen konntest.

Vielleicht interessant für den einen oder anderen:
Die Vision Funktionen benützen den selben Routerspeicher. Wir hatten eine Maschine da wurde dies dermassen übertrieben, dass der Routerspeicher ausging. Daraufhin hat Beckhoff die Limiten von einigen 100Mb auf 1GB erhöht. Und wenn man den Registry Key kennt, kann man ihn noch weiter vergrössern:p
 
Zurück
Oben