如何确保两个语句在一致的时间内执行



我正在用Python3脚本控制一个工业机器人和一些测试设备。我几乎所有的时间关键功能都是由硬件处理的,但这两条语句确实需要在一致的时间内执行:

if True == daq.readChannelsStart(channel_settings):
titan_rtde.Move(setp_list[step])

DAQ开始和机器人移动之间有10-15ms的变化。

这两个功能都通过专用以太网与4个设备进行通信,这些设备只由运行Python脚本的PC进行轮询,所以我希望延迟是一致的(尽管我想我还没有嗅探流量来证明这一点(。传递给这些方法的数据变化不大,所以我希望它们的执行时间是一致的,只要它们不被操作系统中断(Windows 10 Enterprise 2016 LTSB(。

我能做些什么来减少这种可变性吗?

我能做些什么来减少这种可变性吗?

tl;医生:没有。

从执行的意义上讲,这看起来像是好代码在检查和移动命令之间几乎没有任何内容,只是一个裁判和一个判罚。您可以无条件地提前分配temp = setp_list[step]到检查,然后在检查成功时传入缓存的结果。这可以减少L2高速缓存未命中的一些可变性,但我无法想象它会产生多大的影响。

查看move命令内部的以验证是否存在条件增加方差的表达式。

你也许可以让整件事跑得更快,通过将其推入Cython或Rust模块,可以降低方差。但是,在没有分析抖动来自哪里的情况下,很难想象会有这么大的影响。


您可以做的最重要的更改是将调度添加到API。最好在机器人端,如果它是可变的。这个想法是接受延迟,并按照时间表做事。

想象一下移动代码是这样的:

def Move(self, sl):
if random_choice():
do_stuff()  # Sometimes do important housekeeping
sleep(random())  # which takes varying amount of time.
send_move_command(sl)

让我们把它放在一个时间表上:

def Move(self, sl, latency=.015):
t0 = time()
t1 = t0 + latency  # scheduled time to execute the move
if ...
sleep(max(0, t1 - time()))
send_move_command(sl)

现在,只要内务管理消耗的latency几秒钟后,我们就可以成功地向外部观察者隐藏它,表现出低方差。

在理想的世界里,机器人会被送到a";从时间戳t1开始移动";命令


想象一下,机器人有时会执行4毫秒不能被中断的操作,从而增加了方差。如果你在一段时间内试图移动,那你就不走运了当它正在执行时。假设几十毫秒将过去在它尝试重复该操作之前。

探测机器人以确定何时进行该操作目前正在发生。用它来预测";"好";发送移动命令的时间。


施加外部时钟信号。

使用555定时器在方便的时候产生脉冲间隔,可能是1PPS,每秒一个脉冲。使定时信号可用于DAQ和机器人。

时钟信号低时,禁止机器人运动。仅在电量不足时发送移动命令。现在,运动只会在时钟上升的边缘开始。考虑在下降边缘进行DAQ交互。

最新更新