直接上代码
1 import os 2 import re 3 import tkinter as tk 4 from tkinter import filedialog 5 from tkinter import messagebox 6 from tkinter import simpledialog 7 8 9 def 主代码(): 10 global 文件路径 11 字节偏移 = int(偏移输入框.get()) 12 # print(字节偏移) 13 点表 = 读入点表(文件路径) 14 # print(点表) 15 # print('-' * 30) 16 字节 = int(字节偏移) 17 位 = 0 18 点表行数 = len(点表) 19 for i in range(点表行数): 20 点表[i].append(转西门子地址(字节, 位, 点表[i][1])) 21 点表[i].append(转M218地址(字节, 位, 点表[i][1])) 22 点表[i].append(转上位地址(字节, 位, 点表[i][1])) 23 if i == 点表行数 - 1: 24 pass 25 else: 26 字节, 位 = 指针下移(字节, 位, 点表[i][1], 点表[i + 1][1]) 27 # print(点表) 28 输出文本 = '' 29 for 点位 in 点表: 30 for 列 in 点位: 31 输出文本 += 列 + '\t' 32 输出文本 += '\n' 33 将文本写入文件(文件路径, 输出文本) 34 35 def 指针下移(字节,位,本次数据类型,下次数据类型): 36 if not 本次数据类型 in ['BOOL', 'INT', 'WORD', 'UINT']: 37 print('无法处理的数据类型') 38 return 39 if 本次数据类型 == 'BOOL': 40 if 下次数据类型 == 'BOOL': 41 if 位 >=0 and 位 < 7: 42 return 字节, 位 + 1 43 elif 位 == 7: 44 return 字节 + 1, 0 45 else: 46 print('位数值错误') 47 if 下次数据类型 == 'INT' or 数据类型 == 'WORD' or 数据类型 == 'UINT': 48 if 字节%2 == 0: 49 return 字节 + 2, 0 50 else: 51 return 字节 + 1, 0 52 if 本次数据类型 == 'INT' or 数据类型 == 'WORD' or 数据类型 == 'UINT': 53 if 下次数据类型 == 'BOOL': 54 if 字节%2 == 0: 55 return 字节 + 2, 0 56 else: 57 return 字节 + 3, 0 58 elif 下次数据类型 == 'INT' or 数据类型 == 'WORD' or 数据类型 == 'UINT': 59 if 字节%2 == 0: 60 return 字节 + 2, 0 61 else: 62 return 字节 + 3, 0 63 64 65 def 转西门子地址(字节,位,数据类型): 66 if 数据类型 == 'BOOL': 67 return 'V' + str(字节) + '.' + str(位) 68 if 数据类型 == 'INT' or 数据类型 == 'WORD' or 数据类型 == 'UINT': 69 return 'VW' + str(字节) 70 71 def 转M218地址(字节,位,数据类型): 72 if 数据类型 == 'BOOL': 73 return '%MX' + str(字节) + '.' + str(位) 74 if 数据类型 == 'INT' or 数据类型 == 'WORD' or 数据类型 == 'UINT': 75 if 字节%2 == 0: 76 return '%MW' + str(字节 // 2) 77 else: 78 return '地址异常' 79 else: 80 return '不能处理的类型' 81 82 def 转上位地址(字节,位,数据类型): 83 if 数据类型 == 'BOOL': 84 if 字节%2 == 0: 85 return "'" + str(40000 + 字节 // 2 + 1) + '.' + str(位) 86 else: 87 return "'" + str(40000 + 字节 // 2 + 1) + '.' + str(位 + 8) 88 if 数据类型 == 'INT' or 数据类型 == 'WORD' or 数据类型 == 'UINT': 89 if 字节%2 == 0: 90 return "'" + str(40000 + 字节 // 2 + 1) 91 else: 92 return '地址异常' 93 94 def 选取文件(): 95 文件路径 = filedialog.askopenfilename() 96 文件路径 = 文件路径.replace('/',chr(92)) 97 return 文件路径 98 99 def 获取文件路径(): 100 '''获取模板文件路径,并写入 模板文件路径输入框''' 101 global 文件路径 102 文件路径 = 选取文件() 103 文件路径输入框.delete(0, 'end') 104 文件路径输入框.insert(0, 文件路径) 105 106 def 读入点表(点表文件路径): 107 输入文件 = open(点表文件路径,'r',encoding = "utf-8") 108 # 读全部PLC变量 109 点表变量列表 = [] 110 for 行文本 in 输入文件: 111 点表变量列表.append(行文本.replace('\n','').split('\t')) 112 输入文件.close() 113 return 点表变量列表 114 115 def 将文本写入文件(输出文件路径, 内容): 116 输出文件 = open(输出文件路径,'w',encoding = "utf-8") 117 输出文件.write(内容) 118 输出文件.close() 119 120 文件路径 = '' 121 if __name__ == '__main__': 122 主窗口 = tk.Tk() 123 主窗口.title('施耐德自动编址') 124 主窗口.geometry('1024x90') 125 # 设置窗口颜色 126 主窗口['background'] = '#CCCCCC' 127 128 文件选择区1 = tk.Frame(主窗口) 129 文件选择区1.pack() 130 tk.Label(文件选择区1, text = '文本格式的点表:').grid(row = 0, column = 0) 131 文件路径输入框 = tk.Entry(文件选择区1, width = 100) 132 文件路径输入框.grid(row = 0,column = 1, padx = '5px') 133 文件路径输入框.delete(0, 'end') 134 文件路径输入框.insert(0, '请输入点表文件路径,或用右侧按钮选取') 135 文件路径选择按钮 = tk.Button(文件选择区1,text = '...', width = 5, command = 获取文件路径) 136 文件路径选择按钮.grid(row = 0,column = 2, padx = '5px') 137 tk.Label(文件选择区1, text = '偏移字节:').grid(row = 1, column = 0) 138 偏移输入框 = tk.Entry(文件选择区1, width = 50) 139 偏移输入框.grid(row = 1,column = 1, padx = '5px') 140 输出按钮 = tk.Button(文件选择区1,text = '...', width = 5, command = 主代码) 141 输出按钮.grid(row = 1,column = 2, padx = '5px') 142 主窗口.mainloop()View Code
标签:点表,施耐德,return,字节,文件,路径,数据类型,地址,M218 From: https://www.cnblogs.com/jichao1515/p/17728397.html