0

这是我的设置的摘要:

  • 3 轴 CNC,可通过运行在树莓派上的 python 脚本控制
  • Windows PC 可以连接到 pi 可以运行脚本

最终目标是让 C# 制作的 UI 启动 CNC 运行的自动化测试周期。在 python 程序中,有一个Cnc对象存储设备当前位置并包含将其定位到某个位置的方法。

问题是如果我每次想移动 CNC 时都运行一个新脚本,我必须重新初始化Cnc实例,它会忘记它的位置。所以我想知道我是否可以运行一个包含唯一Cnc实例的主程序,然后当远程机器想要告诉 CNC 移动它时,它可以使用 argz 为新位置运行不同的脚本python action.py x y z。然后,该脚本可以与主程序通信以将move方法调用到适当的位置,而无需重新构建新的Cnc目的。然后理想情况下,主程序会指示动作何时完成并向“动作”脚本发送回一条消息,该脚本会输出一些内容来告诉远程系统动作已完成,然后它会退出,准备再次调用与新的 argz。

最后,远程系统从任何工作中高度抽象,只需要开始运行主服务器,然后在它想要执行动作的任何时候使用 argz 运行移动脚本。

注意:我的另一个想法是只用当前位置保存一个文本文件,然后总是用文件中的信息重新初始化实例。

编辑:解决了......有点

处理程序.py

处理程序将不断地从名为 input.txt 的文本文件中读取以寻找新的整数。如果收到它将更新名为 output.txt 的文本文件以读取“0”,然后对输入执行一些操作(即移动 cnc),然后将值“1”写入 output.txt。

from time import sleep
cur_pos=0

while True:
    with open("input.txt","r") as f:
        pos=f.readline()
    try:
        if pos=='':
            pass
        else:
            pos=int(pos)
    except:
        print pos
        print("exititng...")
        exit()

    if cur_pos==pos or pos=='':
        #suggestion from @Todd W to sleep before next read
        sleep(0.3)
        pass
    else:
        print("Current pos: {0:d}, New pos: {1:d}".format(cur_pos,pos))
        print("Updating...")
        with open("output.txt","w") as f:
            f.write("0")
        #do some computation with the data
        sleep(2)
        cur_pos=pos
        print("Current pos: {0:d}".format(cur_pos))
        with open("output.txt","w") as f:
            f.write("1")

pass_action.py

action passer 将接受一个命令行参数,将其写入 input.txt,然后等待 output.txt 读取 '1',之后它将打印 done 并退出。

import sys
from time import sleep
newpos=sys.argv[1]
with open("input.txt","w") as f:
    f.write(newpos)

while True:
    sleep(0.1)
    with open("output.txt","r") as f:
        if f.readline()=='1':
            break

sys.stdout.write("done")
4

3 回答 3

2

一种可能的方法可能只是使用诸如 Flask 或Bottle之类的东西使您的主要 python 脚本成为 web 应用程序。您的应用程序初始化 cnc,然后等待 HTTP 输入,可能在像“移动”这样的端点上。然后,您的 C# 应用程序只需发送一个 REST 请求 (HTTP) 来移动{'coordinates': [10,15]},您的应用程序就会对其进行操作。

于 2018-04-03T19:55:26.733 回答
2

如果您真的想变得简单,让您的“主”CNC 脚本读取文件系统上的指定目录,寻找包含一个或多个命令的文本文件。如果有多个文件,则取最早的文件并执行命令。然后删除该文件(或将其移动到另一个目录)并获取下一个文件。如果没有文件,请休眠几秒钟并再次检查。重复恶心。然后您的 C# 应用程序只需将命令文件写入正确的目录。

于 2018-04-03T20:29:23.933 回答
1

您最好的选择是将 gevent 与 GIPC https://gehrcke.de/gipc/结合起来

这允许异步调用堆栈,以及不同进程之间的通信。

于 2018-04-05T19:43:15.363 回答