如何将数据从 LabView 发送到 Python 并返回结果?
9 回答
另一种解决方案是使用智能消息传递库ZeroMQ,它带有很多绑定,几乎适用于所有主要语言。
对于 Python/Labview 案例,sourceforge 上有一个不错的演示项目:
#-----------------------------------------# INFRASTRUCTURE for communication
context = zmq.Context() # I/O-DAEMON CONTEXT
socket = context.socket(zmq.REP) # ARCHETYPE for a Smart Messaging
socket.bind( "tcp://127.0.0.1:5555" ) # PORT ready for LabView to .connect()
#-----------------------------------------# TRANSPORT-CLASS-es {ipc|tcp|+..}
while True: # LOOP & WAIT FOR REQ-calls
# # Wait for request from client
message = socket.recv()
print("Received request: %s" % message )
try:
r = eval( message )
print(r )
socket.send(bytearray(str( r ),
'utf-8' )) # send returned value as bytearry to client
except NameError:
socket.send( b"Unknown command" )
except:
socket.send( b"Unknown error" )
LabView 允许您使用多种语言编写扩展程序,如今的主要技术是使用网络连接。避免使用在 labview 进程本身内部运行的本地语言工具包。
这里似乎有一个 Python Labview 工具包,但它不再有效。
使用套接字服务器和套接字客户端在 Labview 和 python 之间进行对话。(大多数跨平台解决方案,现在您不必让您的 python 和 labview 在同一台 PC 或同一进程中运行)。
不幸的是,由于我没有安装 labview,目前我无法提供一个示例,但我已经完成了从 LabView 到两种或三种语言的数十个应用程序的基于自动化的集成,但那是很多年前的事了。这些天我会使用网络套接字技术。
LabVIEW 2018 现在提供了一种“原生”解决方案,可以通过来回“发送数据”从 LabVIEW 调用 Python 代码:
连接选板包括新的 Python 子选板,您可以使用它从 LabVIEW 代码调用 Python 代码。Python 调色板包括以下函数:
- 打开 Python 会话 — 使用特定版本的 Python 打开 Python 会话。
- Python 节点 - 直接调用 Python 函数。
关闭 Python 会话 — 关闭 Python 会话。
注 您必须安装 Python 2.7 或 3.6 才能使用 LabVIEW Python 函数。尽管不受支持的版本可能适用于 LabVIEW Python 函数,但 NI 建议仅使用受支持的 Python 版本。
Python 节点提供了模块路径、函数名、输入参数和返回值的预期数据类型。这些输入和输出支持许多基本数据类型:数字、(多维)数组、字符串、簇;自动转换为相应的数据类型,即将LabVIEW数组转换为Python列表,将簇转换为元组(返回值反之亦然)。
我在 Python 进程中使用 stdio 通信有一段时间了,最近注意到 Python for .Net ( http://pythonnet.github.io/ ) 对我有用。
只需将 .dll 复制到您的 LabVIEW 项目中,创建 .Net 构造函数,然后使用 LabVIEW .Net,您就可以快速了解如何使用该库,它基本上为您提供了非托管 Python 共享库,并带有 .Net 的优点。
Python-LabVIEW-Interface (PyLVi)是一个基于ZeroMQ库的开源项目,用于调用 Python 函数并将结果读回 LabVIEW。
它支持调用类方法和属性,并且可以处理结构化数据类型(例如 Python 字典映射到 LabVIEW 集群)以及 numpy 数组。
使用 Python 的服务器端
import socket
server = socket.socket(2,1)
server.bind(('localhost',2000))
server.listen(1)
while True :
(conn,addr) = server.accept()
command = conn.recv(4)
print (command)
if 'INIT' in str(command):
conn.sendall(b'INIT-DONE')
elif 'PLAY' in str(command):
conn.sendall(b'PLAY-DONE')
elif 'QUIT' in str(command):
conn.sendall(b'QUIT-DONE')
break
server.close()
有一个新的 Python/LabVIEW 连接器,主要由您真正构建,称为TestScript。它是一个完全双向的免费、源代码发布的 Python/LabVIEW 连接器。您可以在 Python 脚本中控制 LabVIEW,也可以从 LabVIEW 中调用 Python 脚本。它附带了几个示例,说明如何将数据从 LabVIEW 发送到 Python 并返回结果。特别是,简单脚本示例 - 在 Python Side.vi 上添加显示了 TestScript 如何完成您所需要的。
享受!
你可以试试这个:https ://forums.ni.com/t5/LabVIEW-APIs-Documents/Open-Python-Interface/ta-p/3612981
它是一个用于 LabVIEW 的开放 Python 接口工具包。
这是一个很好的快速解决方案,但有点不雅。只需使用 labview 和 python 都可以读取/写入的文本文件。Labview 将命令写入文本文件,python 等到命令被读取,反之亦然。您可以同时拥有一个读取文本文件和一个写入文本文件。然而,这是一个较慢的解决方案,因为读取和写入需要时间。