152 lines
5.9 KiB
JavaScript
152 lines
5.9 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: 'StorMod', // Modalita' storage attiva
|
|
5: 'FloatMod', // Modalita' float (mantenimento)
|
|
6: 'CtrlEna', // Algoritmo MPPT abilitato
|
|
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")
|
|
chargeCapacity: 7, // Chg_Cap - Ah caricati (da verificare)
|
|
voltageInput: 16, // Vi - tensione ingresso (da verificare)
|
|
currentInput: 17, // Ii - corrente ingresso (da verificare)
|
|
voltageOutput: 18, // Vo - tensione uscita (da verificare)
|
|
currentOutput: 19, // Io - corrente uscita (da verificare)
|
|
powerInput: 20, // Pi - potenza ingresso (confermato)
|
|
powerOutput: 21, // Po - potenza uscita (confermato)
|
|
temperature1: 35, // T1 - temperatura fase 1 (confermato)
|
|
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.chargeCapacity,
|
|
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)
|
|
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,
|
|
};
|