From ffe48f88669d681fb123068fb2c05703af28df41 Mon Sep 17 00:00:00 2001 From: dzalkind Date: Wed, 17 Dec 2025 10:52:06 -0700 Subject: [PATCH 1/6] Draft new control schema --- windIO/schemas/turbine/turbine_schema.yaml | 381 +++++++-------------- 1 file changed, 126 insertions(+), 255 deletions(-) diff --git a/windIO/schemas/turbine/turbine_schema.yaml b/windIO/schemas/turbine/turbine_schema.yaml index 16c8110..f227c91 100644 --- a/windIO/schemas/turbine/turbine_schema.yaml +++ b/windIO/schemas/turbine/turbine_schema.yaml @@ -2618,112 +2618,140 @@ properties: # additionalProperties: True type: object description: Dictionary reporting the data describing the wind turbine controller - required: - - supervisory - - torque - - pitch + # required: # Should any of these be required? + # - torque + # - pitch properties: - supervisory: - type: object - required: - - Vin - - Vout - - maxTS - properties: - Vin: - type: number - description: Cut-in wind speed of the wind turbine. - units: m/s - minimum: 0 - maximum: 10 - Vout: - type: number - description: Cut-out wind speed of the wind turbine. - units: m/s - minimum: 0 - maximum: 50 - maxTS: - type: number - description: Maximum allowable blade tip speed. - units: m/s - minimum: 60 - maximum: 120 - pitch: - # additionalProperties: True + min_rotor_speed: + type: number + description: Minimum allowed rotor speed by the controller + units: rpm + minimum: 0 + rated_rotor_speed: + type: number + description: Rated rotor speed, regulated by the controller. rated_power * efficiencies / rated_rotor_speed = rated torque. + units: rpm + minimum: 0 + max_rotor_speed: + type: number + description: Maximum allowed rotor speed. Speeds greater than this will trigger a shutdown. Should be ~5-20% greater than rated_rotor_speed. + units: rpm + minimum: 0 + max_gen_torque: + type: number + description: Maximum allowed generator torque. Should be ~10-20% higher than rated torque. Used in constant power applications. + units: kNm + minimum: 0 + max_torque_rate: + type: number + description: Maximum torque rate of the wind turbine generator. + units: N*m/s + minimum: 0 + fine_pitch: + type: number + description: Pitch angle for optimal power production below rated. + units: deg + minimum: -90 + maximum: 90 + min_pitch_table: type: object - required: - - max_pitch_rate + description: Minimum pitch vs. wind speed table used for optimizing power production and/or limiting rotor thrust properties: + wind_speed: + $ref: "#/definitions/distributed_data/grid_nd" min_pitch: - type: number - description: Minimum pitch angle, where the default is 0 deg - units: deg - minimum: -10.0 - maximum: 90. - default: 0.0 - max_pitch: - type: number - description: Maximum pitch angle, where the default is 90 deg - units: deg - minimum: 10. - maximum: 120. - default: 90. - max_pitch_rate: - type: number - description: Maximum pitch rate of the rotor blades. - units: deg/s - minimum: 0 - maximum: 30. - ps_percent: - type: number - description: Nondimensional factor shaving peak thrust. 1 means no peak thrust shaving - minimum: 0 - default: 0.8 - maximum: 1. - torque: - # additionalProperties: True + $ref: "#/definitions/distributed_data/angle" + min_pitch_hardware: + type: number + description: Minimum pitch angle hardware limit. The pitch angle cannot be less than this value. + units: deg + minimum: -90 + maximum: 90 + max_pitch: + type: number + description: Maximum pitch angle using during parked or idling. Can be a hardware or software limit. + units: deg + minimum: -90 + maximum: 90 + max_pitch_rate: + type: number + description: Maximum pitch rate of the rotor blades. + units: deg/s + minimum: 0 + lpf_frequency: + type: number + description: Low pass filter frequency of generator/rotor speed measurement for the controller. + units: rad/s + minimum: 0 + lpf_damping: + type: number + description: Damping ratio of the low pass filter for generator/rotor speed measurement. + units: dimensionless + minimum: 0 + region2_k: + type: number + description: Optimal gain for below rated torque control (k * rotor_speed^2 = generator_torque). + units: N*m/(rpm)^2 + minimum: 0 + gen_torque_kp: + type: number + description: Gain from rotor speed (rpm) to generator torque (N*m) in a proportional controller. + units: N*m/rpm + gen_torque_ki: + type: number + description: Gain from rotor speed (rpm) to generator torque (N*m) in an integratal control element. + units: N*m/(rpm*s) + pitch_kp: type: object - required: - - tsr - - VS_minspd + description: Gain schedule (gain vs. pitch) from rotor speed (rpm) to blade pitch (deg) in a proportional controller. properties: - max_torque_rate: - type: number - description: Maximum torque rate of the wind turbine generator. - units: N*m/s - minimum: 1000 - maximum: 100000000 - tsr: - type: number - description: Rated tip speed ratio of the wind turbine. As default, it is maintained constant in region II. - units: dimensionless - minimum: 0 - maximum: 15 - VS_minspd: - type: number - description: Minimum rotor speed. - units: rpm - minimum: 0 - maximum: 20. - VS_maxspd: - type: number - description: Maximum rotor speed. - units: rpm - minimum: 0 - default: 100. - yaw: + pitch_angle: + $ref: "#/definitions/distributed_data/angle" + kp: + $ref: "#/definitions/distributed_data/nd" + units: deg/rpm # TODO: check that this overwrites correctly + pitch_ki: type: object - description: Yaw system data. - required: - - yaw_rate + description: Gain schedule (gain vs. pitch) from rotor speed (rpm) to blade pitch (deg) in an integral control element. properties: - yaw_rate: - type: number - description: Maximum yaw rate of the wind turbine. - units: deg/s - minimum: 0 - maximum: 30. - default: 1. + pitch_angle: + $ref: "#/definitions/distributed_data/angle" + ki: + $ref: "#/definitions/distributed_data/nd" + units: deg/(rpm*s) # TODO: check that this overwrites correctly + constant_power: + type: number + description: Flag for using consant torque (0) or constant power (1) torque control above rated. + enum: [0,1] + # gen_efficiency: # TODO: this one may be covered by other entries in windIO (efficiency, rpm_efficiency) + # type: number + # description: Combined efficiency of the generator, gearbox, and power electronics. + # minimum: 0 + gen_actuator_frequency: + type: number + description: Natural frequency of the generator torque actuator model 2nd order system. + units: rad/s + minimum: 0 + gen_actuator_damping: + type: number + description: Damping ratio of the generator torque actuator model 2nd order system. + units: dimensionless + minimum: 0 + pitch_actuator_frequency: + type: number + description: Natural frequency of the pitch actuator model 2nd order system. + units: rad/s + minimum: 0 + pitch_actuator_damping: + type: number + description: Damping ratio of the pitch actuator model 2nd order system. + units: dimensionless + minimum: 0 + yaw_rate: + type: number + description: Constant rate used during yawing maneuvers. + units: deg/s + minimum: 0 outputs: type: object description: Modal response and loads and performance metrics describing the turbine @@ -3331,160 +3359,3 @@ definitions: minItems: 3 maxItems: 3 uniqueItems: false - filter: - type: object - description: Linear filter, could be a LPF, HPF, NF, INF, or user_defined - required: - - filt_type - #- filt_def - properties: - filt_type: - type: string - description: Type of filter used, could be a LPF, HPF, NF, INF, or user_defined - enum: - - LPF - - HPF - - NF - - INF - - user_defined - # Seems unfinished - kenloen - #filt_def: - #LPF: - # type: object - # description: Low pass filter - # required: - # - omega - # - order - # optional: - # - damping - #HPF: - #NF: - #INF: - user_defined: - type: object - description: User defined filter - required: - - num - - den - optional: - - dt - properties: - num: - type: array - description: Numerator coefficients of linear filter - items: - type: number - units: dimensionless - minItems: 0 - uniqueItems: false - den: - type: array - description: Numerator coefficients of linear filter - items: - type: number - units: dimensionless - minItems: 1 - uniqueItems: false - dt: - type: number - description: Sampling rate of filter, -1 for continuous # DZ: will probably convert all to dt of simulation... not sure how to handle this - minimum: -1 - - state_space: - type: object - description: Linear state space model - required: - - ss_A - - ss_B - - ss_C - - ss_D - properties: - ss_A: - type: array - description: A matrix of linear state space model, flattened with n_states^2 elements - items: - type: number - minItems: 1 - uniqueItems: false - ss_B: - type: array - description: B matrix of linear state space model, flattened with n_states x n_inputs elements - items: - type: number - minItems: 1 - uniqueItems: false - ss_C: - type: array - description: C matrix of linear state space model, flattened with n_outputs x n_states elements - items: - type: number - minItems: 1 - uniqueItems: false - ss_D: - type: array - description: D matrix of linear state space model, flattened with n_outputs x n_inputs elements - items: - type: number - minItems: 1 - uniqueItems: false - # DZ: might be a good idea to check the number of states - ss_dt: - type: number - description: Sampling rate of filter, -1 for continuous # DZ: will probably convert all to dt of simulation... not sure how to handle this - minimum: -1 - - timeseries: - type: object - description: Array of time, value pairs # DZ: can we check that the number of elements are equal? - required: - - time - - value - optional: - - filename - properties: - time: - type: array - description: Time in timeseries - items: - type: number - units: s - minItems: 1 - uniqueItems: true # probably? - value: - type: array - description: Value in timeseries - items: - type: number - units: dimensionless #any - minItems: 1 - uniqueItems: false - # can we check that number of elements are equal? - filename: - type: string - description: Name of file with timeseries data - - activator: - type: object - description: Gain used to enable/disable control elements, can be used partially - required: - - wind_speeds - - act_gain - properties: - wind_speeds: - type: array - description: Array of wind speed breakpoints for activators - items: - type: number - units: m/s - minItems: 1 - uniqueItems: true - act_gain: - type: array - description: Array of gains from 0 to 1, enabling/disabling control element - items: - type: number - units: dimensionless - minItems: 1 - uniqueItems: false - minimum: 0 - maximum: 1 From 40a1bdd5377562d04e145d14f8bc7d60dc692074 Mon Sep 17 00:00:00 2001 From: dzalkind Date: Wed, 31 Dec 2025 13:16:04 -0700 Subject: [PATCH 2/6] Revise pitch limit names, descriptions for clarity --- windIO/schemas/turbine/turbine_schema.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/windIO/schemas/turbine/turbine_schema.yaml b/windIO/schemas/turbine/turbine_schema.yaml index f227c91..508e4d5 100644 --- a/windIO/schemas/turbine/turbine_schema.yaml +++ b/windIO/schemas/turbine/turbine_schema.yaml @@ -2649,7 +2649,7 @@ properties: minimum: 0 fine_pitch: type: number - description: Pitch angle for optimal power production below rated. + description: Constant pitch angle for optimal power production below rated (usually corresponding to a single, optimal tip speed ratio). units: deg minimum: -90 maximum: 90 @@ -2661,13 +2661,13 @@ properties: $ref: "#/definitions/distributed_data/grid_nd" min_pitch: $ref: "#/definitions/distributed_data/angle" - min_pitch_hardware: + min_pitch_limit: type: number - description: Minimum pitch angle hardware limit. The pitch angle cannot be less than this value. + description: Constant minimum pitch angle (hardware) limit. The pitch angle cannot be less than this value. units: deg minimum: -90 maximum: 90 - max_pitch: + max_pitch_limit: type: number description: Maximum pitch angle using during parked or idling. Can be a hardware or software limit. units: deg From 364485b68f4812dc575c792fd9091f65a7a6eb99 Mon Sep 17 00:00:00 2001 From: dzalkind Date: Wed, 31 Dec 2025 14:20:56 -0700 Subject: [PATCH 3/6] Update turbine input yamls with control inputs --- windIO/examples/turbine/IEA-15-240-RWT.yaml | 43 +++++++++++++------ .../turbine/IEA-15-240-RWT_VolturnUS-S.yaml | 43 +++++++++++++------ windIO/examples/turbine/IEA-22-280-RWT.yaml | 43 +++++++++++++------ .../turbine/IEA-22-280-RWT_Floater.yaml | 43 +++++++++++++------ 4 files changed, 116 insertions(+), 56 deletions(-) diff --git a/windIO/examples/turbine/IEA-15-240-RWT.yaml b/windIO/examples/turbine/IEA-15-240-RWT.yaml index 906b8a4..b6a3d7a 100644 --- a/windIO/examples/turbine/IEA-15-240-RWT.yaml +++ b/windIO/examples/turbine/IEA-15-240-RWT.yaml @@ -1327,17 +1327,32 @@ materials: G: 1520000000.0 unit_cost: 9.0 control: - supervisory: - Vin: 3.0 - Vout: 25.0 - maxTS: 95.0 - pitch: - ps_percent: 1.0 - max_pitch: 89.95437383553924 - max_pitch_rate: 2.0 - min_pitch: 0.0 - torque: - tsr: 9.0 - max_torque_rate: 1500000.0 - VS_minspd: 4.999999999999999 - VS_maxspd: 7.559999999999999 + min_rotor_speed: 5.000011692174984 + rated_rotor_speed: 7.559987120819503 + max_rotor_speed: 9.072022742169745 + max_gen_torque: 21765.4 + max_torque_rate: 4500.0 + fine_pitch: 0.0 + min_pitch_table: + wind_speed: [3.0, 3.2617, 3.5234, 3.7852, 4.0469, 4.3086, 4.5703, 4.8321, 5.0938, 5.3555, 5.6172, 5.879, 6.1407, 6.4024, 6.6641, 6.9259, 7.1876, 7.4493, 7.711, 7.9728, 8.2345, 8.4962, 8.7579, 9.0197, 9.2814, 9.5431, 9.8048, 10.0666, 10.3283, 10.59, 11.0703, 11.5507, 12.031, 12.5113, 12.9917, 13.472, 13.9523, 14.4327, 14.913, 15.3933, 15.8737, 16.354, 16.8343, 17.3147, 17.795, 18.2753, 18.7557, 19.236, 19.7163, 20.1967, 20.677, 21.1573, 21.6377, 22.118, 22.5983, 23.0787, 23.559, 24.0393, 24.5197, 25.0] + min_pitch: [3.437746770784939, 3.437746770784939, 3.437746770784939, 3.437746770784939, 3.437746770784939, 3.437746770784939, 3.2486706983917677, 3.019487580339438, 2.7501974166279517, 2.435070629305999, 2.1027551081301215, 1.7417916971977025, 1.357909974460051, 0.9740282517223996, 0.5729577951308232, 0.17188733853924698, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.813600069085769, 1.5355268909506063, 2.194428355351053, 2.807493196141034, 3.3861805692231655, 3.953408786402681, 4.491989113825654, 5.02483986329732, 5.540501878915061, 6.0504343165814936, 6.548907598345309, 7.041651302157817, 7.522935850067709, 8.0042203979776, 8.474045789984876, 8.94387118199215, 9.407966996048119, 9.866333232152776, 10.318969890306127, 10.771606548459477, 11.224243206612826, 11.66542070886356, 12.112327789065603, 12.547775713365029, 12.988953215615764, 13.41867156196388, 13.854119486263304, 14.278108254660115, 14.70782660100823, 15.131815369405041] + min_pitch_limit: 0.0 + max_pitch_limit: 89.95437383553924 + max_pitch_rate: 1.9996227050065731 + lpf_frequency: 1.0081 + lpf_damping: 0.7 + region2_k: 418673.00518505543 + gen_torque_kp: -3782257.6434363592 + gen_torque_ki: -471172.92459274357 + pitch_kp: + pitch_angle: [3.666929888837269, 5.213915935690491, 6.359831525952138, 7.39115555718762, 8.307888029396937, 9.167324722093172, 9.969465635276324, 10.714310768946394, 11.401860123103383, 12.08940947726037, 12.719663051904275, 13.349916626548183, 13.980170201192086, 14.55312799632291, 15.126085791453734, 15.699043586584558, 16.272001381715377, 16.78766339733312, 17.36062119246394, 17.876283208081684, 18.391945223699427, 18.907607239317166, 19.365973475421825, 19.881635491039564, 20.340001727144223, 20.855663742761966, 21.314029978866625, 21.772396214971284, 22.230762451075943, 22.689128687180602] + kp: [-6.941999999999999, -5.9862, -5.202, -4.545, -3.9876, -3.5088, -3.0917999999999997, -2.7264, -2.4036, -2.1162, -1.8581999999999996, -1.626, -1.4154, -1.224, -1.0488, -0.8879999999999999, -0.7404, -0.6035999999999999, -0.4768799999999999, -0.35916, -0.24954, -0.14712, -0.051269999999999996, 0.038646, 0.12317999999999998, 0.20273999999999998, 0.2778, 0.34872, 0.41585999999999995, 0.47945999999999994] + pitch_ki: + pitch_angle: [3.666929888837269, 5.213915935690491, 6.359831525952138, 7.39115555718762, 8.307888029396937, 9.167324722093172, 9.969465635276324, 10.714310768946394, 11.401860123103383, 12.08940947726037, 12.719663051904275, 13.349916626548183, 13.980170201192086, 14.55312799632291, 15.126085791453734, 15.699043586584558, 16.272001381715377, 16.78766339733312, 17.36062119246394, 17.876283208081684, 18.391945223699427, 18.907607239317166, 19.365973475421825, 19.881635491039564, 20.340001727144223, 20.855663742761966, 21.314029978866625, 21.772396214971284, 22.230762451075943, 22.689128687180602] + ki: [-0.7242, -0.6539999999999999, -0.5958, -0.54726, -0.50598, -0.47051999999999994, -0.43967999999999996, -0.41267999999999994, -0.38874, -0.3675, -0.34841999999999995, -0.33119999999999994, -0.31565999999999994, -0.30144, -0.28847999999999996, -0.2766, -0.26567999999999997, -0.25554, -0.24617999999999998, -0.23747999999999994, -0.22938, -0.22175999999999998, -0.21467999999999995, -0.20801999999999998, -0.20178, -0.19589999999999996, -0.19032, -0.1851, -0.18012, -0.17543999999999998] + constant_power: 0.0 + gen_actuator_frequency: 10000.0 + gen_actuator_damping: 1.0 + pitch_actuator_frequency: 3.14 + pitch_actuator_damping: 0.707 + yaw_rate: 0.49847328176381617 diff --git a/windIO/examples/turbine/IEA-15-240-RWT_VolturnUS-S.yaml b/windIO/examples/turbine/IEA-15-240-RWT_VolturnUS-S.yaml index 209cfc4..cb48171 100644 --- a/windIO/examples/turbine/IEA-15-240-RWT_VolturnUS-S.yaml +++ b/windIO/examples/turbine/IEA-15-240-RWT_VolturnUS-S.yaml @@ -1322,17 +1322,32 @@ materials: unit_cost: 1.0 orth: 0.0 control: - supervisory: - Vin: 3.0 - Vout: 25.0 - maxTS: 95.0 - pitch: - ps_percent: 1.0 - max_pitch: 89.95437383553924 - max_pitch_rate: 2.0 - min_pitch: 0.0 - torque: - tsr: 9.0 - max_torque_rate: 1500000.0 - VS_minspd: 4.999999999999999 - VS_maxspd: 7.559999999999999 + min_rotor_speed: 5.000011692174984 + rated_rotor_speed: 7.559987120819503 + max_rotor_speed: 9.072022742169745 + max_gen_torque: 21765.4 + max_torque_rate: 4500.0 + fine_pitch: 0.0 + min_pitch_table: + wind_speed: [3.0, 3.2669, 3.5338, 3.8007, 4.0676, 4.3345, 4.6014, 4.8683, 5.1352, 5.4021, 5.669, 5.9359, 6.2028, 6.4697, 6.7366, 7.0034, 7.2703, 7.5372, 7.8041, 8.071, 8.3379, 8.6048, 8.8717, 9.1386, 9.4055, 9.6724, 9.9393, 10.2062, 10.4731, 10.74, 11.2153, 11.6907, 12.166, 12.6413, 13.1167, 13.592, 14.0673, 14.5427, 15.018, 15.4933, 15.9687, 16.444, 16.9193, 17.3947, 17.87, 18.3453, 18.8207, 19.296, 19.7713, 20.2467, 20.722, 21.1973, 21.6727, 22.148, 22.6233, 23.0987, 23.574, 24.0493, 24.5247, 25.0] + min_pitch: [3.437746770784939, 3.437746770784939, 3.437746770784939, 3.437746770784939, 3.437746770784939, 3.437746770784939, 3.2200228086352265, 2.985110112631589, 2.7043607930174858, 2.3777748497929165, 2.034000172714422, 1.6615776058793874, 1.2662367272391195, 0.8708958485988513, 0.4640958140559668, 0.057295779513082325, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3495042550298022, 1.1745634800181877, 1.902219879834333, 2.532473454478239, 3.036676314193363, 3.655470732934652, 4.2456172619194, 4.807115901147607, 5.357155384473197, 5.890006133944863, 6.4056681495626036, 6.921330165180345, 7.419803446944161, 7.918276728707976, 8.399561276617868, 8.88084582452776, 9.356400794486344, 9.826226186493619, 10.290322000549585, 10.754417814605553, 11.207054472758902, 11.659691130912252, 12.112327789065603, 12.553505291316336, 13.000412371518378, 13.435860295817804, 13.87130822011723, 14.301026566465348, 14.736474490764772, 15.160463259161583, 15.584452027558394, 16.01417037390651, 16.43242956435201, 16.85068875479751, 17.263218367291703] + min_pitch_limit: 0.0 + max_pitch_limit: 89.95437383553924 + max_pitch_rate: 1.9996227050065731 + lpf_frequency: 1.0081 + lpf_damping: 0.7 + region2_k: 418673.00518505543 + gen_torque_kp: -3741699.6822785153 + gen_torque_ki: -471172.92459274357 + pitch_kp: + pitch_angle: [3.552338329811104, 5.099324376664327, 6.245239966925973, 7.276563998161455, 8.193296470370772, 9.052733163067007, 9.854874076250159, 10.599719209920229, 11.287268564077218, 11.974817918234205, 12.60507149287811, 13.235325067522018, 13.865578642165922, 14.438536437296746, 15.068790011940651, 15.584452027558394, 16.157409822689214, 16.730367617820036, 17.24602963343778, 17.76169164905552, 18.27735366467326, 18.793015680291003, 19.251381916395662, 19.7670439320134, 20.22541016811806, 20.7410721837358, 21.199438419840458, 21.657804655945117, 22.116170892049777, 22.574537128154436] + kp: [-6.857999999999999, -5.9262, -5.1588, -4.514999999999999, -3.9672, -3.4955999999999996, -3.0846, -2.724, -2.4048, -2.1203999999999996, -1.8648, -1.6343999999999996, -1.4256, -1.2353999999999998, -1.0614, -0.9017999999999998, -0.7547999999999999, -0.6185999999999999, -0.49284, -0.37566, -0.26639999999999997, -0.16440000000000002, -0.06881999999999999, 0.020819999999999998, 0.10511999999999999, 0.1845, 0.25937999999999994, 0.33018, 0.39719999999999994, 0.46074] + pitch_ki: + pitch_angle: [3.552338329811104, 5.099324376664327, 6.245239966925973, 7.276563998161455, 8.193296470370772, 9.052733163067007, 9.854874076250159, 10.599719209920229, 11.287268564077218, 11.974817918234205, 12.60507149287811, 13.235325067522018, 13.865578642165922, 14.438536437296746, 15.068790011940651, 15.584452027558394, 16.157409822689214, 16.730367617820036, 17.24602963343778, 17.76169164905552, 18.27735366467326, 18.793015680291003, 19.251381916395662, 19.7670439320134, 20.22541016811806, 20.7410721837358, 21.199438419840458, 21.657804655945117, 22.116170892049777, 22.574537128154436] + ki: [-0.7175999999999999, -0.6486, -0.5917199999999999, -0.5440799999999999, -0.50352, -0.4686, -0.4382399999999999, -0.41153999999999996, -0.38789999999999997, -0.36684, -0.34793999999999997, -0.3308999999999999, -0.31548, -0.30138, -0.28854, -0.27671999999999997, -0.26586000000000004, -0.25578, -0.24642, -0.23777999999999996, -0.22968, -0.22211999999999996, -0.21509999999999999, -0.20844, -0.2022, -0.19632, -0.1908, -0.18551999999999996, -0.18059999999999998, -0.17586] + constant_power: 0.0 + gen_actuator_frequency: 10000.0 + gen_actuator_damping: 1.0 + pitch_actuator_frequency: 3.14 + pitch_actuator_damping: 0.707 + yaw_rate: 0.49847328176381617 diff --git a/windIO/examples/turbine/IEA-22-280-RWT.yaml b/windIO/examples/turbine/IEA-22-280-RWT.yaml index 4e86652..1dd42e7 100644 --- a/windIO/examples/turbine/IEA-22-280-RWT.yaml +++ b/windIO/examples/turbine/IEA-22-280-RWT.yaml @@ -1534,17 +1534,32 @@ materials: orth: 0.0 unit_cost: 3.63 control: - supervisory: - Vin: 3.0 - Vout: 25.0 - maxTS: 105.0 - torque: - tsr: 9.153211158238001 - VS_minspd: 1.975 - VS_maxspd: 7.162 - max_torque_rate: 4500000.0 - pitch: - ps_percent: 0.8 - max_pitch: 89.95437383553924 - max_pitch_rate: 2.0 - min_pitch: -0.9549247399288653 + min_rotor_speed: 1.8459745229456574 + rated_rotor_speed: 7.061131867192266 + max_rotor_speed: 8.473281846258034 + max_gen_torque: 34305.7 + max_torque_rate: 4500.0 + fine_pitch: -4.010704565915763 + min_pitch_table: + wind_speed: [3.0, 3.2936, 3.5872, 3.8808, 4.1744, 4.468, 4.7616, 5.0552, 5.3488, 5.6424, 5.936, 6.2296, 6.5232, 6.8168, 7.1104, 7.404, 7.6976, 7.9912, 8.2848, 8.5785, 8.8721, 9.1657, 9.4593, 9.7529, 10.0465, 10.3401, 10.6337, 10.9273, 13.3125, 13.7621, 14.2116, 14.6611, 15.1106, 15.5601, 16.0097, 16.4592, 16.9087, 17.3582, 17.8077, 18.2572, 18.7068, 19.1563, 19.6058, 20.0553, 20.5048, 20.9543, 21.4039, 21.8534, 22.3029, 22.7524, 23.2019, 23.6514, 24.101, 24.5505, 25.0] + min_pitch: [0.5786873730821315, 0.5099324376664327, 0.43544792429942564, 0.36669298888372687, 0.2807493196141034, 0.18334649444186343, 0.08594366926962349, -0.011459155902616465, -0.11459155902616465, -0.2119943841984046, -0.31512678732195276, -0.4068000345428845, -0.492743703812508, -0.5844169510334397, -0.6760901982543714, -0.7792226013779195, -0.8766254265501595, -0.9797578296737077, -1.0771606548459478, -1.180293057969496, -1.283425461093044, -0.985487407625016, -0.3838817227376516, 0.22345354010102106, 0.813600069085769, 1.306343772898277, 1.8048170546620932, 2.3032903364259094, 3.707036934496426, 4.2456172619194, 4.767008855488449, 5.288400449057498, 5.786873730821315, 6.268158278731206, 6.743713248689789, 7.219268218648373, 7.6890936106556484, 8.16464858061423, 8.611555660816272, 9.052733163067007, 9.49391066531774, 9.940817745519782, 10.381995247770517, 10.823172750021252, 11.241431940466752, 11.66542070886356, 12.083679899309063, 12.501939089754563, 12.925927858151372, 13.349916626548183, 13.750987083139757, 14.152057539731334, 14.55312799632291, 14.954198452914486, 15.355268909506064] + min_pitch_limit: -4.010704565915763 + max_pitch_limit: 89.95437383553924 + max_pitch_rate: 2.000195662801704 + lpf_frequency: 0.91328 + lpf_damping: 0.0 + region2_k: 810380.0579009124 + gen_torque_kp: -6759000.458516784 + gen_torque_ki: -1134397.6912847382 + pitch_kp: + pitch_angle: [6.932789321082961, 8.078704911344607, 8.995437383553925, 9.797578296737077, 10.657014989433312, 11.344564343590301, 12.032113697747288, 12.662367272391194, 13.349916626548183, 13.922874421679005, 14.495832216809827, 15.068790011940651, 15.641747807071475, 16.214705602202297, 16.730367617820036, 17.24602963343778, 17.704395869542438, 18.22005788516018, 18.73571990077792, 19.19408613688258, 19.652452372987238, 20.110818609091893, 20.626480624709636, 21.084846860814295, 21.48591731740587, 21.94428355351053, 22.345354010102106, 22.803720246206765, 23.20479070279834, 23.663156938902997] + kp: [-5.1048, -4.502999999999999, -4.1129999999999995, -3.8742, -3.7391999999999994, -3.675, -3.6528, -3.6516, -3.6516, -3.6377999999999995, -3.5964000000000005, -3.5153999999999996, -3.3846000000000003, -3.1955999999999998, -2.9784, -2.8775999999999997, -2.8619999999999997, -2.8782, -2.8811999999999998, -2.8373999999999997, -2.7294, -2.5524, -2.3177999999999996, -2.0454, -1.7639999999999998, -1.5041999999999998, -1.2966, -1.1603999999999999, -1.053, -0.9503999999999999] + pitch_ki: + pitch_angle: [6.932789321082961, 8.078704911344607, 8.995437383553925, 9.797578296737077, 10.657014989433312, 11.344564343590301, 12.032113697747288, 12.662367272391194, 13.349916626548183, 13.922874421679005, 14.495832216809827, 15.068790011940651, 15.641747807071475, 16.214705602202297, 16.730367617820036, 17.24602963343778, 17.704395869542438, 18.22005788516018, 18.73571990077792, 19.19408613688258, 19.652452372987238, 20.110818609091893, 20.626480624709636, 21.084846860814295, 21.48591731740587, 21.94428355351053, 22.345354010102106, 22.803720246206765, 23.20479070279834, 23.663156938902997] + ki: [-0.26093999999999995, -0.2403, -0.22386, -0.21054, -0.19962, -0.19043999999999997, -0.18264, -0.17579999999999998, -0.16968, -0.16404, -0.15864, -0.15336, -0.14801999999999998, -0.14262, -0.13932, -0.14814, -0.1686, -0.19967999999999997, -0.24054, -0.2898, -0.34535999999999994, -0.4044, -0.46307999999999994, -0.5172599999999999, -0.5620799999999999, -0.59292, -0.6054, -0.5967, -0.5815199999999999, -0.5671200000000001] + constant_power: 1.0 + gen_actuator_frequency: 10000.0 + gen_actuator_damping: 1.0 + pitch_actuator_frequency: 6.2831 + pitch_actuator_damping: 0.707 + yaw_rate: 0.49847328176381617 diff --git a/windIO/examples/turbine/IEA-22-280-RWT_Floater.yaml b/windIO/examples/turbine/IEA-22-280-RWT_Floater.yaml index f07e747..138b6db 100644 --- a/windIO/examples/turbine/IEA-22-280-RWT_Floater.yaml +++ b/windIO/examples/turbine/IEA-22-280-RWT_Floater.yaml @@ -1823,17 +1823,32 @@ materials: orth: 0.0 unit_cost: 3.63 control: - supervisory: - Vin: 3.0 - Vout: 25.0 - maxTS: 105.0 - torque: - tsr: 9.153211158238001 - VS_minspd: 1.975 - VS_maxspd: 7.162 - max_torque_rate: 4500000.0 - pitch: - ps_percent: 0.8 - max_pitch: 89.95437383553924 - max_pitch_rate: 2.0 - min_pitch: -0.9549247399288653 + min_rotor_speed: 1.8459745229456574 + rated_rotor_speed: 7.061131867192266 + max_rotor_speed: 8.473281846258034 + max_gen_torque: 34305.7 + max_torque_rate: 4500.0 + fine_pitch: -4.010704565915763 + min_pitch_table: + wind_speed: [3.0, 3.2936, 3.5872, 3.8808, 4.1744, 4.468, 4.7616, 5.0552, 5.3488, 5.6424, 5.936, 6.2296, 6.5232, 6.8168, 7.1104, 7.404, 7.6976, 7.9912, 8.2848, 8.5785, 8.8721, 9.1657, 9.4593, 9.7529, 10.0465, 10.3401, 10.6337, 10.9273, 13.3125, 13.7621, 14.2116, 14.6611, 15.1106, 15.5601, 16.0097, 16.4592, 16.9087, 17.3582, 17.8077, 18.2572, 18.7068, 19.1563, 19.6058, 20.0553, 20.5048, 20.9543, 21.4039, 21.8534, 22.3029, 22.7524, 23.2019, 23.6514, 24.101, 24.5505, 25.0] + min_pitch: [0.5786873730821315, 0.5099324376664327, 0.43544792429942564, 0.36669298888372687, 0.2807493196141034, 0.18334649444186343, 0.08594366926962349, -0.011459155902616465, -0.11459155902616465, -0.2119943841984046, -0.31512678732195276, -0.4068000345428845, -0.492743703812508, -0.5844169510334397, -0.6760901982543714, -0.7792226013779195, -0.8766254265501595, -0.9797578296737077, -1.0771606548459478, -1.180293057969496, -1.283425461093044, -0.985487407625016, -0.3838817227376516, 0.22345354010102106, 0.813600069085769, 1.306343772898277, 1.8048170546620932, 2.3032903364259094, 3.707036934496426, 4.2456172619194, 4.767008855488449, 5.288400449057498, 5.786873730821315, 6.268158278731206, 6.743713248689789, 7.219268218648373, 7.6890936106556484, 8.16464858061423, 8.611555660816272, 9.052733163067007, 9.49391066531774, 9.940817745519782, 10.381995247770517, 10.823172750021252, 11.241431940466752, 11.66542070886356, 12.083679899309063, 12.501939089754563, 12.925927858151372, 13.349916626548183, 13.750987083139757, 14.152057539731334, 14.55312799632291, 14.954198452914486, 15.355268909506064] + min_pitch_limit: -4.010704565915763 + max_pitch_limit: 89.95437383553924 + max_pitch_rate: 2.000195662801704 + lpf_frequency: 0.91328 + lpf_damping: 0.0 + region2_k: 810380.0579009124 + gen_torque_kp: -6759000.458516784 + gen_torque_ki: -1134397.6912847382 + pitch_kp: + pitch_angle: [6.932789321082961, 8.078704911344607, 8.995437383553925, 9.797578296737077, 10.657014989433312, 11.344564343590301, 12.032113697747288, 12.662367272391194, 13.349916626548183, 13.922874421679005, 14.495832216809827, 15.068790011940651, 15.641747807071475, 16.214705602202297, 16.730367617820036, 17.24602963343778, 17.704395869542438, 18.22005788516018, 18.73571990077792, 19.19408613688258, 19.652452372987238, 20.110818609091893, 20.626480624709636, 21.084846860814295, 21.48591731740587, 21.94428355351053, 22.345354010102106, 22.803720246206765, 23.20479070279834, 23.663156938902997] + kp: [-7.68, -6.851999999999999, -6.233999999999999, -5.7749999999999995, -5.4258, -5.1564, -4.941599999999999, -4.7616, -4.5996, -4.4430000000000005, -4.2791999999999994, -4.1004, -3.8969999999999994, -3.6624, -3.4632, -3.5784, -3.9509999999999996, -4.494599999999999, -5.133, -5.803199999999999, -6.4559999999999995, -7.044, -7.5360000000000005, -7.913999999999999, -8.16, -8.249999999999998, -8.184000000000001, -7.949999999999999, -7.667999999999999, -7.403999999999999] + pitch_ki: + pitch_angle: [6.932789321082961, 8.078704911344607, 8.995437383553925, 9.797578296737077, 10.657014989433312, 11.344564343590301, 12.032113697747288, 12.662367272391194, 13.349916626548183, 13.922874421679005, 14.495832216809827, 15.068790011940651, 15.641747807071475, 16.214705602202297, 16.730367617820036, 17.24602963343778, 17.704395869542438, 18.22005788516018, 18.73571990077792, 19.19408613688258, 19.652452372987238, 20.110818609091893, 20.626480624709636, 21.084846860814295, 21.48591731740587, 21.94428355351053, 22.345354010102106, 22.803720246206765, 23.20479070279834, 23.663156938902997] + ki: [-0.31758, -0.29219999999999996, -0.27149999999999996, -0.25433999999999996, -0.23988, -0.22757999999999995, -0.21689999999999998, -0.20747999999999997, -0.19901999999999997, -0.19127999999999998, -0.18401999999999996, -0.17717999999999998, -0.17058, -0.16404, -0.16146, -0.17922, -0.21779999999999997, -0.27696, -0.35652, -0.45491999999999994, -0.56862, -0.6918, -0.8165999999999999, -0.9335999999999999, -1.0326, -1.1022, -1.1328, -1.1184, -1.0902, -1.0632] + constant_power: 0.0 + gen_actuator_frequency: 10000.0 + gen_actuator_damping: 1.0 + pitch_actuator_frequency: 6.2831 + pitch_actuator_damping: 0.707 + yaw_rate: 0.49847328176381617 From 8b5ddb5a87030f8d52c32477b798371261e94f38 Mon Sep 17 00:00:00 2001 From: dzalkind Date: Wed, 31 Dec 2025 14:40:40 -0700 Subject: [PATCH 4/6] Clean up turbine schema for some failed tests --- windIO/schemas/turbine/turbine_schema.yaml | 24 ++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/windIO/schemas/turbine/turbine_schema.yaml b/windIO/schemas/turbine/turbine_schema.yaml index 508e4d5..28e23be 100644 --- a/windIO/schemas/turbine/turbine_schema.yaml +++ b/windIO/schemas/turbine/turbine_schema.yaml @@ -2618,7 +2618,7 @@ properties: # additionalProperties: True type: object description: Dictionary reporting the data describing the wind turbine controller - # required: # Should any of these be required? + # required: # TODO: figure out what should be required # - torque # - pitch properties: @@ -2658,7 +2658,7 @@ properties: description: Minimum pitch vs. wind speed table used for optimizing power production and/or limiting rotor thrust properties: wind_speed: - $ref: "#/definitions/distributed_data/grid_nd" + $ref: "#/definitions/distributed_data/velocity" min_pitch: $ref: "#/definitions/distributed_data/angle" min_pitch_limit: @@ -2708,8 +2708,10 @@ properties: pitch_angle: $ref: "#/definitions/distributed_data/angle" kp: - $ref: "#/definitions/distributed_data/nd" - units: deg/rpm # TODO: check that this overwrites correctly + ype: array + items: + type: number + units: deg/rpm pitch_ki: type: object description: Gain schedule (gain vs. pitch) from rotor speed (rpm) to blade pitch (deg) in an integral control element. @@ -2717,8 +2719,10 @@ properties: pitch_angle: $ref: "#/definitions/distributed_data/angle" ki: - $ref: "#/definitions/distributed_data/nd" - units: deg/(rpm*s) # TODO: check that this overwrites correctly + type: array + items: + type: number + units: deg/rpm constant_power: type: number description: Flag for using consant torque (0) or constant power (1) torque control above rated. @@ -3001,6 +3005,14 @@ definitions: units: m minItems: 2 minItems: 2 + velocity: + type: array + default: [0.0, 0.0] + items: + type: number + units: m/s + minItems: 2 + uniqueItems: false force: type: array description: Loading described along a beam, expressed in N per meter From 37063fc72ee2dad8d112dfed455d96342866d830 Mon Sep 17 00:00:00 2001 From: dzalkind Date: Wed, 31 Dec 2025 14:47:26 -0700 Subject: [PATCH 5/6] Fix typo --- windIO/schemas/turbine/turbine_schema.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/windIO/schemas/turbine/turbine_schema.yaml b/windIO/schemas/turbine/turbine_schema.yaml index 28e23be..79489af 100644 --- a/windIO/schemas/turbine/turbine_schema.yaml +++ b/windIO/schemas/turbine/turbine_schema.yaml @@ -2708,7 +2708,7 @@ properties: pitch_angle: $ref: "#/definitions/distributed_data/angle" kp: - ype: array + type: array items: type: number units: deg/rpm From 8a3e25492d092fdf541cdf40647dde13bc726af3 Mon Sep 17 00:00:00 2001 From: dzalkind Date: Wed, 31 Dec 2025 14:47:44 -0700 Subject: [PATCH 6/6] Remove old control elements in converter --- windIO/converters/windIO2windIO.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/windIO/converters/windIO2windIO.py b/windIO/converters/windIO2windIO.py index 1c52d6d..c4e25c7 100644 --- a/windIO/converters/windIO2windIO.py +++ b/windIO/converters/windIO2windIO.py @@ -759,6 +759,17 @@ def convert_controls(self, dict_v2p0): if "shutdown" in dict_v2p0["control"]: dict_v2p0["control"].pop("shutdown") + # TODO: not sure what to do with these at the moment, removing for now + if "supervisory" in dict_v2p0["control"]: + dict_v2p0["control"].pop("supervisory") + if "torque" in dict_v2p0["control"]: + dict_v2p0["control"].pop("torque") + if "pitch" in dict_v2p0["control"]: + dict_v2p0["control"].pop("pitch") + if "shutdown" in dict_v2p0["control"]: + dict_v2p0["control"].pop("shutdown") + + return dict_v2p0