MATLAB / Simulink の使い方

■ インストール

ユーザー名、PC名、MACアドレス、を連絡
ファイルインストールキー: インストールで必要、メールに書かれて送られて来る、27123-52123-40123-13123-30123-32123
ライセンスファイル: アクティベーションで必要、license.lic
同じライセンスで複数のバージョンが使える

 

■ 新しいバージョンのためのライセンスファイル

https://jp.mathworks.com/licensecenter/licenses

my@email.com
MyPassword…

ライセンスを選択
インストールとアクティベーション
アクティベーションを実行してライセンスファイルを取得
ライセンスファイルを取得
リリース
ソフトウェアはインストールされていますか。いいえ
ライセンスファイルを電子メールで送信

ネットワークにある setup.exe から直接インストールする

 

■ 古いバージョンの削除

コントロールパネルのアプリケーションの追加と削除に MATLAB が無い場合
Windows のメニューを手動で削除
Program Files のそのバージョンのフォルダを削除

 

■ 起動

MATLAB 起動後、現在のフォルダを、今の作業フォルダに変更する
ワークスペースの保存]で matlab.mat をそのフォルダに保存する

Simulink 起動。[空のモデル]で新規作成する
[名前を付けて保存]でファイルを保存する。関数名のような名前を付ける。先頭に数字は不可。スペース不可
[ツール表示]、[ライブラリブラウザー]を起動。または[ライブラリブラウザー]ボタン

 

■ 必須マニュアル

 

■ モデル作成:簡単な回路計算を行う(直列RLC回路)

R・dq / dt + L・d2q / dt2 + 1/C・q(t) = v(t)

2階の微分方程式を、1階の微分方程式の連立、として書き直す(高次の微分方程式を1階の連立微分方程式に変換する)

dq / dt = i  (q は i の積分

L・di / dt = v(t) - R・i - 1/C・q(t)  (これは、 R・i + L・di / dt + 1/C・q(t) = v(t)  )

直列なので電流が共通。電流はインダクター電圧(x)を積分して L で割ったもの

x = v(t) - R・y - 1/C・integrator y

ここで、y = 1/L・integrator x  (=i)

3項を合計したものが x。積分して 1/L したものが y。

入力:Step

出力:Scope、Display

Integrator は、1回前の値を保持して、Sum(n) = Sum(n-1) + △ × dt を計算する

1自由度バネダンパー系の強制振動は、例えば、v(t) が F・cos ωt に置き換わる
k:バネ定数、m:質量、c:減衰係数
速度(v)と位置(x)が共通。速度を積分したものが位置
加速度(dv/dt)は3項(バネ、ダンパー、外力)を合計したもの

 

MATLAB / Simulink の英語マニュアル

ページ下に言語切替のボタンがある。日本語が表示されていれば「日本」ボタンを押せば、[Select Your Country]の画面が開く
https://www.mathworks.com/help/matlab/

 

■ グラフ作成

[プロット]タブ
ワークスペースより変数を選択する
上段のリボンより、表示するグラフを選ぶ

 

■ Switch の使い方

1番目の入力が通過する条件
 u2 ~= 0 :真ん中の入力が0でない

 

■ Multiport Switch の使い方

1番上が条件値
デフォルトでは、1番下がデフォルトの出力

 

■ Lookup Table の理解

入力と出力で特性値が与えられているとき、ルックアップテーブルが使える
テーブルデータがY軸(出力値)、ブレークポイント1がX軸(入力値)(2次や3次も可)、ブレークポイントのデータは単調増加でなければならない
ルックアップテーブルのテスト方法:
 時間軸0.0~1.0、シミュレーション(基本サンプル時間)0.01、ランプ関数入力勾配1.0

 

■ 【0割防止】の割り算と逆数の切り替え

常に必要

除算(=逆数を掛ける)、eps = 2.2204e-16

f:id:sato-7411:20200624103405p:plain

剰余

f:id:sato-7411:20200624103421p:plain

 

■ 時間計測

Discrete-Time Integrator
積分:前進型オイラー
ゲイン値:1
外部リセット:立ち上がり (但し、Memory が必要)
初期値:0

 

演算子特殊文字

MATLAB Operators and Special Characters
[] 配列、 {} セル配列、 () 配列中のインデックス
; 列要素の区切り、 , 行要素の区切り、 : インデックスの範囲

 

Windows SDK 7.1 インストール

GRMSDK_EN_DVD.iso: 32ビットOS用
GRMSDKX_EN_DVD.iso: 64ビットOS用

https://nashippe.blog/win/sdk7-error/
Microsoft Visual C++ 2010 x64 Redistributable, Microsoft Visual C++ 2010 x86 Redistributable をアンインストールする

https://qiita.com/makopo/items/b30709c22f6cf820e7fe
Setup フォルダの中の SDKSetup.exe を実行する

mex -setup

 

■ シミュレーションの実行中にパラメータを変更するにはどうするか

get_param(‘SomeModel/SomeConst’, ‘Value’)
set_param(‘SomeModel/SomeConst’, ‘Value’, ’1.0′)

サンプル時間が定数(inf)であるため、シミュレーションの実行中に ‘SomeModel/SomeConst’ のパラメータ ‘Value’ を変更できません。

Const を2つ (例えば、0、1、boolean)。Manual Switch で切り替える。

 

■ Stateflow の使い方

Simple Example
但し, condition (Input pot 1) と If_output (Output Port 1) が未接続なので Warning が出る

f:id:sato-7411:20200624103443p:plain

f:id:sato-7411:20200624103458p:plain

 

■ S-Function デバッグ
S-Function ベースサンプル:timestwo.c
1. Simulink を一旦閉じる
2. mex で同じビルド
3. 接続線に条件付きブレークポイントを追加
4. 時間 (Clock ブロック) の Display は long_e 表示
5. 最初の何回かは1ステップずつ進める

 

■ コード生成
シミュレーション
モデルコンフィギュレーション パラメータ
最適化
 信号とパラメーター
  コード生成
   既定のパラメーター動作:
    調整可能 … Constant の中に記述した変数がツールに現れる
    インライン, インライン不変 … Constant の中に記述した変数がツールに現れない
  (R2015aSP1 以前では, 調整可能の選択は無くて, インライン パラメーターのチェックを外す)

 

MATLAB の起動に時間がかかる
環境変数 MLM_LICENSE_FILE および LM_LICENSE_FILE に, ネットワークアドレスが設定されていると, ライセンスを探しに行って, MATLAB の起動に時間がかかる
MATLAB ライセンスの検索パス

f:id:sato-7411:20200723065305p:plain

 

■ ドイツで作られた *.mdl ファイルが, 現在の文字エンコードShift_JIS’で有効でない文字が含まれていて, 開けない
元のファイルを *.mdl_org のような名前でコピーしてバックアップ
*.mdl を Notepad++ で開いて, Encoding, Convert to ANSI, File, Save

 

Visual Studio C#MATLAB を制御する
参照の追加
COM
Matlab Application (Version 9.5) Type Library にチェック
MATLAB をインストールすると現れる

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        MLApp.MLApp matlab;

        private void button1_Click(object sender, EventArgs e)
        {
            // MATLAB Execiute
            // タスクマネージャーを確認し, バックグランドで Matlab が起動していたら, 終了させること
            // 引数を渡すときは Feval を使う
            matlab = new MLApp.MLApp();
            matlab.Execute(@”cd c:\temp\exampe”);
            matlab.Execute(@”load(‘Temp.mat’);”);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            // MATLAB Close
            if (matlab != null)
            {
                matlab.Quit();
                matlab = null;
            }
        }

 

MATLAB 変数の加工

データの結合 (k は複数に分けられた時系列データのインデックス)
if (k==0)
aSteer_dummy = [aSteer];
else
aSteer_dummy = vertcat(aSteer_dummy, aSteer);

名前を戻す
aSteer = [aSteer_dummy];

時間軸を付加し, ファイル保存
A = 0:0.005:(size(aSteer)-1)*0.005; aSteer = [A' aSteer];
A = 0:0.005:(size(bKillSw)-1)*0.005; bKillSw = [A' bKillSw];
A = 0:0.005:(size(pAir)-1)*0.005; pAir = [A' pAir];
A = 0:0.005:(size(pOil)-1)*0.005; pOil = [A' pOil];
save PatternData.mat aSteer bKillSw pAir pOil;

ここで ' は行列の転置
保存後は, matlab を削除するため, 一時的な変数を削除する必要が無い

C# で書くと, 以下のようになる
  foreach (string result in results)
  {
    string dummy = result + "_dummy";
    if (k == 0)
    {
      matlab.Execute(dummy + " = [" + result + "];");
    }
    else
    {
      matlab.Execute(dummy + " = vertcat(" + dummy + ", " + result + ");");
    }
  }
  string str = "save PatternData.mat ";
  foreach (string result in results)
  {
    string dummy = result + "_dummy";
    matlab.Execute(result + " = [" + dummy + "];");
    matlab.Execute(@"A = 0:0.005(size(" + result + @")-1)*0.005; " + result + @" = [A' " + result + @"];");
    str = str + result + " ";
  }
  str = str + ";";
  matlab.Execute(str);

 

MATLAB Coder, Simulink Coder で出力したCコードのデバッグ
コンパイラでビルドするとき最適化されるので, Simulink 画面のロジックがそのまま動作するわけではない
RTOS 上で実行するとき, 出力結果は合っているが, 途中の Relational Operator などが動作しないときがある
MATLAB 上で実行すると動作している