9#include <dpsim-models/MathUtils.h>
10#include <dpsim-models/SP/SP_Ph1_SolidStateTransformer.h>
14SP::Ph1::SolidStateTransformer::SolidStateTransformer(String uid, String name,
15 Logger::Level logLevel)
17 mPref(mAttributes->create<Real>(
"P_ref",
18 std::numeric_limits<double>::infinity())),
19 mQ1ref(mAttributes->create<Real>(
"Q1_ref")),
20 mQ2ref(mAttributes->create<Real>(
"Q2_ref")) {
21 SPDLOG_LOGGER_INFO(mSLog,
"Create {} of type {}", **mName, this->type());
23 **mIntfVoltage = MatrixComp::Zero(1, 1);
24 **mIntfCurrent = MatrixComp::Zero(1, 1);
30 return SolidStateTransformer::make(name,
mLogLevel);
33void SP::Ph1::SolidStateTransformer::setParameters(Real nomV1, Real nomV2,
34 Real Pref, Real Q1ref,
36 mNominalVoltageEnd1 = nomV1;
37 mNominalVoltageEnd2 = nomV2;
41 mP2 = -1 * std::sqrt(Pref * Pref + Q1ref * Q1ref - Q2ref * Q2ref);
51 mSubLoadSide1->connect({
mTerminals[0]->node()});
52 mSubLoadSide2->connect({
mTerminals[1]->node()});
55 MNA_SUBCOMP_TASK_ORDER::NO_TASK,
false);
57 MNA_SUBCOMP_TASK_ORDER::NO_TASK,
false);
64 mSubLoadSide1->setParameters(**
mPref, **
mQ1ref, mNominalVoltageEnd1);
65 mSubLoadSide2->setParameters(mP2, **
mQ2ref, mNominalVoltageEnd2);
67 if (!Math::isFinite(mP2)) {
68 SPDLOG_LOGGER_ERROR(
mSLog,
69 "SST {}: non-finite secondary-side power {} (or "
70 "initialized before setting parameters)",
74 if ((**
mPref * mP2) > 0) {
75 throw std::invalid_argument(
76 "power at primary and secondary sides should be opposite");
79 SPDLOG_LOGGER_INFO(
mSLog,
80 "\n--- Initialization from powerflow ---"
81 "\nTerminal 0 power flow: {:s} VA"
82 "\nTerminal 1 power flow: {:s} VA"
83 "\n--- Initialization from powerflow finished ---",
84 Logger::complexToString(Complex(**
mPref, **
mQ1ref)),
85 Logger::complexToString(Complex(mP2, **
mQ2ref)));
88void SP::Ph1::SolidStateTransformer::calculatePerUnitParameters(
89 Real baseApparentPower, Real baseOmega) {
90 mPref_perUnit = **mPref / baseApparentPower;
91 mP2_perUnit = mP2 / baseApparentPower;
92 mQ1ref_perUnit = **mQ1ref / baseApparentPower;
93 mQ2ref_perUnit = **mQ2ref / baseApparentPower;
94 mSubLoadSide1->calculatePerUnitParameters(baseApparentPower, baseOmega);
95 mSubLoadSide2->calculatePerUnitParameters(baseApparentPower, baseOmega);
98 "\n#### Calculate Per Unit Parameters for {}"
99 "\nTerminal 0 power flow: {:s} p.u."
100 "\nTerminal 1 power flow: {:s} p.u."
101 "\n#### Calculate Per Unit Parameters finished ---",
102 **mName, Logger::complexToString(Complex(mPref_perUnit, mQ1ref_perUnit)),
103 Logger::complexToString(Complex(mP2_perUnit, mQ2ref_perUnit)));
106Complex SP::Ph1::SolidStateTransformer::getNodalInjection(
107 CPS::TopologicalNode::Ptr node) {
108 if (node->name() == mTerminals[0]->node()->name()) {
111 "\n#### get nodal injection for primary side"
112 "\nreturned {:s} p.u.",
113 Logger::complexToString(Complex(mPref_perUnit, mQ1ref_perUnit)));
114 return Complex(mPref_perUnit, mQ1ref_perUnit);
115 }
else if (node->name() == mTerminals[1]->node()->name()) {
118 "\n#### get nodal injection for secondary side"
119 "\nreturned {:s} p.u.",
120 Logger::complexToString(Complex(mP2_perUnit, mQ2ref_perUnit)));
121 return Complex(mP2_perUnit, mQ2ref_perUnit);
123 throw std::invalid_argument(
124 "Failed to process nodal power injection of Solid State Transformer" +
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.
SimTerminal< Complex >::List mTerminals
Logger::Level mLogLevel
Component logger control for internal variables.
Logger::Log mSLog
Component logger.