Xmod Co-simulation [patched] 【2027】
def get_state(self): return {"x": self.x, "v": self.v}
def connect(self, from_model: str, from_port: str, to_model: str, to_port: str): self.connections.append((from_model, from_port, to_model, to_port))
def __init__(self, name: str, Kp: float, x_ref: float = 0.0): super().__init__(name) self.Kp = Kp self.x_ref = x_ref self.input_ports = [XModPort("x_measured")] self.output_ports = [XModPort("F_cmd")] xmod co-simulation
def set_state(self, state: Dict): pass xmod co-simulation master ---------------------------------------------------------------------- class XModCoSimulation: """Orchestrates coupled xmod models."""
sim.run(0.0, 2.0, log_callback=log)
def __init__(self, dt: float): self.dt = dt self.models: Dict[str, XModModel] = {} self.connections: List[tuple] = [] # (from_model, from_port, to_model, to_port)
def run(self, t_start: float, t_end: float, log_callback: Callable = None): t = t_start outputs = {name: {} for name in self.models} while t < t_end - 1e-12: # Gather all inputs for each model from previous outputs inputs_for = {name: {} for name in self.models} for fm, fp, tm, tp in self.connections: if fm in outputs and fp in outputs[fm]: inputs_for[tm][tp] = outputs[fm][fp] # Step each model new_outputs = {} for name, model in self.models.items(): step_result = model.step(t, self.dt, inputs_for[name]) new_outputs[name] = step_result.outputs outputs = new_outputs t += self.dt if log_callback: log_callback(t, outputs) def get_state(self): return {"x": self
def __init__(self, name: str): self.name = name self.input_ports: List[XModPort] = [] self.output_ports: List[XModPort] = []