Verwenden von Simulink® Strings
Simulink® Strings sind ausdrücklich erlaubt und können mit dem TwinCAT Target for Simulink® genutzt werden.
Einschränkung
Je nach MATLAB® Release Version, Code-Interface-Packaging-Einstellung sowie gesetztem C/C++-Standard, übersetzt der Simulink CoderTM einen Simulink® String in den Datentyp std::string
.
Wird dieser Simulink® String als Modell Eingang oder Modell Ausgang genutzt, ist zu beachten, dass diese Einträge nicht in jedem Fall durch Mapping mit anderen Objekten in TwinCAT verbunden werden können. Das Mapping in TwinCAT geht von einer statischen Datentypgröße aus, was bei std::string
nicht der Fall ist.
![]() | Ausführliches Beispiel in MATLAB® Der Themenkomplex für TwinCAT Build 4024 und 4026 wird ausführlich in diesem Beispiel behandelt:
|
Handhabung mit TwinCAT 3.1 Build 4026
Das TwinCAT SDK für TwinCAT Builds >=4026 erlaubt die Verwendung einer std::string
-Implementierung. Dadurch können auch Strings in Mapping realisiert werden.
Diese Option hat zwei Einschränkungen:
- Die als lokale Variable in den von Simulink CoderTM generierten Funktionen verwendeten std::string-Elemente können dazu führen, dass die erforderliche Stacksize zunimmt, da die std::string-Daten auf dem Stack liegen.
- Die maximale String-Größe ist zur Kompilierzeit auf einen vom Benutzer gewählten Wert begrenzt. Wenn der generierte Code beispielsweise zwei Strings verkettet, die die Größe überschreiten, tritt eine Exception auf. Bitte entwerfen Sie Ihr Modell entsprechend und validieren Sie es beispielsweise durch Code-Überprüfung, um sicherzustellen, dass dies nicht passiert.
Verwenden Sie folgende Einstellungen, um das Simulink®-Modell erfolgreich zu bauen:
set_param(modelName,'TcProject_CppLanguageStandard','stdcpp20');
set_param(modelName,'TcProject_UseStaticStlString','on');
Die Größe des zugrunde liegenden Zeichenarrays ist standardmäßig auf 256 gesetzt, wie durch den Simulink®-Parameter DynamicStringBufferSize konfiguriert.
Falls gewünscht, kann die Größe des zugrunde liegenden Zeichenarrays unabhängig vom Simulink®-Parameter DynamicStringBufferSize über den Projektparameter StaticStlStringCapacity eingestellt werden:
set_param(modelName,'TcProject_StaticStlStringCapacity','255');
Für die TcCOM-Datenbereiche ist der entsprechende TwinCAT-Typ für jedes std::string ein Strukturtyp mit einem Daten- und einem Größenmitglied. Wenn ein String-Wert gesetzt wird, müssen sowohl das Daten- als auch das Größenmitglied gesetzt werden. Die Größe ist die Länge des Zeichenarrays, das auf den Datenwert gesetzt wird, und kann zwischen 0 und dem Wert von StaticStlStringCapacity liegen. Die Wahl eines Wertes, der größer als StaticStlStringCapacity ist, führt zu undefiniertem Verhalten.
Die Benutzerfreundlichkeit für den PLC-FB ist ähnlich wie beim TcCOM-Modul, wobei std::string eine Struktur mit einem Größen- und einem Datenmitglied ist. Wenn ein String-Wert geschrieben wird, müssen sowohl die Größen- als auch die Datenmitglieder gesetzt werden, während das Lesen eines String-Wertes erfordern kann, dass der Benutzer, den aus dem Datenelement gelesenen String auf die entsprechende Größe kürzt.
Handhabung mit TwinCAT 3.1 Build 4024
Damit Sie dennoch die Ein- und Ausgänge nutzen können, wird die Verwendung des PLC-FB (keine Mappings notwendig) oder des TcCOM-Wrapper-FB empfohlen. Bei den Standard Ein- und Ausgängen der FBs werden in beiden Fällen die Simulink®-String-Einträge nicht angezeigt. Diese sind über Getter- und Setter Methoden am FB separat zu setzen.
![]() | Simulink® Bus mit Simulink® Strings: Eingeschränkte Verwendung Folgende Situation wird aktuell nicht unterstützt: Ein Simulink® String kann nicht in einem Simulink® Bus verwendet werden, der als Ein- oder Ausgang des Modells dient, falls dieser als |
Beispiel
Folgendes Simulink®-Modell sei gegeben mit einer Mischung aus String und Nicht-String-Ein- und -Ausgängen.

Wenn dieses Modell mit MATLAB R2022a und Code Interface Packaging „C++ Class“ übersetzt wird, wird der Datentyp std::string
vom Simulink CoderTM erzeugt. In folgender Abbildung ist zu erkennen, dass in TwinCAT die String-Ein- und -Ausgänge nicht im Prozessabbild vorhanden sind.
Nur die Nicht-String-Ein- und -Ausgänge sind im Prozessabbild vorhanden.

Um die Strings schreiben und lesen zu können, muss entweder der TcCOM Wrapper FB oder der PLC FB verwendet werden. An den Funktionsbausteinen werden automatisch entsprechende Getter und Setter Methoden erstellt.

Beispielcode unter Verwendung des PLC-FB:
VAR
fbStringSample : FB_string_sample;
myStringIn : T_MaxString;
myStringOut1 : T_MaxString;
myStringOut2 : T_MaxString;
nSize : ULINT;
nSize2: ULINT;
fIn : LREAL;
fOut : LREAL;
END_VAR
// put string input
fbStringSample.put_StringInput(c_str := ADR(myStringIn));
// call function
fbStringSample(fNonStringInput := fIn, fNonStringOut3 => fOut);
// get string outputs
nSize := SIZEOF(myStringOut1);
fbStringSample.get_StringOut1(c_str := ADR(myStringOut1), size := nSize); // size in VAR IN OUT!
nSize2 := SIZEOF(myStringOut2);
fbStringSample.get_StringOut2(c_str := ADR(myStringOut2), size := nSize2);