以下是我的设置摘要:
最终目标是让C#中的UI启动一个自动测试周期,让数控系统在其中运行。在python程序中,有一个Cnc对象存储设备当前位置,并包含将其定位到特定位置的方法。
问题是,如果我每次想移动数控时运行一个新脚本,我必须重新初始化Cnc实例,它会忘记它的位置。所以,我想知道是否可以有一个主程序运行,其中包含一个也是唯一的Cnc实例,那么当远程机器想让数控系统移动时,它可以运行一个不同的脚本,用argz表示新位置的python action.py x y z。然后,这个脚本可以与主程序通信,将move方法调用到适当的位置,而无需重新构造一个新的Cnc对象。然后,理想情况下,主程序将指示运动何时完成,并向" action“脚本发回一条消息,该脚本将输出一些东西来告诉远程系统操作已经完成,然后退出,准备再次使用新的argz调用。
最后,远程系统从任何工作中被高度抽象出来,只需要开始运行主程序,然后在任何时候使用argz运行移动脚本。
注意:我的另一个想法是用当前位置保存一个文本文件,然后始终用文件中的信息重新初始化实例。
编辑:解决了..。一种
handler.py
处理程序将继续从名为input.txt的文本文件中读取数据,寻找新的整数。如果收到,它将更新一个名为output.txt的文本文件以读取'0',然后对输入执行一些操作(即移动数控),然后将'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',然后它将打印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")发布于 2018-04-03 19:55:26
一种可能的方法可能只是使用类似于烧瓶或瓶的东西使您的主要python脚本成为一个webapp。您的应用程序初始化cnc,然后等待HTTP输入,可能是在像'move‘这样的端点上。然后,您的C#应用程序只发送一个REST请求(HTTP),以像{'coordinates': [10,15]}那样移动,您的应用程序就会对其进行操作。
发布于 2018-04-03 20:29:23
如果您真的想变得非常简单,请让您的“主”CNC脚本在文件系统上读取指定的目录,以查找具有一个或多个命令的文本文件。如果存在多个文件,请接受最早的文件并执行命令。然后删除该文件(或将其移动到另一个目录)并获取下一个文件。如果没有文件,睡几秒钟再检查一次。恶心地重复。然后,您的C#应用程序只需将一个命令文件写入正确的目录。
发布于 2018-04-05 19:43:15
您最好的选择是将GIPC与GIPC https://gehrcke.de/gipc/结合起来。
这允许对堆栈进行异步调用,并允许在不同进程之间进行通信。
https://stackoverflow.com/questions/49638005
复制相似问题