示例#1
0
def run():
    ## Operation process for UEMS
    logger = Logger('Universal_ems_main') # The logger system has been started
    db_str = db_configuration.universal_database["db_str"] # Database format
    engine = create_engine(db_str, echo=False) # Create engine for universal energy management system databases
    Session = sessionmaker(bind=engine) # Create engine for target database
    session_uems = Session() # Create session for universal energy management system
    # IP = "10.25.196.56"
    IP = "*"
    # Start the information connection
    context = zmq.Context()
    socket = context.socket(zmq.REP)
    socket.bind("tcp://" + IP + ":5555")

    socket_upload = context.socket(zmq.REP)  # Upload information channel for local EMS
    socket_upload.bind("tcp://" + IP + ":5556")

    socket_download = context.socket(zmq.REQ)  # Download information channel for local EMS
    socket_download.bind("tcp://" + IP + ":5557")

    initialize = Main(socket)
    universal_models = initialize.universal_models
    local_models = initialize.local_models
    # Start the input information
    info_ed = economic_dispatch_info.local_sources() # Dynamic information for economic dispatch
    info_uc = economic_dispatch_info.local_sources() # Dynamic information for unit commitment
    info_opf = opf_model.informaiton_exchange() # Optimal power flow modelling

    # Generate different processes
    logger.info("The short term process in UEMS starts!")
    sched_short_term = BlockingScheduler()  # The schedulor for the optimal power flow
    sched_short_term.add_job(short_term_operation.short_term_operation_uems, 'cron',
                             args=(universal_models, local_models, socket_upload, socket_download, info_opf,
                                   session_uems), minute='0-59',
                             second='1')  # The operation is triggered minutely, this process will start at **:01
    sched_short_term.start()

    logger.info("The middle term process in UEMS starts!")
    sched_middle_term = BlockingScheduler()  # The schedulor for the optimal power flow
    sched_middle_term.add_job(middle_term_operation.middle_term_operation_uems, 'cron',
                             args=(universal_models, local_models, socket_upload, socket_download, info_ed,
                                   session_uems), minute='*/5',
                             second='1')  # The operation is triggered every 5 minute
    sched_middle_term.start()

    short_term_operation.short_term_operation_uems(universal_models, local_models, socket_upload, socket_download, info_opf,
            session_uems)

    logger.info("The long term process in UEMS starts!")
    sched_long_term = BlockingScheduler()  # The schedulor for the optimal power flow
    sched_long_term.add_job(long_term_operation.long_term_operation_uems, 'cron',
                              args=(universal_models, local_models, socket_upload, socket_download, info_uc,
                                    session_uems), minute='*/30',
                              second='1')  # The operation is triggered every half an hour
    sched_long_term.start()
def run():
    # Define the local models
    (local_model_short, local_model_middle,
     local_model_long) = start_up_lems.start_up_lems.start_up()
    # Convert local information to sharable information
    static_info = static_information.static_information_generation(
        local_model_short)
    # Set the database information
    db_str = db_configuration.local_database["db_str"]
    engine = create_engine(db_str, echo=False)
    Session = sessionmaker(bind=engine)
    session_lems_short = Session()
    session_lems_middle = Session()
    session_lems_long = Session()

    # Start the information connection
    context = zmq.Context()
    socket = context.socket(zmq.REQ)
    socket.connect("tcp://localhost:5555")

    socket_upload = context.socket(zmq.REQ)
    socket_upload.connect("tcp://localhost:5556")

    socket_upload_ed = context.socket(zmq.REQ)
    socket_upload_ed.connect("tcp://localhost:5557")

    socket_upload_uc = context.socket(zmq.REQ)
    socket_upload_uc.connect("tcp://localhost:5558")

    socket_download = context.socket(zmq.REP)
    socket_download.connect("tcp://localhost:5559")

    while True:
        socket.send(b"ConnectionRequest")

        message = socket.recv()
        if message == b"Start!":
            logger.info(
                "The connection between the local EMS and universal EMS establishes!"
            )
            break
        else:
            logger.error(
                "Waiting for the connection between the local EMS and universal EMS!"
            )

    information_receive_send.information_send(socket, static_info, 2)

    info_ed = economic_dispatch_info.local_sources()
    info_uc = economic_dispatch_info.local_sources(
    )  # The information model in the
    info_opf = opf_model.informaiton_exchange(
    )  # The optimal power flow modelling
    # By short-term operation process
    logger.info("The short-term process in local ems starts!")
    sched_lems = BlockingScheduler(
    )  # The schedulor for the optimal power flow
    sched_lems.add_job(lambda: short_term_operation.short_term_operation_lems(
        local_model_short, socket_upload, socket_download, info_opf,
        session_lems_short),
                       'cron',
                       minute='0-59',
                       second='1')  # The operation is triggered minutely

    logger.info("The middle-term process in local EMS starts!")
    sched_lems.add_job(
        lambda: middle_term_operation.middle_term_operation_lems(
            local_model_middle, socket_upload_ed, socket_download, info_ed,
            session_lems_middle),
        'cron',
        minute='*/5',
        second='5')  # The operation is triggered every five minute

    logger.info("The long term process in local EMS starts!")
    sched_lems.add_job(
        lambda: long_term_operation.long_term_operation_lems(
            local_model_long, socket_upload_uc, socket_download, info_uc,
            session_lems_long),
        'cron',
        minute='*/30',
        second='30')  # The operation is triggered every half an hour
    sched_lems.start()
    def info_formulation(*args):
        from configuration.configuration_time_line import default_look_ahead_time_step
        from modelling import dynamic_operation_pb2
        model = args[0]
        Target_time = args[1]
        Type = args[2]
        dynamic_model = dynamic_operation_pb2.local_sources()

        if Type == "UC":
            T = default_look_ahead_time_step["Look_ahead_time_uc_time_step"]
        else:
            T = default_look_ahead_time_step["Look_ahead_time_ed_time_step"]
        # 1) Initial dynamic model
        dynamic_info = dynamic_model
        #################################The information structure
        ug_info = dynamic_model.DgType()
        dg_info = dynamic_model.DgType()
        ess_info = dynamic_model.EssType()
        pv_info = dynamic_model.PvType()
        wp_info = dynamic_model.WpType()
        load_ac_info = dynamic_model.Load_AC_Type()
        load_dc_info = dynamic_model.Load_DC_Type()
        load_uac_info = dynamic_model.Load_AC_Type()
        load_udc_info = dynamic_model.Load_DC_Type()
        bic_info = dynamic_model.Convertor_Type()

        # Obtain information from the external systems
        dynamic_info.AREA = model["UG"]["AREA"]
        dynamic_info.TIME_STAMP = Target_time
        # Update utility grid information
        ug_info.ID = 0
        if type(model["UG"]["GEN_STATUS"]) is list:
            if len(model["UG"]["GEN_STATUS"]) != T:
                ug_info.GEN_STATUS.extend(model["UG"]["GEN_STATUS"] * T)
            else:
                ug_info.GEN_STATUS.extend(model["UG"]["GEN_STATUS"])
        elif type(model["UG"]["GEN_STATUS"]) is int:
            ug_info.GEN_STATUS.extend([model["UG"]["GEN_STATUS"]] * T)

        if type(model["UG"]["COMMAND_PG"]) is list:
            ug_info.PG.extend(model["UG"]["COMMAND_PG"])
        else:
            ug_info.PG.extend([model["UG"]["COMMAND_PG"]])

        if type(model["UG"]["COMMAND_RG"]) is list:
            ug_info.RG.extend(model["UG"]["COMMAND_RG"])
        else:
            ug_info.RG.extend([model["UG"]["COMMAND_RG"]])

        if type(model["UG"]["COMMAND_START_UP"]) is list:
            ug_info.COMMAND_STATUS.extend(model["UG"]["COMMAND_START_UP"])
        else:
            ug_info.COMMAND_STATUS.extend([model["UG"]["COMMAND_START_UP"]])

        # Update dg part information
        dg_info.ID = 1
        if type(model["DG"]["GEN_STATUS"]) is list:
            if len(model["DG"]["GEN_STATUS"]) != T:
                dg_info.GEN_STATUS.extend(model["DG"]["GEN_STATUS"] * T)
            else:
                dg_info.GEN_STATUS.extend(model["DG"]["GEN_STATUS"])
        elif type(model["UG"]["GEN_STATUS"]) is int:
            dg_info.GEN_STATUS.extend([model["UG"]["GEN_STATUS"]] * T)

        if type(model["DG"]["COMMAND_PG"]) is list:
            dg_info.PG.extend(model["DG"]["COMMAND_PG"])
        else:
            dg_info.PG.extend([model["DG"]["COMMAND_PG"]])

        if type(model["DG"]["COMMAND_RG"]) is list:
            dg_info.RG.extend(model["DG"]["COMMAND_RG"])
        else:
            dg_info.RG.extend([model["DG"]["COMMAND_RG"]])

        if type(model["DG"]["COMMAND_START_UP"]) is list:
            dg_info.COMMAND_STATUS.extend(model["DG"]["COMMAND_START_UP"])
        else:
            dg_info.COMMAND_STATUS.extend([model["DG"]["COMMAND_START_UP"]])

        dynamic_info.dg.extend([ug_info, dg_info])
        # Update ess part information
        ess_info.ID = 1
        ess_info.ESS_STATUS.extend([1]*T)
        if type(model["ESS"]["SOC"]) is list:
            ess_info.SOC.extend(model["ESS"]["SOC"])
        else:
            ess_info.SOC.extend([model["ESS"]["SOC"]])

        if type(model["ESS"]["COMMAND_PG"]) is list:
            ess_info.PG.extend(model["ESS"]["COMMAND_PG"])
        else:
            ess_info.PG.extend([model["ESS"]["COMMAND_PG"]])

        if type(model["ESS"]["COMMAND_RG"]) is list:
            ess_info.RG.extend(model["ESS"]["COMMAND_RG"])
        else:
            ess_info.RG.extend([model["ESS"]["COMMAND_RG"]])

        dynamic_info.ess.extend([ess_info])

        # Update pv part information
        pv_info.PG.extend(model["PV"]["PG"])
        if type(model["PV"]["COMMAND_CURT"]) is list:
            pv_info.COMMAND_CURT.extend(model["PV"]["COMMAND_CURT"])
        else:
            pv_info.COMMAND_CURT.extend([model["PV"]["COMMAND_CURT"]])
        dynamic_info.pv.extend([pv_info])

        # Update wp part information
        wp_info.PG.extend(model["WP"]["PG"])
        if type(model["WP"]["COMMAND_CURT"]) is list:
            wp_info.COMMAND_CURT.extend(model["WP"]["COMMAND_CURT"])
        else:
            wp_info.COMMAND_CURT.extend([model["WP"]["COMMAND_CURT"]])
        dynamic_info.wp.extend([wp_info])

        # Update load_ac part information
        load_ac_info.PD.extend(model["Load_ac"]["PD"])
        if type(model["Load_ac"]["COMMAND_SHED"]) is list:
            load_ac_info.COMMAND_SHED.extend(model["Load_ac"]["COMMAND_SHED"])
        else:
            load_ac_info.COMMAND_SHED.extend([model["Load_ac"]["COMMAND_SHED"]])

        load_uac_info.PD.extend(model["Load_uac"]["PD"])
        if type(model["Load_uac"]["COMMAND_SHED"]) is list:
            load_uac_info.COMMAND_SHED.extend(model["Load_uac"]["COMMAND_SHED"])
        else:
            load_uac_info.COMMAND_SHED.extend([model["Load_uac"]["COMMAND_SHED"]])

        dynamic_info.load_ac.extend([load_ac_info, load_uac_info])
        # Update load_dc part information
        load_dc_info.PD.extend(model["Load_dc"]["PD"])
        if type(model["Load_dc"]["COMMAND_SHED"]) is list:
            load_dc_info.COMMAND_SHED.extend(model["Load_dc"]["COMMAND_SHED"])
        else:
            load_dc_info.COMMAND_SHED.extend([model["Load_dc"]["COMMAND_SHED"]])

        load_udc_info.PD.extend(model["Load_udc"]["PD"])
        if type(model["Load_udc"]["COMMAND_SHED"]) is list:
            load_udc_info.COMMAND_SHED.extend(model["Load_udc"]["COMMAND_SHED"])
        else:
            load_udc_info.COMMAND_SHED.extend([model["Load_udc"]["COMMAND_SHED"]])

        dynamic_info.load_dc.extend([load_dc_info, load_udc_info])
        # Update convertor part information
        bic_info.STATUS.extend([1]*T)
        if type(model["BIC"]["COMMAND_AC2DC"]) is list:
            bic_info.PAC2DC.extend(model["BIC"]["COMMAND_AC2DC"])
        else:
            bic_info.PAC2DC.extend([model["BIC"]["COMMAND_AC2DC"]])

        if type(model["BIC"]["COMMAND_DC2AC"]) is list:
            bic_info.PDC2AC.extend(model["BIC"]["COMMAND_DC2AC"])
        else:
            bic_info.PDC2AC.extend([model["BIC"]["COMMAND_DC2AC"]])

        dynamic_info.bic.extend([bic_info])

        if type(model["PMG"]) is list:
            dynamic_info.PMG.extend(model["PMG"])
        else:
            dynamic_info.PMG.extend([model["PMG"]])

        dynamic_info.COMMAND_TYPE = model["COMMAND_TYPE"]
        dynamic_info.TIME_STAMP_COMMAND = Target_time

        return dynamic_info
示例#4
0
def run():
    # Define the local models
    local_models = {
        "DG": generators.Generator_AC.copy(),
        "UG": generators.Generator_AC.copy(),
        "Load_ac": loads.Load_AC.copy(),
        "Load_uac": loads.Load_AC.copy(),
        "BIC": convertors.BIC.copy(),
        "ESS": energy_storage_systems.BESS.copy(),
        "PV": generators.Generator_RES.copy(),
        "WP": generators.Generator_RES.copy(),
        "Load_dc": loads.Load_DC.copy(),
        "Load_udc": loads.Load_DC.copy(),
        "PMG": 0,
        "VDC": 0
    }

    # Update the local parameters
    local_models["UG"]["GEN_STATUS"] = 0
    local_models["WP"]["GEN_STATUS"] = 0
    local_models["Load_ac"]["FLEX"] = 0
    local_models["Load_uac"]["FLEX"] = 1
    local_models["Load_dc"]["FLEX"] = 0
    local_models["Load_udc"]["FLEX"] = 1
    # Convert local information to sharable information
    static_info = static_information.static_information_generation(
        local_models)
    # Set the database information
    db_str = db_configuration.local_database["db_str"]
    engine = create_engine(db_str, echo=False)
    Session = sessionmaker(bind=engine)
    session_lems = Session()

    # Start the information connection
    context = zmq.Context()
    socket = context.socket(zmq.REQ)
    socket.connect("tcp://localhost:5555")

    socket_upload = context.socket(zmq.REQ)
    socket_upload.connect("tcp://localhost:5556")

    socket_download = context.socket(zmq.REP)
    socket_download.connect("tcp://localhost:5557")

    while True:
        socket.send(b"ConnectionRequest")

        message = socket.recv()
        if message == b"Start!":
            logger.info(
                "The connection between the local EMS and universal EMS establishes!"
            )
            break
        else:
            logger.error(
                "Waiting for the connection between the local EMS and universal EMS!"
            )

    information_receive_send.information_send(socket, static_info, 2)

    info_ed = economic_dispatch_info.local_sources()
    info_uc = economic_dispatch_info.local_sources(
    )  # The information model in the
    info_opf = opf_model.informaiton_exchange(
    )  # The optimal power flow modelling
    # By short-term operation process
    logger.info("The short-term process in local ems starts!")
    sched_short_term = BlockingScheduler(
    )  # The schedulor for the optimal power flow
    sched_short_term.add_job(
        lambda: short_term_operation.short_term_operation_lems(
            local_models, socket_upload, socket_download, info_opf,
            session_lems),
        'cron',
        minute='0-59',
        second='1')  # The operation is triggered minutely
    sched_short_term.start()

    short_term_operation.short_term_operation_lems(local_models, socket_upload,
                                                   socket_download, info_opf,
                                                   session_lems)
    logger.info("The middle-term process in local EMS starts!")
    sched_middle_term = BlockingScheduler(
    )  # The schedulor for the optimal power flow
    sched_middle_term.add_job(
        lambda: middle_term_operation.middle_term_operation_lems(
            local_models, socket_upload, socket_download, info_ed, session_lems
        ),
        'cron',
        minute='*/5',
        second='1')  # The operation is triggered every five minute
    sched_middle_term.start()

    logger.info("The long term process in local EMS starts!")
    sched_long_term = BlockingScheduler(
    )  # The schedulor for the optimal power flow
    sched_long_term.add_job(
        lambda: long_term_operation.long_term_operation_lems(
            local_models, socket_upload, socket_download, info_uc, session_lems
        ),
        'cron',
        minute='*/30',
        second='1')  # The operation is triggered every half an hour
    sched_long_term.start()