Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

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 変数は、ベース ワークスペース、モデル ワークスペース、およびマスク ワークスペースで設定できます。

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 信号に変換します。

ASCII to String

Format パラメーターと入力信号に基づいて出力 string 信号を構成します。

Compose String

入力 string をスキャンし、Format パラメーターで指定された形式によって信号に変換します。

Scan String

2 つの入力 string を比較します。

String Compare

複数の入力 string を連結して 1 つの出力 string を形成します。

String Concatenate

String パラメーターで指定された string を出力します。

String Constant

テキスト文字列 str 中で最初に出現するパターン string sub のインデックスを返します。

String Find

入力 string の文字数を出力します。

String Length

string 信号を uint8 ベクトルに変換します。

String to ASCII

string 信号を double 信号に変換します。

String to Double

string 信号を single 信号に変換します。

String to Single

入力 string を列挙型信号に変換します。

String to Enum

string 信号から部分文字列を抽出します。

Substring

入力信号を string 信号に変換します。

To String

string は Simulink の次のブロックでサポートされます。

ブロックメモ

Bus Assignment

非バーチャルとバーチャル。

Bus Creator

非バーチャルとバーチャル。

Bus Selector

非バーチャルとバーチャル。

Data Store Memory

Data Store Read

Data Store Write

Data Type Duplicate

Display

string を二重引用符で囲んで表示します。

From

From Workspace

データの内挿はサポートされません。

Goto

Ground

グラウンド値は "" (空の string) です。

In Bus Element

ルート レベルを含みます。

Inport

ルート レベルを含みます。

Manual Variant Sink

Manual Variant Source

Manual Switch

数値型と string 型の混在は含まれません。string が複数ある場合、ブロックではサイズが最大の string か動的な string を使用します。

MATLAB Function

Merge

Model

Multiport Switch

数値型と string 型の混在は含まれません。string が複数ある場合、ブロックではサイズが最大の string か動的な string を使用します。

Out Bus Element

ルート レベルを含みます。

Outport

ルート レベルを含みます。

Probe

Signal Editor

データの内挿はサポートされません。

Signal Specification

Subsystem (すべてのバリエーション)

Switch

数値型と string 型の混在は含まれません。string が複数ある場合、ブロックではサイズが最大の string か動的な string を使用します。

Terminate Function

Terminator

Variant Source

Variant Model

Variant Subsystem

Width

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 を使用して作成することもできます。

  • 関数 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 ベクトル信号に

String to ASCII

uint8 ベクトル信号を string 信号に

ASCII to String

string 信号を数値信号 double データ型に

String to Double

string 信号を数値信号 single データ型に

String to Single

string 信号を列挙型信号データ型に

String to Enum

入力信号を string 信号に

To String

string を ASCII に変換してから string に戻す

  1. 次のブロックをモデルに追加します。

    • String Constant

    • String to ASCII

    • ASCII to String

    • 2 つの Display ブロック

  2. ブロックを次のように接続します。

  3. String Constant ブロックで、string として "Hello!" と入力します。

  4. String to ASCII ブロックで、string の最大サイズを 10 に変更します。

  5. モデルをシミュレートし、Display ブロックの内容を確認します。

    • Display1 に、対応する ASCII に変換された Hello! の値が表示されます。たとえば、72H に対応する ASCII の値で、33! に対応する ASCII の値です。

    • Display1 で、string の最大長である 10 までの残りのスペースが 0 (null 文字) で埋められます。

    • Display に、ASCII to String ブロックで ASCII コードから string に再変換された後の Hello! が表示されます。

string を列挙データ型に変換する

  1. 次のブロックをモデルに追加します。

    • String Constant

    • String to Enum

    • Display

  2. ブロックを次のように接続します。

  3. String Constant ブロックで、"Hello!" などの string を入力します。

  4. 次のように、BasicStrings という名前の Simulink 列挙型クラスを作成し、BasicStrings.m というファイル名で現在のフォルダーに保存します。

    classdef BasicStrings < Simulink.IntEnumType
    enumeration
        Hello(0)
        Red(1)
        Blue(2) 
        end
    end 
  5. String to Enum ブロックで、列挙型クラスを Enum: BasicStrings と入力します。

  6. モデルをシミュレートし、Display ブロックの内容を確認します。

座標データの表示と抽出

この例では、Compose String ブロックと Scan String ブロックを使用して、一連のデータを地理座標として書式設定して出力する方法を示します。Compose String ブロックと Scan String ブロックは、C の関数の scanfprintf に基づいており、概念的には関数 sprintf と関数 sscanf に似ています。主な違いは、それらの関数では配列を操作するのに対し、これらのブロックでは配列を操作しないことです。string ブロックの書式設定済み文字の詳細については、Compose String および Scan String を参照してください。

Compose String ブロックは、複数の string 入力と数値入力の組み合わせから string を構成します。[形式] パラメーターを使用して、入力ごとの出力を書式設定します。入力ごとに書式演算子が 1 つ対応します。各書式演算子はパーセント記号 % で始まり、その後に変換文字が続きます。たとえば %f は固定小数点出力を生成します。string 出力の補足として、出力に表示する追加の文字を書式仕様に加えることもできます。

  1. 次のブロックをモデルに追加します。

    • 6 つの Constant

    • 1 つの Compose String

    • 1 つの Scan String

    • 7 つの Display

  2. Constant ブロックの定数値を次のように変更してブロックを接続します。

  3. Compose String ブロックの [書式設定] パラメーターで、書式仕様を次のように入力します。

    '%g° %g'' %f" N, %g° %g'' %f" W'
    • 書式演算子の %g%f は、数値入力を浮動小数点値に変換します。%g%f をコンパクトにしたバージョンです。

    • 度記号 (°)、N、W、および ' は、出力 string に表示する補足文字列です。

    Compose String ブロックは、出力を入力順に結合し、各入力を書式演算子に基づいて書式設定し、補足文字列を追加して、string を出力します。string は指定どおり書式設定されるとともに二重引用符 (") で囲まれます。

  4. Scan String ブロックの [書式設定] パラメーターで、書式仕様を次のように入力します。

    '%g° %g'' %f" N, %g° %g'' %f" W'
    • 書式演算子の %g%f は、数値入力を浮動小数点値に変換します。%g%f をコンパクトにしたバージョンです。

    • 度記号 (°)、N、W、および ' は、出力 string に表示する補足文字列です。

    Scan String ブロックは、入力を読み取り、変換仕様で指定された書式に従って変換して、その結果をスカラーとして返します。このブロックは、各出力を変換仕様に従って書式設定します。変換指定子の直前または直後にある指定テキストは無視されます。

string 内のパターンの検出

string 内でパターンを検出するには、String Find ブロックを使用します。

  1. 次のブロックをモデルに追加します。

    • 2 つの String Constant

    • String Find

    • 1 つの Display

  2. ブロックを次のように接続します。

  3. 1 つ目の String Constant ブロックで、"Hello!Goodbye!" などのstring を入力します。

    このブロックを String Find ブロックの str 入力端子に接続すると、この string 内から String Find ブロックでパターンが検索されます。

  4. 2 つ目の String Constant ブロックで、"Goodbye!" など、最初の String Constant の string 内から検索する string (またはパターン) を 入力します。

    このブロックを String Find ブロックの sub 入力端子に接続すると、このパターンが str の入力から検索されます。

  5. モデルをシミュレートし、Display ブロックの内容を確認します。この例では、ブロックに文字 G の位置である 7 が表示されます。

string の抽出

ソース string から string を抽出するには、Substring ブロックを使用します。この例では、string 内のパターンの検出 で説明したモデルを使用します。

  1. Substring ブロックをモデルに追加します。

  2. Substring ブロックで、['idx' から末尾までの string を出力] パラメーターを選択します。このパラメーターを設定すると、idx 端子の入力の位置から string の末尾までの string が抽出されます。

  3. 新しいブロックを次のように接続します。

  4. モデルをシミュレートし、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 を受け入れません。

これらのブロックのデータ入力を使用します。

Simulink.Signal

Simulink.Signal オブジェクトは string をサポートしていません。

Simulink.Parameter

Simulink.Parameter オブジェクトは string をサポートしていますが、以下の制限があります。

  • string データ型の Simulink.Parameter オブジェクトでは、Simulink Coder™ ストレージ クラスとして AutoDefaultModel DefaultExportedGlobal、および ImportedExtern, ImportedExternPointer のみがサポートされています。

  • string データ型の Simulink.Parameter オブジェクトでは、関数 slexpr で生成された式はサポートされていません。

  • モデル ワークスペース内の string 値をもつ Simulink.Parameter オブジェクトはモデル引数として構成できません。

Data Type Conversion ブロック

string への変換や string からの変換に Data Type Conversion ブロックは使用しないでください。

文字列変換ブロックを使用します。

To File ブロック

To File ブロックを使用して string を読み込みます。

Scope ブロック、Spectrum Analyzer ブロック、ロジック アナライザー アプリ

Scope ブロック、Spectrum Analyzer ブロック、およびロジック アナライザー アプリでは、string は表示されません。

DisplaySimulation Data Inspector、または Sequence Viewer を Stateflow で使用します。

参考

ブロック

関数

関連するトピック