Ho creato una libreria che implementa il protocollo di comunicazione completo dell’Inverter ABB (ex PowerOne ora Fimer) Aurora e necessita di collegare l’inverter tramite RS485.
Puoi trovare la libreria qui “Libreria Inverter ABB Aurora PV per Arduino, esp8266 and esp32“.
Inverter hardware
Per prima cosa devi trovare l’interfaccia RS485 del tuo inverter, nel mio devo rimuovere il pannello frontale
Quindi controllare la posizione dell’interfaccia RS485 e selezionare il connettore positivo e negativo.
Ref. inverter | Ref. manual | Description |
WIND | 13 | Collegamento del segnale del tachimetro (WIND) |
ALARM | 13 | Collegamento al relè multifunzione (ALARM) |
REM | 13 | Collegamento al telecomando ON / OFF (REM) |
RS485 | 13 | Collegamento della linea RS485 (PC) (RS485) |
J24 – RS485 (A) | 14 | Collegamento della linea RS485 (PC) su connettore RJ45 |
J25 – RS485 (B) | 14 | Collegamento della linea RS485 (PC) su connettore RJ45 |
S2 | 15 | Selettore resistenza di terminazione linea RS485 (PC) |
Quindi connetti i fili ad + e – e estraili e verifichiamo l’interfaccia di collegamento RS-485.
È possibile collegare i conduttori utilizzando i connettori terminali 13 (+ T / R, -T / R, LNK e RTN) anche l’LNK.
È inoltre necessario attivare l’interruttore del terminale di linea.
Se vuoi usare il connettore ethernet devi seguire questo schema.
Pin No. | Funzione |
3 | +T/R |
4 | +R |
5 | -T/R |
7 | RTN |
1, 2, 6, 8 | non usato |
MAX485 | Inverter |
---|---|
GND | RTN |
A | +T |
B | -T |
Protocollo ABB Aurora (fare riferimento alla libreria per maggiori dettagli)
Di seguito le informazioni di base del protocollo di comunicazione RS485 ABB Aurora.
La comunicazione tra Host e processore funziona tramite un’interfaccia seriale RS485 o RS232.
I parametri di configurazione in entrambi i casi sono:
- 19200 baud (valore predefinito)
- 1 bit di stop
- nessuna parità
Il protocollo di comunicazione utilizza messaggi di trasmissione a lunghezza fissa (8Byte + 2Byte per Checksum) strutturati come segue:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
Address | Command | B2 | B3 | B4 | B5 | B6 | B7 | CRC_L | CRC_H |
Anche la struttura della risposta ha una lunghezza fissa (6 Byte + 2 Byte per Checksum):
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
Transmission State | Global State | B2 | B3 | B4 | B5 | CRC_L | CRC_H |
Lo stato di trasmissione è codificato come segue:
0 = Va tutto bene.
51 = Il comando non è implementato
52 = La variabile non esiste
53 = Il valore della variabile è fuori intervallo
54 = EEprom non accessibile
55 = Modalità servizio non commutata
56 = Impossibile inviare il comando al micro interno
57 = Comando non eseguito
58 = La variabile non è disponibile, riprova
Global State mostra lo stato del dispositivo indirizzato, i dettagli sono specificati nella descrizione dei comandi.
Arduino UNO e MAX485
Puoi usare un Arduino UNO e un IC MAX485, se preferisci puoi acquistare un modulo.
You can find IC on AliExpress
You can find module on AliExpress
You can ArduinoUNO on Arduino UNO - Arduino MEGA 2560 R3 - Arduino Nano - Arduino Pro Mini
Qui il semplice schema di connessione, il resistore deve essere 120Ω, ma io uso 104Ω.
Ho creato una libreria derivata da un progetto che puoi trovare nel web creato da drhack, è un lavoro fantastico (grazie a drhack) ma lo trovo abbastanza difficile da usare, con hardware specifico e non così riutilizzabile.
Quindi cerco di standardizzare la libreria e renderla semplice (le persone che usano le mie libreria sanno che “semplificare” è il mio motto.
Libreria
Puoi trovare la mia libreria con tutte le informazioni necessarie qui “Libreria Inverter ABB Aurora PV per Arduino, esp8266 and esp32“.
Pacchetto
Come puoi vedere nella descrizione del pacchetto
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
Address | Command | B2 | B3 | B4 | B5 | B6 | B7 | CRC_L | CRC_H |
è necessario specificare un indirizzo, che normalmente è 2, ma è necessario selezionarlo nel menu dell’inverter.
È possibile creare una catena di inverter che comunicano tramite RS485. È possibile scegliere un indirizzo da 2 a 63. L’impostazione dell’indirizzo sull’inverter avviene tramite il display e la pulsantiera.
Per cambiare l’indirizzo vai a SETTINGS --> Insert password (default 0000) --> Address
.
Questo menù permette di impostare gli indirizzi delle porte seriali dei singoli inverter collegati alla linea RS485.
Gli indirizzi assegnabili sono da 2 a 63. I pulsanti UP e DOWN scorrono la scala numerica.
Al momento non è possibile utilizzare la selezione “AUTO”.
Per il modulo “produzione” userò HardwareSerial
per ottimizzare la comunicazione e ridurre i costi generali.
/*
Test Arduino MAX485 Aurora ABB connection
by Mischianti Renzo <https://mischianti.org>
https://www.mischianti.org/
*/
#include "Arduino.h"
#include <Aurora.h>
#include <SoftwareSerial.h>
#include <MemoryFree.h>
//SoftwareSerial mySerial(10, 11); // RX, TX
//Aurora inverter = Aurora(2, &Serial1, 5);
Aurora inverter = Aurora(2, 10, 11, 5);
void SerialPrintData(byte *data) {
for (int i = 0; i < 8; i++) {
Serial.print((int)data[i]);
Serial.print(F(" "));
}
Serial.println(F(" "));
}
void setup()
{
Serial.begin(19200);
inverter.begin();
}
// The loop function is called in an endless loop
void loop()
{
Serial.print(F("freeMemory(1)="));Serial.println(freeMemory());
Aurora::DataCumulatedEnergy cumulatedEnergy = inverter.readCumulatedEnergy(CUMULATED_DAILY_ENERGY);
Serial.println(F("------------------------------------------"));
Serial.println(F("INVERTER 2"));
Serial.print(F(" Data ROW = ")); SerialPrintData(inverter.receiveData);
Serial.print(F(" Read State = ")); Serial.println(cumulatedEnergy.state.readState);
Serial.print(F("Transmission State = ")); Serial.println(cumulatedEnergy.state.getTransmissionState());
Serial.print(F(" Global State = ")); Serial.println(cumulatedEnergy.state.getGlobalState());
Serial.print(F(" Energia = ")); Serial.print(cumulatedEnergy.energy); Serial.println(" Wh");
// free(&cumulatedEnergy);
Serial.println(F("------------------------------------------"));
Aurora::DataLastFourAlarms lastFour = inverter.readLastFourAlarms();
Serial.println(F("INVERTER 2"));
Serial.print(F(" Data ROW = ")); SerialPrintData(inverter.receiveData);
Serial.print(F(" Read State = ")); Serial.println(lastFour.state.readState);
Serial.print(F("Transmission State = ")); Serial.println(lastFour.state.getTransmissionState());
Serial.print(F(" Global State = ")); Serial.println(lastFour.state.getGlobalState());
Serial.print(F(" Alarms 1 = ")); Serial.println(lastFour.getAlarm1State());
Serial.print(F(" Alarms 2 = ")); Serial.println(lastFour.getAlarm2State());
Serial.print(F(" Alarms 3 = ")); Serial.println(lastFour.getAlarm3State());
Serial.print(F(" Alarms 4 = ")); Serial.println(lastFour.getAlarm4State());
// free(&lastFour);
Serial.println(F("------------------------------------------"));
Aurora::DataVersion version = inverter.readVersion();
Serial.println("INVERTER 2");
Serial.print(F(" Data ROW = ")); SerialPrintData(inverter.receiveData);
Serial.print(F(" Read State = ")); Serial.println(version.state.readState);
Serial.print(F("Transmission State = ")); Serial.println(version.state.getTransmissionState());
Serial.print(F(" Global State = ")); Serial.println(version.state.getGlobalState());
Serial.print(F(" Version = ")); Serial.print(version.getModelName().name); Serial.print(F(" ")); Serial.print(version.getIndoorOutdoorAndType()); Serial.print(F(" ")); Serial.print(version.getGridStandard()); Serial.print(F(" ")); Serial.print(version.getTrafoOrNonTrafo()); Serial.print(F(" ")); Serial.println(version.getWindOrPV());
Serial.println(F("------------------------------------------"));
// free(&version);
Aurora::DataConfigStatus configStatus = inverter.readConfig();
Serial.print(F(" Data ROW = ")); SerialPrintData(inverter.receiveData);
Serial.print(F(" Read State = ")); Serial.println(configStatus.state.readState);
Serial.print(F("Transmission State = ")); Serial.println(configStatus.state.getTransmissionState());
Serial.print(F(" Global State = ")); Serial.println(configStatus.state.getGlobalState());
Serial.print(F(" config = ")); Serial.println(configStatus.getConfigStatus());
Serial.println(F("------------------------------------------"));
// free(&version);
Serial.print(F("freeMemory(2)="));Serial.println(freeMemory());
Aurora::DataTimeCounter timeCounter = inverter.readTimeCounter(CT_TOTAL_RUN);
Serial.print(F(" Data ROW = ")); SerialPrintData(inverter.receiveData);
Serial.print(F(" Read State = ")); Serial.println(timeCounter.state.readState);
Serial.print(F("Transmission State = ")); Serial.println(timeCounter.state.getTransmissionState());
Serial.print(F(" Global State = ")); Serial.println(timeCounter.state.getGlobalState());
Serial.print(F(" time in sec = ")); Serial.println(timeCounter.upTimeInSec);
Serial.print(F(" time in verb = ")); Serial.print(timeCounter.getSecondsInDateElements()[0]); Serial.print(F("Y ")); Serial.print(timeCounter.getSecondsInDateElements()[1]); Serial.print(F("D "));Serial.print(timeCounter.getSecondsInDateElements()[2]);Serial.print(F("H "));Serial.print(timeCounter.getSecondsInDateElements()[3]);+Serial.print(F("M "));Serial.print(timeCounter.getSecondsInDateElements()[4]);Serial.println(F("S "));
Serial.println(F("------------------------------------------"));
// free(&version);
Serial.print(F("freeMemory(2)="));Serial.println(freeMemory());
delay(4000);
}
Grazie
- Centralina Web per inverter ABB (ex Power One) Aurora (WIM): intro al progetto
- Centralina Web per inverter ABB Aurora (WIM): connessione Arduino all’RS-485
- Centralina Web per inverter ABB Aurora (WIM): dispositivi di archiviazione
- Centralina Web per inverter ABB Aurora (WIM): debug e notifica
- Centralina Web per inverter ABB Aurora (WIM): impostare l’ora e UPS
- Centralina Web per inverter ABB Aurora (WIM): configurazione WIFI e server REST
- Centralina Web per inverter ABB Aurora (WIM): WebSocket e Web Server
- Centralina Web per inverter ABB Aurora (WIM): cablaggio e PCB
- Centralina Web per inverter ABB Aurora (WIM): caricare il programma ed il front end
- Centralina Web per inverter ABB Aurora (WIM): scatola stampata in 3D e completamento
- Centralina Web per inverter ABB Aurora (WIM): riparare l’errore E013
GitHub repository con tutto il codice FE (transpilato) e BE