施耐德 M218 自动分配地址

发布时间 2023-09-25 17:24:59作者: 急先锋小米

直接上代码

  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         forin 点位:
 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