简介
最近在使用开源电力电子仿真软件 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
打开软件界面后验证,新建的工具已添加成功。