DPsim
Loading...
Searching...
No Matches
ExciterStatic.cpp
1// SPDX-FileCopyrightText: 2025 Institute for Automation of Complex Power Systems, EONERC, RWTH Aachen University
2// SPDX-License-Identifier: MPL-2.0
3
4#include <dpsim-models/Signal/ExciterStatic.h>
5
6using namespace CPS;
7using namespace CPS::Signal;
8
9ExciterStatic::ExciterStatic(const String &name, CPS::Logger::Level logLevel)
10 : SimSignalComp(name, name, logLevel) {}
11
13 std::shared_ptr<Base::ExciterParameters> parameters) {
14
15 if (auto params = std::dynamic_pointer_cast<Signal::ExciterStaticParameters>(
16 parameters)) {
17 mParameters = params;
18
19 if (mParameters->Tb == 0) {
20 SPDLOG_LOGGER_ERROR(mSLog, "ExciterStatic: Tb must be non-zero (used as "
21 "divisor in lead-lag block)");
23 }
24 if (mParameters->Te == 0) {
25 SPDLOG_LOGGER_ERROR(mSLog, "ExciterStatic: Te must be non-zero (used as "
26 "divisor in exciter output)");
28 }
29
30 if (mParameters->Ta == mParameters->Tb) {
31 SPDLOG_LOGGER_INFO(
32 mSLog,
33 "ExciterStatic: Ta == Tb; lead-lag block reduces to unity gain "
34 "(Cb=0, Xb has no effect on output). Simulation proceeds normally.");
35 }
36
37 SPDLOG_LOGGER_INFO(mSLog,
38 "\nExciteStatic parameters:"
39 "\nTr: {:e}"
40 "\nTa: {:e}"
41 "\nTb: {:e}"
42 "\nTe: {:e}"
43 "\nKa: {:e}"
44 "\nMaximum EMF: {:e}"
45 "\nMinimum EMF: {:e}"
46 "\nKbc: {:e}\n",
47 mParameters->Tr, mParameters->Ta, mParameters->Tb,
48 mParameters->Te, mParameters->Ka, mParameters->MaxEfd,
49 mParameters->MinEfd, mParameters->Kbc);
50 } else {
51 SPDLOG_LOGGER_ERROR(
52 mSLog, "Type of parameters class of {} has to be ExciterStatic!",
53 this->name());
54 throw CPS::TypeException();
55 }
56}
57
58void ExciterStatic::initializeStates(Real Vh_init, Real Ef_init) {
59
60 mVh = Vh_init;
61 mEfd = Ef_init;
62 mEfdLim = mEfd;
63
64 if ((Ef_init > mParameters->MaxEfd) || (Ef_init < mParameters->MinEfd)) {
65 SPDLOG_LOGGER_ERROR(mSLog,
66 "\nERROR: The initialisation is bad, Ef_init out of "
67 "allowed band ({}<Ef_init<{}).",
68 mParameters->MinEfd, mParameters->MaxEfd);
69 throw CPS::Exception();
70 }
71
72 // initialize auxiliar parameters
73 mCa = mParameters->Ta / mParameters->Tb;
74 mCb = (mParameters->Tb - mParameters->Ta) / mParameters->Tb;
75
77 mVr = mVh;
78 mVr_prev = mVr;
79
80 // init value of the second lag block
81 mVe = mEfd / mParameters->Ka;
82
84 mVin = mVe / (mCa + mCb);
85
87 mVref = mVin + mVr;
88
90 mXb = mVin;
91 mXb_prev = mXb;
92
93 SPDLOG_LOGGER_INFO(mSLog,
94 "\nExciter Initialization"
95 "\nExciter type: ExciterStatic"
96 "\nInitially set excitation system initial values:"
97 "\ninit Vh: {:e}"
98 "\ninit Ef: {:e}"
99 "\nCalculated set poit and auxilary state variables:"
100 "\nVref : {:e}"
101 "\nXb : {:e}"
102 "\nVin = {:e}",
103 mVh, mEfd, mVref, mXb, mVin);
104 mSLog->flush();
105}
106
107Real ExciterStatic::step(Real mVd, Real mVq, Real dt, Real Vpss) {
108
109 // Voltage magnitude calculation
110 mVh = sqrt(pow(mVd, 2.) + pow(mVq, 2.));
111
112 // update state variables at time k
113 mVr_prev = mVr;
114 mXb_prev = mXb;
115
117 if (mParameters->Tr > 0)
118 mVr = mVr_prev + dt / mParameters->Tr * (mVh - mVr_prev);
119 else
120 mVr = mVh;
121
123 mVin = mVref - mVr + Vpss;
124
126 mXb = mXb_prev + (mVin - mXb_prev) * dt / mParameters->Tb;
127
128 // Compute Efd at time k using euler forward
129 mVe = mVin * mCa + mXb_prev * mCb - mParameters->Kbc * (mEfd - mEfdLim);
130 mEfd = mEfd + (dt / mParameters->Te) * (mParameters->Ka * mVe - mEfd);
131 if (mEfd > mParameters->MaxEfd)
132 mEfdLim = mParameters->MaxEfd;
133 else if (mEfd < mParameters->MinEfd)
134 mEfdLim = mParameters->MinEfd;
135 else
136 mEfdLim = mEfd;
137
138 return mEfdLim;
139}
void initializeStates(Real Vh_init, Real Vf_init) final
Initializes exciter variables.
void setParameters(std::shared_ptr< Base::ExciterParameters > parameters) final
Initializes exciter parameters.
Real step(Real Vd, Real Vq, Real dt, Real Vpss=0) final
Performs an step to update field voltage value.
ExciterStatic(const String &name, Logger::Level logLevel=Logger::Level::info)
Constructor.
Logger::Log mSLog
Component logger.