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;
172 MNA_SUBCOMP_TASK_ORDER::TASK_BEFORE_PARENT,
173 MNA_SUBCOMP_TASK_ORDER::TASK_BEFORE_PARENT,
true);
180 MNA_SUBCOMP_TASK_ORDER::TASK_BEFORE_PARENT,
true);
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));
211 ((**mIntfVoltage)(0, 0) * std::conj(-(**
mIntfCurrent)(0, 0))).real();
224 SPDLOG_LOGGER_INFO(
mSLog,
225 "\n--- Initialize according to powerflow ---"
226 "\nTerminal 0 voltage: {:e}<{:e}"
227 "\nVoltage behind reactance: {:e}<{:e}"
228 "\ninitial electrical power: {:e}+j{:e}"
229 "\nactive electrical power: {:e}"
230 "\nmechanical power: {:e}"
231 "\n--- End of powerflow initialization ---",
234 Math::phaseDeg(**
mEp), mInitElecPower.real(),
238void DP::Ph1::SynchronGeneratorTrStab::step(Real time) {
243 ((**mIntfVoltage)(0, 0) * std::conj(-(**mIntfCurrent)(0, 0))).real();
248 if (mConvertWithOmegaMech)
250 mNomOmega * mNomOmega / (2. * **mInertia * mNomPower * **mOmMech) *
251 (**mMechPower - **mElecActivePower - mKd * (**mOmMech - mNomOmega));
254 mNomOmega / (2. * **mInertia * mNomPower) *
255 (**mMechPower - **mElecActivePower - mKd * (**mOmMech - mNomOmega));
259 if (mBehaviour == Behaviour::MNASimulation)
260 **mOmMech = **mOmMech + mTimeStep * dOmMech;
264 Real dDelta_p = **mOmMech - (mUseOmegaRef ? **mRefOmega : mNomOmega);
268 if (mBehaviour == Behaviour::MNASimulation) {
269 **mDelta_p = **mDelta_p + mTimeStep * dDelta_p;
270 **mEp = Complex(**mEp_abs * cos(**mDelta_p), **mEp_abs * sin(**mDelta_p));
273 mStates << Math::abs(**mEp), Math::phaseDeg(**mEp), **mElecActivePower,
274 **mMechPower, **mDelta_p, **mOmMech, dOmMech, dDelta_p,
275 (**mIntfVoltage)(0, 0).real(), (**mIntfVoltage)(0, 0).imag();
276 SPDLOG_LOGGER_DEBUG(mSLog,
"\nStates, time {:f}: \n{:s}", time,
277 Logger::matrixToString(mStates));
281 Real omega, Real timeStep, Attribute<Matrix>::Ptr leftVector) {
283 mMnaTasks.push_back(std::make_shared<AddBStep>(*
this));
287 AttributeBase::List &prevStepDependencies,
288 AttributeBase::List &attributeDependencies,
289 AttributeBase::List &modifiedAttributes) {
296void DP::Ph1::SynchronGeneratorTrStab::mnaParentAddPostStepDependencies(
297 AttributeBase::List &prevStepDependencies,
298 AttributeBase::List &attributeDependencies,
299 AttributeBase::List &modifiedAttributes,
300 Attribute<Matrix>::Ptr &leftVector) {
301 attributeDependencies.push_back(leftVector);
302 modifiedAttributes.push_back(mIntfVoltage);
312void DP::Ph1::SynchronGeneratorTrStab::AddBStep::execute(Real time,
314 **mGenerator.mRightVector = mGenerator.mSubInductor->mRightVector->get() +
315 mGenerator.mSubVoltageSource->mRightVector->get();
319 Real time, Int timeStepCount, Attribute<Matrix>::Ptr &leftVector) {
320 mnaCompUpdateVoltage(**leftVector);
321 mnaCompUpdateCurrent(**leftVector);
324void DP::Ph1::SynchronGeneratorTrStab::mnaCompUpdateVoltage(
325 const Matrix &leftVector) {
326 SPDLOG_LOGGER_DEBUG(mSLog,
"Read voltage from {:d}", matrixNodeIndex(0));
327 (**mIntfVoltage)(0, 0) =
328 Math::complexFromVectorElement(leftVector, matrixNodeIndex(0));
331void DP::Ph1::SynchronGeneratorTrStab::mnaCompUpdateCurrent(
332 const Matrix &leftVector) {
333 SPDLOG_LOGGER_DEBUG(mSLog,
"Read current from {:d}", matrixNodeIndex(0));
335 **mIntfCurrent = mSubInductor->mIntfCurrent->get();
338void DP::Ph1::SynchronGeneratorTrStab::setReferenceOmega(
339 Attribute<Real>::Ptr refOmegaPtr, Attribute<Real>::Ptr refDeltaPtr) {
340 mRefOmega->setReference(refOmegaPtr);
341 mRefDelta->setReference(refDeltaPtr);
344 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.