9#include <dpsim-models/SP/SP_Ph1_SynchronGeneratorTrStab.h>
12SP::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);
31SimPowerComp<Complex>::Ptr
33 auto copy = SynchronGeneratorTrStab::make(name,
mLogLevel);
40 Real nomPower, Real nomVolt, Real nomFreq, Real Ll, Real Lmd, Real Llfd,
41 Real inertia, Real D) {
42 setBaseParameters(nomPower, nomVolt, nomFreq);
43 SPDLOG_LOGGER_INFO(
mSLog,
44 "\n--- Base Parameters ---"
51 mParameterType = ParameterType::statorReferred;
69 SPDLOG_LOGGER_INFO(
mSLog,
70 "\n--- Parameters ---"
79 Real nomPower, Real nomVolt, Real nomFreq, Int polePairNumber, Real Rs,
80 Real Lpd, Real inertiaJ, Real Kd) {
81 setBaseParameters(nomPower, nomVolt, nomFreq);
82 SPDLOG_LOGGER_INFO(
mSLog,
83 "\n--- Base Parameters ---"
89 mParameterType = ParameterType::statorReferred;
94 **
mInertia = calcHfromJ(inertiaJ, 2 * PI * nomFreq, polePairNumber);
99 SPDLOG_LOGGER_INFO(
mSLog,
100 "\n--- Parameters ---"
109 Real nomPower, Real nomVolt, Real nomFreq, Real Xpd, Real inertia, Real Rs,
111 setBaseParameters(nomPower, nomVolt, nomFreq);
112 SPDLOG_LOGGER_INFO(
mSLog,
113 "\n--- Base Parameters ---"
119 SPDLOG_LOGGER_INFO(
mSLog,
120 "\n--- Parameters Per-Unit ---"
121 "\n Xpd: {:f} [p.u.]",
125 mParameterType = ParameterType::statorReferred;
139 SPDLOG_LOGGER_INFO(
mSLog,
140 "\n--- Parameters ---"
143 "\nInertia: {:f} [s]"
149 Bool convertWithOmegaMech) {
152 SPDLOG_LOGGER_INFO(
mSLog,
153 "\n--- Model flags ---"
154 "\nconvertWithOmegaMech: {:s}",
158void SP::Ph1::SynchronGeneratorTrStab::setInitialValues(Complex elecPower,
160 mInitElecPower = elecPower;
161 mInitMechPower = mechPower;
173 MNA_SUBCOMP_TASK_ORDER::TASK_AFTER_PARENT,
174 MNA_SUBCOMP_TASK_ORDER::TASK_BEFORE_PARENT,
false);
180 MNA_SUBCOMP_TASK_ORDER::TASK_BEFORE_PARENT,
false);
189 (**mIntfVoltage)(0, 0) = initialSingleVoltage(0);
190 mInitElecPower = (mInitElecPower == Complex(0, 0))
193 mInitMechPower = (mInitElecPower == Complex(0, 0)) ? mInitElecPower.real()
197 (**mIntfCurrent)(0, 0) = std::conj(-mInitElecPower / (**
mIntfVoltage)(0, 0));
212 ((**mIntfVoltage)(0, 0) * std::conj(-(**
mIntfCurrent)(0, 0))).real();
214 ((**mIntfVoltage)(0, 0) * std::conj(-(**
mIntfCurrent)(0, 0))).imag();
228 SPDLOG_LOGGER_INFO(
mSLog,
229 "\n--- Initialize according to powerflow ---"
230 "\nTerminal 0 voltage: {:e}<{:e}"
231 "\nVoltage behind reactance: {:e}<{:e}"
232 "\ninitial electrical power: {:e}+j{:e}"
233 "\nactive electrical power: {:e}"
234 "\nreactive electrical power: {:e}"
235 "\nmechanical power: {:e}"
236 "\n--- End of powerflow initialization ---",
239 Math::phaseDeg(**
mEp), mInitElecPower.real(),
244void SP::Ph1::SynchronGeneratorTrStab::step(Real time) {
250 ((**mIntfVoltage)(0, 0) * std::conj(-(**mIntfCurrent)(0, 0))).real();
251 **mElecReactivePower =
252 ((**mIntfVoltage)(0, 0) * std::conj(-(**mIntfCurrent)(0, 0))).imag();
257 if (mConvertWithOmegaMech)
259 mNomOmega * mNomOmega / (2. * **mInertia * mNomPower * **mOmMech) *
260 (**mMechPower - **mElecActivePower - mKd * (**mOmMech - mNomOmega));
263 mNomOmega / (2. * **mInertia * mNomPower) *
264 (**mMechPower - **mElecActivePower - mKd * (**mOmMech - mNomOmega));
268 if (mBehaviour == Behaviour::MNASimulation)
269 **mOmMech = **mOmMech + mTimeStep * dOmMech;
273 Real dDelta_p = **mOmMech - (mUseOmegaRef ? **mRefOmega : mNomOmega);
277 if (mBehaviour == Behaviour::MNASimulation) {
278 **mDelta_p = **mDelta_p + mTimeStep * dDelta_p;
279 **mEp = Complex(**mEp_abs * cos(**mDelta_p), **mEp_abs * sin(**mDelta_p));
282 mStates << Math::abs(**mEp), Math::phaseDeg(**mEp), **mElecActivePower,
283 **mMechPower, **mDelta_p, **mOmMech, dOmMech, dDelta_p,
284 (**mIntfVoltage)(0, 0).real(), (**mIntfVoltage)(0, 0).imag();
285 SPDLOG_LOGGER_DEBUG(mSLog,
"\nStates, time {:f}: \n{:s}", time,
286 Logger::matrixToString(mStates));
290 Real omega, Real timeStep, Attribute<Matrix>::Ptr leftVector) {
293 mMnaTasks.push_back(std::make_shared<AddBStep>(*
this));
297 AttributeBase::List &prevStepDependencies,
298 AttributeBase::List &attributeDependencies,
299 AttributeBase::List &modifiedAttributes) {
306void SP::Ph1::SynchronGeneratorTrStab::mnaParentAddPostStepDependencies(
307 AttributeBase::List &prevStepDependencies,
308 AttributeBase::List &attributeDependencies,
309 AttributeBase::List &modifiedAttributes,
310 Attribute<Matrix>::Ptr &leftVector) {
311 attributeDependencies.push_back(leftVector);
312 modifiedAttributes.push_back(mIntfVoltage);
322void SP::Ph1::SynchronGeneratorTrStab::AddBStep::execute(Real time,
324 **mGenerator.mRightVector = mGenerator.mSubInductor->mRightVector->get() +
325 mGenerator.mSubVoltageSource->mRightVector->get();
328void SP::Ph1::SynchronGeneratorTrStab::mnaParentPostStep(
329 Real time, Int timeStepCount, Attribute<Matrix>::Ptr &leftVector) {
330 mnaCompUpdateVoltage(**leftVector);
331 mnaCompUpdateCurrent(**leftVector);
334void SP::Ph1::SynchronGeneratorTrStab::mnaCompUpdateVoltage(
335 const Matrix &leftVector) {
336 SPDLOG_LOGGER_DEBUG(mSLog,
"Read voltage from {:d}", matrixNodeIndex(0));
337 (**mIntfVoltage)(0, 0) =
338 Math::complexFromVectorElement(leftVector, matrixNodeIndex(0));
341void SP::Ph1::SynchronGeneratorTrStab::mnaCompUpdateCurrent(
342 const Matrix &leftVector) {
343 SPDLOG_LOGGER_DEBUG(mSLog,
"Read current from {:d}", matrixNodeIndex(0));
345 **mIntfCurrent = mSubInductor->mIntfCurrent->get();
348void SP::Ph1::SynchronGeneratorTrStab::setReferenceOmega(
349 Attribute<Real>::Ptr refOmegaPtr, Attribute<Real>::Ptr refDeltaPtr) {
350 mRefOmega->setReference(refOmegaPtr);
351 mRefDelta->setReference(refDeltaPtr);
354 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 mElecReactivePower
Reactive part of the electrical power.
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)
const Attribute< String >::Ptr mName
Human readable name.
Complex mImpedance
Equivalent impedance for loadflow calculation.
void mnaParentPreStep(Real time, Int timeStepCount) override
MNA pre and post step operations.
Bool mConvertWithOmegaMech
Flag for usage of actual mechanical speed for torque conversion (otherwise mNomOmega is used)
Real mKd
Absolute damping coefficient.
SimPowerComp< Complex >::Ptr clone(String name) override
DEPRECATED: Delete method.
void initializeParentFromNodesAndTerminals(Real frequency) override
void setModelFlags(Bool convertWithOmegaMech)
Flags to modify model behavior.
void createSubComponents() override
Constructs and registers MNA subcomponents without emf value; idempotent.
std::shared_ptr< VoltageSource > mSubVoltageSource
Inner voltage source that represents the generator.
const Attribute< Complex >::Ptr mEp
True after createSubComponents() runs; prevents double-construction.
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.
std::shared_ptr< Inductor > mSubInductor
Inner inductor that represents the generator impedance.
Real mLpd
Absolute d-axis transient inductance.
void mnaParentInitialize(Real omega, Real timeStep, Attribute< Matrix >::Ptr leftVector) override
Initializes variables of component.
const Attribute< Real >::Ptr mEp_abs
void setStandardParametersSI(Real nomPower, Real nomVolt, Real nomFreq, Int polePairNumber, Real Rs, Real Lpd, Real inertiaJ, Real Kd=0)
Initializes the machine parameters.
Real mXpd
Absolute d-axis transient reactance X'd.
void mnaParentAddPreStepDependencies(AttributeBase::List &prevStepDependencies, AttributeBase::List &attributeDependencies, AttributeBase::List &modifiedAttributes) override
void setFundamentalParametersPU(Real nomPower, Real nomVolt, Real nomFreq, Real Ll, Real Lmd, Real Llfd, Real inertia, Real D=0)
Initializes the machine parameters.
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.