Centralina Web per inverter ABB Aurora (WIM): connessione Arduino all’RS-485 – 2

Spread the love

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“.

ABB PowerOne Aurora Web Inverter Centraline Wiring Arduino to RS485
ABB PowerOne Aurora Web Inverter Centraline Wiring Arduino to RS485

Inverter hardware

Per prima cosa devi trovare l’interfaccia RS485 del tuo inverter, nel mio devo rimuovere il pannello frontale

ABB Aurora electrical panel RS485 connection

Quindi controllare la posizione dell’interfaccia RS485 e selezionare il connettore positivo e negativo.

ABB Aurora panel connector RS485
Ref. inverterRef. manualDescription
WIND13Collegamento del segnale del tachimetro (WIND)
ALARM13Collegamento al relè multifunzione (ALARM)
REM13Collegamento al telecomando ON / OFF (REM)
RS48513Collegamento della linea RS485 (PC) (RS485)
J24 – RS485 (A)14Collegamento della linea RS485 (PC) su connettore RJ45
J25 – RS485 (B)14Collegamento della linea RS485 (PC) su connettore RJ45
S215Selettore resistenza di terminazione linea RS485 (PC)

Quindi connetti i fili ad + e – e estraili e verifichiamo l’interfaccia di collegamento RS-485.

Connect RS485 cable to ABB Aurora

È 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
7RTN
1, 2, 6, 8non usato
Ethernet pins
MAX485Inverter
GNDRTN
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:

0123456789
AddressCommandB2B3B4B5B6B7CRC_LCRC_H

Anche la struttura della risposta ha una lunghezza fissa (6 Byte + 2 Byte per Checksum):

01234567
Transmission StateGlobal StateB2B3B4B5CRC_LCRC_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Ω.

MAX485 Arduino connection schema

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

0123456789
AddressCommandB2B3B4B5B6B7CRC_LCRC_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

  1. Centralina Web per inverter ABB (ex Power One) Aurora (WIM): intro al progetto
  2. Centralina Web per inverter ABB Aurora (WIM): connessione Arduino all’RS-485
  3. Centralina Web per inverter ABB Aurora (WIM): dispositivi di archiviazione
  4. Centralina Web per inverter ABB Aurora (WIM): debug e notifica
  5. Centralina Web per inverter ABB Aurora (WIM): impostare l’ora e UPS
  6. Centralina Web per inverter ABB Aurora (WIM): configurazione WIFI e server REST
  7. Centralina Web per inverter ABB Aurora (WIM): WebSocket e Web Server
  8. Centralina Web per inverter ABB Aurora (WIM): cablaggio e PCB
  9. Centralina Web per inverter ABB Aurora (WIM): caricare il programma ed il front end
  10. Centralina Web per inverter ABB Aurora (WIM): scatola stampata in 3D e completamento
  11. Centralina Web per inverter ABB Aurora (WIM): riparare l’errore E013

GitHub repository con tutto il codice FE (transpilato) e BE


Spread the love

2 Risposte

  1. massimo ha detto:

    Ciao Renzo,
    ho un inverter ABB ed il modulo nativo VSN300 – da qualche tempo l’nverter NON manda più i dati al logger. Il logger si raggiunge ma non legge i dati dell’inverter. Ho scollegato la scheda dall’inverter e rifatto partire tutto ma nulla…. Come se ci fosse un problema di comunicazione tra il’inverter stesso del il VSN300… Hai qualche idea sul come poter procedere? non vorrei farmi un cablaggio “ad hoc” per l’RS e collegarci un arduino….

    • Renzo Mischianti ha detto:

      Ciao Massimo,
      purtroppo non ti so dire, non dispongo di quel modulo, ma non mi stupirebbe qualche problema di falsi contatti, ti direi di provare ad estrarre il modulo e reinserirlo per vedere se si tratta solo di qualche problema ai contatti (tipo spegni e riaccendi :P).
      Ciao Renzo

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *