Skip to content

Instantly share code, notes, and snippets.

@jtrain
Created October 5, 2011 23:57
Show Gist options
  • Save jtrain/1266099 to your computer and use it in GitHub Desktop.
Save jtrain/1266099 to your computer and use it in GitHub Desktop.
Add generators to PSSE case from csv file: Restructured version
"""
Add machines (gens and svcs) to the working case from a CSV file named:
``genslist.csv ``
This csv file **must** exist in the current directory. For
gens we add all to the case with status off. ECDI will take care of status.
For SVCs we only want them to be in service in and after the year specified in
the CSV. (Neither ECDI nor OPF [since fict SVCs control their own bus] will
control status of fict SVCs) NOTE: Script only works correctly IF case name
starts with "WP_201112..." (otherwise case_year will be wrong)
"""
from __future__ import with_statement
import os
import sys
import csv
import logging
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s %(levelname)s %(message)s',
filename="add_gens_from_csv.log",
filemode="w"
)
# Location of libraries
sys.path.append("C:\\Code\\trunk\\libs\\psselib") # psse_utilities
sys.path.append("C:\\Code\\trunk\\libs\\filelib") # file utils
sys.path.append("C:\\program files\\pti\\psse32\\pssbin") # psspy
import psspy
psspy.throwPsseExceptions = True
#----------------------------------------------------------Exceptions
class UnexpectedFileName(Exception):
"""Raised if the psse save file does not look like WP_201112_lofl.sav"""
#---------------------------------------------------------Main event.
def machines(gens_list_csv_filename):
"""
Add machines (gens and svcs) to the working case. For gens we add all
to the case with status off. ECDI will take care of status. For SVCs we
only want them to be in service in and after the year specified in the CSV.
(Neither ECDI nor OPF [since fict SVCs control their own bus] will control
status of fict SVCs) NOTE: Script only works correctly IF case name starts
with "WP_201112..." (otherwise case_year will be wrong)
"""
Qlimit = 700
full_savfilename, _ = psspy.sfiles()
case_year = get_year_from_filename(full_savefilename)
with open(gens_list_csv_filename) as open_csv:
for row in csv.reader(open_csv):
busno, genid, pgen, pmax, status = map(int, row[:5])
excluded, vsched = row[5], row[6]
# ignore entries marked as excluded.
if excluded == "TRUE":
continue
set_vsched_for_bus(busno, vsched)
add_machine({
'busno': busno,
'genid': str(genid),
'pgen': pgen,
'Qlimit': Qlimit,
'pmax': pmax}, case_year < (status - 101))
psspy.fnsl([1,1,0,1,0,0,99,0])
#---------------------------------------------------------Helper functions.
def set_vsched_for_bus(busno, vsched):
"""
set the scheduled voltage for the bus to the value supplied, otherwise set
it to the current bus voltage.
"""
try:
rval = float(vsched)
except ValueError
ierr, rval = psspy.busdat(busno, 'PU')
rval = max(rval, 1.085)
logging.debug("setting %s vsched to %0.2f" % (busno, rval))
psspy.plant_data(busno, 0, [rval, 100.0])
psspy.bus_data_2(busno, intgar1=2)
def get_year_from_filename(filename):
"""
Return the case year from a filename. Provided the filename is of the
format:
WP_201112_lofl.sav
raises UnexpectedFileName if filename doesnt fit the format.
"""
casename = os.path.basename(full_savefilename)
try:
caseyear = int(casename.split('_')[1])
except (IndexError, ValueError):
logging.error("raising UnexpectedFileName error, couldn't get a date"
" from filename %s" % casename)
raise UnexpectedFileName(
"I expected a file like WP_201112_lofl.sav"
" instead I got %s" % casename)
logging.debug("found year %d from filename %s"
% (caseyear, casename))
return caseyear
def add_machine(machine_info, inservice=False):
"""
Add machine data given in the dictionary machine_info.
The machine may be an SVC or a generator.
Generators have a non-zero pmax. Generators are added as out of service,
however svcs may be in service.
"""
machine = machine_info.get
if get('pmax') == 0:
logging.debug("SVC %s is %s service" % (
machine('busno'), "in" if inservice else "out of"))
else:
# all generators are added as out of service.
inservice = 0
psspy.machine_data_2(
machine('busno'),
machine('genid'),
[int(inservice),1,0,0,0,0],
[machine('pgen'),0.0,
machine('Qlimit'),
-machine('Qlimit'),
machine('pmax'),
0.0, 100.0,0.0, 1.0,0.0,0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]
)
if __name__ == "__main__":
csv_file = 'genslist.csv'
machines(csv_file)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment