Некоторая предыстория: я реализую графический интерфейс для взаимодействия с оборудованием через GPIB. Проблема возникает в этом методе:
from tkinter import *
from tkinter import ttk
import visa #PyVisa Package. pyvisa.readthedocs.io
from time import sleep
import numpy as np #NumPy Package. Scipy.org
def oneDSweep():
Voltage =[]
Current =[]
Source = []
try:
#Gate = parseGate(Gate1Input.get()) #Not implemented yet.
Min = float(Gate1MinInput.get()) #Add a check for valid input
#if Min < .001:
#Throw exception
Max = float(Gate1MaxInput.get()) #Add a check for valid input
VoltageInterval = .02 #Prompt user for interval?
rm = visa.ResourceManager()
SIM900 = rm.open_resource("GPIB0::1::INSTR") #Add a check that session is open.
x = 0
Volt = Min
while Volt <= Max:
SIM900.write("SNDT 1, 'VOLT " + str(Volt) + "'") #Set voltage.
SIM900.write("SNDT 7, 'VOLT? 1'") #Ask a port for voltage.
Vnow = SIM900.query("GETN? 7, 50") #Retrieve data from previous port.
Vnow = Vnow[6:15]
Vnow = float(Vnow) ############Error location
Voltage = np.append(Voltage, Vnow)
SIM900.write("SNDT 1, 'VOLT?'") #Ask a different port for voltage.
Snow = SIM900.query("GETN? 1, 50") #Retrieve data.
print(Snow) #Debugging method. Probably not problematic.
Snow = Snow[4:]
Snow = float(Snow)
sleep(1) #Add a delay for science reasons.
#The code below helps the while loop act like a for loop.
x = x+1
Volt = Min + VoltageInterval*x
Volt = float(truncate(Volt, 7))
finally:
print(Voltage)
print(Source)
Voltage.tofile("output.txt.",sep=",")
SIM900.write("FLSH")#Flush the ports' memories to ensure no bad data stays there.
Я получаю простую ошибку ValueError в отмеченном месте во время первого прохода цикла while; Python говорит, что не может преобразовать строку в число с плавающей запятой (подробнее об этом позже). Однако просто удалите эти пять строк кода:
SIM900.write("SNDT 1, 'VOLT?'")
Snow = SIM900.query("GETN? 1, 50")
print(Snow)
Snow = Snow[4:]
Snow = float(Snow)
и программа работает отлично. Я понимаю источник ошибки. С добавлением этих строк, когда я отправляю эти две строки на свой инструмент:
SIM900.write("SNDT 7, 'VOLT? 1'")
Vnow = SIM900.query("GETN? 7, 50")
Я получаю по существу нулевую ошибку. #3000
возвращается, что является пустым сообщением, которое машина отправляет, когда ее просят вывести данные, а ей нечего выводить. Однако те же самые две строки выдают что-то вроде #3006 00.003
, когда из программы исключаются четыре строки, о которых я упоминал. Другими словами, простое добавление этих четырех строк в мою программу изменило сообщение, отправляемое прибору в начале цикла while, несмотря на то, что они были добавлены ближе к концу.
Я убежден, что здесь виноват интерпретатор Python. Ранее я очищал свой код и обнаружил, что один конкретный набор кавычек при изменении с '
на "
вызывал ту же ошибку, несмотря на то, что ни одна другая пара кавычек не проявляла такого поведения даже в одной строке. Мой вопрос: почему выполнение моего кода изменяется в зависимости от несвязанных изменений в коде (также был бы признателен за исправление)? Я понимаю, что эту проблему трудно воспроизвести, учитывая мое довольно специфическое приложение, поэтому, если есть дополнительная информация, которую я могу предоставить, пожалуйста, дайте мне знать.
РЕДАКТИРОВАТЬ: функциональность улучшилась после перехода из командной строки в IDLE. Я все еще озадачен тем, что произошло, но из-за моих скудных навыков командной строки я не могу предоставить никаких доказательств. Пожалуйста, закройте этот вопрос.
Voltage
, и вы, вероятно, впервые увидите допустимое значение в цикле, прежде чем оскорбительный код вызовет нулевой ответ от вашего устройства. - person Juan Tomas   schedule 15.07.2016print
и поделитесь выводом. - person user94559   schedule 15.07.2016while
, поскольку вы утверждаете, что на самом деле это не цикл. - person user94559   schedule 15.07.2016Vnow
, прежде чем смириться с тем, что она дает сбой на первой итерации. - person Juan Tomas   schedule 15.07.2016