读取Modbus寄存器并登录到csv

问题描述 投票:0回答:2

我是python的新手。我有一个应用程序,我想读取一个Modbus输入寄存器,并每隔10秒将数据记录到一个csv文件,我想时间段是无关紧要的。我可以读取一个寄存器,我可以登录到csv,我可以每10秒登录一次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 sockets csv logging modbus
2个回答
0
投票

你可以使用pip3命令安装modbus模块。它有一个客户可以完成你的工作。


0
投票

modbus有几个python库:pymodbus3minimalmodbusmodbus-tk。我建议选择一个并将其用于您的项目。

我维持modbus-tk,所以这将是我的选择。 :-)

您可以查看此示例以读取寄存器:https://github.com/ljean/modbus-tk/blob/master/examples/tcpmaster_example.py

我希望它有所帮助

© www.soinside.com 2019 - 2024. All rights reserved.