ABB Aurora Web Inverter Monitor (WIM): wiring Arduino to RS-485 – 2

Spread the love

I created a library that implement the full communication protocolo of ABB (ex PowerOne now Fimer) Aurora Inverter and It need to connect the inverter via RS485.

You can find the library here “ABB Aurora PV inverter library for 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

First you must find RS485 interface of your inverter, in mine I must remove frontal panel

ABB Aurora electrical panel RS485 connection

Than check the RS485 interface position and get positive and negative connector.

ABB Aurora panel connector RS485
Ref. inverterRef. manualDescription
WIND13Connection of the Tachometer signal (WIND)
ALARM13Connection to the multi-function relay (ALARM)
REM13Connection to the remote ON/OFF (REM)
RS48513Connection of the RS485 (PC) line (RS485)
J24 – RS485 (A)14Connection of the RS485 (PC) line on RJ45 connector
J25 – RS485 (B)14Connection of the RS485 (PC) line on RJ45 connector
S215RS485 line (PC) termination resistance selector switch

So connect to +T and -T and extract the wire and we are going to check RS-485 interface of your inverter

Connect RS485 cable to ABB Aurora

You can connect the conductors using the terminal connectors 13 (+T/R, -T/R, LNK and RTN) the LNK also.

You must also put to on il Line terminal switch.

If you want use ethernet connector you must follow this schema.

Pin No.Function
3+T/R
4+R
5-T/R
7RTN
1, 2, 6, 8not used
Ethernet pins
MAX485Inverter
GNDRTN
A+T
B-T

ABB Aurora protocol (refer library for more detail)

Here the base information of RS485 ABB Aurora communication Protocol.

The communication between Host and processor works via a Serial Interface RS485 or RS232.
Configuration parameters in both cases are:

  • 19200 baud (default value)
  • 1 stop bit
  • no parity

The communication protocol uses fixed length transmission messages (8Bytes + 2Bytes for Checksum) structured as follows:

0123456789
AddressCommandB2B3B4B5B6B7CRC_LCRC_H

The structure of the answer has also fixed length (6 Bytes + 2 Bytes for Checksum) :

01234567
Transmission StateGlobal StateB2B3B4B5CRC_LCRC_H

Transmission State:

Coded as follows:

0 = Everything is OK.
51 = Command is not implemented
52 = Variable does not exist
53 = Variable value is out of range
54 = EEprom not accessible
55 = Not Toggled Service Mode
56 = Can not send the command to internal micro
57 = Command not Executed
58 = The variable is not available, retry

Global State:

It shows the state of the addressed device, the details are specified in the description of the commands.

Arduino UNO and MAX485

For this preliminary test connection test I use an Arduino UNO and a MAX485 IC, if you prefer can buy a module.

You can find IC on AliExpress

You can find module on AliExpressAliExpress

You can find WeMos D1 mini on WeMos D1 mini - NodeMCU V2 V2.1 V3 - esp01 - esp01 programmer

Here the simple connection schema, the resistor must be 120Ω, i use 150Ω.

MAX485 Arduino connection schema

If you want try directly with esp8266 in the article dedicated to the RS-485 communication you can find more information, but when arrive the moment I explain good esp8266 connection also.

I create a library derived from a project that you can find in the web created by drhack, It’s a fantastic works (thanks to drhack) but I find It quite difficult to use, with specific hardware and not so reusable.

So I try to standardize the library and made It simple (the people that use my library know that “simplify first” It’s my motto.

Library

You can find my library explained here “ABB Aurora PV inverter library for Arduino, esp8266 and esp32“.

Packet

As you can see in the packet description

0123456789
AddressCommandB2B3B4B5B6B7CRC_LCRC_H

you must specify an address, that address normally is 2, but you must check It in your inverter menu.

You can create a chain of inverters that communicate via RS485. An address can be chosen from 2 to 63. The address on the inverter is set through the display and the pushbutton panel.

To change address go to SETTINGS --> Insert password (default 0000) --> Address.

This menu allows you to set the serial port addresses of the individual inverters connected to the RS485 line.
The addresses that can be assigned are 2 to 63. The UP and DOWN buttons scroll through the numerical scale. ‘AUTO’ selection cannot be used at present.

For “production” module I’m going to use HardwareSerial to optimize the communication and reduce overhead.

/*
 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);

}

Thanks

  1. ABB Aurora Web Inverter Monitor (WIM): project introduction
  2. ABB Aurora Web Inverter Monitor (WIM): wiring Arduino to RS-485
  3. ABB Aurora Web Inverter Monitor (WIM): storage devices
  4. ABB Aurora Web Inverter Monitor (WIM): debug and notification
  5. ABB Aurora Web Inverter Monitor (WIM): set time and UPS
  6. ABB Aurora Web Inverter Monitor (WIM): WIFI configuration and REST Server
  7. ABB Aurora Web Inverter Monitor (WIM): WebSocket and Web Server
  8. ABB Aurora Web Inverter Monitor (WIM): Wiring and PCB soldering
  9. ABB Aurora Web Inverter Monitor (WIM): upload the sketch and front end
  10. ABB Aurora web inverter Monitor (WIM): 3D printed case to complete project
  11. ABB Aurora web inverter monitor (WIM): repair E013 error

GitHub repository with all code BE and FE transpiled


Spread the love

6 Responses

  1. Valdas Mirklys says:

    Hello. Maybe you can add sketch for WeMos D1 mini.

  2. milan taticek says:

    I am trying to connect to the Aurora unit as described here but with no success. There is no data comming from RS485. Is there anything else that needs to be set up for arduino to work? I also tried the USB connection but Aurora communicator can read any data (I see data being send over htem but it is all zeroes at 19200). Any ideas how to solve it?

  3. Jason says:

    My ABB PowerOne has an RJ11 connector for the RS485, do you know the pinout for the RJ11. Also does it matter if the RJ11 is plugged into the in or out socket.

Leave a Reply

Your email address will not be published. Required fields are marked *