Skip to content
5 changes: 4 additions & 1 deletion src/processors/CircuitSimulatorInterface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -735,8 +735,11 @@ std::shared_ptr<CircuitSimulatorExporterModel> CircuitSimulatorExporterModel::fa
else if (programName == CircuitSimulatorExporterModels::LTSPICE) {
return std::make_shared<CircuitSimulatorExporterLtspiceModel>();
}
else if (programName == CircuitSimulatorExporterModels::PLECS) {
return std::make_shared<CircuitSimulatorExporterPlecsModel>();
}
else
throw ModelNotAvailableException("Unknown Circuit Simulator program, available options are: {SIMBA, NGSPICE, LTSPICE}");
throw ModelNotAvailableException("Unknown Circuit Simulator program, available options are: {SIMBA, NGSPICE, LTSPICE, PLECS}");
}

std::string CircuitSimulatorExporter::export_magnetic_as_subcircuit(Magnetic magnetic, double frequency, double temperature, std::optional<std::string> outputFilename, std::optional<std::string> filePathOrFile, CircuitSimulatorExporterCurveFittingModes mode) {
Expand Down
47 changes: 46 additions & 1 deletion src/processors/CircuitSimulatorInterface.h
Original file line number Diff line number Diff line change
Expand Up @@ -408,7 +408,8 @@ enum class CircuitSimulatorExporterModels : int {
SIMBA,
NGSPICE,
LTSPICE,
NL5
NL5,
PLECS
};

void from_json(const json & j, CircuitSimulatorExporterModels & x);
Expand All @@ -419,6 +420,7 @@ inline void from_json(const json & j, CircuitSimulatorExporterModels & x) {
else if (j == "NgSpice") x = CircuitSimulatorExporterModels::NGSPICE;
else if (j == "LtSpice") x = CircuitSimulatorExporterModels::LTSPICE;
else if (j == "NL5") x = CircuitSimulatorExporterModels::NL5;
else if (j == "PLECS") x = CircuitSimulatorExporterModels::PLECS;
else { throw std::runtime_error("Input JSON does not conform to schema!"); }
}

Expand All @@ -428,6 +430,7 @@ inline void to_json(json & j, const CircuitSimulatorExporterModels & x) {
case CircuitSimulatorExporterModels::NGSPICE: j = "NgSpice"; break;
case CircuitSimulatorExporterModels::LTSPICE: j = "LtSpice"; break;
case CircuitSimulatorExporterModels::NL5: j = "NL5"; break;
case CircuitSimulatorExporterModels::PLECS: j = "PLECS"; break;
default: throw std::runtime_error("Unexpected value in enumeration \"[object Object]\": " + std::to_string(static_cast<int>(x)));
}
}
Expand Down Expand Up @@ -558,6 +561,48 @@ class CircuitSimulatorExporterLtspiceModel : public CircuitSimulatorExporterMode
std::string export_magnetic_as_symbol(Magnetic magnetic, std::optional<std::string> filePathOrFile = std::nullopt);
};

class CircuitSimulatorExporterPlecsModel : public CircuitSimulatorExporterModel {
public:
std::string programName = "PLECS";
double _modelSize = 400;
size_t _precision = 6;

CircuitSimulatorExporterPlecsModel() = default;

std::string export_magnetic_as_symbol(Magnetic magnetic, std::optional<std::string> filePathOrFile = std::nullopt);
std::string export_magnetic_as_subcircuit(Magnetic magnetic, double frequency = defaults.measurementFrequency, double temperature = defaults.ambientTemperature, std::optional<std::string> filePathOrFile = std::nullopt, CircuitSimulatorExporterCurveFittingModes mode = CircuitSimulatorExporterCurveFittingModes::LADDER);

private:
std::string encode_init_commands(const std::string& plainText);
std::string emit_header(const std::string& name);
std::string emit_footer();
std::string emit_schematic_header();
std::string emit_schematic_footer();
std::string emit_magnetic_interface(const std::string& name, const std::string& turnsVar, int polarity, std::vector<int> position, const std::string& direction, bool flipped);
std::string emit_p_sat(const std::string& name, const std::string& areaVar, const std::string& lengthVar, const std::string& muRVar, const std::string& bSatVar, std::vector<int> position, const std::string& direction, bool flipped);
std::string emit_p_air(const std::string& name, const std::string& areaVar, const std::string& lengthVar, std::vector<int> position, const std::string& direction, bool flipped);
std::string emit_ac_voltage_source(const std::string& name, std::vector<int> position);
std::string emit_resistor(const std::string& name, const std::string& valueVar, std::vector<int> position);
std::string emit_scope(const std::string& name, std::vector<int> position);
std::string emit_probe(const std::string& name, std::vector<int> position, const std::vector<std::pair<std::string, std::string>>& probes);
std::string emit_connection(const std::string& type, const std::string& srcComponent, int srcTerminal, const std::string& dstComponent, int dstTerminal, std::vector<std::vector<int>> points = {});

// Shared helpers for subcircuit/symbol export
void build_physical_init(std::ostringstream& init, Core& core,
const std::vector<Winding>& windings,
const std::vector<ColumnElement>& columns,
double temperature);
void build_magnetic_schematic(std::ostringstream& init, std::ostringstream& schematic,
Core& core,
const std::vector<Winding>& windings,
const std::vector<ColumnElement>& columns,
bool isMultiColumn, int yBase);
void build_electrical_schematic(std::ostringstream& schematic,
const std::vector<Winding>& windings,
bool isMultiColumn, int yBase);
std::string assemble_plecs_file(const std::string& name, const std::string& initStr, const std::string& schematicStr);
};

class CircuitSimulationReader {
public:
enum class DataType : int {
Expand Down
Loading
Loading