0

背景: GPIB 経由で機器と対話するための GUI を実装しています。この方法で問題が発生します。

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.

while ループの最初のパス中に、マークされた場所で単純な ValueError が発生します。Python は、文字列を float に変換できないと言います (これについては後で詳しく説明します)。ただし、次の 5 行のコードを削除するだけです。

    SIM900.write("SNDT 1, 'VOLT?'")
    Snow = SIM900.query("GETN? 1, 50")
    print(Snow)
    Snow = Snow[4:]
    Snow = float(Snow)

プログラムは完全に実行されます。エラーの原因を理解しています。これらの行を追加して、次の 2 行を計測器に送信すると、次のようになります。

    SIM900.write("SNDT 7, 'VOLT? 1'")
    Vnow = SIM900.query("GETN? 7, 50")

基本的に null エラーが発生します。#3000が返されます。これは、データを出力するように求められ、出力するデータがない場合にマシンが送信する空白のメッセージです。ただし、これらの同じ 2 つの行は#3006 00.003、私が言及した 4 つの行がプログラムから除外された場合のようなものを生成します。つまり、これらの 4 行をプログラムに追加するだけで、最後近くに追加したにもかかわらず、while ループの最初に計測器に送信されるメッセージが変更されました。

ここでは Python のインタープリターに問題があると確信しています。以前、コードをクリーンアップしていたところ、ある特定の引用符セットが から に変更されたときに'"同じ行内であっても、この動作を示す他の引用符ペアがないにもかかわらず、同じエラーが発生することがわかりました。私の質問は、コードへの無関係な変更に依存してコードの実行が変更されるのはなぜですか(修正もありがたいです)? 私のやや特殊なアプリケーションでは、この問題を再現するのが難しいことは理解しています。そのため、私が提供できる役立つ情報がさらにある場合は、お知らせください。

編集: コマンド プロンプトから IDLE に移行した後、機能が改善されました。私はまだ何が起こったのか困惑していますが、コマンドプロンプトのスキルが貧弱であるため、証拠を提供することはできません. この質問を閉じてください。

4

2 に答える 2

2

Python は、コードの何が問題なのかを正確に伝えていますValueError。問題の原因となっている正確な行番号と値も表示されます。

'#3006 00.003'

それは、SNOW出力されているの値です。次に、これを行います

SNOW = SNOW[4:]

SNOW

'6 00.003'

次に、この文字列を呼び出そうとしfloat()ます。 6 00.003無意味な数値であるため、浮動小数点数に変換できません。

于 2016-07-15T20:39:36.577 に答える
2

ここでは Python のインタープリターに問題があると確信しています。以前、コードをクリーンアップしていたところ、特定の引用符のセットを ' から " に変更すると、同じ行内であっても、この動作を示す引用符のペアが他にないにもかかわらず、同じエラーが発生することがわかりました。

Python は、一重引用符と二重引用符で囲まれた文字列に対してまったく同じバイトコードを生成します (もちろん、埋め込まれた引用符が含まれていない限り)。したがって、スクリプトを実行している環境が深刻に壊れているか (「環境」の一部として Python インタープリターをカウントしています)、または診断が正しくありません。私は自分のお金を2番目に置きます。

別の説明を次に示します。なんらかの理由で、接続したハードウェアが一貫性のない結果を返しています。つまり、期待どおりの結果が得られたとき、次にエラーが発生したときは、コードの変更が違いの原因だと考えますが、原因と結果の間に関係はなく、結局は頭を悩ませることになります。同じコードを数回続けて実行すると、一貫した結果が得られますか? つまり、一貫して奇妙な動作が発生しますか? そうしたとしても、問題は Python ではなく、ハードウェアまたは接続にあるに違いありません。

于 2016-07-15T21:07:08.370 に答える