【问题标题】:While loop cycle not satisfying requirementswhile循环循环不满足要求
【发布时间】:2021-07-20 08:15:49
【问题描述】:

我正在使用模数转换器测量电池的参数(电流、电压等)。 “While 循环”循环还包含在此上下文中未显示的测量函数,因为这不是我的问题的一部分。

使用下面的代码,我试图计算循环的每次迭代 (Ahinst) 的安培/小时,只需将测量的电流乘以两次测量之间经过的时间。我还总结了 Ah 以获得从电池中耗尽的累积值 (TotAh)。仅当电流 (P2) 为负值(电池未处于充电模式)时,才会显示最后一个值。当电流(P2)反向进入充电模式时,我清除 TotAh 并只显示 0。

timeMeas=[]
currInst=[]
Ah=[]
TotAh=0

while(True):
    try:

 #measurements routines are also running here
    #......................

 #Ah() in development
     
     if (P2 < 0):                #if current is negative (discharging)
        Tnow = datetime.now()    #get time_start reference to calculate elapsed time until next current measure  
        timeMeas.append (Tnow)   #save time_start
        currInst.append (P2)     #save current at time_start
                
    
     if (len(currInst) >1):              #if current measurements are two
        elapsed=(timeMeas[1]-timeMeas[0]).total_seconds() #calculate time elapsed between two mesurements
        Ahinst=currInst[1]/3600*elapsed  #calculate Ah per time interval
        Ah.append(Ahinst)                #save Ah per time interval
        TotAh=round(sum(Ah),3)* -1       #update cumulative Ah
        timeMeas=[]                      #cleanup data in array
        currInst=[]                      #cleanup data in array
        
     elif (P2 > 0):
            TotAh=0
            Ah=[]
            
            
            
            time.sleep(1)
except KeyboardInterrupt:
    break

代码正在运行,但显然没有给我正确的结果,因为在第二个“if”条件下,我总是清除两个数组(timeMeas 和 CurrInst)。由于计算需要至少两个实际测量值“if (len(currInst)>1)”才能工作,因此清除两个数组会导致在循环的每次迭代中丢失一个测量值。我曾考虑在每次迭代时将数组中的值位置从 0 移到 1,但这会在 P2 值反转为充电然后再次放电模式后重新启动循环时导致计算错误。

我对编码和出于爱好而做这件事非常生疏。我正在努力寻找一个解决方案,在每个周期用实际值计算“Ahinst”。 任何帮助表示赞赏。谢谢

【问题讨论】:

  • 由于while(True):try:之间没有缩进,显示的代码会报错。代码中还有其他缩进错误。
  • @Someprogrammerdude,抱歉。它与过去的副本有关。我尝试修复它。但是脚本正在我的 Pi 上运行
  • 有点猜想,但我想你会想要timeMeas = [timeMeas[-1]]currInst = [currInst[-1]]。这样,您测量的最后一个值就是您下次测量的第一个(也是唯一一个)值。
  • @9769953,这是真的。我需要肯定地改变它。我仍然需要在某个阶段清除数组。我不确定这是否足以使测量结果正确。我试试。谢谢

标签: python


【解决方案1】:

如果您只想保留两个测量值(当前和上一个),您可以保留大小为 2 的数组,并在循环末尾添加 idx = 1 - idx 以使其在 0 和 1 之间触发。

timeMeas = [None, None]
currInst = [None, None]
TotAh = 0.0

idx = 0

while True:  # no need for parentheses
    try:     
     if (P2 < 0):
        Tnow = datetime.now()
        timeMeas[idx] = Tnow
        currInst[idx] = P2
    
     if currInst[1] is not None:  #meaning we have at least two measurements
        elapsed = (timeMeas[idx]-timeMeas[1-idx]).total_seconds()
        TotAh + = currInst[idx]/3600*elapsed

     elif (P2 > 0):  # is "elif" really correct here?
            TotAh = 0.0
            # Do we want to reset these, too?
            timeMeas = [None, None]
            currInst = [None, None]

            # should this really be inside the elif?
            time.sleep(1)

     idx = 1 - idx

except KeyboardInterrupt:
    break

在某种意义上,拥有两个dict变量currprev会更简单,并在启动或重置它们时设置prev = None。然后只需在循环结束时设置curr = prev,并在每次迭代中使用新值填充curr,例如curr['when'] = datetime.now()curr['measurement'] = P2

【讨论】:

  • 谢谢一百万。我正在尝试采用您的脚本。但是随着时间的流逝,有些东西不起作用。 file.io/YxSuKQzidd5d它来回前进
  • 链接显示“文件已删除”。
  • 我想elapsed = abs((timeMeas[1]-timeMeas[0]).total_seconds()) 可以替换为elapsed = (timeMeas[idx]-timeMeas[1-idx]).total_seconds()
  • 感谢您的编辑。我相信 abs() 应该不再是必要的,所以我也把它拿出来了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-18
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 2019-01-29
  • 2013-11-22
相关资源
最近更新 更多