Skip to content

Latest commit

 

History

History
121 lines (98 loc) · 4.8 KB

控制机器自动运转.md

File metadata and controls

121 lines (98 loc) · 4.8 KB

需求来自发酵行业的研发工程师,需要控制上料机器按周期和其他条件自动运转

我有两个上料泵,一个发酵缸, 目标是每隔固定的时间间隔(passage_duration)检查发酵缸中的含氧量(DO_SP),如果满足要求(DO_SP>30)就依次启动两个泵进行上料,第一个泵上完料第二个泵再上。如果不满足要求就实时检查含氧量,直到满足要求再上料。

我需要你用python帮我写一个自动上料的函数 pass_feeding(run_time, feed_vol_1, feed_vol_2, DO_SP) 这个函数被外层程序实时调用,run_time是当前发酵时间,accumulate_vol_1和accumulate_vol_2是泵1和泵2的累积上料体积(可以实时获取),返回值为控制泵1和泵2的转速speed_1和speed_2,如果无需上料则返回转速为0, 泵1 和泵2不能不同时转

外层超参数有: 泵1和泵2的单次上料体积:single_vol_1和single_vol_2

检查时间间隔:passage_duration

import datetime

# 全局变量
feeding_start = datetime.datetime.now() - datetime.timedelta(seconds=18000)  # 跳过首次
InitFeed1Vol = 0
InitFeed2Vol = 0
feed1_SP = 0
feed2_SP = 0

def pass_feeding(run_time, feed_vol_1, feed_vol_2, DO_SP):
    global feeding_start, InitFeed1Vol, InitFeed2Vol, feed1_SP, feed2_SP

    # 超参数
    min_run_time = 6.0  # 最短发酵培养时间h
    max_run_time = 1000   # 最长发酵培养时间h
    single_vol_1 = 1000  # 泵1单次上料体积
    single_vol_2 = 800  # 泵2单次上料体积
    passage_duration = datetime.timedelta(hours=5)  # 检查时间间隔

    # 如果运行时间不处于触发时间范围内,则不补料
    if run_time < min_run_time or run_time > max_run_time:
        return 0, 0

    # 判断是否超过了静默时间
    if datetime.datetime.now() - feeding_start >= passage_duration:
        if DO_SP >= 30:  # 如果满足条件,执行补料
            feeding_start = datetime.datetime.now()  # 补料开始时间为当前时间
            InitFeed1Vol = feed_vol_1  # 标记初始补料体积
            feed1_SP = 999  # 泵1转速
            feed2_SP = 0  # 泵2转速
        else:
            feed1_SP = 0
            feed2_SP = 0
    else:
        if feed_vol_1 - InitFeed1Vol >= single_vol_1:
            # 当前时间在运行周期内,但超出预设体积,停止补料
            feed1_SP = 0
            InitFeed2Vol = feed_vol_2  # 标记初始补料体积
            feed2_SP = 999  # 泵2转速
            if feed_vol_2 - InitFeed2Vol >= single_vol_2:
                feed2_SP = 0
        else:
            # 当前时间在补料时长内,继续补料
            feed1_SP = 999
            feed2_SP = 0

    return feed1_SP, feed2_SP
💡 很好,但是没有考虑到在满足条件进行补料的时候也会实时调用这个程序,而此时feeding_start已经更新,下一秒调用,所有泵又都会停止
import datetime

# 全局变量
feeding_start = datetime.datetime.now() - datetime.timedelta(seconds=18000)  # 跳过首次
InitFeed1Vol = 0
InitFeed2Vol = 0
feed1_SP = 0
feed2_SP = 0
feeding_status = False  # 新增:补料状态标记

def pass_feeding(run_time, feed_vol_1, feed_vol_2, DO_SP):
    global feeding_start, InitFeed1Vol, InitFeed2Vol, feed1_SP, feed2_SP, feeding_status

    # 超参数
    min_run_time = 6.0  # 最短发酵培养时间h
    max_run_time = 1000   # 最长发酵培养时间h
    single_vol_1 = 1000  # 泵1单次上料体积
    single_vol_2 = 800  # 泵2单次上料体积
    passage_duration = datetime.timedelta(hours=5)  # 检查时间间隔

    # 如果运行时间不处于触发时间范围内,则不补料
    if run_time < min_run_time or run_time > max_run_time:
        return 0, 0

    # 判断是否超过了静默时间
    if datetime.datetime.now() - feeding_start >= passage_duration and not feeding_status:
        if DO_SP >= 30:  # 如果满足条件,执行补料
            feeding_start = datetime.datetime.now()  # 补料开始时间为当前时间
            InitFeed1Vol = feed_vol_1  # 标记初始补料体积
            feed1_SP = 999  # 泵1转速
            feed2_SP = 0  # 泵2转速
            feeding_status = True  # 开始补料
        else:
            feed1_SP = 0
            feed2_SP = 0
    else:
        if feed_vol_1 - InitFeed1Vol >= single_vol_1:
            # 当前时间在运行周期内,但超出预设体积,停止补料
            feed1_SP = 0
            InitFeed2Vol = feed_vol_2  # 标记初始补料体积
            feed2_SP = 999  # 泵2转速
            if feed_vol_2 - InitFeed2Vol >= single_vol_2:
                feed2_SP = 0
                feeding_status = False  # 结束补料
        else:
            # 当前时间在补料时长内,继续补料
            feed1_SP = 999
            feed2_SP = 0

    return feed1_SP, feed2_SP