#使用教程：
#1.安装pyvisa库
#2.安装pandas库
#3.将UNIT数字电桥连接到电脑
#4.将UNIT数字电桥的USB口连接到电脑的USB口

import pyvisa
import pandas as pd
import time

rm = pyvisa.ResourceManager()
rm.list_resources()
bridge = rm.open_resource('USB0::0x4843::0x3755::120D21880::INSTR')
# 读取设备ID
print("设备ID:", bridge.query('FETCh[:IMPedance]?'))


def main():
    # 初始化资源管理器

    try:
        # 连接到UTR283数字电桥


        # 设置终端字符串
        bridge.write_termination = '\n'
        bridge.read_termination = '\n'



        # 创建一个空的DataFrame来存储测试结果
        results = []

        # 测试Cp模式
        test_capacitance(bridge, 'CPD', results)
        time.sleep(1)  # 等待1秒以确保设备稳定

        # 测试Cs模式
        test_capacitance(bridge, 'CSD', results)

        # 将结果写入CSV文件
        df = pd.DataFrame(results, columns=['Mode', 'Capacitance (F)', 'Resistance (Ω)'])
        df.to_csv('capacitance_test_results.csv', index=False)
        print("测试结果已保存到capacitance_test_results.csv")

    except pyvisa.VisaIOError as e:
        print(f"VisaIOError: {e}")
    except Exception as e:
        print(f"Unexpected error: {e}")
    finally:
        # 关闭连接
        if 'bridge' in locals() and bridge is not None:
            bridge.close()

def test_capacitance(bridge, mode, results):
    """测试电容并记录结果"""
    print(f"测试模式: {mode}")

    # 设置测量模式
    set_measurement_mode(bridge, mode)

    # 读取当前测量模式
    current_mode = get_measurement_mode(bridge)
    print(f"当前测量模式: {current_mode}")

    # 读取电容值
    capacitance = read_measurement(bridge, 'CAP')
    print(f"当前电容值: {capacitance} F")

    # 读取电阻值
    resistance = read_measurement(bridge, 'RES')
    print(f"当前电阻值: {resistance} Ω")

    # 记录结果
    results.append([current_mode, capacitance, resistance])

def set_measurement_mode(bridge, mode):
    """设置测量模式"""
    valid_modes = ['CPD', 'CSD']
    if mode.upper() not in valid_modes:
        raise ValueError(f"Invalid mode: {mode}. Valid modes are: {valid_modes}")
    bridge.write(f'FUNCtion:IMPedance[:TYPE] "{mode}"')

def get_measurement_mode(bridge):
    """读取当前测量模式"""
    return bridge.query('FUNCtion:IMPedance[:TYPE]?').strip().strip('"')

def read_measurement(bridge, parameter):
    """读取测量结果"""
    if parameter.upper() == 'CAP':
        return float(bridge.query('FETCh[:IMPedance]?'))
    elif parameter.upper() == 'RES':
        return float(bridge.query('FETCh[:IMPedance]?'))
    else:
        raise ValueError(f"Invalid parameter: {parameter}")

if __name__ == "__main__":
    main()

