TwoInertiaSimulator
FRONT PAGE

コレは何?/What is this?

2慣性共振系を模擬するクラス。

使用例


     1 :	#include "Matrix.hh"
     2 :	#include "TwoInertiaSimulator.hh"
     3 :	
     4 :	void ControlFunctions::ControlFunction1(ControlFunctions* pCF){
     5 :	    // 制御用周期実行関数1
     6 :	    
     7 :	    // 制御用定数設定
     8 :	    const double Ts = ConstParams::SAMPLING_TIME[0]*1e-9;   // [s]      制御周期
     9 :	    const double Kt = 0.01; // [Nm/A]   トルク定数
    10 :	    const double Jm = 0.01; // [kgm^2]  モータ側慣性モーメント
    11 :	    const double Jl = 0.02; // [kgm^2]  負荷側慣性モーメント
    12 :	    const double Ks = 5;    // [Nm/rad] 2慣性間の剛性
    13 :	    const double Dm = 0.01;// [Nm/(rad/s)]  モータ側粘性
    14 :	    const double Dl = 0.001;// [Nm/(rad/s)] 負荷側粘性
    15 :	    const double Rg = 100;  // [-]  減速比
    16 :	    
    17 :	    // 制御用変数宣言
    18 :	    static double iqref = 0;
    19 :	    static double omega_m = 0;
    20 :	    static double omega_l = 0;
    21 :	    
    22 :	    // 制御器等々
    23 :	    static TwoInertiaSimulator* PlantSim1;
    24 :	    
    25 :	    if(pCF->CmdFlag==CTRL_INIT){
    26 :	        // 初期化モード (ここは制御開始時に1度だけ呼び出される(非実時間空間なので重い処理もOK))
    27 :	        PlantSim1 = new TwoInertiaSimulator(Kt,Jm,Jl,Ks,Dm,Dl,Rg,Ts);
    28 :	    }
    29 :	    if(pCF->CmdFlag==CTRL_LOOP){
    30 :	        // 周期モード (ここは制御周期 SAMPLING_TIME[0] 毎に呼び出される(実時間空間なので処理は制御周期内に収めること))
    31 :	        pCF->count++;       // ループカウンタを進める
    32 :	        t=pCF->count*Ts;    // 時刻の計算
    33 :	        
    34 :	        // 制御ここから
    35 :	        pCF->pIF->GetPosition(ElectAngle, PositionRes);     // [rad] 位置応答の取得
    36 :	        
    37 :	        // ステップ信号の生成
    38 :	        if(t < 1) iqref = 0;
    39 :	        if(1 <= t && t < 2) iqref = 1;
    40 :	        if(2 <= t) iqref = 0;
    41 :	        
    42 :	        // ここで2慣性共振系を計算
    43 :	        PlantSim1->GetVelocity(iqref, 0, omega_m, omega_l);
    44 :	        
    45 :	        pCF->pIF->SetCurrent(CurrentRef);   // [A] 電流指令の出力
    46 :	        // 制御ここまで
    47 :	        
    48 :	        // 任意変数値表示用
    49 :	        pCF->IndicVars[0] = 0;  // 表示変数
    50 :	        pCF->IndicVars[1] = 0;  // 表示変数
    51 :	        pCF->IndicVars[2] = 0;  // 表示変数
    52 :	        pCF->IndicVars[3] = 0;  // 表示変数
    53 :	        pCF->IndicVars[4] = 0;  // 表示変数
    54 :	        pCF->IndicVars[5] = 0;  // 表示変数
    55 :	        pCF->IndicVars[6] = 0;  // 表示変数
    56 :	        pCF->IndicVars[7] = 0;  // 表示変数
    57 :	        
    58 :	        // グラフプロット用
    59 :	        pCF->PlotVarsA[0] = omega_m;
    60 :	        pCF->PlotVarsA[1] = omega_l*Rg;
    61 :	        pCF->PlotVarsB[0] = 0;
    62 :	        pCF->PlotVarsB[1] = 0;
    63 :	        pCF->PlotVarsC[0] = 0;
    64 :	        pCF->PlotVarsC[1] = 0;
    65 :	        pCF->PlotVarsD[0] = 0;
    66 :	        
    67 :	        // データの保存用
    68 :	        pCF->Data[0] = t;   // [s]  時刻の保存
    69 :	        pCF->Data[1] = iqref;   // 保存変数
    70 :	        pCF->Data[2] = omega_m; // 保存変数
    71 :	        pCF->Data[3] = omega_l; // 保存変数
    72 :	        pCF->ExpData->PutData(pCF->Data,ConstParams::DATA_NUM); // データ格納
    73 :	    }
    74 :	    if(pCF->CmdFlag==CTRL_EXIT){
    75 :	        // 終了処理モード (ここは制御終了時に1度だけ呼び出される(非実時間空間なので重い処理もOK))
    76 :	        delete PlantSim1; PlantSim1 = nullptr;
    77 :	    }
    78 :	}
    79 :	

実行結果

黒の実線がMATLABによるシミュレーション結果,赤の破線がARCSによる計算結果。 完璧に一致。


上から順に (a) q軸電流指令,(b) モータ側速度,(c) 負荷側速度





- 541 -

研究室の横の倉庫 - Side Warehouse of Laboratory
Copyright(C), Side Warehouse, All rights reserved.