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