我用PYQT5做的第一个实用的上位机项目(六)

news2024/9/29 13:24:56

将之前的画面和代码用复制粘贴的方法复制四份,就完成了整个主画面和主程序的基本构建。

下面的工作是关于PLC和通信。 

        上位机项目,其与PLC通信的模式很多都是这样的:在没有操作和设置的平常显示界面,按照预定周期从PLC读取当前页面需要刷新的部件的数据字节,并对字节进行解码和刷新。当有了设置和改变的动作,需要改写PLC的内部数据时,把需要改写的地址和数据发送给PLC。

        查阅了很多资料,关于上位机与PLC通信这块,大多数都是针对西门子的,并且使用了Snap7。使用Snap7确实可以使问题简化,但是如果PLC不是西门子品牌就无能为力了。即使是西门子PLC,还要对PLC的内部寄存器地址、指针、语句编程这些知识进行深入学习才能灵活应用。像我这样的以搞控制为主的,PLC和上位机编程都只是简单用用的人,就感觉很吃力。一句题外话,玩了三十年工控,到目前为止PLC程序也做过上千个了,大多数时候都还是梯形图和直接地址访问,每每看到那些大公司的专业PLC编程工程师熟练地使用间接寻址和语句编程,都觉得很汗颜。所以,这里采用了通用的tcp ip的socket通信模式,自定义报文,直接地址读写,好处是提高了通用性、降低了技术难度,坏处是PLC端需要额外编写一些通信程序,不过PLC的程序全部都是直接地址访问,用不到考虑指针和寄存器地址映射之类的,编程也可以用梯形图,属于简单劳动。

        既然是自定义报文,每个人完全可以根据PLC的品牌型号以及自己的习惯来约定报文的内容。我这里的范例,上位机发送到PLC的报文采用固定长度,每个报文长度12个字节,前6个字节是功能码,后面4个字节是数据内容,最后2个字节与第一第二个字节内容相同,作为结束符用来断帧和校验,防止TCP数据粘连。

        1、对PLC的例行的周期查询,报文第1、2字节为字符“A0”,第3字符是画面编号,第4、5是对应的周期,第6是周期时间的单位,7-10字节用字符“0”填充,11、12与第1、2字节相同为字符“A0”。例如:报文A0101S0000A0,其含义是编号1的画面一秒周期的查询。至于本次需要查询哪些部件的变量,这些变量的类型和字节长度都是提前规划好并在PLC端写好了对应的子程序,当PLC端收到报文并且报文头6字节与字符串“A0101S”比对成功,报文的第11、12字节与字符串“A0”比对成功,就执行相应的子程序把上位机需要的地址的内容复制到PLC的通信发送缓冲区打包并发送至上位机,上位机收到返回的数据后,按照提前规划的变量的类型和字节长度解码并刷新显示界面。

        总之,所有的需要查询的内容都是已知和提前规划的,PLC端只需要比对收到的报文字符串前6个字节和第11、12 字节,调用对应的子程序将需要的地址的数据复制到送缓冲区打包发送。

        举例:画面2,每10秒钟需要读取PLC的MW10、VD100、QB0这几个变量,那么每隔10秒钟,发送报文字符串“A0210S0000A0”到PLC,PLC收到报文,前6个字节与“A0210S”比对成功,第11、12字节与字符串“A0”比对成功,执行对应的子程序将MW10、VD100、QB0这几个变量的值写入发送缓冲区打包并发送至上位机。上位机收到返回数据,按照提前规划的“整数、实数、字节”(即MW10、VD100、QB0这几个变量的类型)的顺序解码数据并分配刷新各个部件。由于采用了约定自定义报文的方式,PLC端对所有地址的操作都是直接的地址访问,用不着考虑寄存器实际地址和指针,不同的PLC,上位机的报文也是通用的(唯一需要考虑大小端编码)。

        另,各个周期的查询内容是长周期包含短周期,例如10秒周期的查询包含了1秒周期的查询内容。

        2、对PLC的写操作,由于本例项目很小,需要写的数据并不多,所以也采用了约定报文的方式,如果数据量较大,这种方式就不太方便,必须用到指针了。话又说回来,之所以费劲巴交地自己写代码,就是因为项目小,利润低,没法用正版scada,如果是数据很多的大项目,有足够的利润支撑就直接用正版wincc、组态王了,那功能又强大,使用又简便。至于盗版嘛,看您高不高兴了,不在讨论范围内。

        言归正传,本例中,对PLC的写操作,第1、2字节为字符“B0”,第3、4字节为事件编号,例如可以将“启动/停止缓凝剂“事件定义为01事件,5、6字节用字符0填充,7、8、9、10字节为数据内容,这里的数据内容之所以用了4个字节是因为有可能传输的最长数据格式是浮点数,长度为4个字节。对于长度小于4个字节的数据类型,靠前的字节为有效数据,后面的用b'\x00'填充。第11、12字节为字符“B0”,与第1、2字节相同,作为结束符用来断帧和校验,防止TCP数据粘连。

        当PLC收到报文后,并且第1、2字节和第11、12字节与字符”B0“比对成功,就读取第3、4字节的事件编号,执行相应编号的子程序,执行约定的操作。

        举例:上位机发送报文b'B001\x00\x00\x01\x00\x00\x00B0',这个报文的开头和结尾为B0,表示要对PLC写操作,事件编号为第3、4字节01,5、6字节无意义,第7字节为数据位b'\x01',将其约定为”启动缓凝剂“,在PLC程序里,实现该事件的的方法是将Q0.0置位,编写并执行该子程序(或网络)即可。

        至此,通信报文的基本规划就完成了,还可以加入一些别的约定报文,例如报警、故障什么的,看个人需要了。总结一下,本例采用了基于tcp ip协议的socket通信(这个叫法貌似不是很专业,管他呢,我也不是专业的程序员,能用就好),PLC作为服务器,上位机作为客户端。所有的通信均由上位机发起,上位机的程序中有系统定时器,周期地查询PLC中的数据,PLC根据收到的报文内容做出响应,并根据约定代码的不同执行不同的子程序或网络,对PLC内部数据进行读写和发送。在任何时候,上位机发给PLC的报文都是固定长度的,报文的首2和末2字节内容相同,作为事件定义和断帧校验。tcp通信是基于”流“的,就没有严格意义上的”帧“,tcp通信的最大隐患就是数据帧长度的不确定性,很容易造成接收缓冲区数据排序混乱,这也是我之前做过的很多PLC通信项目遇到过的问题,固定PLC接收通信数据的长度并把通信报文中加入断帧和校验字符,就可以很好地解决这个问题。

        下面的工作就是编写实际的程序了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1077742.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一个命令让redis服务端所有信息无所遁形~(收藏吃灰系列)

Redis服务器是一个事件驱动程序,它主要处理两类事件:文件事件和时间事件。这些事件的处理和Redis命令的执行密切相关。下面我将以Redis服务端命令为切入点,深入解析其工作原理和重要性。 首先,我们先了解Redis服务端有哪些命令。…

linux 安装下载conda并创建虚拟环境

目录 1. 下载安装2. 创建虚拟环境1. 下载安装 在window操作系统中下载anconda包,并通过scp传输到ubuntu操作系统 具体anconda包在如下界面: anconda包 目录 博主选择了最新的包:Anaconda3-2023.09-0-Linux-x86_64.sh 通过scp传输到ubuntu操作系统中: 并在ubuntu操作系…

共模电感有什么作用与选型技巧?|深圳比创达EMC

共模电感(Common mode Choke),也叫共模扼流圈,常用于电脑的开关电源中过滤共模的电磁干扰信号。在板卡设计中,共模电感也是起EMI滤波的作用,用于抑制高速信号线产生的电磁波向外辐射发射。 如图1,共模电感的简化模型&…

【每日一记】OSPF区域划分详讲、划分区域的优点好处

个人名片: 🐼作者简介:一名大二在校生,喜欢编程🎋 🐻‍❄️个人主页🥇:小新爱学习. 🐼个人WeChat:hmmwx53 🕊️系列专栏:&#x1f5bc…

springboot项目中后台文件上传处理

参考地址:http://www.gxcode.top/code 文件上次核心处理代码: @Autowired private FileUpload fileUpload; //获取资源对象:file-upload-prod.properties@ApiOperation(value = "用户头像修改", notes = "用户头像修改", httpMethod =

IDEA的使用(三)Debug(断点调试)(IntelliJ IDEA 2022.1.3版本)

编程过程中如果出现错误,需要查找和定位错误时,借助程序调试可以快速查找错误。 编写好程序后,可能出现的情况: 1.没有bug。 使用Debug的情况: 2.运行后,出现错误或者异常信息,但是通过日志文件…

【置顶】关于博客的一些公告

所谓 万事开头难,最开始的两个专栏 《微机》 和 《骨骼动作识别》 定价 29.9 ,因为: 刚开始确实比较困难,要把自己学的知识彻底搞懂讲给别人,还要 码字排版,从 Markdown 语法开始学起(这都是 花…

林沛满-TCP 是如何避免被发送方分片的?

TCP 可以避免被发送方分片,是因为它主动把数据分成小段再交给网络层。最大的分段大小称为 MSS(Maximum Segment Size),它相当于把 MTU 刨去 IP头和 TCP 头之后的大小,所以一个 MSS 恰好能装进一个 MTU 中。 图4 图 4 …

『Linux项目自动化构建工具』make/Makefile

前言 如题可知,make/Makefile为在Linux下的项目自动化构建工具; 在上一篇文章『Linux - gcc / g』c程序翻译过程 中讲解了C/C程序的翻译过程; 而make/Makefile即可以看成,是Makefile在使用gcc/g使在Linux环境下能够更好的高效率的进行项目构建; 在此之前首先要对make/Makefile…

Http请求响应 Ajax 过滤器

10/10/2023 近期总结: 最近学的后端部署,web服务器运行,各种请求响应,内容很多,学的很乱,还是需要好好整理,前面JavaSE内容还没有完全掌握,再加上一边刷题,感觉压力很大哈…

归纳所猜半结论推出完整结论:CF1592F1

https://www.luogu.com.cn/problem/CF1592F1 场上猜了个结论,感觉只会操作1。然后被样例1hack了。然后就猜如果 ( n , m ) (n,m) (n,m) 为1则翻转4操作,被#14hack了。然后就猜4操作只会进行一次,然后就不知道怎么做下去了。 上面猜的结论都…

Multi-Grade Deep Learning for Partial Differential Equations

论文阅读:Multi-Grade Deep Learning for Partial Differential Equations with Applications to the Burgers Equation Multi-Grade Deep Learning for Partial Differential Equations with Applications to the Burgers Equation符号定义偏微分方程定义FNN定义PI…

iceberg简介004_iceberg和其他数据湖框架的对比---​​数据湖Apache Iceberg工作笔记0004

然后来看一下iceberg和其他数据湖框架的对比这里可以看到hudi支持的多一点对吧,但是 iceberg有自己的优势,并且他们都支持timeline 也就是时间旅行对吧. 然后这个图是显示了,数据湖三剑客的开源时间,以及火热程度,可以对比一下看看.

复旦管院启动科创战略,培养科技研发人才,引领未来发展!

今年夏天,600多位优秀的企业家成为复旦大学EMBA 2023级新生。在疫情结束后,他们选择百战归来再读书,重新回到久违的课堂,共同探索科创大时代下企业的商业本质,开启新的学习与人生旅程。复旦大学管理学院院长陆雄文教授…

只会 Windows 也能轻松搭建远程桌面 RustDesk 自用服务器

网管小贾 / sysadm.cc “哥,你啥时候回来啊?XX业务系统又出问题了!” “情况紧急,老大说让你远程处理,总之尽快解决!” 虽说我常年出差在外总能收到这样的消息,似乎早已习惯,但是公…

Go 语言切片扩容规则是扩容2倍?1.25倍?到底几倍

本次主要来聊聊关于切片的扩容是如何扩的,还请大佬们不吝赐教 切片,相信大家用了 Go 语言那么久这这种数据类型并不陌生,但是平日里聊到关于切片是如何扩容的,很多人可能会张口就来,切片扩容的时候,如果老…

基于安卓android微信小程序音乐播放器

运行环境 小程序前端框架:uniapp 小程序运行软件:微信开发者 后端技术:javaSsm(SpringSpringMVCMyBatis)vue.js 后端开发环境:idea/eclipse 数据库:mysql 项目介绍 音乐播放器小程序的设计主要是对系统所要实现的功能进行详细考虑,确定所要…

唐老师讲电赛

dc-dc电源布局要点

计算机网络 面试题

PART1 1.TCP和UDP的区别是什么? 2.TCP报文首部格式是什么? 3.TCP三次握手的过程 4.为什么TCP要三次握手? 5.TCP三次握手的数据报可以携带数据吗? 6.半连接队列是什么? 7.SYN 洪泛攻击是什么? 8.TCP…

数据库sql查询成绩第二高

select * from propro; #查询成绩第二高 select max(id) from propro where id <(select max(id) from propro); #查询成绩第二高的第二种方式 select * from (select * from propro order by id desc limit 2) as b order by id asc limit 1;