Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
ACS
Public
Power System Simulation and Optimization
DPsim
DPsim
Commits
d859c457
Commit
d859c457
authored
Sep 21, 2020
by
Jan Dinkelbach
Browse files
remove PLL quantities from PowerControllerVSI and adapt parametrization of example
parent
b8934189
Changes
6
Hide whitespace changes
Inline
Side-by-side
Examples/Cxx/Circuits/DP_Slack_PiLine_VSI_with_PF_Init.cpp
View file @
d859c457
...
...
@@ -26,7 +26,7 @@ int main(int argc, char* argv[]) {
Examples
::
SGIB
::
ScenarioConfig
scenario
;
// Real finalTime = 0.003;
Real
finalTime
=
2
;
Real
finalTime
=
10
;
Real
timeStep
=
0.001
;
CommandLineArgs
args
(
argc
,
argv
);
if
(
argc
>
1
)
{
...
...
@@ -103,7 +103,7 @@ int main(int argc, char* argv[]) {
pv
->
setControllerParameters
(
scenario
.
KpPLL
,
scenario
.
KiPLL
,
scenario
.
KpPowerCtrl
,
scenario
.
KiPowerCtrl
,
scenario
.
KpCurrCtrl
,
scenario
.
KiCurrCtrl
,
scenario
.
OmegaCutoff
);
pv
->
setFilterParameters
(
scenario
.
Lf
,
scenario
.
Cf
,
scenario
.
Rf
,
scenario
.
Rc
);
pv
->
setTransformerParameters
(
scenario
.
systemNominalVoltage
,
scenario
.
pvNominalVoltage
,
scenario
.
transformerNominalPower
,
scenario
.
systemNominalVoltage
/
scenario
.
pvNominalVoltage
,
0
,
0
,
scenario
.
transformerInductance
,
scenario
.
systemOmega
);
pv
->
setInitialStateValues
(
0
,
0
,
scenario
.
pvNominalActivePower
,
scenario
.
pvNominalReactivePower
,
0
,
0
,
0
,
0
);
pv
->
setInitialStateValues
(
scenario
.
pvNominalActivePower
,
scenario
.
pvNominalReactivePower
,
scenario
.
phi_dInit
,
scenario
.
phi_qInit
,
scenario
.
gamma_dInit
,
scenario
.
gamma_qInit
);
// Topology
extnetDP
->
connect
({
n1DP
});
...
...
@@ -127,7 +127,7 @@ int main(int argc, char* argv[]) {
loggerDP
->
addAttribute
(
"pv_pll_output"
,
pv
->
attribute
(
"pll_output"
));
// load step sized in absolute terms
//
std::shared_ptr<SwitchEvent> loadStepEvent = Examples::createEventAddPowerConsumption("n2", 1-timeStepDP, 100
0
.0e3, systemDP, Domain::DP);
std
::
shared_ptr
<
SwitchEvent
>
loadStepEvent
=
Examples
::
createEventAddPowerConsumption
(
"n2"
,
1
-
timeStepDP
,
100.0e3
,
systemDP
,
Domain
::
DP
,
loggerDP
);
// Simulation
Simulation
sim
(
simNameDP
,
Logger
::
Level
::
debug
);
...
...
@@ -135,7 +135,7 @@ int main(int argc, char* argv[]) {
sim
.
setTimeStep
(
timeStepDP
);
sim
.
setFinalTime
(
finalTimeDP
);
sim
.
setDomain
(
Domain
::
DP
);
//
sim.addEvent(loadStepEvent);
sim
.
addEvent
(
loadStepEvent
);
sim
.
doPowerFlowInit
(
false
);
sim
.
addLogger
(
loggerDP
);
sim
.
run
();
...
...
Examples/Cxx/Examples.h
View file @
d859c457
...
...
@@ -22,19 +22,28 @@ namespace SGIB {
Real
systemFrequency
=
50
;
Real
systemNominalVoltage
=
20e3
;
// Line parame
r
ters
Real
lineResistance
=
0.05
;
// Line parameters
(R/X = 1)
Real
lineResistance
=
31.4
;
Real
lineInductance
=
0.1
;
// PV controller parameters
Real
KpPLL
=
0.25
;
Real
KiPLL
=
2
;
Real
KpPowerCtrl
=
0.001
;
Real
KiPowerCtrl
=
0.08
;
Real
KpCurrCtrl
=
0.3
;
Real
KiCurrCtrl
=
10
;
Real
scaling_P
=
10.0
;
Real
scaling_I
=
1000.0
;
Real
KpPLL
=
0.25
/
scaling_P
;
Real
KiPLL
=
2
/
scaling_I
;
Real
KpPowerCtrl
=
0.001
/
scaling_P
;
Real
KiPowerCtrl
=
0.08
/
scaling_I
;
Real
KpCurrCtrl
=
0.3
/
scaling_P
;
Real
KiCurrCtrl
=
10
/
scaling_I
;
Real
OmegaCutoff
=
2
*
PI
*
systemFrequency
;
// Initial state values
Real
phi_dInit
=
823.721
*
scaling_I
;
Real
phi_qInit
=
-
411.861
*
scaling_I
;
Real
gamma_dInit
=
131.401
*
scaling_I
;
Real
gamma_qInit
=
7.31206
*
scaling_I
;
// Nominal generated power values of PV
Real
pvNominalVoltage
=
1500.
;
Real
pvNominalActivePower
=
100e3
;
...
...
@@ -130,7 +139,7 @@ namespace CIGREMV {
pv
->
setControllerParameters
(
scenario
.
KpPLL
,
scenario
.
KiPLL
,
scenario
.
KpPowerCtrl
,
scenario
.
KiPowerCtrl
,
scenario
.
KpCurrCtrl
,
scenario
.
KiCurrCtrl
,
scenario
.
OmegaCutoff
);
pv
->
setFilterParameters
(
scenario
.
Lf
,
scenario
.
Cf
,
scenario
.
Rf
,
scenario
.
Rc
);
pv
->
setTransformerParameters
(
scenario
.
systemNominalVoltage
,
scenario
.
pvUnitNominalVoltage
,
scenario
.
transformerNominalPower
,
scenario
.
systemNominalVoltage
/
scenario
.
pvUnitNominalVoltage
,
0
,
0
,
scenario
.
transformerInductance
,
scenario
.
systemOmega
);
pv
->
setInitialStateValues
(
scenario
.
thetaPLLInit
,
scenario
.
phiPLLInit
,
scenario
.
pInit
,
scenario
.
qInit
,
scenario
.
phi_dInit
,
scenario
.
phi_qInit
,
scenario
.
gamma_dInit
,
scenario
.
gamma_qInit
);
pv
->
setInitialStateValues
(
scenario
.
pInit
,
scenario
.
qInit
,
scenario
.
phi_dInit
,
scenario
.
phi_qInit
,
scenario
.
gamma_dInit
,
scenario
.
gamma_qInit
);
system
.
addComponent
(
pv
);
system
.
connectComponentToNodes
<
Complex
>
(
pv
,
{
connectionNode
});
}
else
if
(
domain
==
Domain
::
EMT
)
{
...
...
@@ -149,8 +158,6 @@ namespace CIGREMV {
void
logPVAttributes
(
DPsim
::
DataLogger
::
Ptr
logger
,
CPS
::
TopologicalPowerComp
::
Ptr
pv
)
{
// state variables
logger
->
addAttribute
(
pv
->
name
()
+
"_state_"
+
"theta"
,
pv
->
attribute
(
"theta"
));
logger
->
addAttribute
(
pv
->
name
()
+
"_state_"
+
"phipll"
,
pv
->
attribute
(
"phipll"
));
logger
->
addAttribute
(
pv
->
name
()
+
"_state_"
+
"p"
,
pv
->
attribute
(
"p"
));
logger
->
addAttribute
(
pv
->
name
()
+
"_state_"
+
"q"
,
pv
->
attribute
(
"q"
));
logger
->
addAttribute
(
pv
->
name
()
+
"_state_"
+
"phid"
,
pv
->
attribute
(
"phid"
));
...
...
@@ -171,7 +178,7 @@ namespace CIGREMV {
}
}
std
::
shared_ptr
<
DPsim
::
SwitchEvent
>
createEventAddPowerConsumption
(
String
nodeName
,
Real
eventTime
,
Real
additionalActivePower
,
SystemTopology
&
system
,
Domain
domain
)
{
std
::
shared_ptr
<
DPsim
::
SwitchEvent
>
createEventAddPowerConsumption
(
String
nodeName
,
Real
eventTime
,
Real
additionalActivePower
,
SystemTopology
&
system
,
Domain
domain
,
DPsim
::
DataLogger
::
Ptr
logger
)
{
// TODO: use base classes ph1
if
(
domain
==
CPS
::
Domain
::
DP
)
{
...
...
@@ -182,6 +189,7 @@ namespace CIGREMV {
loadSwitch
->
open
();
system
.
addComponent
(
loadSwitch
);
system
.
connectComponentToNodes
<
Complex
>
(
loadSwitch
,
{
CPS
::
SimNode
<
Complex
>::
GND
,
connectionNode
});
logger
->
addAttribute
(
"pv_switchedload_i"
,
loadSwitch
->
attribute
(
"i_intf"
));
return
DPsim
::
SwitchEvent
::
make
(
eventTime
,
loadSwitch
,
true
);
}
else
{
return
nullptr
;
...
...
models/Include/cps/DP/DP_Ph1_AvVoltageSourceInverterDQ.h
View file @
d859c457
...
...
@@ -111,7 +111,7 @@ namespace Ph1 {
/// Setter for parameters of filter
void
setFilterParameters
(
Real
Lf
,
Real
Cf
,
Real
Rf
,
Real
Rc
);
/// Setter for initial values applied in controllers
void
setInitialStateValues
(
Real
thetaPLLInit
,
Real
phiPLLInit
,
Real
pInit
,
Real
qInit
,
void
setInitialStateValues
(
Real
pInit
,
Real
qInit
,
Real
phi_dInit
,
Real
phi_qInit
,
Real
gamma_dInit
,
Real
gamma_qInit
);
// #### MNA section ####
...
...
models/Include/cps/Signal/PowerControllerVSI.h
View file @
d859c457
...
...
@@ -21,36 +21,27 @@ namespace Signal {
public
SharedFactory
<
PowerControllerVSI
>
{
protected:
/// Simulation time step
Real
mTimeStep
;
/// Complex nominal voltage [V]
Real
mVnom
;
/// Power parameters
// Power parameters
Real
mPref
;
Real
mQref
;
/// PLL
Real
mOmegaN
;
Real
mKiPLL
;
Real
mKpPLL
;
/// Power controller
// Power controller
Real
mOmegaCutoff
;
Real
mKiPowerCtrld
;
Real
mKiPowerCtrlq
;
Real
mKpPowerCtrld
;
Real
mKpPowerCtrlq
;
//
/
Current controller
// Current controller
Real
mKiCurrCtrld
;
Real
mKiCurrCtrlq
;
Real
mKpCurrCtrld
;
Real
mKpCurrCtrlq
;
/// states
Real
mThetaPLL
=
0
;
Real
mPhiPLL
;
// states
Real
mP
;
Real
mQ
;
Real
mPhi_d
;
...
...
@@ -59,8 +50,6 @@ namespace Signal {
Real
mGamma_q
;
/// initial values for states
Real
mThetaPLLInit
=
0
;
Real
mPhiPLLInit
=
0
;
Real
mPInit
=
0
;
Real
mQInit
=
0
;
Real
mPhi_dInit
=
0
;
...
...
@@ -69,27 +58,26 @@ namespace Signal {
Real
mGamma_qInit
=
0
;
/// state space matrices
Matrix
mA
=
Matrix
::
Zero
(
8
,
8
);
Matrix
mB
=
Matrix
::
Zero
(
8
,
7
);
Matrix
mC
=
Matrix
::
Zero
(
2
,
8
);
Matrix
mD
=
Matrix
::
Zero
(
2
,
7
);
Matrix
mA
=
Matrix
::
Zero
(
6
,
6
);
Matrix
mB
=
Matrix
::
Zero
(
6
,
6
);
Matrix
mC
=
Matrix
::
Zero
(
2
,
6
);
Matrix
mD
=
Matrix
::
Zero
(
2
,
6
);
/// state vector
Matrix
mStates
=
Matrix
::
Zero
(
8
,
1
);
Matrix
mStates
=
Matrix
::
Zero
(
6
,
1
);
/// input vector
Matrix
mU
=
Matrix
::
Zero
(
7
,
1
);
Matrix
mU
=
Matrix
::
Zero
(
6
,
1
);
public:
PowerControllerVSI
(
String
name
,
Logger
::
Level
logLevel
=
Logger
::
Level
::
off
);
/// Setter for general parameters
void
setParameters
(
Real
sysOmega
,
Real
sysVoltNom
,
Real
Pref
,
Real
Qref
);
void
setParameters
(
Real
Pref
,
Real
Qref
);
/// Setter for parameters of control loops
void
setControllerParameters
(
Real
Kp_pll
,
Real
Ki_pll
,
Real
Kp_powerCtrl
,
Real
Ki_powerCtrl
,
Real
Kp_currCtrl
,
Real
Ki_currCtrl
,
Real
Omega_cutoff
);
void
setControllerParameters
(
Real
Kp_powerCtrl
,
Real
Ki_powerCtrl
,
Real
Kp_currCtrl
,
Real
Ki_currCtrl
,
Real
Omega_cutoff
);
/// Setter for initial state values
void
setInitialStateValues
(
Real
thetaPLLInit
,
Real
phiPLLInit
,
Real
pInit
,
Real
qInit
,
Real
phi_dInit
,
Real
phi_qInit
,
Real
gamma_dInit
,
Real
gamma_qInit
);
void
setInitialStateValues
(
Real
pInit
,
Real
qInit
,
Real
phi_dInit
,
Real
phi_qInit
,
Real
gamma_dInit
,
Real
gamma_qInit
);
///
void
initializeStateSpaceModel
(
Real
omega
,
Real
timeStep
,
Attribute
<
Matrix
>::
Ptr
leftVector
);
...
...
models/Source/DP/DP_Ph1_AvVoltageSourceInverterDQ.cpp
View file @
d859c457
...
...
@@ -47,8 +47,6 @@ DP::Ph1::AvVoltageSourceInverterDQ::AvVoltageSourceInverterDQ(String uid, String
addAttribute
<
MatrixComp
>
(
"Vsref"
,
&
mVsref
,
Flags
::
read
|
Flags
::
write
);
// state variables
addAttribute
<
Real
>
(
"theta"
,
Flags
::
read
|
Flags
::
write
);
addAttribute
<
Real
>
(
"phipll"
,
Flags
::
read
|
Flags
::
write
);
addAttribute
<
Real
>
(
"p"
,
Flags
::
read
|
Flags
::
write
);
addAttribute
<
Real
>
(
"q"
,
Flags
::
read
|
Flags
::
write
);
addAttribute
<
Real
>
(
"phid"
,
Flags
::
read
|
Flags
::
write
);
...
...
@@ -84,8 +82,6 @@ DP::Ph1::AvVoltageSourceInverterDQ::AvVoltageSourceInverterDQ(String uid, String
mPowerControllerVSI
->
setAttributeRef
(
"Irc_q"
,
attribute
<
Real
>
(
"Irc_q"
));
mPowerControllerVSI
->
setAttributeRef
(
"Vs_d"
,
attribute
<
Real
>
(
"Vs_d"
));
mPowerControllerVSI
->
setAttributeRef
(
"Vs_q"
,
attribute
<
Real
>
(
"Vs_q"
));
setAttributeRef
(
"theta"
,
mPowerControllerVSI
->
attribute
<
Real
>
(
"theta"
));
setAttributeRef
(
"phipll"
,
mPowerControllerVSI
->
attribute
<
Real
>
(
"phipll"
));
setAttributeRef
(
"p"
,
mPowerControllerVSI
->
attribute
<
Real
>
(
"p"
));
setAttributeRef
(
"q"
,
mPowerControllerVSI
->
attribute
<
Real
>
(
"q"
));
setAttributeRef
(
"phid"
,
mPowerControllerVSI
->
attribute
<
Real
>
(
"phid"
));
...
...
@@ -101,7 +97,7 @@ void DP::Ph1::AvVoltageSourceInverterDQ::setParameters(Real sysOmega, Real sysVo
mSLog
->
info
(
"Nominal Voltage={} [V] Nominal Omega={} [1/s]"
,
sysVoltNom
,
sysOmega
);
mSLog
->
info
(
"Active Power={} [W] Reactive Power={} [VAr]"
,
Pref
,
Qref
);
mPowerControllerVSI
->
setParameters
(
sysOmega
,
sysVoltNom
,
Pref
,
Qref
);
mPowerControllerVSI
->
setParameters
(
Pref
,
Qref
);
mOmegaN
=
sysOmega
;
mVnom
=
sysVoltNom
;
...
...
@@ -135,7 +131,7 @@ void DP::Ph1::AvVoltageSourceInverterDQ::setControllerParameters(Real Kp_pll, Re
// TODO: add and use Omega_nominal instead of Omega_cutoff
mPLL
->
setParameters
(
Kp_pll
,
Ki_pll
,
Omega_cutoff
);
mPLL
->
composeStateSpaceMatrices
();
mPowerControllerVSI
->
setControllerParameters
(
Kp_pll
,
Ki_pll
,
Kp_powerCtrl
,
Ki_powerCtrl
,
Kp_currCtrl
,
Ki_currCtrl
,
Omega_cutoff
);
mPowerControllerVSI
->
setControllerParameters
(
Kp_powerCtrl
,
Ki_powerCtrl
,
Kp_currCtrl
,
Ki_currCtrl
,
Omega_cutoff
);
}
void
DP
::
Ph1
::
AvVoltageSourceInverterDQ
::
setFilterParameters
(
Real
Lf
,
Real
Cf
,
Real
Rf
,
Real
Rc
)
{
...
...
@@ -151,17 +147,15 @@ void DP::Ph1::AvVoltageSourceInverterDQ::setFilterParameters(Real Lf, Real Cf, R
mSubCapacitorF
->
setParameters
(
mCf
);
}
void
DP
::
Ph1
::
AvVoltageSourceInverterDQ
::
setInitialStateValues
(
Real
thetaPLLInit
,
Real
phiPLLInit
,
Real
pInit
,
Real
qInit
,
void
DP
::
Ph1
::
AvVoltageSourceInverterDQ
::
setInitialStateValues
(
Real
pInit
,
Real
qInit
,
Real
phi_dInit
,
Real
phi_qInit
,
Real
gamma_dInit
,
Real
gamma_qInit
)
{
mSLog
->
info
(
"Initial State Value Parameters:"
);
mSLog
->
info
(
"ThetaPLLInit = {}, PhiPLLInit = {}"
,
thetaPLLInit
,
phiPLLInit
);
mSLog
->
info
(
"PInit = {}, QInit = {}"
,
pInit
,
qInit
);
mSLog
->
info
(
"Phi_dInit = {}, Phi_qInit = {}"
,
phi_dInit
,
phi_qInit
);
mSLog
->
info
(
"Gamma_dInit = {}, Gamma_qInit = {}"
,
gamma_dInit
,
gamma_qInit
);
mPowerControllerVSI
->
setInitialStateValues
(
thetaPLLInit
,
phiPLLInit
,
pInit
,
qInit
,
phi_dInit
,
phi_qInit
,
gamma_dInit
,
gamma_qInit
);
mPowerControllerVSI
->
setInitialStateValues
(
pInit
,
qInit
,
phi_dInit
,
phi_qInit
,
gamma_dInit
,
gamma_qInit
);
}
void
DP
::
Ph1
::
AvVoltageSourceInverterDQ
::
initialize
(
Matrix
frequencies
)
{
...
...
models/Source/Signal/PowerControllerVSI.cpp
View file @
d859c457
...
...
@@ -14,8 +14,6 @@ using namespace CPS::Signal;
PowerControllerVSI
::
PowerControllerVSI
(
String
name
,
Logger
::
Level
logLevel
)
:
SimSignalComp
(
name
,
name
,
logLevel
)
{
addAttribute
<
Real
>
(
"theta"
,
&
mThetaPLL
,
Flags
::
read
|
Flags
::
write
);
addAttribute
<
Real
>
(
"phipll"
,
&
mPhiPLL
,
Flags
::
read
|
Flags
::
write
);
addAttribute
<
Real
>
(
"p"
,
&
mP
,
Flags
::
read
|
Flags
::
write
);
addAttribute
<
Real
>
(
"q"
,
&
mQ
,
Flags
::
read
|
Flags
::
write
);
addAttribute
<
Real
>
(
"phid"
,
&
mPhi_d
,
Flags
::
read
|
Flags
::
write
);
...
...
@@ -31,24 +29,18 @@ PowerControllerVSI::PowerControllerVSI(String name, Logger::Level logLevel) :
addAttribute
<
Real
>
(
"Vs_q"
,
Flags
::
read
|
Flags
::
write
);
}
void
PowerControllerVSI
::
setParameters
(
Real
sysOmega
,
Real
sysVoltNom
,
Real
Pref
,
Real
Qref
)
{
void
PowerControllerVSI
::
setParameters
(
Real
Pref
,
Real
Qref
)
{
mPref
=
Pref
;
mQref
=
Qref
;
mVnom
=
sysVoltNom
;
mOmegaN
=
sysOmega
;
// use Pref and Qref as init values for states P and Q
// init values for other states remain zero (if not changed using setInitialStateValues)
mPInit
=
Pref
;
mQInit
=
Qref
;
}
void
PowerControllerVSI
::
setControllerParameters
(
Real
Kp_pll
,
Real
Ki_pll
,
Real
Kp_powerCtrl
,
Real
Ki_powerCtrl
,
Real
Kp_currCtrl
,
Real
Ki_currCtrl
,
Real
Omega_cutoff
)
{
void
PowerControllerVSI
::
setControllerParameters
(
Real
Kp_powerCtrl
,
Real
Ki_powerCtrl
,
Real
Kp_currCtrl
,
Real
Ki_currCtrl
,
Real
Omega_cutoff
)
{
mKpPLL
=
Kp_pll
;
mKiPLL
=
Ki_pll
;
mKiPowerCtrld
=
Ki_powerCtrl
;
mKiPowerCtrlq
=
Ki_powerCtrl
;
mKpPowerCtrld
=
Kp_powerCtrl
;
...
...
@@ -61,39 +53,33 @@ void PowerControllerVSI::setControllerParameters(Real Kp_pll, Real Ki_pll,
// Set state space matrices using controller parameters
mA
<<
0
,
mKiPLL
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
-
mOmegaCutoff
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
-
mOmegaCutoff
,
0
,
0
,
0
,
0
,
0
,
0
,
-
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
-
mKpPowerCtrld
,
0
,
mKiPowerCtrld
,
0
,
0
,
0
,
0
,
0
,
0
,
mKpPowerCtrlq
,
0
,
mKiPowerCtrlq
,
0
,
0
;
-
mOmegaCutoff
,
0
,
0
,
0
,
0
,
0
,
0
,
-
mOmegaCutoff
,
0
,
0
,
0
,
0
,
-
1
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
-
mKpPowerCtrld
,
0
,
mKiPowerCtrld
,
0
,
0
,
0
,
0
,
mKpPowerCtrlq
,
0
,
mKiPowerCtrlq
,
0
,
0
;
mB
<<
1
,
0
,
0
,
0
,
mKpPLL
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
-
1
,
0
,
0
,
0
,
0
,
0
,
mKpPowerCtrld
,
0
,
0
,
0
,
-
1
,
0
,
0
,
0
,
-
mKpPowerCtrlq
,
0
,
0
,
0
,
-
1
;
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
-
1
,
0
,
0
,
0
,
0
,
mKpPowerCtrld
,
0
,
0
,
0
,
-
1
,
0
,
0
,
-
mKpPowerCtrlq
,
0
,
0
,
0
,
-
1
;
mC
<<
0
,
0
,
-
mKpPowerCtrld
*
mKpCurrCtrld
,
0
,
mKpCurrCtrld
*
mKiPowerCtrld
,
0
,
mKiCurrCtrld
,
0
,
0
,
0
,
0
,
mKpPowerCtrlq
*
mKpCurrCtrlq
,
0
,
mKpCurrCtrlq
*
mKiPowerCtrlq
,
0
,
mKiCurrCtrlq
;
-
mKpPowerCtrld
*
mKpCurrCtrld
,
0
,
mKpCurrCtrld
*
mKiPowerCtrld
,
0
,
mKiCurrCtrld
,
0
,
0
,
mKpPowerCtrlq
*
mKpCurrCtrlq
,
0
,
mKpCurrCtrlq
*
mKiPowerCtrlq
,
0
,
mKiCurrCtrlq
;
mD
<<
0
,
mKpCurrCtrld
*
mKpPowerCtrld
,
0
,
0
,
0
,
-
mKpCurrCtrld
,
0
,
0
,
0
,
-
mKpCurrCtrlq
*
mKpPowerCtrlq
,
0
,
0
,
0
,
-
mKpCurrCtrlq
;
mKpCurrCtrld
*
mKpPowerCtrld
,
0
,
0
,
0
,
-
mKpCurrCtrld
,
0
,
0
,
-
mKpCurrCtrlq
*
mKpPowerCtrlq
,
0
,
0
,
0
,
-
mKpCurrCtrlq
;
}
void
PowerControllerVSI
::
setInitialStateValues
(
Real
thetaPLLInit
,
Real
phiPLLInit
,
Real
pInit
,
Real
qInit
,
void
PowerControllerVSI
::
setInitialStateValues
(
Real
pInit
,
Real
qInit
,
Real
phi_dInit
,
Real
phi_qInit
,
Real
gamma_dInit
,
Real
gamma_qInit
)
{
mThetaPLLInit
=
thetaPLLInit
;
mPhiPLLInit
=
phiPLLInit
;
mPInit
=
pInit
;
mQInit
=
qInit
;
mPhi_dInit
=
phi_dInit
;
...
...
@@ -104,27 +90,24 @@ void PowerControllerVSI::setInitialStateValues(Real thetaPLLInit, Real phiPLLIni
void
PowerControllerVSI
::
initializeStateSpaceModel
(
Real
omega
,
Real
timeStep
,
Attribute
<
Matrix
>::
Ptr
leftVector
)
{
mTimeStep
=
timeStep
;
mOmegaN
=
omega
;
mOmegaCutoff
=
omega
;
// update B matrix due to its dependence on Irc
updateBMatrixStateSpaceModel
();
// initialization of input
mU
<<
mOmegaN
,
mPref
,
mQref
,
attribute
<
Real
>
(
"Vc_d"
)
->
get
(),
attribute
<
Real
>
(
"Vc_q"
)
->
get
(),
attribute
<
Real
>
(
"Irc_d"
)
->
get
(),
attribute
<
Real
>
(
"Irc_q"
)
->
get
();
mU
<<
mPref
,
mQref
,
attribute
<
Real
>
(
"Vc_d"
)
->
get
(),
attribute
<
Real
>
(
"Vc_q"
)
->
get
(),
attribute
<
Real
>
(
"Irc_d"
)
->
get
(),
attribute
<
Real
>
(
"Irc_q"
)
->
get
();
mSLog
->
info
(
"Initialization of input:
\n
"
+
Logger
::
matrixToString
(
mU
));
// initialization of states
mThetaPLL
=
mThetaPLLInit
;
// mThetaPLL = std::arg(mVirtualNodes[4]->initialSingleVoltage());
mPhiPLL
=
mPhiPLLInit
;
mP
=
mPInit
;
mQ
=
mQInit
;
mPhi_d
=
mPhi_dInit
;
mPhi_q
=
mPhi_qInit
;
mGamma_d
=
mGamma_dInit
;
mGamma_q
=
mGamma_qInit
;
mStates
<<
mThetaPLL
,
mPhiPLL
,
mP
,
mQ
,
mPhi_d
,
mPhi_q
,
mGamma_d
,
mGamma_q
;
mStates
<<
mP
,
mQ
,
mPhi_d
,
mPhi_q
,
mGamma_d
,
mGamma_q
;
mSLog
->
info
(
"Initialization of states:
\n
"
+
Logger
::
matrixToString
(
mStates
));
// initialization of output
...
...
@@ -136,24 +119,28 @@ void PowerControllerVSI::initializeStateSpaceModel(Real omega, Real timeStep, At
}
void
PowerControllerVSI
::
signalStep
(
Real
time
,
Int
timeStepCount
)
{
Matrix
newStates
=
Matrix
::
Zero
(
8
,
1
);
Matrix
newU
=
Matrix
::
Zero
(
7
,
1
);
Matrix
newStates
=
Matrix
::
Zero
(
6
,
1
);
Matrix
newU
=
Matrix
::
Zero
(
6
,
1
);
newU
<<
mPref
,
mQref
,
attribute
<
Real
>
(
"Vc_d"
)
->
get
(),
attribute
<
Real
>
(
"Vc_q"
)
->
get
(),
attribute
<
Real
>
(
"Irc_d"
)
->
get
(),
attribute
<
Real
>
(
"Irc_q"
)
->
get
();
newU
<<
mOmegaN
,
mPref
,
mQref
,
attribute
<
Real
>
(
"Vc_d"
)
->
get
(),
attribute
<
Real
>
(
"Vc_q"
)
->
get
(),
attribute
<
Real
>
(
"Irc_d"
)
->
get
(),
attribute
<
Real
>
(
"Irc_q"
)
->
get
();
mSLog
->
info
(
"Time {}:"
,
time
);
mSLog
->
info
(
"Input values: inputCurr =
\n
{}
\n
, inputPrev =
\n
{}
\n
, statePrev =
\n
{}"
,
newU
,
mU
,
mStates
);
newStates
=
Math
::
StateSpaceTrapezoidal
(
mStates
,
mA
,
mB
,
mTimeStep
,
newU
,
mU
);
// update states
mThetaPLL
=
newStates
(
0
,
0
);
mPhiPLL
=
newStates
(
1
,
0
);
mP
=
newStates
(
2
,
0
);
mQ
=
newStates
(
3
,
0
);
mPhi_d
=
newStates
(
4
,
0
);
mPhi_q
=
newStates
(
5
,
0
);
mGamma_d
=
newStates
(
6
,
0
);
mGamma_q
=
newStates
(
7
,
0
);
mP
=
newStates
(
0
,
0
);
mQ
=
newStates
(
1
,
0
);
mPhi_d
=
newStates
(
2
,
0
);
mPhi_q
=
newStates
(
3
,
0
);
mGamma_d
=
newStates
(
4
,
0
);
mGamma_q
=
newStates
(
5
,
0
);
mStates
=
newStates
;
mSLog
->
info
(
"State values: stateCurr =
\n
{}"
,
mStates
);
mU
=
newU
;
// new output
...
...
@@ -161,13 +148,15 @@ void PowerControllerVSI::signalStep(Real time, Int timeStepCount) {
vsdq
=
mC
*
mStates
+
mD
*
mU
;
attribute
<
Real
>
(
"Vs_d"
)
->
set
(
vsdq
(
0
,
0
));
attribute
<
Real
>
(
"Vs_q"
)
->
set
(
vsdq
(
1
,
0
));
mSLog
->
info
(
"Output values: outputCurr =
\n
{}"
,
vsdq
);
}
void
PowerControllerVSI
::
updateBMatrixStateSpaceModel
()
{
mB
.
coeffRef
(
2
,
3
)
=
mOmegaCutoff
*
attribute
<
Real
>
(
"Irc_d"
)
->
get
();
mB
.
coeffRef
(
2
,
4
)
=
mOmegaCutoff
*
attribute
<
Real
>
(
"Irc_q"
)
->
get
();
mB
.
coeffRef
(
3
,
3
)
=
-
mOmegaCutoff
*
attribute
<
Real
>
(
"Irc_q"
)
->
get
();
mB
.
coeffRef
(
3
,
4
)
=
mOmegaCutoff
*
attribute
<
Real
>
(
"Irc_d"
)
->
get
();
mB
.
coeffRef
(
0
,
2
)
=
mOmegaCutoff
*
attribute
<
Real
>
(
"Irc_d"
)
->
get
();
mB
.
coeffRef
(
0
,
3
)
=
mOmegaCutoff
*
attribute
<
Real
>
(
"Irc_q"
)
->
get
();
mB
.
coeffRef
(
1
,
2
)
=
-
mOmegaCutoff
*
attribute
<
Real
>
(
"Irc_q"
)
->
get
();
mB
.
coeffRef
(
1
,
3
)
=
mOmegaCutoff
*
attribute
<
Real
>
(
"Irc_d"
)
->
get
();
}
Task
::
List
PowerControllerVSI
::
getTasks
()
{
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment