Matlab#Simulink StateFlowでFlowを作ってみよう_02

前回はMatlab SimulinkのStateflowの簡単操作に説明しました。今回はそれの続きです。Functionの作成・Subchart作成・同時実行・配列操作・Truch Tableなどについて説明します。まずここで前回のStateflow モデルダウンロードできます↓

https://github.com/soup01Threes/Simulink-/blob/main/stateflow_example1.zip

開くと、このようなモデルが出てきます。これは今回のStart-pointになります。

モデルをシミュレーションするとこんな感じになりますね。

スイッチがON側に行けば出力がONになります。

Function

最初は温度を判断するFunctionを作ると思います。StateflowのFunctionに関しては以下のLINKに説明がありまので、詳しく話しません。簡単にいいますと、

Stateflow® チャートにおける “グラフィカル関数” とは、制御フロー ロジックと反復ループの再利用に役立つグラフィカルな要素です。グラフィカル関数は、コネクティブ ジャンクションと遷移を使用するフロー チャートで作成します。グラフィカル関数は、ステートと遷移のアクションで呼び出すことができます。グラフィカル関数では、次のことが可能です。

つまり、Loop実行したり、Jump Conditionを制御したり、Codeの再利用したりには役に立つって感じかな?

https://jp.mathworks.com/help/stateflow/ug/graphical-functions-for-reusing-logic-patterns-and-iterative-loops.html#:~:text=A%20graphical%20function%20in%20a,actions%20of%20states%20and%20transitions.

最初にDownloadしたモデルを開いて、左のBarからGraphical functionをクリックします。

画面からこのようなが絵が出てきます。Flowの好きなところにおいてください。

まずFC_Temperature_isLow()というFunctionを作成します。

  1. functionを定義するときの予約語です。
  2. Return Valueです。
  3. Function名
  4. そのFunctionのパラメータ

次はFunctionの制御を定義します。

右クリック>Add Pattern in Function>Devision>If-Else。

そうすると、設定するPopupが出てきます。

もしPV<=160なら、Staus=1になります。逆に160より>=ならstatus=0になります。

それだけでFlowが自動作ってくれます。

では、次はDeviceのON/OFF制御するBlockに条件にFC_Temperature_isLow(in_PV)も成立したらDeviceをONします。もう条件はSwitchだけではなくなりました。

逆にDeviceをOFFするにも同じですね。

それで大体OKです。in_PVをInput Dataとして定義しましょう。

これでモデルの更新は完成です。ちなみにin_PVを調整するSlide Barも追加しました。

実際はこんな感じですね!

このモデルは以下のLinkでダウンロードできます↓

https://github.com/soup01Threes/Simulink-/blob/main/stateflow_example2.zip

Subchart追加

次はSubchartを追加します。別に全部も一枚のChartで書いてもいいですが、制御によって複雑になりますと、一枚のFlowでおいてるBlockの数が増えすぎて見辛くなる可能性もありますし、こうしたほうが機能で分けれます。

まずBarから一つのStateを追加します。

このStateをまとめたいStateを収めるように大きさを調整します。

右クリック>Subchartします。

そうすると、State_Devices_ONOFFにはState_Devices_OFFとState_Devices_ONの2つSub-stateが入っているとなります。あの2つのStateの色にも浅くなります。

Decomposition

Subchartも入れましたので、次はもう一つのSubchartを追加します。

State_FAN_Controlです。

そこでStateFlowの実行順番などを設定したいと思います。

右クリック>Decomposition>Parallel(AND)します。

そうすると2つのStateの点線になり、右上には1,2の小さいな数字が書いてる。これは実行順番です。いまだとState_Devices_ONOFF実行してからState_FAN_Controlを実行することになります。

もし順番変えたいのならExecution Order>番号を選んでください。

次はこのStae_FAN_ControlにもSubchart化します。

よし、これで準備OKです。

State_FAN_Control

これはState_FAN_ControlのStateです。

mode,out_VFDなどの新しい変数がいくつ追加されます。

最初にはStatic_FAN_modeを定義します。

右クリック>Add other Elements>Local Data

static_Fan_ModeをNameのところ入れ、OK。

次はout_VFD_Fan定義します。注意するのは配列は1-Baseのようです。Zero-basedがないのようです…?右クリック>Add Inputs & Outputs>Data Output To Simulinkします。

Nameはout_VFD_Fanにし、Sizeを-1から2にすれば配列になります。

Typeはdoubleにします。

あ、配列操作用のidxは定義まだしてません。Local Dataにします。

これでOKです。

更新されたモデルはこんな感じですね。

実際モデルをシミュレーションしたらこのような感じですね。

0.75と0の出力が入力のPVによって切り替えるようになります。

このモデルは以下のLinkでダウンロードできます↓

https://github.com/soup01Threes/Simulink-/blob/main/stateflow_example3.zip

State分岐

いままではState1からState2の切り替えを繰り返すだけです、もうひとつのStateを追加したいおと思います。

もう1つのStateを追加し、お互いにも切り替えるように設定しました。

State_FAN_Control_OffからModeによってState_FAN_Control_Hiに切り替える、とか。

新しいHi,Lo,Offなどのところも出てきますが、これからEnumというやり方で定義したいと思います。

Model Explorerをクリックします。

static_fan_modeとういう変数を選び、TypeのところにEnum:<class name>にします。

Enum:<…>のこの<>の中にTypeの名前を指定します。ここでudt_fan_modeにします。

MatlabのCommand Windowに戻り、edit udt_fan_mode。

該当するFileはないですが、作成しますか?って。Yesです。

以下のように定義します。

classdef(Enumeration) udt_fan_mode< Simulink.IntEnumType
    enumeration
        Off(0)
        Lo(1)
        Hi(2)
    end
end

このLinkでは詳しい説明が書いています↓

https://jp.mathworks.com/help/matlab/ref/classdef.html

次は先Stateで書いてたLo,Hi,Offをudt_fan_mode.Loなどに置き換えます。

(別にそのままLo,Hi,Offでもいいですが、どこのFileから定義するのはわかりつらいですので…)

TruthTable

次はTruthtableです。Linkには詳しい説明あります。

新しい真理値表を作成すると、仕様に従ってプログラミングして実行することができます。真理値表をプログラミングするには、条件、判定、アクションを追加します。

、だそうです。

https://jp.mathworks.com/help/stateflow/ug/programming-a-truth-table.html

BarのところにTruth tableを選びます。

追加されたら、このようなtruthtableが出てきます。

truthtableの名前はTable_Fan_Controlにし、パラメータはPVにします。

そのTruth tableを開くと、Condition TableとAction Tableがわかれています。Conditionはつまり条件定義でActionは動作で定義になります。

右クリックしAppend RowかCtrl+Shift+Rで新しいRowを追加します。

Descriptionはわかりやすいように記入し、Conditionは先パラメータとして入力してるPVで、もし<50ならCondition1、もしPV<120ならConditon2のように設定します。

Action Tableも同じの操作でRowを追加します。

ActionのコラムでAction1ならなにやる、Action2ならなにこれやるのような宣言をします。

そこで注意するのはmode先定義したudt_fan_mode値を与えています。

最後はまた一回上のCondition Tableに戻り、Condition成立したときどんな動作を起こるのかを設定します。赤枠のD1のところですね。

右クリック、Append Columnします。

そのように定義します。D1はCondition TableがTが入って、つまりD1はPV<50のときだけ、Trueになります。みなみに、-はFalseの意味です。Fに設定しても-に設定しても同じです。

そして一番したのACTIONS定義はどこのActionするかを定義します。

このA1,A2,A3は下にあるAction Tableに合わせています。

これはモデルのシミュレーション状態ですね。

0>0.75>1のようにPVによって変化するだとわかります。

以下のLinkでこのモデルダウンロードできます。

https://github.com/soup01Threes/Simulink-/blob/main/stateflow_example4.zip

Delay

最後はDelayを入れます。

このようなコマンドでOKです。

after(5,sec)

モデルはここでダウンロードできますー。

https://github.com/soup01Threes/Simulink-/blob/main/stateflow_example5.zip

はーい、お疲れ様です。

Footer_Basic

Please Support some devices for my blog

Amazon Gift List

Find ME

Twitter:@3threes2
Email:soup01threes*gmail.com (* to @)
YoutubeChannel:https://www.youtube.com/channel/UCQ3CHGAIXZAbeOC_9mjQiWQ

シェアする

  • このエントリーをはてなブックマークに追加

フォローする