Dear all,
Currently, I am modifying the 5MW model of OpenFAST to adapt it to my 5.5MW wind turbine model. I have adjusted each module according to the parameters of the 5.5MW wind turbine. However, possibly due to issues with the controller, the turbine only generates a little over 3MW of power at a wind speed of 10m/s, even though I intended it to reach the rated power of 5.5MW at this wind speed. I have divided the five regions in OpenFAST in line with the power curve of the 5.5MW wind turbine. Below is the modified DISCON.f90 code; I have not made any changes to the logical section at the end of the code.
REAL(4) :: Alpha ! Current coefficient in the recursive, single-pole, low-pass filter, (-).
REAL(4) :: BlPitch (3) ! Current values of the blade pitch angles, rad.
REAL(4) :: ElapTime ! Elapsed time since the last call to the controller, sec.
REAL(4), PARAMETER :: CornerFreq = 1.570796 ! Corner frequency (-3dB point) in the recursive, single-pole, low-pass filter, rad/s. -- chosen to be 1/4 the blade edgewise natural frequency ( 1/4 of approx. 1Hz = 0.25Hz = 1.570796rad/s)
REAL(4) :: GenSpeed ! Current HSS (generator) speed, rad/s.
REAL(4), SAVE :: GenSpeedF ! Filtered HSS (generator) speed, rad/s.
REAL(4) :: GenTrq ! Electrical generator torque, N-m.
REAL(4) :: GK ! Current value of the gain correction factor, used in the gain scheduling law of the pitch controller, (-).
REAL(4) :: HorWindV ! Horizontal hub-heigh wind speed, m/s.
REAL(4), SAVE :: IntSpdErr ! Current integral of speed error w.r.t. time, rad.
REAL(4), SAVE :: LastGenTrq ! Commanded electrical generator torque the last time the controller was called, N-m.
REAL(4), SAVE :: LastTime ! Last time this DLL was called, sec.
REAL(4), SAVE :: LastTimePC ! Last time the pitch controller was called, sec.
REAL(4), SAVE :: LastTimeVS ! Last time the torque controller was called, sec.
REAL(4), PARAMETER :: OnePlusEps = 1.0 + EPSILON(OnePlusEps) ! The number slighty greater than unity in single precision.
REAL(4), PARAMETER :: PC_DT = 0.000125 !JASON:THIS CHANGED FOR ITI BARGE: 0.0001 ! Communication interval for pitch controller, sec.
REAL(4), PARAMETER :: PC_KI = 0.008068634 ! Integral gain for pitch controller at rated pitch (zero), (-).
REAL(4), PARAMETER :: PC_KK = 0.1099965 ! Pitch angle where the the derivative of the aerodynamic power w.r.t. pitch has increased by a factor of two relative to the derivative at rated pitch (zero), rad.
REAL(4), PARAMETER :: PC_KP = 0.01882681 ! Proportional gain for pitch controller at rated pitch (zero), sec.
REAL(4), PARAMETER :: PC_MaxPit = 1.570796 ! Maximum pitch setting in pitch controller, rad.
REAL(4), PARAMETER :: PC_MaxRat = 0.1396263 ! Maximum pitch rate (in absolute value) in pitch controller, rad/s.
REAL(4), PARAMETER :: PC_MinPit = 0.0 ! Minimum pitch setting in pitch controller, rad.
REAL(4), PARAMETER :: PC_RefSpd = 29.10 ! Desired (reference) HSS speed for pitch controller, rad/s.
REAL(4), SAVE :: PitCom (3) ! Commanded pitch of each blade the last time the controller was called, rad.
REAL(4) :: PitComI ! Integral term of command pitch, rad.
REAL(4) :: PitComP ! Proportional term of command pitch, rad.
REAL(4) :: PitComT ! Total command pitch based on the sum of the proportional and integral terms, rad.
REAL(4) :: PitRate (3) ! Pitch rates of each blade based on the current pitch angles and current pitch command, rad/s.
REAL(4), PARAMETER :: R2D = 57.295780 ! Factor to convert radians to degrees.
REAL(4), PARAMETER :: RPS2RPM = 9.5492966 ! Factor to convert radians per second to revolutions per minute.
REAL(4) :: SpdErr ! Current speed error, rad/s.
REAL(4) :: Time ! Current simulation time, sec.
REAL(4) :: TrqRate ! Torque rate based on the current and last torque commands, N-m/s.
REAL(4), PARAMETER :: VS_CtInSp = 10.44 ! Transitional generator speed (HSS side) between regions 1 and 1 1/2, rad/s.
REAL(4), PARAMETER :: VS_DT = 0.000125 !JASON:THIS CHANGED FOR ITI BARGE: 0.0001 ! Communication interval for torque controller, sec.
REAL(4), PARAMETER :: VS_MaxRat = 15000.0 ! Maximum torque rate (in absolute value) in torque controller, N-m/s.
REAL(4), PARAMETER :: VS_MaxTq = 220000.0 ! Maximum generator torque in Region 3 (HSS side), N-m. -- chosen to be 10% above VS_RtTq = 43.09355kNm
REAL(4), PARAMETER :: VS_Rgn2K = 197.37 ! Generator torque constant in Region 2 (HSS side), N-m/(rad/s)^2.
REAL(4), PARAMETER :: VS_Rgn2Sp = 13.57 ! Transitional generator speed (HSS side) between regions 1 1/2 and 2, rad/s.
REAL(4), PARAMETER :: VS_Rgn3MP = 0.016 ! Minimum pitch angle at which the torque is computed as if we are in region 3 regardless of the generator speed, rad. -- chosen to be 1.0 degree above PC_MinPit
REAL(4), PARAMETER :: VS_RtGnSp = 28.8 ! Rated generator speed (HSS side), rad/s. -- chosen to be 99% of PC_RefSpd
REAL(4), PARAMETER :: VS_RtPwr = 6000000.0 ! Rated generator generator power in Region 3, Watts. -- chosen to be 5MW divided by the electrical generator efficiency of 94.4%
REAL(4), SAVE :: VS_Slope15 ! Torque/speed slope of region 1 1/2 cut-in torque ramp , N-m/(rad/s).
REAL(4), SAVE :: VS_Slope25 ! Torque/speed slope of region 2 1/2 induction generator, N-m/(rad/s).
REAL(4), PARAMETER :: VS_SlPc = 10.0 ! Rated generator slip percentage in Region 2 1/2, %.
REAL(4), SAVE :: VS_SySp ! Synchronous speed of region 2 1/2 induction generator, rad/s.
REAL(4), SAVE :: VS_TrGnSp = 26.19 ! Transitional generator speed (HSS side) between regions 2 and 2 1/2, rad/s.
INTEGER(4) :: I ! Generic index.
INTEGER(4) :: iStatus ! A status flag set by the simulation as follows: 0 if this is the first call, 1 for all subsequent time steps, -1 if this is the final call at the end of the simulation.
INTEGER(4) :: K ! Loops through blades.
INTEGER(4) :: NumBl ! Number of blades, (-).
INTEGER(4), PARAMETER :: UnDb = 85 ! I/O unit for the debugging information
INTEGER(4), PARAMETER :: UnDb2 = 86 ! I/O unit for the debugging information
INTEGER(4), PARAMETER :: Un = 87 ! I/O unit for pack/unpack (checkpoint & restart)
INTEGER(4) :: ErrStat
LOGICAL(1), PARAMETER :: PC_DbgOut = .FALSE. ! Flag to indicate whether to output debugging information
CHARACTER( 1), PARAMETER :: Tab = CHAR( 9 ) ! The tab character.
CHARACTER( 25), PARAMETER :: FmtDat = "(F8.3,99('"//Tab//"',ES10.3E2,:))" ! The format of the debugging data
CHARACTER(SIZE(accINFILE)-1) :: InFile ! a Fortran version of the input C string (not considered an array here) [subtract 1 for the C null-character]
CHARACTER(SIZE(avcOUTNAME)-1):: RootName ! a Fortran version of the input C string (not considered an array here) [subtract 1 for the C null-character]
CHARACTER(SIZE(avcMSG)-1) :: ErrMsg ! a Fortran version of the C string argument (not considered an array here) [subtract 1 for the C null-character]
I acknowledge that I am new to using OpenFAST, so I would like to consult you: why does my OpenFAST power curve not match the actual power curve? Could you also provide some suggestions on how I should make modifications?
Best regards