Gain Scheduling

Dear Hernan,

I’m sorry, but I’m not sure I know how to respond to your question. What have you changed between the “Classic PID” and Gain-Scheduled PID" response curves?

Best regards,

Dear Jonkman,

I’m sorry if i didn’t make it enough clear. The difference is that PID clasic is the normal way of control and GS PID is a PID controller with a gain scheduling factor. What i tried to explain is that i realize they have the same behavior. In mentioned that GS PID should have almoust the same response for a wide range of step wind velocities.

Which is the correct approach for testing this controllers?

I hope this to be more clear than former question.

Best regards,

Dear Hernan,

Yes, I would expect the effect of gain scheduling to be more prominent for conditions away from the operating point used to set the gains for the controller without gain scheduling. That said, the report you linked to is not a report I was involved in writing; you may want to contact the lead other (Alan Wright) for additional guidance (Alan does not regularly check this forum).

Best regards,

Dear Jonkman

As always so helpful. Thanks a lot and i will try to contact Alan Wright inorder to solve this doubt.

Best regards,

Dear Jason,

I would like to do the sensitivity analaysis of aerodynamic power to blade pitch in region 3 with another wind turbine. That is why firstly I tryed to reproduce your test with the NREL 5MW. I got the same results as those of Ville ([url]Gain Scheduling]):

It can be said that I need to apply the frozen wake, rigth?

Then, I tryed with the FAST version you posted there (…%20zation.exe), but a error message is displayed saying that it cannot be read the TStart. The values is set to 0.0, but I changed to any other value and it continues displaying the same error. Would you know why it could be due?

Thank you in advance,

Dear Joannes,

Yes, using frozen wake will give you the results you expect.

However, I would not go back to use the customized version of FAST v6.01. (But if you wish to track down an error in the processing of the input file, enable the “Echo” flag.)

Instead, the option to use frozen wake is included as a standard option in the linearization functionality of FAST v8.16 and OpenFAST. I suggest you upgrade to the newest version.

Best regards,

Dear all,

I am currently working on the design of the pitch-control for a 15 MW floating turbine, and I am currently using the IEA Wind 15-Megawatt Offshore Reference Wind Turbine model in OpenFAST (v2.4.0).

In this control design process, I must linearize the model in OpenFAST in order to obtain the values of the partial derivatives of power or aerodynamic torque with respect to the collective blade pitch angle. One expects to have a linear evolution of this derivative as a function of the pitch angle and I obtained such a result. However, I need to check my approach because some things are odd in my simulations and I am not fully confident with the consistency of the results. I followed the following approach:

For each wind speed :

  1. Run OpenFAST without linearization and check the convergence of the key variables
  2. Initialize the DOFs of rotor speed and initial blade pitch angle (in the ElastoDyn file) with the rated value for rotor speed (7.55 rpm) and the value of blade pitch that allows the rated torque to be reached.
  3. Linearize in OpenFAST (new simulation) with the CalcSteady feature enabled (which will allow to calculate an operating point and perform the linearization around this operating point). The Trim Case is the pitch.

When I linearize at a single operating point (NLinTimes = 1), the blade pitch obtained in the linearization file (ie the one at which the aerodynamic power is derived) is the same as the one I used to initialize the model (corresponding to a rated speed and torque in the case without linearization). However, the time of simulation is always t=0.025s which seems really random, even more that it is also this time of simulation when I don’t initialize correctly rotor speed and blade pitch. Also it seems “rapid” to linearize at this time.

If I set NLinTimes = 2 or more, the blade pitch values at each wind speed (read from the lin file or even from the Blade pitch times series) are different from the initial values and this is surprising (because not value corresponding to a steady state). One of the hypothesis I thought of, is that when FAST performs several linearization, these ones which are very close in time, interfere with each other and thus disturb the results. However, I augment the simulation time, the linearization were then more spaced but the observation remains. When I set the TrimCase equal to the torque (TrimCase = 2), the problem is solved but is it consistent to choose the torque as the variable to be trimmed ?

Finally, if when set CalcSteady = False, I need to choose the operating point about which FAST will perform the linearization, so I take a time at which it seems that convergence had occurred. The pitch value remains “normal” (ie equal to the blade pitch corresponding to rated torque) but is it consistent ? Moreover, the aerodynamic derivative curve is no longer linear.

To resume, I am newer sure about how to define the following parameters: CalcSteady, TrimCase, NLinTimes to have results that I can use with confidence for my control design.

I hope that my question is clear enough and I am indeed available for any further information about my simulations or my issues.

Thank you,

Best regards,

Adèle des Moutis
DORIS Engineering
Energy Renewable Energy Department

PS : for your information, I disabled HydroDyn and MoorDyn, as well as the corresponding DOF for now.

Dear Adèle,

When the rotor is spinning, I would not recommend using NLinTimes = 1. When the rotor is spinning, I would generally recommend linearizing every 10-degrees of azimuth, so, NLinTimes, which is the number of times to linearize in one rotor revolution should be set to 36. NLinTimes = 1 is most useful when the rotor is not spinning. Perhaps the steady-state calculation is not working as expected (a bug?) when the rotor is spinning and NLinTimes = 1, but this setup is not recommended anyway.

I’m not sure I fully understand what you are saying when you discuss the NLinTimes = 2 solution.

For an operational variable-speed rotor, in general, I would recommend setting:

  • CalcSteady = True – to ensure the model is in steady state before linearizing
  • NLinTimes = 36 – to linearize once every 10 degrees of azimuth
  • TrimCase = 2 when linearizing below rated (Region 2) – this will find the generator torque necessary to reach the desired rotor speed defined by RotSpeed in ElastoDyn; in this case, set BlPitch in ElastoDyn equal to the pitch at maximum power coefficient
  • TrimCase = 3 when linearizing above rated (Region 3) – this will find the blade pitch necessary to reach the desired rotor speed defined by RotSpeed in ElastoDyn; in this case, you likely want to set the generator torque to rated torque, which you can do by setting VSContrl = 1, VS_RtTq to the desired generator torque, and VS_RtGnSp = VS_Rgn2K = VS_SlPc = 0.0001 (a very small number greater than zero) in ServoDyn

I hope that helps.

Best regards,

Dear J. Jonkman,
Thank you very much for your rapid answer. It helped a lot. I was able to perform linearization: for each wind speed above rated, I extracted the aerodynamic sensitivity to rotor collective blade pitch angle (in the D matrix of the linearization output files) for each 36 linearization and associated blade pitch at operating point and averaged. I found a linear law between ∂P/∂θ and θ and the orders of magnitude seem coherent.

I still, however, have some questions:

  1. Is it necessary that I linearize again with the HydroDyn enabled module? Or is the previous work sufficient ?
  2. While studying the ROSCO control (in the document “An Update to the NREL Baseline Wind Turbine Controller” and in the script ROSCO_toolbox/ at main · NREL/ROSCO_toolbox · GitHub) I noticed that the method of gains computing is a little bit different than the one presented in your document (“Dynamics Modeling and Loads Analysis of an Offshore Floating Wind Turbine”) or other reference documents
    a) The ways of computing the aerodynamic derivatives are different (numerical linearization via OpenFAST or analytical linearization), but is it fundamentally different?
    b) Then, it seems that there is a difference in the value of the gains (Kp): calculus yields 2ξ ω=(Kp N)/(Ω_0 I) ∂P/∂θ-P_0/(Ω_0^2 I) or 2ξ ω=(Kp N)/I (∂Ta)/∂θ-1/I (∂T_a)/∂Ω depending on how we perform the Taylor development of the generator torque and aerodynamic torque and when I try to compare, I have a sign error. Could you please clarify this point?
    c) Can we access the derivative of the aerodynamic torque with respect to the rotor speed in the D matrix in the .lin file?
  3. Finally, the gains (in the DISCON-UMaineSemi.IN file) suggested by the NREL do not keep the same sign in the whole blade pitch range. I don’t understand why. Could you help me on this last point?

Thank you for your precious help.
Best regards,

Adèle des Moutis
DORIS Engineering

Hi Adèle,
I might be able to chime in with some responses here.

  1. I would assume that, for standard PI controller tuning purposes, linearizing with HydroDyn enabled is unnecessary.

  2. First, I might point you to the most recent publication on ROSCO that is available through WES Discussions:
    a) The calculations of these derivatives is fundamentally different so we expect the results to be similar, but not the same. Generally, the derivatives are calculated through perturbations from an operating point in OpenFAST, which is not the same as the analytical derivatives calculated from the equations of motion used in ROSCO.
    b) If I am following correctly, perhaps the sign error you are seeing is a result of the conventions used in the NREL 5MW report and in ROSCO. In the 5MW report Δθ is defined as a “perturbation … about the rated speed”, so Δθ = θ(t) - θ_ref. From this, equation (7-11) falls out and you get your first result for 2ξω. In ROSCO, the PI controller is put in the closed loop using a more classical negative feedback loop, so Δθ = θ_ref - θ(t). This eventually shakes out to be equation (13) in the ROSCO report, which corresponds to your second result for 2ξω. Regardless, the final gains should be similar (but not equal!) using either method, just with a sign flip.
    c) We cannot access it from the D matrix, as rotor speed is not an input. You can, however, pull it out of the C matrix by looking at the relationship between AeroDyn output RtAeroMxh and the rotor speed state.

  3. This is purely a result of the analytical tuning used in the ROSCO toolbox. Per equation (13) in the linked report, and remembering that B is always negative, if 2 ξ_des ω_des + A(v_op) < 0 (which happens at high wind speeds, in this case), then kp can flip signs.

A few links:
NREL 5MW report:
ROSCO report: … 021-19.pdf

Hope this helps!


Dear Nikhar,

Thanks a lot for your very interessing answers. I may come back to you with more questions after some personnal work to fully understand all of it.

Best regards,

Adèle des Moutis
DORIS Engineering

Dear Nikhar,
I have some remaining questions about the ROSCO controller and especially about the computation of the gains.

= Is it ok to use the ROSCO method (ie use this formula 2ξ_n ω_n=(K_p N)/J (∂τ_a)/∂β-N∂τ/J∂ω(ν) for gains) but to compute the gains numerically (i.e. linearize in OpenFAST and then read the different values in the matrices in .lin files)
= To do that I understood that you must use the wind speed estimator, to have a pitch dependant gain. Could you tell me how to get it with OpenFAST?
= If the wind speed estimator is not ease to use, is it ok to replace ∂τ/∂ω(ν) by -P_0/(Ω_0 ²I) ?

= Finaly, I don’t understand this “controller flag” :
! VS_ControlMode - Generator torque control mode in above rated conditions {0: constant torque, 1: constant power, 2: TSR tracking PI control}
Why the “TSR tracking PI control mode” concerns the above rated conditions and not the below rated conditions?

= More generally, several remarks were raised:
Is it possible to adjust the sampling period of the control, (to make it compatible with real conditions)?
In the blade pitch PI controller, is the generator speed reference a step or a reference trajectory?
Finally, how are the gains chosen between two operating points?

I sincerely thank you for your precious help.
Best regards,

Hello everyone,

I need to learn the gain scheduling method of NREL/TP-500-38060 (5 MW Reference Wind Turbine) before applying the same method for wind turbines of different sizes for my research.
Are the pitch angle values in Table 7-1 input or output of linearization analyses? The report refers to them as “the corresponding blade-pitch angles that produce the rated mechanical power (P0= 5.296610 MW)”. It seems like the pitch angles for diffrent wind speeds are calculated before the linearization.
My question is, how are pitch angles in the table calculated? I am using FAST v8.16.00a.
I tried the following:

  • In TurbSim, I set the Turbulence Intensity and Power Law exponent to zero in order to get a uniform and unchanging wind field for each wind speed.
  • In FAST, for examle for the case of Wind Speed = 13 m/s, I set RotSpeed=12.1, PCMode=5, VSContrl=5, TPitManS(1,2,3)=0, and I change the BlPitchF(1,2,3)and BlPitch(1,2,3) to diffrerent pitch angles by trial and error. Wheter I set GenDOF=True or False, I see that a pitch angle of 6.0 degrees gives a mechanical power much closer to P0 as compared to the pitch angle of 6.60 in the table (See Figures 1-2).
    For wind speed of 17 m/s, the pitch angle given in Table 7-1 results in mechanical power close to the intended P0 (Figures 3).
    However, two issues remain:
  1. The fluctuating shape of RtAeroPwr curve makes the determination of the exact value of the produced power subjective. Therefore, how are the pitch angle values in Table 7-1 adjusted to a two decimal place accuracy (0.01 degrees accuracy)? Should I take the average of the last part of the curve?
  2. In order to adjust the pitch angles with high accuracy, a large number of trial and error analyses is needed for each wind speed.
    Please kindly let me know whether or not I am taking the right approach for calculating the pitch angles.
    Thank you very much in advance.

Dear Behrouz,

It is been a while since that report was written, but if I recall correctly, we enabled GenDOF and used TrimCase = 3 in the linearization process, which finds the pitch angle necessary to achieve the desired rotor speed based on the fixed wind speed (based on an internal controller implemented within FAST). TrimCase was available in FAST v5-v7, but was not available in FAST v8. TrimCase was reintroduced again In OpenFAST, starting in version 2.4 and newer. In FAST v8, a trial and error approach could be used. You could also implement a pitch controller that aims to minimize rotor-speed error. Regardless, I would recommend upgrading to OpenFAST.

A couple other comments:

  • Instead of specifying zero turbulence intensity and shear in TurbSim, it is far easier to use the uniform wind option of InflowWind (WindType = 1)
  • The pitch angle you are deriving is likely different from that reported in NREL/TP-500-38060 because the aerodynamics routines have been overhauled (improved) quite a bit between FAST v8.16 that you are using and the pre-FAST v7 version used in that report.

Best regards,

Dear Dr. Jonkman,

Thank you very much for the answer.

Best regards,

Hi Adèle,

Sorry about the slight delay with response here!

  • I don’t see any reason that you shouldn’t be able to use the methods used by ROSCO to calculate the gains, but to use the sensitivities from the linearization files. I have not done this yet myself, however.

  • You do not need to have a wind speed estimator in order to have a pitch dependent gain. One way to schedule the gain is to have a linear scaling such as the classical NREL 5MW controller. In the ROSCO tools, the Cp surface is used to calculate the expected steady state gain depending on tip speed ratio for each wind speed, and the gains are calculated accordingly. This is explained at the end of section 4 of the ROSCO report.

  • If using ROSCO, the wind speed estimator should not be too much trouble. At first glance, I’m not sure that ∂τ/∂ω(ν) by -P_0/(Ω_0 ²I) would be totally reasonable, as the replacement term would be a constant. Maybe I’m misinterpreting something here, though.

  • The wording is admittedly a bit confusing about VS_ControlMode. “TSR tracking PI control” is referring to the below-rated behavior. VS_ControlMode = 2 is TSR tracking PI control below rated and constant torque above rated. VS_ControlMode = 2 is TSR tracking PI control below rated and constant power above rated. Please see Table 1 (and associated sections) in the ROSCO report for more detail on the theoretical implementations of this.

  • The controller communication interval would need to be increased with the OpenFAST time-step due to the discrete nature of the software.

  • The blade pitch controller’s reference speed is generally rated rotor speed. Please see the ROSCO report for the exact detail of how this is implemented. There may be some future work to enable dynamic reference speeds for the pitch controller, but that has not been done yet.

  • The gains are linearly interpolated between operating points.

ROSCO report: … 021-19.pdf

Hope this helps!

Hi Nikhar,

Thank you very much for your very interessing answers. It helped me a lot.

Best regars,

Adèle des Moutis
DORIS Engineering