Solar string monitoring over Modbus RTU: from voltage divider to SCADA
How to measure, alarm and integrate string-by-string in a solar plant using RS-485, resistive dividers and Modbus RTU, with the common design pitfalls.
A 1.2 MW solar farm in the Brazilian countryside ran for eight months at 10% below contracted PR. The central inverter reported production within its expected curve, no active alarms, and the monthly report only showed the plant total. The O&M crew swapped string fuses, washed modules, recalibrated the pyranometer, and the needle didn't move. The loss only showed up when a technician climbed the structure with a rented clamp meter and found three strings partially shorted behind a dry branch, plus two more with the bypass diode blown by a recent storm. Eight months of lost generation, USD 35k in revenue, because the monitoring aggregated 24 strings inside a single MPPT. This post shows how to measure string by string with simple hardware and Modbus RTU, and where the design traps live.
What is a PV string
A string is the series association of photovoltaic modules summing voltage up to the MPPT operating point. In commercial and utility-scale systems, the typical numbers today are:
| Configuration | Modules in series | Typical Vmp (25 °C) | Typical Voc (cold) | Application |
|---|---|---|---|---|
| Small residential | 6–10 | 220–360 V | 300–480 V | Microinverter / 3–8 kW string inverter |
| Commercial / industrial | 12–18 | 440–660 V | 600–900 V | 15–50 kW string inverter |
| Utility 1500 V DC | 20–28 | 740–1030 V | 1000–1500 V | Central inverter / 1500 V string inverter |
A string delivers roughly constant current around Imp (typically 8–14 A for 450–550 Wp modules) and a voltage that varies with irradiance, cell temperature and — most important for diagnostics — with the string's own integrity. A single module with a blown bypass diode, an oxidised MC4 connector or a cracked cell from hot-spot shifts the operating point in an electrically visible way.
The charge controller or inverter runs MPPT (Maximum Power Point Tracking), sweeping the I-V curve several times per second and locking onto the knee. The catch: a single MPPT sees only the sum of the strings paralleled into it, and the tracking algorithm hides mismatch because it chases the aggregate maximum, not each string's optimum.
Why monitor string by string
The difference between monitoring at the inverter and monitoring at the string is the difference between knowing the patient has a fever and knowing which organ is inflamed. The failure modes that only appear with string-level granularity:
- Recurring partial shading — branch, pole, neighbouring building, concentrated dirt in one corner. The inverter MPPT pulls the whole curve down to accommodate the shaded string, losing generation on every string of that tracker.
- Module mismatch — uneven degradation, manufacturing tolerance, field replacement with a module from a different batch. Imp differences of 2–3% inside the same MPPT are invisible in the aggregate.
- Bypass diode failure — after a surge or nearby lightning. The string ends up with a dead module in series; voltage drops by roughly 1/N and power tanks.
- Non-uniform soiling — bird droppings, sugarcane dust, lichen. Washing every module without knowing which one hurts is expensive and slow.
- Hot-spot from cell crack — a cracked cell becomes a parasitic resistor, creates a hot point, breaks a solder joint, evolves into string failure. Catching it early avoids module swap and fire risk.
- Gradual degradation (LID, PID, LeTID) — slow Voc/Vmp trend across months. Only shows up in per-string time series.
- String fuse failure — common in combiner boxes. The string goes to zero; the inverter masks it as "low irradiance at that hour".
Without string-by-string monitoring, all these modes look the same: "generation 10% below expected, root cause unknown".
Monitoring topologies
Three paths solve the problem, with different costs and granularities:
| Topology | Granularity | Cost per module | Critical points |
|---|---|---|---|
| Inverter-level | 1 value per MPPT (4–12 aggregated strings) | Included with inverter | Doesn't detect mismatch inside the MPPT, where 80% of losses hide |
| MLPE (module) | 1 value per module (Tigo/SolarEdge optimisers, Enphase microinverters) | USD 15–40 per module | Electronics on every module, high aggregate cost in utility, extra failure point |
| External string-level | 1 value per string at the combiner | USD 6–15 per string | Sweet spot: granularity where the failure actually happens, electronics concentrated in one panel, centralised maintenance |
External string-level monitoring is the path used in most Brazilian plants between 100 kWp and 5 MWp: a multichannel DC monitor lives inside the combiner box, reads each string against the common negative bus, exposes the values over Modbus RTU, and the SCADA aggregates. LRI sees this pattern as the best cost-benefit for retrofit, precisely because it doesn't require touching anything above the combiner.
Measuring strings above the monitor's range
Most multichannel industrial DC monitors operate at 0–60 V per channel (including the AEM-60DC8). Commercial strings sit between 400 and 900 V, utility up to 1500 V. The solution is the precision resistive divider, but the divider design is where 90% of retrofits fail silently.
Conceptual 10:1 or 20:1 divider
String (+) ──[R1]──┬──[R2]── String (−)
│
└── Monitor input (Vmeasured = Vstring × R2 / (R1+R2))
Simplified example — string Vmp = 600 V, monitor 0–60 V, 10:1 divider: R1 = 1 MΩ, R2 = 111.1 kΩ. Input voltage = 600 × 111.1k / 1111.1k = 60 V. Divider current = 600 / 1.111 MΩ = 540 µA. Total dissipated power ≈ 0.32 W (R1 dissipates 0.29 W, R2 dissipates 0.032 W).
Five recurring design mistakes:
- Poor temperature coefficient. Generic metal-film resistors have ±100 ppm/°C TCR. A 10:1 divider with mismatched R1 and R2 TCRs drifts 1–2% between 0 °C in the morning and 70 °C at noon inside the enclosure. Use ±15 to ±25 ppm/°C metal-film resistors and, where possible, matched parts (same batch, close packaging to track temperature).
- Underrated dissipation. R1 = 1 MΩ at 600 V dissipates 0.29 W and sees 600 V DC. A common 1206 SMD resistor handles 0.25 W and 200 V working voltage. Result: internal arcing, permanent drift, eventual catastrophic failure. Use high-voltage resistors (1206HV, 2010HV) or two resistors in series splitting the working voltage.
- Monitor input impedance ignored. The monitor input is, say, 1 MΩ. Paralleled with R2 = 111 kΩ, effective impedance drops to ≈ 100 kΩ. Division error: 10%. Always include Z_in of the monitor in the calculation, or use a high-input-impedance op-amp buffer (TLV9061, OPA320) between divider and monitor.
- Uncontrolled common mode. Strings in a large plant have floating potential to earth, especially in ungrounded combiner boxes. Measuring single-ended against the monitor GND can inject common-mode current through the divider. Use a differential divider (4 resistors) or galvanic isolation between divider and monitor.
- No surge protection. Strings pick up daily induction from nearby lightning in solar farms. The divider sees kV-class spikes; the monitor burns. Use a class II SPD at the combiner input, an MOV or TVS sized for Voc_max + 30% at the divider input, and a clamp diode at the monitor input.
Alternatives to the resistive divider for current sensing (not for string voltage, but worth mentioning):
- DC shunts — for current, not voltage. Low-value resistor (50–150 µΩ) on the string negative side, measuring mV drop.
- DC CTs (Hall-effect) — contactless current, native galvanic isolation, offset drift with temperature.
Loaded vs open-circuit voltage (Voc vs Vmp)
The DC voltage monitor sees what is at the string terminals at the moment of measurement, and that depends on what the inverter is doing with that string:
- Inverter on, MPPT locked → voltage ≈ Vmp (operating point, varies with irradiance and temperature).
- Inverter off, combiner on → voltage ≈ Voc (open circuit, function of irradiance and temperature only, maximum at sunrise/sunset with cold panels).
- Inverter off, string isolated → true Voc, cleanest reading for diagnosis.
The practical difference:
| Scenario | Voltage reading | Useful for detecting |
|---|---|---|
| Vmp during normal operation | 70–80% of Voc, varies minute by minute | Shade, blown fuse (voltage goes to zero), coarse mismatch |
| Voc at the edge of the day | 95–100% of nominal Voc | Voc degradation from LID/PID, dead module in the string (Voc drops by ~Voc_module) |
| Voc during inverter maintenance | Stable true Voc | Indirect I-V curve — comparing each string's Voc at 6 am and 6 pm of the same day reveals fine mismatch |
Inferring string condition from voltage alone is partial — without current, separating "shade" from "blown diode" is hard. But comparing string vs array average at the same instant already delivers 80% of the diagnosis: if string 7 of MPPT-3 is 8% below the average of the other 7 strings of the same MPPT, and this is repeatable from 10 am to 2 pm on clear days, something is specifically wrong with string 7.
Polling rate — how fast to measure
Solar strings are electrically fast but operationally slow systems:
- Module thermal change: minutes-class time constant.
- Cloud shadow passing: 5–30 s transition.
- Pole/branch shadow: hundreds of milliseconds at entry/exit.
- Catastrophic failure (fuse open, DC arc): milliseconds to seconds.
Practical polling recommendation:
| Goal | Polling | Rationale |
|---|---|---|
| Daily trend, PR report | 1 read every 60 s | Captures indirect I-V curve of the day, low storage load |
| Mismatch and shading detection | 1 Hz (1 s) | Cloud shadow lasts 5–30 s; at 1 Hz you already see 5–30 points of the event |
| DC arc and fast failure detection | >10 Hz local, aggregated for SCADA | 1 Hz Modbus RTU doesn't detect arc; you need a dedicated AFCI detector in inverter or combiner |
In Modbus RTU at 19200 bps, reading 8 channels from one monitor takes ~30 ms per request (8 holding registers + overhead). On a bus with 8 monitors (64 strings), the full 1 Hz cycle fits comfortably. Going to 4 Hz requires 57600 or 115200 bps. Above that, the problem stops being Modbus and becomes architecture — it's worth thinking about Ethernet gateways or local edge compute.
Rule of thumb: 1 Hz at the string is the point where storage cost, bus cost and diagnostic quality meet.
Alarms and thresholds
Absolute threshold ("voltage < 400 V triggers alarm") is the worst kind of alarm in a solar string: voltage changes with irradiance, so the alarm fires every sunrise. Three alarm families work:
- Deviation from array average — for each string
i, computedeviation_i = (V_i − mean_strings_same_MPPT) / mean. Alarm when|deviation_i| > 5%for more than 5 continuous minutes under irradiance > 300 W/m². Weather-immune, catches mismatch and chronic shading. - Temporal drift (degradation) — for each string, compare sunrise Voc with the 30-day moving average at the same hour/temperature. A drop > 2% indicates anomalous degradation (PID, module swapped with worse batch, oxidising connector).
- Minimum operating voltage — alarm when
V_string < 0.5 × nominal Vocat times with irradiance > 200 W/m². Catches blown fuse, disconnected string, gross failure.
For the SCADA to consume effectively, expose per string in the monitor's holding registers:
- Instantaneous voltage (updated on polling).
- Filtered voltage (60 s moving average) — reduces false alarms.
- Saturation flag (channel above range).
- Channel calibration status.
The threshold intelligence can live in the monitor (firmware) or in the SCADA (Ignition/Elipse/Grafana rules). Distributing the critical alarm in the firmware with < 1 s latency and the trend alarm in the SCADA with a minute-class window is the best of both worlds.
SCADA integration
Modbus RTU is the dominant protocol in Brazilian solar plants for three reasons: the RS-485 bus is already wired for the inverters, Modbus drivers exist in every industrial SCADA, and the main vendors (Sungrow, Huawei, ABB, Growatt, WEG) expose inverters in Modbus RTU or native Modbus TCP.
Typical monitored combiner box topology:
[16 strings] → [Combiner box]
│
├── [String-level DC monitor, RS-485 #1, slave 1]
│
[Fuses + SPD]
│
└── [DC out → Inverter, RS-485 #2, slave 10]
│
[Gateway RS-485 → Ethernet]
│
[Central SCADA]
Practical integration points:
- Separate Modbus buses — combiner monitor on RS-485 #1 (monitoring subnet), inverter on RS-485 #2 (vendor subnet). Putting everything on the same RS-485 creates master conflicts and brings the inverter down during monitor polling.
- Modbus RTU → Modbus TCP gateway — concentrates the two RS-485 buses into a single Ethernet port. Common models in Brazil: Moxa MGate MB3170, ICP DAS tGW-715, NPort 5230. Configure timeouts > 200 ms per slave on a noisy network.
- Inverter Modbus map — varies by vendor. Sungrow exposes ~80 registers per inverter; Huawei exposes a hierarchical structure with sub-units for optimisers. Crossing the monitor's string voltage with the inverter's DC current per MPPT allows reconstructing per-string current by subtraction.
- Coherent timestamps — the monitor reports an instantaneous value; the SCADA stamps on arrival. In large plants, read jitter between slaves can reach seconds. For fast-event analysis (shadow entering), keeping the monitor's timestamp (if the firmware exposes an RTC) beats the SCADA stamp.
- Persistence — the SCADA stores per-string value per timestamp. At 1 Hz × 64 strings × 12 h generation/day × 365 days, that's ~1 billion points/year. A historian with compression (PI, InfluxDB, TimescaleDB) is mandatory.
The AEM-60DC8 in solar monitoring
The AEM-60DC8 is an Industrial DC Monitoring Platform with 8 isolated 0–60 V channels, Modbus RTU server and a 147 holding register map in firmware v1.03. For string-level solar monitoring, it solves:
- 24 V / 48 V strings in off-grid and telecom solar — direct reading in the 0–60 V range, no divider. 1 unit = 8 strings.
- 200–600 V strings in commercial/utility — with a certified external resistive divider (10:1 or 20:1, designed using the 5 rules of section 5), the AEM-60DC8 covers an 8-string combiner.
- Combiners larger than 8 strings — multiple units on the same RS-485 with distinct addresses; 2 units = 16 strings, 4 units = 32 strings.
Per channel, the equipment exposes in its 147 registers: instantaneous voltage, filtered voltage, valid reading counters, saturation counter, calibration status, threshold configuration. The local alarm triggers an amber/red LED and a Modbus flag in < 1 s; the SCADA consumes it via Modbus RTU at 4800–115200 bps.
When the AEM-60DC8 is the right choice:
- Combiner box with 1–32 strings, with a divider designed per channel above 60 V.
- RS-485 monitoring project integrable with the existing inverter (Sungrow, Huawei, ABB, Growatt, WEG).
- Cybersecurity requirement aligned with IEC 62443-4-2 SL2 (Secure by Design).
- 24/7 application with 1 Hz polling window per channel.
When you need a different product:
- 1500 V DC strings — a 25:1 divider ends up with R1 too high and unrealistic dissipation; a dedicated 0–1500 V monitor with native isolation is better.
- Per-module granularity (not per string) — requires MLPE / optimiser / microinverter.
- DC arc detection (AFCI) — not an AEM-60DC8 function; use a dedicated AFCI in the inverter or combiner.
- Per-string current measurement — the AEM-60DC8 reads voltage; current requires shunt + isolated transducer, or a DC CT and a compatible channel.
For the 1.2 MW plant in this post's intro: 24 strings per MPPT × 3 MPPTs = 72 strings. With 9 AEM-60DC8 units distributed across 3 combiners (3 units per combiner, 24 strings each), the whole plant gets string-by-string visibility at 1 Hz, integrated into the same SCADA already in use. Estimated investment: < 10% of the 8-month lost revenue in the real case.
FAQ
1. Can I wire a 600 V string directly into the AEM-60DC8? No. The range is 0–60 V per channel. Connecting higher voltage damages the channel and propagates risk to other channels through the isolation. Use a certified external resistive divider with surge protection at the divider input.
2. Does the AEM-60DC8 detect DC arc? No. DC arc detection (AFCI) requires high-frequency current spectrum analysis (10 kHz–100 kHz) and is a function of the inverter or a dedicated AFCI detector. The AEM-60DC8 monitors DC voltage at up to 115200 bps polling, enough for mismatch and string failure, not for arc.
3. What is the practical accuracy with a 10:1 divider in the field? With matched ±25 ppm/°C metal-film dividers, proper surge protection and point-by-point calibration against a traceable reference, it is feasible to hold ±1% across the full range from 0 °C to 60 °C ambient. Without TCR and dissipation care, accuracy degrades to ±3–5%.
4. How many strings fit on a single RS-485 bus with AEM-60DC8? RS-485 supports 32 electrical loads per segment. At a useful 1 Hz polling at 19200 bps, up to 8 units (64 strings) fit comfortably. At 115200 bps, 16 units (128 strings) still close the cycle in < 1 s.
5. How does the monitor coexist with the inverter system without conflict? Use two distinct RS-485 buses: one for the AEM-60DC8 monitors (monitoring subnet) and another for the inverters (vendor subnet, normally with addressing and baudrate dictated by the inverter gateway). Concentrate both in a single Modbus RTU → TCP gateway at the control cabinet.
Related content
More LRI technical materials on adjacent topics.
How to size a DC monitor for a 24/7 industrial panel
Field guide for automation engineers sizing channels, voltage range, polling, isolation and environment of a DC monitor in a 24/7 industrial panel.
Modbus RTU vs Modbus TCP: how to decide without falling for myths
Technical comparison between Modbus RTU and Modbus TCP across physical layer, frame, latency, security, cost and real scenarios, with decision matrix and the role of the AEM-60DC8.
Modbus RTU Simulator in Python: a step-by-step tutorial for SCADA integrators
Practical tutorial for building a Modbus RTU simulator in Python and validating SCADA integration with the AEM-60DC8 before the hardware ships.