Torque Controller

I am designing a 1.5MW (Offshore) machine that I am adapting a controller for. How do I calculate Region 1.5 and Region 2.5 offsets? Also, is there a 1.5MW controller that I would be able to look at as a reference to mine? The CertTest area of Fast has the WindPACT .fst file, but there is no controller associated with it.

Thank you!


I’m not myself aware of a 1.5 controller file, but I wonder if you have the windpact.fst file, are there details about the VS law within the FST file itself, ie the values of VS_RtGnSp, VS_RtTq, VS_Rgn2K and VS_SlPc? This should provide most of what you would need to design a basic controller.

Regarding region 1.5 and 2.5, these can either be implemented as PI controllers (see for example: … urbine.pdf ) or more simply as is often done, these are just linear interpolations from your optimal kw2 law in region 2 to rated torque in region 3. The parameters above would outline such a line (determined by the slip curve or slope). Similarly, 1.5 would be down to 0 torque.

Hope this helps!


I have been able to get my 1.5 MW machine to run in simulink, but my GenTq and GenPwr are not leaving region 1.5 The GenSpeed and RotSpeed look okay to me but I may be overlooking something. If anyone can help that would be great!

I should be able to help. Could you use a save to workspace block within your simulink code to save all the input and output signals to the Torque Controller block and post the .mat file? Also, could you copy and paste the code of regionSelectTq?


Thank you so much Paul. I was receiving an error stating the .mat extension was not allowed as an attachment, so I was able to convert it to a spread sheet. Let me know if you need it in a different format as I would be able to email it to you. The file has 6 rows, Time, Generator torque (which is row two and three: Command Torque and Tg respectively), Pitch, Switch, and HSSspeed. I was unable to figure out how to label them in the To File Block.

Below is the code for the embedded Matlab Baseline Torque Controller (regionSelectTq)

Thank you again for taking time to help me.


I think that you have some unit conversion issues (I believe K and w are not in the same units, or same side of the gearbox at least), but I’m not sure the exact rated values of your turbine.

I have found where you can reference the 1.5 controller that should be helpful.

First you can get some input values from Test12.fst:

1800.0 VS_RtGnSp - Rated generator speed for simple variable-speed generator control (HSS side) (rpm) [used only when VSContrl=1]
8376.58 VS_RtTq - Rated generator torque/constant generator torque in Region 3 for simple variable-speed generator control (HSS side) (N-m) [used only when VSContrl=1]
0.002585 VS_Rgn2K - Generator torque constant in Region 2 for simple variable-speed generator control (HSS side) (N-m/rpm^2) [used only when VSContrl=1]
9999.9E-9 VS_SlPc - Rated generator slip percentage in Region 2 1/2 for simple variable-speed generator control (%) [used only when VSContrl=1]

Next inside of FAST.f90 you’ll find the control logic:

  IF ( HSS_Spd >= VS_RtGnSp )  THEN      ! We are in region 3 - torque is constant
     GenTrq = VS_RtTq
  ELSEIF ( HSS_Spd < VS_TrGnSp )  THEN   ! We are in region 2 - torque is proportional to the square of the generator speed
     GenTrq = VS_Rgn2K*HSS_Spd*HSS_Spd
  ELSE                                   ! We are in region 2 1/2 - simple induction generator transition region
     GenTrq = VS_Slope*( HSS_Spd - VS_SySp )

Finally, look at FAST_IO.f90 for the conversion from input to stored variables:

VS_RtGnSp = VS_RtGnSp* RPM2RPS ! Convert rated speed to rad/sec.
VS_Rgn2K = VS_Rgn2K /( RPM2RPSRPM2RPS ) ! Convert Region 2 torque constant to Nm/(rad/sec)^2.
VS_SySp = VS_RtGnSp/( 1.0 + 0.01
VS_SlPc ) ! Synchronous speed of region 2 1/2 induction generator.
IF ( VS_SlPc < SQRT(EPSILON(VS_SlPc) ) ) THEN ! We don’t have a region 2 so we’ll use VS_TrGnSp = VS_RtGnSp
VS_Slope = 9999.9
VS_TrGnSp = VS_RtGnSp
VS_Slope = VS_RtTq /( VS_RtGnSp - VS_SySp ) ! Torque/speed slope of region 2 1/2 induction generator.
IF ( ABS(VS_Rgn2K) < EPSILON(VS_SlPc) ) THEN ! .TRUE. if the Region 2 torque is flat, and thus, the denominator in the ELSE condition is zero
VS_TrGnSp = VS_SySp ! Transitional generator speed between regions 2 and 2 1/2.
ELSE ! .TRUE. if the Region 2 torque is quadratic with speed
VS_TrGnSp = ( VS_Slope - SQRT( VS_Slope*( VS_Slope - 4.0VS_Rgn2KVS_SySp ) ) )/( 2.0*VS_Rgn2K ) ! Transitional generator speed between regions 2 and 2 1/2.

Note that the 1.5 currently has no 2.5, but if your turbine is a little different than you could, although it won’t do much given the closeness of the optimal curve and the rated operating point.

Good luck!