gpt4 book ai didi

python - 有没有一种方法可以帮助使这个 Python 逻辑运行得更快

转载 作者:太空宇宙 更新时间:2023-11-03 15:46:15 25 4
gpt4 key购买 nike

我一直在研究使用 Python 从 PLC 传感器获取数据的解决方案,我能够使用 cpppo 计算出语法等。就以假定的序列化方式在循环中从标签中获取数据而言,这种方法工作得很好。

为了测试这个新的 Python cpppo 解决方案,我已经通过 VPN 隧道将运行 Python 逻辑的机器连接到 PLC,并且我有它 poll一个特定的标签/传感器。此标记还使用连接到本地机器网络的不同非 Python 解决方案轮询 并记录通过以太网。


问题

有谁知道我可以重写下面这个简单代码的方法,我可以强制它在一秒钟内轮询 3 次甚至 4 次?还有什么可能对此有所贡献吗?

  • 通过为“这个”做贡献,我说的是“其他”或“非 Python”方法似乎可以记录来自同一标签的 poll 响应 3 次一秒钟Python cpppo 解决方案似乎只是以每秒最多 2 次 的轮询记录,因此当一秒内有 3 个权重值时,偶尔会丢失一个权重 - 有时每秒只有 2 个,所以它并不总是一秒钟有 3 个值,但有时一秒钟有 3 个。

enter image description here


数据

返回的传感器数据包含在方括号中,但以克为单位表示重量并具有小数精度,下面是原始数据的一小部分样本。

[610.5999755859375]
[607.5]
[623.5999755859375]
[599.7999877929688]
[602.5999755859375]
[610.0]

Python代码

注意: Python 逻辑会将传感器的轮询值写入 csv 文件,但会根据系统日期和时间通过 datetime.now() 但在此之前,我将值转换为字符串,然后从每个迭代值中去除方括号 str(x).replace('[','').replace(']','')使用 str()功能。

from cpppo.server.enip.get_attribute import proxy_simple
from datetime import datetime
import time, csv

CsvFile = "C:\\folder\\Test\\Test.csv"
host = "<IPAddress>"

while True:
x, = proxy_simple(host).read("<TagName>")

with open(CsvFile,"a",newline='') as file:
csv_file = csv.writer(file)
for val in x:
y = str(x).replace('[','').replace(']','')
csv_file.writerow([datetime.now(), y])
#time.sleep(0.05)

问题和测试结果

当我将 Python 捕获的 csv 文件记录与来自标签的其他非 Python 捕获方法的记录进行比较时,Python生成的 csv 记录有时会丢失,而且经常会丢失。

值得注意的细节(以防万一)

  • 这两个系统之间存在一秒或更短的时间戳差异,因为它们在捕获时生成时间戳。

  • 这个特定的传感器可以在一秒钟内吐出三个值,但并非总是如此;有时一秒钟一个,或者一秒钟两个,或者一秒钟一个都没有。

  • 我认为另一种方法使用 Java,但这段代码无法访问以比较逻辑。

  • 我使用的是 Python 版本 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 16:07:46) [MSC v.1900 32 bit (Intel)]Windows 10

Results

Python Method CSV (missing the correlated 606.6 value)

2018-04-12 13:56:42.249408,610.5999755859375
2018-04-12 13:56:42.909309,607.5
2018-04-12 13:56:43.559472,623.5999755859375
2018-04-12 13:56:44.259771,599.7999877929688
2018-04-12 13:56:44.910270,602.5999755859375
2018-04-12 13:56:45.541044,610.0

Other Method CSV Results (contains the 606.6 value)

12/04/2018 13:56:41,610.6
12/04/2018 13:56:42,607.5
12/04/2018 13:56:42,623.6
12/04/2018 13:56:43,606.6
12/04/2018 13:56:43,599.8
12/04/2018 13:56:44,602.6
12/04/2018 13:56:44,610

问题说明: Python 错过了捕获 12/04/2018 13:56:43,606.6 记录,而它是从其他系统记录的。我怀疑这是由于按照这个逻辑有一些微小的延迟,因为与其他非 Python 捕获的文件相比,我只看到它缺少值。

最佳答案

代码的关键部分是:

while True:
x, = proxy_simple(host).read("<TagName>")

with open(CsvFile,"a",newline='') as file:
for val in x:
# ...

在伪代码中:

forever:
create proxy
open output file
process values from proxy

您提到传感器每秒可能产生大约 3 个值。如果你看一下 read() 的实现,它所做的是设置一个新的阅读器对象并从中产生所有值。

您可能认为您的代码是这样运行的:

  1. 创建代理
  2. 打开输出文件
  3. 过程值(value)
  4. 转到3

但实际上,它大概是这样运行的:

  1. 创建代理
  2. 打开输出文件
  3. 过程值(value)
  4. 转到1

每次您调用 read() 时,它都会产生它当时知道的值。它不会等待任何新值的到来。

试试这个重构:

source = proxy_simple(host)
with open(CsvFile,"a",newline='') as file:
while True:
for message in source.read("<TagName>"):
for val in message:
# ...

原始代码中的另一个错误是:

x, = proxy_simple(host).read("<TagName>")

如果 read() 返回多个值,您只需使用第一个。这就是为什么在我上面建议的代码中有两个 for 循环。

那么每次程序运行你只会打开输入和输出一次,而不是每条消息一次。

关于python - 有没有一种方法可以帮助使这个 Python 逻辑运行得更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49803896/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com