【问题标题】:Connecting via USB/Serial port to Newport CONEX-PP Motion Controller in Python在 Python 中通过 USB/串行端口连接到 Newport CONEX-PP 运动控制器
【发布时间】:2016-06-19 18:57:52
【问题描述】:

我无法让我的 Windows 7 笔记本电脑与 Newport CONEX-PP motion controller 通话。我已经尝试过 python (Spyder/Anaconda) 和一个名为 Termite 的串行端口流媒体程序,无论哪种情况,结果都是相同的:设备没有响应。最终目标是使用 python 与控制器进行通信。

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

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

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)

最后一行返回:

Traceback(最近一次调用最后一次):

文件“”,第 2 行,在 结果,响应,errString = myPP.SR_Get(1)

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

我猜这是因为各种模块引用在某些方面很混乱。但我不知道,我对 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() 命令返回:

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

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

(4L, )

如果我要“我的”对象mine.__dict__ 的字典,我会得到:

{'connect': , '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 小时后,我没有想法了。

【问题讨论】:

    标签: python python-2.7 serial-port


    【解决方案1】:

    在以新的眼光回来并找到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 来计算停止位设置 - 或至少一个有效的设置。

    【讨论】:

    • 嗨,我正在尝试将我的 newport conex AGAP 控制器与 python 连接。你的回答很有帮助。 newport 网站中的 python 示例不完整。如果您有更多说明/信息,请给我链接。我会试试你的代码
    • @hsinghal 我不听你的问题。您在连接设备时遇到问题吗?或者用python编程让它做你想做的事?
    • 我相信上面显示的示例适用于 python 2.x,我现在正在运行 python 3.5。那有区别吗。我尝试了您的代码,但它不适用于我的设备。它是 Newport 的压电控制器。我可以打开端口检查状态关闭但没有成功的读写。控制器似乎使用 RS 485。我可以使用 newport 软件使用镜像安装。 python没有成功。请帮忙。
    • Newport 已将他们的 nstruct 软件存档,我将尝试安装该软件,然后重试。
    • Thaks,它适用于上述条件我使用过此代码 1. 将序列导入为 s 2. 从时间导入睡眠 3. 尝试:4. s.Serial.close() 5. 除外:6。通过 7.ser = 8. s.Serial('com5',baudrate=921600,timeout=1.0,parity=s.PARITY_NONE, stopbits=s.STOPBITS_ONE, bytesize=s.EIGHTBITS) 9. command='1PA U0.00 \r\n' 10. bcommand=bytes(command,'UTF-8') 11. a=ser.write(bcommand) 12. sleep(0.1) 13. print(ser.read(10)) 14. ser. close(),这会移动电机但没有返回任何东西。然而1TS之类的读取命令呢?返回字节数组
    【解决方案2】:

    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=''�
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-04
      • 2012-12-25
      • 2019-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多