Skip to content

Instantly share code, notes, and snippets.

@jmmauricio
Created June 13, 2015 18:41
Show Gist options
  • Select an option

  • Save jmmauricio/1198491fa8223572881a to your computer and use it in GitHub Desktop.

Select an option

Save jmmauricio/1198491fa8223572881a to your computer and use it in GitHub Desktop.
PowerFactory DigSILENT Python Script to load flow, set variables to save, set event, initialize, run and save results to a txt file
import sys
sys.path.append(r"C:\DigSILENT15p1p7\python")
# import PowerFactory module
import powerfactory
# start PowerFactory in engine mode
app = powerfactory.GetApplication()
user = app.GetCurrentUser()
# activate project
project = app.ActivateProject("Nine Bus System")
prj = app.GetActiveProject()
ldf = app.GetFromStudyCase("ComLdf")
ini = app.GetFromStudyCase('ComInc')
sim = app.GetFromStudyCase('ComSim')
Shc_folder = app.GetFromStudyCase('IntEvt');
terminals = app.GetCalcRelevantObjects("*.ElmTerm")
lines = app.GetCalcRelevantObjects("*.ElmTerm")
syms = app.GetCalcRelevantObjects("*.ElmSym")
Shc_folder.CreateObject('EvtSwitch', 'evento de generacion');
EventSet = Shc_folder.GetContents();
evt = EventSet[0];
evt.time =1.0
evt.p_target = syms[1]
ldf.iopt_net = 0
ldf.Execute()
elmres = app.GetFromStudyCase('Results.ElmRes')
for terminal in terminals:
elmres.AddVars(terminal,'m:u','m:phiu','m:fehz')
for sym in syms:
elmres.AddVars(sym,'s:xspeed')
ini.Execute()
sim.Execute()
evt.Delete()
comres = app.GetFromStudyCase('ComRes');
comres.iopt_csel = 0
comres.iopt_tsel = 0
comres.iopt_locn = 2
comres.ciopt_head = 1
comres.pResult=elmres
comres.f_name = r'C:\Users\jmmauricio\hola.txt'
comres.iopt_exp=4
comres.Execute()
@Sarah3802

Copy link
Copy Markdown

Hi Everyone I have a alot of loads with (parameter characteristic - vector (loads with time series every 15 min. for a time period one year )) in Excel file (.xlsx) and i need to import them using python script. can anbody help me out ???

Hi @Sarah3802 , I had created script, but to create Time Characteristics. I will try to convert it, but i don't know it will work or not

First you should get the characteristics folder and scale folder fold_char = app.GetProjectFolder('chars') fold_scale = app.GetDataFolder('IntScales')

and then you should create the time scale first by using this code : time_scale = fold_scale.CreateObject('TriTime', 'time_scale_15_minute_year') time_scale.unit = 3 #(It means hour per year) time_scale.scale = [i/4 for i in range(0,24*365*4)]

and then for each loads 👍 for load in loads: load_scale = fold_char.CreateObject('ChaVec', '{} MW'.format(load.GetAttribute('loc_name'))) load_scale.scale = time_scale #to refer the time scale that we created before load_scale.vector = #YOUR LOAD CURVE (one dimension array) load_link = load.CreateObject('ChaRef','plini') # plini refer to Active Power Load Parameter, you can change it as appropriate load_link.typ_id = load_scale

I hope this help

Thank You so much Sir, its really helpfull, but i'm wondering how can i read data from excel file (.xlsx)?

@SjorsHijgenaar

SjorsHijgenaar commented Jan 23, 2023

Copy link
Copy Markdown

Thank You so much Sir, its really helpfull, but i'm wondering how can i read data from excel file (.xlsx)?

Is it possible to save it as .csv instead?

@rizky-r-lab

Copy link
Copy Markdown

As @SjorsHijgenaar , you can use CSV file or if you want easier, you can use pandas module

@Sarah3802

Copy link
Copy Markdown

I've already converted it, but it looks messy

@Sarah3802

Copy link
Copy Markdown

i would like to read data from excel using the module “pandas”, i found that i can use

import pandas as pd
pandas.read_excel('File_name','sheet name')

The data will then be returned into a DataFrame. The DataFrame has the advantage of providing easy access to columns and rows. But, i'm not able to map the header in the Excel file with a load object in PowerFactory, can someone help me here ?

@rizky-r-lab

Copy link
Copy Markdown

the easiest one will be the column header has the same name with load name in PowerFactory. And then you can map it like this:
loads_data = app.GetRelevantObjects('*.ElmLod')
for load in loads_data:
try:
load_curve = df[load.GetAttribute('loc_name']
except:
print(f'load curve for {load.GetAttribute('loc_name']} not found') #catching error because load name is not in data

@midhunagarapati

Copy link
Copy Markdown

Is there a way to extract multiple parameters of all synchronous machines at a time and write to a csv file?

@rizky-r-lab

Copy link
Copy Markdown

@midhunagarapati , what parameter do you want to extract? If it's just static parameter like inertia, time constant or etc, the easiest one is directly use GUI of powerfactory through Network Model Manager. Chose Generator, and then go through flexible tab.
You can define the parameter in there.

@midhunagarapati

Copy link
Copy Markdown

@rizky-r-lab I want to extract simulation RMS parameters like transient reactances and change them according to the size of the machine

@Lorias-Jak

Copy link
Copy Markdown

i searched for a long time now to find all attributes a element can have. Is there a list i didnt know about?

the easiest one will be the column header has the same name with load name in PowerFactory. And then you can map it like this: loads_data = app.GetRelevantObjects('*.ElmLod') for load in loads_data: try: load_curve = df[load.GetAttribute('loc_name'] except: print(f'load curve for {load.GetAttribute('loc_name']} not found') #catching error because load name is not in data

@BRYZERIAN

Copy link
Copy Markdown

Hi. I want to know if someone can help me in a issue that I´m having on Digsilent 2023... I want to know if it is posible to modify a setpoint value of a controller of a STATCOM during a RMS simulation; specifically when one specific line trips off (Meaning that the system would be running in N-1 condittions), for instance, at that moment when N-1 scenario occurs, instead of a setpoint value of 1 pu voltage at certain busbar, the statcom change that setpoint to look up for 0.98 pu. voltage.... Please if you can help me I´ll appreciate it.

@Sarah3802

Sarah3802 commented Aug 22, 2023

Copy link
Copy Markdown

Hi Everyone, did anybody know how can i create static generator objects in my project and then need to read date from csv file in order to give every photovoltic (static generator) their power and other properties??

@missto98

Copy link
Copy Markdown

Hello, . I'm trying to implement rms simulation via python code and I ran into a problem. I want to extract the value of a variable at a specific moment in time, but I don't know how to do it. can someone help me please? Regards!

@Sina833

Sina833 commented Sep 24, 2023

Copy link
Copy Markdown

Hi
I want to add a shunt element to a bus. How can I do it?
Thanks.

@ashbravo

Copy link
Copy Markdown

When I close powerfactory, I run the following python script:
import sys sys.path.append( r"C:\Program Files\DIgSILENT\PowerFactory 2022\Python\3.10") if __name__ == "__main__": import powerfactory app = powerfactory.GetApplication() if app is None: raise Exception('getting Powerfactory application failed')

Error reported:
Process finished with exit code -1073741819 (0xC0000005)

Tried many methods to no avail, if you have a similar situation and successfully solved it, or if you have other suggestions, please let me know, thank you for your help, it is greatly appreciated

@GermanAntonioFuentesTapias

Copy link
Copy Markdown

import os
os.environ["PATH"]=r"C:\DIgSILENT\PF 2023_SP5"+os.environ["PATH"]
import sys
sys.path.append(r"C:\DIgSILENT\PF 2023_SP5\Python\3.8")

#IMPORTAR LA APLICACION

try:

import powerfactory as pf


app = pf.GetApplication()


app.Show()   

outputWindow = app.GetOutputWindow()
outputWindow.Print(pf.OutputWindow.MessageType.Plain, "Hello World!")

except Exception as e:

print("Error corregir",e)

Only close powerfactory, If powerfactory is run, Engine mode with Digrcom.

ghost commented Jul 1, 2024

Copy link
Copy Markdown

I have Digsilent 15.1 and I want to extract each line losses in load flow simulation, if python needed, what version and what i need to install, I am new thank you for your help. Oh I also tried using DPL but it always ends up in missing semicolon even if its there, code from chatgpt.

@rizky-r-lab

Copy link
Copy Markdown

@rimmetz17
You could only use python 3.3 which is obsolete. You should upgrade your powerfactory

ghost commented Jul 1, 2024

Copy link
Copy Markdown

@rimmetz17 You could only use python 3.3 which is obsolete. You should upgrade your powerfactory

which version is available for python?

@rizky-r-lab

Copy link
Copy Markdown

For python 3.3 you can download it if you Google it. However, for supporting package (numpy, pandas), it quite difficult to search it.
If you can upgrade the powerfactory, I recommend the latest one (powerfactory 2024) or at least powerfactory 2020 (due to my first time using python for powerfactory)

ghost commented Jul 2, 2024

Copy link
Copy Markdown

I already got pf2021 and currently using python 3.9, but i have trouble "cannot connect to powerfactory application". do you have any reference step by step to follow? i am currently using chatgpt as guide

@rezaasaadi

rezaasaadi commented Jul 2, 2024 via email

Copy link
Copy Markdown

ghost commented Jul 2, 2024

Copy link
Copy Markdown

Managed to get the Ploss data from attribute c:Ploss, does anyone know how to get the active power each line? tried using Pline, Plinu(from chatgpt), P, none of them works

@rizky-r-lab

Copy link
Copy Markdown

You can use m:P:bus1 and m:P:bus2 for balance load flow or m:P1:bus1 and M:P2:bus2 for unbalanced.

For reference, you can search the variable in here, depends on what analysis you are doing.
image

To go there, you go into flexible data tab, in network model manager for each class.

ghost commented Jul 3, 2024

Copy link
Copy Markdown

thank u so much for the replies.

now I am wondering why my calculations are differ from the simulation result. I calculate Ploss using I^2 R, which R replaced by Z (R+XL for <80km line), Z calculation are similar than in simulation "resulting values" in line data (6.8 vs 6.78 ohm), Current are similar (both 85A) since Power are similar (both 21-22 MW), using I^2 Z, simulation differ up to 2x-4x value of calculation.

@rizky-r-lab

Copy link
Copy Markdown

I don't know how the procedure that you are using to calculate Ploss. However, If you only calculate Ploss(active power losses), you should using I^2 R, not I^2 Z.

@hediehrasooli-arch

Copy link
Copy Markdown

Problem description (PowerFactory Python / IntForm / Line labels):

I am trying to automatically change the line (ElmLne) labels in the network diagram (Netzmodell) using Python by modifying the corresponding IntForm (e.g. ElmLne_basic_sym.IntForm).

I can successfully access the object:

...\ElmLne_basic_sym.IntForm

Question:
Where are the line label templates actually stored in PowerFactory (Symbol, IntForm, hidden child objects, or annotation layer), and what is the correct Python way to modify them so the diagram updates?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment