目标:

1.通过MC协议进行PLC上位机程序的编写

2.将学到的内容:异常捕获,tkinter显示图像

异常捕获十分方便程序开发时,当未每一个函数添加抛出异常时,可以方便判定错误出现的函数

3.生成exe格式可执行文件

pyinstaller -F xxx.py 参考文档 https://blog.csdn.net/qq_35203425/article/details/78568141

通过pyinstaller -F xxx.py -w生成的可执行文件,执行时,没有命令窗口

解决pyinstaller打包发布后的exe文件打开控制台闪退的问题

1)先打开一个cmd

2)cd到你的exe文件目录

3)输入    .\***.exe

4.python-Tkinter图形界面开发

1.按钮Button   2.文本框 Text  3.书签 notebook  4.单选按钮 Radiobutton  5.文件树 ttk.Treeview

5.数据库开发SQLite

界面:

程序(主要分为 PLC读取模块、PLC写入模块、主界面):

PLC读取模块(read_plc.py):

PLC点位:按所占内存大小分为 字软元件位软元件按地址增加方式可分为 10进制16进制

def create_command(start,length):""":param start: 起始软元件位置 例 L100:param length: 批量读取软元件个数:return: 返回读取命令"""p=start[0]p = p.upper()   #地址转变为大写adress_dict={'M':'90','L':'92','F':'93'}                   #10进制——位软元件adress_dict_1={"R":"AF"}                                     #字软元件adress_dict_2 = {'X':'9C','Y':'9D',}                        #16进制——位软元件com='500000FFFF03000C00100001040100'                       #位软元件com_1 = '500000FFFF03000C00100001040000'                   #字软元件if p in adress_dict.keys():sta=str(hex(int(start[1:])))[2:]# print(sta)if len(sta)<=6:c1 = "0"*(6-len(sta))+stac2=[]for i in range(0,6,2):c2.append(c1[i:i+2])c3=c2[::-1]sta_str=''.join(c3)# print(sta_str)l=str(hex(length))[2:]if len(l)<=4:l1="0"*(4-len(l))+ll2=[]for i in range(0,4,2):l2.append(l1[i:i+2])l3=l2[::-1]l_str=''.join(l3)return  bytes.fromhex(com+sta_str+adress_dict[p]+l_str)elif p in adress_dict_1.keys():sta = str(hex(int(start[1:])))[2:]# print(sta)if len(sta) <= 6:c1 = "0" * (6 - len(sta)) + stac2 = []for i in range(0, 6, 2):c2.append(c1[i:i + 2])c3 = c2[::-1]sta_str = ''.join(c3)# print(sta_str)l = str(hex(length))[2:]if len(l) <= 4:l1 = "0" * (4 - len(l)) + ll2 = []for i in range(0, 4, 2):l2.append(l1[i:i + 2])l3 = l2[::-1]l_str = ''.join(l3)return bytes.fromhex(com_1 + sta_str + adress_dict_1[p] + l_str)elif p in adress_dict_2.keys():# sta = str(hex(int(start[1:])))[2:]sta=start[1:]# print(sta)if len(sta) <= 6:c1 = "0" * (6 - len(sta)) + stac2 = []for i in range(0, 6, 2):c2.append(c1[i:i + 2])c3 = c2[::-1]sta_str = ''.join(c3)# print(sta_str)l = str(hex(length))[2:]if len(l) <= 4:l1 = "0" * (4 - len(l)) + ll2 = []for i in range(0, 4, 2):l2.append(l1[i:i + 2])l3 = l2[::-1]l_str = ''.join(l3)return bytes.fromhex(com + sta_str + adress_dict_2[p] + l_str)else:raise Exception('读取地址未添加')# print('读取地址未添加')def data_any(data):"""对0401 0001指令返回的数据进行解析:param data:  plc返回的指令:return:   以列表形式返回软元件的状态"""cur_data=str(data.hex())# cur_data=dataif len(cur_data)>=4 and cur_data[:4]=='d000':length=cur_data[14:18]err_code=cur_data[18:22]if err_code=='0000':l1=[]for i in range(0,4,2):l1.append(length[i:i+2])l2=''.join(l1[::-1])# print('l2',l2)l3=int(l2,16)# print('长度',l3)result=[int(i) for i in cur_data[22:]]if len(result)==(l3*2-4):return resultelse:return err_codeelse:raise Exception('解析数据错误')
def data_any_1(data):"""对0401 0000指令返回的数据进行解析:param data:  plc返回的指令:return:   以列表形式返回软元件的状态"""cur_data=str(data.hex())# cur_data=dataif len(cur_data)>=4 and cur_data[:4]=='d000':length=cur_data[14:18]err_code=cur_data[18:22]if err_code=='0000':l1=[]for i in range(0,4,2):l1.append(length[i:i+2])l2=''.join(l1[::-1])# print('l2',l2)l3=int(l2,16)# print('长度',l3)# result=[int(i) for i in cur_data[22:]]j=0results,cur_result=[],[]if len(cur_data[22:])==(l3*2-4):for i in range(22,22+l3*2-4,2):cur_result.append(cur_data[i:i+2])j+=1if j%2==0 and j!=0:cur=''.join(cur_result[::-1])results.append(int(cur,16))cur_result=[]return resultselse:return err_codeelse:raise Exception('解析数据错误')if __name__ == '__main__':# result=create_command('l100',17)# print(result)d='d00000ffff03000b000000000000000000010000'result=data_any(d)print(result)

PLC写入模块(write_plc.py)

import socketdef create_command(start,length,data):""":param start: 起始软元件位置 例 L100:param length: 批量读取软元件个数:return: 返回读取命令"""p=start[0]p = p.upper()   #地址转变为大写adress_dict={'M':'90','L':'92','F':'93'}                   #10进制——位软元件adress_dict_1={"R":"AF"}                                     #字软元件adress_dict_2 = {'X':'9C','Y':'9D',}                        #16进制——位软元件com='500000FFFF03000C00100002140100'                       #位软元件com_1 = '500000FFFF03000C00100002140000'                   #字软元件if p in adress_dict.keys():sta=str(hex(int(start[1:])))[2:]# print(sta)if len(sta)<=6:c1 = "0"*(6-len(sta))+stac2=[]for i in range(0,6,2):c2.append(c1[i:i+2])c3=c2[::-1]sta_str=''.join(c3)# print(sta_str)l=str(hex(length))[2:]if len(l)<=4:l1="0"*(4-len(l))+ll2=[]for i in range(0,4,2):l2.append(l1[i:i+2])l3=l2[::-1]l_str=''.join(l3)return  bytes.fromhex(com+"01"+sta_str+adress_dict[p]+data)elif p in adress_dict_2.keys():# sta = str(hex(int(start[1:])))[2:]sta=start[1:]# print(sta)if len(sta) <= 6:c1 = "0" * (6 - len(sta)) + stac2 = []for i in range(0, 6, 2):c2.append(c1[i:i + 2])c3 = c2[::-1]sta_str = ''.join(c3)# print(sta_str)l = str(hex(length))[2:]if len(l) <= 4:l1 = "0" * (4 - len(l)) + ll2 = []for i in range(0, 4, 2):l2.append(l1[i:i + 2])l3 = l2[::-1]l_str = ''.join(l3)return bytes.fromhex(com+"01"+sta_str+adress_dict_2[p]+data)elif p in adress_dict_1.keys():sta = str(hex(int(start[1:])))[2:]# print(sta)if len(sta) <= 6:c1 = "0" * (6 - len(sta)) + stac2 = []for i in range(0, 6, 2):c2.append(c1[i:i + 2])c3 = c2[::-1]sta_str = ''.join(c3)# print(sta_str)d = str(hex(data))[2:]if len(d) <= 4:l1 = "0" * (4 - len(d)) + dl2 = []for i in range(0, 4, 2):l2.append(l1[i:i + 2])l3 = l2[::-1]d_str = ''.join(l3)# l = str(hex(length))[2:]# if len(l) <= 4:#     l1 = "0" * (4 - len(l)) + l#     l2 = []#     for i in range(0, 4, 2):#         l2.append(l1[i:i + 2])#     l3 = l2[::-1]#     l_str = ''.join(l3)return bytes.fromhex(com_1 +"0100" +sta_str + adress_dict_1[p] +d_str)else:raise Exception('读取地址未添加')# print('读取地址未添加')if __name__ == '__main__':# 创建 socket 对象s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 获取本地主机名# host = socket.gethostname()# host = '192.168.0.11'# 设置端口号# port = 6006# 连接服务,指定主机和端口# result = s.connect((host, port))# print(result)# 接收小于 1024 字节的数据# msg = s.recv(1024)data='01'  #置01 ON 置00 OFFcom = create_command('l100', 1,data)print(com)# s.send(com)# s.close()

数据库创建、插入、查询:

"""
添加搬送、报警 历史记录表
data:2020-06-29
Auto:sunxiaomin
"""
import os
import sqlite3
import time
import numpy as npclass CreateTables():def __init__(self):self.init_tran_state = np.zeros(20, dtype=np.int32)self.init_alarm_state = np.zeros(450, dtype=np.int32)if not os.path.exists('MFLF.db'):print('数据库不存在,创建')# 建立数据库连接con = sqlite3.connect('MFLF.db')self.__create_transport_info(con, 'TRANSPORT')self.__create_transport_info(con, 'ALARM')# else:print('数据库已经存在')# 建立数据库连接self.con = sqlite3.connect('MFLF.db')self.cursor=self.con.cursor()# self.__select_table(cursor, 'COMMENT')# self.__select_table(cursor, 'ALARM')def __create_transport_info(self, con, name):# 创建cursor对象cursor = con.cursor()self.__create_tables(cursor, name)# 提交当前事物,如果未提交,对数据库的修改不会写入到数据库con.commit()def trans_data(self, tran_dict):# 创建cursor对象cursor = self.cursor# start = time.time()# ————————————搬送历史处理————————————cur_tran_state = np.array(list(tran_dict.values()),dtype=np.int32)# print('cur_tran_state',cur_tran_state)##————————————MFLF01搬送历史————————————if cur_tran_state[0] == 1 and (cur_tran_state - self.init_tran_state)[1] == 1:data = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())state = 'create'name = 'MFLF01'action = 'UP'cur_data_1 = [data, name, state, action]# print("插入数据", cur_data_1)self.__insert_table(cursor, 'TRANSPORT', cur_data_1)# print("插入数据",cur_data_1)# self.init_tran_state = cur_tran_stateelif cur_tran_state[0] == 1 and (cur_tran_state - self.init_tran_state)[2] == 1 and \(cur_tran_state - self.init_tran_state)[1] == -1:data = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())state = 'complete'name = 'MFLF01'action = 'UP'cur_data_1 = [data, name, state, action]# print("插入数据", cur_data_1)self.__insert_table(cursor, 'TRANSPORT', cur_data_1)# print("插入数据", cur_data_1)# self.init_tran_state = cur_tran_stateelif cur_tran_state[0] == 1 and (cur_tran_state - self.init_tran_state)[3] == 1:data = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())state = 'create'name = 'MFLF01'action = 'DOWN'cur_data_1 = [data, name, state, action]# print("插入数据", cur_data_1)self.__insert_table(cursor, 'TRANSPORT', cur_data_1)# print("插入数据", cur_data_1)# self.init_tran_state = cur_tran_stateelif cur_tran_state[0] == 1 and (cur_tran_state - self.init_tran_state)[4] == 1 and \(cur_tran_state - self.init_tran_state)[3] == -1:data = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())state = 'complete'name = 'MFLF01'action = 'DOWN'cur_data_1 = [data, name, state, action]# print("插入数据", cur_data_1)self.__insert_table(cursor, 'TRANSPORT', cur_data_1)# print("插入数据", cur_data_1)##————————————MFLF02搬送历史————————————if cur_tran_state[5] == 1 and (cur_tran_state - self.init_tran_state)[6] == 1:data = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())state = 'create'name = 'MFLF02'action = 'UP'cur_data_2 = [data, name, state, action]# print("插入数据", cur_data_1)self.__insert_table(cursor, 'TRANSPORT', cur_data_2)# print("插入数据",cur_data_1)# self.init_tran_state = cur_tran_stateelif cur_tran_state[5] == 1 and (cur_tran_state - self.init_tran_state)[7] == 1 and \(cur_tran_state - self.init_tran_state)[6] == -1:data = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())state = 'complete'name = 'MFLF02'action = 'UP'cur_data_2 = [data, name, state, action]# print("插入数据", cur_data_1)self.__insert_table(cursor, 'TRANSPORT', cur_data_2)# print("插入数据", cur_data_1)# self.init_tran_state = cur_tran_stateelif cur_tran_state[5] == 1 and (cur_tran_state - self.init_tran_state)[8] == 1:data = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())state = 'create'name = 'MFLF02'action = 'DOWN'cur_data_2 = [data, name, state, action]# print("插入数据", cur_data_1)self.__insert_table(cursor, 'TRANSPORT', cur_data_2)# print("插入数据", cur_data_1)# self.init_tran_state = cur_tran_stateelif cur_tran_state[5] == 1 and (cur_tran_state - self.init_tran_state)[9] == 1 and \(cur_tran_state - self.init_tran_state)[8] == -1:data = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())state = 'complete'name = 'MFLF02'action = 'DOWN'cur_data_2 = [data, name, state, action]# print("插入数据", cur_data_1)self.__insert_table(cursor, 'TRANSPORT', cur_data_2)##————————————MFLF03搬送历史————————————if cur_tran_state[10] == 1 and (cur_tran_state - self.init_tran_state)[11] == 1:data = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())state = 'create'name = 'MFLF03'action = 'UP'cur_data_3 = [data, name, state, action]# print("插入数据", cur_data_3)self.__insert_table(cursor, 'TRANSPORT', cur_data_3)# print("插入数据",cur_data_1)# self.init_tran_state = cur_tran_stateelif cur_tran_state[10] == 1 and (cur_tran_state - self.init_tran_state)[12] == 1 and \(cur_tran_state - self.init_tran_state)[11] == -1:data = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())state = 'complete'name = 'MFLF03'action = 'UP'cur_data_3 = [data, name, state, action]# print("插入数据", cur_data_1)self.__insert_table(cursor, 'TRANSPORT', cur_data_3)# print("插入数据", cur_data_1)# self.init_tran_state = cur_tran_stateelif cur_tran_state[10] == 1 and (cur_tran_state - self.init_tran_state)[13] == 1:data = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())state = 'create'name = 'MFLF03'action = 'DOWN'cur_data_3 = [data, name, state, action]# print("插入数据", cur_data_3)self.__insert_table(cursor, 'TRANSPORT', cur_data_3)# print("插入数据", cur_data_1)# self.init_tran_state = cur_tran_stateelif cur_tran_state[10] == 1 and (cur_tran_state - self.init_tran_state)[14] == 1 and \(cur_tran_state - self.init_tran_state)[13] == -1:data = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())state = 'complete'name = 'MFLF03'action = 'DOWN'cur_data_3 = [data, name, state, action]# print("插入数据", cur_data_1)self.__insert_table(cursor, 'TRANSPORT', cur_data_3)##————————————MFLF04搬送历史————————————if cur_tran_state[15] == 1 and (cur_tran_state - self.init_tran_state)[16] == 1:data = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())state = 'create'name = 'MFLF04'action = 'UP'cur_data_4 = [data, name, state, action]# print("插入数据", cur_data_1)self.__insert_table(cursor, 'TRANSPORT', cur_data_4)# print("插入数据",cur_data_1)# self.init_tran_state = cur_tran_stateelif cur_tran_state[15] == 1 and (cur_tran_state - self.init_tran_state)[17] == 1 and \(cur_tran_state - self.init_tran_state)[16] == -1:data = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())state = 'complete'name = 'MFLF04'action = 'UP'cur_data_4 = [data, name, state, action]# print("插入数据", cur_data_4)self.__insert_table(cursor, 'TRANSPORT', cur_data_4)# print("插入数据", cur_data_1)# self.init_tran_state = cur_tran_stateelif cur_tran_state[15] == 1 and (cur_tran_state - self.init_tran_state)[18] == 1:data = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())state = 'create'name = 'MFLF04'action = 'DOWN'cur_data_4 = [data, name, state, action]# print("插入数据", cur_data_1)self.__insert_table(cursor, 'TRANSPORT', cur_data_4)# print("插入数据", cur_data_1)# self.init_tran_state = cur_tran_stateelif cur_tran_state[15] == 1 and (cur_tran_state - self.init_tran_state)[19] == 1 and \(cur_tran_state - self.init_tran_state)[18] == -1:data = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())state = 'complete'name = 'MFLF04'action = 'DOWN'cur_data_4 = [data, name, state, action]# print("插入数据", cur_data_1)self.__insert_table(cursor, 'TRANSPORT', cur_data_4)self.init_tran_state = cur_tran_state# 提交当前事物,如果未提交,对数据库的修改不会写入到数据库self.con.commit()# end = time.time()# time.sleep(1 - (end - start))def alarm_data(self,result,alarm_dict):cur_result_1 = np.array(result[:450], dtype=np.int32)# cur_result_1 = np.array([0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0], dtype=np.int32)cur_result = cur_result_1 - self.init_alarm_stateself.init_alarm_state = cur_result_1result = [str(i) for i in cur_result]result_alarm, result_reset = result, result"------获取报警序列------"indexs_alarm = []l_a = 0while len(result_alarm) > 0 and ('1' in result_alarm):# ind=result_alarm.find('1')ind = result_alarm.index('1')# if ind!=-1:indexs_alarm.append(ind + l_a)result_alarm = result_alarm[ind + 1:]l_a += ind + 1"------获取恢复序列------"indexs_reset = []l_r = 0while len(result_reset) > 0 and ('-1' in result_reset):# ind = indexs_reset.find('-1')ind = result_reset.index('-1')# if ind != -1:indexs_reset.append(ind + l_r)result_reset = indexs_reset[ind + 1:]l_r += ind + 1"------数据库插入报警信息------"if len(indexs_alarm) > 0:for index in indexs_alarm:index = "F" + str(int(index))# 向表中查询数据alarm_text = alarm_dict[index]data = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())state = 'alarm'# cur_data = ["{}".format(data),"{}".format(state) , "{}".format(index), "{}".format(list(alarm_text)[0][2]) ]cur_data = [data, state, index, alarm_text]print('插入数据为', cur_data)self.__insert_table(self.cursor, 'ALARM', cur_data)"------数据库插入恢复信息------"if len(indexs_reset) > 0:for index in indexs_reset:index =  "F" + str(int(index))# 向表中查询数据alarm_text =alarm_dict[index]data = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())state = 'reset'# cur_data = ["{}".format(data), "{}".format(state), "{}".format(index),#             "{}".format(list(alarm_text)[0][2])]cur_data = [data, state, index, alarm_text]print('插入数据为', cur_data)self.__insert_table(self.cursor, 'ALARM', cur_data)def __create_tables(self, cursor, name):# 创建表try:if name == 'COMMENT':cursor.execute("""CREATE TABLE {}(ID    INTEGER PRIMARY KEY AUTOINCREMENT,NAME  TEXT,ALARM TEXT)""".format(name))elif name == 'ALARM':cursor.execute("""CREATE TABLE {}(DATA      TEXT,STATE     TEXT,NAME      TEXT,ALARM     TEXT)""".format(name))elif name == 'TRANSPORT':cursor.execute("""CREATE TABLE {}(DATA      TEXT,NAME      TEXT,STATE     TEXT,ACTION     TEXT)""".format(name))except Exception as err:print(err)print('{}表删除中...'.format(name))cursor.execute("""DROP TABLE {}""".format(name))print('{}表已经删除,正在重新创建...'.format(name))if name == 'COMMENT':cursor.execute("""CREATE TABLE {}(ID    INTEGER PRIMARY KEY AUTOINCREMENT,NAME  TEXT,ALARM TEXT)""".format(name))elif name == 'ALARM':cursor.execute("""CREATE TABLE {}(DATA TEXT,STATE  TEXT,NAME      TEXT,ALARM     TEXT)""".format(name))elif name == 'TRANSPORT':cursor.execute("""CREATE TABLE {}(DATA      TEXT,NAME      TEXT,STATE     TEXT,ACTION     TEXT)""".format(name))print('{}表创建成功'.format(name))def __insert_table(self, cursor, name, data):# 表中添加数据if name == 'COMMENT':# print('正常插入')cursor.execute("""INSERT INTO {}(NAME,ALARM)VALUES ({},{})""".format(name, data[0], data[1]))elif name == 'ALARM':cursor.execute("""INSERT INTO {}(DATA,STATE,NAME,ALARM)VALUES ("{}","{}","{}","{}")""".format(name, data[0], data[1], data[2], data[3]))elif name == 'TRANSPORT':cursor.execute("""INSERT INTO {}(DATA,NAME,STATE,ACTION)VALUES ("{}","{}","{}","{}")""".format(name, data[0], data[1], data[2], data[3]))def insert_table_test(self, name, data):cursor = self.cursor# 表中添加数据if name == 'COMMENT':# print('正常插入')cursor.execute("""INSERT INTO {}(NAME,ALARM)VALUES ({},{})""".format(name, data[0], data[1]))elif name == 'ALARM':cursor.execute("""INSERT INTO {}(DATA,STATE,NAME,ALARM)VALUES ("{}","{}","{}","{}")""".format(name, data[0], data[1], data[2], data[3]))elif name == 'TRANSPORT':cursor.execute("""INSERT INTO {}(DATA,NAME,STATE,ACTION)VALUES ("{}","{}","{}","{}")""".format(name, data[0], data[1], data[2], data[3]))self.con.commit()def select_table(self, name,start,end):cursor = self.cursor# 向表中查询数据result = cursor.execute("""SELECT * FROM {} WHERE DATA BETWEEN "{}" AND "{}"""".format(name,start,end))# result = cursor.execute(#     """#     SELECT * FROM {}#     """.format(name)# )# print(list(result))return list(result)if __name__ == '__main__':creat = CreateTables()# creat.select_table("ALARM","2020-06-29 00:00:00", "2020-06-30 00:00:00")for i in range(20):data = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())state = 'create'name = 'MFLF01'action = 'UP'cur_data_1 = [data, name, state, action]creat.insert_table_test("ALARM",cur_data_1)time.sleep(1)

主程序:

实际应用中存在多个界面,本处仅列出一个程序样例

# 通过notebook实现窗口切换
from tkinter.dialog import *
# import  tkinter as tk
from tkinter import *
from tkinter import ttk
import os
import sqlite3
import time
import socket
import threading
#import pandas
#import numpy as np
import read_plc as plc
import write_plc as wplc
#from create_table_0628 import CreateTables as tables
class LFT_HOST():def __init__(self):self.com_path = "comment.csv"self.err_dict = {}self.trans_dict={}# self.create_alarm_info()# self.tables=tables()self.host = '192.168.0.11'self.port = 6006# 创建 socket 对象self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 连接服务,指定主机和端口result = self.s.connect((self.host, self.port))print("连接结果",result)self.vars_dict={}self.root=Tk()self.var1_1,self.var2_1,self.var3_1,self.var4_1=StringVar(),StringVar(),StringVar(),StringVar()self.var1_2,self.var2_2,self.var3_2,self.var4_2 = StringVar(),StringVar(),StringVar(),StringVar()self.var1_3,self.var2_3,self.var3_3,self.var4_3 = StringVar(),StringVar(),StringVar(),StringVar()self.var1_4,self.var2_4,self.var3_4,self.var4_4 = StringVar(),StringVar(),StringVar(),StringVar()self.var1_5,self.var2_5,self.var3_5,self.var4_5 = StringVar(),StringVar(),StringVar(),StringVar()self.var1_12,self.var2_12,self.var3_12,self.var4_12 = StringVar(),StringVar(),StringVar(),StringVar()self.var1_6,self.var2_6,self.var3_6,self.var4_6 = StringVar(),StringVar(),StringVar(),StringVar()self.var1_7,self.var2_7,self.var3_7,self.var4_7 = StringVar(),StringVar(),StringVar(),StringVar()self.var1_8,self.var2_8,self.var3_8,self.var4_8 = StringVar(),StringVar(),StringVar(),StringVar()self.var1_9,self.var2_9,self.var3_9,self.var4_9 = StringVar(),StringVar(),StringVar(),StringVar()self.var1_10,self.var2_10,self.var3_10,self.var4_10 = StringVar(),StringVar(),StringVar(),StringVar()self.var1_11,self.var2_11,self.var3_11,self.var4_11 = StringVar(),StringVar(),StringVar(),StringVar()self.var1_13, self.var2_13, self.var3_13, self.var4_13 = StringVar(), StringVar(), StringVar(), StringVar()self.var1_14, self.var2_14, self.var3_14, self.var4_14 = StringVar(), StringVar(), StringVar(), StringVar()self.var1_15, self.var2_15, self.var3_15, self.var4_15 = StringVar(), StringVar(), StringVar(), StringVar()self.var1_16, self.var2_16, self.var3_16, self.var4_16 = StringVar(), StringVar(), StringVar(), StringVar()self.var1_17, self.var2_17, self.var3_17, self.var4_17 = StringVar(), StringVar(), StringVar(), StringVar()self.var1_18, self.var2_18, self.var3_18, self.var4_18 = StringVar(), StringVar(), StringVar(), StringVar()# self.interface_1()# self.home_face()#self.data_proces()t1=threading.Thread(target=self.data_proces,args=[])t1.setDaemon(True)t1.start()# self.root.mainloop()def create_alarm_info(self):# 生成报警信息字典with open(self.com_path, encoding='utf-16') as f:# utf-16与utf-8的区别results = f.read().splitlines()for data_str in results[2:]:result = data_str.split('\t')index = result[0].strip(result[0][0])if index[0] == "F":self.err_dict[index] = result[1].strip(result[1][0])def data_proces(self):# 数据处理,显示与保存# 创建 socket 对象#self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 连接服务,指定主机和端口#result = self.s.connect((self.host, self.port))#print("连接结果",result)while True:start=time.time()try:##——————状态界面显示——————face_adress_1,face_adress_2,face_adress_3,face_adress_4="X70","L2101","M100","R110"face_len_1,face_len_2,face_len_3,face_len_4=4720,10,380,310###——————X系列——————com_1 = plc.create_command(face_adress_1,face_len_1)self.s.send(com_1)msg_1 = self.s.recv(5000)# s.close()result_1 = plc.data_any(msg_1)self.data_analysis_x(result_1,face_adress_1)###——————L系列——————com_2 = plc.create_command(face_adress_2, face_len_2)self.s.send(com_2)msg_2 = self.s.recv(1024)# s.close()result_2 = plc.data_any(msg_2)self.data_analysis_l(result_2, face_adress_2)###——————M系列——————com_3 = plc.create_command(face_adress_3, face_len_3)self.s.send(com_3)msg_3 = self.s.recv(1024)# s.close()result_3 = plc.data_any(msg_3)self.data_analysis_m(result_3, face_adress_3)###——————R系列——————com_4 = plc.create_command(face_adress_4, face_len_4)self.s.send(com_4)msg_4 = self.s.recv(1024)# s.close()result_4 = plc.data_any_1(msg_4)self.data_analysis_r(result_4, face_adress_4)except:print("数据读取错误")else:###——————MFLF01系列——————self.__aflf08_set()end = time.time()#print(end-start)#time.sleep(0.5-(end-start))##——————搬送历史记录——————##——————报警历史记录——————def data_analysis_x(self,data,start):res_vals=["X74","X77","X78","X79",   "X80","X83","X84","X87", "X88","X89","X8A",  "X8B","X8C","X8D","X1007", "X1010","X1013"]for val in res_vals:index=int(val[1:],16)-int(start[1:],16)self.vars_dict[val]=data[index]def data_analysis_l(self,data,start):res_vals =["L2101","L2102","L2105", ]for val in res_vals:index=int(val[1:])-int(start[1:])self.vars_dict[val]=data[index]def data_analysis_m(self,data,start):res_vals =["M100","M101","M102","M106","M109","M140","M160"]for val in res_vals:index=int(val[1:])-int(start[1:])self.vars_dict[val]=data[index]def data_analysis_r(self,data,start):res_vals =["R110"]for val in res_vals:index=int(val[1:])-int(start[1:])self.vars_dict[val]=data[index]def data_analysis_f(self,data,start):# 数据库插入报警内容self.tables.alarm_data(data,self.err_dict)self.errs_list = []data_str=[str(s) for s in data]data_str1="".join(data_str)start_i=0while start_i<len(data_str1):index_err=data_str1.find("1",start_i)if index_err>=0:self.errs_list.append(int(index_err))# 数据库插入报警内容# alam_index="F"+str(index_err)start_i=index_err+1else:breakdef __aflf08_set(self):if self.vars_dict["M100"]:self.var1_1.set("1")else:self.var1_1.set("0")# self.alarm_text_1.delete(1.0, "end")if self.vars_dict["M101"] or self.vars_dict["M102"] or self.vars_dict["M106"]:self.var1_2.set("1")else:self.var1_2.set("0")if self.vars_dict["M109"]:self.var1_16.set("1")else:self.var1_16.set("0")self.pos_text_1.delete(1.0, "end")self.pos_text_1.insert("insert", self.vars_dict["R110"])if self.vars_dict["M160"]:self.var1_10.set("1")else:self.var1_10.set("0")if self.vars_dict["X74"]:self.var1_11.set("1")elif self.vars_dict["X1007"]:self.var1_11.set("2")else:self.var1_11.set("0")if self.vars_dict["L2101"]:self.var1_13.set("1")else:self.var1_13.set("0")if self.vars_dict["L2102"]:self.var1_14.set("1")else:self.var1_14.set("0")if self.vars_dict["L2105"]:self.var1_15.set("1")else:self.var1_15.set("0")if self.vars_dict["X87"]:self.var1_3.set("2")elif self.vars_dict["X84"]:self.var1_3.set("1")else:self.var1_3.set("0")if self.vars_dict["X1013"]:self.var1_4.set("2")elif self.vars_dict["X1010"]:self.var1_4.set("1")else:self.var1_4.set("0")if self.vars_dict["X83"]:self.var1_5.set("2")elif self.vars_dict["X80"]:self.var1_5.set("1")else:self.var1_5.set("0")if self.vars_dict["X8C"]:self.var1_12.set("2")elif self.vars_dict["X8D"]:self.var1_12.set("1")else:self.var1_12.set("0")if self.vars_dict["X88"]:self.var1_17.set("2")elif self.vars_dict["X89"]:self.var1_17.set("1")else:self.var1_17.set("0")if self.vars_dict["X8A"]:self.var1_18.set("2")elif self.vars_dict["X8B"]:self.var1_18.set("1")else:self.var1_18.set("0")if self.vars_dict["X77"]:self.var1_7.set("1")else:self.var1_7.set("0")if self.vars_dict["X78"]:self.var1_8.set("1")else:self.var1_8.set("0")if self.vars_dict["X79"]:self.var1_9.set("1")else:self.var1_9.set("0")if self.vars_dict["M140"]:self.var1_6.set("1")else:self.var1_6.set("0")def reset(self):# 1.manualm1_com = wplc.create_command('L11', 1, "01")self.s.send(m1_com)msg=self.s.recv(1024)m2_com = wplc.create_command('L11', 1, "00")self.s.send(m2_com)msg=self.s.recv(1024)# 2.RESETr1_com = wplc.create_command('L13', 1, "01")self.s.send(r1_com)msg=self.s.recv(1024)r2_com = wplc.create_command('L13', 1, "00")self.s.send(r2_com)msg=self.s.recv(1024)# 3.AUTO RUN READYa1_com = wplc.create_command('L6301', 1, "01")self.s.send(a1_com)msg=self.s.recv(1024)time.sleep(0.5)# r_com = wplc.create_command('L10', 1, "00")# self.s.send(r_com)def auto(self):# AUTOa2_com = wplc.create_command('L10', 1, "01")self.s.send(a2_com)msg=self.s.recv(1024)a3_com = wplc.create_command('L10', 1, "00")self.s.send(a3_com)msg=self.s.recv(1024)# AUTO STARTa4_com = wplc.create_command('X6B', 1, "01")self.s.send(a4_com)msg=self.s.recv(1024)a5_com = wplc.create_command('X6B', 1, "00")self.s.send(a5_com)msg=self.s.recv(1024)def home_face(self):# 设定主窗口self.root.title("电梯上位机监控程序")self.root.geometry("750x400+50+100")self.root.update()self.root.resizable(width=False,height=False)notebook=ttk.Notebook(self.root)# 创建不同的Frame,相当于不同的桌布##——————编辑状态界面——————face1 = Frame(self.root, width=330, height=280)face1.grid(row=0, column=0, rowspan=10, columnspan=13, sticky='EW', pady=1, padx=1)###————————MFLF01界面开发——————# DOOR=["L1 DOOR","L2 DOOR","L3 DOOR","CLAMP"]DOOR = ["L1 DOOR", "L2 DOOR", "Cage DOOR","CLAMP(OFF/ON)","FLOAT(D/U)","CENT(B/F)"]labelfrm_1 = LabelFrame(face1, text='AFLF08', width=100, height=55)labelfrm_1.grid(row=0, column=0, ipadx=1, ipady=1, padx=1, pady=1)mflf01_v = [self.var1_3, self.var1_4, self.var1_5, self.var1_12, self.var1_17,self.var1_18]Label(labelfrm_1, text="RUN").grid(row=0, column=0, sticky='EW', pady=5, padx=5)Radiobutton(labelfrm_1,variable=self.var1_1, value='1').grid(row=0, column=1, sticky='EW', pady=5, padx=5)self.var1_1.set('0')Label(labelfrm_1, text="ALARM").grid(row=0, column=2, sticky='EW', pady=5, padx=5)Radiobutton(labelfrm_1, variable=self.var1_2, value='1').grid(row=0, column=3, sticky='EW', pady=5, padx=5)self.var1_2.set('0')# but1 = Button(labelfrm_1, text='MANUAL', command=self.manual, width=16, height=1)# but1.grid(row=0, column=4, sticky='EW', pady=5, padx=5)but2 = Button(labelfrm_1, text='RESET', command=self.reset, width=16, height=1)but2.grid(row=0, column=4, sticky='EW', pady=5, padx=5)but3 = Button(labelfrm_1, text='AUTO', command=self.auto, width=16, height=1)but3.grid(row=0, column=5, sticky='EW', pady=5, padx=5)# Label(labelfrm_1, text="ALARM TEXT").grid(row=0, column=4, sticky='EW', pady=5, padx=5)# self.alarm_text_1=Text(labelfrm_1, width=20, height=1, )# self.alarm_text_1.grid(row=0, column=5, sticky='EW', pady=5, padx=5,columnspan=5)Label(labelfrm_1, text="AUTO RUN READY").grid(row=0, column=6, sticky='EW', pady=5, padx=5)Radiobutton(labelfrm_1, variable=self.var1_16, value='1').grid(row=0, column=7, sticky='EW', pady=5, padx=5)self.var1_16.set('0')labelfrm_1_1 = LabelFrame(labelfrm_1, text='DOOR', width=100, height=55)labelfrm_1_1.grid(row=1, column=0,rowspan=5, columnspan=4, ipadx=5, ipady=1, padx=5, pady=1)Label(labelfrm_1_1, text="OPEN").grid(row=1, column=1, sticky='EW', pady=5, padx=5)Label(labelfrm_1_1, text="CLOSE").grid(row=1, column=2, sticky='EW', pady=5, padx=5)Label(labelfrm_1_1, text="NO USE").grid(row=1, column=3, sticky='EW', pady=5, padx=5)Radiobutton(labelfrm_1_1, variable=self.var1_13, value='1').grid(row=2 , column=3, sticky='EW', pady=5,padx=5)Radiobutton(labelfrm_1_1, variable=self.var1_14, value='1').grid(row=3, column=3, sticky='EW', pady=5,padx=5)Radiobutton(labelfrm_1_1, variable=self.var1_15, value='1').grid(row=4, column=3, sticky='EW', pady=5,padx=5)self.var1_13.set('0')self.var1_14.set('0')self.var1_15.set('0')for i,text in enumerate(DOOR):mflf01_v[i].set("0")Label(labelfrm_1_1, text=text).grid(row=2+i, column=0, sticky='EW', pady=5, padx=5)Radiobutton(labelfrm_1_1, variable=mflf01_v[i], value='1').grid(row=2+i, column=1, sticky='EW', pady=5, padx=5)Radiobutton(labelfrm_1_1, variable=mflf01_v[i], value='2').grid(row=2+i, column=2, sticky='EW', pady=5, padx=5)labelfrm_1_2 = LabelFrame(labelfrm_1, text='CST', width=100, height=55)labelfrm_1_2.grid(row=1, column=4, rowspan=2, columnspan=6, ipadx=5, ipady=5, padx=5, pady=5)Label(labelfrm_1_2, text="good pos").grid(row=0, column=0, sticky='EW', pady=5, padx=5, columnspan=1)Radiobutton(labelfrm_1_2, variable=self.var1_6, value='1').grid(row=0, column=1, sticky='EW', pady=5, padx=5)self.var1_6.set("0")Label(labelfrm_1_2, text="input safty" ,width=10, height=1).grid(row=1, column=0, sticky='EW', pady=5, padx=5)Radiobutton(labelfrm_1_2, variable=self.var1_7, value='1').grid(row=1, column=1, sticky='EW', pady=5, padx=5)self.var1_7.set("0")Label(labelfrm_1_2, text="decel",width=10, height=1).grid(row=1, column=2, sticky='EW', pady=5, padx=5)Radiobutton(labelfrm_1_2, variable=self.var1_8, value='1').grid(row=1, column=3, sticky='EW', pady=5, padx=5)self.var1_8.set("0")Label(labelfrm_1_2, text="stop",width=10, height=1).grid(row=1, column=4, sticky='EW', pady=5, padx=5)Radiobutton(labelfrm_1_2, variable=self.var1_9, value='1').grid(row=1, column=5, sticky='EW', pady=5, padx=5)self.var1_9.set("0")labelfrm_1_3 = LabelFrame(labelfrm_1, text='LFT', width=100, height=55)labelfrm_1_3.grid(row=3, column=4,rowspan=2, columnspan=6, ipadx=5, ipady=5, padx=5, pady=5)Label(labelfrm_1_3, text="POS OK",width=10, height=1).grid(row=0, column=0, sticky='EW', pady=5, padx=5)Radiobutton(labelfrm_1_3, variable=self.var1_10, value='1').grid(row=0, column=1, sticky='EW', pady=5, padx=5)self.var1_10.set("0")Label(labelfrm_1_3, text="CUR POS ",width=10, height=1).grid(row=0, column=2, sticky='EW', pady=5, padx=5)self.pos_text_1 = Text(labelfrm_1_3, width=10, height=1, )self.pos_text_1.grid(row=0, column=3,rowspan=1,columnspan=2, sticky='EW', pady=5, padx=5)Label(labelfrm_1_3, text="L1",width=10, height=1).grid(row=1, column=0, sticky='EW', pady=5, padx=5)Radiobutton(labelfrm_1_3, variable=self.var1_11, value='1').grid(row=1, column=1, sticky='EW', pady=5, padx=5)Label(labelfrm_1_3, text="L2",width=10, height=1).grid(row=1, column=2, sticky='EW', pady=5, padx=5)Radiobutton(labelfrm_1_3, variable=self.var1_11, value='2').grid(row=1, column=3, sticky='EW', pady=5, padx=5)# Label(labelfrm_1_3, text="L3",width=10, height=1).grid(row=1, column=4, sticky='EW', pady=5, padx=5)# Radiobutton(labelfrm_1_3, variable=self.var1_11, value='3').grid(row=1, column=5, sticky='EW', pady=5, padx=5)self.var1_11.set("0")notebook.add(face1, text="LFT 状态")notebook.grid()self.root.mainloop()
#
if __name__ == '__main__':lft=LFT_HOST()lft.home_face()

PLC上位机程序开发相关推荐

  1. java开发plc上位机软件开发_上位机开发之西门子PLC-S7通信实践

    写在前面: 就目前而言,在中国的工控市场上,西门子仍然占了很大的份额,因此对于上位机开发而言,经常会存在需要与西门子PLC进行通信的情况.然后对于西门子PLC来说,通信方式有很多,下面简单列举一下: ...

  2. 以太网采集欧姆龙PLC DM数据并存入ACCESS 使用C#编写上位机程序

    以太网采集欧姆龙PLC DM数据并存入ACCESS 使用C#编写上位机程序,通过以太网使用FinsTCP协议读取欧姆龙PLC DM区数据. 附图是程序界面,只要输入PLC IP地址.DM区起始地址号和 ...

  3. ubuntu下Qt开发西门子PLC上位机

    一条流水线,因为下位机PLC比较固定,用的是1200和1500和倍福IO模块,重要的是逻辑,没什么好写,就写写上位机吧,虽然也就是集成各功能,但作为记录下历程也不错的,也算是新公司一个小小的里程碑了, ...

  4. 自己用C#写的控制三菱FX5U PLC(三菱任何系列都通用,网口,串口都行)的上位机程序

    自己用C#写的控制三菱FX5U PLC(三菱任何系列都通用,网口,串口都行)的上位机程序,PLC源程序也附上,是学习C#和三菱PLC通信的好例子,有对辅助继电器M,对单字,双子D的读写,IO的监控,报 ...

  5. C#写的控制三菱FX5U PLC(三菱任何系列都通用,网口,串口都行)的上位机程序

    自己用C#写的控制三菱FX5U PLC(三菱任何系列都通用,网口,串口都行)的上位机程序,PLC源程序也附上,是学习C#和三菱PLC通信的好例子,有对辅助继电器M,对单字,双子D的读写,IO的监控,报 ...

  6. 工业监测自动化上位机软件开发,支持PLC通信,以及与各类品牌 的电流表、频谱仪、电子负载、功率计等通信

    工业监测自动化上位机软件开发,支持PLC通信,以及与各类品牌 的电流表.频谱仪.电子负载.功率计等通信 本人拥有十多年工业项目.仪器仪表产品.教学产品开发以及培训经验,精通STM32.Msp430等各 ...

  7. Ubuntu配置上位机Blackfin开发环境手记

    Ubuntu配置上位机Blackfin开发环境手记 -------- 本文档适合使用Ctrl+F 搜索关键字 -------------- -------- It's more convenient ...

  8. stm32实现心电监测-原理图单片机程序C#上位机程序

    十年前接触生物电子让我对电子产生浓厚的兴趣,让我感到电子科技的博大精深无所不能.最近用stm32和C#实现心电监测,分享给大家一起探讨,我也把这些技术资料整理下. 原理图 心电前端采集电路采用仪表放大 ...

  9. 上位机软件开发项目案例(一)_C#开发

    了解或咨询 上位机软件开发/LabVIEW软件开发/C#软件开发/QT软件开发,请访问AgainDo再度科技官网:www.againdo.com 概述 该软件为线束连接器自动化生产设备上位机软件,系统 ...

最新文章

  1. 支付宝何以支撑双十一4200万次/秒的数据库请求峰值?
  2. 原生JS实现图片滚动
  3. java w3c xml_org.w3c.dom(java dom)解析XML文档
  4. Java 三个线程依次输出ABC
  5. Python 从协议到抽象基类
  6. ActiveMQ(四)——异步发消息、异步消费消息与prefetchSize之间的关系
  7. 转速双闭环matlab仿真,电流转速双闭环直流调速系统matlab仿真 实验.doc
  8. 计算机老是蓝屏需要重新启动3,电脑蓝屏重启,教您电脑经常自动蓝屏重启怎么办...
  9. 后缀–ize_常见词性后缀
  10. 一些又用的国内著名期刊
  11. 服务器CPU使用率过高排查与解决思路
  12. 代码笔记源码php,读 PHP - Pimple 源码笔记(上)
  13. 漫画:国内都有哪些程序员大牛?
  14. 杰理之79NRTC 时间【篇】
  15. Maven2的相关知识[zt]
  16. STM32F103高级定时器死区时间计算
  17. 阿里的数据分析技术有多强?从优酷的大数据架构中,我学到了这些
  18. 事件的独立和事件互不相容两个概念的区别
  19. 风影ASP.NET基础教学 6用户控件
  20. 鸿蒙系统几年不卡,华为手机别乱选,这四款机型基本三年不卡,并且可以升级鸿蒙系统...

热门文章

  1. 新导智能RTK高精度定位解决方案
  2. centos7.9 配置无线网卡连接wifi
  3. 数字电路--三态门解析
  4. 七代处理器装win7_为什么7代CPU不支持WIN7操作系统?
  5. c语言行列式源代码,行列式计算器(C语言设计源代码)
  6. 无人机送快递是噱头还是方向? 实现智慧物流还需时日
  7. 把pdf转换成ppt文件,原来这么简单
  8. python3 从入门到精通视频教程下载-Python 3.7从入门到精通(视频教学版)
  9. Mocha Pro:跟踪模块
  10. 数据结构(Java)——队列的实现