123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561 |
- package blackstart;
- import java.awt.*;
- import java.util.ArrayList;
- import java.util.LinkedList;
- import java.util.List;
- import javax.swing.*;
- import api.AddOn;
- import classes.*;
- import ui.controller.Control;
- import ui.controller.StorageProductionController;
- public class ControlAlgorithm implements AddOn {
- // Gui Part:
- private Control control;
- private JTextArea textArea;
- private JPanel content = new JPanel();
- // ProgressBar
- private long startTime;
- private Thread runThread;
- private HolonObject powerplant;
- private TextField blackstartEnergyrequierementTextfield;
- private TextField blackstartSuccessTimeTextfield;
- private TextField powerplantMaxOutputTextfield;
- private TextField blackstartStartTimeTextfield;
- private TextField simulationDurationTextfield;
- private TextField storageStartCharge;
- private TextField carStartCharge;
- private TextField waitBetweenIterations;
- private TextField lowVolatageTextfield;
- private TextField highVolatageTextfield;
- private TextField renewableTextfield;
- private int blackstartSuccessTime;
- private int blackstartStartTime;
- private int blackstartRunningCounter;
- private float powerplantMaxOutput;
- private List<HolonObject> renewableProducers;
- private List<HolonObject> consumers;
- private StorageProductionController SPC;
- public static void main(String[] args) {
- JFrame newFrame = new JFrame("exampleWindow");
- ControlAlgorithm instance = new ControlAlgorithm();
- newFrame.setContentPane(instance.getPanel());
- newFrame.pack();
- newFrame.setVisible(true);
- newFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- }
- public ControlAlgorithm() {
- content.setLayout(new BorderLayout());
- textArea = new JTextArea();
- textArea.setEditable(false);
- JScrollPane scrollPane = new JScrollPane(textArea);
- JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, createOptionPanel(), scrollPane);
- splitPane.setResizeWeight(0.0);
- content.add(splitPane, BorderLayout.CENTER);
- content.setPreferredSize(new Dimension(1000, 800));
- }
- public JPanel createOptionPanel() {
- JPanel optionPanel = new JPanel(new BorderLayout());
- JScrollPane scrollPane = new JScrollPane(createParameterPanel());
- scrollPane.setBorder(BorderFactory.createTitledBorder("Parameter"));
- optionPanel.add(scrollPane, BorderLayout.CENTER);
- optionPanel.add(createButtonPanel(), BorderLayout.PAGE_END);
- return optionPanel;
- }
- private Component createParameterPanel() {
- JPanel parameterPanel = new JPanel(null);
- parameterPanel.setPreferredSize(new Dimension(510, 300));
- blackstartEnergyrequierementTextfield = new TextField("5000000");
- blackstartEnergyrequierementTextfield.setBounds(10, 10, 95, 20);
- parameterPanel.add(blackstartEnergyrequierementTextfield);
- JLabel blackstartEnergyrequierementLabel = new JLabel("Blackstart Energyrequirement in Watt");
- blackstartEnergyrequierementLabel.setBounds(110, 10, 300, 20);
- parameterPanel.add(blackstartEnergyrequierementLabel);
- blackstartSuccessTimeTextfield = new TextField("30");
- blackstartSuccessTimeTextfield.setBounds(10, 35, 95, 20);
- parameterPanel.add(blackstartSuccessTimeTextfield);
- JLabel blackstartSuccessTimeLabel = new JLabel("Time for successfull blackstart in minutes");
- blackstartSuccessTimeLabel.setBounds(110, 35, 300, 20);
- parameterPanel.add(blackstartSuccessTimeLabel);
- blackstartStartTimeTextfield = new TextField("15");
- blackstartStartTimeTextfield.setBounds(10, 60, 95, 20);
- parameterPanel.add(blackstartStartTimeTextfield);
- JLabel blackstartStartTimeLabel = new JLabel("Starttime for the blackstart");
- blackstartStartTimeLabel.setBounds(110, 60, 300, 20);
- parameterPanel.add(blackstartStartTimeLabel);
- simulationDurationTextfield = new TextField("500");
- simulationDurationTextfield.setBounds(10, 85, 95, 20);
- parameterPanel.add(simulationDurationTextfield);
- JLabel simulationDurationLabel = new JLabel("How long should the simulation run?");
- simulationDurationLabel.setBounds(110, 85, 300, 20);
- parameterPanel.add(simulationDurationLabel);
- powerplantMaxOutputTextfield = new TextField("40000000");
- powerplantMaxOutputTextfield.setBounds(10, 110, 95, 20);
- parameterPanel.add(powerplantMaxOutputTextfield);
- JLabel powerplantMaxOutputLabel = new JLabel("Powerplant Output afer Blackstart");
- powerplantMaxOutputLabel.setBounds(110, 110, 300, 20);
- parameterPanel.add(powerplantMaxOutputLabel);
- storageStartCharge = new TextField("25");
- storageStartCharge.setBounds(10, 135, 95, 20);
- parameterPanel.add(storageStartCharge);
- JLabel storageStartChargeLabel = new JLabel("Storage soc at start in %");
- storageStartChargeLabel.setBounds(110, 135, 300, 20);
- parameterPanel.add(storageStartChargeLabel);
- carStartCharge = new TextField("50");
- carStartCharge.setBounds(10, 160, 95, 20);
- parameterPanel.add(carStartCharge);
- JLabel carStartChargeLabel = new JLabel("Car soc at start in %");
- carStartChargeLabel.setBounds(110, 160, 300, 20);
- parameterPanel.add(carStartChargeLabel);
- waitBetweenIterations = new TextField("0");
- waitBetweenIterations.setBounds(10, 205, 95, 20);
- parameterPanel.add(waitBetweenIterations);
- JLabel waitBetweenIterationsLabel = new JLabel("Wait time between iterations");
- waitBetweenIterationsLabel.setBounds(110, 205, 300, 20);
- parameterPanel.add(waitBetweenIterationsLabel);
- ////////collums
- lowVolatageTextfield = new TextField("230");
- lowVolatageTextfield.setBounds(425, 10, 95, 20);
- parameterPanel.add(lowVolatageTextfield);
- JLabel lowVolatageLabel = new JLabel("low voltage in volt");
- lowVolatageLabel.setBounds(530, 10, 300, 20);
- parameterPanel.add(lowVolatageLabel);
- highVolatageTextfield = new TextField("20000");
- highVolatageTextfield.setBounds(425, 35, 95, 20);
- parameterPanel.add(highVolatageTextfield);
- JLabel highVolatageLabel = new JLabel("high voltage in volt");
- highVolatageLabel.setBounds(530, 35, 300, 20);
- parameterPanel.add(highVolatageLabel);
- renewableTextfield = new TextField("300");
- renewableTextfield.setBounds(425, 60, 95, 20);
- parameterPanel.add(renewableTextfield);
- JLabel renewableLabel = new JLabel("renewable power per element in watt");
- renewableLabel.setBounds(530, 60, 300, 20);
- parameterPanel.add(renewableLabel);
- return parameterPanel;
- }
- public JPanel createButtonPanel() {
- JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
- JButton runButton = new JButton("Run");
- runButton.addActionListener(actionEvent -> {
- Runnable task = this::run;
- runThread = new Thread(task);
- runThread.start();
- });
- buttonPanel.add(runButton);
- return buttonPanel;
- }
- private void run() {
- clear();
- disableGuiInput(true);
- startTimer();
- initAlgo();
- printElapsedTime();
- disableGuiInput(false);
- }
- private void disableGuiInput(boolean bool) {
- control.guiDisable(bool);
- }
- @Override
- public JPanel getPanel() {
- return content;
- }
- @Override
- public void setController(Control control) {
- this.control = control;
- }
- private void clear() {
- textArea.setText("");
- }
- private void println(String message) {
- textArea.append(message + "\n");
- }
- private void startTimer() {
- startTime = System.currentTimeMillis();
- }
- private void printElapsedTime() {
- long elapsedMilliSeconds = System.currentTimeMillis() - startTime;
- println("Execution Time of Algo in Milliseconds:" + elapsedMilliSeconds);
- }
- ///////////////////////////////////////////////////////////////////////////////////
- /**
- *
- */
- private void initAlgo() {
- try {
- // init
- renewableProducers = getRenewableProducers();
- consumers = getConsumers();
- powerplant = control.getSimManager().getPowerplant();// DANGER DONT GIVE NULL
- setPowerPlantBlackstartResistance(-Float.parseFloat(blackstartEnergyrequierementTextfield.getText()));
- SPC = new StorageProductionController(getStorageElements(), getEnergyRequiredForPowerplantBlackstart());// DANGER DONT GIVE NULL
- if(powerplant == null){
- println("No Power Plant in Model");
- return;
- }
- control.getModel().setResistanceCalculator(new ResistanceCalculator(
- Integer.parseInt(lowVolatageTextfield.getText()),
- Integer.parseInt(highVolatageTextfield.getText()),
- 10, 25,0.017, 0.017));
- control.getModel().getResistanceCalculator().setDistancesToCalcResistance(powerplant);
- blackstartRunningCounter = 0;
- deactivateBlackstart();
- control.getModel().setCurIteration(0);
- // prepare model
- /////////
- setRenewableElements(Float.parseFloat(renewableTextfield.getText()));
- disablePowerplantProduction();
- enableAllConsumers();
- SPC.setAllStorageToStandy();
- // TODO: prios?
- /////////
- // Get parameters from textfields
- setPowerPlantBlackstartResistance(-Float.parseFloat(blackstartEnergyrequierementTextfield.getText()));
- blackstartSuccessTime = Integer.parseInt(blackstartSuccessTimeTextfield.getText());
- powerplantMaxOutput = Float.parseFloat(powerplantMaxOutputTextfield.getText());
- blackstartStartTime = Integer.parseInt(blackstartStartTimeTextfield.getText());
- control.getModel().setIterations(Integer.parseInt(simulationDurationTextfield.getText()));
- for (StorageElement se : getStorageElements()) {
- if ("Car".equals(se.getEleName())) {
- se.setStateOfCharge(Float.parseFloat(carStartCharge.getText()));
- } else {
- se.setStateOfCharge(Float.parseFloat(storageStartCharge.getText()));
- }
- }
- updateVisual();
- if (blackstartStartTime + blackstartSuccessTime > control.getModel().getIterations() - 1) {
- println("No Time for the blackstart, use working numbers");
- } else {
- blackstartMain(control.getModel().getCurIteration());
- }
- } catch (NumberFormatException e) {
- println("Worng Input, only numbers please");
- }
- }
- private void blackstartMain(int curIteration) {
- try {
- Thread.sleep(Integer.parseInt(waitBetweenIterations.getText()));
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- control.getModel().setCurIteration(curIteration);
- if (control.getSimManager().blackstartRunning()) {
- if (!blackstartAlgo()) {
- // blackstart for this iteration was not successfull
- deactivateBlackstart();
- updateVisual();
- println("Simulation of blackstart failed in Iteration: " + curIteration);
- } else {
- // blackstart for this iteration was successfull
- blackstartRunningCounter++;
- if (blackstartRunningCounter == blackstartSuccessTime) {
- // blackstart was successfull for the needed iterations
- SPC.setAllStorageToStandy();
- deactivateBlackstart();
- enableAllConsumers();
- updateVisual();
- println("Simulation of blackstart Successfull in Iteration: " + curIteration);
- } else {
- // blackstart not finished yet
- updateVisual();
- blackstartMain(curIteration + 1);
- }
- }
- } else {
- // blackstart has not started yet
- if (curIteration == blackstartStartTime) {
- activateBlackstart();
- disableConsumers();
- blackstartMain(curIteration);
- } else {
- updateVisual();
- blackstartMain(curIteration + 1);
- }
- }
- }
- /**
- * TODO: HOLEG UNTERVERSORGUNG CHECKEN
- * TODO: global resistance calculator?
- * TODO: entladen besser verteilen
- *
- *
- * maybes:
- * * TODO: prios fuer elemente anschalten
- * * TODO: batterie status wechesel fuehrt zu unterversorgung in GUI FIX?: in storage if bei charge auskommentieren
- * * TODO: batterie laden prios? entfernung? doppelt sortieren
- *
- * @return true or false depending on whether the blackstart was successful for
- * this iteration
- */
- private boolean blackstartAlgo() {
- printCurrentEnergyState();
- if (currentRenewableProduction() < getEnergyRequiredForPowerplantBlackstart()) {
- // renewable energy production is not sufficient for the blackstart
- if (SPC.currentPossibleStorageProduction() >= getEnergyRequiredForPowerplantBlackstart()
- - currentRenewableProduction()) {// is there currently enough power available from storage?
- SPC.setAllStorageToStandy();//TODO: placement
- SPC.enableStorageDischarging(getEnergyRequiredForPowerplantBlackstart() - currentRenewableProduction());
- rampUpPowerplant();
- enableConsumers(getPowerplantProduction());
- return true;
- } else {
- // blackstart has failed
- SPC.setAllStorageToStandy();
- println("Not enough storage energy available");
- return false;
- }
- } else {
- //TODO: disable storage?
- // renewable energy production is sufficient for the blackstart
- rampUpPowerplant();
- enableConsumers(
- currentRenewableProduction() - getEnergyRequiredForPowerplantBlackstart() + getPowerplantProduction());
- return true;
- }
- }
- private ArrayList<StorageElement> getStorageElements() {
- ArrayList<StorageElement> storageElements = new ArrayList<>();
- for (HolonObject holonObject : control.getModel().getAllHolonObjectsOnCanvas()) {
- for (HolonElement ele : holonObject.getElements()) {
- if(ele instanceof StorageElement){
- storageElements.add((StorageElement) ele);
- }
- }
- }
- return storageElements;
- }
- private void disableConsumers() {
- // TODO: disableBatteryLoading? will ich das wirklich?
- // SPC.disableStorageProduction();
- for (HolonObject consumer : consumers) {
- for (HolonElement ele : consumer.getElements()) {
- if (ele.isActive() && ele.isConsumer()) {
- ele.setActive(false);
- }
- }
- }
- }
- private void enableConsumers(float energyAvailable) {
- // println("current pp production: " + getPowerplantProduction());
- // println("energy available for consumers" + energyAvailable);
- // Damit wir immer die gleiche ausgangslage haben //TODO: wirklich?
- disableConsumers();
- // TODO: das ganze lieber mit prirotaeten
- for (HolonObject consumer : consumers) {
- for (HolonElement ele : consumer.getElements()) {
- if (energyAvailable > 0
- && energyAvailable - Math.abs(ele.getEnergyPerElement() * ele.getAmount()) >= 0) {//TODO: getenergy ist hier falsch
- if (!ele.isActive()) {
- ele.setActive(true);
- energyAvailable = energyAvailable - Math.abs(ele.getEnergyPerElement() * ele.getAmount());// +
- // since
- // its
- // negative
- }
- } else {
- return;
- }
- }
- }
- }
- private void enableAllConsumers() {
- for (HolonObject consumer : consumers) {
- for (HolonElement ele : consumer.getElements()) {
- if (!ele.isActive() && ele.isConsumer()) {
- ele.setActive(true);
- }
- }//TODO: storage?
- }
- }
- private void setRenewableElements(float energy){
- for (HolonObject house : renewableProducers) {
- for (HolonElement ele : house.getElements()) {
- if (ele.getEleName().equals("Solar Panels")) {// TODO: hier muss noch mehr dazu
- ele.setEnergyPerElement(
- control.getModel().getResistanceCalculator().calcEnergyAfterResistance(
- energy,
- ele.getLowDistance(),
- ele.getHighDistance(),
- getEnergyRequiredForPowerplantBlackstart()));
- }
- }
- }
- }
- private float currentRenewableProduction() {
- float production = 0;
- for (HolonObject house : renewableProducers) {
- for (HolonElement ele : house.getElements()) {
- if (ele.getEleName().equals("Solar Panels")) {// TODO: hier muss noch mehr dazu
- production = production + ele.getEnergyAtTimeStep(control.getModel().getCurIteration());
- }
- }
- }
- return production;
- }
- private void rampUpPowerplant() {
- for (HolonElement ele : powerplant.getElements()) {
- if (ele.getEleName().equals("Power")) {
- ele.setEnergyPerElement(ele.getEnergyPerElement() + powerplantMaxOutput / blackstartSuccessTime);
- }
- }
- }
- private float getPowerplantProduction() {
- float totalProduction = 0;
- for (HolonElement ele : powerplant.getElements()) {
- if (ele.getEleName().equals("Power")) {
- totalProduction = ele.getEnergyPerElement();
- }
- }
- return totalProduction;
- }
- private void disablePowerplantProduction() {
- for (HolonElement ele : powerplant.getElements()) {
- if (ele.getEleName().equals("Power")) {
- ele.setEnergyPerElement(0);
- }
- }
- }
- private float getEnergyRequiredForPowerplantBlackstart() {
- for (HolonElement ele : powerplant.getElements()) {
- if (ele.getEleName().equals("Blackstart")) {
- return -ele.getEnergyPerElement();
- }
- }
- return 0;
- }
- private void setPowerPlantBlackstartResistance(float resistance) {
- for (HolonElement ele : powerplant.getElements()) {
- if (ele.getEleName().equals("Blackstart")) {
- ele.setEnergyPerElement(resistance);
- }
- }
- }
- private void activateBlackstart() {
- for (HolonElement ele : powerplant.getElements()) {
- if (ele.getEleName().equals("Blackstart")) {
- ele.setActive(true);
- }
- }
- }
- private void deactivateBlackstart() {
- for (HolonElement ele : powerplant.getElements()) {
- if (ele.getEleName().equals("Blackstart")) {
- ele.setActive(false);
- }
- }
- }
- private LinkedList<HolonObject> getRenewableProducers() {
- LinkedList<HolonObject> list = new LinkedList<>();
- for (HolonObject holonObject : control.getModel().getAllHolonObjectsOnCanvas()) {
- if (holonObject.getObjName().contentEquals("House")) {// TODO: das reicht so nicht da muss noch gecheckt
- // werden ob es renewables gibt
- list.add(holonObject);
- }
- }
- return list;
- }
- private LinkedList<HolonObject> getConsumers() {
- LinkedList<HolonObject> list = new LinkedList<>();
- for (HolonObject holonObject : control.getModel().getAllHolonObjectsOnCanvas()) {
- if (holonObject.getObjName().contentEquals("House")) {// TODO: das reicht so nicht da muss noch gecheckt
- // werden ob es consumer gibt
- list.add(holonObject);
- }
- }
- return list;
- }
- private void printCurrentEnergyState(){
- println("CURRENT ALGORITHM ITERATION: "+ control.getModel().getCurIteration());
- println("blackstart resi: " + getEnergyRequiredForPowerplantBlackstart());
- println("currenctrenewable: " + currentRenewableProduction());
- println("currenctpossiblestorage: " + SPC.currentPossibleStorageProduction());
- for (StorageElement ele :
- getStorageElements()) {
- println(ele.getEleName() + " " + ele.getId() + ", soc: " + (ele.getStateOfCharge()/60)/1000 + "kWh, "
- + "SOC%: " + ele.getStateOfChargeInPercent()
- /*+ " SOC: " + ele.getStateOfCharge() + " watt/min"*/
- + " nominal power: " + ele.getNominalOutRatio()/1000 + " kW, "
- + "currentMaxOutPower: "+ ele.getCurrentMaxOutRatio()/1000 + " kW, "
- + "distance: " + (ele.getLowDistance()+ele.getHighDistance()));
- }
- }
- /**
- * To let the User See the current state without touching the Canvas.
- */
- private void updateVisual() {
- // System.out.println("Start updateVisual in Iteration: " + control.getModel().getCurIteration());
- control.calculateStateAndVisualForCurrentTimeStep();
- control.updateCanvas();
- // System.out.println("Finish updateVisual in Iteration: " + control.getModel().getCurIteration());
- }
- }
|