#本例程使用 pyvisa 库来实现通过 USBTMC 或 VXI-11 LAN 通信 SCPI 协议控制可编程直流电源
#需安装 pyvisa 库  pip install pyvisa
#工具通讯模式，可在USB和LAN之间切换通通信，可设置任意电压电流并返回输出端子实际电压、电流、功率值
# 版本号：V1.0.20240913


import pyvisa
import time

# 配置VISA资源
visa_resource = 'USB0::0x0483::0x5740::ADP3523420090::INSTR'  # 根据实际情况修改资源名称
# visa_resource = 'TCPIP0::192.168.1.100::INSTR'  # 如果使用LAN通信，修改为相应的IP地址

def create_visa_client(resource, timeout=5000):
    """
    创建VISA客户端。
    
    :param resource: VISA资源名称
    :param timeout: 超时时间（毫秒）
    :return: VISA客户端实例
    """
    rm = pyvisa.ResourceManager()
    client = rm.open_resource(resource)
    client.timeout = timeout  # 设置超时时间
    return client

def test_connection(client):
    """
    测试与设备的连接。
    
    :param client: VISA客户端实例
    """
    try:
        # 发送查询设备ID的命令
        response = client.query('*IDN?')
        print(f"设备ID: {response}")
    except Exception as e:
        print(f"发生错误: {e}")

def set_output(client, channel, voltage, current):
    """
    设置指定通道的输出电压和电流。
    
    :param client: VISA客户端实例
    :param channel: 通道号
    :param voltage: 输出电压 (V)
    :param current: 输出电流 (A)
    """
    client.write(f':INST:NSEL {channel}')  # 选择通道
    client.write(f':VOLT {voltage}')       # 设置电压
    client.write(f':CURR {current}')       # 设置电流
    client.write(':OUTP ON')               # 开启输出
    print(f"通道{channel}设置为 {voltage}V, {current}A 并开启输出")

def read_output(client):
    """
    读取指定通道的当前电压、电流和功率。
    
    :param client: VISA客户端实例
    :param channel: 通道号
    :return: 电压 (V), 电流 (A), 功率 (W)
    """
 #   client.write(f':MEAS')  # 选择通道
    voltage = float(client.query(':MEAS:VOLT? CH1'))  # 读取电压
    current = float(client.query(':MEAS:CURR? CH1'))  # 读取电流
    power = float(client.query(':MEAS:POWE? CH1'))     # 读取功率
  #  client.write(f' CH{channel}')  # 选择通道
    return voltage, current, power

def main():
    try:
        # 创建VISA客户端，增加超时时间
        client = create_visa_client(visa_resource, timeout=5000)

        try:
            # 测试连接
            test_connection(client)

            # 设置通道1输出5V、5A
            set_output(client, 1, 5.0, 5.0)
            print(1)
            # 等待一段时间
            time.sleep(2)
            print(1)
            # 读取当前的电压、电流和功率
            voltage, current, power = read_output(client)
            print(f"当前电压: {voltage} V, 电流: {current} A, 功率: {power} W")

        except Exception as e:
            print(f"发生错误: {e}")

    finally:
        # 关闭VISA客户端
        client.close()

if __name__ == "__main__":
    main()