我不是开发人员,但是这些年来,编程语言的基本知识变得非常有用。现在,我有一个小项目,必须从网站(php)读取数据(机器的m / min速度),将其计算为计数器,然后通过opc-ua将其呈现给服务器。我无法编辑该网站。
对于OPC-UA,我使用的是https://github.com/FreeOpcUa/python-opcua,在这里我根据需要修改了服务器示例。
我的Python脚本正在运行,但是我认为我的代码很脏,需要一些建议以使其“更好”。此外,将来会有更多价值,因此最好在此之前对其进行优化。
我正在使用线程来分离数据获取和“计算”
import threading
import time
import datetime
import sys
import socket
import requests
import json
import re
shared_webclient3 = ''
def web_client3():
global shared_webclient3
sHostAddress = webclient3_hostname
sURL='http://'+ sHostAddress +'/s7plc_db.php?readAll'
headers = {'content-type': 'application/x-www-form-urlencoded'} #setze header
while True:
r = requests.get(sURL, headers=headers, data="") #sende GET Request an php Schnittstelle
resultstring = r.text[:1000]
jsondata=json.loads(resultstring)
shared_webclient3=jsondata
time.sleep(60)
这是从GET请求获取的JSON数据:
{"Soll_L1":{"value":10,"quality":"GOOD"},"Ist_L1":{"value":11.112000465393,"quality":"GOOD"},"Soll_L2":{"value":15.10000038147,"quality":"GOOD"},"Ist_L2":{"value":14.08865737915,"quality":"GOOD"},"Soll_L3":{"value":11,"quality":"GOOD"},"Ist_L3":{"value":13.06134223938,"quality":"GOOD"},"Soll_L4":{"value":7.8000001907349,"quality":"GOOD"},"Ist_L4":{"value":0,"quality":"GOOD"},"L1_Zu_langsam":{"value":false,"quality":"GOOD"},"L1_Zu_schnell":{"value":false,"quality":"GOOD"},"L2_Zu_langsam":{"value":true,"quality":"GOOD"},"L2_Zu_schnell":{"value":false,"quality":"GOOD"},"L3_Zu_langsam":{"value":false,"quality":"GOOD"},"L3_Zu_schnell":{"value":false,"quality":"GOOD"},"L4_Zu_langsam":{"value":true,"quality":"GOOD"},"L4_Zu_schnell":{"value":false,"quality":"GOOD"}}
我得到4个数值:以米/分钟为单位的IST_L1至IST_L4,并以每米的刻度数进行计算。这是我使用一个值的方法:
def calculator():
global shared_webclient3
global shared_ticks1
ts1 = 0
ts2 = time.time()
ticks = 0
meter = 0
while True:
if shared_webclient3 != "":
calcvalue=float(shared_webclient3['Ist_L1']['value'])
usevalue= calcvalue / 60 #m / sec.
ts1 = time.time()
diff = ts1 - ts2
meter = meter + (diff * usevalue)
if meter >= 1:
shared_ticks = shared_ticks +1
meter = meter -1
ts2 = time.time()
time.sleep(1)
对于每台机器来说,每刻度1米的“分辨率”就足够了,但是很容易在需要时使其变得更好。
这是我启动线程的方式:
web_client3 = threading.Thread(name='web_client3', target=web_client3, args=())
calculator = threading.Thread(name='calculator', target=calculator, args=())
web_client3.start()
calculator.start()
我想要的
我在这里写的主要意图是,我不想为每个值多次复制和粘贴计算器线程,而是希望有一个解决方案根据值的数量和某些选项/参数从一个函数启动多个线程。
我的待办事项: