13 std::shared_ptr<Base::PSSParameters> parameters) {
16 std::dynamic_pointer_cast<Signal::PSS1AParameters>(parameters)) {
19 if (mParameters->Tw == 0) {
20 SPDLOG_LOGGER_ERROR(
mSLog,
"PSS1A: Tw must be non-zero (used as "
21 "divisor in washout filter)");
24 if (mParameters->T2 == 0) {
25 SPDLOG_LOGGER_ERROR(
mSLog,
"PSS1A: T2 must be non-zero (used as "
26 "divisor in first lead-lag block)");
29 if (mParameters->T4 == 0) {
30 SPDLOG_LOGGER_ERROR(
mSLog,
"PSS1A: T4 must be non-zero (used as "
31 "divisor in second lead-lag block)");
35 SPDLOG_LOGGER_INFO(
mSLog,
44 "\nMaximum stabilizer output signal: {:e}"
45 "\nMinimum stabilizer output signal: {:e}"
47 mParameters->Kp, mParameters->Kv, mParameters->Kw,
48 mParameters->T1, mParameters->T2, mParameters->T3,
49 mParameters->T4, mParameters->Vs_max,
50 mParameters->Vs_min, mParameters->Tw);
53 mA = 1. - mParameters->T1 / mParameters->T2;
54 mB = 1. - mParameters->T3 / mParameters->T4;
57 mSLog,
"Type of parameters class of {} has to be PSS1AParameters!",
65 Real Vh = sqrt(pow(Vd, 2.) + pow(Vq, 2.));
67 mV1 = -(mParameters->Kw * omega + mParameters->Kp * activePower +
68 mParameters->Kv * Vh);
69 mV2 = mA * (mParameters->Kw * omega + mParameters->Kp * activePower +
70 mParameters->Kv * Vh + mV1);
72 mB * (mV2 + (mParameters->T1 / mParameters->T2) *
73 (mParameters->Kw * omega + mParameters->Kp * activePower +
74 mParameters->Kv * Vh + mV1));
75 mVs = mV3 + (mParameters->T3 / mParameters->T4) *
76 (mV2 + (mParameters->T1 / mParameters->T2) *
77 (mParameters->Kw * omega +
78 mParameters->Kp * activePower +
79 mParameters->Kv * Vh + mV1));
82 mActivePower_prev = activePower;
85 SPDLOG_LOGGER_INFO(
mSLog,
97 Real Vh = sqrt(pow(Vd, 2.) + pow(Vq, 2.));
104 mV1 = mV1_prev - dt / mParameters->Tw *
105 (mParameters->Kw * mOmega_prev +
106 mParameters->Kp * mActivePower_prev +
107 mParameters->Kv * mVh_prev + mV1_prev);
108 mV2 = mV2_prev + dt / mParameters->T2 *
109 (mA * (mParameters->Kw * mOmega_prev +
110 mParameters->Kp * mActivePower_prev +
111 mParameters->Kv * mVh_prev + mV1_prev) -
114 dt / mParameters->T4 *
115 (mB * (mV2_prev + (mParameters->T1 / mParameters->T2) *
116 (mParameters->Kw * mOmega_prev +
117 mParameters->Kp * mActivePower_prev +
118 mParameters->Kv * mVh_prev + mV1_prev)) -
121 mVs = mV3 + (mParameters->T3 / mParameters->T4) *
122 (mV2 + (mParameters->T1 / mParameters->T2) *
123 (mParameters->Kw * omega +
124 mParameters->Kp * activePower +
125 mParameters->Kv * Vh + mV1));
128 mActivePower_prev = activePower;
131 if (mVs > mParameters->Vs_max)
132 mVs = mParameters->Vs_max;
133 else if (mVs < mParameters->Vs_min)
134 mVs = mParameters->Vs_min;