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.

Verwenden von Simulink® Strings 1:

Ausführliches Beispiel in MATLAB®

Der Themenkomplex für TwinCAT Build 4024 und 4026 wird ausführlich in diesem Beispiel behandelt:

TwinCAT.ModuleGenerator.Samples.Start('Using Simulink Strings')

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:

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.

Verwenden von Simulink® Strings 2:

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 std::string vom Simulink CoderTM abgebildet wird.

Beispiel

Folgendes Simulink®-Modell sei gegeben mit einer Mischung aus String und Nicht-String-Ein- und -Ausgängen.

Verwenden von Simulink® Strings 3:

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.

Verwenden von Simulink® Strings 4:

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.

Verwenden von Simulink® Strings 5:

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);