Simulink のStateFlow第3話になります。
前回はSub-Systemなども作成しましたが、今回は他種類のFunction追加・Event・Historyなども使ってみようと思います。
前回のモデルはここでDownloadできます。
https://github.com/soup01Threes/Simulink-/blob/main/stateflow_example5.zip
Self-Transition
最初に追加したいのはSelf-Transitionです。私はこれを自己状態診断だと考えています。
もしFanが回ってるときにSensorがTrue>Falseになってしまったら、Spareの2番FANに切り替えたいと考えています。よくある普通のシステムです。
もうひとつのState Blockを追加します。
そしてFanの制御Logicを全部Coverできるように大きさを調整します。
右クリック>Group & Subchart>Subchartします。
そうすると、Fanの制御ロジックは一つのSub-Sytemとしてまとめされました。
次はState_FAN_Logicの縁側から別の縁側にひっばりましょう。
このようになります。自分のStateが自分の状態によって変化するのイメージです。
Trigger Conditionを設定します。
MFC_CheckFanConditions()というFunctionから、いまの回ってるFanがSensor問題あるかどうかをCheckします。Idx==1はいま運転してるのはMain FanかどうかをCheckするためです。つまり、MainFanが問題があるかどうかをCheckするプログラムですね。
次はそのTransitionがTriggerされたときの動作を設定しましょう。
もしMainFanが問題あれば、Idx==1のFanの出力を0し、Idxを2に変更します。
つまりSpare Fanに切り替えるんですね。
History Junction
スーパーステート内にヒストリ ジャンクションを配置すると、次にアクティブになるステートを判定する目的で、ステート アクティビティの履歴情報が使用されます。ヒストリ ジャンクションは、配置された階層のレベルに対してのみ適用されます。
https://jp.mathworks.com/help/stateflow/ug/history-junctions.html
次はHistory Junctionをいれます。この”H”を使うことによってStateの最後の状態が記憶できるようになり、次また同じState Triggerされたらその状態に戻すの感じ、ですね。
左のBar>History。
記憶したいSub-systemに入れればOKです。それだけです。
Matlab Function
Matlab Functionを追加します。
左のBarで”MATLAB function”をクリックします。
Status=MFC_CheckFanCondtions(Fan_mode,Sensor)だと定義サれましたが、
Statusは戻り値で、MFC_CheckFanCondtionsはそのFunction名。そして()はFunctionに渡すのパラメータになります。
Matlab Function定義終わったら、右クリック>Openします。
MatlabのEditor画面に戻ります。
StatusはどこのFunctionからの結果なのかを定義します。
ここではcheckFailure()からだと設定します。
checkFailure.mというFileを設定し、Statusをどう返すのかをプログラムします。
もしFanが走ってて、しかもSensorがTrueになれば、Faultです。のような簡単なScriptだけです。
In_SensorをInputとして定義します。
Size=2にして、配列になります。
In_Sensorにも配列のConstantと繋がります。
Constant Blockに配列設定する方法はこうになります。
Constant valueのところに[0,0]すればOKです。
Senorのトリガーは仮にスイッチと繋がります。
ONすればFanのSensorが問題ある、と。
こっちらは結果ですね。
Fan1のSensorがTrueになるとout_VFD_Fanの出力がシフトされますね。
Event
イベントを使用して、Stateflow® チャートや他の Simulink® サブシステム内でアクションをトリガーします、だそうです。私はほかのStateやモデル以外にいまの状態を示すことできる部品だと思っています・
https://jp.mathworks.com/help/stateflow/events.html
まずEvent Stateを追加します。
中にState_RunningというStateあり、更にState_Running_OKとState_Running_Warnが分けています。そしてState_Running_OKからState_Running_WarningにシフトするにはEvene_WarningというEventが発生してるときです。
次はもう1つのState、State_Stopを追加します。
State_RunningからState_StopへソフトするにはEvent_ESTOPが発生してるとき。
Junction
Eventのところは準備OKで、次はState_FAN_LogicのStateを修正します。
もしMainFanが問題出たら、Spare Fanに切り替えるだけでなく、Warning Eventもトリガーします。そしてSpareFanも問題出たら、ESTOP Eventをトリガーします。
左のところにJunctionを選びます。
最初で作ったSelf-TransitionのところにこのJunctionをInsertします。
次は分岐を作ります。説明が少し難しいので。以下のGIFを参考してください。
では分岐の条件はまずMainFanの状態をCheckし、FaultであればSpare にシフトするんですね。つまりいま赤線の条件です。
条件をCopy Pasteし、最初のSelf-Transitionのところに移動します。
次はFanが問題あって、そしてInd==1なら、つまりいまMainFanが運転しています。
そのときMainFanの出力を0にし、Idx=2でSpareFANを運転します。
そしてSend(Event_Warning,Warnings)でWarningsのEventを出力します。
よし、こんな感じですね。
次はもう一つの分岐を作ります。
Fanが問題あって、そしてIdx==1の条件が成立しなかったら、つまりSpareFANにはFaultになってると、判断します。
次はEventを追加します。
Modeling>Add Event。
名前はState_Warningで定義されたEventと同じの名前にしてください。
そしてEvent_ESTOPも同じような動作を。
よし、これでOK。
次に、Warningが発生してるときにWarningの状態を出力したいと考えています。
State_Running_Warnで右クリックし>Propertiesします。
Create output for monitoringのCheck Boxを入れ、Self activityを選び、OK。
モデルをコンパイラしたら、State_Running_Warnが増えています。
うん、ちゃんと考えてた通り動いていますね。Warningも出力されています。
Simulink Function
最後はSimulink Functionを使用し、このBlogを終わりたいと思っています。
左のSlide Bar>Simulink Function。
あ、ごの画面出すには右クリックしHide Nameを切り替えることができます。
Simulink Functionが追加されまして、?をところにFunctionの名前を入れます。
次はFunctionをダブルクリックします。
中に試して、Functionがトリガーしたら、いまのシミュレーションを停止します。のような動作をやります。
よし、これでOK!
結果はこうですー
SpareFanもFaultになったらシミュレーション止めるようになりました。
はいーお疲れ様です。