DPsim
Loading...
Searching...
No Matches
FrequencyRampGenerator.cpp
Go to the documentation of this file.
1/* Copyright 2017-2021 Institute for Automation of Complex Power Systems,
2 * EONERC, RWTH Aachen University
3 *
4 * This Source Code Form is subject to the terms of the Mozilla Public
5 * License, v. 2.0. If a copy of the MPL was not distributed with this
6 * file, You can obtain one at https://mozilla.org/MPL/2.0/.
7 *********************************************************************************/
8
10
11using namespace CPS;
12
14 Real freqStart, Real rocof,
15 Real timeStart,
16 Real duration,
17 bool smoothRamp) {
18 mMagnitude = Math::abs(initialPhasor);
19 mInitialPhase = Math::phase(initialPhasor);
20
21 mFreqStart = freqStart;
22 mRocof = rocof;
23 mTimeStart = timeStart;
24 mDuration = duration;
25 mFreqEnd = freqStart + rocof * duration;
26 mOldTime = 0.0;
27
28 mSmoothRamp = smoothRamp;
29
30 **mSigOut = initialPhasor;
31 **mFreq = freqStart;
32
33 SPDLOG_LOGGER_INFO(mSLog, "Parameters:");
34 SPDLOG_LOGGER_INFO(mSLog,
35 "\nInitial Phasor={}"
36 "\nStart Frequency={} [Hz]"
37 "\nRoCoF={} [Hz/s]"
38 "\nStart time={} [s]"
39 "\nDuration={} [s]",
40 Logger::phasorToString(initialPhasor), freqStart, rocof,
41 timeStart, duration);
42}
43
45 if (mUseAbsoluteCalc) {
46 stepAbsolute(time);
47 return;
48 }
49
50 Real currPhase;
51 Real currFreq;
52 Real timestep = time - mOldTime;
53 mOldTime = time;
54
55 currPhase = Math::phase(attributeTyped<Complex>("sigOut")->get());
56
57 if (time <= mTimeStart) {
58 currFreq = mFreqStart;
59 } else if (time <= mTimeStart + mDuration) {
60 currFreq = mFreqStart + mRocof * (time - mTimeStart);
61 } else {
62 currFreq = mFreqEnd;
63 }
64 currPhase += 2. * PI * currFreq * timestep;
65
66 **mSigOut = mMagnitude * Complex(cos(currPhase), sin(currPhase));
67 **mFreq = currFreq;
68}
69
71 Real currPhase = mInitialPhase + 2 * PI * time * mFreqStart;
72 Real currFreq = mFreqStart;
73
74 if (time > mTimeStart + mDuration) {
75 currPhase += 2 * PI * mRocof / 2 * pow(mDuration, 2);
76 currPhase +=
77 2 * PI * mRocof * mDuration * (time - (mTimeStart + mDuration));
78 currFreq = mFreqEnd;
79 } else if (time > mTimeStart) {
80 if (mSmoothRamp) { // cos shape
81 // the phase is calculated as 2pi times the integral of the frequency term below
82 currPhase += 2 * PI * (mFreqEnd - mFreqStart) / 2 *
83 ((time - mTimeStart) -
84 2 * mDuration / (2 * PI) *
85 sin(2 * PI / (2 * mDuration) * (time - mTimeStart)));
86 currFreq += (mFreqEnd - mFreqStart) / 2 *
87 (1 - cos(2 * PI / (2 * mDuration) * (time - mTimeStart)));
88 } else { // linear
89 currPhase += 2 * PI * mRocof * pow(time - mTimeStart, 2) / 2;
90 currFreq += mRocof * (time - mTimeStart);
91 }
92 }
93
94 **mSigOut = mMagnitude * Complex(cos(currPhase), sin(currPhase));
95 **mFreq = currFreq;
96}
Attribute< T >::Ptr attributeTyped(const String &name) const
Return pointer to an attribute.
static String phasorToString(const Complex &num)
Definition Logger.cpp:57
static Real phase(Complex value)
Definition MathUtils.cpp:23
static Real abs(Complex value)
Definition MathUtils.cpp:27
void stepAbsolute(Real time)
implementation of inherited method step to update and return the current signal value
void setParameters(Complex initialPhasor, Real freqStart, Real ramp, Real timeStart, Real duration, bool smoothRamp=true)
set frequency ramp specific parameters
void step(Real time)
implementation of inherited method step to update and return the current signal value
const CPS::Attribute< Real >::Ptr mFreq
const CPS::Attribute< Complex >::Ptr mSigOut
Logger::Log mSLog
Component logger.
#define PI
Definition Definitions.h:43
double Real
Definition Definitions.h:62
std::complex< Real > Complex
Definition Definitions.h:63