Simulinkによるモデルベース開発を行う場合、大体の場合はセットでStateflowも使われるんじゃないでしょうか。
このStateflowに対してもSimulinkのようにMATLABのスクリプトでいろいろできるのですが、Simulinkとは若干違う手段が必要となります。
Simulinkに対しては良くスクリプトを使うんですが、Stateflowの操作って忘れたころにしかしないので毎回忘れちゃうんですよねぇ。
ということで自分への備忘録も兼ねて基本的なことと、ちょっとしたサンプルコードを書いてみようかと思います。
Stateflowのスクリプト基本
Stateflowの操作はStateflowの各オブジェクトが持つメソッドとプロパティを使ってやりたいことを実現します。
とりあえず複雑に考えず、VBAみたいなものを考えてもらえればOKではないかと。
Stateflowのオブジェクトあれこれ
Stateflowはこんな感じのオブジェクトを持っています。
※ヘルプから抜粋
最上位にRootがあり、その下にMachineがあり。。。といった構造になってます。
各オブジェクトがどれに当たるか、イメージはこんな感じになります。
まずRoot。MATLAB自体という感じでしょうか。
MachineはSimulinkモデルの最上位のイメージで、Chartはモデルに配置されているStateflowチャートです。
そしてchartの中にdata/state/transition/junctionなどのオブジェクトが存在します。
操作したいオブジェクトをどうにか取得することができれば、あとはプロパティを取得したり、その下に別のオブジェクトを付け加えたり、大体何とでもできてしまいます。
オブジェクトの取得方法
各オブジェクトにはfindというメソッドが備わっています。こいつを使って操作したいオブジェクトを取得します。
具体的に、今現在選択しているサブシステム(gcb)の中チャートを対象として、’sigA’というdataオブジェクトを検索し、その名前を’sigX’に変換するようなスクリプトを示してみたいと思います。
% rootオブジェクト
sfobj = sfroot;
% 'Path'プロパティの文字列がgcbと一致するchartオブジェクトを検索
chtObj = sfobj.find('-regexp', '-isa', 'Stateflow.Chart', '-and', 'Path', gcb);
% chartオブジェクト内の'sigA'という名前のdataオブジェクトを検索
dataObj = chtObj.find('-isa', 'Stateflow.Data', '-and', 'Name', 'sigA');
% 名前を'sigX'に変換
set(dataObj, 'Name', 'sigX');
Stateflowチャートを選択した状態で実行するとこのようにdataの名前が変わります。
今回は簡単なロジックだけでしたが、こんな感じでStateflowも色々とスクリプトで操作することが可能です。
その他ちょっとしたネタ
微妙に役に立つかもしれないことを2点ほど書いておきます。
オブジェクトが持ってるプロパティを知りたい!
オブジェクトがどんなプロパティを持っているか確認したいのであれば、ステートとかを選択した状態で
>> sfgco
と打つと、今選択しているオブジェクトが持っているプロパティがこんな感じで表示されます。
Simulinkブロック選択した状態で
>> get(gcbh)
とコマンド打つのと同じような感じです。
もっと色々知りたい!
ヘルプ見たら載ってるよ!と言いたいんですが、どうやってヘルプを調べたら良いのかということを調べるのに僕は苦労しました。。。
Stateflowってヘルプで検索してもスクリプト関連の情報にナカナカ辿り着けず。。。
そんな時は「Stateflow API」で検索してみてください。知りたいことだいたい出てきます。
ただ、日本語ありません。英語ダメダメ勢な僕には辛いっす。日本語対応頼んます!!
コメント