engine tweaks

This commit is contained in:
2025-09-05 18:01:54 +02:00
parent 6108413d7e
commit 3c19951c3c
2 changed files with 197 additions and 230 deletions

View File

@@ -31,6 +31,13 @@ class EngineTab(UITab):
rowL += 1
self.idle = tk.IntVar(); L("Leerlauf [RPM]", self.idle)
self.cold_idle = tk.IntVar(); L("Kaltlauf-Idle [RPM]", self.cold_idle)
self.cold_end = tk.DoubleVar(); L("Kaltlauf Ende bei [°C]", self.cold_end)
self.cold_mode = tk.StringVar(); L("Kaltlauf-Modus", self.cold_mode, kind="combo",
values=["two_point","slope"])
ttk.Separator(self.frame).grid(row=rowL, column=0, columnspan=2, sticky="ew", pady=(8,6)); rowL += 1
self.maxrpm = tk.IntVar(); L("Max RPM", self.maxrpm)
self.rise = tk.IntVar(); L("Anstieg [RPM/s]", self.rise)
self.fall = tk.IntVar(); L("Abfall [RPM/s]", self.fall)
@@ -49,12 +56,6 @@ class EngineTab(UITab):
self.st_thr = tk.DoubleVar(); L("Start-Schwelle [RPM]", self.st_thr)
self.stall = tk.DoubleVar(); L("Stall-Grenze [RPM]", self.stall)
ttk.Separator(self.frame).grid(row=rowL, column=0, columnspan=2, sticky="ew", pady=(8,6)); rowL += 1
self.o_idle = tk.DoubleVar(); L("Öldruck Leerlauf [bar]", self.o_idle)
self.o_slope= tk.DoubleVar(); L("Öldruck Steigung [bar/krpm]", self.o_slope)
self.o_floor= tk.DoubleVar(); L("Öldruck Boden [bar]", self.o_floor)
# ---------- Rechte Spalte ----------
rowR = 0
def R(lbl, var, w=12, kind="entry"):
@@ -70,6 +71,10 @@ class EngineTab(UITab):
s.grid(row=rowR, column=3, sticky="ew")
rowR += 1
self.amb_c = tk.DoubleVar(); R("Umgebung [°C]", self.amb_c)
ttk.Separator(self.frame).grid(row=rowR, column=2, columnspan=2, sticky="ew", pady=(8,6)); rowR += 1
self.dk_idle = tk.DoubleVar(); R("DK min Leerlauf [%]", self.dk_idle)
self.dk_over = tk.DoubleVar(); R("DK Schub [%]", self.dk_over)
self.dk_tau = tk.DoubleVar(); R("DK Zeitkonstante [s]", self.dk_tau)
@@ -85,12 +90,6 @@ class EngineTab(UITab):
ttk.Separator(self.frame).grid(row=rowR, column=2, columnspan=2, sticky="ew", pady=(8,6)); rowR += 1
self.amb_c = tk.DoubleVar(); R("Umgebung [°C]", self.amb_c)
self.cold_k = tk.DoubleVar(); R("Kalt-Leerlauf +/°C [RPM/°C]", self.cold_k)
self.cold_max=tk.DoubleVar(); R("Kalt-Leerlauf max [RPM]", self.cold_max)
ttk.Separator(self.frame).grid(row=rowR, column=2, columnspan=2, sticky="ew", pady=(8,6)); rowR += 1
self.pedal = tk.DoubleVar(); R("Gaspedal [%]", self.pedal, kind="scale")
# ---------- Buttons ----------
@@ -109,78 +108,78 @@ class EngineTab(UITab):
e = dict(ENGINE_DEFAULTS); e.update(self.sim.v.config.get("engine", {}))
# links
self.idle.set(e["idle_rpm"])
self.maxrpm.set(e["max_rpm"])
self.rise.set(e["rpm_rise_per_s"])
self.fall.set(e["rpm_fall_per_s"])
self.curve.set(e["throttle_curve"])
self.idle.set(e.get("idle_rpm", ENGINE_DEFAULTS["idle_rpm"]))
self.cold_idle.set(e.get("cold_idle_rpm", e.get("idle_rpm", ENGINE_DEFAULTS["idle_rpm"])))
self.cold_end.set(e.get("cold_idle_end_c", 50.0))
self.cold_mode.set(e.get("idle_cold_mode", "two_point"))
self.power.set(e["engine_power_kw"])
self.tqpeak.set(e["torque_peak_rpm"])
self.maxrpm.set(e.get("max_rpm", ENGINE_DEFAULTS["max_rpm"]))
self.rise.set(e.get("rpm_rise_per_s", ENGINE_DEFAULTS["rpm_rise_per_s"]))
self.fall.set(e.get("rpm_fall_per_s", ENGINE_DEFAULTS["rpm_fall_per_s"]))
self.curve.set(e.get("throttle_curve", ENGINE_DEFAULTS["throttle_curve"]))
self.st_nom.set(e["starter_rpm_nominal"])
self.st_vmin.set(e["starter_voltage_min"])
self.st_thr.set(e["start_rpm_threshold"])
self.stall.set(e["stall_rpm"])
self.power.set(e.get("engine_power_kw", ENGINE_DEFAULTS["engine_power_kw"]))
self.tqpeak.set(e.get("torque_peak_rpm", ENGINE_DEFAULTS["torque_peak_rpm"]))
self.o_idle.set(e["oil_pressure_idle_bar"])
self.o_slope.set(e["oil_pressure_slope_bar_per_krpm"])
self.o_floor.set(e["oil_pressure_off_floor_bar"])
self.st_nom.set(e.get("starter_rpm_nominal", ENGINE_DEFAULTS["starter_rpm_nominal"]))
self.st_vmin.set(e.get("starter_voltage_min", ENGINE_DEFAULTS["starter_voltage_min"]))
self.st_thr.set(e.get("start_rpm_threshold", ENGINE_DEFAULTS["start_rpm_threshold"]))
self.stall.set(e.get("stall_rpm", ENGINE_DEFAULTS["stall_rpm"]))
# rechts
self.dk_idle.set(e["throttle_plate_idle_min_pct"])
self.dk_over.set(e["throttle_plate_overrun_pct"])
self.dk_tau.set(e["throttle_plate_tau_s"])
self.tq_kp.set(e["torque_ctrl_kp"])
self.tq_ki.set(e["torque_ctrl_ki"])
self.amb_c.set(e.get("coolant_ambient_c", ENGINE_DEFAULTS["coolant_ambient_c"]))
self.jit_idle.set(e["rpm_jitter_idle_amp_rpm"])
self.jit_high.set(e["rpm_jitter_high_amp_rpm"])
self.jit_tau.set(e["rpm_jitter_tau_s"])
self.jit_off.set(e["rpm_jitter_off_threshold_rpm"])
self.dk_idle.set(e.get("throttle_plate_idle_min_pct", ENGINE_DEFAULTS["throttle_plate_idle_min_pct"]))
self.dk_over.set(e.get("throttle_plate_overrun_pct", ENGINE_DEFAULTS["throttle_plate_overrun_pct"]))
self.dk_tau.set(e.get("throttle_plate_tau_s", ENGINE_DEFAULTS["throttle_plate_tau_s"]))
self.tq_kp.set(e.get("torque_ctrl_kp", ENGINE_DEFAULTS["torque_ctrl_kp"]))
self.tq_ki.set(e.get("torque_ctrl_ki", ENGINE_DEFAULTS["torque_ctrl_ki"]))
self.amb_c.set(e["coolant_ambient_c"])
self.cold_k.set(e["idle_cold_gain_per_deg"])
self.cold_max.set(e["idle_cold_gain_max"])
self.jit_idle.set(e.get("rpm_jitter_idle_amp_rpm", ENGINE_DEFAULTS["rpm_jitter_idle_amp_rpm"]))
self.jit_high.set(e.get("rpm_jitter_high_amp_rpm", ENGINE_DEFAULTS["rpm_jitter_high_amp_rpm"]))
self.jit_tau.set(e.get("rpm_jitter_tau_s", ENGINE_DEFAULTS["rpm_jitter_tau_s"]))
self.jit_off.set(e.get("rpm_jitter_off_threshold_rpm", ENGINE_DEFAULTS["rpm_jitter_off_threshold_rpm"]))
self.pedal.set(e["throttle_pedal_pct"])
self.pedal.set(e.get("throttle_pedal_pct", ENGINE_DEFAULTS["throttle_pedal_pct"]))
self._on_pedal_change()
def apply(self):
cfg = {"engine": {
# Idle & Kaltlauf (Zweipunkt)
"idle_rpm": int(self.idle.get()),
"cold_idle_rpm": int(self.cold_idle.get()),
"cold_idle_end_c": float(self.cold_end.get()),
"idle_cold_mode": self.cold_mode.get(),
# Basis/Leistung
"max_rpm": int(self.maxrpm.get()),
"rpm_rise_per_s": int(self.rise.get()),
"rpm_fall_per_s": int(self.fall.get()),
"throttle_curve": self.curve.get(),
"engine_power_kw": float(self.power.get()),
"torque_peak_rpm": float(self.tqpeak.get()),
# Start/Abwürgen
"starter_rpm_nominal": float(self.st_nom.get()),
"starter_voltage_min": float(self.st_vmin.get()),
"start_rpm_threshold": float(self.st_thr.get()),
"stall_rpm": float(self.stall.get()),
"oil_pressure_idle_bar": float(self.o_idle.get()),
"oil_pressure_slope_bar_per_krpm": float(self.o_slope.get()),
"oil_pressure_off_floor_bar": float(self.o_floor.get()),
# Umgebung & DBW
"coolant_ambient_c": float(self.amb_c.get()),
"throttle_plate_idle_min_pct": float(self.dk_idle.get()),
"throttle_plate_overrun_pct": float(self.dk_over.get()),
"throttle_plate_tau_s": float(self.dk_tau.get()),
"torque_ctrl_kp": float(self.tq_kp.get()),
"torque_ctrl_ki": float(self.tq_ki.get()),
# Jitter
"rpm_jitter_idle_amp_rpm": float(self.jit_idle.get()),
"rpm_jitter_high_amp_rpm": float(self.jit_high.get()),
"rpm_jitter_tau_s": float(self.jit_tau.get()),
"rpm_jitter_off_threshold_rpm": float(self.jit_off.get()),
"coolant_ambient_c": float(self.amb_c.get()),
"idle_cold_gain_per_deg": float(self.cold_k.get()),
"idle_cold_gain_max": float(self.cold_max.get()),
# UI
"throttle_pedal_pct": float(self.pedal.get()),
}}
self.sim.load_config(cfg)