{ "version": "v0.1", "hils": [ { "name": "power_grid_hil", "warmup_s": 2.0, "init": { "bus_voltage": 230.0, "bus_frequency": 50.0, "generator_power": 0.0, "load_power": 0.0, "grid_stable": 1, "generator_cmd": 0, "generator_setpoint": 0.0, "load_demand": 500.0 }, "params": { "nominal_voltage": 230.0, "nominal_frequency": 50.0, "voltage_tolerance": 10.0, "frequency_tolerance": 0.5, "generator_max": 1000.0, "load_sensitivity": 0.01 }, "tasks": [ { "type": "loop", "name": "grid_dynamics", "dt_s": 0.1, "actions": [ { "if": "generator_cmd > 0.5", "then": [ {"set": ["generator_power", "clamp(generator_setpoint, 0, generator_max)"]} ], "else": [ {"set": ["generator_power", "0"]} ] }, {"set": ["load_power", "load_demand"]}, { "set": ["bus_frequency", "nominal_frequency + (generator_power - load_power) * load_sensitivity"] }, { "set": ["bus_voltage", "nominal_voltage * (0.95 + 0.1 * (generator_power / max(generator_max, 1)))"] }, { "if": "abs(bus_frequency - nominal_frequency) < frequency_tolerance and abs(bus_voltage - nominal_voltage) < voltage_tolerance", "then": [ {"set": ["grid_stable", "1"]} ], "else": [ {"set": ["grid_stable", "0"]} ] } ] }, { "type": "playback", "name": "load_variation", "dt_s": 1.0, "target": "load_demand", "profile": { "kind": "gaussian", "height": 500.0, "mean": 0.0, "std": 50.0, "entries": 100 }, "repeat": true } ] } ] }