我使用的是借用的Python脚本,该脚本在get_data
外部定义的类中有两个函数定义(get_data_multiple
和main function
)。 main
函数调用get_data_multiple
,后者依次调用get_data
。简而言之,我的代码使用win32com模块(from win32com.client.dynamic import Dispatch
)获取Pi数据。
目标是每小时运行main
函数。我通过使用while True:
循环和time.time()
模块中的time
来做到这一点。在极少数情况下,我发现调用get_data
花费的时间太长,无法将返回值发送到get_data_multiple
。在这些情况下,我的代码在崩溃时崩溃了,到达main
的返回值已经过去了一个小时。
我想添加一个逻辑,在其中终止对get_data
的调用,如果其中的时间花费超过一定时间,则强制其返回默认值。我知道该函数在pi_values = tag.Data.InterpolatedValues2(t_start,t_end,t_interval,asynchStatus=None)
行中花费了太多时间。当我没有函数提供的返回值时,该怎么办?
def get_data(self,tag_name,t_start,t_interval):
"""Retrieve interpolated data from the PI-server
Args:
tag_name (str): PI tag name
t_start (str): PI time format (ex. '*-72h')
t_end (str): PI time format (ex. '*')
t_interval (str): PI time format (ex. '1h')
Returns:
pandas dataframe: index=datetime,col_1=interpolated values
"""
logger.info('get_data for tag `%s`' % tag_name)
tag = self.pi_srv.PIPoints(tag_name)
pi_values = tag.Data.InterpolatedValues2(t_start,asynchStatus=None)
return (self.pivalues_to_df(pi_values,tag_name))
def get_data_multiple(self,tags,t_interval):
"""Retrieve interpolated data from the PI-server for multiple tags
Args:
tags (list): List of PI tag names
t_start (str): PI time format (ex. '*-72h')
t_end (str): PI time format (ex. '*')
t_interval (str): PI time format (ex. '1h')
Returns:
pandas dataframe: index=datetime,cols=interpolated values
"""
logger.info('getting data for %s tags' % len(tags))
list_of_values = []
pBar = ProgressBar()
for i,tag in enumerate(tags):
print(i)
df = None
while df is None:
try:
df = self.get_data(tag,t_interval)
except:
print('Connection Timeout. Retring.....')
pass
# drop duplicated indices -> result of summer-to-winter time
# transition. Not doing this results in the subsequent join() to
# spiral out of control
df = df[~df.index.duplicated()]
list_of_values.append(df)
df_values = pd.DataFrame().join(list_of_values,how='outer')
#print(df_values.columns)
return df_values