故事作者:万泉河

最近创作

看看TA的故事

【万泉河】PLC垃圾程序解读赏析(一)

已锁定

万泉河

  • 帖子

    10885
  • 精华

    132
  • 被关注

    893

论坛等级:至圣

注册时间:2003-06-06

钻石 钻石 如何晋级?

【万泉河】PLC垃圾程序解读赏析(一)

4745

3

2019-11-22 16:45:27

 

我曾经说过,有机会会拿一个见到的垃圾程序出来解读一下,与大家分享。但一直没搞。原因是大部分别人的项目程序都是辛辛苦苦做出来的项目程序,我如果抨击其程序垃圾,就很容易对个人造成攻击拉来仇恨。所以一直还是很谨慎。

 

这次有了。程序来自西门子编程软件附带的帮助系统中的示例。对这种官方文档的解读,总是客观的。即便另外有人不服,咱也可以静下心来,平心静气,就是论事,看我所指出来的有没有道理。

 

背景:今年早些时候听说SMART 200的编程软件推出了V2.4新版本,而且在收听技术讲座的时候,了解到新版本中,附带了MODBUS  TCP的库函数。可以免费使用了。 而以前我们前面都是购买的库函数,库函数只能对1个SERVER进行访问,最多4个SERVER访问,则提供了4套库函数,相当别扭。这次听说用一套函数就能搞定,同事就特别感兴趣。想了解用上去。

 

但他打开帮助文件,看了好几天,看的晕头转向,摸不到北了。我也奇怪呢。原来使用都很简单的,这怎么新版本,反而复杂了?发给我看看吧。

 

我从头到尾耐心把程序看完,读懂,直接怒了。这都啥垃圾程序啊!转而都很好奇能给西门子写帮助文件的,这都什么人?新手,实习生吗?

 

恰巧,前几天,有西门子的工程师们发的朋友圈,在转发一篇西门子技术工程师总结的文章:

8个规则打造一致的编程风格(值得收藏)

我们就对照这个规则,来分析一下这个例程的垃圾之处。

 


源程序可以从V2.4的软件帮助中找到,也可以跳转到源地址打开:

https://mp.weixin.qq.com/s/g0J0HPV_qsskwyNIhEJw_g

 


 

程序段 1:

启动时,清除所有标志和错误。



程序段 2:

两个客户端均完成 Modbus 请求后,将启动下一个 Modbus 请求。


程序段 3:



程序段 4:

CPU_Input 0 上升沿触发 Modbus 请求序列开始在 V 存储器中写入一些数据,以发送到 Modbus 服务器。

将 Req 输入位设为 TRUE。

当 CPU_Input 0 为 False 时,停止发送Modbus 请求。

 




程序段 5:

设置所选Modbus 功能的读/写模式和地址。

写入输出 = 功能代码 5(单个)/15(多个)。

读取输出 = 功能代码 1。

写入保持寄存器 = 功能代码 6(单个)/16(多个)。

读取保持寄存器 = 功能代码 3。

 




程序段 6:

Modbus 客户端 01 与 Modbus 服务器 01 建立连接。

Req 为 TRUE 时,向服务器发送 Modbus请求。

Modbus 客户端接收并处理来自服务器的响应后,MBUS_CLIENT指令会将 Done 输出设置为 TRUE。

 




 

程序段 7:

Modbus 客户端 02 与 Modbus 服务器 02 建立连接。

Req 为 TRUE 时,向服务器发送 Modbus请求。

Modbus 客户端接收并处理来自服务器的响应后,MBUS_CLIENT指令会将 Done 输出设置为 TRUE。

 



 =============================================

 

 

以下是我所不满意的槽点,请大家一起评判。

 

槽点一:

全局变量滥用。M变量已经给用到了MB13。而整个SMART的CPU的M变量区域总共32个byte,那这一个例子程序占用了一小半。如果谁做项目想用这个例子程序,那别的功能要用M变量就基本别想了。


这里面用到的大部分还是垃圾变量,好多只用一次就扔掉了。根本没有必要使用M全局变量。

参考我以前的文章:

【万泉河】给你的PLC程序洗洗澡

 

槽点二:

这个例子程序竟然是不能上来就运行的。只能在I0.0导通之后完成一次通讯。这位作者难道不知道MODBUS通讯通常都是需要作为背景通讯服务一直运行的吗?

 

槽点三:

跳转。

NW2 中多个语句分支用到了跳转指令,然后跳转到了NW3。

如果没有跳转语句,或者那些不符合跳转的分支,原本程序都该正常执行NW3的,你无缘无故,跳转个毛啊!

 

槽点四:

也是最重要的一点,整个程序在实现的功能全部都是废话连篇,完全是没有必要的多此一举,脱裤子放屁。

MODBUS库函数的功能,本意是把对4xxxx等地址的读操作,转换为了FC03的报文。而把写地址4xxxx转为FC60/FC16的报文, 省去了编制通讯程序的时候自己去整理MODBUS报文,方便使用。

而这个程序整个的功能,却是在把03,06,16的功能码,给归类到4xxxx的读或者写。

 

其它的1XXXX, 2XXXXX,3XXXX的地址也都详尽的处理了。

 

这样的原地死循环的绕圈子,要达到目的是什么呢?

 

难不成就是故意为了提高使用难度,让人不那么容易看懂,不容易上手吗?

 

 

 

一定有人会为西门子辩解,说这只是个例子,例子的功能不是让你直接使用的,例子只是为了从功能上演示原理。

 

每当听到这样的理论,我就很生气。官方一方面在推广标准编程规则,一方面又大量放出垃圾程序。整个业界垃圾程序遍地,西门子难辞其咎。

 

大量的新手,就是从帮助文件中学习编程方法,尽可能把帮助文档的实现方法应用到自己的项目中。西门子作为重要的自动化厂商,在推动标准化编程,提高行业普遍技术水平方面,责无旁贷。

 

而这起点,就该从西门子自己的帮助文档开始。

 

如果西门子自己做不到,我们很乐意帮助他们。


 

最后,我举个反例。

 

今年有机缘得到了一本CODESYS官方赠送的编程教材


我前段时间学完了。在读的过程中,我还特意留意了一下他们书中的例子程序是否符合我所定义的标准化规范。想从中找到些自己可以做些贡献的盲点。

 

略感失望,他们的例子程序全都很规范。该用内部变量的时候,绝不用全局变量。该用形参的时候,从不直接访问物理地址。

 

这一个实例,可以用来反驳那些例子程序就可以随意写成垃圾的辩解吧?

 



【万泉河】PLC垃圾程序解读赏析(一) 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

网友专栏

共有3227条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。