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;
173 MNA_SUBCOMP_TASK_ORDER::TASK_BEFORE_PARENT,
174 MNA_SUBCOMP_TASK_ORDER::TASK_BEFORE_PARENT,
true);
182 MNA_SUBCOMP_TASK_ORDER::TASK_BEFORE_PARENT,
true);
191 (**mIntfVoltage)(0, 0) = initialSingleVoltage(0);
192 mInitElecPower = (mInitElecPower == Complex(0, 0))
195 mInitMechPower = (mInitElecPower == Complex(0, 0)) ? mInitElecPower.real()
199 (**mIntfCurrent)(0, 0) = std::conj(-mInitElecPower / (**
mIntfVoltage)(0, 0));
213 ((**mIntfVoltage)(0, 0) * std::conj(-(**
mIntfCurrent)(0, 0))).real();
226 SPDLOG_LOGGER_INFO(
mSLog,
227 "\n--- Initialize according to powerflow ---"
228 "\nTerminal 0 voltage: {:e}<{:e}"
229 "\nVoltage behind reactance: {:e}<{:e}"
230 "\ninitial electrical power: {:e}+j{:e}"
231 "\nactive electrical power: {:e}"
232 "\nmechanical power: {:e}"
233 "\n--- End of powerflow initialization ---",
236 Math::phaseDeg(**
mEp), mInitElecPower.real(),
240void DP::Ph1::SynchronGeneratorTrStab::step(Real time) {
245 ((**mIntfVoltage)(0, 0) * std::conj(-(**mIntfCurrent)(0, 0))).real();
250 if (mConvertWithOmegaMech)
252 mNomOmega * mNomOmega / (2. * **mInertia * mNomPower * **mOmMech) *
253 (**mMechPower - **mElecActivePower - mKd * (**mOmMech - mNomOmega));
256 mNomOmega / (2. * **mInertia * mNomPower) *
257 (**mMechPower - **mElecActivePower - mKd * (**mOmMech - mNomOmega));
261 if (mBehaviour == Behaviour::MNASimulation)
262 **mOmMech = **mOmMech + mTimeStep * dOmMech;
266 Real dDelta_p = **mOmMech - (mUseOmegaRef ? **mRefOmega : mNomOmega);
270 if (mBehaviour == Behaviour::MNASimulation) {
271 **mDelta_p = **mDelta_p + mTimeStep * dDelta_p;
272 **mEp = Complex(**mEp_abs * cos(**mDelta_p), **mEp_abs * sin(**mDelta_p));
275 mStates << Math::abs(**mEp), Math::phaseDeg(**mEp), **mElecActivePower,
276 **mMechPower, **mDelta_p, **mOmMech, dOmMech, dDelta_p,
277 (**mIntfVoltage)(0, 0).real(), (**mIntfVoltage)(0, 0).imag();
278 SPDLOG_LOGGER_DEBUG(mSLog,
"\nStates, time {:f}: \n{:s}", time,
279 Logger::matrixToString(mStates));
283 Real omega, Real timeStep, Attribute<Matrix>::Ptr leftVector) {
285 mMnaTasks.push_back(std::make_shared<AddBStep>(*
this));
289 AttributeBase::List &prevStepDependencies,
290 AttributeBase::List &attributeDependencies,
291 AttributeBase::List &modifiedAttributes) {
298void DP::Ph1::SynchronGeneratorTrStab::mnaParentAddPostStepDependencies(
299 AttributeBase::List &prevStepDependencies,
300 AttributeBase::List &attributeDependencies,
301 AttributeBase::List &modifiedAttributes,
302 Attribute<Matrix>::Ptr &leftVector) {
303 attributeDependencies.push_back(leftVector);
304 modifiedAttributes.push_back(mIntfVoltage);
314void DP::Ph1::SynchronGeneratorTrStab::AddBStep::execute(Real time,
316 **mGenerator.mRightVector = mGenerator.mSubInductor->mRightVector->get() +
317 mGenerator.mSubVoltageSource->mRightVector->get();
321 Real time, Int timeStepCount, Attribute<Matrix>::Ptr &leftVector) {
322 mnaCompUpdateVoltage(**leftVector);
323 mnaCompUpdateCurrent(**leftVector);
326void DP::Ph1::SynchronGeneratorTrStab::mnaCompUpdateVoltage(
327 const Matrix &leftVector) {
328 SPDLOG_LOGGER_DEBUG(mSLog,
"Read voltage from {:d}", matrixNodeIndex(0));
329 (**mIntfVoltage)(0, 0) =
330 Math::complexFromVectorElement(leftVector, matrixNodeIndex(0));
333void DP::Ph1::SynchronGeneratorTrStab::mnaCompUpdateCurrent(
334 const Matrix &leftVector) {
335 SPDLOG_LOGGER_DEBUG(mSLog,
"Read current from {:d}", matrixNodeIndex(0));
337 **mIntfCurrent = mSubInductor->mIntfCurrent->get();
340void DP::Ph1::SynchronGeneratorTrStab::setReferenceOmega(
341 Attribute<Real>::Ptr refOmegaPtr, Attribute<Real>::Ptr refDeltaPtr) {
342 mRefOmega->setReference(refOmegaPtr);
343 mRefDelta->setReference(refDeltaPtr);
346 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.
Complex mImpedance
Equivalent impedance for loadflow calculation.
const Attribute< Complex >::Ptr mEp
True after createSubComponents() runs; prevents double-construction.
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.
void createSubComponents() override
Constructs and registers MNA subcomponents without emf value; idempotent.
void initializeParentFromNodesAndTerminals(Real frequency) override
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.