通过 USB/Serial 端口连接到 Python 中的 Newport CONEX-PP 运动控制器

Connecting via USB/Serial port to Newport CONEX-PP Motion Controller in Python

我无法让我的 Windows 7 笔记本电脑与 Newport CONEX-PP motion controller 通话。我试过 python (Spyder/Anaconda) 和一个名为 Termite 的串行端口流式传输程序,两种情况下的结果都是一样的:设备没有响应。最终目标是使用 python.

与控制器通信

控制器通过他们卖给我的 USB 电缆连接到我的计算机,该电缆明确用于此设备。连接器有一对灯,当设备接收数据(红色)或发送数据(绿色)时会闪烁。该设备还附带一个打包的 GUI 程序,似乎运行良好。每个按钮我都没有试过,我试过的都有预期的效果。

用于访问此设备的文档几乎不存在。盒子里的 CD 有一种连接方式,上面链接的网页有一种不同的方式。第一种方式(开箱即用的 CD)创建一个模块层次结构,以它无法识别的模块结尾(这是 Newport 提供的代码片段):

import sys  
sys.path.append(r'C:\Newport\MotionControl\CONEX-PP\Bin')  
import clr  
clr.AddReference("Newport.CONEXPP.CommandInterface")  
from CommandInterfaceConexPP import *  
import System  
instrument="COM5"  
print 'Instrument Key=>', instrument  
myPP = ConexPP()  
ret = myPP.OpenInstrument(instrument)  
print 'OpenInstrument => ', ret  
result, response, errString = myPP.SR_Get(1)

最后一行returns:

Traceback (most recent call last):

File "< ipython-input-2-5d824f156d8f >", line 2, in result, response, errString = myPP.SR_Get(1)

TypeError: No method matches given arguments

我猜这是因为各种模块引用在某种程度上是古怪的。但我不知道,我对 python 比较陌生,而且我唯一一次将它用于串行通信,供应商提供的示例文件就可以正常工作。

第二种与控制器通信的方式是通过visa模块(CONEX_SMC_common模块导入visa模块):

import sys  
sys.path.append(r'C:\Newport\NewportPython')  
class CONEX(CONEXSMC): def __init__(self):  
    super(CONEX,self).__init__() device_key = 'com5'  
    self.connect=self.rm.open_resource(device_key, baud_rate=57600, timeout=2000, data_bits=8, write_termination='\r\n',read_termination='\r\n')  
mine.connect.read()  

最后一个 mine.connect.read() 命令 returns:

VisaIOError: VI_ERROR_TMO (-1073807339): Timeout expired before operation completed.

相反,如果我写入端口 mine.connect.write('VE'),连接器上的灯会闪烁红色,就好像它收到了一些数据,并且 returns:

(4L, < StatusCode.success: 0 >)

如果我请求 "mine" 对象 mine.__dict__ 的字典,我得到:

{'connect': <'SerialInstrument'(u'ASRL5::INSTR')>, 'device_key': u'ASRL5::INSTR', 'list_of_devices': (u'ASRL5::INSTR',), 'rm': )>}

VISA 的 ASRL5::INSTR 资源至少与控制器有关,因为当我从笔记本电脑上拔下设备时,它会消失并且 GUI 程序将停止工作。

也许我在这里遗漏了一些简单的东西。我安装了 NI VISA,我不只是 运行 来自网站的 DLL。哦,我找到了一个 Github 问题/答案 with this exact problem 但最终结果没有任何意义,在 hgrecco 告诉他使用 "open_resource" 后线程关闭,这正是我正在使用的。

使用 Termite 的结果是一样的,我显然可以连接到控制器并让灯闪烁红色,但它从不响应,无论是通过 Termite 还是通过执行请求的操作。

我也尝试过 pySerial:

import serial  
ser = serial.Serial('com5')  
ser.write('VE\r\n')  
ser.read()  

Python 永远等在那里,我想是因为我没有设置超时限制。

因此,如果有人对这个特定的运动控制器、Newport 设备或一般的串行端口通信有任何经验,并且可以阐明这个问题,我将不胜感激。大约 7 个小时后,我没有主意了。

在重新审视此问题并发现 this GitHub discussion 之后,我决定再试一次 pySerial,因为我的问题中的其他方法都没有用。以下代码有效:

import serial  
ser = serial.Serial('com5',baudrate=115200,timeout=1.0,parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS)  
ser.write('1TS?\r\n')  
ser.read(10)

和returns

'1TS000033\r'

该字符串有 9 个字符长,所以我任意选择的 10 个字符读取最终选择了终止字符之一。

问题是 python 设备附带的文件或网站上提供的文件充其量是不完整的,不应信任任何内容。 GUI手册有要求的波特率。我使用 Termite 找出停止位设置 - 或者至少是一个可行的设置。

3.5年后...

Here is a gist class 支持 Conex-CC

我花了好几个小时才解决这个问题!

我的设备是Conex-CC,不是PP,不过好像是一样的意思

对我来说,串行解决方案不起作用,因为串行端口绝对没有响应,无论是通过代码还是通过直接 TeraTerm 访问。

所以我试图让您的代码适应我的设备(因为对于 Conex-CC,甚至没有给出您尝试的代码!)。

重要的是要说import clr是基于pip install pythonnet而不是pip install clr,这会带来一些与颜色相关的东西。

收到你的错误后,我一直在寻找这个 Pythonnet 错误并找到了 this 答案,这让我找到了最终的解决方案:

import clr
# We assume Newport.CONEXCC.CommandInterface.dll is copied to our folder
clr.AddReference("Newport.CONEXCC.CommandInterface")
from CommandInterfaceConexCC import *

instrument="COM4"
print('Instrument Key=>', instrument)
myCC = ConexCC()
ret = myCC.OpenInstrument(instrument)
print('OpenInstrument => ', ret)
response = 0
errString = ''
result, response, errString = myCC.SR_Get(1, response, errString)
print('Positive SW Limit: result=%d,response=%.2f,errString=\'%s\''%(result,response,errString))
myCC.CloseInstrument()

这是我得到的结果:

Instrument Key=> COM4
OpenInstrument =>  0
Positive SW Limit: result=0,response=25.00,errString=''�