电子说
没错,这里说的是高耦合。
前几天看了一篇计算机编程的文章, 题目叫做低内聚高耦合,弄得我一度有点恍惚,赶紧把高内聚低耦合的谚语背诵了一遍,才确信文章作者是在讲解反面的内容。
而我们做PLC行业, 也有一些人奉行的高耦合的原则, 或者以高耦合为荣,而不自知。所以就有必要再举例把这里的概念分析讲解清楚。
我曾经犹豫延迟很久之后写过一篇文章《【万泉河】论PLC编程中的高内聚与低耦合》,主要的原因是内聚和耦合这样的词汇生活中不太常见,很多人不熟悉,会当成行业黑话,以为是在胡乱忽悠人的。而其实那是我们搞PLC标准化编程烟台方法的纲领,主要的目标。
我在两本书,已经出版的《PLC标准化原理与方法》和刚刚完稿的《三菱PLC标准化编程烟台方法》中,都全文引用了这篇文章,也在之后的各种场合,直接用高内聚低耦合的原则指导设计方向。
然而,看来效果并不太好。很多人貌似对烟台方法感兴趣,但对高内聚低耦合的理念并不理解, 也不去努力尝试理解,反而很多认知都反方向的来。
比如我做了80模拟量的例子和80工位双联开关的例子,大部分人看到程序很简单,会觉得很优雅,很舒适。然而有一部分读过之后就很不满意。甚至杀上门来嘲笑指责我把程序搞到这么简单,小学生都能做出来的程序,也好意思吹牛逼是高科技。
我说对啊,我们的目的就是复杂问题简单化,最终实现的方法越简单越优雅。如果一个问题,可以用简单易懂的方法实现,那我们绝不会为了追求表面的高科技而故意倒过来把简单问题复杂化。
烟台方法的学员拿到分发的实例项目以后,看到程序如此简洁,简单。虽然是真实的上千点的工程项目应用,然而最终的结果如80系列例子般简单,就问, 那是不是我们把自己的设计封装好了,将来项目实施让没有文化的小学生来承担就可以了啊?
我说,对的呀,这应该是每一个烟台方法学员的最终目标。我们现在在一些客户那里已经实现了整个项目都由工人来承担。工程师把设计标准化之后,除非再有新的控制工艺之外, 那些已经成熟的应用,只需要简单交接好应用指南,工人就可以从设计出图编程到现场调试都自行完成了,都不需要来请示每个细节。PLC程序内的模块调用仅仅相似于电柜内的元器件拼装组柜, 难度也相似。
而我一直以来关注同行的技术发展状态的方式,就是看他们做的库函数的耦合难度。说实话,PLC领域, 高难度的题目并不算多。特别是一些底层的设备控制,都是简单到一句话就可以说完的, 那么耦合难度的高低其实才是我看重的最重要的指标。
比如同行们现在都比较关注的SMART 200中的电机阀门块的重复使用了,包括西门子1847平台也有这方面的函数功能块的实现原理方法介绍:
他所设计的管脚中有一个名称为“参数”的INOUT管脚。示例调用中分配了&VB8的指针, 实际逻辑内部使用了VB8开始的N个字节的数据作为数据的记忆缓存,相当于FB块中的静态变量。
然而这个管脚在每一个实例的调用中,还均需要合理调度V区,不可以重复,否则会产生冲突。那么在我看来这就是高耦合。有人会居高临下指责说,不就是分配V区嘛, 按顺序分配下来, 有什么难的。
是的,对懂的人来说,当然不难。然而对不懂的人, 其余的不管是输入输出的通道,都是直观可见的信号,而多出来这个参数,只为内部逻辑所用,而使用者需要了解逻辑原理以后才会接受,而即便接受也懂的似是而非,那这就如天书一般难了。这样的一个细节不在意,那么多个细节当然也不会在意,但积累下来,一个系统中到处都是这样的难点,逐渐的小学生就会认为太高深,而拒绝配合你去干了。
不懂, 不会,干不了,要干你工程师自己去干!你不哄好他们,让他们觉得有难度,他们跟你玩赖躺平的本事还是有的。
另外,即便自己亲自来做耦合阶段的工作, 这种需要调度资源空间的工作量也毫无意义。所以,如果你对耦合的重要性有建立那么一点点理解的话,就会逐渐倾向于优化设计,尽量减少耦合难度。
当然,1847课程的重点还是在实现功能块重复的功能,所以不可以轻易指责他们的做法错了。而从功能模块化的角度,也需要另外单独的课程来讲解如何降低耦合难度。所以,我们完全可以在他们做好的原有的库函数基础上,再做一次封装,实现我们低耦合的需求。
比如我们可以把课程中已经做好的VALVE更名为VALVE_0, 而复制一个备份,仍然叫VALVE,其“参数”部分的管脚改为TEMP变量,利用我们前面曾经著文多次提过的GETSID函数,得到SID,并折算到参数值。逻辑如下:
而最终实际的调用则变成了:
虽然看起来仅仅是简化掉了一个管脚,然而这个时候可以非常简单地教会工人使用这个模块而毫无障碍了:只需要按照点表把地址正确填入即可。这样的话, 再笨的小学生也不会拒绝配合了。
这个程序例子的名字叫做“高耦合变低耦合”,我会放在80例程的分享群中,需要者自行获取,或者跟我私信索要。然而其中VALVE_0和GETSID块只有接口, 逻辑功能需要自行补足。其中VALVE的功能从1847课堂获取,而GETSID的实现,大家现在可以理解我提及多次的GETSID的需求了吧?
而我在反复讲解GETSID应用的时候,就有大虾不理解,质问分明在循环调用时做个增量计算就可以实现SID的自动分配,为啥还要专门做一个SID的函数。我就知道,有很多人,虽然自诩编程水平很高,但高内聚低耦合的思想仍然是没有的。换我是小学生,我一定跟你摆烂躺平。循环计算这样的高级工才能干的活, 俺们小学生学不会。现场拧螺丝接线是我的工作,但你工程师也得陪着我来工地上靠着,少不了你。
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !