2017-10-22 34 views
0

私はpythonの初心者です。私はModbus入力レジスタを読んで、10秒ごとにcsvファイルにデータを記録するアプリケーションを持っていますが、時間は無関係です。私はレジスタを読み取ることができます、私はCSVにログすることができます、私は10秒ごとにCSVにログすることができますが、私は正しい順序でこれをすべて行うには苦労しています。Modbusレジスタを読み、csvにログ

ポートを開いて最新のレジスタ値を記録するには、以下のコードをどのように並べ替えるのですか?現時点では、コードはポートを一度開き、値を読み取り、10秒ごとに同じ値を記録し続けます。

# Code 
import socket 
import struct 
import time 
import csv 

# Create a TCP/IP socket 
TCP_IP = '169.254.84.141' 
TCP_PORT = 502 
BUFFER_SIZE = 0 
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
sock.connect((TCP_IP, TCP_PORT)) 

try: 
# Ask user for Modbus options 
unitId = 5 
functionCode = 4 
startRegister = 00 
numRegister = 16 

# Construct request packet 
req = struct.pack('>3H 2B 2H', 0, 0, 6, int(unitId), int(functionCode), int(startRegister), int(numRegister)) 
sock.send(req) 

# Calculate receipt packet buffer and structure 
BUFFER_SIZE = (3*2) + (3*1) + (int(numRegister)*2) 
rec = sock.recv(BUFFER_SIZE) 

def setB(): 
    global BH 
    BH = 'B' #1 
def setH(): 
    global BH 
    BH = 'H' #2 

functionLookup = { 
    1 : setB, # Read Coils (1 byte) 
    2 : setB, # Read Input Discrete Registers (1 byte) 
    3 : setH, # Read Holding Registers (2 byte) 
    4 : setH # Read Input Registers (2 byte) 
} 
functionLookup[int(functionCode)]() 

s = struct.Struct('>3H 3B %s%s' %(numRegister, BH)) 
data = s.unpack(rec) 


# Wait a couple of seconds before disconnecting 
time.sleep(2); 
Tank1Vol = data[6] 
Tank1 = "Tank 1 Volume" 
Units = "Litres" 
Tank1csv = Tank1, (Tank1Vol),(Units) 
starttime=time.time() 
while True: 

    print ("tick") 
    print (Tank1csv) 

    time.sleep(10.0 - ((time.time() - starttime) % 10.0)) 

    with open("Tank Level.csv", "a") as TanksFile: 
     TanksFileWriter = csv.writer(TanksFile) 
     TanksFileWriter.writerow(Tank1csv) 

TanksFile.close() 

finally: 
sock.close() 
Units = "Litres" 
Tank1 = "Tank 1 Volume" 
print (Tank1,(Tank1Vol),(Units))` 
+0

に役立ちます願っています。だから...私のpythonファイルが必要なすべての情報を取得し、csvに記録する、私はコードを実行する別のファイルを使用することができます。インポート時間関数を使用し、10秒ごとにインポートmyfile.pyで元のファイルを実行することは可能ですか?私はこれをテーマにして遊んでいますが、コードを一度しか実行しません。 – PrimitiveSource

答えて

0

pip3コマンドを使用してmodbusモジュールをインストールできます。それはあなたの仕事をするクライアントを持っています。

0

modbus用のいくつかのPythonライブラリがあります:pymodbus3minimalmodbusmodbus-tkです。私は1つを選択し、あなたのプロジェクトに使用することをお勧めします。

私はmodbus-tkを維持していますので、私の選択になります。 :-)

あなたはレジスタを読み取るために、この例を見て持つことができます。https://github.com/ljean/modbus-tk/blob/master/examples/tcpmaster_example.py

私はそれは私がこれで遊んと葯のアイデアを持っていたされている