144 lines
3.8 KiB
Python
144 lines
3.8 KiB
Python
'''
|
|
JMK Engineering Inc. Python Library for design and such.
|
|
by: Jeff MacKinnon
|
|
|
|
email: jeff@jmkengineering.com
|
|
|
|
Circuit Design Functions
|
|
|
|
'''
|
|
import pandas as pd
|
|
import numpy as np
|
|
import math
|
|
import sqlite3
|
|
|
|
|
|
def vd(current,length,resistance):
|
|
|
|
vd=2*current*length*resistance/1000
|
|
return vd
|
|
|
|
def percentvd(vd,nominal):
|
|
|
|
percent = (vd/nominal)*100
|
|
return percent
|
|
|
|
|
|
def voltage_drop(nominal_voltage, current, conductor_size, material ='cu', code = 'CEC'):
|
|
|
|
'''
|
|
This function will return the drop in voltage and in percent of the supply.
|
|
|
|
nominal_voltage = int
|
|
current = float
|
|
conductor_size = string
|
|
|
|
Voltage drop equation is:
|
|
|
|
Vdrop = 2 * I * L * R/1000
|
|
|
|
I = load current
|
|
L = circuit length in meters
|
|
R = Resistance in ohms/km
|
|
|
|
'''
|
|
|
|
# Check to see if the db we need exists
|
|
|
|
import os
|
|
import sys
|
|
if os.path.isfile('cable.db') == False:
|
|
return (print("Run init. \nCopy jeplinit.py to the same folder as this file and add \n%run jeplinit.py jepl/folder/location/\nto the notebook. Make sure there is a trailing slash."))
|
|
|
|
if (material == 'al'):
|
|
|
|
try:
|
|
with sqlite3.connect("cable.db") as con:
|
|
cur = con.cursor()
|
|
cur.execute('SELECT "AC Resistance" FROM "SW-Spec 25055" WHERE "Conductor Size"=?', (conductor_size,))
|
|
resistance = cur.fetchone()[0]
|
|
|
|
except sqlite3.OperationalError as e:
|
|
print(e)
|
|
|
|
voltage = vd(nominal_voltage,current,resistance)
|
|
percent = percentvd(voltage,nominal_voltage)
|
|
|
|
return [voltage, percent]
|
|
|
|
|
|
|
|
|
|
'''
|
|
'''
|
|
# These functions need to be re-written with the databases.
|
|
|
|
'''
|
|
'''
|
|
def conductor_size(current, temp = 75, material = 'cu', code = 'CEC', raceway = True, ambient = 30, max = 500):
|
|
|
|
'''
|
|
The default temp column will be the 75C column as most terminals are rated for this.
|
|
The default code is CEC as that is where I am.
|
|
|
|
I still need to incorporate ambient temperature deratings, but that will be a future improvement
|
|
|
|
'''
|
|
|
|
material = material.upper()
|
|
code = code.upper()
|
|
max = str(max)
|
|
valid_temp = [60,75,90]
|
|
valid_temp_str = [str(x) for x in valid_temp]
|
|
valid_code = ['CEC',
|
|
]
|
|
valid_material = ['CU',
|
|
'AL',
|
|
]
|
|
|
|
#check to make sure that the values are valid
|
|
if temp not in valid_temp:
|
|
return print(temp + " is not valid. The valid temps are "+ str(valid_temp_str))
|
|
if code not in valid_code:
|
|
return print(code + " is not a valid code. The valid codes are "+ str(valid_code))
|
|
if material not in valid_material:
|
|
return print(material + " is not a valid material. I should be 'al' or 'cu'.")
|
|
|
|
# select the correct code table
|
|
if (code == 'CEC') & (material == 'CU') & (raceway == False):
|
|
code_table = CEC_table1
|
|
elif (code == 'CEC') & (material == 'CU') & (raceway == True):
|
|
code_table = CEC_table2
|
|
elif (code =='CEC') & (material =='AL') & (raceway == False):
|
|
code_table = CEC_table3
|
|
elif (code =='CEC') & (material =='AL') & (raceway == True):
|
|
code_table = CEC_table4
|
|
elif (code =='NEC') & (material =='CU'):
|
|
return (' I haven\'t created this table yet')
|
|
elif (code =='NEC') & (material =='AL'):
|
|
return (' I haven\'t created this table yet')
|
|
else:
|
|
return ('The variables were\'t right, but I\'m a loss to why.')
|
|
|
|
temp = str(temp)
|
|
|
|
max_current_loc = code_table.loc[code_table['size'] == max][str(temp)]
|
|
max_current = max_current_loc.iloc[0]
|
|
|
|
num_parallel = math.ceil(current / max_current)
|
|
con_current = current / num_parallel
|
|
|
|
size = code_table[code_table[temp].ge(con_current)]['size'].iloc[0]
|
|
|
|
return [size,num_parallel]
|
|
'''
|
|
'''
|
|
# ^
|
|
# These functions need to be re-written with the databases.
|
|
|
|
'''
|
|
'''
|
|
|
|
|
|
|
|
|