Stateflow API を使用したチャートの作成
この例では、Stateflow アプリケーション プログラミング インターフェイス (API) を使用して Stateflow® チャートを作成する方法を説明します。Stateflow API は、MATLAB® コマンドを使用して Stateflow チャートを作成または変更するためのツールです。詳細については、Stateflow API の概要を参照してください。
Stateflow チャートの作成
次の Stateflow チャートは半波整流器の基礎となるロジックを示しています。チャートには On
と Off
というラベルの 2 つのステートが含まれています。On
ステートでは、チャートの出力信号 y
が入力 x
と等しくなっています。Off
ステートでは、出力信号がゼロに設定されます。何らかのしきい値 t0
を入力信号が横切ると、チャートはこれらのステート間で遷移します。各ステートのアクションにより、シミュレーションのタイム ステップごとに y
の値が更新されます。
このチャートのシミュレーションの詳細については、Stateflow チャートの作成と実行を参照してください。
1. 空の Stateflow Chart ブロックが含まれる rectify
という Simulink® モデルを作成します。
sfnew rectify
2.関数find
を呼び出して、モデル内のチャートに対応する Stateflow.Chart
オブジェクトにアクセスします。関数sfroot
を使用して Simulink.Root
オブジェクトにアクセスします。このオブジェクトは Stateflow API にあるすべてのオブジェクトの親です。
ch = find(sfroot,"-isa","Stateflow.Chart", ... Path="rectify/Chart");
3. 関数view
を呼び出して、Stateflow エディターでチャートを開きます。
view(ch);
4. チャートの ActionLanguage
プロパティを変更してアクション言語を変更します。
ch.ActionLanguage = "C";
ステートの追加
Stateflow API オブジェクトを親オブジェクトの子として作成するには、子オブジェクトを作成する関数の入力引数として親オブジェクトを使用します。詳細については、Stateflow オブジェクトの作成と削除を参照してください。
1. 関数Stateflow.State
を呼び出して、ステートをチャートに追加します。
s1 = Stateflow.State(ch);
2.ステートに対応する State
オブジェクトの Position
プロパティを変更して、ステートの位置を調整します。新しい位置を 4 要素のベクトルとして指定します。最初の 2 つの値はステートの左上隅の "(x,y)" 座標で、最後の 2 つの値はステートの幅と高さです。
s1.Position = [30 30 90 60];
3. ステートと遷移のラベルのプログラムによる指定の説明に従って、LabelString
プロパティを変更し、ステートの名前とラベルを指定します。
s1.LabelString = "On"+newline+"y = x;";
4. 2 番目のステートを作成します。位置を調整して、名前とラベルを指定します。
s2 = Stateflow.State(ch); s2.Position = [230 30 90 60]; s2.LabelString = "Off"+newline+"y = 0;";
遷移の追加
遷移を追加するには、Source
プロパティと Destination
プロパティを変更して、遷移元と遷移先を指定します。デフォルト遷移については、遷移先は指定しますが、遷移元は指定しません。
1. 関数Stateflow.Transition
を呼び出して、遷移をチャートに追加します。
t1 = Stateflow.Transition(ch);
2.遷移元と遷移先を設定します。
t1.Source = s1; t1.Destination = s2;
3. SourceOClock
プロパティを変更して、遷移の位置を調整します。
t1.SourceOClock = 2.1;
4. LabelString
プロパティと LabelPosition
プロパティを変更して、遷移ラベルとその位置を指定します。
t1.LabelString = "[x<t0]";
t1.LabelPosition= [159 23 31 16];
5. 2 番目の遷移を作成します。遷移元、遷移先、ラベルを指定します。
t2 = Stateflow.Transition(ch);
t2.Source = s2;
t2.Destination = s1;
t2.SourceOClock = 8.1;
t2.LabelString = "[x>=t0]";
t2.LabelPosition= [155 81 38 16];
6. ステート On
へのデフォルト遷移を追加します。垂直方向の遷移を作成するには、SourceEndpoint
プロパティと Midpoint
プロパティの値を変更します。詳細については、デフォルト遷移の追加を参照してください。
t0 = Stateflow.Transition(ch); t0.Destination = s1; t0.DestinationOClock = 0; t0.SourceEndpoint = t0.DestinationEndpoint-[0 30]; t0.Midpoint = t0.DestinationEndpoint-[0 15];
データの追加
チャートをシミュレートできるようにするには、チャート内で使用するデータ シンボルをそれぞれ定義し、スコープとタイプを指定する必要があります。
1. 関数Stateflow.Data
を呼び出して、チャートへの入力を表すデータ オブジェクトを追加します。
x = Stateflow.Data(ch);
2.データ オブジェクトの名前を x
、スコープを Input
にそれぞれ指定します。
x.Name = "x"; x.Scope = "Input";
3. 入力 x
の型を double
に指定するには、Props.Type.Method
プロパティを Built-in
に設定します。既定の組み込みデータ型は double
です。
x.Props.Type.Method = "Built-in";
x.DataType
ans = 'double'
4. チャートの出力を表すデータ オブジェクトを追加します。名前を y
、スコープを Output
にそれぞれ指定します。
y = Stateflow.Data(ch); y.Name = "y"; y.Scope = "Output";
5. 出力 y の型を single
に指定するには、Props.Type.Method
プロパティを Built-in
、DataType
プロパティを single
にそれぞれ設定します。
y.Props.Type.Method = "Built-in"; y.DataType = "single"; y.DataType
ans = 'single'
6. チャートの遷移しきい値を表すデータ オブジェクトを追加します。名前を t0
、スコープを Constant
にそれぞれ指定します。初期値を 0
に設定します。
t0 = Stateflow.Data(ch); t0.Name = "t0"; t0.Scope = "Constant"; t0.Props.InitialValue = "0";
7. しきい値 t0
のデータ型を固定小数点に指定するには、Props.Type.Method
プロパティを Fixed-point
に設定します。その後、固定小数点データに適用する Props.Type
プロパティの値を指定します。
t0.Props.Type.Method = "Fixed point"; t0.Props.Type.Signed = true; t0.Props.Type.WordLength = "5"; t0.Props.Type.Fixpt.ScalingMode = "Binary point"; t0.Props.Type.Fixpt.FractionLength = "2"; t0.DataType
ans = 'fixdt(1,5,2)'
チャートの保存とシミュレーション
完成したチャートが含まれるモデルを保存するには、関数sfsave
を呼び出します。
sfsave
チャートをシミュレートするには、入出力端子を使用して、チャートを Simulink モデル内の他のブロックに接続します。
詳細については、モデルのシミュレーションを参照してください。