Source code for gem_controllers.block_diagrams.block_diagram

from control_block_diagram import ControllerDiagram
from control_block_diagram.components import Connection, Point

import gem_controllers as gc

from .stage_blocks import (
    eesm_cc,
    eesm_ops,
    eesm_output,
    ext_ex_dc_cc,
    ext_ex_dc_ops,
    ext_ex_dc_output,
    perm_ex_dc_cc,
    perm_ex_dc_ops,
    perm_ex_dc_output,
    pi_speed_controller,
    pmsm_cc,
    pmsm_ops,
    pmsm_output,
    pmsm_speed_controller,
    scim_cc,
    scim_ops,
    scim_output,
    scim_speed_controller,
    series_dc_cc,
    series_dc_ops,
    series_dc_output,
    shunt_dc_cc,
    shunt_dc_ops,
    shunt_dc_output,
    synrm_cc,
    synrm_output,
)


[docs] def build_block_diagram(controller, env_id, save_block_diagram_as): """ Creates a block diagram of the controller Args: controller: GEMController env_id: GEM environment id save_block_diagram_as: string or tuple of strings of the data types to be saved Returns: Control Block Diagram """ # Get the block building function for all stages motor_type = gc.utils.get_motor_type(env_id) control_task = gc.utils.get_control_task(env_id) stages = get_stages(controller.controller, motor_type) # Create a new block diagram doc = ControllerDiagram() # Help parameter start = Point(0, 0) inputs = dict() outputs = dict() connections = dict() connect_to_lines = dict() # Build the stage blocks for stage in stages: start, inputs_, outputs_, connect_to_lines_, connections_ = stage(start, control_task) inputs = {**inputs, **inputs_} outputs = {**outputs, **outputs_} connect_to_lines = {**connect_to_lines, **connect_to_lines_} connections = {**connections, **connections_} # Connect the different blocks for key in inputs.keys(): if key in outputs.keys(): connections[key] = Connection.connect(outputs[key], inputs[key][0], **inputs[key][1]) for key in connect_to_lines.keys(): if key in connections.keys(): Connection.connect_to_line(connections[key], connect_to_lines[key][0], **connect_to_lines[key][1]) # Save the block diagram if save_block_diagram_as is not None: save_block_diagram_as = ( list(save_block_diagram_as) if isinstance(save_block_diagram_as, (tuple, list)) else [save_block_diagram_as] ) doc.save(*save_block_diagram_as) return doc
[docs] def get_stages(controller, motor_type): """ Function to get all block building functions Args: controller: GEMController motor_type: type of the motor Returns: list of all block building functions """ motor_check = motor_type in ["PMSM", "SCIM", "EESM", "SynRM", "ShuntDc", "SeriesDc", "PermExDc", "ExtExDc"] stages = [] # Add the speed controller block function if isinstance(controller, gc.PISpeedController): if motor_type in ["PMSM", "SCIM", "EESM", "SynRM"]: stages.append(build_functions[motor_type + "_Speed_Controller"]) else: stages.append(build_functions["PI_Speed_Controller"]) controller = controller.torque_controller # add the torque controller block function if isinstance(controller, gc.torque_controller.TorqueController): if motor_check: stages.append(build_functions[motor_type + "_OPS"]) controller = controller.current_controller # add the current controller block function if isinstance(controller, gc.PICurrentController): emf_feedforward = controller.emf_feedforward is not None if motor_check: stages.append(build_functions[motor_type + "_CC"](emf_feedforward)) # add the output block function stages.append((build_functions[motor_type + "_Output"](controller.emf_feedforward is not None))) return stages
# dictonary of all block building functions build_functions = { "PI_Speed_Controller": pi_speed_controller, "PMSM_Speed_Controller": pmsm_speed_controller, "SCIM_Speed_Controller": scim_speed_controller, "EESM_Speed_Controller": pmsm_speed_controller, "SynRM_Speed_Controller": pmsm_speed_controller, "PMSM_OPS": pmsm_ops, "SCIM_OPS": scim_ops, "EESM_OPS": eesm_ops, "SynRM_OPS": pmsm_ops, "SeriesDc_OPS": series_dc_ops, "ShuntDc_OPS": shunt_dc_ops, "PermExDc_OPS": perm_ex_dc_ops, "ExtExDc_OPS": ext_ex_dc_ops, "PMSM_CC": pmsm_cc, "SCIM_CC": scim_cc, "EESM_CC": eesm_cc, "SynRM_CC": synrm_cc, "SeriesDc_CC": series_dc_cc, "ShuntDc_CC": shunt_dc_cc, "PermExDc_CC": perm_ex_dc_cc, "ExtExDc_CC": ext_ex_dc_cc, "PMSM_Output": pmsm_output, "SCIM_Output": scim_output, "EESM_Output": eesm_output, "SynRM_Output": synrm_output, "SeriesDc_Output": series_dc_output, "ShuntDc_Output": shunt_dc_output, "PermExDc_Output": perm_ex_dc_output, "ExtExDc_Output": ext_ex_dc_output, }