简介
最近在使用开源电力电子仿真软件 GeckoCIRCUITS 进行仿真时,我想使用离散时间控制器,但是 GeckoCIRCUITS 中没有这个模块,需要使用工具栏中自带的 JAVA 模块添加算法代码。但是我想把类似这样常用的模块固定在工具栏里,方便使用。于是我找到软件的源代码 (https://github.com/geckocircuits/GeckoCIRCUITS),在工具类中进行了添加和修改。
步骤1:新建一个工具类
在源文件目录中找到 src/main/java/ch/technokrat/gecko/geckocircuits/control 文件夹, 新建 ReglerDPRCONTROL.java, 添加如下代码,内容是定义器件名称、尺寸、IO 名称,关联描述键值、计算函数等。
/* by 01130.hk - online tools website : 01130.hk/zh/chaicp.html */ 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 数量,设计模块算法。
/* by 01130.hk - online tools website : 01130.hk/zh/chaicp.html */ 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 中添加工具的描述键值:
DIGITAL_PR_CONTROL("Digital PR controller")在 src/main/java/ch/technokrat/gecko/geckocircuits/control/ControlTyp.java 中添加它在控制类工具中的键值:
C_DIGITAL_PR_CTRL(92, ReglerDPRCONTROL.tinfo)步骤4:新建和初始化工具组
在 src/main/java/ch/technokrat/gecko/geckocircuits/circuit/SchematischeEingabeAuswahl2.java 中添加新的工具组,将新建工具的键值放到工具组里:
private AbstractComponentTyp[] _typDSPTOOLS = new AbstractComponentTyp[]{ ControlTyp.C_DIGITAL_PR_CTRL };在初始化方法中添加新的工具组:
createJPanelForTypes(_typDSPTOOLS, "DSP Tools");步骤5: 编译和运行
使用命令编译项目:
mvn package assembly:single将在target 目录下生成 target/gecko-1.0-jar-with-dependencies.jar 文件,运行命令:
java -Xmx3G -Dpolyglot.js.nashorn-compat=true -jar target/gecko-1.0-jar-with-dependencies.jar打开软件界面后验证,新建的工具已添加成功。