## Thursday, November 19, 2015

### Three-phase standalone inverter

So lets start the simulation series with a standalone three-phase inverter - basically the ends of the filter shorted together. This is the screenshot of the .csv file.

The parameters of the inverter are in this screenshot

A few things to note:
1. The voltage source is just 10V because with a short circuit, that's all I need to drive a large current. A dc voltage is specified by making the ac peak 0 and adding a dc offset. The reason is that the peak automatically means an ac signal of frequency specified in the next column.
2. The switches S1 to S6 are shown to have control signals as s1gate to s6gate. However, when the parameter file is initialized, these values are arbitrary and may even be the same. The control signals can't be the same! The problem is not from the simulator point of view but for the control code. Each switch needs a unique control tag. So change as needed.

Before continuing, these are the main inputs the simulator wants from the user:

------------------------------------------------------------------------------------------------------------------------------

\$ python circuit_solver.py
CSV file containing the network layout --> standalone_inv

Enter parameters in file standalone_inv_params.csv. When done, close the file and press y and enter to continue -> y

**************************************************
Resistor is Cdc = 0.001100 located at 5C
Resistor is Ra = 0.100000 located at 26AA
Resistor is Rc = 0.100000 located at 12AA
Voltage Source is Cdc of 0.000000 V(peak), 0.000000 Hz(frequency), 0.000000 (degrees phase shift) and 10.000000 dc offset located at 9C with positive polarity towards 8C
Ammeter is Ac located at 12U with positive polarity towards 12V
Ammeter is Aa located at 26U with positive polarity towards 26V
Inductor is Lc = 0.001000 located at 12X
Inductor is La = 0.001000 located at 26X
Diode is D2 located at 18H with cathode polarity towards 17H
Diode is D4 located at 18L with cathode polarity towards 17L
Diode is D6 located at 18P with cathode polarity towards 17P
Switch is S4 located at 17J with negative polarity towards 18J
Switch is S6 located at 17N with negative polarity towards 18N
Voltmeter is Vdc located at 11A with positive polarity towards 10A
Inductor is Lb = 0.001000 located at 19X
Switch is S1 located at 6F with negative polarity towards 7F
Diode is D1 located at 6H with cathode polarity towards 5H
Switch is S2 located at 17F with negative polarity towards 18F
Switch is S3 located at 6J with negative polarity towards 7J
Diode is D3 located at 6L with cathode polarity towards 5L
Switch is S5 located at 6N with negative polarity towards 7N
Diode is D5 located at 6P with cathode polarity towards 5P
Ammeter is Ab located at 19U with positive polarity towards 19V
Resistor is Rb = 0.100000 located at 19AA
**************************************************

Enter the control files. Omit the .py extension and just leave spaces between files --> currcont_3ph
Enter control parameters in the following files -->
currcont_3ph_desc.csv

Enter control code in the following files -->
currcont_3ph.py
When ready press y and enter to continue -> y

**************************************************
Meters are in the following sequence: ['12U', '19U', '26U', '11A']
Control variables to be plotted are in the following sequence
['control_signal1', 'control_signal3', 'control_signal2', 'control_signal4']
**************************************************
Simulation time step in seconds (recommended <= 10.0e-6) --> 1.0e-6
Duration of simulation in seconds --> 0.1
Data storage time step in seconds ( >= 0.000001) --> 1.0e-6
Output data file name (.dat extension will be added) --> ckt_out

Data stored in ckt_out.dat. Check output log file output_log.txt for description of output
258.522240877
------------------------------------------------------------------------------------------------------------------------------

A quick description:

1. Execute circuit_solver.py. Make sure all the simulator files and .csv files are in the same folder.
2. It asks you for the circuit layout which is a csv file. In this case it is standalone_inv.csv but the .csv is dropped in the input as that is added automatically.
3. If the network layout has just been created, the simulator will read all the components in the layout and will insert them into the parameter file (shown above) with default parameters. These default parameters are almost definitely not the ones you would like to use, so open the standalone_inv_params.csv file, make changes, save it and close it.
4. It prints out the parameters for one last confirmation.
5. Next it asks for control files. Now, these need not be control files but can also be signal processing or any processing file like heat/loss calculation etc. So you do not need to have controlled components to have a control file. Add these control files.
6. Again for each control file the simulator creates a default "descriptor" file as a .csv file. More on this later. The default will have one input (usually a meter). If you would like to use another input or have more inputs, change or copy that row and make changes. There will be one output which will be a controlled entity if there is one. There is one time event. And there is a static variable. And there is one variable storage. More on these later.
7. It asks you to make sure control code is ready in the control files.
8. Then outputs the manner in which the output is saved in the data file. Here the first column is always the time so the other columns start from 2 onwards.
9. Then the next columns will be the stored variables. More on these later.
10. Next inputs are the time step (1 microsec), duration of simulation run (0.1 sec), storage time step (1 microsec but can be higher) and the name of the output data file.
11. On completion tells you how long the simulation took to run.

Now about the descriptor file currcont_3ph_desc.csv

1. In this case, the inputs are the three ammeter outputs. The next column are the names of the variables by which these ammeter outputs will be available in the control code. The simulator makes these meter outputs available with these variable names so you can directly use in the control code. Will be shown.
2. The outputs are shown next. The first three columns are from the parameter file. The next two are specific to the control file. The desired variable name will be assigned to the control outputs at the end so the user can assign any value to the control outputs and they will be passed on. And finally an initial output.
3. The next set are the static variables, these are the variables whose values need to be stored from one iteration to the next. Any variable not declared here but used in the control function is a local variable to that control function. It will exist only in that particular iteration and will cease to exist when the control is executed. So for any values that need to be stored between iterations like itegrals in PI controllers etc, use static variables. In general unless sure that you don't need to store a variable, declare it as a static variable.
4. Two time events are generated - t1, and tcarr. t1 is the time step of the control algorithm. tcarr is the time step of generation of the carrier wave and comparison with the modulation to generate the control signals.
5. The last are the control_signals 1 to 4. These are control signals that can be plotted for debugging like modulation signals, integrals, error signals etc. A note - these control signals are common to all control functions in a simulation. So declaring the same control signal for two control functions is a violation. Also, this is a way to share control signals between control functions. Similar to routing signals between blocks.

Finally the control code:

The control code shows the closed loop control using a PI controller with d-q transformation. Take a moment to find out which variables have not been declared static and the reason why. For that matter, all the variables used can be declared static. Python does not need variables to be declared and variables come into existence when they are used for the first time. So for example dt_sample=100.0e-6 is when dt_sample is declared.

A few results. First one is the current waveforms. The next one is the tracking performance. The reference for d is 10 and q is 0. From waveforms, the actual currents are begin to track the references.

Anyway, that's all for now folks. A long post after a long time.