コレは何?/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) 負荷側速度
研究室の横の倉庫 - Side Warehouse of Laboratory
Copyright(C), Side Warehouse, All rights reserved.