目录

一、pyvisa 库以及NI的使用

二、自定义通讯类示例

一、pyvisa 库以及NI的使用

在 Python 里,pyvisa 库可用于和各种仪器(像频谱仪、信号发生器等)进行通信,借助 VISA(Virtual Instrument Software Architecture)标准达成。

推荐使用 NI-VISA软件可以进行仪表控制,你还需要安装对应的 VISA 后端。下图为NI软件的截图,如果已经连接上仪表,可以自动查询进行连接仪表。

下图为仪表连接界面(未连接仪表显示的是X),可以打开VISA测试面板,可以输入SCPI指令对仪表进行控制,如果OK,仪表会出现你需要的状态,如果Fail,会返回错误码,根据错误码进行排查问题。

二、自定义通讯类示例

对于pyvisa 库,可以构建自定义的类,输入仪表IP/GPIB就可以连接仪表,创建打开仪表/关闭仪表/下发指令/读取返回值的方法,后续所有对于仪表的SCPI指令操作都可以用此类实例化,对函数进行操作。

下面为IP地址的简单示例:

# -*- coding: utf-8 -*-
import time
try:
    import pyvisa as visa
except:
    import visa
from pyvisa import errors, constants

# constants模块定义了许多与VISA(Virtual Instrument Software Architecture)规范相关的常量。
# 这些常量在与仪器进行通信时,用于指定不同的参数和配置,例如超时时间、数据传输模式等。


class VisaCommunication(object):

    def __init__(self, ip):
        self.ip = ip
        self.on = None  # 目的是为了看仪表端口是否打开

    def open(self, end='\r\n'):
        """
        :param end:指令最后加上的字符
        :return:
        """
        try:
            # 仪表通讯基础格式,可以参考NI连接是的通讯地址
            telnet_ip = f'TCPIP0::{self.ip}:: inst0:INSTR'
            resource_messager = visa.ResourceManager()
            communication = resource_messager.open_resource(telnet_ip, write_end=end)
            communication.timeout = 1000
            self.visa_communication = communication
            self.on = True
        except visa.errors.VisaIOError as e:
            print(f"VISA I/O 错误: {e}")
        except Exception as e:
            print(f"发生其他错误: {e}")

    def send(self, cmd, end='\r\n'):
        if cmd.find("?") != -1:
            result = self.visa_communication.query(cmd, write_end=end)
            time.sleep(0.1)
            return result
        size, status = self.visa_communication.write(cmd, write_end=end)
        if status != visa.constants.StatusCode.success:
            print("指令下发失败")
        time.sleep(0.05)
        return status == visa.constants.StatusCode.success
    # visa.constants.StatusCode.success 是 pyvisa 库中 constants 模块里的一个常量,
    # 它代表着与仪器通信时操作成功的状态码。

    def close(self):
        self.visa_communication.close()

复杂的通讯逻辑,请留言沟通。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐