问题描述
我目前正在构建一个Modbus数据抓取工具,在该工具中,我希望它能够连续且相互并行地从设备获取数据。这是我正在使用的示例代码
def get_data(self):
connection_port = len(connection_ports)
connection_count = 0
while connection_count != connection_port:
timestamp = datetime.datetime.Now()
print('Timestamp: ',timestamp)
client = ModbusTcpClient(connection_ports[connection_count][0],port=connection_ports[connection_count][1]) # Specify the port.
connection = client.connect()
count = 0
data_info = []
data_object = []
limit = len(registers)
loop = 0
if connection:
while loop < limit:
if count == limit - 1:
break
address = registers[count]
response = client.read_holding_registers(address,count=10,unit=connection_ports[connection_count][2])
try:
register_value = response.registers[0]
bin8 = lambda x: ''.join(reversed([str((x >> i) & 1) for i in range(12)]))
modbus_value = register_value / scaling[count]
timestamp = datetime.datetime.Now()
if count == limit:
count = 0
else:
count = count + 1
data_object.append(registers[count])
data_info.append(round(modbus_value,2))
csv_name = str(connection_ports[connection_count][0]) + "-Slave-" + str(
connection_ports[connection_count][2]) + ".csv"
with open(csv_name,'a+',newline='') as f:
driver_writer = csv.writer(f,delimiter=',',quotechar='"',quoting=csv.QUOTE_MINIMAL)
driver_writer.writerow([label[count],str(address),round(modbus_value,2),timestamp])
except Exception:
print("Unable to Get Data from Device,Please Check Device Connection")
exit
# self.writeGui(data_object,data_info)
else:
print('unable to connect to device')
connection_count = connection_count + 1
client.close()
我目前在这段代码中所做的是在多个连接和多个寄存器地址中循环数据。这是我的registers.py,其中包含要轮询,缩放比例的寄存器地址
register_label = [
'','Cell Voltage 1','Cell Voltage 2','Cell Voltage 3','Cell Voltage 4','Overall Voltage','String Current','Float Current','Temperature 1','Temperature 2'
]
register_address = [
0x0000,0x0001,0x0002,0x0003,0x0400,0x0428,0x0429,0x0404,0x0405
]
register_scale = [
1024,1024,16,128,87,87
]
系统当前在每次循环迭代中都在逐步运行,因此将数据一一写入并写入csv文件中。
我要完成的工作是使其连续运行,并使所有寄存器地址彼此并行运行。
例如 当前实施中 在获得电池电压2中的数据之前,我需要先获得电池电压1。我要完成的工作是一次运行即可获得所有数据。 未来的实施 每秒钟获取一次,1、2、3等电池电量。
我已经尝试过 Threading ,但这真的是一种很好的方法吗?我将有大约50个寄存器在单个设备和500个设备上运行。因此,如果有的话,总共有 25,000 个线程在后台运行。
使用的库:Pymodbus
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)