Python for Power Systems

A blog for power systems engineers to learn Python.

Creating and Using Bus Subsystems

PSSE has two methods for retrieving information.
  1. A single element at a time; and
  2. A group of elements at once.
We believe that for most situations, gathering information about a group of elements at once is the right thing to do. However, collecting that information in PSSE is laborious, so we wrote a subsystem_info function and a blog post to make collecting information from a subsystem simpler.

Now we will take you though how to create a subsystem: a numbered collection of buses, zones or areas from which you can collect information using the subsystem_info function.

Subsystems are a group of buses and can be assigned an id from 0 to 11. Eleven is the highest available subsystem id because PSSE only allows you to have a maximum of 12 subsystems.

Subsystems from areas

Here is the hypothetical situation: Your PSSE saved case has already been set up with 3 areas (0, 1 and 2). We will create a new subsystem with id 0 that contains all the buses in those three areas.

psspy.bsys(sid=0, numarea=3, areas=[0, 1, 2])

You must remember to tell PSSE how many areas are in the list using the numarea = 3 keyword. The requirement to state the number of elements in the areas list is puzzling, because it can cause mistakes in your code if you forget to
change the numarea when you add extra areas.

# an error waiting to happen..
psspy.bsys(sid=0, numarea=3, areas=[0, 1, 2, 3])

Here is another example where we automatically calculate the number of areas:

areas = [0, 1, 2]
psspy.bsys(sid=0, numarea=len(areas), areas=areas)

Subsystems from a list of buses

Now we have a list of bus numbers and want to create another subsystem with id 1:

buses = [201, 202, 304, 305, 400]
psspy.bsys(sid=1, numbus=len(buses), busnum=buses)

Rather than being hard coded like this example, the buses variable could be read from a CSV file or a settings file.

Using the subsystem_info function

Finally, we will create a new subsystem and grab some information about buses in that subsystem using the subsystem_info function.

# first create the subsystem.
buses = [201, 202, 300, 304, 600]
psspy.bsys(sid=1, numbus=len(buses), busnum=buses)

# then collect bus number, name and voltage from the subsystem.
strings = ["NUMBER", "NAME", "KV"]
names_and_voltages = subsystem_info('bus', strings=strings, sid=1)

Ideas for further development

We have shown how to create a subsystem using the PSSE subsystem definition API, but the development shouldn’t stop there. In a future post we will propose an alternative subsystem API that will use named subsystems instead of numbered subsystem ids.