16 std::shared_ptr<Base::ExciterParameters> parameters) {
18 if (
auto params = std::dynamic_pointer_cast<Signal::ExciterDC1SimpParameters>(
22 if (mParameters->Tr == 0) {
23 SPDLOG_LOGGER_ERROR(
mSLog,
"ExciterDC1Simp: Tr must be non-zero (used as "
24 "divisor in voltage transducer)");
27 if (mParameters->Ta == 0) {
30 "ExciterDC1Simp: Ta must be non-zero (used as divisor in amplifier)");
33 if (mParameters->Tf == 0) {
35 mSLog,
"ExciterDC1Simp: Tf must be non-zero (used as divisor "
36 "in stabilizing feedback)");
39 if (mParameters->Tef == 0) {
41 mSLog,
"ExciterDC1Simp: Tef must be non-zero (used as divisor "
42 "in exciter output)");
45 if (mParameters->Ka == 0) {
47 mSLog,
"ExciterDC1Simp: Ka must be non-zero (used as divisor "
48 "when computing initial amplifier input)");
52 SPDLOG_LOGGER_INFO(
mSLog,
53 "\nExciterDC1Simp parameters:"
63 "\nMaximum amplifier Voltage: {:e}"
64 "\nMinimum amplifier Voltage: {:e}\n",
65 mParameters->Ta, mParameters->Ka, mParameters->Tef,
66 mParameters->Kef, mParameters->Tf, mParameters->Kf,
67 mParameters->Tr, mParameters->Aef, mParameters->Bef,
68 mParameters->MaxVa, mParameters->MinVa);
71 mSLog,
"Type of parameters class of {} has to be ExciterDC1Simp!",
81 SPDLOG_LOGGER_INFO(
mSLog,
82 "Initially set excitation system initial values:"
94 mVsat = mParameters->Aef * exp(mParameters->Bef * abs(**mEf));
97 mVa = mParameters->Kef * **mEf + mVsat * **mEf;
98 if (mVa > mParameters->MaxVa)
99 mVa = mParameters->MaxVa;
100 if (mVa < mParameters->MinVa)
101 mVa = mParameters->MinVa;
104 mVin = mVa / mParameters->Ka;
107 mVref = **mVr + mVin;
110 if (std::abs(**mEf - mVa / (mVsat + mParameters->Kef)) > DOUBLE_EPSILON)
111 SPDLOG_LOGGER_WARN(
mSLog,
"\nInitial conditions are not consistent!!!");
113 SPDLOG_LOGGER_INFO(
mSLog,
114 "\nActually applied excitation system initial values:"
119 mVref, **mVr, **mEf, mVa);
125 **mVh = sqrt(pow(mVd, 2.) + pow(mVq, 2.));
136 mVsat = mParameters->Aef * exp(mParameters->Bef * abs(mEf_prev));
139 **mVr = **mVr + dt / mParameters->Tr * (**mVh - **mVr);
142 mVin = mVref + Vpss - **mVr - mVf;
143 mVa = mVa_prev + dt / mParameters->Ta * (mVin * mParameters->Ka - mVa_prev);
144 if (mVa > mParameters->MaxVa)
145 mVa = mParameters->MaxVa;
146 else if (mVa < mParameters->MinVa)
147 mVa = mParameters->MinVa;
150 mVf = (1. - dt / mParameters->Tf) * mVf_prev +
151 dt * mParameters->Kf / (mParameters->Tf * mParameters->Tef) *
152 (mVa_prev - (mVsat + mParameters->Kef) * mEf_prev);
155 **mEf = mEf_prev + dt / mParameters->Tef *
156 (mVa_prev - (mVsat + mParameters->Kef) * mEf_prev);