You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python配置安捷伦数据记录仪读取拉线式位移传感器电阻值

问题描述

我已将拉线式位移传感器(string pots)连接到安捷伦数据记录仪,尝试读取拉线位置移动时的电阻变化。直接从安捷伦显示屏读取位移时,能看到欧姆值的线性变化;但通过以下Python脚本读取时,结果变为电压信号,呈现上升后归零的状态(看似显示相对位移)。请问如何通过脚本获取欧姆单位的输出?

用户提供的代码:

import numpy as np
import pyvisa as visa 
import time
from datetime import datetime, date
import pandas as pd
import matplotlib.pyplot as plt
import time
import threading
import signal

instrument_address = 'USB0::0x0957::0x0507::MY50000230::0::INSTR' #Data logger address
def instrument(instrument_address: str, 
     instrument_access_protocol_name: str) -> object() :
     rm = visa.ResourceManager()
     instrument_access_protocol_name = rm.open_resource(instrument_address) 
     instrument_access_protocol_name.write('*RST')     
     instrument_access_protocol_name.write('*CLS')
     instrument_access_protocol_name.write(':DISPlay:STATe %d' % (0)) 
     instrument_access_protocol_name.timeout = 10000 
     return instrument_access_protocol_name

SP_ch = '3001:3002' #channels to read
SP_alfa = '1'
SP_resistance = '1' 
instrument_name = 'my_instrument'
my_instrument = instrument(instrument_address, instrument_name)
#channel list defined

def Scan_list(my_instrument: str, Channel_list: list):
      Channel_list = str(Channel_list)
      Channel_list = Channel_list.replace('[','').replace(']','').replace('','')
      separator = ''
      Scan_Channel_list = separator.join(['@',Channel_list])
      my_instrument.write(':ROUTe:SCAN (%s)' % (Scan_Channel_list))
      print('\n\nSetting up automated scan')
      print(':ROUTe:SCAN (%s)' % (Scan_Channel_list))
      my_instrument.query_ascii_values('READ?')

class SP:
    def __init__(self, instrument: str, SP_alfa: str, SP_resistance: str, SP_ch: str):
        self.instrument = instrument
        self.SP_alfa = SP_alfa
        self.SP_ch =''
        self.SP_ch = self.SP_ch.join(['@', SP_ch])
        self.SP_resistance = SP_resistance
        self.configureSP()
        self.senseSP()

    def configureSP(self):
        self.instrument.write('CONF:RES %s,%s' % (self.SP_ch, self.SP_resistance))
        print('\nString Pot configuration')
        print('CONF:RES %s,%s' % (self.SP_ch, self.SP_resistance))

    def senseSP(self):
        self.instrument.write(':SENSe:RESistance:OCOMpensated %d,%s' % (1, self.SP_ch))
        self.instrument.write(':SENSe:RESistance:RANGe %G,%s' % (10000.0, self.SP_ch))
        self.instrument.write(':SENSe:RESistance:RESolution %s,%s' % ('DEFault', self.SP_ch))
        self.instrument.write(':SENSe:RESistance:ZERO:AUTO %s,%s' % ('ON', self.SP_ch))

解决方案

问题核心原因有两个:

  1. 自动归零开启导致相对测量:代码中启用了:SENSe:RESistance:ZERO:AUTO ON,会把初始电阻值设为零点,后续测量值都是相对变化量,而非绝对欧姆值。
  2. 配置参数错误+读取逻辑缺失:CONF:RES命令的量程参数设置错误,且Scan_list函数没有返回读取到的测量值。

具体修改步骤:

  1. 关闭自动归零,启用绝对测量
    修改SP类的senseSP方法,将自动归零设为OFF:
def senseSP(self):
    self.instrument.write(':SENSe:RESistance:OCOMpensated %d,%s' % (1, self.SP_ch))
    self.instrument.write(':SENSe:RESistance:RANGe %G,%s' % (10000.0, self.SP_ch))
    self.instrument.write(':SENSe:RESistance:RESolution %s,%s' % ('DEFault', self.SP_ch))
    # 关闭自动归零,获取绝对电阻值
    self.instrument.write(':SENSe:RESistance:ZERO:AUTO %s,%s' % ('OFF', self.SP_ch))
  1. 修正电阻量程配置参数
    CONF:RES命令的第二个参数是电阻量程,需和后续RANGE设置保持一致:
SP_resistance = '10000' # 对应10kΩ量程,与senseSP中的RANGE参数匹配
  1. 完善读取逻辑,返回欧姆值
    修改Scan_list函数,使其返回读取到的电阻测量值:
def Scan_list(my_instrument, Channel_list):
    # 处理通道列表格式
    if isinstance(Channel_list, list):
        Channel_list_str = ','.join(Channel_list)
    else:
        Channel_list_str = Channel_list
    Scan_Channel_list = f'@{Channel_list_str}'
    my_instrument.write(f':ROUTe:SCAN ({Scan_Channel_list})')
    print('\n\nSetting up automated scan')
    print(f':ROUTe:SCAN ({Scan_Channel_list})')
    # 读取并返回欧姆单位的测量值
    resistance_values = my_instrument.query_ascii_values('READ?')
    return resistance_values
  1. 添加测量读取逻辑
    在实例化SP类后,调用Scan_list获取并打印电阻值:
# 实例化并配置拉线传感器
sp_sensor = SP(my_instrument, SP_alfa, SP_resistance, SP_ch)
# 读取通道3001和3002的电阻值
resistance_data = Scan_list(my_instrument, ['3001', '3002'])
print(f"读取到的电阻值(欧姆):{resistance_data}")

验证说明

修改后,脚本会读取传感器的绝对电阻值,与显示屏上的线性欧姆变化一致,不会再出现上升后归零的相对位移现象。


内容的提问来源于stack exchange,提问作者Antonela Čolić

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 20:22:04