Solis S6 PV Inverter and RS485/MODBUS

Seems a bit odd as the RS-485 spec for terminator resistance is 120 to 150 Ohms
at both ends of the cable run.

The article says the terminators may be omitted for cable runs of less than 50 metres.

Ref:

Good writeup. My initial thoughts are around the dead time behaviour. The CA-IF4805 in your S6 has separate RE and DE pins (no doubt tied together) however some RS485 adaptors use bus drivers with built-in auto data direction logic e.g. MAX13487. Might there be a subtle timing difference if the enable logic is different due to the built-in state machine and you’re using one of these? I don’t know what driver chips you’ve tried but when piggy-backed, the dongle imposes it’s own authority on the bus.

Yes. I just got an S6 yesterday which is why I was trawling around for modbus info. Today I dug out a usb->serial adaptor and connected it to a MAX13487 board. This worked straight off the bat:

I think you might have a duff inverter because when I measure the open circuit voltages I get A+ wrt 0v = 3.3v and B- wrt 0v = 1.6V whereas you got 0.12V on B-

Incidentally, the RS485 pcb has 4k7 pull up/down and 100R series lke your Solis dongle but no terminating resistor by default. It has a link for 120R but I didn’t make it yet.

Thanks Adrian and All.
I spent most of the day looking into this - experimenting with various terminating and bias resistor values, made up a 3v3 FTDI / 485 interface and concluded its hopeless! - I can get replies if adjust bias resistor values / ratio but it seems critical and inverter response is intermittent. I am concluding there is something wrong with the input on this inverter, it seems that a slight shift in common mode voltage and the inverter may start or stop responding and the signal appears to get loaded. I will see Solis support ever come back with any ideas!. Thanks all.

My guess would be a solder bridge between B- and some other signal trace or component. No experience of the build quality from this manufacturer but it wouldn’t surprise me. Hope you get a satisfactory outcome.

PROBLEM SOLVED !!

OK All, I fear I may be winning Idiot of the week.

So, I had a working Arduino data acquisition system that has worked reliably for years talking to a Solis 4G mini and OB115 Power meter. I hung my new S6 on the wall, moved over the comms plug …Nothing! no response and many days wasted.

I had noticed the comms plug was a very tight fit into the new Solis S6 compared to the Solis 4G and it stopped 2.5-3mm from being fully in. I had looked at distance of male / female terminals from the faces and concluded ‘they must be easily mating’…wrong.

Adrians feedback reinforced my view something was seriously wrong so late last night I carefully opened the S6 up. The Comms connector wiring routes to the Display PCB, I continuity tested my cable / connector wires all the way to the PCB, Youv’e guessed it, B was not connected!!!
The connection break was occurring across (i.e inside) the socket-to plug interface despite the plug being pushed fully home as far, and as hard as physically possible, but, yes a small gap was visible near the o-ring. I still have trouble believing it was not making contact, but it most definitely wasn’t, the contact pin must have been sitting partly inside the receptacle without touching!

I drew thick pencil lines around the plug, inserted it, and could then see where it was ‘dragging’ and an interference fit. Irregular surfaces were visible on BOTH the plug and Socket (shrinkage / split lines?). These were easily scrapped away using a sharp scalpel, it now plugs in really easily!!! and this morning comms instantly worked.

At the start of this thread Adam mentioned ‘the A/B pins are about +/-1.6V with respect to the GND pin’. Possibly he meant when connected to the USB-485 adapter & scope. I would say before connecting any external devices, confirm the voltage on comms connector ‘A’ wrt 0V is approx 3.3V and ‘B’ is around 1.6V (my B measured around 0V).

This morning it instantly worked and connected to my Arduino device *(FYI This reads the Solis to conveniently / simply see what is being generated, plus it reads import/export power from an OB115 power meter. It transmits (via 433Mhz HC-12) the current import / export power value all around the home (5 times a sec or so?) to various sockets which then can either burst fire a Triac to proportionally ‘burn’ any export excess as heat in say our mini oven, kettle, electric radiator, immersion etc) or simply switch the socket On/Off (i.e for say a charger) depending on the level of export).

FOOTNOTE (Just to confirm Idiot of the week status and as a warning to others). This S6 was purchased from ebay identified as “Solis inverter S6 3.6kw dual MPPT” , brand new, boxed at a bargain price £300. I wanted it to support an East / West array setup.

So just look at the photos, i was really confused, x4 MC4 connectors on the base all simply paralleled at the DC isolator switch and then just two DC wires running to the PCB, this does not have two independent MPPT circuits !.

Look carefully at the Solis data sheet part numbers say S6-GR1P3.6K (which supports dual MPPT inputs) Or (mine) S6-GR1P3.6K-M (-M has one MPPT circuit but x2 PV inputs which must be connected to two PV strings of the same specs and orientation- it simply parallels them. This wasn’t clear to me and I never thought to check the part number.

Solis are nice inverters, internals look very well made, unfortunately I now need to get a Dual MPPT version !!!

Also:- the attached pictures show all USB-485 adapters used (ALL of these work fine:- the Blue one uses a fake Prolific PL2303 USB-UART and the driver install was a nightmare. The black one is CH340 based. The FTDI based ‘bare pcb’ one was looked at on a scope, the FTDI I.Cs and drivers accurately control the RS485 Tx and Rx switching so personally I favour these for speed etc maybe the CH340 one does too). There is also a pdf showing the Solis comms connector wiring which may be of use to someone.

Adam - If you still get problems drop me a message

Crap, What a week, i am off to the pub.

Solis RS485 Comms Connector Wiring.pdf (226.4 KB)



Glad to hear you found the problem. I’m currently coding a bridge to MQTT on an ESP32 for a generation data readout but I was initially challenged to find a plug that would fit (the German ebay listing that had theses has ended) although I felt sure I already had something like it somewhere… then I remembered, it was a vintage Garmin serial lead. The only problem being a pin pitch of 5.08mm not 5mm as on the Solis. I got it to fit by slightly enlarging the holes without disturbing the contacts.

beer_cheer thumbsup

Thanks for all the updates.
I’m sure there are plenty of highly qualified and very experienced engineers who’ve been bamboozled by a dodgey connection.

It is certainly VERY GOOD to have reports that this can work (there are so many sources of uncertainty otherwise), and I heartily approve of putting this stuff “on record”.

I’ll have a poke at my connector. It could well be the culprit, as I recall it being quite stiff. I also saw a lot of noise on the oscilloscope trace (I put this down to inverters being bad for EMI, but maybe a poor contact is really the fault).

Cheers, Adam

1 Like

Another good rule is to be ready to believe that something that can’t possibly be the problem really is the problem (which is much the same thing).

Bear with on this one. I had the same problem and didn’y have anything similar do ordered a quantity of Excedconn ones from China. I will list the ones I don’t need on eBay.

Glad you solved your problem. A two questions if you don’t mind?
I think I bought the same S6 from eBay as you did. I got it to install with my single string panels whilst waiting for GivEnergy G2 kit to be delivered. I haven’t got a Solis CT, it’s just running free out-of-the-box. For my own info I have an Arduino-MQTT CT monitoring the output.

  1. I have an OB115 Power Meter ready to install with my GE kit. Have you interfaced yours to your S6, or did I misunderstand? If so how?
  2. I’m planning on building an Arduino-MQTT Solis interface just a soon as the Exceedconn plug arrives form China(!). As plagiary is the greatest form of invention - Did you share the code for your Arduino project anywhere?

Hi,

If you bought your S6 from the same seller I really hope you didn’t require the dual MPPT version!

Ah No… I have an Arduino acting as Modbus master reading both the Solis (on Address 01) and the OB115 on address 02. The Solis has no method to access values from the OB115. The Arduino board receives the Modbus, then transmits values via 433mHz in Nextion display format. Data can go straight into a remote Nextion display and also to ‘smart’ sockets which intelligently switch connected loads on /off or proportionally ‘burn’ whatever excess (export) power is available. The socket in photo adjusts power delivered to a small oven such that on a cloudy day etc we can avoid any grid import.

I have some projects on Arduino Project hub (for PV Hotwater) but not this Modbus / Smart socket yet, maybe that will be a winter project if there is any interest.

I’ve attached a zip of the code for the master end (the PCB shown in the earlier post above connected to a 20x4 LCD).

Modbus_OB115_SolisMiniG4_RS485-In_Nextion-Out_V2.zip (6.5 KB)

@PVHotwater Thank you. I got my S6 on eBay from a guy called rodut60. I only needed a single string. I am actually very pleased with it.


Your system looks really interesting. I’m a Home Assistant user, mainly because I have half a dozen different pieces of kit and other people have written the interfaces for them. Also I don’t have the skills to do anything too complicated. But if I have something similar to work from I can get there so thanks for your code.
I’ll probably stick with my existing Nano33 + CT measuring the S6 output Power and use another Nano33 + RS485 to work the modbus based on what I can learn from your project. If I find out that the S6 can’t give meaningful data without a meter input, I’ll have to see if that is a writeable data and if so I may try to get the OB115 part implemented.
Cheers

Hi…

Thanks to this post I’ve made some progress…not with a direct RS485 connection to the inverter, but via a TCP-based MODBUS connection using the Solarman integration in home assistant. It is a bit of a pain to get the wifi stick configured on the inverter but if you manage to fluke it then you can get access. What I was completely stuck on where the MODBUS addresses to get to registers I need to read…thanks to the posts here and some of the links provided I’ve been able to scrape together quite a bit of data. However, none of the addresses that actually work are the same as those posted in the Solis documentation…can anyone point me to a MODBUS map for a S6 inverter? I’m thinking there must be one somewhere…it’s hard to guess your way to the right registers…

Thanks!

Try asking the Solis support people (there is a UK email address). I got a document without problem.

There are a couple of reasons why addresses can be troublesome (you may already know these):

  1. a convention to add a leading digit e.g. 33072 vs 3072. I’ve seen this done inconsistently within 1 document. The address to send to query an input register would be 3072.
  2. the presence of an “offset” applied to the address sent to determine the actual register to read. For example, on my Solis S6, the active power is documented as being in the register pair 3005-6, but there is an offset of 1, so the address to send is 3004.

FWIW, here is a snippet from a short Python program I used when experimenting:

print("Active power = {}W".format(solis.read_long(3004, INPUT_REGISTERS)))
print("Total DC output power = {}W".format(solis.read_long(3006, INPUT_REGISTERS)))
print("Total energy = {}kWh".format(solis.read_long(3008, INPUT_REGISTERS)))
print("Total energy (this month) = {}kWh".format(solis.read_long(3010, INPUT_REGISTERS)))
print("Total energy (today)= {}kWh".format(solis.read_register(3014, 1, INPUT_REGISTERS)))  # unit = 0.1kWh
print("Inverter temp = {}C".format(solis.read_register(3041, 1, INPUT_REGISTERS)))  # unit = 0.1C
print("Grid freq = {}Hz".format(solis.read_register(3042, 2, INPUT_REGISTERS)))  # unit = 0.01Hz

And the log of the actual byte sequences sent and received:

Will write to instrument (expecting 9 bytes back): 01 04 0B BC 00 02 B2 0B (8 bytes)
Response from instrument: 01 04 04 00 00 00 32 7A 51 (9 bytes)
Active power = 50W

Will write to instrument (expecting 9 bytes back): 01 04 0B BE 00 02 13 CB (8 bytes)
Response from instrument: 01 04 04 00 00 00 77 BB A2 (9 bytes)
Total DC output power = 119W

Will write to instrument (expecting 9 bytes back): 01 04 0B C0 00 02 73 D3 (8 bytes)
Response from instrument: 01 04 04 00 00 04 1C F8 8D (9 bytes)
Total energy = 1052kWh

Will write to instrument (expecting 9 bytes back): 01 04 0B C2 00 02 D2 13 (8 bytes)
Response from instrument: 01 04 04 00 00 00 64 FA 6F (9 bytes)
Total energy (this month) = 100kWh

Will write to instrument (expecting 7 bytes back): 01 04 0B C6 00 01 D3 D3 (8 bytes)
Response from instrument: 01 04 02 00 2C B8 ED (7 bytes)
Total energy (today)= 4.4kWh

Will write to instrument (expecting 7 bytes back): 01 04 0B E1 00 01 63 D8 (8 bytes)
Response from instrument: 01 04 02 00 C2 38 A1 (7 bytes)
Inverter temp = 19.4C

Will write to instrument (expecting 7 bytes back): 01 04 0B E2 00 01 93 D8 (8 bytes)
Response from instrument: 01 04 02 13 8A 35 A7 (7 bytes)
Grid freq = 50.02Hz

Will write to instrument (expecting 7 bytes back): 01 04 0B E3 00 01 C2 18 (8 bytes)
Response from instrument: 01 04 02 00 03 F9 31 (7 bytes)
Status flags = 0x3

I hope that helps!

Cheers, Adam

Edit- Formatted text. Moderator

I’ve managed to make some progress…ditching the leading ‘3’ helped, as did figuring out that you needed to use an address lower than the target to start the read. I’m a little limited in that I have to fit into the Solarman integration, but so far I’m pulling the following:

DC Current x2
DC Voltage x2
DC Power
Working Mode
Inverter Status
AC Voltage
AC Frequency
AC Active Power
Inverter Temperature
Generation Stats (today, Month, year, total)

For the working more and status I’ve found some syntax for converter the data to a text-based status and that is working well. However I’m still stuck on these:

Apparent Power (crazy high numbers)
Reactive Power (crazy high numbers)
AC Current (always seems to be ~3x higher than expected based on Active Power / Volts)
Operating Status (need to figure out how to decode bits as each bit is an on/off for a specific state).

So progress…but still some way to go.

FWIW, here is the doc I got from Solis. Status codes are in appendix 2
RS485_MODBUS Grid Tied Inverter - from Solis.pdf (469.0 KB)

I didn’t look at things like reactive power, suspecting that interpretation requires rather more understanding of what the inverter is doing than the doc tells.

Cheers, Adam

The offset might just be the difference between the register number and the register address. The numbers will start at 1, but the addresses will start at 0. Quite common on MODBUS systems.

That number/address offset thing took me a few minutes to work out but I suppose it’s exactly the same as the first bit of data in an array being at address zero.
I got my Solis S6 interface up and running if any of this helps here:

1 Like