#!/bin/python #encoding=utf8 from tkinter import * import snap7 from functools import reduce class WidgetsDemo: def __init__(self): window = Tk() window.title("用戶界面") #添加一個多選按鈕和單選按鈕到frame1 ''' frame1 = Frame(window) frame1.pack() #看下面的解釋(包管理器) self.v2 = IntVar() rbRed = Radiobutton(frame1, text = "紅色", bg = "red", variable = self.v2, value = 1, command = self.processRaidobutton) rbYellow = Radiobutton(frame1, text="黃色", bg="yellow", variable=self.v2, value=2, command=self.processRaidobutton) #將cbtBold排列在frame1的網格第一行第一列(網格管理器也會在下面有解釋) rbRed.grid(row=1, column=2) rbYellow.grid(row=1, column=3) ''' #添加一個label、entry、button和message到frame2 frame2 = Frame(window) frame2.pack() label = Label(frame2, text = "請輸入IP") #label2 = Label(frame2, text="端口") label3 = Label(frame2, text="機架號") label4= Label(frame2, text="插槽號") lblDBNo = Label(frame2, text="db") lblDataSz = Label(frame2, text="數據大小(byte)") lblDataAd = Label(frame2, text="數據起始地址") btnCls=Button(frame2, text = "清屏", command = self.cearMsg, width =8) btnTstCnn=Button(frame2, text = "鏈接測試", command = self.testCnn, width =8) self.v1 = IntVar() btnRead = Button(frame2, text="查詢數據", command=self.queryData, width =8) self.IP = StringVar() self.IP.set('192.168.100.1') self.slot=IntVar() self.rack=IntVar() self.port=IntVar() self.port.set(502) self.DBNo=IntVar() self.dataAd=IntVar() self.dataSz=IntVar() self.data=StringVar() self.msg=StringVar() self.sendTl=StringVar() self.sendTl.set("發送") entryIP = Entry(frame2, textvariable = self.IP) entryslot = Entry(frame2, textvariable=self.slot) entryrack = Entry(frame2, textvariable=self.rack) #entryport = Entry(frame2, textvariable=self.port) entryDBNo = Entry(frame2, textvariable=self.DBNo) entrydataAd = Entry(frame2, textvariable=self.dataAd) entrydataSz= Entry(frame2, textvariable=self.dataSz) self.btnSendData = Button(frame2, text = self.sendTl.get(), command = self.sendData, width =8) label.grid(row = 1, column = 1) entryIP.grid(row = 1, column = 2) #label2.grid(row=1, column=3) #entryport.grid(row=1, column=4) label3.grid(row=1, column=3) entryslot.grid(row=1, column=4) label4.grid(row=1, column=5) entryrack.grid(row=1, column=6) lblDBNo.grid(row=2, column=1) entryDBNo.grid(row=2, column=2) lblDataAd.grid(row=2, column=3) entrydataAd.grid(row=2, column=4) lblDataSz.grid(row=2, column=5) entrydataSz.grid(row=2, column=6) btnRead.grid(row=4, column=6,sticky=W) self.btnSendData.grid(row = 3, column = 6,sticky=W) btnCls.grid(row=4, column=2,sticky=W) btnTstCnn.grid(row=4,column=5) lblData = Label(frame2, text="發送數據") lblData.grid(row=3, column=1) txtData = Entry(frame2,textvariable=self.data,width = 62) txtData.grid(row=3, column=2,columnspan=4,sticky=W ) # message.grid(row = 1, column = 4) #添加一個texttext = Text(window),顯示測試的相關信息 self.txtMsg=Text(window) self.txtMsg.pack() self.txtMsg.insert(END, "") #END表示插入到當前文本最後 window.mainloop() #數據查詢,查出結果爲Bytestring def queryData(self): plc = snap7.client.Client() try: plc.connect(self.IP.get(), self.rack.get(),self.slot.get()) data= plc.db_read(self.DBNo.get(),self.dataAd,self.dataSz) self.txtMsg.insert(END, data) except Exception as e: self.txtMsg.insert(END, (e, 'IP:', self.IP.get())) finally: if plc.get_connected(): plc.disconnect() #清空文本框中的信息 def cearMsg(self): self.txtMsg.delete(1.0, END) #鏈接測試 def testCnn(self): plc = snap7.client.Client() try: plc.connect(self.IP.get(), self.rack.get(), self.slot.get()) #if plc.get_connected: self.txtMsg.insert(END,'鏈接成功') plc.disconnect() except Exception as e: self.txtMsg.insert(END, (e, 'IP:', self.IP.get(), 'Port:')) #發送數據 def sendData(self): plc = snap7.client.Client() """ Here we replace a piece of data in a db block with new data Args: db (int): The db to use start(int): The start within the db size(int): The size of the data in bytes _butearray (enumerable): The data to put in the db """ try: data = self.StrtoByesarray(self.data.get()) if not data.strip(): self.txtMsg.insert(END,'發送數據不能爲空') return plc.connect(self.IP.get(), self.rack.get(), self.slot.get()) plc.db_write(self.DBNo, self.dataAd, data) except Exception as e: self.txtMsg.insert(END , (e,'IP:',self.IP.get(), 'Port:')) finally: if plc.get_connected(): plc.disconnect() #將bytes字符串轉化爲bytes def StrtoByesarray(self,strdata): strarry = strdata.split() list = [] for itm in strarry: list.append(itm) return bytearray(list) WidgetsDemo()