一、准备:
1、目标:
通过python编程画面,实现西门子PLC通讯,同时画面显示IO信息,打开时显示左侧画面,点击按钮,会根据PLC上标签显示,此处我用仿真器模拟强制了%I3805.0
2、工具:
如上一篇文章
模块:tkinter,ttkbootstrap,snap7
终端运行
pip install ttkbootstrap //可以到github下载压缩包,解压到项目文件中
pip install tkinter
二、设计
1、PLC仿真
(1)连接
如前文所述方式连接PLC,并装载仿真程序,我用的是公司机器人的程序,程序可以随意,注意网址和插槽设置,运行成功后终端会提示,程序我放到最后
(2)读取PLC点信息
通过代码
i_gluePump = plc_PSJ.read_area(snap7.client.Areas.PE, 0, 3805, 1)
其中PE代表输入,0代表读取参考,3805代表%i3805,1代表一个字节,相当于读取了3805.0-3805.7的数据
图中对应想要获取的PLC信息,PA是Q,DB是DB块,其他可以百度
(3)处理字节数据
因为我只想得到3805.0的状态,作为判断条件,所以我用到下面指令
glue1 = bool.__bool__((i_gluePump.__getitem__(0) >> 0) & 0b1)
print(glue1)
此时的glue1就是3805.0
2、画面设计
(1)导入画布
画布的参数如图,resizable表示是否扩大缩小窗口,我写的是FALSE,不允许
(2)设计标签、按钮
跟据个人喜好更改
(3)画布展示
这个mainloop本身就是循环,所以后面想做实时监测标签还没实现,按钮可以更新读取的点及画面更新,这个正在处理中。。。。
3、联合
我目前写的是用按钮控制刷新数据,按一次按钮,我就读一次3805.0的值,并更改画面,如果是TRUE则正常,FALSE则异常
import tkinter as tk
import ttkbootstrap as ttk
from ttkbootstrap.constants import *
import time
import snap7
from snap7 import util
import threading
plc_PSJ = snap7.client.Client() #启动客户端
plc_PSJ.connect('192.168.43.80', 0, 1)
print(f"connect:{plc_PSJ.get_connected()}")
i_gluePump = plc_PSJ.read_area(snap7.client.Areas.PE, 0, 3805, 1)
print(i_gluePump)
glue1 = bool.__bool__((i_gluePump.__getitem__(0) >> 0) & 0b1)
print(glue1)
def buttonclick():
root.event_generate('<<myEvent>>')
def myEvent1(glue1):
i_gluePump = plc_PSJ.read_area(snap7.client.Areas.PE, 0, 3805, 1)
glue1 = bool.__bool__((i_gluePump.__getitem__(0) >> 0) & 0b1)
print(glue1)
time.sleep(1)
if glue1 == True:
ll2["text"] = "胶泵正常"
ll2["background"] = "green"
ll2["foreground"] = "white"
# l1.pack(side=TOP, padx=5, pady=15)
else:
ll2["text"] = "胶泵异常"
ll2["background"] = "red"
ll2["foreground"] = "black"
root = ttk.Window("调漆间报警", "superhero", position=[100, 100], size=(300, 250), resizable=(False, False))#画布设计
l1 = ttk.Label(root, text="胶间状态", font=("幼圆", 18, 'bold'), bootstyle=DEFAULT)#画面标题
l1.pack(side=TOP, padx=5, pady=20)
root.bind("<<myEvent>>", myEvent1)
ll2 = ttk.Label(root, text="胶泵正常", font=("华文琥珀", 14, ''), bootstyle="inverse-success", anchor=CENTER)#报警图标
ll2.pack(side=TOP, padx=5, pady=15, ipadx=10, ipady=15)
b1 = ttk.Button(root, text="查看状态", bootstyle="sucess", command=buttonclick)#按钮
b1.pack(side=TOP, padx=5, pady=15)
root.mainloop()
4、打包exe程序
1、在pycharm终端输入 install pyinstaller 安装pyinstaller
2、执行命令 pyinstaller -F -w main.py即可
disk文件夹下会有.exe文件