MATLABでマスクを使ってSimulinkをスッキリさせる

# はじめに 
この記事ではMatlabのSimscape electricalで回路モデル＋制御モデルを作る際に
他の人が見てもわかりやすく表示する方法を紹介します。

本記事のターゲット：
電気回路を回路シミュレータを用いて設計していて、
かつ他人とモデルを共用しながら開発を進めている人

# そもそも　Simscape electrical って？

Matlabに付属している電気回路シミュレータです。一般に電気回路シミュレータというと
以下の日本パワーエレクトロニクス協会が推奨しているPSimが一般的でしょうか？
他にも Simplorer や　SCALE　とかが有名ですかね？

https://pwel.jp/

ここで前座として、MatlabとPSimを比較してMatlabの良さを語ってみましょう。
（全て筆者の主観です）

| 項目 | PSim | Simscape electrical(Matlab) |
|:-----------|:------------:|:------------:|
| 使いやすさ       |◎        |◎　         |
| 回路特有の計算<br>（力率や高調波計算など）       |◎<br>       |△<br>（自作ソフト必要）       |
| 回路の動作容易性     |◎      |△<br>(代数ループでハマる人が多い）       |
| 損失計算       |◎<br>（得意)        |△　<br>(現在発展中？)         |
| 制御系設計       | △<br>（頑張ればできる)        |◎　<br>(ツールボックスあり)         |
| 変更容易性       | △<br>（回路を移動させると結線が切れる　<br> Shift押せばいいけど面倒）        | ○　<br>(移動させやすい)         |
| 変数の変更    | △<br> (モデルコピー時、元モデルの設定ファイルを参照していて<br>共同開発するとコンフリクトし易い)     | ○ <br> (モデルをコピーすれば独立する)|
| パラスタ計算         | △<br> バッチファイル必要　<br> 30変数までらしい         | ◎　<br>for ループ使ってHDDの限界まで           |

てなかんじで、まずなんか作って動かそうぜ！って方向なら圧倒的にPSim、長期的に制御をしっかり組んで改良しつつ、過渡特性やパラスタするならMatlabに軍配があがるような気がします。一長一短ですが、個人的にはMatlabのほうが好きです。


# モデル共用時の問題定義
さて、本題に戻ります。以下にSimscape electrical で作った昇圧コンバータの図を提示します。
こちらのモデルは、入力電圧を　$\frac{Vout-Vin}{Vout}$のDutyで動作させ昇圧する回路です。

あなたが共同開発者として、このモデルを渡された場合、どういうことを思いますか？

![昇圧コンバータ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915299/b65bbbd7-b5aa-6305-9411-c63f7a41768d.jpeg)

私は多分こんなことを考えます。（他の人から見たらもっと違う意見もあるかもしれません）

・アルゴリズムは正しく実装されているか？
・どれが重要なパラメータ（変数）なのか？定数なのか？

こういうモデルをもらった場合、まずはアルゴリズムの確認と、すべての変数の確認から入ります。一個一個ダブルクリックして確認していくしかないのですが、大体もらうモデルはこんな簡素な形ではないため、変数と定数を探すだけでも一苦労となります。
図を見てパッとわかれば、受け取る側にも優しいですし、将来の自分が見直すときも時間短縮になると思います。
もちろん一人で開発が完結するなら、好きに作ってしまえばいいと思います。

![昇圧コンバータ２.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915299/22fa6cae-2709-3176-b093-452d4ead15db.jpeg)

# マスクを使った解決策
上記の可読性を上げる手法として２点紹介したいと思います。

１、プロパティを使った変数の表示
プロパティのブロック注釈を使うと変数を表示することができます。例を下に示します。
一度設定すれば変数値を変えても追従してくれるのでありがたいですね。

![property.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915299/5df81444-0735-9a8f-f27e-041c4b9dff6d.gif)


２、マスクを使った変数の統合
下図の例では、マスクを使って電流センサとGotoとToWorkspace(大体計測する箇所はログを取りたくなる箇所なので）を一体化させています。
プロモートを使うと、Gotoの変数名とToWorkSpaceの変数名を同一にできるので便利です。１点、Gifアニメに入れ忘れましたが、マスク内のGotoはローカルとみなされるため、タグの可視性をGlobalに変更し、Globalで見えるようにする必要があります。

![property2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915299/5b5dbf4e-4195-22c5-721f-7c9ed447cc85.gif)

![Gotoブロックの整理.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915299/72f4d701-b768-3d74-4166-0acd951cb776.jpeg)



# 終わりに

以上を色々と応用して整理すると下記の形になります。
ダブルクリックをしなくても色々と変数名や変数値が可視化できるようになり、可読性が少しは上がったのではないでしょうか？

![最終的な昇圧回路.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915299/e09bd083-1fc4-d734-fed8-774553b108da.jpeg)


この記事を題材に、わかりやすいモデルについてご意見いただけると幸いです。
他の皆さんのように、すごいMatlab芸とかは一切できません！なのにアドベントカレンダーに突撃してすみませんでした。



# 補足
<details><summary>最近思うこと</summary><div>


最近いろんな方とお仕事させていただいて、①までが重要な仕事と考え、②の仕事を見下し一切しない方が増えてきたように思えます。相手方にも努力して理解頂くのは必要なのですが、相手側の都合(他の分野の仕事などもあるなど）も考えず、わからない奴がだめなんだとか、ぐちゃぐちゃのモデルを渡して動くモデルを作ったからあとはお前らの仕事だ。という仕事の仕方をするのはいかがなものかと思います。

私自身としては、②まではなんとかできるよう、自身が理解したことを噛み砕いて分かりやすく伝えていければと思い、上記のような記事を書かさせていただきました。色々とご意見・ご指摘はあるかと思いますが、もっとこうすれば分かりやすくなるよ、など情報いただければ幸いです。

また③までできるMatlab教祖様がいらっしゃいましたら、ご連絡ください。入信します。

![お仕事の姿.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915299/67a12daa-9604-04e1-c94f-964976ac1728.jpeg)

</div></details>