Simulink の string
複数のアプリケーションでテキストを渡して操作する場合は string を使用します。たとえば、燃料制御システムをモデル化するときは、燃料レベルを列挙型データを使用してモデル化する代わりに、"LOW" や "EMPTY" のような string を使用できます。Simulink® の string は MATLAB® の string と互換性があります。
Simulink の string は組み込みの信号データ型です。Simulink エディターには、"strN" (最大長が N 文字の string) や "string" (最大長がない動的な string) のように表示されます。string の長さの範囲は 1 ~ 32,766 文字です。 
Simulink の string 信号は本質的に離散です。string 信号のサンプル時間が連続である場合、モデルのコンパイル時にエラーが生成されます。
Simulink では、string の変数や式 ("a" + "b" など) を数値変数と同じように扱います。string 変数の値は、文字ベクトルと MATLAB string のどちらにすることもできます。string 変数は、ベース ワークスペース、モデル ワークスペース、およびマスク ワークスペースで設定できます。
文字列リテラルは、二重引用符 ("Hello") または一重引用符 ('Hello') で囲んで指定します。MATLAB の string と一致させるには、二重引用符を使用します。string は端子や Display ブロックに二重引用符で囲んで表示されます。
Simulink の string では、ISO/IEC 8859-1 文字セットの 256 文字がサポートされます。これらの文字は Unicode の最初の 256 のコード ポイントです。Simulink では、最初の文字 char(0) ("NULL") はサポートされず、この文字が string に含まれているとエラーを返します。
文字を表示できない場合、ブロックは実際の情報を格納し、エスケープ文字を付けてその文字に関連付けられた 8 進数値を出力します。たとえば、BREAK PERMITTED HERE の 10 進数の制御文字は 130 です。ブロックでは、この制御文字をエスケープされた 8 進数の \202 として表示します。ASCII to String ブロックでは、Unicode セットの 0000 ~ 001F および 007F ~ 009F の範囲のエスケープされた 8 進数の文字として返します。
このトピックでは、Simulink で string を使用する方法について説明します。以下の内容が含まれます。
- 使用可能な string ブロックと string 変換に固有のブロックの一覧 
- string 定数を他の string ブロックに渡す 
- string 内の null 文字 
- 最大長がない string 
- Stateflow® との交互作用 
- 生成コード 
- 制限 
このトピックには、string ブロックの使用方法を示す簡単な例も含まれています。このトピックの例では、ブロック名の表示を有効にします。ブロック名の表示を制御するには、[書式設定] タブで [自動] 、 [自動ブロック名の非表示] を選択します。たとえば、string ブロックを使用して、座標データを表示および抽出したり、string 内でパターンを検出したりできます。
モデルでの string の操作については、次の表を参照してください。
| アクション | ブロック | 
|---|---|
| uint8 ベクトルを string 信号に変換します。 | |
| Format パラメーターと入力信号に基づいて出力 string 信号を構成します。 | |
| 入力 string をスキャンし、Format パラメーターで指定された形式によって信号に変換します。 | |
| 2 つの入力 string を比較します。 | |
| 複数の入力 string を連結して 1 つの出力 string を形成します。 | |
| String パラメーターで指定された string を出力します。 | |
| テキスト文字列 str 中で最初に出現するパターン string sub のインデックスを返します。 | |
| 入力 string の文字数を出力します。 | |
| string 信号を uint8 ベクトルに変換します。 | |
| string 信号を double 信号に変換します。 | |
| string 信号を single 信号に変換します。 | |
| 入力 string を列挙型信号に変換します。 | |
| string 信号から部分文字列を抽出します。 | |
| 入力信号を string 信号に変換します。 | 
string 定数
string 定数を指定するには、String Constant ブロックを使用します。Constant ブロックは string を受け入れないので使用しないでください。String Constant ブロックで、"Hello!" のように、文字列を二重引用符で囲んで [文字列] パラメーターに入力します。これは、Constant ブロックの [定数値] パラメーターで数値定数を追加するのと同じです。
Simulink の string と null 文字
Simulink の string については、string の終端が自動的に処理されます。string の末尾に null 終端は使用しないでください。Simulink では、string 内に null 文字が含まれていることを検出するとエラーを生成します。Simulink でのシミュレーションとコード生成の実行時、string は次のように処理されます。
- シミュレーション時は、モデルのシミュレーションが実行されます。ほかに必要な処理はありません。 
- C コードの生成時は、ソフトウェアによって string の末尾に null 終端が追加されます。たとえば、string のバッファー サイズが 10 で、実際の string の値が - "AB"であれば、生成コードの 3 番目の文字が null 終端になります。
string データ型
string ブロックでは、たとえば string 型を出力する場合など、必要に応じて string データ型を作成して使用します。string は最大文字数を指定しなくても作成できます。最大文字数がない string のことを動的な string と呼びます。
string をサポートするブロックでは、次の方法で string データ型を作成できます。
- Simulink ブロックの [信号属性] タブにある [出力データ型] パラメーターまたは [データ型] パラメーターを使用します。 - 最大文字数を指定せずに string データ型を作成するには、 - stringを指定します。これにより、動的な文字列が作成されます。
- 最大文字数を指定して string データ型を作成するには、たとえば - 100であれば- stringtype(100)のように入力します。string データ型は MATLAB コマンド ラインで関数- stringtypeを使用して作成することもできます。
- R2024a 以降では、string データ型の最大長でシンボリック式がサポートされます。シンボリック次元の詳細については、生成されたコードでの配列サイズのシンボリック次元の実装 (Simulink Coder)を参照してください。 - ただし、シンボリック式を最大長として使用する string データ型には次の制限が適用されます。 - Stateflow ブロック、MATLAB Function ブロック、および MATLAB System ブロックでは、シンボリック式を最大長として使用する string データ型はサポートされません。 
- String Constant などの定数のサンプル時間をもつブロックでは、シンボリック次元を最大長とする string データ型はサポートされません。 
 
 
- 関数 - set_paramを使用して- OutDataTypeStrパラメーターを指定します。以下に例を示します。- set_param(gcb,'OutDataTypeStr','stringtype(100)') - この関数では、最大長が 100 文字の string データ型オブジェクトが作成されます。string 型の長さの範囲は 1 ~ 32,766 文字です。 
たとえば、String Constant ブロックで [出力データ型] パラメーターを stringtype(31) に設定して string を作成すると、str31 の string データ型が作成されます。31 はこの string で許容される最大文字数です。
バス オブジェクトの string
型エディターを使用して string を受け入れるよう Simulink.Bus オブジェクトの要素を構成するには、Simulink.BusElement オブジェクトの [データ型] パラメーターに string 型を入力します。たとえば、最大文字数が 10 文字の string データ型を指定するには、stringtype(10) と入力します。それに合わせて [モード] パラメーターが更新されます。可変長の動的な信号を指定するには、string を入力します。バス要素に数値と string のオブジェクトの組み合わせを作成できます。型エディターでの Bus オブジェクトと BusElement オブジェクトの作成の詳細については、型エディターを参照してください。
string と生成コード
string および生成された C コードと C++ コードについては、次の注意事項を検討します。
動的な string データ型に関するシミュレーションと生成された C コードの違い
動的な string データ型を使用するブロックのシミュレーションは、生成された C コードと次のように異なります。
- シミュレーション中の - stringデータ型をもつ信号のサイズは動的です。言い換えると、string のサイズは 0 ~ 32766 の間で変化する可能性があります。ただし、生成された- Cコードでは、string は固定サイズの- char_T配列として保存されます。したがって、生成された- Cコードでは、string のサイズは固定バッファー サイズにより制限されます。追加の文字はソフトウェアによって切り詰められ、最後 (たとえば、String Concatenate ブロックの出力時) に null 終端が挿入されます。
- string の不変要素 (パラメーターまたは信号) が - Cスタイルの二重引用符で囲まれた string として生成されます。
- string データ型をもつ信号の既定のバッファー サイズは 256 バイト (最大 255 の 8 ビット ASCII 文字) です。バッファー サイズを変更するには、動的サイズ文字列のバッファー サイズ (バイト) (Simulink Coder)コンフィギュレーション パラメーターを使用します。 
- 各 string 信号のモデル全体の設定をオーバーライドするには、 - stringtype(N)を信号のデータ型として使用します。このデータ型をもつ信号には、生成された- Cコードの- N+1バイトのバッファーが割り当てられます (N 文字に 1 つの null 終端を追加)。
- シミュレーションと動的動作が同じ - std::stringオブジェクトとして string が保存される場合、シミュレーションと生成された- C++コードの間に違いはありません。
C++ コードの生成 String ライブラリ
C++ コード生成には、Embedded Coder™ のライセンスをもつ ERT ベースのターゲット用に std::string ライブラリが提供されています。詳細については、Generate Code for String Blocks by Using the Standard C++ String Library (Embedded Coder)を参照してください。
string データ型の変換
string データ型と他のデータ型の間の変換は、Data Type Conversion ブロックを使用して実行することはできません。代わりに、次の文字列変換ブロックを使用します。
| 変換 | ブロック | 
|---|---|
| string 信号を ASCII 文字を保持して uint8 ベクトル信号に | |
| uint8 ベクトル信号を string 信号に | |
| string 信号を数値信号 double データ型に | |
| string 信号を数値信号 single データ型に | |
| string 信号を列挙型信号データ型に | |
| 入力信号を string 信号に | 
string を ASCII に変換してから string に戻す
- 次のブロックをモデルに追加します。 - String Constant 
- String to ASCII 
- ASCII to String 
- 2 つの Display ブロック 
 
- ブロックを次のように接続します。  
- String Constant ブロックで、string として - "Hello!"と入力します。
- String to ASCII ブロックで、string の最大サイズを 10 に変更します。 
- モデルをシミュレートし、Display ブロックの内容を確認します。 - Display1 に、対応する ASCII に変換された - Hello!の値が表示されます。たとえば、- 72は- Hに対応する ASCII の値で、- 33は- !に対応する ASCII の値です。
- Display1 で、string の最大長である 10 までの残りのスペースが 0 (null 文字) で埋められます。 
- Display に、ASCII to String ブロックで ASCII コードから string に再変換された後の - Hello!が表示されます。 
 
string を列挙データ型に変換する
- 次のブロックをモデルに追加します。 - String Constant 
- String to Enum 
- Display 
 
- ブロックを次のように接続します。  
- String Constant ブロックで、 - "Hello!"などの string を入力します。
- 次のように、 - BasicStringsという名前の Simulink 列挙型クラスを作成し、- BasicStrings.mというファイル名で現在のフォルダーに保存します。- classdef BasicStrings < Simulink.IntEnumType enumeration Hello(0) Red(1) Blue(2) end end
- String to Enum ブロックで、列挙型クラスを - Enum: BasicStringsと入力します。
- モデルをシミュレートし、Display ブロックの内容を確認します。  
座標データの表示と抽出
この例では、Compose String ブロックと Scan String ブロックを使用して、一連のデータを地理座標として書式設定して出力する方法を示します。Compose String ブロックと Scan String ブロックは、C の関数の scanf と printf に基づいており、概念的には関数 sprintf と関数 sscanf に似ています。主な違いは、それらの関数では配列を操作するのに対し、これらのブロックでは配列を操作しないことです。string ブロックの書式設定済み文字の詳細については、Compose String および Scan String を参照してください。
Compose String ブロックは、複数の string 入力と数値入力の組み合わせから string を構成します。[形式] パラメーターを使用して、入力ごとの出力を書式設定します。入力ごとに書式演算子が 1 つ対応します。各書式演算子はパーセント記号 % で始まり、その後に変換文字が続きます。たとえば %f は固定小数点出力を生成します。string 出力の補足として、出力に表示する追加の文字を書式仕様に加えることもできます。 
- 次のブロックをモデルに追加します。 - 6 つの Constant 
- 1 つの Compose String 
- 1 つの Scan String 
- 7 つの Display 
 
- Constant ブロックの定数値を次のように変更してブロックを接続します。  
- Compose String ブロックの [書式設定] パラメーターで、書式仕様を次のように入力します。 - '%g° %g'' %f" N, %g° %g'' %f" W' - 書式演算子の - %gと- %fは、数値入力を浮動小数点値に変換します。- %gは- %fをコンパクトにしたバージョンです。
- 度記号 (°)、N、W、および - 'は、出力 string に表示する補足文字列です。
 - Compose String ブロックは、出力を入力順に結合し、各入力を書式演算子に基づいて書式設定し、補足文字列を追加して、string を出力します。string は指定どおり書式設定されるとともに二重引用符 ( - ") で囲まれます。
- Scan String ブロックの [書式設定] パラメーターで、書式仕様を次のように入力します。 - '%g° %g'' %f" N, %g° %g'' %f" W' - 書式演算子の - %gと- %fは、数値入力を浮動小数点値に変換します。- %gは- %fをコンパクトにしたバージョンです。
- 度記号 (°)、N、W、および - 'は、出力 string に表示する補足文字列です。
 - Scan String ブロックは、入力を読み取り、変換仕様で指定された書式に従って変換して、その結果をスカラーとして返します。このブロックは、各出力を変換仕様に従って書式設定します。変換指定子の直前または直後にある指定テキストは無視されます。  
string 内のパターンの検出
string 内でパターンを検出するには、String Find ブロックを使用します。
- 次のブロックをモデルに追加します。 - 2 つの String Constant 
- String Find 
- 1 つの Display 
 
- ブロックを次のように接続します。  
- 1 つ目の String Constant ブロックで、 - "Hello!Goodbye!"などのstring を入力します。- このブロックを String Find ブロックの str 入力端子に接続すると、この string 内から String Find ブロックでパターンが検索されます。 
- 2 つ目の String Constant ブロックで、 - "Goodbye!"など、最初の String Constant の string 内から検索する string (またはパターン) を 入力します。- このブロックを String Find ブロックの sub 入力端子に接続すると、このパターンが str の入力から検索されます。 
- モデルをシミュレートし、Display ブロックの内容を確認します。この例では、ブロックに文字 - Gの位置である- 7が表示されます。 
string の抽出
ソース string から string を抽出するには、Substring ブロックを使用します。この例では、string 内のパターンの検出 で説明したモデルを使用します。
- Substring ブロックをモデルに追加します。 
- Substring ブロックで、['idx' から末尾までの string を出力] パラメーターを選択します。このパラメーターを設定すると、idx 端子の入力の位置から string の末尾までの string が抽出されます。 
- 新しいブロックを次のように接続します。  
- モデルをシミュレートし、Display ブロックの内容を確認します。この例では、idx から string の末尾までを抽出した部分文字列である - "Goodbye!"が表示されます。 
キーワードの後に続くテキストの取得
この例では、Simulink の string ブロックを使用した基本的な string の操作を示します。
次のようなモデルをシミュレートします。

このモデルについて以下を確認します。
- String Constant ブロックを使用して、 - "beginning middle end"と- "middle"という 2 つの string を作成します。
- 最初に出現する - "middle"を探し (idx)、最初の文字の位置 (- 11) を- "middle"の長さに加えます (- 7)。これには String Find ブロックと String Length ブロックを使用します。
- "beginning middle end"から、- "middle"の末尾以降の部分文字列 (- idx+string length = 18) である string- "end"を抽出します。これには Substring ブロックを使用します。
- "end"の計算された値を実際の string- "end"と比較します。この戻り値はブール値- "1"になります。これには String Constant ブロックと String Compare ブロックを使用します。
- ブール値 - "1"を対応する string の- "true"に変換します。これには To String ブロックを使用します。
モデル全体で文字の位置を表示するには、String Find ブロックと String Length ブロックの出力のそれぞれに Display ブロックを 1 つずつ追加して、シミュレーションを実行します。

string を使用するための既存モデルの変更
新しいモデルで string を使用するのに加え、既存のモデルを更新して string を使用できます。string を使用すると、モデルが簡素化されて、理解しやすくなります。
たとえば、古いモデルでは、列挙データ型を使用して、モデルでテキストを表したり、渡したりする場合がありました。フォールトトレラント燃料制御システムのモデル化のモデル例 sldemo_fuelsys では、複数の領域に定数を列挙してテキスト データと操作します。
sldemo_fuelsys/fuel_rate_control/control_logic では、Stateflow チャートは列挙型データを使用して燃料レベルを示します。


sldemo_fuelsys/fuel_rate_control/airflow_calc では、燃料が少ないかどうか検出するには、モデルで Enumerated Constant  ブロックと Relational Operator ブロックを使用します。 

ただし、次を設定して、String Constant ブロックおよび String Compare ブロックを使用できます。
- String Constant の [文字列] パラメーターを - LOWに設定する。
- String Compare ブロックを使用して、 - LOWがモデルの別の部分からのものかどうかを検出する。
列挙型の定数のすべてのインスタンスを削除するのではなく、列挙型の定数と一緒に string を使用できます。この方法では、string を使用するようモデルを徐々に移行できます。sldemo_fuelsys/fuel_rate_control/fuel_calc/feedforward_fuel_rate では、Multiport Switch ブロックは 4 つの列挙型データ入力を受け入れます。

[fuel_mode] 端子が string を出力している場合、その string を列挙データ型に変換して、このモデル内の Constant ブロックから出力を使用できます。

NMEA GPS テキスト メッセージの解析
この例では、Simulink® string ブロックを使用して NMEA GPS 形式のテキスト メッセージを解析する方法を説明します。
概要
このモデルは、Simulink® で提供される string データ型とブロックを使用して入力テキスト メッセージを読み取り、数値およびテキスト データを抽出する方法を示しています。

メッセージ ヘッダーの読み取りと列挙値への変換
Simulink には、string を対応する列挙値に変換する String To Enum ブロックが用意されています。このモデルでは、ヘッダー文字列 "RMB" が NMEASentence.RMB に変換されます。

Scan String ブロックを使用したテキスト メッセージの解析
テキスト メッセージを解析する 1 つの方法は、Scan String ブロックを使用することです。これは、C および MATLAB® の関数 sscanf と同様に動作します。

固定フィールド幅のテキスト メッセージの解析
テキスト メッセージに各データ フィールドの固定幅がある場合、Simulink はインデックス別の string を分割するブロックを提供します。string が分割された後、各フィールドを個別に処理できます。

Simulink の string の制限
以下の機能は現在サポートされていません。
| カテゴリ | 制限の説明 | 回避方法 | 
|---|---|---|
| string 配列 | string 配列はサポートされません。 | string はスカラーとしてのみ使用します。 | 
| Unicode 文字 | Simulink の string では、Unicode セット全体はサポートされません。 | Simulink の string では、ISO/IEC 8859-1 文字セットの 256 文字 (Basic Latin と Latin-1 Supplement) がサポートされます。これらの文字は Unicode の最初の 256 のコード ポイントです。 | 
| MATLAB S-Function | このブロックで作成したカスタム ブロックでは、string はサポートされません。 | — | 
| Constant, Initial Condition | これらのブロックは string では機能しません。 | String Constant ブロックを使用します。 | 
| Switch ブロック、Multiport Switch ブロック、Switch Case ブロック、If ブロックの制御入力 | Switch ブロックの制御入力は string を受け入れません。 | これらのブロックのデータ入力を使用します。 | 
| 
 | 
 | — | 
| 
 | 
 
 | — | 
| Data Type Conversion ブロック | string への変換や string からの変換に Data Type Conversion ブロックは使用しないでください。 | 文字列変換ブロックを使用します。 | 
| To File ブロック | To File ブロックを使用して string を読み込みます。 | — | 
| Scope ブロック、Spectrum Analyzer ブロック、ロジック アナライザー アプリ | Scope ブロック、Spectrum Analyzer ブロック、およびロジック アナライザー アプリでは、string は表示されません。 | Display、Simulation Data Inspector、または Sequence Viewer を Stateflow で使用します。 | 
| 初期値または初期条件パラメーター | Delay や Data Store Memory などのブロックの初期値または初期条件パラメーターは、string 値を受け入れません。 | 初期値または初期条件を既定値 ( | 
参考
ブロック
- Compose String | Scan String | String Compare | String Concatenate | String Constant | String Find | String Length | String to Double | String to Single | String to Enum | String to ASCII | Substring | To String