Files
meb-solars/src/core/constants.js
2026-06-06 14:20:27 +02:00

152 lines
6.0 KiB
JavaScript

/*
Il microcontrollore degli MPPT (PIC24/dsPIC33 a virgola fissa) trasmette interi a 16 bit. Per
inviare dati decimali piu precisi, il dato viene moltiplicato per un valore definito.
conversionFactors mappa i valori di conversione usati, in modo tale che il codice riceve i dati e li divide il fattore di conversione.
*/
const conversionsFactors = {
voltageInput: 10, // tensione ingresso [V] es: 296 -> 29.6 V
currentInput: 100, // corrente ingresso [A] es: 1100 -> 11.00 A
powerInput: 10, // potenza ingresso [W] es: 3260 -> 326.0 W
voltageOutput: 10, // tensione uscita [V] es: 864 -> 86.4 V
currentOutput: 100, // corrente uscita [A] es: 380 -> 3.80 A
powerOutput: 10, // potenza uscita [W] es: 3110 -> 311.0 W
temperaturePhase1: 10, // temperatura fase 1 [°C]
temperaturePhase2: 10, // temperatura fase 2 [°C]
chargeCapacity: 100, // capacita' caricata [Ah] es: 1234 -> 12.34 Ah
};
// Flag del registro Status1 (registro 4): mappa bit -> codice operativo
const status1Flags = {
0: 'PwrEna', // Power stage abilitato via software
1: 'ChgEna', // Ponte Pin1-Pin8 inserito (enable hardware)
2: 'ChgOk', // Condizioni di ricarica OK
3: 'PwrOn', // Stadio di potenza acceso (eroga corrente)
4: 'CtrlEna', // Algoritmo MPPT abilitato
5: 'StorMod', // Modalita' storage attiva
6: 'FloatMod', // Modalita' float (mantenimento)
7: 'CCapRst', // Reset contatore Ah
8: 'Ph1Ena', // Fase 1 abilitata
9: 'Ph2Ena', // Fase 2 abilitata
10: 'QREna', // Quasi-Resonant Mode
11: 'DirMPPT', // Direzione algoritmo MPPT
};
// Flag del registro Warning (registro 6): mappa bit -> codice di errore/warning
const errorsFlags = {
0: 'fault',
1: 'vi_under_voltage_protection',
2: 'vi_low_voltage', // MPPT in standby
3: 'vi_over_voltage_protection',
4: 'li_over_current_protection',
5: 'under_minimum_battery_voltage',
6: 'over_maximum_battery_voltage',
7: 'current_to_battery_over_max', // protezione hw a 7A verso batteria
8: 'internal_hardware_protection',
9: 'over_temperature_protection', // sopra 120 °C
10: 'memory_flash_read_error',
};
/*
Indirizzi dei registri Poweren da leggere via UART (comando READ singolo registro).
ATTENZIONE: i valori marcati con "(da verificare)" sono dedotti dalla struttura del
protocollo e NON sono confermati dal manuale fornito. Per ottenere la mappa completa e
certa, interrogare l'MPPT con i comandi GET_REG_NAMES (102) / GET_REG_VALUES (101) tramite
DataCOM, oppure consultare la tabella registri del manuale (Doc. 40.0000.206) e correggere
qui i numeri. I valori confermati dalla documentazione sono indicati come "(confermato)".
*/
const registerAddresses = {
deviceAddress: 1, // Addr - indirizzo del dispositivo (confermato: usato per discovery)
status1: 4, // St1 - flag di stato (confermato: "registro 4")
warning: 6, // Warn - flag di warning/errore (confermato: "registro 6")
voltageInput: 16, // Vi - tensione ingresso (manuale: registro 16)
currentInput: 18, // Ii - corrente ingresso (manuale: registro 18)
voltageOutput: 22, // Vo - tensione uscita (manuale: registro 22)
currentOutput: 27, // Io - corrente uscita (manuale: registro 27)
powerInput: 20, // Pi - potenza ingresso (confermato)
powerOutput: 31, // Po - potenza uscita (manuale: registro 31)
chargeCapacity: null, // Chg_Cap - nel PDF hw1.2r01 collide con T1 sul registro 35: non pollare finche' non confermato
temperature1: 35, // T1 - temperatura fase 1 (manuale: registro 35)
temperature2: 36, // T2 - temperatura fase 2 (confermato)
};
/*
Elenco ordinato dei registri da interrogare ad ogni ciclo di polling per ciascun MPPT.
Si leggono solo i registri che alimentano i path SignalK; Pi/Po non sono inclusi perche'
la potenza viene calcolata come Vi*Ii e Vo*Io (come nella versione CAN).
*/
const pollRegisters = [
registerAddresses.status1,
registerAddresses.warning,
registerAddresses.voltageInput,
registerAddresses.currentInput,
registerAddresses.voltageOutput,
registerAddresses.currentOutput,
registerAddresses.temperature1,
registerAddresses.temperature2,
];
/*
Costanti del frame del protocollo seriale Poweren (UART).
Struttura pacchetto:
[SOF][DST][SRC][0x00][DLEN][DATA...][CHK_HI][CHK_LO][EOF]
- SOF = 0x42 ('B')
- SRC della GUI/host = 0xFF
- DST = indirizzo MPPT (0x00 = qualsiasi, es. 50 = MPPT di default)
- CHK = sum(DATA) & 0xFFFF in big-endian
- EOF = 0x0D
*/
const serialProtocol = {
startOfFrame: 0x42, // SOF
sourceHost: 0xFF, // SRC host/GUI
endOfFrame: 0x0D, // EOF
addressAny: 0x00, // DST = qualsiasi dispositivo (usato per discovery)
defaultDestinationAddress: 0x00, // DST UART usato da DataCOM: l'Addr del registro 1 e' il CAN Rx ID
headerLength: 5, // SOF + DST + SRC + 0x00 + DLEN
tailLength: 3, // CHK_HI + CHK_LO + EOF
// Comandi (scritti nel registro 2)
commands: {
reset: 99,
defaultValues: 100,
getRegValues: 101,
getRegNames: 102,
getRegUnits: 103,
getRegTypes: 104,
getFirmwareVersion: 120,
},
};
// Parametri di default della porta seriale (Waveshare USB-UART, 8N1)
const serialDefaults = {
baudRate: 115200,
dataBits: 8,
parity: 'none',
stopBits: 1,
// Linee di controllo: alcuni adapter (es. FTDI FT232R) resettano il target all'apertura.
// L'esempio di discovery Poweren funzionante le imposta entrambe a true.
dtr: true,
rts: true,
// Tempo di assestamento dopo l'apertura della porta prima di iniziare a trasmettere
openSettleMs: 250,
};
// Timeout e retry per le transazioni sincrone (richiesta -> risposta)
const transactionTiming = {
timeoutMs: 500,
retries: 5,
retryDelayMs: 100,
};
module.exports = {
conversionsFactors,
status1Flags,
errorsFlags,
registerAddresses,
pollRegisters,
serialProtocol,
serialDefaults,
transactionTiming,
};