ARCS6 AR6-REV.24062600
読み取り中…
検索中…
一致する文字列を見つけられません
Integrator.hh
[詳解]
1
5//
6// Copyright (C) 2011-2020 Yokokura, Yuki
7// This program is free software;
8// you can redistribute it and/or modify it under the terms of the FreeBSD License.
9// For details, see the License.txt file.
10
11#ifndef INTEGRATOR
12#define INTEGRATOR
13
14#include <cassert>
15
16// ARCS組込み用マクロ
17#ifdef ARCS_IN
18 // ARCSに組み込まれる場合
19 #include "ARCSassert.hh"
20 #include "ARCSeventlog.hh"
21#else
22 // ARCSに組み込まれない場合
23 #define arcs_assert(a) (assert(a))
24 #define PassedLog()
25 #define EventLog(a)
26 #define EventLogVar(a)
27#endif
28
29namespace ARCS { // ARCS名前空間
36
39template <IntegralType T = IntegralType::BACKWARD_EULER>
41 public:
44 : Ts(0), // [s] 制御周期の格納
45 uZ1(0), yZ1(0), // 状態変数の初期化
46 Ena(true) // 積分器作動フラグ
47 {
48 PassedLog();
49 }
50
53 explicit Integrator(const double SmplTime)
54 : Ts(SmplTime), // [s] 制御周期の格納
55 uZ1(0), yZ1(0), // 状態変数の初期化
56 Ena(true) // 積分器作動フラグ
57 {
58 PassedLog();
59 }
60
64 : Ts(r.Ts), // [s] 制御周期の格納
65 uZ1(r.uZ1), yZ1(r.yZ1), // 状態変数の初期化
66 Ena(r.Ena) // 積分器作動フラグ
67 {
68
69 }
70
73 PassedLog();
74 }
75
79 double GetSignal(const double u){
80 double y = 0;
81
82 if(Ena == false)return yZ1; // 積分器停止指令の場合は積分動作を停止して積分値をそのまま出力
83
84 // 積分方法によって計算を変える
85 switch(T){
86 case IntegralType::FOWARD_EULER:
87 y = Ts*uZ1 + yZ1; // 前進オイラー(前進差分)
88 break;
89 case IntegralType::BACKWARD_EULER:
90 y = Ts*u + yZ1; // 後退オイラー(後退差分)
91 break;
92 case IntegralType::TRAPEZOIDAL:
93 y = Ts/2.0*(u + uZ1) + yZ1; // 台形積分(双1次変換, Tustin変換)
94 break;
95 default:
96 y = Ts*u + yZ1; // デフォルトは後退オイラー
97 break;
98 }
99
100 // 状態変数の更新
101 uZ1 = u;
102 yZ1 = y;
103
104 return y;
105 }
106
109 void SetSmplTime(const double SmplTime){
110 Ts = SmplTime; // [s] 制御周期の再設定
111 }
112
115 void SetInitial(const double InitValue){
116 yZ1 = InitValue;
117 }
118
121 void SetIntegralValue(const double Value){
122 yZ1 = Value;
123 }
124
127 void Enable(const bool Flag){
128 Ena = Flag;
129 }
130
133 uZ1 = 0; // 状態変数1のゼロクリア
134 yZ1 = 0; // 状態変数2のゼロクリア
135 }
136
137 private:
138 Integrator(const Integrator&) = delete;
139 const Integrator& operator=(const Integrator&) = delete;
140 double Ts;
141 double uZ1;
142 double yZ1;
143 bool Ena;
144
145};
146}
147
148#endif
149
ARCS イベントログクラス
#define PassedLog()
イベントログ用マクロ(ファイルと行番号のみ記録版)
Definition ARCSeventlog.hh:26
ARCS用ASSERTクラス
IntegralType
積分方法の定義
Definition Integrator.hh:31
@ BACKWARD_EULER
後退オイラー(後退差分)
@ TRAPEZOIDAL
台形積分(双1次変換, Tustin変換)
@ FOWARD_EULER
前進オイラー(前進差分)
積分器
Definition Integrator.hh:40
Integrator(Integrator &&r)
ムーブコンストラクタ
Definition Integrator.hh:63
~Integrator()
デストラクタ
Definition Integrator.hh:72
double GetSignal(const double u)
出力信号の取得
Definition Integrator.hh:79
Integrator(void)
空コンストラクタ
Definition Integrator.hh:43
void SetIntegralValue(const double Value)
積分値の設定
Definition Integrator.hh:121
void SetInitial(const double InitValue)
積分初期値の設定
Definition Integrator.hh:115
void SetSmplTime(const double SmplTime)
制御周期の再設定
Definition Integrator.hh:109
Integrator(const double SmplTime)
コンストラクタ
Definition Integrator.hh:53
void Enable(const bool Flag)
積分器を動かすか止めるかの選択
Definition Integrator.hh:127
void ClearIntegralValue(void)
積分器のリセット
Definition Integrator.hh:132