首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何确保在一致的时间内执行两个语句?

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

Stack Overflow用户
提问于 2022-10-05 00:47:28
回答 1查看 53关注 0票数 1

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

代码语言:javascript
复制
if True == daq.readChannelsStart(channel_settings):
    titan_rtde.Move(setp_list[step])

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

这两个函数都是通过专用以太网网络进行通信的,只有运行Python脚本的PC才会对这些设备进行轮询,因此我希望延迟时间是一致的(虽然我没有嗅探通信量以证明这一点)。传递给这些方法的数据差别很大,所以我希望它们的执行时间是一致的,只要它们不会被操作系统(Windows 10 Enterprise 2016 LTSB)打断。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-05 01:00:52

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

泰瑞:不,没有。

这看起来是一段很好的代码,因为在check和move命令之间几乎什么也不执行,只是一个de和一个调用。您可以在检查之前无条件地分配temp = setp_list[step],然后在检查成功时传递缓存的结果。这可能会减少L2缓存丢失的一些可变性,但我无法想象它会产生多大的影响。

查看一下move命令,以验证没有增加方差的条件表达式。

您可以通过将其推入Cython或Rust模块,从而使整个过程运行得更快,并且减少了方差。但同样,如果不分析抖动的来源,很难想象会有多大的效果大小。

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

假设移动代码如下所示:

代码语言:javascript
复制
    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)

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

代码语言:javascript
复制
    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秒,我们就可以成功地向外部观察者隐藏它,并显示出较低的方差。

在理想的世界中,机器人将被发送一个“从时间戳t1开始移动”命令。

假设机器人有时执行4毫秒的操作,不能被中断,从而增加了方差。当它执行的时候,如果你尝试移动的话,你就不走运了。假设在尝试重复操作之前,将经过数十毫秒。

探测机器人以确定该操作何时正在进行。用它来预测一个“很好”的时间来发送移动命令。

加一个外部时钟信号。

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

当时钟信号较低时,抑制机器人运动。只在低时发送移动命令。现在,运动只会在时钟上升的边缘开始。考虑在下降的边缘进行DAQ交互。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73954938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档