我有两个上料泵,一个发酵缸, 目标是每隔固定的时间间隔(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
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