Switched from CAN connection to UART for correctly fetch the datas.

This commit is contained in:
Giuseppe Raffa
2026-06-06 13:42:32 +02:00
parent 91161d2d2c
commit 1d5bb340d9
6 changed files with 420 additions and 285 deletions

View File

@@ -1,12 +1,10 @@
/*
Costanti del protocollo Poweren MPPT Boost.
Riferimento: Manuale Doc. 40.0000.206, Hw v1.2 Rev 01.
Il microcontrollore degli MPPT (PIC24/dsPIC33 a virgola fissa) trasmette interi a 16 bit.
Per ottenere il valore fisico bisogna dividere il raw per il fattore di conversione.
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.
*/
// Fattori di conversione (valore_fisico = raw / factor)
const conversionsFactors = {
voltageInput: 10, // tensione ingresso [V] es: 296 -> 29.6 V
currentInput: 100, // corrente ingresso [A] es: 1100 -> 11.00 A
@@ -50,25 +48,87 @@ const errorsFlags = {
10: 'memory_flash_read_error',
};
// Indirizzi dei registri richiesti via polling attivo
/*
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 = {
powerInput: 20,
powerOutput: 21,
temperature1: 35,
temperature2: 36,
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)
};
// Mapping dei bitrate CAN al comando slcan corrispondente (Lawicel CAN232/CANUSB)
const slcanBitrateCommands = {
10000: 'S0',
20000: 'S1',
50000: 'S2',
100000: 'S3',
125000: 'S4',
250000: 'S5',
500000: 'S6',
800000: 'S7',
1000000: 'S8',
/*
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
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,
};
// Timeout e retry per le transazioni sincrone (richiesta -> risposta)
const transactionTiming = {
timeoutMs: 500,
retries: 5,
retryDelayMs: 100,
};
module.exports = {
@@ -76,5 +136,8 @@ module.exports = {
status1Flags,
errorsFlags,
registerAddresses,
slcanBitrateCommands,
pollRegisters,
serialProtocol,
serialDefaults,
transactionTiming,
};