以下是我的设置摘要:
最终目标是在C#中创建一个UI来启动CNC运行的自动化测试周期。在python程序中有一个Cnc
对象,用于存储设备当前位置并包含定位方法它到某个地方。
问题是如果我每次想要移动CNC时都运行一个新脚本,我必须重新初始化Cnc
实例,它会忘记它的位置。所以我想知道我是否可以运行一个包含唯一Cnc
实例的主程序,然后当远程机器想要告诉CNC移动时,它可以运行不同的脚本与argz用于新位置python action.py x y z
。然后,此脚本可以与主程序通信,以将move
方法调用到适当的位置,而无需重新构造新的Cnc
对象。
然后理想情况下,主程序将指示动作何时完成并将消息发送回“动作”脚本,该脚本将输出一些信息告诉远程系统动作已完成,然后它将退出,准备再次调用用新的argz。
最后,远程系统从任何工作中得到高度抽象,只需要开始运行主服务器,然后在想要执行运动的任何时候使用argz运行移动脚本。
注意: 我的另一个想法是只保存一个包含当前位置的文本文件,然后始终使用文件中的信息重新初始化实例。
编辑:已解决......有点
handler.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
动作传递器将接受命令行参数,将其写入input.txt,然后等待output.txt读取'1',之后它将打印完成并退出。
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")
答案 0 :(得分:2)
一种可能的方法可能是使用Flask或Bottle等主要python脚本成为webapp。你的应用程序初始化cnc,然后等待HTTP输入,可能在像'move'这样的端点上。然后,您的C#应用程序只会发送一个REST请求(HTTP),以便像{'coordinates': [10,15]}
一样移动,并且您的应用会对其进行操作。
答案 1 :(得分:2)
如果你真的想变得简单,那么就让你的#34;主要" CNC脚本读取文件系统上的指定目录,查找具有一个或多个命令的文本文件。如果有多个文件,请获取最早的文件并执行命令。然后删除该文件(或将其移动到另一个目录)并获取下一个文件。如果没有文件,请休眠几秒钟并再次检查。重复广告恶心。然后你的C#应用程序只需要将命令文件写入正确的目录。
答案 2 :(得分:1)
你最好的办法是将gevent与GIPC https://gehrcke.de/gipc/
结合起来这允许对堆栈进行异步调用,以及在不同进程之间进行通信。