Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Problem Installing EPEVER Controller / PC Tools Software
#1
Help!!

I'm attempting to install the EPEVER PC Tools softwre for my Tracer MPPT solar charge controller.  I've downloaded everything.  Installed the drivers.  I click onthe PC Tools installer, it opens and then halts.  I get this setup error message "Not enough storage is available to process this command."

I'm running windows 7 / 64 on an hp with an intel core i5, 16 G of ram and a 500 G Hard Drive which is FAR from full.  How much "storage" does this software need?  Is there a way I can get this software up and running?  Is there an older Windows version of the software that doesn't require so much "storage."  Am I better off just buying an inexpensive Android device and running the software off of that platform?

I need to set up the controller to charge LiFe 40 A/h batteries.

Thanks

Peter Gambee
Reply
#2
if you have small coding /PC abilities i can post a very alpha gui to read live data.

nothing that you can use to program It at the Moment.

only to check if atleast It talk to your pc
Building Lifepo4 Powerwall - atm 3400 cells growing
Reply
#3
(07-29-2019, 04:28 AM)emuland-metroman Wrote: if you have small coding /PC abilities i can post a very alpha gui to read live data.

nothing that you can use to program It at the Moment.

only to check if atleast It talk to your pc

Ok.  I will give it a try.  In the meantime, can I get this charge controller to work with LiFe / Lithium batteries?  If so, how?  I bought it because it was MPPT and could charge Lithium battery systems.

Please send me your gui and I will work with it.  Thank you!
Reply
#4
when you open gui window, you have to set port and ID

ID usually is 1 if you havent changed it.

for COM port you have to check with your pc

Code:
import tkinter as tk
import datetime
import time
import csv
from pathlib import Path
import pymodbus
import serial
import time
from threading import Timer

from pymodbus.client.sync import ModbusSerialClient as ModbusClient



window = tk.Tk()
window.geometry ("1024x768")
window.title("EPSOLAR INTERFACE")
#window.resizable(False,False)
global pvVolts,pvAmps,powerlow,e4,batterlow,loadcurrent,loadwatts,batterytemp,regulatortemp,othertemp,PVmax,PVmin,batterySOC,powerToday,powerMonth,powerYear,powerTot,ports
global client2






#with open('employee_birthday.txt') as csv_file:
#   csv_reader = csv.reader(csv_file, delimiter=',')
 #  line_count = 0
  # for row in csv_reader:
#   if line_count == 0:
    #       print(f'Column names are {", ".join(row)}')
#            line_count += 1
#       else:
 #          print(f'\t{row[0]} works in the {row[1]} department, and was born in {row[2]}.')
  #         line_count += 1
  # print(f'Processed {line_count} lines.')

percorso=Path('./start.txt')

ports="COM4"

 



def readModbus():
   global client2
   global unitID
   unitID=regulatorID.get()
   unitID=int(unitID)
   lblIDSELECT.config(text=unitID)
 # read 6 registers starting at 0x3000
   result = client2.read_input_registers(0x3100, 1, unit=unitID)
   pvVolt = float(result.registers[0] / 100.0)
   pvVolts.config(text=pvVolt)
   
   #pvVolts.update()
   result = client2.read_input_registers(0x3101, 1, unit=unitID)
   pvAmp = float(result.registers[0] / 100.0)
   pvAmps.config (text=pvAmp)
   result = client2.read_input_registers(0x3102, 1, unit=unitID)
   power=float(result.registers[0] / 100.0)
   powerlow.config (text=power)
   result = client2.read_input_registers(0x3106, 1, unit=unitID)
   battery= float(result.registers[0] / 100.0)
   batterylow.config (text=battery)
   result = client2.read_input_registers(0x331A, 1, unit=unitID)
   loadC = float(result.registers[0] / 100.0)
   loadcurrent.config(text=loadC)
   result = client2.read_input_registers(0x310E, 1, unit=unitID)
   loadW = float(result.registers[0] / 100.0)
   loadwatts.config(text=loadW)
   result = client2.read_input_registers(0x3110, 1, unit=unitID)
   batteryT = float(result.registers[0] / 100.0)
   batterytemp.config(text=batteryT)
   result = client2.read_input_registers(0x3111, 1, unit=unitID)
   regulatorT = float(result.registers[0] / 100.0)
   regulatortemp.config(text=regulatorT)
   result = client2.read_input_registers(0x311B, 1, unit=unitID)
   otherT = float(result.registers[0] / 100.0)
   othertemp.config(text=otherT)
   result = client2.read_input_registers(0x3200, 1, unit=unitID)
   btryStatus = float(result.registers[0] / 100.0)
   result = client2.read_input_registers(0x3201, 1, unit=unitID)
   regulatorstatus = float(result.registers[0] / 100.0)
   result = client2.read_input_registers(0x3300, 1, unit=unitID)
   PVMax = float(result.registers[0] / 100.0)
   PVmax.config(text=PVMax)
   result = client2.read_input_registers(0x3301, 1, unit=unitID)
   PVMin = float(result.registers[0] / 100.0)
   PVmin.config(text=PVMin)
   # read the battery SOC
   result = client2.read_input_registers(0x311A, 1, unit=unitID)
   batterysoc = result.registers[0]
   batterySOC.config(text=batterysoc)

   result = client2.read_input_registers(0x330C, 1, unit=unitID)
   PwrToday = float(result.registers[0] / 100.0)
   powerToday.config(text=PwrToday)
   result = client2.read_input_registers(0x330E, 1, unit=unitID)
   PwrMonth = float(result.registers[0] / 100.0)
   powerMonth.config(text=PwrMonth)
   result = client2.read_input_registers(0x3310, 1, unit=unitID)
   PwrYear = float(result.registers[0] / 100.0)
   powerYear.config(text= PwrYear)
   result = client2.read_input_registers(0x3312, 1, unit=unitID)
   PwrTotal = float(result.registers[0] / 100.0)
   powerTot.config(text=PwrTotal)
   

def tick():
   
   readModbus()
   window.after(1000,tick)
   
def btn1click():
   global client2,ports
   ports=comport.get()
   lblCOMPORTSELECT.config(text=ports)
   
   client2 = ModbusClient(method = 'rtu', port = ports, baudrate = 115200)
   client2.connect()  
   tick()

     #window.withdraw()  
def btn13click():
   pvVolts.delete(0, tk.END)
   loadwatts.delete(0, tk.END)
   batterytemp.delete(0, tk.END)
   pvAmps.delete(0, tk.END)
   powerlow.delete(0, tk.END)
   loadcurrent.delete(0, tk.END)
     
   # PV STATISTICS
lbl1= tk.Label (text="PV VOLT",font = "Helvetica 9 bold")
lbl1.grid(column=0,row=1 , sticky="WE")
pvVolts = tk.Label(window, bd =2)
pvVolts.grid(column=1,row=1 , sticky="WE")
lbl2= tk.Label (text="PV AMPS",font = "Helvetica 9 bold")
lbl2.grid(column=0,row=2 , sticky="WE")
pvAmps = tk.Label(window, bd =2)
pvAmps.grid(column=1,row=2 , sticky="WE")
lbl3= tk.Label (text="PV WATTS",font = "Helvetica 9 bold")
lbl3.grid(column=0,row=3 , sticky="WE")
powerlow = tk.Label(window, bd =2, text="                         ")
powerlow.grid(column=1,row=3 , sticky="WE")

lbl4= tk.Label (text="REGULATOR TEMP",font = "Helvetica 9 bold")
lbl4.grid(column=0,row=4 , sticky="WE")
regulatortemp = tk.Label(window, bd =2)
regulatortemp.grid(column=1,row=4 , sticky="WE")
lbl5= tk.Label (text="ROOM TEMP",font = "Helvetica 9 bold")
lbl5.grid(column=0,row=5 , sticky="WE")
othertemp = tk.Label(window, bd =2)
othertemp.grid(column=1,row=5 , sticky="WE")

lblx= tk.Label (text="",font = "Helvetica 9 bold")
lblx.grid(column=0,row=6 , sticky="WE")
#System STATS
lbl6= tk.Label (text="PV MAX VOLTS",font = "Helvetica 9 bold")
lbl6.grid(column=0,row=7 , sticky="WE")
PVmax= tk.Label(window, bd =2)
PVmax.grid(column=1,row=7 , sticky="WE")
lbl7= tk.Label (text="PV MIN VOLTS",font = "Helvetica 9 bold")
lbl7.grid(column=0,row=8 , sticky="WE")
PVmin = tk.Label(window, bd =2)
PVmin.grid(column=1,row=8 , sticky="WE")
lbl8= tk.Label (text="POW TODAY",font = "Helvetica 9 bold")
lbl8.grid(column=0,row=9 , sticky="WE")
powerToday = tk.Label(window, bd =2)
powerToday.grid(column=1,row=9 , sticky="WE")

lbl9= tk.Label (text="POW MONTH",font = "Helvetica 9 bold")
lbl9.grid(column=3,row=7 , sticky="WE")
powerMonth = tk.Label(window, bd =2)
powerMonth.grid(column=4,row=7 , sticky="WE")
lbl9= tk.Label (text="POW YEAR",font = "Helvetica 9 bold")
lbl9.grid(column=3,row=8 , sticky="WE")
powerYear = tk.Label(window, bd =2)
powerYear.grid(column=4,row=8 , sticky="WE")
lbl9= tk.Label (text="POW TOTAL",font = "Helvetica 9 bold")
lbl9.grid(column=3,row=9 , sticky="WE")
powerTot = tk.Label(window, bd =2)
powerTot.grid(column=4,row=9 , sticky="WE")

#BATTERY STATISTICS

lbl11= tk.Label (text="BATTERY WATTS",font = "Helvetica 9 bold")
lbl11.grid(column=3,row=1 , sticky="WE")
batterylow = tk.Label(window, bd =2)
batterylow.grid(column=4,row=1 , sticky="WE")
lbl12= tk.Label (text="BATTERY VOLTAGE",font = "Helvetica 9 bold")
lbl12.grid(column=3,row=2 , sticky="WE")
loadcurrent = tk.Label(window, bd =2,text="")
loadcurrent.grid(column=4,row=2 , sticky="WE")
#lbllogo= tk.Label (text="insertlogo",font = "Helvetica 9 bold")
#lbllogo.grid(column=0,row=1 , sticky="WE")


lbl13= tk.Label (text="LOAD WATTS",font = "Helvetica 9 bold")
lbl13.grid(column=3,row=3 , sticky="WE")
loadwatts = tk.Label(window, bd =2,text="")
loadwatts.grid(column=4,row=3 , sticky="WE")
lbl14= tk.Label (text="BATTERY TEMP" ,font = "Helvetica 9 bold")
lbl14.grid(column=3,row=4 , sticky="WE")
batterytemp = tk.Label(window, bd =2,text="")
batterytemp.grid(column=4,row=4 , sticky="WE")
lbl15= tk.Label (text="BATTERY SOC %" ,font = "Helvetica 9 bold")
lbl15.grid(column=3,row=5 , sticky="WE")
batterySOC = tk.Label(window, bd =2,text="          ")
batterySOC.grid(column=4,row=5 , sticky="WE")

# buttons
btn1 = tk.Button(window,height=2, width=7, text="START",padx=2 ,pady=2,command=btn1click )
btn1.grid(column=7, row=4)
lblcom= tk.Label (text="INSERT COM PORT" ,font = "Helvetica 9 bold")
lblcom.grid(column=5,row=4 , sticky="WE")
lblID= tk.Label (text="INSERT REGULATOR ID" ,font = "Helvetica 9 bold")
lblID.grid(column=5,row=5 , sticky="WE")
comport= tk.Entry(window, bd =2)
comport.grid(column=6,row=4 , sticky="WE")
regulatorID= tk.Entry(window, bd =2)
regulatorID.grid(column=6,row=5 , sticky="WE")
lblCOMPORTSELECT= tk.Label (text="PORT" ,font = "Helvetica 9 bold")
lblCOMPORTSELECT.grid(column=5,row=6 , sticky="WE")
lblIDSELECT= tk.Label (text="ID" ,font = "Helvetica 9 bold")
lblIDSELECT.grid(column=6,row=7 , sticky="WE")

def select(value,e):
    if value == "BACK":
        #allText = entry.get()[:-1]
        #entry.delete(0, tkinter,END)
        #entry.insert(0,allText)

        e.delete(len(e.get())-1,tk.END)
        
    elif value == "SPACE":
        e.insert(tk.END, ' ')
    elif value == "SHIFT":
        e.insert(tk.END, '    ')
    else :
        e.insert(tk.END,value)



buttons = [
'1', '2', '3', '4', '5', '6', '7', '8', '9','0','',
'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P','BACK',
'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L','-','',
'Z', 'X', 'C', 'V', 'B', 'N', 'M', '', '','_','SPACE',
]

def HosoPop(e):

    varRow = 2
    varColumn = 6

    for button in buttons:

        command = lambda x=button: select(x,e)
        
        if button == "SPACE" or button == "SHIFT" or button == "BACK":
            tk.Button(window,text= button,height=2,width=6, bg="#3c4987", fg="#ffffff",
                activebackground = "#ffffff", activeforeground="#3c4987", relief='raised', padx=1,
                pady=1, bd=1,command=command).grid(row=varRow,column=varColumn)

        else:
            tk.Button(window,text= button,height=2,width=4,bg="#3c4987", fg="#ffffff",
                activebackground = "#ffffff", activeforeground="#3c4987", relief='raised', padx=1,
                pady=1, bd=1,command=command).grid(row=varRow,column=varColumn)


        varColumn +=1

        if varColumn > 16 and varRow == 2:
            varColumn = 6
            varRow+=1
        if varColumn > 16 and varRow == 3:
            varColumn = 6
            varRow+=1
        if varColumn > 16 and varRow == 4:
            varColumn = 6
            varRow+=1
#d = OSKeyboard(window, 'On Screen Keyboard', 800, 100)
#pvVolts.bind("<Button-1>", lambda e: HosoPop(pvVolts))
#pvAmps.bind("<Button-1>", lambda e: HosoPop(pvAmps))
#powerlow.bind("<Button-1>", lambda e: HosoPop(powerlow))
#loadcurrent.bind("<Button-1>", lambda e: HosoPop(loadcurrent))
#loadwatts.bind("<Button-1>", lambda e: HosoPop(loadwatts))
#batterytemp.bind("<Button-1>", lambda e: HosoPop(batterytemp))
#if __name== "__main__":





   
window.mainloop()
Building Lifepo4 Powerwall - atm 3400 cells growing
Reply
#5
Where's the download? I went on their site but the link in the manual wasn't right.
Reply
#6
Quote: In the meantime, can I get this charge controller to work with LiFe / Lithium batteries?

Mppt charge controller (even if it claims to be lithium capable) will only work will with lithium if the battery is in perfect balance, I had to use active balancers on my 4s40p 220ah lifepo4. One thing I found out with my charge controller is I had to set the bulk setting way above the recommended setting. If its too low, the battery will charge very slowly. But if its set too high the bms will trip too early if the battery is out of balance. 

You never want the bms to stop the charging, this will cause voltage surges which will destroy anything connected to the battery. Even after I added the active balancers every once in a while the bms would trip to stop charging, I had to get a 12 volt voltage stabilizer to protect my devices.

I finally figure how to get lithium to work with any charge controller, I got a better bms. I upgraded to the chargery bms8t, now I don't have to worry about voltage surges. I recommend you get a chargery bms, it will work with any charge controller pwm/mppt. Its in the 100 dollar range but its the best investment you can make for your lithium. With the chargery bms, you don't have to worry too much about all the settings on the controller just set the bulk setting. The bms monitors battery overall voltage/ cell voltage and if it goes out of balance or reaches your cutoff voltage it disconnects the panel (using a mechanical relay). It even has temp sensors and a loud audio alarm, you can check battery voltage on the lcd screen.  

If a charge controller can't monitor the lithium individual cell voltage, its no better then a dumb charger. The only charge controller I know that monitors cell balancing is the electrodacus. 

Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)