首页 > 其他分享 >施耐德 M218 自动分配地址

施耐德 M218 自动分配地址

时间:2023-09-25 17:34:42浏览次数:16  
标签:点表 施耐德 return 字节 文件 路径 数据类型 地址 M218

直接上代码

  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

相关文章

  • 国标GB28181安防视频平台EasyGBS视频地址解析原理及应用
    国标GB28181安防视频平台EasyGBS是一种基于国家标准GB28181的安防视频平台。该标准是由中国国家标准化管理委员会制定并发布的,旨在规范安防视频监控系统的设计、开发和运行。EasyGBS作为其中的一种视频地址解析方案,具有广泛的应用价值。国标GB28181安防视频平台EasyGBS是一种基......
  • C#中实现校验是否包含中文与http接口地址中解析ip和端口号
    场景Winform/CSharp中实现对Http接口地址、IP地址字符串格式/合法性校验:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/129616161在上面的基础上对某http接口地址(ip加端口号,示例http://127.0.0.1:9092)进行校验是否包含中文以及解析该地址获取ip和端口号博客:h......
  • crash —— 如果知道结构体内部某个成员的地址,如何输出结构体内容?
    以下面的task_struct为例:crash>*task_struct-oxffff893e3846e000structtask_struct{[ffff893e3846e000]structthread_infothread_info;[ffff893e3846e010]volatilelongstate;[ffff893e3846e018]void*stack;[ffff893e3846e020]atomic_tusage;[ff......
  • crash —— 内核符号和地址直接相互转换
    通过sym可以将内核地址转换成内核符号,或者将内核符号转换成内核地址。根据地址转换为符号函数地址crash>symffffffff8166f300ffffffff8166f300(T)blk_update_request+16/home/pengdl/x86_64/linux-6.2/block/blk-mq.c:896全局变量crash>sym-qpanic_on_offfff......
  • crash —— 查看数据结构内部成员的偏移量和地址
    whatis如果提前知道数据类型的定义,可以直接用struct、union等,否则可以直接用whatis。crash>whatis-opagestructpage{[0]unsignedlongflags;union{struct{union{[8]structlist_headlru;......
  • Linux安装MySQL5.6:详细步骤及下载地址
    MySQL是一款常用的关系型数据库管理系统,而在Linux系统下安装MySQL5.6则是很多开发者和系统管理员们需要掌握的技能。本文将为大家详细介绍如何在Linux系统下安装MySQL5.6。第一步:下载MySQL5.6安装包首先,我们需要从MySQL官网上下载MySQL5.6的安装包。下载地址为:。选择适合自己系......
  • 记录--a标签跳转新地址无法访问,但手动输入新地址可以访问
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助问题描述最近遇到一个有意思的问题,项目中有一个地方,点击需要跳转到一个新的域名地址笔者使用a标签做跳转,跳是跳过去了,可是跳过去以后,反而打不开了,显示403佛伯乐蛤?大致这样的代码:<ahref="http://abcdefg.com......
  • C++指针和地址偏移在HotSpot VM中的应用
     在前面我们介绍过new运算符,这个操作实际上上包含了如下3个步骤:调用operatornew的标准库函数。此函数会分配一块内存空间以便函存储相应类型的实例;调用相应类的构造函数;返回一个指向该对象的指针。在第一步中,其实我们可以自己写个operatornew函数对标准库函数进行重载,通......
  • 访问api地址时添加cookie头,防止cookie刷新
    putSession(){wx.request({url:'http://127.0.0.1:8000/api/test1',success(res){console.log(res);wx.setStorageSync('session',res.cookies)},dataType:'json'})},get......
  • 国标GB28181视频平台EasyCVR调用rtsp地址返回IP不对是什么原因?
    EasyCVR是一款安防监控、云存储和磁盘阵列存储的视频汇聚平台,具有强大的可拓展性、灵活的视频能力和轻快的部署特点。它支持主流标准协议,如GB28181、RTSP/Onvif、RTMP等,还能够接入厂家私有协议和SDK,包括海康Ehome、海大宇等设备的SDK。EasyCVR能够将视频流以RTSP、RTMP、F......