MATLABを1関数だけ実行するブロック
SimulinkからMATLAB関数を呼び出すのに、MATLAB Functionがありますが、たった1関数呼び出すためだけにMATLAB Functionブロックを使うには大げさで、可読性が悪くなっていやだなぁということがよくあります。
そういうわけで、MATLABを1関数だけ実行するブロックを作りました。見栄えにもこだわりました。

大まかな作り方とかライブラリブロック作成時の注意点とか
概要
このMATLAB Commandは、MATLABFunctionをマスク化して作成したものです。設定したMATLAB Commandの中身をMATLAB Functionのスクリプトに転写と、そのラッパー関数のcall〇〇〇を作成しています。

また、下記に記載しているプログラムの実装は、MATLAB関数の設定のマスクパラメーターのコールバック内で処理させています。このコールバックは、モデルのロード時、ブロックパラメーターを開く時、対象のパラメーターを変更させたときに、実行されます。(他にも実行される条件があったらすみません。)
mtree
単純にラッパー関数を作成といっても、ユーザーが入力した関数定義から出力や入力や定数を読み取らなくてはなりません。(この場合、出力はBとI、入力はA、定数は"descend")
このような構文解析に便利なのがmtreeという関数です。mtreeはMATLABコードの公式(試験的関数)のパーサー(構文解析プログラム)です。

mtreeで解析できる出力引数と入力引数、関数名などから、wrapper関数が作れます。さらに、その対象の文字列の位置も取得できるので、対象の文字に対してアイコンの色付け設定まで容易?に、作成できます。

MATLAB Functionオブジェクト(Stateflowオブジェクト取得)
構文を解析して作成したMATLAB Scriptの文字列を自身のMATLAB Functionブロックのスクリプトにコピーするには、こちらのように、自身のブロックオブジェクトからStateflowオブジェクト(MATLAB Functionのクラス名はStateflow.EMChart)を取得し、こちらのScriptプロパティの書き換えで可能です。

関数の概要のヘルプ取得
どのような関数が呼ばれているのか、その概要を簡単にブロック設定ダイアログ内に記載したいと思いました。

こんな感じのコードを書くと、help関数で取得できるテキストの各要素が細分化されている形で取得することができます。先ほどのブロック設定の例では、こちらのPurposeとDescriptionの値の内容を結合して表示しています。
(こちらの関数は、help関数の生コードを参考に使用しています。)

MATLAB関数のヘルプなど、ブロック設定を変更しなくとも値が変わる可能性があります。このようなパラメーターは保存しないマスクパラメーターに一時保存させるのが良いです。保存させると他のライブラリーモデルなどにブロックをコピーなどした場合、不具合のもとになります。

入出力ポート数が変わるライブラリブロック
今回のMATLAB Functionのように、設定によりブロックの入出力が変わるブロックは、ライブラリリンクを'none'にしないと、モデルを開きなおしたときなど信号線が切れたりするので、リンクはOFFにしないといけません(この仕様困る)。CopyFcnのコールバックを使用して、コピー時にnoneにする必要があります。

おまけ
作成したMATLAB Commandブロックのダウンロードリンク張っておきました。
※ このファイルの利用により生じたいかなる損害についても、作者は一切の責任を負いません。
https://drive.google.com/file/d/1Hj-reBNTyDEUjpPKwOeTPUMtibyQWQKm/view?usp=drive_link
入力キーワードとしてp1,p2,...p10を入力すると、パラメーターとして入力ができるとかもしています。
