diy solar

diy solar

wondering why I kept tripping the breaker between the panels and the charge controller.

SunbeltLocked

If I'm not under arrest, I should be free to go?
Joined
Mar 21, 2022
Messages
29
Location
Wyoming
My system is:
(12) 340W panels in 3 strings
Midnite Classic Lite 150 cc
Outback VFX3648 Inverter
(4) Signature Solar Lifepower4 48v 5kw batteries

I've had this system working since May and it has just started getting really cold here in WY. The day before yesterday, it was mostly cloudy so yesterday when the sun came out, it really started charging. I was watching the local app (this is the windows app that shows the stats from the Midnite Classic) and it lost the connection (tcp/ip). I went out to look at it and the breaker between the cc and the inverter was tripped. I reset it and went back inside to watch the local app. I noticed that just before it tripped again, the state went from bulk mppt to absorb and the voltage went from the usual 54v to around 58. I ended up resetting it about 4 times thinking that maybe the cold temps were causing the voltage from the panels to be too high. About the 5th trip out to the garage, I noticed some discoloration on the wire coming out of the breaker and realized the breaker was bad. It was puffed up slightly at the bottom. Luckily, I had a replacement. It's only rated for 150vdc and 62A. A couple days ago, after 3 days of mostly cloudy skies, when the sun finally came out, I saw the amps on the local app get up to over 80A. I'm definitely going to have to get a bigger breaker. Its a wonder it lasted this long.
 

Attachments

  • amps3a.jpg
    amps3a.jpg
    59.5 KB · Views: 19
Your PV amps were over 80amps? If so, what are the panel amps at max power (sticker values on the back of the panels)?
 
I have Midnite Classic 150s. They can throttle input and output amps on the Config -> Advanced screen.
1669828485882.png

You might want to set you're input amps down to what you're breaker (wiring) can handle.

Limiting amps is not as bad as it might seem at first. It does not harm the Classic at all. And the loss of PV power depends on how often/how long you're system can produce more than you're maximum.
 
Last edited:
80 amps is on the battery side of the charge controller not the panel side.
Recheck all your connections on the panel side of that charge controller.
 
80 amps is on the battery side of the charge controller not the panel side.
Recheck all your connections on the panel side of that charge controller.
Good point (I lost focus) and thanks for pointing it out.

The Classic also supports limiting input amps as shown in the pic above. Same logic applies. Corrected post above :)
 
Last edited:
Another thought that comes to mind ....... if there is a less than optimal connection .... the cold temps and warming and cooling is going to make it worse.
 
What kind of breakers? Proper bluesea bussmann or so, or the cheap no branded black or transparant ones with red levers?

The last are crap, heat, voltage drop and random tripping is common with those.
 
I have Midnite Classic 150s. They can throttle input and output amps on the Config -> Advanced screen.
View attachment 122354

You might want to set you're input amps down to what you're breaker (wiring) can handle.

Limiting amps is not as bad as it might seem at first. It does not harm the Classic at all. And the loss of PV power depends on how often/how long you're system can produce more than you're maximum.
I have a bunch of midnight classic controllers and inverters, where can I get that software?
 
I have a bunch of midnight classic controllers and inverters, where can I get that software?
It's a weird install, you have to install "AdobeAIRInstaller.exe" first or as part it. Since it's an actual internet connection to the Classics - you can access them remotely from anywhere with internet connectivity to them.

Also - don't know if you're custom software oriented but you can retrieve and set the registers. Here's a copy of the register map docs - http://bob.midniteftp.com/classic_register_map_Rev-B3-May-28-2013.pdf

Here's the key PHP I wrote to read info every few secs for my dashboard - it's doable to write some code if you're so inclined....
1669939700831.png

include_once("modbus/ModbusMaster.php");
include_once("modbus/ModbusMasterTcp.php");
include_once("modbus/ModbusMasterUdp.php");

// Classic Simple registers
define ("PV_ARRAY_VOLTAGE_DIV_BY_10","4116");
define ("PV_ARRAY_OPEN_CURCUIT_VOLTAGE_DIV_BY_10","4122");
define ("PV_ARRAY_CURRENT_DIV_BY_10","4121");
define ("BAT_VOLTAGE_DIV_BY_10","4115");
define ("BAT_CURRENT_DIV_BY_10","4117");
define ("BAT_WATTS","4119");
define ("DAILY_KWH_DIV_BY_10","4118");
define ("DAILY_AH","4125");
define ("BAT_TEMP_DIV_BY_10","4132");
define ("FET_TEMP_DIV_BY_10","4133");
define ("PCB_TEMP_DIV_BY_10","4134");
define ("MINS_NO_POWER","4135");
define ("FLOAT_TIME_SECS","4138");
define ("ABSORB_TIME_SECS","4139");
define ("AUX1_VOLT_ON_DIV_BY_10","4172");
define ("AUX1_VOLT_OFF_DIV_BY_10","4166");
define ("ABSORB_SET_VOLT_DIV_BY_10","4149");
define ("FLOAT_SET_VOLT_DIV_BY_10","4150");

// Classic Register - 2 byte, each with value
define ("CHARGE_STATE","4120");
// Classic Register -> binary string -> 2nd or 3rd bit
define ("AUX1_ON","4130");
define ("AUX1_DIVERSION_ON_OFF_AUTO","4165");
// Classic Whizbang Jr
define ("WBJR_AH_NET","4110");
define ("WBJR_RAW_CURRENT","4362");
define ("WBJR_AMPS","4371");


function get_midnite_values($ip,&$retMsg,$debug=false) {
$ret = array();

$ret['SnapshotId'] = 0; // for MSSQL Classic table insert

if($ip == MIDNIT1_IP) $ret['ClassicName'] = MIDNIT1_NAME;
if($ip == MIDNIT2_IP) $ret['ClassicName'] = MIDNIT2_NAME;
if($ip == MIDNIT3_IP) $ret['ClassicName'] = MIDNIT3_NAME;
$ret['ClassicIP'] = $ip;

$ret['ChargeState'] = get_midnite_register($ip,CHARGE_STATE,2,$retMsg);
$ret['PVArrayVoltage'] = get_midnite_register($ip,PV_ARRAY_VOLTAGE_DIV_BY_10,1,$retMsg);
$ret['PVArrayCurrent'] = get_midnite_register($ip,PV_ARRAY_CURRENT_DIV_BY_10,1,$retMsg);
$ret['BatteryVoltage'] = get_midnite_register($ip,BAT_VOLTAGE_DIV_BY_10,1,$retMsg);
$ret['BatteryCurrent'] = get_midnite_register($ip,BAT_CURRENT_DIV_BY_10,1,$retMsg);
$ret['BatteryWatts'] = get_midnite_register($ip,BAT_WATTS,0 ,$retMsg);
$ret['DailyKwh'] = get_midnite_register($ip,DAILY_KWH_DIV_BY_10,1,$retMsg);
$ret['DailyAh'] = get_midnite_register($ip,DAILY_AH,0,$retMsg);
$ret['BatteryTempC'] = get_midnite_register($ip,BAT_TEMP_DIV_BY_10,1,$retMsg);
$ret['FETTempC'] = get_midnite_register($ip,FET_TEMP_DIV_BY_10,1,$retMsg);
$ret['PCBTempC'] = get_midnite_register($ip,PCB_TEMP_DIV_BY_10,1,$retMsg);
$ret['MinsNoPower'] = get_midnite_register($ip,MINS_NO_POWER,0,$retMsg);
$ret['FloatTime'] = get_midnite_register($ip,MINS_NO_POWER,0,$retMsg);
$ret['AbsorbTime'] = get_midnite_register($ip,MINS_NO_POWER,0,$retMsg);
$ret['Aux1On'] = get_midnite_register($ip,AUX1_ON,3,$retMsg);
$ret['Aux1VoltOn'] = get_midnite_register($ip,AUX1_VOLT_ON_DIV_BY_10,1,$retMsg);
$ret['Aux1VoltOff'] = get_midnite_register($ip,AUX1_VOLT_OFF_DIV_BY_10,1,$retMsg);
$ret['AbsorbSetVolt'] = get_midnite_register($ip,ABSORB_SET_VOLT_DIV_BY_10,1,$retMsg);
$ret['FloatSetVolt'] = get_midnite_register($ip,FLOAT_SET_VOLT_DIV_BY_10,1,$retMsg);
$ret['Aux1DivOnOffAuto'] = get_midnite_register($ip,AUX1_DIVERSION_ON_OFF_AUTO,4,$retMsg);
$ret['WzbjNetAh'] = get_midnite_register($ip,WBJR_AH_NET,5,$retMsg);
$ret['WzbjAmps'] = get_midnite_register($ip,WBJR_AMPS,6,$retMsg);
return($ret);
}


// Return the register's value. On error, return -1 and $retMsg != "Success";
// $mode = 0 - return simple value
// $mode = 1 - return simple value / 10
// $mode = 2 - return custom charge state string from 2 byte
// $mode = 3 - return custom binary bit for Aux1 ON/OFF
function get_midnite_register($ip,$regNum,$mode,&$retMsg) {
$retMsg = "Success";
try {

$modbus = new ModbusMaster($ip, "TCP");
$recData = $modbus->readMultipleRegisters(0, ($regNum - 1), 1); // $regNum + 1, so we minus a 1
// simple value
if($mode == 0) {
$ret = ($recData[0] <<8) + $recData[1];
return($ret);
// simple value / 10
} else if ($mode == 1) {
$ret = ($recData[0] <<8) + $recData[1];
$ret = substr($ret,0,strlen($ret)-1).".".substr($ret,strlen($ret)-1,1); // insert a decimal point '.' 1 digit from the right
// "6505.1" occurs when sensor is not hooked up to classic - e.g. Midnite2 as an example.
if(($regNum == BAT_TEMP_DIV_BY_10) && ($ret == "6505.1")) { $ret = 0; }
// charge state
} else if ($mode == 2) {
if( $recData[0] == 0) { $ret1 = "(Low Power)"; }
else if($recData[0] == 3) { $ret1 = "ABSORB"; }
else if($recData[0] == 4) { $ret1 = "BULK"; }
else if($recData[0] == 5) { $ret1 = "FLOAT"; }
else if($recData[0] == 6) { $ret1 = "FLOATMPPT"; }
else if($recData[0] == 7) { $ret1 = "EQUALIZE"; }
else if($recData[0] == 10) { $ret1 = "(HyperVoc)"; }
else if($recData[0] == 18) { $ret1 = "(EqMppt)"; }
else { $ret2 = "(Unknown)"; $retMsg = "Unknown charge state high byte=".$recData[0]; return(-1); }

if( $recData[1] == 0) { $ret2 = "Resting"; }
else if($recData[1] == 1) { $ret2 = "Waking"; }
else if($recData[1] == 2) { $ret2 = "Waking"; }
else if($recData[1] == 3) { $ret2 = "MPPT"; }
else if($recData[1] == 4) { $ret2 = "MPPT"; }
else if($recData[1] == 6) { $ret2 = "MPPT"; }
else { $ret = "Unknown"; $retMsg = "Unknown charge state low byte=".$recData[1]; return(-1); }

return($ret1." ".$ret2);
} else if ($mode == 3) {
// Aux1 ON = 0x00004000 = 0100 0000 0000 0000
$ret = 0; // off
$bh = str_pad(decbin($recData[0]), 8, 0, STR_PAD_LEFT);
$bl = str_pad(decbin($recData[1]), 8, 0, STR_PAD_LEFT);
$hilow=$bh.$bl;
if($hilow[1] == 1) $ret = 1;
return($ret);

} else if ($mode == 4) {
// AUX 1 Off – Auto – On (Extracted/Encoded as Aux12Function bits 6,7)
// Aux1 Off = 0 // Aux 1 output is forced OFF (0 Volts)
// Aux1 Auto = 1 // Aux 1 operates automatically as defined in Aux1Funtion
// Aux1 On = 2 // Aux 1 output is forced ON (~14 Volts)
// Example in this function (Off): 0100000000000001
// (Auto): 0100000001000001
// (On): 0100000010000001
// ----------------
// Bit #: 76543210
// Str Index: 0123456789

$ret = "Error"; // off
$bh = str_pad(decbin($recData[0]), 8, 0, STR_PAD_LEFT);
$bl = str_pad(decbin($recData[1]), 8, 0, STR_PAD_LEFT);
$hilow=$bh.$bl;
if(($hilow[8] == 0) && ($hilow[9] == 0)) { return("off"); }
if(($hilow[8] == 0) && ($hilow[9] == 1)) { return("auto"); }
if(($hilow[8] == 1) && ($hilow[9] == 0)) { return("on"); }
$retMst = "Unknown status at bits 6,7 from the right in binary string: $hilow";
return("Error");
} else if ($mode == 5) { // WbJrAmpHourNET (([4370] << 16) + [4369]) Amp Hours NET (signed) Whizbang Jr. Net amp hours.
$anum = ($recData[0] <<8) + $recData[1];
$anum = $anum << 16;

$recDataPrevReg = $modbus->readMultipleRegisters(0, (4109 - 1), 1); // read the previous reg number
$ret = $anum + (($recDataPrevReg[0] <<8) + $recDataPrevReg[1]);

return($ret);
} else if ($mode == 6) {
// Left hand 8 bits
$bh = str_pad(decbin($recData[0]), 8, 0, STR_PAD_LEFT);
// Right hand 8 bits
$bl = str_pad(decbin($recData[1]), 8, 0, STR_PAD_LEFT);

// Create a number from the 2 bytes
$anum = ($recData[0] <<8) + $recData[1];

// Convert the number from unsigned to signed
if($bh[0] == 1) {
$anum = - (0x010000 - $anum);
}

// Divide by 10
$ret = $anum / 10;
return($ret);

} else {
$retMsg = "mode=$mode is not recognized - cannot proceed to process register recData[0]=".$recData[0].", recData[1]=".$recData[1]." information.";
return(-1);
}
return($ret);

}
catch (Exception $e) {
$retMsg = $e;
return(-1);
}
}
 
Last edited:
Now... I just need someone to teach me what all that is...

Some PHP code you can run locally to make a IP connection to the controller and read/display the modbus registers holding these values.

So you can make your own webpage / gui / display and display all on a laptop, phone, (old) tablet or similar so you have a nice looking total overview screen.
DIY software ;)
 
I have Midnite Classic 150s. They can throttle input and output amps on the Config -> Advanced screen.
View attachment 122354

You might want to set you're input amps down to what you're breaker (wiring) can handle.

Limiting amps is not as bad as it might seem at first. It does not harm the Classic at all. And the loss of PV power depends on how often/how long you're system can produce more than you're maximum.
That's good to know. I was using the mppt mode solar on/off in config basic to turn if off to give the breaker a rest.
 
Thanks for all the help. I have a 100A breaker ordered and should be here Monday. It is a din-rail mount.
 
Here's a video from the other day. I have seen it get as high as 88A.
 
Before I give my comment I want to congratulate you on maxing out the Classic - e.g. 4,500+ watts coming in. I have 15 x 285w arrays for each of my classics which max at 4,275. Fun to see the 4,500w!

OK, on to business....
Here's a video from the other day. I have seen it get as high as 88A.
Just for the record - the 88a you reference is 'output' (charge to the battery). You can limit either (or both) input and output. I have my output limited to 80a because that's the breaker size because of the wire size (4AWG) going to the battery. The wire run is about 15ft in conduit and get's warm (55C/130F) under higher charging currents.

4awg is the largest size wire the Midnite will accept at the terminal block. You want to be careful putting a 100a breaker on (4awg?) wire that might only be good for 80a. Just make sure you're wire doesn't get too hot to damage itself if you allow the full 86a that a Classic 150 can output. :)
 
Last edited:
Back
Top