''' 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. ''' '''