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

时间:2016-03-06 04:40:40

标签: python python-2.7 serial-port

我无法让我的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)

最后一行返回:

  

追踪(最近一次呼叫最后一次):

     

档案"< ipython-input-2-5d824f156d8f>",第2行,in      结果,响应,errString = myPP.SR_Get(1)

     

TypeError:没有方法匹配给定的参数

我猜测这是因为各种模块引用在某些方面都很棘手。但我不知道,我对python来说比较新,而且我唯一一次用它来进行串口通信,供应商提供的示例文件只是起作用。

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

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()命令返回:

  

VisaIOError:VI_ERROR_TMO(-1073807339):操作完成前超时已到期。

相反,如果我写入端口mine.connect.write('VE'),连接器上的指示灯会闪烁红色,就像收到一些数据并返回一样:

  

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

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

  

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

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

也许有一些简单的我在这里失踪了。我安装了NI VISA,而且我不只是运行来自网站的DLL。哦,我发现了一个Github问题/答案with this exact problem,但最终结果毫无意义,在hgrecco告诉他使用" open_resource"之后线程被关闭了。这正是我正在使用的。

使用白蚁的结果是相同的,我显然可以连接到控制器并使灯光闪烁红色,但它永远不会通过白蚁或执行请求的操作做出响应。

我也试过过pySerial:

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

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

所以,如果有人对这个特定的运动控制器,Newport设备或一般的串口通信有任何经验,并且可以对这个问题有所了解,我非常感激。大约7个小时之后,我没有想法。

2 个答案:

答案 0 :(得分:2)

在用新鲜的眼睛回来并发现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)

并返回

  

' 1TS000033 \ r'

该字符串长度为9个字符,因此我随意选择的10个字符读取最终获取了一个终止字符。

问题在于,设备附带的或网站上提供的python文件最多是不完整的,不应该被任何信任。 GUI手册具有所需的波特率。我使用了Termite来确定停止位设置 - 或者至少有一个有效。

答案 1 :(得分:0)

3.5年后...

Here is a gist具有支持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=''�