First time here? We are a friendly community of Power Systems Engineers. Check out the FAQ!

Ask Your Question
0

What is the API for generating the .qv files?

asked Aug 18 '12

JervisW gravatar image

updated Aug 18 '12

I've written my own QV curve generator (see here) but I'm curious, how would I create one of those .qv files.

A .qv file is the binary results file that PSSE saves the QV analysis results to.

(edit) I'm looking for the exact psspy commands that I should be using to

  1. load in a case
  2. run a QV curve analysis on a single bus and store the results in a binary .qv file
  3. (option) Bonus marks awarded if you can show how to get the results out of the .qv file into a Python array like this:

Example qv results array

# (Q,  V)
[(0.4,  0.99),
 (0.39, 0.98),
 (...)]

2 answers

Sort by » oldest newest most voted
1

answered Aug 18 '12

amaity gravatar image

updated Aug 18 '12

I think I have the hang of the thing now:

import os,sys
import operator

PSSE_LOCATION = r"C:\Program Files\PTI\PSSE32\PSSBIN"
sys.path.append(PSSE_LOCATION)
os.environ['PATH'] = os.environ['PATH'] + ';' +  PSSE_LOCATION 

import psspy
import redirect
redirect.psse2py()
psspy.throwPsseExceptions = True

#--------------------------------
# PSS/E Saved case
casename = "MY_SYSTEM.sav"
CASE = os.path.join(os.path.abspath(dir[0]), casename)
psspy.psseinit(12000)
psspy.case(CASE)

busid = 44121
subfile = r"qvcase.sub"
f = open(subfile, "w+")
f.write("subsystem ABC\njoin group\nzone 44\nkvrange 100.0 300.\nend\nend\nend\n")
f.close()

monfile = r"qvcase.mon"
f = open(monfile, "w+")
f.write("monitor voltage range subsystem ABC 0.9\nend\n")
f.close()

confile = r"qvcase.con"
f = open(confile, "w+")
f.write("single line from bus %s\nend\nend\n" % busid)
f.close()

dfxfile = r"qvcase.dfx"
options = []
options.append(1) # 1-calculate distribution factors
options.append(1) # 1-sort monitored elements 
ierr = psspy.dfax(options, subfile, monfile, confile, dfxfile)

options = []
values  = []
options.append(0) # 0-disable tap adjustment
options.append(0) # 0-disable using tie line flows
options.append(0) # 0-disable phase shift adjustment
options.append(0) # 0-disable dc tap adjustment
options.append(0) # 0-disable switched shunt adjustment
options.append(1) # 1-enable non-divergent solution
options.append(0) # 0-FDNS
options.append(1) # 1-initially ignore: var limit code for the VHI power flow sol
options.append(0) # 
options.append(busid) # study bus number (no default allowed)
values.append(0.1) # Newton solution convergence tolerance, TOLN
values.append(1.1) # the initial (max) pu voltage setpoint at the study bus (VHI)
values.append(0.9) # the minimum pu voltage setpoint at the study bus (VLO)
values.append(0.01) # the pu voltage setpoint decrement (positive) 
ierr = psspy.qv_engine(options, values, dfxfile, accfile=r"test.qv")
link

Comments

Perfect! It seems "accept answer" is broken on the site. Will fix that and then check this as a "thanks answered the question"

JervisW gravatar imageJervisW (Aug 18 '12)
1

answered Aug 20 '12

waltterval gravatar image

Hi, This is a script that I use to do that task

You can use it with more than one case and get the curve for varius nodes

I get the .qv file, QV curves in .pdf file and the Mvar reserve in .csv files.


I didn't have time to translate the comments

# created by: Waltter Valdez
#Este script es para sacar las curvas QV de las contingencias

import sys, os
sys.path.insert(0, r"C:\Program Files\PTI\PSSE33\PSSBIN")
# xx --> substitute xx with Version Number here.
os.environ['PATH'] = r"C:\Program Files\PTI\PSSE33\PSSBIN" + ";" + os.environ['PATH']
import redirect
redirect.psse2py()
# this redirects PSS(R)E progress, report output to Python Shell/Console

import psspy
_i = psspy.getdefaultint()
_f = psspy.getdefaultreal()
_s = psspy.getdefaultchar()
import pssarrays
import matplotlib.pyplot as plt
import csv

psspy.psseinit(50000)

Ruta = os.getcwd()
casos = ('ERT-MaxAbr12-UT_ST', 'ERT-MedAbr12-UT_ST', '')
"""No se debe quitar las comillas simples del final, estas permiten usar el
python incluso con un solo escenario """

archSub = Ruta + '\\' + 'subsistemas_QV.sub'
archMon = Ruta + '\\' + 'monitoreo_QV.mon'
archCon = Ruta + '\\' + 'contingencias_QV.con'

nodos = (28161, 28181, 27421, 27461)
"""# En nodos se debe introducir los numeros de los buses en los cuales
se desea obtener las curvas QV"""

psspy.progress_output(2, 'reportePro', [2, 0])
# Crea casos y QV por gobernador
for casoN in casos:
    if casoN != '':
        carpeta = Ruta + '\\' + casoN
        if not os.path.isdir(carpeta):
            os.makedirs(carpeta)
        caso = Ruta + '\\' + casoN + '.sav'
        Difaxx = carpeta + '\\' + 'Difaxx-' + casoN + '.dfx'
        progreso = carpeta + '\\' + 'Progreso_' + casoN + '.txt'
        psspy.progress_output(2, progreso, [2, 0])
        psspy.case(caso)
        psspy.branch_data(27371, 27372, r"""1""",
             [_i, _i, _i, _i, _i, _i], [0.1E-05, _f, _f, _f, _f, _f, _f, _f,
                 _f, _f, _f, _f, _f, _f, _f])
        """Do it if you have Zero branch..."""
        psspy.fnsl([1, 0, 0, 1, 1, 0, 0, 0])
        psspy.dfax([1, 1], archSub, archMon, archCon, Difaxx)
        for nodo in nodos:
            nodo1 = str(nodo)
            archivoqv = carpeta + '\\' + 'QV_' + nodo1
            ierr2 = psspy.qv_engine([0, 0, 0, 0, 0, 0, 1, 0, 0, nodo],
            [0.5, 1.2, 0.5, 0.01], Difaxx, "", archivoqv)
            if ierr2 != 0:
                continue
            # Change these values as required.
            qvfile = 'QV_' + nodo1 + ".qv"
            qvfile1 = carpeta + '\\''QV_' + nodo1 + ".qv"
            contingencias = pssarrays.qv_summary(qvfile1).colabel
            reserva = ["Reserva (Mvars)"]
            contingencia = ["Contingencias"]
            plt.cla()
            ierr, cval = psspy.notona(nodo)
            for colabel in contingencias:
                rlst = pssarrays.qv_solution(qvfile1, colabel)
                v = rlst.vsetpoint
                q = rlst.mgenmvar
                contingencia.append(colabel)
                reserva.append(min(rlst.mgenmvar)[0])
                plt.plot(v, q)

            reporteReserva = carpeta + '\\' + 'Reporte_Reserva_' + qvfile + '.csv'
            csv_out = open(reporteReserva, 'wb')
            mywriter = csv.writer(csv_out)
            rows = zip(contingencia, reserva)
            mywriter.writerows(rows)
            csv_out.close()

            plt.legend(contingencias, loc='upper right')
            plt.title(qvfile[0:-3] + "_" + cval[0:-7])
            plt.ylabel('MVAr')
            plt.xlabel('Voltaje(p.u.)')
            plt.grid(True)
            plt.savefig(carpeta + '\\' + qvfile[0:-3] + '.pdf', format=None, orientation='portrait')
link

Comments

@waltterval thanks for sharing the script. After I few scans I find that I can't understand some of the stuff in your script, for example, why are you adding a zero impedance branch?

amaity gravatar imageamaity (Aug 21 '12)

@amaity I'm not adding a zero impedance branch (ZIB), what I did is change parameters in ZIB to be treated as a normal branch, This is becuase the API dosn't permit get QV curve if the bus is joined with a ZIB

waltterval gravatar imagewaltterval (Aug 21 '12)

@waltterval is that in the documentation?

amaity gravatar imageamaity (Aug 21 '12)

@amaity Not, I was trying to do a QV curve in node with ZIB and got an error, then asked to PSSE and told me that.

waltterval gravatar imagewaltterval (Aug 21 '12)

Aha! @waltterval that's a big help. By the way, I posted a question in the bus reactor section a few minutes back. Any ideas?

amaity gravatar imageamaity (Aug 21 '12)

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.
Want to format code in your answer? Here is a one minute demo on Youtube

Add Answer

[hide preview]

Question Tools

Stats

Asked: Aug 18 '12

Seen: 2,641 times

Last updated: Aug 20 '12