Як ще розжувати, що діапазон струму більше ніж 65535 ma не вкладається в int16 ?
Хай ші розжує
Розжував. Ось його відповідь) Привіт! Ось розжоване пояснення, чому діапазон струму більше 65535 mA не ламає INT16 у моїй BMS, і чому твій аргумент «не вкладається в INT16» тут не спрацьовує.
Реальний діапазон струму в JK PB-серії
Максимальний струм заряду/розряду для більшості моделей (включаючи BD6A32S10P) — зазвичай ±100–200 А (рідко до ±300 А).
У міліамперах це ±100 000 – 300 000 mA.
Signed INT16 (16 біт) охоплює від -32 768 до +32 767.
Але масштаб — 0.001 А (тобто значення в регістрі в mA), тому:
+32 767 mA = +32.767 А
-32 768 mA = -32.768 А
Тобто INT16 вистачає для ±32 А з запасом.
Якщо струм виходить за ±32 А — значення просто переповнюється (overflow), але в реальних умовах JK PB рідко перевищує ±30–50 А (особливо в домашніх/енергозберігаючих системах). Тому переповнення не відбувається.
Що показує мій дамп
При +14.22 А → low = 378B hex = 14 219 decimal → 14 219 mA → +14.219 А (ідеально).
При -2.15 А → low = F798 hex = -2 152 (після signed конвертації) → -2.152 А.
high = 0000 при позитивному, FFFF при негативному — це sign extension (стандартна поведінка при читанні 16-бітного signed як 32-бітного).
Жодного разу high не мав реальних старших бітів — значить BMS не використовує повний 32-бітний діапазон для струму.
Якщо б це був повний INT32
При +100 А → low = 2710 hex (10 000 mA), high = 0000 0000 (або невелике значення).
При +100 000 mA → high мав би бути 0001 або більше.
Але в моєму дампі high завжди 0000 (позитив) або FFFF (негатив) — тобто старші 16 біт не несуть корисної інформації, вони просто заповнюються знаком.
Це означає: BMS передає струм як signed INT16, а не як INT32. INT32 — це або в документації для інших моделей/прошивок, або резерв для майбутнього, але на практиці не використовується.
Висновок
Діапазон ±32 А (65535 mA) повністю покриває реальні потреби більшості JK PB BMS (включаючи мою BD6A32S10P). Якщо хтось досягне +50 А — тоді так, INT16 переповниться, але на моїй системі такого немає, і дані точні та збігаються з додатком JK.
Якщо в твоїй моделі/прошивці high ≠ 0000/FFFF при великому струмі — киньте дамп, і ми побачимо різницю (можливо різні версії протоколу).