600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > Python编写软件与从倍福PLC通讯软件

Python编写软件与从倍福PLC通讯软件

时间:2023-07-21 00:14:30

相关推荐

Python编写软件与从倍福PLC通讯软件

一、软件界面

二、代码分享

from tkinter import *from tkinter import ttkimport timeimport pyads# # 打包成.exe的方法:pyinstaller -w -p C:\Windows\System32\downlevel -i D:\Python_Test\03-pycharm\6\001.ico D:\Python_Test\03-pycharm\6\Ads_Test.py (xxx:想要打包的文件夹)class GUI_DISIN():def __init__(self,GUI_Name):self.GUI_Name=GUI_Nameself.func = ''#初始化设计窗口def set_init_Gui(self):self.GUI_Name.title('倍福通讯测试')self.GUI_Name.geometry('800x200+10+10')#添加标签self.label1 = Label(self.GUI_Name,text="输入变量名")self.label1.grid(row=0,column=0)#下拉框标题self.label5 = Label(self.GUI_Name, text="数据类型")self.label5.grid(row=0, column=5)self.label2 = Label(self.GUI_Name,text="变量值")self.label2.grid(row=0,column=10)self.label3 = Label(self.GUI_Name, text="日志输出")self.label3.grid(row=0, column=13)self.label4 = Label(self.GUI_Name, text="")self.label4.grid(row=0, column=15)self.label5 = Label(self.GUI_Name, text="NetID:")self.label5.grid(row=2, column=0)self.label6 = Label(self.GUI_Name, text="Port:")self.label6.grid(row=2, column=5)#添加文本框#变量名输入self.text1 = Text(self.GUI_Name,width=20,height=2)self.text1.grid(row=1,column=0)#数据值输出self.text2 = Text(self.GUI_Name,width=20,height=2)self.text2.grid(row=1,column=10)#日志输出self.text3 = Text(self.GUI_Name,width=30,height=2)self.text3.grid(row=1,column=13)#实时时间显示self.text4 = Text(self.GUI_Name,width=18,height=2,font=('times',10,'bold'))self.text4.grid(row=0,column=14)#NetIDself.text5 = Text(self.GUI_Name,width=20,height=2)self.text5.grid(row=3,column=0)#Portself.text6 = Text(self.GUI_Name,width=20,height=2)self.text6.grid(row=3,column=5)#按钮-单次读取self.button1 = Button(self.GUI_Name,text='单次读取',bg='lightblue',width=10,command=self.ReadData_Once)self.button1.grid(row=1,column=14)#按钮-连续读取self.button2 = Button(self.GUI_Name,text='循环读取',bg='lightblue',width=10,command=self.ReadData_Continuous)self.button2.grid(row=2,column=14)#按钮-取消连续读取self.button2 = Button(self.GUI_Name,text='循环读取停止',bg='lightblue',width=10,command=self.Cancel_ReadData_Continuous)self.button2.grid(row=3,column=14)#添加下拉框value = StringVar()value.set('CCC')values = ['PLCTYPE_BOOL','PLCTYPE_BYTE','PLCTYPE_DWORD','PLCTYPE_DINT','PLCTYPE_INT','PLCTYPE_LREAL','PLCTYPE_REAL','PLCTYPE_SINT','PLCTYPE_STRING','PLCTYPE_TOD','PLCTYPE_UBYTE','PLCTYPE_UDINT','PLCTYPE_UINT','PLCTYPE_USINT','PLCTYPE_WORD','PLCTYPE_LINT','PLCTYPE_ULINT','PLCTYPE_DATE','PLCTYPE_DATE_AND_TIME','PLCTYPE_DT','PLCTYPE_TIME,']# 下拉列表控件bobox = bobox(master=self.GUI_Name, # 父容器height=10, # 高度,下拉显示的条目数量width=15, # 宽度state='readonly', # 设置状态 normal(可选可输入)、readonly(只可选)、 disabledcursor='arrow', # 鼠标移动时样式 arrow, circle, cross, plus...font=('', 15), # 字体textvariable=value, # 通过StringVar设置可改变的值values=values, # 设置下拉框的选项)bobox.grid(row=1,column=5)# 实时显示时间self.tick()def ReadData_Continuous(self):#循环读取变量i=1print(1)self.ReadData_Once()self.func = self.GUI_Name.after(10, self.ReadData_Continuous) # .after函数可以循环实现该函数def Cancel_ReadData_Continuous(self):#取消连续读取self.GUI_Name.after_cancel(self.func)def ReadData_Once(self):# 单次读取变量pass# 读取NetIDNetID = self.text5.get(1.0,END).strip()# 读取PortPort = int(self.text6.get(1.0,END).strip())# 打开PLCplc = pyads.Connection(NetID, Port)plc.open()# 通过变量名去读值src ='.'+ self.text1.get(1.0,END).strip()print(src)src_type = bobox.get().strip()# print(type(src_type))# 得到数据类型src_type1 =self.Get_ParaType(src_type)# src_type = pyads.PLCTYPE_BOOLprint(type(src_type1))try:if src !='' and src_type !='':print('okk')result = ''result = plc.read_by_name(data_name=src,plc_datatype=src_type1)print(result)if result != '':try:self.text2.delete(1.0, END)self.text2.insert(1.0, result)str1 = '变量--'+str(src) + '--读取成功!'self.log(str1)except:self.text2.delete(1.0, END)self.log('读取字符为空失败')except :self.text2.delete(1.0, END)self.log('打开端口失败')def Get_ParaType(self,input_str):# 实现字符串转变量类型功能if input_str == 'PLCTYPE_BOOL':return pyads.PLCTYPE_BOOLelif input_str == 'PLCTYPE_BYTE':return pyads.PLCTYPE_BYTEelif input_str == 'PLCTYPE_DWORD':return pyads.PLCTYPE_DWORDelif input_str == 'PLCTYPE_DINT':return pyads.PLCTYPE_DINTelif input_str == 'PLCTYPE_INT':return pyads.PLCTYPE_INTelif input_str == 'PLCTYPE_LREAL':return pyads.PLCTYPE_LREALelif input_str == 'PLCTYPE_REAL':return pyads.PLCTYPE_REALelif input_str == 'PLCTYPE_SINT':return pyads.PLCTYPE_SINTelif input_str == 'PLCTYPE_STRING':return pyads.PLCTYPE_STRINGelif input_str == 'PLCTYPE_TOD':return pyads.PLCTYPE_TODelif input_str == 'PLCTYPE_UBYTE':return pyads.PLCTYPE_UBYTEelif input_str == 'PLCTYPE_UDINT':return pyads.PLCTYPE_UDINTelif input_str == 'PLCTYPE_UINT':return pyads.PLCTYPE_UINTelif input_str == 'PLCTYPE_USINT':return pyads.PLCTYPE_USINTelif input_str == 'PLCTYPE_WORD':return pyads.PLCTYPE_WORDelif input_str == 'PLCTYPE_LINT':return pyads.PLCTYPE_LINTelif input_str == 'PLCTYPE_ULINT':return pyads.PLCTYPE_ULINTelif input_str == 'PLCTYPE_DATE':return pyads.PLCTYPE_DATEelif input_str == 'PLCTYPE_DATE_AND_TIME':return pyads.PLCTYPE_DATE_AND_TIMEelif input_str == 'PLCTYPE_DT':return pyads.PLCTYPE_DTelif input_str == 'PLCTYPE_TIME':return pyads.PLCTYPE_TIMEelse:return ''def Get_Time(self):# 获取当前时间CurrentTime = time.strftime('%Y/%m/%d %H:%M:%S',time.localtime(time.time()))return CurrentTime#实时显示时间def tick(self):time1 = ''time2 =self.Get_Time()if time1!=time2:time1 = time2self.text4.delete(1.0,END)self.text4.insert(1.0,time1)#self.label4.config(text=time1)self.GUI_Name.after(10,self.tick) #.after函数可以循环实现该函数# 打印日志def log(self,src):passCurrentTime = self.Get_Time()src =str(CurrentTime)+srcself.text3.delete(1.0, END)self.text3.insert(1.0, src)src = ''if __name__ == '__main__':print('-----程序开始-----')GUI = Tk()class_GUI = GUI_DISIN(GUI)class_GUI.set_init_Gui()GUI.mainloop()

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。