Le rapport en trois langues, avec ce qu'on demande a Pylontech
Le generateur separe desormais les MESURES des MOTS : les chiffres vivent dans gen-rapport-batteries.py, les trois langues dans rapport_textes.py. Une correction de traduction ne peut donc pas toucher un chiffre, ni l'inverse - et les trois versions partagent exactement les memes donnees puisqu'elles lisent la meme source. La version destinee au fabricant gagne une section que la francaise n'avait pas : trois questions precises, sur la recuperabilite des cellules face a leur composante resistive, sur la procedure recommandee pour un module dans cet etat, et sur ce que compte exactement le SOHCount par cellule. Le chinois charge Noto Sans SC et desserre l'interligne ; les mesures de colonne passent en em plutot qu'en ch, un caractere han n'ayant pas la largeur d'un zero. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KKzkkVTG6KXnGXFFC7X9XJ
This commit is contained in:
316
tools/rapport_textes.py
Normal file
316
tools/rapport_textes.py
Normal file
@@ -0,0 +1,316 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""Libelles et corps redactionnel du rapport batteries, en francais, anglais
|
||||
et chinois. Les MESURES vivent dans gen-rapport-batteries.py : ce fichier ne
|
||||
contient que des mots, pour qu'une correction de traduction ne puisse jamais
|
||||
toucher un chiffre."""
|
||||
|
||||
# La chronologie et les libelles de module dependent de la langue.
|
||||
CHRONO_L = {
|
||||
"fr": [
|
||||
("13:04:48", "cellule 7 du module …0322 à <b>3526 mV</b>, cellule 6 du module …0319 à <b>3541</b>", "sous le seuil"),
|
||||
("13:05:08", "les mêmes à <b>3555</b> et <b>3575 mV</b>", "niveau 3 franchi"),
|
||||
("13:05:13", "le BMS abaisse le courant de charge autorisé de <b>50 à 30 A</b>", "cinq secondes plus tard"),
|
||||
("13:15:10", "les cellules redescendent à 3499 et 3522 mV, l’alarme repasse au vert", "le plafond, lui, reste à 30 A"),
|
||||
("13:22:40", "plafond <b>30 → 40 A</b>", "après 7 min 31 s"),
|
||||
("13:26:39", "plafond <b>40 → 35 A</b>, meneuses à 3563 et 3548 mV", "il redéclenche"),
|
||||
("13:38:10", "plafond <b>35 → 40 A</b>", "après 11 min 31 s")],
|
||||
"en": [
|
||||
("13:04:48", "cell 7 of module …0322 at <b>3526 mV</b>, cell 6 of module …0319 at <b>3541</b>", "below threshold"),
|
||||
("13:05:08", "the same two at <b>3555</b> and <b>3575 mV</b>", "level 3 crossed"),
|
||||
("13:05:13", "the BMS drops the allowed charge current from <b>50 to 30 A</b>", "five seconds later"),
|
||||
("13:15:10", "cells fall back to 3499 and 3522 mV, alarm clears", "the limit stays at 30 A"),
|
||||
("13:22:40", "limit <b>30 → 40 A</b>", "after 7 min 31 s"),
|
||||
("13:26:39", "limit <b>40 → 35 A</b>, leading cells at 3563 and 3548 mV", "it trips again"),
|
||||
("13:38:10", "limit <b>35 → 40 A</b>", "after 11 min 31 s")],
|
||||
"zh": [
|
||||
("13:04:48", "模块 …0322 的 7 号电芯 <b>3526 mV</b>,模块 …0319 的 6 号电芯 <b>3541</b>", "低于阈值"),
|
||||
("13:05:08", "同两颗电芯升至 <b>3555</b> 与 <b>3575 mV</b>", "越过三级阈值"),
|
||||
("13:05:13", "BMS 将允许充电电流由 <b>50 A 降至 30 A</b>", "五秒之后"),
|
||||
("13:15:10", "电芯回落至 3499 与 3522 mV,告警解除", "但电流限值仍保持 30 A"),
|
||||
("13:22:40", "限值 <b>30 → 40 A</b>", "经过 7 分 31 秒"),
|
||||
("13:26:39", "限值 <b>40 → 35 A</b>,最高电芯 3563 与 3548 mV", "再次触发"),
|
||||
("13:38:10", "限值 <b>35 → 40 A</b>", "经过 11 分 31 秒")],
|
||||
}
|
||||
|
||||
PLACES = {
|
||||
"fr": ["pack ancien · adresse 2 — LE TÉMOIN", "pack ancien · adresse 1",
|
||||
"pack ancien · adresse 3", "isolée (BAT3) · adresse 4"],
|
||||
"en": ["older pack · address 2 — THE CONTROL", "older pack · address 1",
|
||||
"older pack · address 3", "isolated (BAT3) · address 4"],
|
||||
"zh": ["旧电池组 · 地址 2 — 对照模块", "旧电池组 · 地址 1",
|
||||
"旧电池组 · 地址 3", "已隔离 (BAT3) · 地址 4"],
|
||||
}
|
||||
RELEVES = {
|
||||
"fr": ["1793 relevés, 30/07 → 05/09", "1793 relevés, 14/08 → 05/09",
|
||||
"1476 relevés, 30/07 → 05/09", "322 relevés, 23/07 → 05/09"],
|
||||
"en": ["1793 records, 30 Jul → 5 Sep", "1793 records, 14 Aug → 5 Sep",
|
||||
"1476 records, 30 Jul → 5 Sep", "322 records, 23 Jul → 5 Sep"],
|
||||
"zh": ["1793 条记录,7/30 → 9/5", "1793 条记录,8/14 → 9/5",
|
||||
"1476 条记录,7/30 → 9/5", "322 条记录,7/23 → 9/5"],
|
||||
}
|
||||
ETATS = {"fr": {"s": "en service", "i": "isolée"},
|
||||
"en": {"s": "in service", "i": "isolated"},
|
||||
"zh": {"s": "在运行", "i": "已隔离"}}
|
||||
PACKS = {"fr": {"a": "ancien", "r": "récent"},
|
||||
"en": {"a": "older", "r": "newer"},
|
||||
"zh": {"a": "旧", "r": "新"}}
|
||||
SEUILS_L = {
|
||||
"fr": [(3480, "niveau 1"), (3520, "niveau 2"), (3550, "niveau 3 — le courant se réduit"), (3600, "niveau 4")],
|
||||
"en": [(3480, "level 1"), (3520, "level 2"), (3550, "level 3 — current is reduced"), (3600, "level 4")],
|
||||
"zh": [(3480, "一级"), (3520, "二级"), (3550, "三级 — 充电电流开始下降"), (3600, "四级")],
|
||||
}
|
||||
|
||||
T = {}
|
||||
|
||||
T["fr"] = dict(
|
||||
titre="Les cent cinq cellules",
|
||||
etiq="Parc Pylontech · diagnostic en cours",
|
||||
chapeau="Huit modules, quinze cellules chacun. Dix de ces cellules brident la "
|
||||
"charge des quatre-vingt-quinze autres. Voici lesquelles, comment on le "
|
||||
"sait, et ce qu’on peut en faire.",
|
||||
maj="Dernière mise à jour",
|
||||
v=[("10","cellules atteintes sur 105"),("3","modules concernés sur 8"),
|
||||
("5 s","entre le franchissement du seuil et la coupure"),
|
||||
("30 A","plafond imposé au parc entier, pour 150 A nominaux")],
|
||||
h1="Le verdict",
|
||||
p1="""<p>Le parc n’est pas usé. Quatre modules sur huit sont <strong>irréprochables</strong> :
|
||||
soixante cellules sans une seule anomalie, après plus de trois cents cycles. Un
|
||||
cinquième l’est tout autant.</p>
|
||||
<p>Trois modules portent l’ensemble du problème, et à l’intérieur de ces trois,
|
||||
<strong>dix cellules</strong>. Quand l’une d’elles atteint 3550 mV, le BMS réduit
|
||||
le courant de charge — non pas de son module, mais <strong>de tout le parc</strong>.
|
||||
Cinq modules sains sont bridés par dix cellules.</p>""",
|
||||
leg=["saine","décalée","gravement atteinte","terminale"],
|
||||
figcap="""Amplitude balayée par chaque cellule entre sa tension minimale et sa
|
||||
tension maximale sur la période d’observation. Le premier module est le
|
||||
<strong>témoin</strong> : il vit dans la même chaîne que les deux abîmés, a subi
|
||||
les mêmes courants et les mêmes journées, et ses quinze cellules tiennent dans
|
||||
<strong>onze millivolts d’amplitude les unes des autres</strong>. Une cellule qui
|
||||
a perdu de la capacité se remplit et se vide avant ses voisines, donc elle balaye
|
||||
une plage bien plus large à courant identique — le signe ne demande aucun
|
||||
démontage. Les amplitudes du module isolé sont plus faibles parce qu’il a passé
|
||||
la période hors service, sur une plage de charge plus étroite : c’est l’écart à
|
||||
ses propres voisines qui compte, pas la valeur absolue.""",
|
||||
h2="Le parc, module par module",
|
||||
p2="""<p>L’identité d’un module est son code-barres, jamais son adresse : chaque
|
||||
chaîne renumérote ses modules à partir de 1, il existe donc deux « module 1 »
|
||||
dans cette installation.</p>""",
|
||||
th=["Code-barres","Pack","Adr.","Cellules atteintes","Lesquelles","Écart médian",
|
||||
"Surtensions","Sous-tensions",""],
|
||||
p3="""<p>Lisez la colonne des écarts médians. Les cinq modules sains tiennent entre
|
||||
<strong>2 et 6 millivolts</strong> ; les trois autres sont à 45, 57 et 108. Le même
|
||||
contraste apparaît sur les surtensions : <strong>498</strong> pour le premier
|
||||
module contre <strong>une seule</strong> pour chacun des quatre du pack récent,
|
||||
qui ont pourtant encaissé dix fois plus de cycles.</p>
|
||||
<p>Les soixante cellules du pack récent balayent toutes entre 168 et 191 mV
|
||||
d’amplitude, sans exception. L’inventaire est clos.</p>""",
|
||||
h3="Le déclenchement, chronométré",
|
||||
p4="""<p>Le 5 septembre, la console a été branchée sur les trois modules du pack
|
||||
ancien pendant que l’alarme montait. Ce qui suit est le relevé, à la seconde.</p>""",
|
||||
thc=["Heure","Ce qui se passe",""],
|
||||
enc1="""<p><strong>La découverte la plus utile</strong> tient dans la quatrième
|
||||
ligne : l’alarme repasse au vert bien avant que le plafond ne remonte. Chercher
|
||||
l’alarme dans les journaux fait donc manquer l’essentiel du phénomène — elle dure
|
||||
quelques minutes, le bridage dure des heures.</p>""",
|
||||
p5="""<p>Les seuils ne sont pas des valeurs choisies : ce sont ceux que le matériel
|
||||
déclare lui-même, lus dans <span class="mono">sysinfo</span> du LV-HUB.</p>""",
|
||||
h4="Résistance interne ou décalage de charge ?",
|
||||
p6="""<p>La question décide de ce qu’un rééquilibrage peut rendre. Deux points de
|
||||
mesure suffisent à la trancher, sur la même cellule à deux courants différents.</p>
|
||||
<table class="mini"><tr><th></th><th>courant par cellule</th><th>écart</th></tr>
|
||||
<tr><td class="mono">13:04:48</td><td class="num">6,33 A</td><td class="num">163 mV</td></tr>
|
||||
<tr><td class="mono">14:05:42</td><td class="num">0,04 A</td><td class="num">46 mV</td></tr></table>
|
||||
<p>La pente donne <strong>≈ 18,6 mΩ</strong> de résistance excédentaire sur la
|
||||
cellule meneuse, vingt à quarante fois celle d’une cellule saine. L’ordonnée à
|
||||
l’origine, <strong>≈ 46 mV</strong>, est le vrai décalage de charge.</p>
|
||||
<p>Contrôle indépendant : cette droite prédit 312 mV à 100 A de courant parc.
|
||||
L’écart maximal réellement enregistré sur trente-sept jours est de 280 mV.</p>
|
||||
<p>Donc sur les ~190 mV d’écart en charge, <strong>46 mV seulement sont un
|
||||
décalage</strong> — le reste est de la capacité perdue. Un rééquilibrage parfait
|
||||
ramènerait le déclenchement de 3555 à environ 3510 mV : sous le seuil, mais avec
|
||||
quarante millivolts de marge seulement.</p>""",
|
||||
h5="D’où viennent les dégâts",
|
||||
p7="""<p>Pas de l’usure. Le pack récent a encaissé trois cent quarante cycles en un
|
||||
an et ses soixante cellules sont intactes : cycler n’abîme pas ces modules. Et le
|
||||
module témoin a partagé la chaîne, les courants et les journées des deux abîmés
|
||||
sans une égratignure.</p>
|
||||
<p>Les deux cellules terminales du parc sont descendues à <span class="mono">2953</span>
|
||||
et <span class="mono">2939 mV</span>, sous le seuil d’alarme basse. Un accumulateur
|
||||
au lithium-fer-phosphate mené là sous charge perd de la capacité de façon
|
||||
irréversible. <strong>Ces cellules n’ont pas vieilli, elles ont été vidées trop
|
||||
bas.</strong></p>""",
|
||||
h6="Les trois questions posées à Pylontech",
|
||||
q=["Ces cellules sont-elles récupérables par un maintien prolongé en haut de "
|
||||
"charge, ou la composante résistive de 18,6 mΩ rend-elle l’opération vaine ?",
|
||||
"Existe-t-il une procédure recommandée pour un module dans cet état, et une "
|
||||
"limite au-delà de laquelle le remplacement du module s’impose ?",
|
||||
"Que compte exactement le <span class=\"mono\">SOHCount</span> par cellule "
|
||||
"rendu par la commande <span class=\"mono\">soh</span>, et à partir de quelle "
|
||||
"valeur Pylontech considère qu’une cellule doit être traitée ?"],
|
||||
meth="Relevés faits sur la console série des BMS Pylontech, que ni Home Assistant "
|
||||
"ni le GX Victron n’exposent : le système ne publie que l’agrégat du parc. "
|
||||
"Installation en autoconsommation sans injection, deux MultiPlus-II 48/5000 "
|
||||
"en parallèle. Ce rapport évolue au fil des travaux.",
|
||||
)
|
||||
|
||||
T["en"] = dict(
|
||||
titre="The Hundred and Five Cells",
|
||||
etiq="Pylontech pack · diagnosis in progress",
|
||||
chapeau="Eight modules, fifteen cells each. Ten of those cells throttle the "
|
||||
"charging of the other ninety-five. Here is which ones, how we know, "
|
||||
"and what can be done about it.",
|
||||
maj="Last updated",
|
||||
v=[("10","affected cells out of 105"),("3","modules involved out of 8"),
|
||||
("5 s","from threshold crossing to current cut"),
|
||||
("30 A","limit imposed on the whole pack, against 150 A nominal")],
|
||||
h1="The verdict",
|
||||
p1="""<p>The pack is not worn out. Four modules out of eight are <strong>flawless</strong>:
|
||||
sixty cells without a single anomaly, after more than three hundred cycles. A
|
||||
fifth is just as clean.</p>
|
||||
<p>Three modules carry the entire problem, and within those three, <strong>ten
|
||||
cells</strong>. When one of them reaches 3550 mV the BMS reduces the charge
|
||||
current — not for its own module, but <strong>for the whole pack</strong>. Five
|
||||
healthy modules are throttled by ten cells.</p>""",
|
||||
leg=["healthy","drifting","badly affected","terminal"],
|
||||
figcap="""Voltage span swept by each cell between its minimum and maximum over the
|
||||
observation period. The first module is the <strong>control</strong>: it lives on
|
||||
the same chain as the two damaged ones, has seen the same currents and the same
|
||||
days, and its fifteen cells sit within <strong>eleven millivolts of span of each
|
||||
other</strong>. A cell that has lost capacity fills and empties before its
|
||||
neighbours, so it sweeps a far wider range at identical current — the sign
|
||||
requires no disassembly. The isolated module shows smaller spans because it spent
|
||||
the period out of service, over a narrower state-of-charge window: what matters
|
||||
is the gap to its own neighbours, not the absolute value.""",
|
||||
h2="The pack, module by module",
|
||||
p2="""<p>A module's identity is its barcode, never its address: each chain renumbers
|
||||
its modules from 1, so there are two “module 1” in this installation.</p>""",
|
||||
th=["Barcode","Pack","Addr.","Affected cells","Which ones","Median spread",
|
||||
"Overvoltage","Undervoltage",""],
|
||||
p3="""<p>Read the median spread column. The five healthy modules sit between
|
||||
<strong>2 and 6 millivolts</strong>; the other three are at 45, 57 and 108. The
|
||||
same contrast shows in the overvoltage counters: <strong>498</strong> for the
|
||||
first module against <strong>one</strong> for each of the four in the newer pack,
|
||||
which have nonetheless taken ten times more cycles.</p>
|
||||
<p>All sixty cells of the newer pack sweep between 168 and 191 mV, without
|
||||
exception. The inventory is closed.</p>""",
|
||||
h3="The trip, timed",
|
||||
p4="""<p>On 5 September the console was connected to the three modules of the older
|
||||
pack while the alarm was rising. What follows is the record, to the second.</p>""",
|
||||
thc=["Time","What happens",""],
|
||||
enc1="""<p><strong>The most useful finding</strong> is in the fourth row: the alarm
|
||||
clears well before the limit recovers. Looking for the alarm in the logs therefore
|
||||
misses the bulk of the phenomenon — the alarm lasts minutes, the throttling lasts
|
||||
hours.</p>""",
|
||||
p5="""<p>The thresholds are not values we chose: they are the ones the hardware
|
||||
declares, read from <span class="mono">sysinfo</span> on the LV-HUB.</p>""",
|
||||
h4="Internal resistance, or charge imbalance?",
|
||||
p6="""<p>The answer decides what balancing can give back. Two measurement points on
|
||||
the same cell at two different currents settle it.</p>
|
||||
<table class="mini"><tr><th></th><th>current per cell</th><th>spread</th></tr>
|
||||
<tr><td class="mono">13:04:48</td><td class="num">6.33 A</td><td class="num">163 mV</td></tr>
|
||||
<tr><td class="mono">14:05:42</td><td class="num">0.04 A</td><td class="num">46 mV</td></tr></table>
|
||||
<p>The slope gives <strong>≈ 18.6 mΩ</strong> of excess internal resistance on the
|
||||
leading cell, twenty to forty times that of a healthy one. The intercept,
|
||||
<strong>≈ 46 mV</strong>, is the true charge imbalance.</p>
|
||||
<p>Independent check: this line predicts 312 mV at 100 A pack current. The largest
|
||||
spread actually recorded over thirty-seven days is 280 mV.</p>
|
||||
<p>So of the ~190 mV of spread under charge, <strong>only 46 mV are an
|
||||
imbalance</strong> — the rest is lost capacity. A perfect rebalance would bring the
|
||||
trip from 3555 down to about 3510 mV: below the threshold, but with only forty
|
||||
millivolts of margin.</p>""",
|
||||
h5="Where the damage comes from",
|
||||
p7="""<p>Not from wear. The newer pack has taken three hundred and forty cycles in a
|
||||
year and its sixty cells are intact: cycling does not damage these modules. And
|
||||
the control module shared the chain, the currents and the days of the two damaged
|
||||
ones without a scratch.</p>
|
||||
<p>The two terminal cells went down to <span class="mono">2953</span> and
|
||||
<span class="mono">2939 mV</span>, below the low-voltage alarm threshold. A
|
||||
lithium iron phosphate cell taken there under load loses capacity irreversibly.
|
||||
<strong>These cells did not age, they were discharged too deep.</strong></p>""",
|
||||
h6="Three questions for Pylontech",
|
||||
q=["Are these cells recoverable by a prolonged hold at high state of charge, or "
|
||||
"does the 18.6 mΩ resistive component make the attempt pointless?",
|
||||
"Is there a recommended procedure for a module in this condition, and a limit "
|
||||
"beyond which module replacement is the only option?",
|
||||
"What exactly does the per-cell <span class=\"mono\">SOHCount</span> returned "
|
||||
"by the <span class=\"mono\">soh</span> command count, and from what value "
|
||||
"does Pylontech consider a cell to require attention?"],
|
||||
meth="Measurements taken on the serial console of the Pylontech BMS units, which "
|
||||
"neither Home Assistant nor the Victron GX exposes: the system publishes only "
|
||||
"the pack aggregate. Self-consumption installation without grid feed-in, two "
|
||||
"MultiPlus-II 48/5000 in parallel. This report evolves as the work proceeds.",
|
||||
)
|
||||
|
||||
T["zh"] = dict(
|
||||
titre="一百零五颗电芯",
|
||||
etiq="Pylontech 电池组 · 诊断进行中",
|
||||
chapeau="八个模块,每个十五颗电芯。其中十颗电芯限制了其余九十五颗的充电。"
|
||||
"本报告说明是哪几颗、依据何在、以及可以怎么处理。",
|
||||
maj="最后更新",
|
||||
v=[("10","105 颗中受影响的电芯"),("3","8 个模块中受影响的模块"),
|
||||
("5 秒","从越过阈值到电流下降"),
|
||||
("30 A","施加于整组的限值,标称为 150 A")],
|
||||
h1="结论",
|
||||
p1="""<p>电池组并未整体老化。八个模块中有四个<strong>毫无异常</strong>:
|
||||
六十颗电芯在三百多次循环之后没有一处异常。第五个模块同样干净。</p>
|
||||
<p>全部问题集中在三个模块,而在这三个模块之内只有<strong>十颗电芯</strong>。
|
||||
当其中一颗达到 3550 mV,BMS 便降低充电电流——降的不是该模块,而是
|
||||
<strong>整个电池组</strong>。五个健康模块被十颗电芯拖住。</p>""",
|
||||
leg=["健康","轻度偏离","严重偏离","已失效"],
|
||||
figcap="""图中为观测期内每颗电芯在最低与最高电压之间所扫过的电压幅度。
|
||||
第一个模块是<strong>对照模块</strong>:它与两个受损模块同在一条通信链上,
|
||||
经历相同的电流与相同的日子,而它的十五颗电芯彼此幅度之差仅
|
||||
<strong>十一毫伏</strong>。容量衰减的电芯会比相邻电芯更早充满、更早放空,
|
||||
因此在相同电流下扫过的电压范围明显更宽——这一判据无需拆解模块即可读出。
|
||||
已隔离模块的幅度偏小,是因为它在观测期内处于停用状态、荷电区间更窄:
|
||||
应看它与自身相邻电芯之差,而非绝对数值。""",
|
||||
h2="逐模块清单",
|
||||
p2="""<p>模块的身份是它的条码,而不是地址:每条链上的模块都从 1 重新编号,
|
||||
因此本系统中存在两个「模块 1」。</p>""",
|
||||
th=["条码","电池组","地址","受影响电芯数","具体编号","压差中位数",
|
||||
"过压次数","欠压次数",""],
|
||||
p3="""<p>请看压差中位数一列。五个健康模块在 <strong>2 至 6 毫伏</strong>之间;
|
||||
另外三个分别为 45、57 与 108。过压计数呈现同样的对比:第一个模块为
|
||||
<strong>498</strong> 次,而新电池组四个模块各自仅 <strong>1</strong> 次——
|
||||
后者的循环次数还多出十倍。</p>
|
||||
<p>新电池组的六十颗电芯,幅度全部落在 168 至 191 mV 之间,无一例外。
|
||||
清点至此完成。</p>""",
|
||||
h3="触发过程,逐秒记录",
|
||||
p4="""<p>9 月 5 日,在告警上升过程中,控制台接入了旧电池组的三个模块。
|
||||
以下为逐秒记录。</p>""",
|
||||
thc=["时间","发生了什么",""],
|
||||
enc1="""<p><strong>最有价值的一处发现</strong>在第四行:告警远早于电流限值
|
||||
恢复之前就已解除。因此仅在日志中查找告警,会错过该现象的绝大部分——
|
||||
告警持续数分钟,而限流持续数小时。</p>""",
|
||||
p5="""<p>这些阈值并非我们所选:它们由设备本身声明,读取自 LV-HUB 的
|
||||
<span class="mono">sysinfo</span>。</p>""",
|
||||
h4="是内阻,还是荷电不均衡?",
|
||||
p6="""<p>这个问题决定了均衡能够挽回多少。同一颗电芯在两种电流下的两个测点
|
||||
即可判定。</p>
|
||||
<table class="mini"><tr><th></th><th>单芯电流</th><th>压差</th></tr>
|
||||
<tr><td class="mono">13:04:48</td><td class="num">6.33 A</td><td class="num">163 mV</td></tr>
|
||||
<tr><td class="mono">14:05:42</td><td class="num">0.04 A</td><td class="num">46 mV</td></tr></table>
|
||||
<p>斜率给出最高电芯的额外内阻约 <strong>18.6 mΩ</strong>,为健康电芯的
|
||||
二十至四十倍。截距 <strong>约 46 mV</strong>,才是真正的荷电不均衡。</p>
|
||||
<p>独立验证:该直线预测在整组电流 100 A 时压差为 312 mV;三十七天记录中
|
||||
实际出现的最大压差为 280 mV。</p>
|
||||
<p>因此在充电时约 190 mV 的压差中,<strong>只有 46 mV 属于不均衡</strong>,
|
||||
其余为容量损失。即便完成理想均衡,触发点也只能从 3555 mV 降至约 3510 mV:
|
||||
低于阈值,但余量仅四十毫伏。</p>""",
|
||||
h5="损伤的来源",
|
||||
p7="""<p>并非老化所致。新电池组一年内完成三百四十次循环,六十颗电芯完好无损:
|
||||
循环本身不会损坏这些模块。对照模块与两个受损模块同链、同电流、同工况,
|
||||
亦毫发无伤。</p>
|
||||
<p>两颗已失效电芯曾降至 <span class="mono">2953</span> 与
|
||||
<span class="mono">2939 mV</span>,低于低压告警阈值。磷酸铁锂电芯在带载状态下
|
||||
被放至该电压,会发生不可逆的容量损失。<strong>这些电芯不是老化,而是被过放。</strong></p>""",
|
||||
h6="向 Pylontech 提出的三个问题",
|
||||
q=["这些电芯能否通过长时间保持高荷电状态而恢复,还是 18.6 mΩ 的内阻分量"
|
||||
"已使该尝试失去意义?",
|
||||
"对处于此状态的模块,是否有推荐的处理流程?超过何种程度必须更换模块?",
|
||||
"<span class=\"mono\">soh</span> 命令返回的单芯 <span class=\"mono\">SOHCount</span> "
|
||||
"具体统计的是什么?从多大数值起,Pylontech 认为该电芯需要处理?"],
|
||||
meth="数据取自 Pylontech BMS 的串口控制台——Home Assistant 与 Victron GX 均不提供"
|
||||
"这些数据,系统仅发布整组聚合值。系统为无馈网自发自用,两台 MultiPlus-II "
|
||||
"48/5000 并机。本报告将随工作进展持续更新。",
|
||||
)
|
||||
Reference in New Issue
Block a user