Hello Nikhar,
I have implemented the ROSCO controller in MATLAB, but I am facing an issue. The StateMachine routine uses the variables LocalVar.GenArTq and LocalVar.GenBrTq to decide the region of controller operation.
[code] ! — Pitch controller state machine —
IF (CntrPar%PC_ControlMode == 1) THEN
LocalVar%PC_State = 1
ELSE
LocalVar%PC_State = 0
END IF
! --- Torque control state machine ---
IF (LocalVar%PC_PitComT >= LocalVar%VS_Rgn3Pitch) THEN
IF (CntrPar%VS_ControlMode == 1) THEN ! Region 3
LocalVar%VS_State = 5 ! Constant power tracking
ELSE
LocalVar%VS_State = 4 ! Constant torque tracking
END IF
ELSE
IF (LocalVar%GenArTq >= CntrPar%VS_MaxOMTq*1.01) THEN ! Region 2 1/2 - active PI torque control
LocalVar%VS_State = 3
ELSEIF ((LocalVar%GenSpeedF < CntrPar%VS_RefSpd) .AND. &
(LocalVar%GenBrTq >= CntrPar%VS_MinOMTq)) THEN ! Region 2 - optimal torque is proportional to the square of the generator speed
LocalVar%VS_State = 2
ELSEIF (LocalVar%GenBrTq < CntrPar%VS_MinOMTq) THEN ! Region 1 1/2
LocalVar%VS_State = 1
ELSE ! Error state, Debug
LocalVar%VS_State = 0
END IF
END IF
[/code]
However, these two variables are not calculated for CntrPar.VS_ControlMode = 2 and 3.
[code] ! Optimal Tip-Speed-Ratio tracking controller
IF ((CntrPar%VS_ControlMode == 2) .OR. (CntrPar%VS_ControlMode == 3)) THEN
! Constant Power, update VS_MaxTq
IF (CntrPar%VS_ControlMode == 3) THEN
LocalVar%VS_MaxTq = min((CntrPar%VS_RtPwr/(CntrPar%VS_GenEff/100.0))/LocalVar%GenSpeedF, CntrPar%VS_MaxTq)
END IF
! PI controller
LocalVar%GenTq = PIController(LocalVar%VS_SpdErr, CntrPar%VS_KP(1), CntrPar%VS_KI(1), CntrPar%VS_MinTq, LocalVar%VS_MaxTq, LocalVar%DT, LocalVar%VS_LastGenTrq, .FALSE., objInst%instPI)
LocalVar%GenTq = saturate(LocalVar%GenTq, CntrPar%VS_MinTq, LocalVar%VS_MaxTq)
! K*Omega^2 control law with PI torque control in transition regions
ELSE
! Update PI loops for region 1.5 and 2.5 PI control
LocalVar%GenArTq = PIController(LocalVar%VS_SpdErrAr, CntrPar%VS_KP(1), CntrPar%VS_KI(1), CntrPar%VS_MaxOMTq, CntrPar%VS_ArSatTq, LocalVar%DT, CntrPar%VS_MaxOMTq, .FALSE., objInst%instPI)
LocalVar%GenBrTq = PIController(LocalVar%VS_SpdErrBr, CntrPar%VS_KP(1), CntrPar%VS_KI(1), CntrPar%VS_MinTq, CntrPar%VS_MinOMTq, LocalVar%DT, CntrPar%VS_MinOMTq, .FALSE., objInst%instPI)
! The action
IF (LocalVar%VS_State == 1) THEN ! Region 1.5
LocalVar%GenTq = LocalVar%GenBrTq
ELSEIF (LocalVar%VS_State == 2) THEN ! Region 2
LocalVar%GenTq = CntrPar%VS_Rgn2K*LocalVar%GenSpeedF*LocalVar%GenSpeedF
ELSEIF (LocalVar%VS_State == 3) THEN ! Region 2.5
LocalVar%GenTq = LocalVar%GenArTq
ELSEIF (LocalVar%VS_State == 4) THEN ! Region 3, constant torque
LocalVar%GenTq = CntrPar%VS_RtTq
ELSEIF (LocalVar%VS_State == 5) THEN ! Region 3, constant power
LocalVar%GenTq = (CntrPar%VS_RtPwr/(CntrPar%VS_GenEff/100.0))/LocalVar%GenSpeedF
END IF
! Saturate
LocalVar%GenTq = saturate(LocalVar%GenTq, CntrPar%VS_MinTq, CntrPar%VS_MaxTq)
ENDIF
[/code]
For this case, do I have to initialize them and assign a constant value? I need your suggestions on this.
Thanks,
Shubham