Python 脚本,用于通过 Modbus 结合按钮写入和读取传感器数据 (GUI Tkinter)

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

我是第一次构建这样的程序,因此需要专家的帮助。

我已经创建了一个简单的GUI环境:

from time import strftime
from time import sleep
from tkinter import * 
from tkinter.ttk import * 
from threading import Thread
import queue
import tk_tools

window = Tk()
window.geometry("600x500")
window.configure()

canvas = Canvas(window, width = 600, height = 500, bd = 0, highlightthickness = 0, relief = "ridge")
canvas.place(x = 0, y = 0)

canvas.create_text(380, 10, anchor = "nw", text = "Test", fill = "#000000", font = ("Inter Bold", 16))
canvas.create_text(36, 69, anchor = "nw", text = "Article number:", fill = "#000000", font = ("Inter SemiBold", 16))
canvas.create_text(36, 135, anchor = "nw", text = "Serial number:", fill = "#000000", font = ("Inter SemiBold", 16))
canvas.create_text(160, 260, anchor = "nw", text = "Target:", fill = "#000000", font = ("Inter SemiBold", 16))
canvas.create_text(280, 260, anchor = "nw", text = "Actual Value:", fill = "#000000", font = ("Inter SemiBold", 16))

name = StringVar()
Article = Entry(textvariable=name, width=45)
Article.place(x=35,y=100)

name = StringVar()
Serial = Entry(textvariable=name, width=45)
Serial.place(x=35,y=165)

button_target_min = Button(window, text='0%')
button_target_min.pack()
button_target_min.place(x=55,y=380)
button_target_max = Button(window, text='100%')
button_target_max.pack()
button_target_max.place(x=55,y=310)

window.resizable(False, False)
window.mainloop()

现在我即将整合逻辑,但我已经达到了极限。我希望在单击 0% 按钮时写入 4 mA 的设定值。 100% 按钮为 20 mA(当然,我通过 ModbusClient 调用 Modbus 连接)。我想使用以下命令来执行此操作:

Target_0 = client.write_single_register(0x801, 4)
Target_100 = client.write_single_register(0x801, 20)

如何将其连接到按钮?

然后我想查看传感器的实时值并比较它们是否与目标值匹配。如果这些不相同,则必须旋转传感器上的调节螺钉,直到设定目标值。我正在尝试使用一个函数,但我不知道如何正确构建它。我需要 0% 的实时值,然后是 100% 的实时值。

def Live_data():
    global Actual_Value
    Actual_Value = client.read_input_registers(9, 1)
    Actual_Value.set(Actual_Value)
    window.after(100, Live_data) 

但是构建此功能的最佳方法是什么?这里的过程或循环会是什么样子?

希望你能帮助我!

谢谢!

通过 GUI 启用传感器设置的程序。

python tkinter modbus tkinter-button
1个回答
0
投票

您可以将回调分配给

command
Button
选项,并在回调中调用您想要的内容:

...
def set_sensor(level):
    client.write_single_register(0x801, level)

button_target_min = Button(window, text="0%", command=lambda: set_sensor(4))
...
button_target_max = Button(window, text="100%", command=lambda: set_sensor(20))
...

为了监控传感器的实际液位,您需要在画布中创建一个文本项来显示实际液位,并在内部更新此文本项

live_data()

...

# text item for showing the retreived actual level of sensor
actual_level = canvas.create_text(280, 310, anchor = "nw", text = "", fill = "#000000", font = ("Inter SemiBold", 16))

def live_data():
    level = client.read_input_registers(9, 1)
    if level:
        canvas.itemconfig(actual_level, text=level[0])
    canvas.after(100, live_data)

# start the monitor actual level loop
live_data()
...
© www.soinside.com 2019 - 2024. All rights reserved.