前回は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の再利用したりには役に立つって感じかな?
最初にDownloadしたモデルを開いて、左のBarからGraphical functionをクリックします。
画面からこのようなが絵が出てきます。Flowの好きなところにおいてください。
まずFC_Temperature_isLow()というFunctionを作成します。
- functionを定義するときの予約語です。
- Return Valueです。
- Function名
- その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
はーい、お疲れ様です。