0531【万泉河】PLC工程师该有多痛恨垃圾程序?
0531【万泉河】PLC工程师该有多痛恨垃圾程序?
前天看了一篇公众号文章,在声讨一套PLC程序
文章的题目:《说PLC标准化编程不重要的,这个程序你接手吗?》
而我一看, 这只不过是一份比较潦草的垃圾程序,根本与标准化扯不上任何关系呀!这个程序现在看起来使用的变量乱飞,变量的符号名以及程序块的命名都比较随性。
然后后面还有人大骂:这是防御性编程,故意为了让别人看不懂吗!
说起垃圾程序,我还是比较有经验的,有一定的发言权。本文就对这个问题分析一下。
不过在开始之前先对垃圾程序的概念做个定义。 与垃圾程序对应的是垃圾食品。很多人对垃圾食品的定义也不清楚。 以为人们丢弃到垃圾桶和下水道里的食物残渣是垃圾食品。 那些只是垃圾,根本算不上食品。所以也更不是什么垃圾食品了。
通常讲的垃圾食品,是那些可以食用,甚至方便可口,令人上瘾,偶尔食用也无碍,然而长时间单一食用,会引发身体健康问题的,才是垃圾食品。
现在的大型商超里的餐馆,通常会有一些不限量无限次取用的小零食,爆米花,锅巴,廉价水果,冰淇淋等等,放眼一看,全部都是垃圾食品。
而垃圾程序,首先是可以正常运行的程序。有许多同行经常用好猫坏猫论推导的结论:能让设备正常运行的程序,就是好程序。 这些仅仅满足于设备能运行的程序,就是垃圾程序。 可想而知,持有这种观点的程序员,他们自己的作品,无一例外都是垃圾程序。 即装载在设备内部的时候,看起来可以设备运行正常。 然而一旦拿出来公开到阳光下,就暴露了原来都是垃圾程序。 如文首截图的程序一样。
不过一上来,我先要发表一些观点来维护垃圾程序。 借用一个为人处世的鸡汤逻辑,所有的垃圾程序,无非两种情况:不在乎和不得已。
先说不在乎。
我们最早玩的PLC都是绝对地址编程,即便有注释也主要靠变量后面的注释文本,且不说一些用手操器编程的小型PLC如LOGO等压根连符号表和注释都没有,就靠绝对地址搭出来的梯形图逻辑,你能非要判定是垃圾程序?人家,或者你自己,分明是不在乎的嘛!
比如我经常用SMART 200演示一段起保停逻辑:
我不相信谁接手不了这样的垃圾程序,拿到手里或者换自己来做的时候还要另起炉灶自己再做一遍。
有的人会认为,你这样一台设备的简单逻辑这样做当然正常,但如果一个更复杂的系统,设备数量多了以后还这样做,是不是就不够规范了,就太垃圾了?
就凭PLC系统的复杂度,就那么点逻辑,你非要说1套设备与5套设备与80套设备有啥不同?大部分不过是简单的数量的叠加而已。难度并没有增加,怎么就接受不了了呢?
比如,一个温室大棚,用一个小型PLC可以如上简单控制,如果有1000个大棚,控制方案有可能是同样型号的PLC用1000台,也有可能换个方案,用一台大型PLC实现,然后还有必要用不同的编程规范实现?
分明是不必要的嘛!
而这个大型PLC如果是S7-1500,那么PORTAL中编程的时候,所有的变量都必须有符号名。 即便你不去专门整理符号名,系统也会自动分配一个。 管你用不用看不看,都会有。 那么如果在调试程序过程中根本用不到符号,管它分配的名字是啥样的呢,只需要关注绝对地址自己就够用了,那就会出现上面的程序的情况。
所以,从我换位思考的经验,这种做法完全可以理解。
然后再讲不得已。
咱们每个人入门的时候,做的项目,所编制的程序,特别是一些小型项目,都是这样的做法做出来的。 所有人之间并没有明显的区别。 然后你如果看到这样的程序就痛恨, 那我想问一下每个人自己,当你入行10年后,翻看自己10年前的作品的时候,会对自己痛恨不已吗?如果觉得自己那个时候刚入门,做事情还没学会规范,觉得可以谅解。 那么凭什么换个人,自己带的学生,后辈,做出来与自己水平几乎相当的程序,就痛恨到咬牙切齿呢?水平所限,能力所限,只能做到这个样子了嘛!
当然, 如果每个人都有这样的上进心,都能日三省自己,发现自己技能上的不足,有羞耻心,然后每天学习提高,最终士别三日当刮目相待,自己今日的程序可以比三日前的做法有明显的提高,自己也有勇气批判反对自己曾经的做法,那这样的人,绝对前途无量。
然而怕就怕的是,世间的很多人在这件事上是持有双重标准的。 骂别人的时候起劲,而对待自己则无比宽容。 别人的程序因为自己读不懂,就骂是垃圾程序,总能从中挑出来不符合自己习惯的做法,然后就判定对方垃圾。 而如果是自己做的,哪怕是十几年前做的,因为符合自己一贯的习惯,各种处理方法自己都特别熟悉, 甚至其实十几年来都没改进过,都仍然一个套路,但因为对自己要宽容,就能接受。而双方的程序放到一起, 还不见得谁比谁更优秀,谁比谁更垃圾呢!很有可能是两个作者交换一下作品,都判对方垃圾。而换个第三者来看,你们俩做的都是垃圾。
所以, 所有痛骂垃圾程序的,通常是因为自己看不懂。 而且,有可能是,通过痛骂对方程序垃圾,而掩盖自己看不懂对方程序的尴尬。
PLC行业不同于软件行业,通常一套PLC系统的软件设计,整个生命周期内,都是一个人足以完成。即从设计到调试到维护,都不需要多人协作。也就是说,通常情况下,不管是符号名还是注释,都是写给自己看的。 用自己看得懂的语言,自己习惯的表达方式,只要自己看了晓得怎么回事都足够了。你没必要像软件行业一样要求自己,所有符号和注释都要规范英文表达,因为整个项目可能是几十上百个软件工程师协作完成,自己所做的只是庞大项目中的一个小模块,只实现其中的一小点功能,而且实施过程也要经过多道流程,不同的人CODEREVIEW,测试等等。
而PLC系统不管是规模还是复杂度,都差的远得很,完全不在一个量级。
就像,每个人的内裤都是穿给自己看的,目标对象并不是外人。
而偶尔,一些特殊的原因,比如中途换人,或者设备运行多年之后维护的需要,换了个人接手来解读原始的程序, 那也只是相当于一不小心看到了别人的隐私部位。别人大或者小,丑或者嫩,你顶多是尝试理解并适应,然后解决现有的问题。而断没有指责的理由。 就像别人扒开了你的内裤,也断然没理由骂你小一样。
叫我说,越是水平高的工程师,对于越低水平的程序,就该有越高的包容度。就好比书法课的老师,那些书法大师们, 在审视刚刚入门的小学生,或者书法水平远不如自己的新手的作品的时候,断没有开骂的理由的。 你顶多是可以在比较中获取一些内心的优越感。
站的境界越高,俯视的视角看下来,对方的一些幼稚的蹩脚的处理方法你纵然有可能会心一笑,但更应该是谅解他这样做的原因。 而不是阴谋论的以为对方这样做的做法是为了背刺自己。想想看,对方做程序的时候,以及现场调试的时候,针对的是现场出现的问题,目的是能让设备尽早运转,自己好尽早结束出差回家。连设备能否运转正常都还搞不定呢!哪有额外的心思对付你。
何况,那个时候你还不存在呢!你接手到这个程序,通常都是很长时间以后了, 甚至5年10年20年,先预设了一个自己的位置,然后猜测对方某些做法是针对你的,这个阴谋论的回路是不是也太长了点?所以,通常不管是骂对方垃圾程序还是骂对方预设阴谋,其实都是等同于在承认自己的水平不如对方。
建议同行们以后少骂别人的垃圾程序,即便真的垃圾程序, 也不要骂。
有人会说了, 你万老师不也经常指责这个那个程序是垃圾程序吗?没错,但我只是客观评价,我绝不痛恨,绝不会对对方恨铁不成钢,也绝不会动辄怀疑对方是故意埋坑。 我更多的是理解对方的做法,那是他当时的技能水平所决定的,即,要么是不在乎,要么就是不得已。
也包括我自己10多年前做的程序做法,我现在也都深知那里面有多垃圾。 但我不会对自己有多痛恨。我只是原谅自己当时的技能水平不够而已。同时也庆幸自己一直在学习,一直在进步,庆幸自己找到了不再写垃圾程序的技能方法,而且还可以传授给更多的其他人。
原文作者质问的这样的程序谁愿意接的问题,其实答案很显然。 你只要从事这个行业,只要接手别人的遗留工作或者是维护项目, 就不可避免要遇到自己不习惯的垃圾程序。 接不接的原因只在于自己有能力搞懂或者没能力搞懂。除此之外没有别的选择了。 你断没有可能站在自己的立场上,要求原始设计者,在10年前就按照你的审美观和规范,来完成整个项目,以适应今天的你来接手。这有点时空穿越。
很多烟台方法的学员,自从学习了烟台方法之后,眼光变刁钻了,放眼看去包括自己曾经做过的程序,全都是垃圾程序。 然后很多同行也以为我非常痛恨垃圾程序。 其实远非如此。相反的是,我反而更愿意挑战垃圾程序。经常有一些改造项目或者修复漏洞的项目需求,对方会希望我给全盘否定,用烟台方法重写。而我主张的是,如果要用烟台方法重写,就要关注这个设备还有多少后续同样的类型,即我做下来的代码库,还有多少重复使用的机会。 如果根本没有,根本就是当下这一条产线要恢复运行或者增加功能的需求,我是不会同意整体重写的,我情愿去理解原有程序基础上修复漏洞和增加功能。
我曾经有写过一篇文章,【万泉河】PLC垃圾程序解读赏析(一)
https://mp.weixin.qq.com/s/hKVMzzr8YbQZ3AXxEkyUNg
这篇文章是5年前写的了, 未发在这个公众号,也未统计在338篇技术文章目录里。 肯定还有很多这样的文章被遗漏了。 欢迎大家发现并提醒我。
在那篇文章里,我批评了西门子官方帮助文件中的例子程序。 而其实我一直想分享的是一套我曾经经手的一套昆腾PLC的程序。那是我心目中的NO2的垃圾程序,NO1的更早,更找不到了。 而这套NO2今天终于找到了。 是用CONCEPT 2.6写的,有兴趣的读者可以对本文打赏10元后跟我私信索取。
那个程序有多垃圾,我只讲述一个槽点让大家感受一下,里面有整数的比较,要判断千位的数字相等,然而作者不会使用整数相等指令,活生生用8421码做了逐位比较,而且程序中多处比较,就这部分的代码就有好几百句。 没有子程序,全部都是代码平铺的。
读那套程序,我挣了6万元。 真的只是读。 原本项目改造后系统不能正常运行了。以为需要修改程序的,但我通读了之后,找到了方法,在其上位机组态王的界面中做了些参数设定就搞定了。那个昆腾的CPU叫一个讨厌,虽然有3个通讯口,但只有一个RS232口可用,组态王和编程电脑只能有一个在线。而程序功能必须通过组态王来控制,所以我先是读了10天搞不定,后来回家后找朋友借了套有以太网口的PLC,监控配合,很快找到了原因。
那套系统时间久远,原本应该用16DI和16DO模块分别7-8块,就可以实现的,但为了省卡件,柜内用了复杂的继电器逻辑,最终只用了1块16DI和1块16DO。卡件上面省了些钱,但给后来的维护带来了无穷的后患。 那个电厂后来又有一次改造,还有人又再次联系到我,希望这部分我能帮忙处理,我直接建议他们,把柜子全毁了重新做吧!十多万就能搞定。而如果非要我再来解读这套程序,即便不包含任何硬件,我开价至少要30万,因为实在太头疼了。这电厂为啥又来找到我,可能他们这个系统上线十多年,遇到的设备商工程师无数,也就我一个人真的给读懂了。
前天,有人咨询要购买烟台方法的培训项目, 其实是一套标准架构开发的样板示范项目,对方问,如果不满意是否可以退货?
我直接拒绝:那不行。 软件产品,不能以买家主观的满意为标准。 否则任何人只要铁定不满意,那岂不是就可以白嫖了?
你可以来评判,我给的样例项目有多少垃圾的地方,有多少地方的处理方法,不如你掌握的方法或者你所见过的别人的处理方法更高效更简洁,我自己写文章所讲述的不用M和T,不用UDT, 不用交叉索引等各种技能,有没有真的实现。
如果我所言为虚,直接收集证据法庭上告我好了。 6000元已经值得立案了。
曾经在工控论坛,有一个嘴硬的家伙不服, 我给他开出的条件,他所熟悉的不管日系的三菱还是OMRON的PLC, 5万块的赌注,他给我一套PLC程序,我给翻译移植到不用MT,后来那家伙怂了,不敢再应战了。
总的来说,烟台方法的程序,就有这个底气评价为最不垃圾的程序。 不管谁来评判, 你,我,或者任何第三方。 所以才敢卖出这样的行业第一高价。
PLC程序的仿真之-施耐德大型PLC的变量强制( UnityPro编程软件)
Unity Pro编程软件集成了PLC仿真器,使用PC上运行的PLC的仿真软件,应用程序在现场安装以前,就可以进行完整的测试,这对于大项目的应用来说,可以及早发现程序中的逻辑错误,提高程序开发的效率,缩短程序的开发、调试时间。
Unity Pro 软件集成了完善的仿真功能,集成在 Unity Pro 中的 PLC 仿真器可以在 PC 上准确的再现目标程序的行为。在仿真中所有调试工具均可使用:
Ø 断点和观察点
Ø 实时监测,用于显示运行中变量和逻辑的状态
Ø 程序单步执行
通过PLC 仿真器,读者不必连接到真实的PLC,就可以进行程序调试。在真实的PLC 上运行的所有项目任务(主任务、快速任务和事件任务)都可以在仿真器上运行。该仿真器和真实PLC 的区别在于它没有I/O 模块和通信网络的实时行为,因此对通讯等等的仿真效果差一些。
Unity Pro的仿真器有离线、在线和监视器等操作状态。离线状态是打开新应用程序或现有应用程序时,操作状态将更改为离线状态。在线状态可以让处于在线状态中的应用程序直接连接到控制器内存当中。在监视状态中,读者可以更改操作状态并调整控制器,还可以用来启动或停止控制器。并可以使用动态数据表编辑器查看、修改或传送数据。
一、 Unity Pro的仿真界面
仿真时,在Unity Pro编程软件中,单击【PLC】菜单下的菜单选项【仿真模式】,或点击快速访问栏中的仿真模式图标 ,就可以弹出仿真画面,如图1 所示。
图 1 启动PLC的仿真器
二、 仿真示例
单击菜单【生成】下的菜单选项【重新生成所有项目】,或直接点击快速访问栏中的图标 ,如图2所示。
图 2 在下载前进行编译检查
单击【PLC】菜单下的菜单选项【连接】,如图3所示。
图 3 使用连接建立与仿真器的连接
点击【将项目传输到PLC】,菜单项的位置如图4所示。
图4 下载程序到仿真器
勾选【PLC在传输后运行】,然后点击【传输】按钮,操作如图5所示。
图 5 项目传输到PLC对话框
在【运行】确认对话框中确认昆腾项目的运行,如图6所示。
图6 点击OK按钮确认项目的运行
可通过单击 ,允许/禁止程序读写,仿真器面板左下方蓝色的【复位】按钮是冷启动按钮,红色的【电源重置】按钮是热启动按钮,无论冷启动还是热启动,复位后Quantum的运行状态会变成【空闲】,并且Unity Pro与仿真PLC的在线连接会断开,必须重新连接,再点击Run运行命令,方能再次运行仿真器,仿真器的面板如图7所示,。
图 7 仿真器的控制面板
当程序下载运行后,可以看到,在梯形图编辑器中,导通以绿色粗线标识,没导通以红色细线标识,在线后显示如图8所示。
图8 程序在线后的状态
选中【润滑泵启动】,然后单击右键,在弹出的右键快捷菜单选择【强制值】下的【强制为1】,对于仿真来说,实际的逻辑输入需要使用【强制值】的方式来修改,内部的变量等可使用【设置值】的方式来修改,操作如图9所示。
图 9将润滑泵启动强制为1
在弹出的警告对话框中说明了强制使能需要注意的一些情况,包括强制后PLC重新上电冷启动不再有效,热启动在PLC的内存保护被禁用且应用程序存储在内存的备份区域,在此对话框的操作选择【确定】,如图10所示。
图 10选择确定使强制值操作有效
则在线监控的程序变为绿色,逻辑输出【润滑泵运行连接中间继电器CR2】也接通,如图11所示。
图 11强制后的程序运行图
使用同样的方法将【润滑泵启动QA4】的强制值修改为【强制为0】,模拟完成了按下QA4按钮的过程,完成后程序如图12所示。
图 12 润滑泵启动QA4按钮强制为0
选中【润滑泵停止TA2】常闭点,然后单击右键,在弹出的右键快捷菜单选择【强制值】下的【强制为1】,然后在弹出的对话框中选择【确定】。程序如图13所示。
图 13 模拟润滑泵停止按钮按下的过程
选中【润滑泵停止TA2】常闭点,然后单击右键,在弹出的右键快捷菜单选择【强制值】下的【强制为0】,然后在弹出的对话框中选择【确定】。程序如图14所示。
图14 模拟润滑泵停止按钮松开的过程[c1]
最后选中【润滑泵停止TA2】和【润滑泵启动QA4】,然后单击右键,在弹出的右键快捷菜单选择【强制值】下的【取消强制】,可以看到【润滑泵停止TA2】和【润滑泵启动QA4】的变量名上的代表强制变量的框消失了,程序如图15所示。
图 15 取消强制后的程序
仿真器还支持使用动态数据表,读/写程序中变量或对逻辑输入变量进行强制的操作。
在Unity Pro首先创建动态数据表,如图16所示。
图 16 创建新的动态数据表
动态数据表的名字为M590 Monitor[c2] ,此动态表为模拟/监视主机运行状态创建,如图17所示。
图17 动态表的名称
三、 Unity Pro仿真软件的其它功能
1 工具提示
当鼠标指针停留在变量上时,将显示一个提供该变量值的工具提示,如图18所示。
图 18工具提示
2 检查窗口
先选中要创建检查窗口的变量,然后单击右键,在快捷菜单中选择【新建检查窗口】,或直接按功能键【F9】,创建的变量功能在所有编程语言都可使用,在变量窗口中显示变量值、地址和任何注释(如果有),创建变量窗口的操作如图19所示。
图 19 新建检查窗口的图示
检查变量窗口还可以设置,单击右键在快捷菜单中选【设置】,如图20所示。
图 20 设置图示
在对话框中选择变量显示的格式和最大/最小值,如图21所示。
图 21 检查设置的对话框
3 断点
断点可用于在设置断点处停止执行任务,使用断点可以随时停止项目的处理。
在调试过程中,可以使用断点执行检查代码的行为和查看变量的值两种操作。
在项目中的给定位置只有一个断点。断点不会保存,在与 PLC 断开连接时它将丢失。
它是在在线模式下实现的,而不管 PLC 是处于运行状态还是停止状态。断点功能不能在事件任务中使用,具有断点的 ST 段如图22所示。
图 22 断点ST段的图示
4 单步模式
设置完断点后,则可以使用单步模式将程序的=一步步执行,进行程序的深入分析,这个功能在大项目中查找程序中出现的问题,是非常有效的。
使用单步模式可以分步执行程序。在项目因到达断点而停止或已处于单步模式时,提供单步功能,处于单步模式的 ST 段如图23所示。
图 23开始调试的图示
在单步模式下提供了以下功能:
Ø 分步执行程序
Ø 步入
Ø 步出
Ø 跳过
Ø 显示当前步
Ø 调用存储器
在多次执行【步入】功能时,调用存储器可以显示从第一个断点开始的整个路径。
在分步模式下运行 PLC 程序并进入(步入)读/写保护段可能导致无法读取程序及从段中退出。读者必须在【停止】模式下切换 PLC 以返回到初始状态。
分步模式是指逐功能块执行应用程序,这个模式由预先设置的断点启动,用于检查代码的行为和变量的值。
分步模式必须在【在线模式】下实现,在分步模式下执行的段会停止相应的任务,可用于分步模式的命令有三个,即步入命令、步进命令和步出命令。
在分步模式下,如果要重新启动任务的执行以便返回到以前设置的断点,则需要从菜单中选择调试->开始命令,或者单击工具栏中的开始。
相关问答
施耐德plc昆腾系列,%MW?
施耐德PLC确实与其他PLC在使用上有比较大的区别。这里最直接的方式,举例吧!PREMUIMPLC,昆腾的没用过,应该一致吧!%mw1,可以作为位用,如%mw1.0~%mw1.15...
施耐UnityProXL与PL7Pro有什么区别?
针对的对象不一样,UnityProxl针对的是施耐德中大型PLC,昆腾、Premium、M340系列的PLC,PL7Pro针对的是Micro系列的小型PLC。针对的对象不一样,Unity...
unity3d和unitypro有什么不同?
1,Unity3D是一个让你轻松创作的多平台的游戏开发工具,是一个全面整合的专业游戏引擎。2,Unitypro是法国自动化公司施耐德的一款PLC编程软件,适用于Quantum(...
abb西门子施耐德相比起来哪个更好一点?-一起装修网
abb西门子施耐德相比起来哪个更好一点?