在 GeckoCIRCUITS 上开发新工具模块的方法

简介

最近在使用开源电力电子仿真软件 GeckoCIRCUITS 进行仿真时,我想使用离散时间控制器,但是 GeckoCIRCUITS 中没有这个模块,需要使用工具栏中自带的 JAVA 模块添加算法代码。但是我想把类似这样常用的模块固定在工具栏里,方便使用。于是我找到软件的源代码 (https://github.com/geckocircuits/GeckoCIRCUITS),在工具类中进行了添加和修改。

步骤1:新建一个工具类

在源文件目录中找到 src/main/java/ch/technokrat/gecko/geckocircuits/control 文件夹, 新建 ReglerDPRCONTROL.java, 添加如下代码,内容是定义器件名称、尺寸、IO 名称,关联描述键值、计算函数等。

java 复制代码
package ch.technokrat.gecko.geckocircuits.control;

import ch.technokrat.gecko.geckocircuits.allg.AbstractComponentTyp;
import ch.technokrat.gecko.geckocircuits.control.calculators.AbstractControlCalculatable;
import ch.technokrat.gecko.geckocircuits.control.calculators.DPRControlCalculator;
import ch.technokrat.gecko.i18n.resources.I18nKeys;
import java.awt.Window;

public final class ReglerDPRCONTROL extends RegelBlock{
    private static final int BLOCK_WIDTH = 5;
    public static final ControlTypeInfo tinfo = new ControlTypeInfo(ReglerDPRCONTROL.class, "DIGITAL_PR_CTRL", I18nKeys.DIGITAL_PR_CONTROL);

    public ReglerDPRCONTROL() {
        super();
        
        XIN.add(new TerminalControlInputWithLabel(this, -3, -XIN.size(), "input"));
        XIN.add(new TerminalControlInputWithLabel(this, -3, -XIN.size(), "kp"));
        XIN.add(new TerminalControlInputWithLabel(this, -3, -XIN.size(), "kr"));
        XIN.add(new TerminalControlInputWithLabel(this, -3, -XIN.size(), "wo"));        
        XIN.add(new TerminalControlInputWithLabel(this, -3, -XIN.size(), "fs"));
        XIN.add(new TerminalControlInputWithLabel(this, -3, -XIN.size(), "wrc"));
        XIN.add(new TerminalControlInputWithLabel(this, -3, -XIN.size(), "max"));
        XIN.add(new TerminalControlInputWithLabel(this, -3, -XIN.size(), "min"));
        
        YOUT.add(new TerminalControlOutputWithLabel(this, 3, -YOUT.size(), "output"));
    }

    @Override
    public int getBlockWidth() {
        return BLOCK_WIDTH * dpix;
    }
    
    
    @Override
    public String[] getOutputNames() {
        return new String[]{"output"};
    }

    @Override
    public I18nKeys[] getOutputDescription() {
        return new I18nKeys[]{ 
            };
    }
    

    @Override
    public double getXShift() {
        return 1 / 2.0;
    }

    @Override
    public AbstractControlCalculatable getInternalControlCalculatableForSimulationStart() {
        return new DPRControlCalculator();
    }

    @Override
    protected String getCenteredDrawString() {
        return "DIGITAL\nPR\nCTRL";
    }
               

    @Override
    protected final Window openDialogWindow() {
        return new DialogWindowWithoutInput(this);
    }
}

步骤2:添加工具计算函数

在源文件目录中找到 src/main/java/ch/technokrat/gecko/geckocircuits/control/calculators 文件夹,新建 DPRControlCalculator.java,添加如下代码,内容是定义器件 IO 数量,设计模块算法。

java 复制代码
package ch.technokrat.gecko.geckocircuits.control.calculators;

public class DPRControlCalculator extends AbstractControlCalculatable{

    //variables

    public DPRControlCalculator() {
        super(8, 1);
    }

    @Override
    public void berechneYOUT(final double deltaT) {        
        //algorithm
        }
    
}

步骤3:添加工具字符串键值

在 src/main/java/ch/technokrat/gecko/i18n/resources/I18nKeys.java 中添加工具的描述键值:

java 复制代码
DIGITAL_PR_CONTROL("Digital PR controller")

在 src/main/java/ch/technokrat/gecko/geckocircuits/control/ControlTyp.java 中添加它在控制类工具中的键值:

java 复制代码
C_DIGITAL_PR_CTRL(92, ReglerDPRCONTROL.tinfo)

步骤4:新建和初始化工具组

在 src/main/java/ch/technokrat/gecko/geckocircuits/circuit/SchematischeEingabeAuswahl2.java 中添加新的工具组,将新建工具的键值放到工具组里:

java 复制代码
private AbstractComponentTyp[] _typDSPTOOLS = new AbstractComponentTyp[]{
        ControlTyp.C_DIGITAL_PR_CTRL
    };

在初始化方法中添加新的工具组:

java 复制代码
createJPanelForTypes(_typDSPTOOLS, "DSP Tools");

步骤5: 编译和运行

使用命令编译项目:

bash 复制代码
mvn package assembly:single

将在target 目录下生成 target/gecko-1.0-jar-with-dependencies.jar 文件,运行命令:

bash 复制代码
java -Xmx3G -Dpolyglot.js.nashorn-compat=true -jar target/gecko-1.0-jar-with-dependencies.jar

打开软件界面后验证,新建的工具已添加成功。