9#include <dpsim-models/DP/DP_Ph1_SynchronGeneratorTrStab.h>
12DP::Ph1::SynchronGeneratorTrStab::SynchronGeneratorTrStab(
13 String uid, String name, Logger::Level logLevel)
14 : Base::SynchronGenerator(mAttributes),
16 mEp(mAttributes->create<Complex>(
"Ep")),
17 mEp_abs(mAttributes->create<Real>(
"Ep_mag")),
18 mEp_phase(mAttributes->create<Real>(
"Ep_phase")),
19 mDelta_p(mAttributes->create<Real>(
"delta_r")),
20 mRefOmega(mAttributes->createDynamic<Real>(
"w_ref")),
21 mRefDelta(mAttributes->createDynamic<Real>(
"delta_ref")) {
22 setVirtualNodeNumber(2);
24 **mIntfVoltage = MatrixComp::Zero(1, 1);
25 **mIntfCurrent = MatrixComp::Zero(1, 1);
27 mStates = Matrix::Zero(10, 1);
30SimPowerComp<Complex>::Ptr
32 auto copy = SynchronGeneratorTrStab::make(name,
mLogLevel);
39 Real nomPower, Real nomVolt, Real nomFreq, Real Ll, Real Lmd, Real Llfd,
40 Real inertia, Real D) {
41 setBaseParameters(nomPower, nomVolt, nomFreq);
42 SPDLOG_LOGGER_INFO(
mSLog,
43 "\n--- Base Parameters ---"
50 mParameterType = ParameterType::statorReferred;
68 SPDLOG_LOGGER_INFO(
mSLog,
69 "\n--- Parameters ---"
78 Real nomPower, Real nomVolt, Real nomFreq, Int polePairNumber, Real Rs,
79 Real Lpd, Real inertiaJ, Real Kd) {
80 setBaseParameters(nomPower, nomVolt, nomFreq);
81 SPDLOG_LOGGER_INFO(
mSLog,
82 "\n--- Base Parameters ---"
88 mParameterType = ParameterType::statorReferred;
93 **
mInertia = calcHfromJ(inertiaJ, 2 * PI * nomFreq, polePairNumber);
98 SPDLOG_LOGGER_INFO(
mSLog,
99 "\n--- Parameters ---"
108 Real nomPower, Real nomVolt, Real nomFreq, Real Xpd, Real inertia, Real Rs,
110 setBaseParameters(nomPower, nomVolt, nomFreq);
111 SPDLOG_LOGGER_INFO(
mSLog,
112 "\n--- Base Parameters ---"
119 mParameterType = ParameterType::statorReferred;
133 SPDLOG_LOGGER_INFO(
mSLog,
134 "\n--- Parameters ---"
143 Bool convertWithOmegaMech) {
146 SPDLOG_LOGGER_INFO(
mSLog,
147 "\n--- Model flags ---"
148 "\nconvertWithOmegaMech: {:s}",
152void DP::Ph1::SynchronGeneratorTrStab::setInitialValues(Complex elecPower,
154 mInitElecPower = elecPower;
155 mInitMechPower = mechPower;
165 (**mIntfVoltage)(0, 0) = initialSingleVoltage(0);
166 mInitElecPower = (mInitElecPower == Complex(0, 0))
169 mInitMechPower = (mInitElecPower == Complex(0, 0)) ? mInitElecPower.real()
173 (**mIntfCurrent)(0, 0) = std::conj(-mInitElecPower / (**
mIntfVoltage)(0, 0));
187 ((**mIntfVoltage)(0, 0) * std::conj(-(**
mIntfCurrent)(0, 0))).real();
204 MNA_SUBCOMP_TASK_ORDER::TASK_BEFORE_PARENT,
205 MNA_SUBCOMP_TASK_ORDER::TASK_BEFORE_PARENT,
true);
212 mSubInductor->initializeFromNodesAndTerminals(frequency);
214 MNA_SUBCOMP_TASK_ORDER::TASK_BEFORE_PARENT,
true);
216 SPDLOG_LOGGER_INFO(
mSLog,
217 "\n--- Initialize according to powerflow ---"
218 "\nTerminal 0 voltage: {:e}<{:e}"
219 "\nVoltage behind reactance: {:e}<{:e}"
220 "\ninitial electrical power: {:e}+j{:e}"
221 "\nactive electrical power: {:e}"
222 "\nmechanical power: {:e}"
223 "\n--- End of powerflow initialization ---",
226 Math::phaseDeg(**
mEp), mInitElecPower.real(),
230void DP::Ph1::SynchronGeneratorTrStab::step(Real time) {
235 ((**mIntfVoltage)(0, 0) * std::conj(-(**mIntfCurrent)(0, 0))).real();
240 if (mConvertWithOmegaMech)
242 mNomOmega * mNomOmega / (2. * **mInertia * mNomPower * **mOmMech) *
243 (**mMechPower - **mElecActivePower - mKd * (**mOmMech - mNomOmega));
246 mNomOmega / (2. * **mInertia * mNomPower) *
247 (**mMechPower - **mElecActivePower - mKd * (**mOmMech - mNomOmega));
251 if (mBehaviour == Behaviour::MNASimulation)
252 **mOmMech = **mOmMech + mTimeStep * dOmMech;
256 Real dDelta_p = **mOmMech - (mUseOmegaRef ? **mRefOmega : mNomOmega);
260 if (mBehaviour == Behaviour::MNASimulation) {
261 **mDelta_p = **mDelta_p + mTimeStep * dDelta_p;
262 **mEp = Complex(**mEp_abs * cos(**mDelta_p), **mEp_abs * sin(**mDelta_p));
265 mStates << Math::abs(**mEp), Math::phaseDeg(**mEp), **mElecActivePower,
266 **mMechPower, **mDelta_p, **mOmMech, dOmMech, dDelta_p,
267 (**mIntfVoltage)(0, 0).real(), (**mIntfVoltage)(0, 0).imag();
268 SPDLOG_LOGGER_DEBUG(mSLog,
"\nStates, time {:f}: \n{:s}", time,
269 Logger::matrixToString(mStates));
273 Real omega, Real timeStep, Attribute<Matrix>::Ptr leftVector) {
275 mMnaTasks.push_back(std::make_shared<AddBStep>(*
this));
279 AttributeBase::List &prevStepDependencies,
280 AttributeBase::List &attributeDependencies,
281 AttributeBase::List &modifiedAttributes) {
288void DP::Ph1::SynchronGeneratorTrStab::mnaParentAddPostStepDependencies(
289 AttributeBase::List &prevStepDependencies,
290 AttributeBase::List &attributeDependencies,
291 AttributeBase::List &modifiedAttributes,
292 Attribute<Matrix>::Ptr &leftVector) {
293 attributeDependencies.push_back(leftVector);
294 modifiedAttributes.push_back(mIntfVoltage);
304void DP::Ph1::SynchronGeneratorTrStab::AddBStep::execute(Real time,
306 **mGenerator.mRightVector = mGenerator.mSubInductor->mRightVector->get() +
307 mGenerator.mSubVoltageSource->mRightVector->get();
311 Real time, Int timeStepCount, Attribute<Matrix>::Ptr &leftVector) {
312 mnaCompUpdateVoltage(**leftVector);
313 mnaCompUpdateCurrent(**leftVector);
316void DP::Ph1::SynchronGeneratorTrStab::mnaCompUpdateVoltage(
317 const Matrix &leftVector) {
318 SPDLOG_LOGGER_DEBUG(mSLog,
"Read voltage from {:d}", matrixNodeIndex(0));
319 (**mIntfVoltage)(0, 0) =
320 Math::complexFromVectorElement(leftVector, matrixNodeIndex(0));
323void DP::Ph1::SynchronGeneratorTrStab::mnaCompUpdateCurrent(
324 const Matrix &leftVector) {
325 SPDLOG_LOGGER_DEBUG(mSLog,
"Read current from {:d}", matrixNodeIndex(0));
327 **mIntfCurrent = mSubInductor->mIntfCurrent->get();
330void DP::Ph1::SynchronGeneratorTrStab::setReferenceOmega(
331 Attribute<Real>::Ptr refOmegaPtr, Attribute<Real>::Ptr refDeltaPtr) {
332 mRefOmega->setReference(refOmegaPtr);
333 mRefDelta->setReference(refDeltaPtr);
336 SPDLOG_LOGGER_INFO(mSLog,
"Use of reference omega.");
Real mNomFreq
nominal frequency fn [Hz]
Real mTimeStep
Simulation time step.
Real mLmd
d-axis mutual inductance Lmd [H]
Real mLlfd
field leakage inductance Llfd [H]
const Attribute< Real >::Ptr mMechPower
mechanical Power Pm [W]
Real mNomVolt
nominal voltage Vn [V] (phase-to-phase RMS)
Real mBase_L
base stator inductance
Real mBase_Z
base stator impedance
const Attribute< Real >::Ptr mRs
stator resistance Rs [Ohm]
const Attribute< Real >::Ptr mElecActivePower
Active part of the electrical power.
StateType mStateType
specifies if the machine parameters are transformed to per unit
Real mNomOmega
nominal angular frequency wn [Hz]
const Attribute< Real >::Ptr mLl
leakage inductance Ll [H]
Real mLfd
field inductance Lfd [H]
const Attribute< Real >::Ptr mLd
d-axis inductance Ld [H]
Real mNomPower
nominal power Pn [VA]
const Attribute< Real >::Ptr mOmMech
rotor speed omega_r
const Attribute< Real >::Ptr mInertia
inertia constant H [s] for per unit or moment of inertia J [kg*m^2]
Base class for composite power components.
void addMNASubComponent(typename SimPowerComp< Complex >::Ptr subc, MNA_SUBCOMP_TASK_ORDER preStepOrder, MNA_SUBCOMP_TASK_ORDER postStepOrder, Bool contributeToRightVector)
void mnaParentPostStep(Real time, Int timeStepCount, Attribute< Matrix >::Ptr &leftVector) override
Retrieves calculated voltage from simulation for next step.
std::shared_ptr< Inductor > mSubInductor
Inner inductor that represents the generator impedance.
void setStandardParametersSI(Real nomPower, Real nomVolt, Real nomFreq, Int polePairNumber, Real Rs, Real Lpd, Real inertiaJ, Real Kd=0)
Initializes the machine parameters.
void initializeFromNodesAndTerminals(Real frequency) override
Initializes Component variables according to power flow data stored in Nodes.
Complex mImpedance
Equivalent impedance for loadflow calculation.
const Attribute< Complex >::Ptr mEp
emf behind transient reactance
void mnaParentAddPreStepDependencies(AttributeBase::List &prevStepDependencies, AttributeBase::List &attributeDependencies, AttributeBase::List &modifiedAttributes) override
SimPowerComp< Complex >::Ptr clone(String name) override
Returns a modified copy of the component with the given suffix added to the name and without.
Real mKd
Absolute damping coefficient.
void setStandardParametersPU(Real nomPower, Real nomVolt, Real nomFreq, Real Xpd, Real inertia, Real Rs=0, Real D=0)
Initializes the machine parameters.
const Attribute< Real >::Ptr mDelta_p
Angle by which the emf Ep is leading the terminal voltage.
void mnaParentInitialize(Real omega, Real timeStep, Attribute< Matrix >::Ptr leftVector) override
Initializes variables of component.
void setModelFlags(Bool convertWithOmegaMech)
Flags to modify model behavior.
Real mXpd
Absolute d-axis transient reactance X'd.
Bool mConvertWithOmegaMech
Flag for usage of actual mechanical speed for torque conversion (otherwise mNomOmega is used)
void setFundamentalParametersPU(Real nomPower, Real nomVolt, Real nomFreq, Real Ll, Real Lmd, Real Llfd, Real inertia, Real D=0)
Initializes the machine parameters.
std::shared_ptr< VoltageSource > mSubVoltageSource
Inner voltage source that represents the generator.
const Attribute< Real >::Ptr mEp_abs
void mnaParentPreStep(Real time, Int timeStepCount) override
Real mLpd
Absolute d-axis transient inductance.
const Attribute< String >::Ptr mName
Human readable name.
const Attribute< MatrixVar< Complex > >::Ptr mIntfCurrent
SimTerminal< Complex >::Ptr terminal(UInt index)
const Attribute< MatrixVar< Complex > >::Ptr mIntfVoltage
SimNode< Complex >::List mVirtualNodes
Logger::Level mLogLevel
Component logger control for internal variables.
Logger::Log mSLog
Component logger.