Stateflow API を使用したチャートの作成
この例では、Stateflow アプリケーション プログラミング インターフェイス (API) を使用して Stateflow® チャートを作成する方法を説明します。Stateflow API は、MATLAB® コマンドを使用して Stateflow チャートを作成または変更するためのツールです。詳細については、Stateflow API の概要を参照してください。
Stateflow チャートの作成
次の Stateflow チャートは半波整流器の基礎となるロジックを示しています。チャートには On と Off というラベルの 2 つのステートが含まれています。On ステートでは、チャートの出力信号 y が入力 x と等しくなっています。Off ステートでは、出力信号がゼロに設定されます。何らかのしきい値 t0 を入力信号が横切ると、チャートはこれらのステート間で遷移します。各ステートのアクションにより、シミュレーションのタイム ステップごとに y の値が更新されます。

このチャートのシミュレーションの詳細については、Create Stateflow Chartsを参照してください。
1. 空の Stateflow Chart ブロックが含まれる rectify という Simulink® モデルを作成します。
sfnew rectify2.関数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.DataTypeans = '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 モデル内の他のブロックに接続します。
1. モデルにソースを追加して接続します。
source = add_block("simulink/Sources/Sine Wave","rectify/Sine Wave"); set_param(source, ... SampleTime="0.2", ... Position=[-105 30 -75 60]); sourcePorts = get_param(source,"PortConnectivity"); chartPorts = get_param("rectify/Chart","PortConnectivity"); add_line("rectify",[sourcePorts(1).Position; chartPorts(1).Position]);
2.モデルにシンクを追加して接続します。
sink = add_block("simulink/Sinks/Scope","rectify/Scope"); set_param(sink, ... NumInputPorts="2", ... Position=[185 21 215 54]); sinkPorts = get_param(sink,"PortConnectivity"); add_line("rectify", [-25 45; -25 -10; 135 -10; 135 30; 180 30]); add_line("rectify",[chartPorts(2).Position; sinkPorts(2).Position]);

3. モデルのシミュレーションを実行します。
sim("rectify");4. Scope ブロックをダブルクリックします。スコープにチャートの入力信号と出力信号のグラフが表示されます。
