1

シリアル経由でデータのグループを読み取り、それを自動的に 4 桁の断片に切り刻み、GROUP# というリストにダンプするユーザー定義命令「getSetpoints」を作成しました (# は、ユーザーが必要とするデータのグループによって異なります)。 .

これらはすべてうまく機能し、Python シェルで GROUP0、GROUP1、GROUP2 などと入力するだけで、このデータを出力できます。getSetpoints() 関数を実行した後、正しく保存されていることがわかります。

ただし、GROUP0 リストの各メンバーを適切な名前の変数 (つまり、Lang_Style は GROUP0[0]、CTinv_Sign は GROUP0[1] など) に自動的にロードしたいと考えています。これを行うために、getSetpoints() の最後に呼び出す decodeSP() を作成しました。

唯一の問題は、getSetpoints() を実行した後に Python シェルで Lang_Style (またはその他の名前付き変数) を入力すると、0 が返されることです。以下のコードを参照してください。Python シェルの出力も含めました。

ユーザー定義命令の実行後に GROUP0 がデータを保持する方法がわかりませんが、他の変数は毎回ゼロに設定されます。私が見る限り、同じです。

# Define Variables (This is shortened to only show one GROUP...)
GROUP0 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

Lang_Style = 0
CTinv_Sign = 0
Freq = 0
PT_Ratio = 0
CT_Ratio = 0
DST = 0
System_Volts = 0
Gen_Phase = 0
Op_Mode = 0
Seq_Pref = 0
Re_Commit = 0
Bit_Address = 0

CRLF = bytearray ([0x0D, 0x0A])
RESULTS = [GROUP0, GROUP1, GROUP2, GROUP3, GROUP4, GROUP5]

def getSetpoints(group):
    if 0 <= group <= 5:
        # Send out the command for Display Setpoint, then group number, then CRLF.
        s = serial.Serial('COM1', '9600') # serial port, baud rate
        s.write("DP")
        s.write(group)
        s.write(CRLF)
        temp = s.read(len(RESULTS[group])*6) # Each setpoint is 6 characters (space + x + 4 digits).
        n = 0
        for n in range(len(RESULTS[group])):
            # RESULTS[group][n] = int(temp[2+n*6:6+n*6],16) # Use this one if you want Integers
            RESULTS[group][n] = temp[2+n*6:6+n*6] # Cut out the space and the x, leaving only the 4 digits.
        print RESULTS[group] # Debug Print
        s.close()
        decodeSP()
        return
    else:
        print 'Invalid Group Number'
        return

def decodeSP():
    Lang_Style = GROUP0[0]
    CTinv_Sign = GROUP0[1]
    Freq = GROUP0[2]
    PT_Ratio = GROUP0[3]
    CT_Ratio = GROUP0[4]
    DST = GROUP0[5]
    System_Volts = GROUP0[6]
    Gen_Phase = GROUP0[7]
    Op_Mode = GROUP0[8]
    Seq_Pref = GROUP0[9]
    Re_Commit = GROUP0[10]
    Bit_Address = GROUP0[11]
return

Python シェル出力:

================================ RESTART ================================
getSetpoints(0) 
['0004', '0000', '003C', '0000', '00C8', '0001', '0078', '0101', '0000', '0003', '0001', '0001']
GROUP0
['0004', '0000', '003C', '0000', '00C8', '0001', '0078', '0101', '0000', '0003', '0001', '0001']
Lang_Style
0
4

3 に答える 3

1

これは、オブジェクトの値の変更とメソッドの呼び出しの違いによるものです。

あなたがするとき

RESULTS[group][n] = temp[2+n*6:6+n*6]

実際__setitem__に RESULTS に対してメソッド ( ) を呼び出します。上記の命令は次のように展開されます。

RESULTS.__getitem__(group).__setitem__(n, temp.__getslice__(2+n*6, 6+n*6))

を明示的に変更するのではなくRESULTS、メソッドを呼び出すだけで、それ自体を変更するのはオブジェクト次第です。

代わりに、あなたがするとき

Lang_Style = GROUP0[0]

`GROUP0[0]に設定 します。Lang_Style

ただし、これは質問に完全に答えているわけではありません。あなたの質問は: なぜくっつかないのですか? Python は上位の名前空間 (decodeSP関数内のグローバル名前空間など) から値を取得できますが、それらを上書きすることはありません。

decodeSPどのオブジェクトをグローバルと見なすかを最初に指定することで、これを変更できます。http://docs.python.org/release/2.7/reference/simple_stmts.html#the-global-statementを参照してください

例えば

def decodeSP():
    global Lang_Style, CTinv_Sign, ...
于 2013-05-17T22:17:11.667 に答える
1

関数decodeSPは、外部変数と同じ名前のローカル変数を多数作成します。何も返さないため、これらの変更はすべて失われます。global外側のスコープに影響を与えるには、これらすべての変数を宣言する必要があります。

結果として生じる繰り返しの量を考慮して、別のオプションがモジュールnamedtupleから使用されていますcollections

from collections import namedtuple
data = namedtuple('data', 'Lang_Style, CTinv_Sign, Freq, PT_Ratio, CT_Ratio, DST, System_Volts, Gen_Phase, Op_Mode, Seq_Pref, Re_Commit, Bit_Address')

parsed_data = data(*GROUP0)  #  need to fill in the array as params

その後、次のようにデータにアクセスできます

print parsed_data.Lang_Style
于 2013-05-17T22:08:43.313 に答える
1

使用方法では、すべての変数decodeSPがローカルとして宣言されます。グローバルに書き込みたいので、関数スコープ内でグローバルへの参照を作成する必要があります。globalキーワードを使用してそれを達成します。

def decodeSP():
    global Lang_Style
    global CTinv_Sign 
    global Freq
    # ...
    Lang_Style = GROUP0[0]
    CTinv_Sign = GROUP0[1]
    Freq = GROUP0[2]
    # ...
于 2013-05-17T22:02:09.617 に答える