Lesson 007 — HV Grid Integration: Pandapower Steady State Model¶
Course Navigation
Previous: Lesson 006 — Layout Optimization, Blocking & AEP Cascade | Next: Lesson 008 — Dynamic Grid Compatibility: ANDES, FRT, Frequency, SSO & Converter
Phase: P2 | Language: English | Progress: 8 of 19 | All Lessons | Learning Roadmap
Date: 2026-02-24 Phase: P2 (HV Grid Integration) Roadmap sections: [Phase 2 — Section 2.1 Electrical Network Model, Section 2.2 Load Flow, Section 2.3 Short-Circuit, Section 2.4 Reactive Compensation] Language: English Previous lesson: Lesson 006 last_commit_hash: 0a571666d8c2a7e2e62689f3b54d6b1e90d830a4
What You Will Learn¶
- Pi-model physics and IEC 60287 parameters of submarine XLPE cables
- Mathematical basis of the Newton-Raphson load flow solver
- IEC 60909 short circuit calculation methodology (Ik'', ip, Sk'')
- Ferranti effect and why STATCOM reactive power compensation is necessary
- Verify compliance with PSE IRiESP voltage limits (0.95–1.05 pu)
Part 1: Cable Pi-Model — From Physics to Code¶
Real Life Problem¶
Think of a garden hose. The longer the hose, the lower the water pressure at the end (resistance losses). But there is another difference in electrical cables: the cable's insulation material (XLPE) acts like a small capacitor. Our 45 km long 220 kV subsea cable produces ~130 MVAR reactive power at no load — equivalent to the reactive power consumed by a small city.
What the Standards Say¶
IEC 60287 calculates cable current carrying capacity and electrical parameters (R, X, C). IEC 60228 standardizes conductor cross-sections (500, 630, 800, 1000 mm²). In offshore wind farms, cable grading is used: turbines far from the OSS use cable with small cross-section (less current), turbines close to OSS use cable with large cross-section (more cumulative current).
Mathematics¶
The Pi-model approximates the distributed parameter transmission line with three lumped elements:
For each cable segment: - R [Ω/km]: Conductor resistance (inversely proportional to cross-sectional area) - X [Ω/km]: Inductive reactance (magnetic field) - C [nF/km]: Capacitance per phase (XLPE dielectric)
Reactive power generation (Rule 7 — always positive):
$$Q_{kablo} = \omega \times C \times V^2 \times L$$
For our 220 kV export cable:$$Q = 2\pi \times 50 \times 190 \times 10^{-9} \times (220000)^2 \times 45 \approx 130 \text{ MVAR}$$
What We Built¶
File: backend/app/services/p2/network_model.py
Cable parameters are defined by dataclass CableSpec:
@dataclass(frozen=True)
class CableSpec:
cross_section_mm2: float
r_ohm_per_km: float
x_ohm_per_km: float
c_nf_per_km: float
max_i_ka: float
# 66 kV dizi kabloları — OSS'ye uzaklığa göre derecelendirilmiş
ARRAY_CABLE_500 = CableSpec(500, 0.0366, 0.110, 200, 0.715) # Uzak
ARRAY_CABLE_630 = CableSpec(630, 0.0283, 0.105, 215, 0.818) # Orta
ARRAY_CABLE_800 = CableSpec(800, 0.0221, 0.100, 230, 0.900) # Yakın
The cable grading function selects cross-section based on position in the string:
def _get_cable_grade(position_in_string: int, string_length: int) -> CableSpec:
normalised = position_in_string / max(string_length - 1, 1)
if normalised < 0.4:
return ARRAY_CABLE_500 # uzak — en az akım
elif normalised < 0.7:
return ARRAY_CABLE_630 # orta
else:
return ARRAY_CABLE_800 # OSS'ye yakın — en fazla kümülatif akım
Why is it important?¶
Why don't we make all array cables the same cross-section? Using the same cross section would be simple but inefficient. Turbines far from the OSS carry only 1 turbine current (131 A), but the cable closest to the OSS carries 5 turbine currents (655 A). Putting 800 mm² everywhere is unnecessary cost — 500 mm² can already carry 715 A. Cable grading can reduce a project's cable cost by 15-25%.
Part 2: Network Topology — 38 Busbars, 35 Cables, 2 Transformers¶
Real Life Problem¶
Think of a city's power grid: there are many transformers and cables on the way from the power plant to the factory. Each changes the voltage level and creates loss. Our offshore wind farm is the same: three voltage levels from 66 kV to 400 kV, different equipment on each.
What We Built¶
The build_network() function creates the 38-bar Pandapower network:
| Element | Number | Explanation |
|---|---|---|
| Guys | 38 | 1× PSE 400kV + 1× Onshore 220kV + 1× OSS 220kV + 1× OSS 66kV + 34× WTG 66kV |
| Cables | 35 | 34× array (66 kV, rated) + 1× export (220 kV, 45 km) |
| Trafolar | 2 | 66/220 kV Dyn11 (OSS) + 220/400 kV YNyn0 (onshore) |
| Generators | 35 | 34× WTG (15 MW) + 1× STATCOM (Q kontrol) |
| Shunt reactor | 1 | 50 MVAR (US 220 kV) |
| External network | 1 | PSE 400 kV, Ssc = 10 GVA |
String düzeni: 6 string × 5 WTG + 1 string × 4 WTG = 34 WTG
Part 3: Load Flow — Voltage Verification with Newton-Raphson¶
Physics¶
Newton-Raphson charge flow solves the force balance equations:
$$P_i = V_i \sum_j V_j (G_{ij} \cos\theta_{ij} + B_{ij} \sin\theta_{ij})$$ $$Q_i = V_i \sum_j V_j (G_{ij} \sin\theta_{ij} - B_{ij} \cos\theta_{ij})$$
The Jacobian matrix is updated at each iteration:
$$\begin{bmatrix} \Delta P \ \Delta Q \end{bmatrix} = \begin{bmatrix} \frac{\partial P}{\partial \theta} & \frac{\partial P}{\partial V} \ \frac{\partial Q}{\partial \theta} & \frac{\partial Q}{\partial V} \end{bmatrix} \begin{bmatrix} \Delta \theta \ \Delta V \end{bmatrix}$$
Convergence criterion: $|\Delta P, \Delta Q| < 10^{-8}$ MVA
Scenarios¶
PSE IRiESP requires voltage compatibility in four operating scenarios:
| Scenario | Production | Aim |
|---|---|---|
| Full load | 510 MW (34 × 15 MW) | Cable thermal limits |
| Part load | 255 MW (%50) | Normal operating voltages |
| Empty load | 0 MW | Ferranti voltage rise |
| N-1 | 450 MW (String 7 disabled) | Redundancy margins |
Results¶
All four scenarios converge and meet voltage limits of 0.95–1.05 pu (with STATCOM auto-dispatch):
- Full load: Losses ~1-3% (5-15 MW), voltage compatible
- Part load: Lower losses, voltage compatible
- No load: Minimum loss (transformer iron losses only), Ferranti effect compensated
- N-1: 450 MW, redundancy verified
Code Review¶
STATCOM auto-dispatch reduces the voltage to 1.0 pu on the OSS 220 kV bus:
def auto_statcom_dispatch(net, target_vm_pu=1.0, tolerance_pu=0.01):
for _ in range(max_iterations):
pp.runpp(net, algorithm="nr")
v_oss = net.res_bus.at[oss_bus_idx, "vm_pu"]
deviation = target_vm_pu - v_oss
if abs(deviation) <= tolerance_pu:
break
# Oransal ayarlama: ~5000 MVAR/pu kazanç
current_q += deviation * 5000.0
# STATCOM ratingi ile sınırla (±120 MVAR)
current_q = max(-120, min(120, current_q))
Part 4: Short Circuit — IEC 60909¶
Physics¶
IEC 60909 calculates the initial symmetric short circuit current in the busbar:
$$I_k'' = \frac{c \times V_n}{\sqrt{3} \times Z_k}$$
- c = voltage factor (max: 1.1, min: 1.0 — IEC 60909 Table 1)
- V_n = nominal gerilim [V]
- Z_k = equivalent short-circuit impedance [Ω] seen from the fault point
Peak current (DC component):$$i_p = \kappa \times \sqrt{2} \times I_k''$$
Short circuit power:$$S_k'' = \sqrt{3} \times V_n \times I_k'' \quad [\text{MVA}]$$
What the Standards Say¶
IEC 62271-100 defines breaker capacities:
| Voltage Level | Cutter Capacity |
|---|---|
| 66 kV | 25 kA |
| 220 kV | 40 kA |
| 400 kV | 50 kA |
What We Built¶
Engineering Rule 3: IEC 60909 calculations are made with Pandapower's built-in function calc_sc() — custom implementation PROHIBITED.
Results: All busbar currents are below breaker capacities → breakers are adequate.
Chapter 5: STATCOM Sizing — Ferranti Effect and Compensation¶
Physics — Ferranti Effect¶
The voltage at the receiving end of an unloaded or lightly loaded cable is higher than the sending end:
$$V_{alıcı} \approx \frac{V_{gönderici}}{\cos(\beta L)}$$
Ferranti rise in our 45 km, 220 kV cable is around ~2-5%. This can exceed voltage limits without compensation.
Compensation Strategy¶
- Shunt reactor (50 MVAR): Constant inductive load absorbs part of cable Q
- STATCOM (±120 MVAR): Dynamic compensation generates/absorbs Q according to voltage
Why STATCOM and not SVC? - Full Q capacity at low voltage (critical during FRT) - Faster response (< 1 cycle vs 2-3 cycles) - Smaller space on offshore platform - No harmonic filter required (PWM switching)
Verification Results¶
| Metric | Value |
|---|---|
| Cable Q (220 kV, 45 km) | ~130 MVAR |
| shunt reactor | 50 MVAR |
| STATCOM rating | ±120 MVAR |
| Ferranti rise (without compensation) | > 1.0 pu |
| Compensated V_max | ≤ 1.05 pu ✓ |
Test Summary¶
| Test File | Number of tests | Conclusion |
|---|---|---|
test_network_model.py |
21 | ✓ All passed |
test_load_flow.py |
20 | ✓ All passed |
test_short_circuit.py |
13 | ✓ All passed |
test_statcom.py |
14 | ✓ All passed |
| Total | 68 | ✓ 68/68 |
Interview Questions¶
Question 1: Ferranti Effect¶
"Your 45 km 220 kV submarine export cable operates at empty load. Why does the voltage at the OSS bus rise above the nominal value and how do you prevent this?"
Hint: Cable capacitance, reactive power generation, shunt reactor + STATCOM compensation
Question 2: Cable Rating¶
"Why do you use different cross-sections (500/630/800 mm²) in 66 kV array cables? What is the disadvantage of making them all 800 mm²?"
Hint: Current cumulation, cost optimization, thermal limits
Soru 3: IEC 60909¶
"What does the voltage factor c_max = 1.1 in IEC 60909 mean and why is max case used in breaker sizing?"
Hint: Operating voltage tolerance, worst case fault current, safety margin
Simple Explanation¶
Today we built the electrical grid of our wind farm on the computer — the entire system from 34 turbines connected to the land by subsea cable and then to the national grid. We verified that electricity was flowing at the correct voltage in four different situations (full power, half power, idle, one line faulty). We calculated what would happen in the event of a short circuit and showed that the protection equipment is sufficient. Finally, we controlled the voltage rise (Ferranti effect) created by the long submarine cable with STATCOM and the reactor.
Technical Description¶
In the P2A session, a 66/220/400 kV full-scale grid model was created with Pandapower. In the 38-bar, 35-wire (pi-model, IEC 60287 parameters), 2-transformer (Dyn11 + YNyn0) network, Newton-Raphson load flow converged in 4 scenarios (full, partial, no-load, N-1) and PSE IRiESP voltage limits (0.95–1.05 pu) were met with STATCOM auto-dispatch. IEC 60909 short circuit analysis (3-phase, c_max=1.1, c_min=1.0) gave Ik'' values below the breaker capacities in all busbars. STATCOM sizing eliminated the Ferranti voltage rise by compensating the ~130 MVAR capacitive Q generation of the 45 km export cable with a 50 MVAR shunt reactor + ±120 MVAR STATCOM. 68 unit tests passed 100%.