打印不符合数据间隔设置

时间:2019-11-22 09:35:52

标签: python while-loop

我正在使用此答案here,并且我有这段代码可以获取应变计信号(2个通道),然后应用校准步骤,然后打印2个通道和当前时间。但看起来打印结果与我在代码中使用的频率不匹配。

from time import sleep
from Phidget22.Phidget import *
from Phidget22.Devices.VoltageRatioInput import *
import time
import datetime

TIME_OUT = 5000 #5s beofre it throws a timeout exception 
DATA_INTERVAL = 50 #50ms sample frequency 

A0 = -6.128983223994E-06
B0 = -0.000059639277340

A1 = -6.101017778744E-06
B1 = -0.000286467338645

def onVoltageRatioChange0(self, voltageRatio):
    Masse = (voltageRatio - (B0) ) / (A0)
    self.masse = Masse

def onVoltageRatioChange1(self, voltageRatio):
    Masse = (voltageRatio - (B1) ) / (A1)
    self.masse = Masse

def results():
        voltageRatioInput0 = VoltageRatioInput()
        voltageRatioInput0.masse = 0
        voltageRatioInput0.setChannel(0)
        voltageRatioInput0.setOnVoltageRatioChangeHandler(onVoltageRatioChange0)
        voltageRatioInput0.openWaitForAttachment(TIME_OUT)
        voltageRatioInput0.setBridgeGain(BridgeGain.BRIDGE_GAIN_128)
        voltageRatioInput0.setDataInterval(DATA_INTERVAL)

        voltageRatioInput1 = VoltageRatioInput()
        voltageRatioInput1.masse = 0
        voltageRatioInput1.setChannel(1)
        voltageRatioInput1.setOnVoltageRatioChangeHandler(onVoltageRatioChange1)
        voltageRatioInput1.openWaitForAttachment(TIME_OUT)
        voltageRatioInput1.setBridgeGain(BridgeGain.BRIDGE_GAIN_128)
        voltageRatioInput1.setDataInterval(DATA_INTERVAL)

        print(str(datetime.datetime.now()) + " / " + str(voltageRatioInput0.masse) + " / " + str(voltageRatioInput1.masse))

        voltageRatioInput0.close()
        voltageRatioInput1.close()

if __name__ == '__main__':
    try:
        while True:
            results()

    except KeyboardInterrupt:
        print("Goodbye")
        pass

因此,通常使用voltageRatioInput0.setDataInterval(DATA_INTERVAL)应该以20 hz的频率打印该值。但这显示了我:

2019-11-22 10:24:59.460503 / -0.03847266852956798 / 0.2918630004986786
2019-11-22 10:25:00.099831 / -0.03695316689942101 / -0.02070779820379342
2019-11-22 10:25:00.772398 / -0.04029613574942367 / 0.28775155534154484
2019-11-22 10:25:01.420283 / -0.043487203384171676 / 0.25676361089420047

很明显,这里我没有20 Hz ...

1 个答案:

答案 0 :(得分:0)

您的result()函数中可能花费了大量时间。我不能在这里复制,而是一个简单的

python -m cProfile -s tottime your_program.py

应该可以帮助您了解每次循环迭代花费的大部分时间。

我猜想VoltageRatioInput()VoltageRatioInput.close()的实例化是一个很好的开始。您可以尝试将它们带出循环吗?

from Phidget22.Phidget import *
from Phidget22.Devices.VoltageRatioInput import *
import datetime

TIME_OUT = 5000 #5s beofre it throws a timeout exception 
DATA_INTERVAL = 50 #50ms sample frequency 

A0 = -6.128983223994E-06
B0 = -0.000059639277340

A1 = -6.101017778744E-06
B1 = -0.000286467338645

def onVoltageRatioChange0(self, voltageRatio):
    Masse = (voltageRatio - (B0) ) / (A0)
    self.masse = Masse

def onVoltageRatioChange1(self, voltageRatio):
    Masse = (voltageRatio - (B1) ) / (A1)
    self.masse = Masse

def results(voltageRatioInput0, voltageRatioInput1):
        voltageRatioInput0.masse = 0
        voltageRatioInput0.setChannel(0)
        voltageRatioInput0.setOnVoltageRatioChangeHandler(onVoltageRatioChange0)
        voltageRatioInput0.openWaitForAttachment(TIME_OUT)
        voltageRatioInput0.setBridgeGain(BridgeGain.BRIDGE_GAIN_128)
        voltageRatioInput0.setDataInterval(DATA_INTERVAL)

        voltageRatioInput1.masse = 0
        voltageRatioInput1.setChannel(1)
        voltageRatioInput1.setOnVoltageRatioChangeHandler(onVoltageRatioChange1)
        voltageRatioInput1.openWaitForAttachment(TIME_OUT)
        voltageRatioInput1.setBridgeGain(BridgeGain.BRIDGE_GAIN_128)
        voltageRatioInput1.setDataInterval(DATA_INTERVAL)

        print(str(datetime.datetime.now()) + " / " + str(voltageRatioInput0.masse) + " / " + str(voltageRatioInput1.masse))


if __name__ == '__main__':
    try:
        voltageRatioInput0 = VoltageRatioInput()
        voltageRatioInput1 = VoltageRatioInput()

        while True:
            results(voltageRatioInput0, voltageRatioInput1)

        voltageRatioInput0.close()
        voltageRatioInput1.close()

    except KeyboardInterrupt:
        print("Goodbye")