故事作者:万泉河

最近创作

看看TA的故事

0707 【万泉河】更具程序员思维的U8轮巡题目答案

已锁定

万泉河

  • 帖子

    10946
  • 精华

    132
  • 被关注

    1031

论坛等级:至圣

注册时间:2003-06-06

钻石 钻石 如何晋级?

0707 【万泉河】更具程序员思维的U8轮巡题目答案

787

3

2023-07-11 09:05:01

0707 【万泉河】更具程序员思维的U8轮巡题目答案

 

我在上个月出了一道关于U8设备轮巡的题目《0609 【万泉河】宁做小白勿做小黑,一道测试题检测你是否适合做程序员》。

 

有不了解题目原委的跳转找到原文阅读了解。 本文不再赘述。

 

我在前文中描述:

 

PLC工程师们的能力划分,大概会分几种:

 

1,  做不出这样的功能的程序,只能做普通的电气逻辑控制应用。

2,  可以用复杂的梯形图完成这样的功能,比如工位数量稍微少一点的。 数量多的太复杂就搞不定了。

3,  可以在上面约定的FB的空间里实现。

 

但我对3的描述有些太笼统了。 主要我对大家的脑回路估计不够。

 

在回复和讨论里面, 一些思路确实遵循在FB空间内实现,但大都是在为完成作业本身而被迫无奈实现,然而实现的手法全部不够优雅。完全没有程序员该有的模块化的思想。有一些回复,虽然也主动把自己做的方法源程序贴出来了,但是不是符合程序员的标准,还需要对比比较下再判定。

 

 

下面把我自己的解题思路写出来,后面也会提供我做的程序。作为对提交过答案的网友的鼓励。

 

我的思路:

 

首先,这个题目一定是渐进增长来的,即,我们开始按固定顺序做了一套控制,后来工艺要求顺序可变。 而固定顺序的控制已经做好了,再完全推倒重来重新做很显然就太耗费脑细胞了。 也造成太多的经验浪费。 原本已经调试通过的程序逻辑,因为要求改变,就废掉了,新的程序还需要重新逐步调试。太不划算了。

 

上一波题目出来之后,回复里面有批评没有考虑故障和报警处理的,意思是问题考虑不全面。首先,这只是例子,出题的目的是实现算法,而不是为了什么全面。 其次,真实的应用中,故障和报警当然要有,然而也是在完成了基础的功能算法之后。而且,按照模块化的设计架构,这些大部分工作也应该单独的模块实现。 即这里做的顺序或者变序轮询的功能,完全可以做到封装固定不变。 那种基础算法功能还没搞定,或者只在口头上夸夸其谈的,却过早考虑其他方面,其实也是没有模块化编程思维的体现。

 

你过早考虑太多,最终所有功能在一个模块里实现, 那么即便能实现,这个模块也是一锅粥,根本不具备模块化特性。工艺有个风吹草动,稍微变化一点,前面做的逻辑算法全都白费,又要从头再来。比如把电机换为气缸,或者高级点,换成伺服,这里的逻辑就都用不上了。又要另起炉灶从头再来,下一个项目又要支出和上一个项目几乎等同的工作量和出差时间。

 

这是整个工控行业大家习以为常的现状。也正是我批评不够模块化,不具程序员思维的所在。

 

所以,模块化的设计方法一定是先有固定顺序的控制,然后再在其基础上做升级,实现可变顺序,而后再次封装成块。

 

即我提出的最终的FB的接口形式。

 

即:首先要完成一个固定顺序的控制FB, 然后对这个FB不改变的基础上,再进一步封装改造,继承其原有的功能,再增加可变顺序部分的功能,最终成为接口约定的FB。这才是模块化设计的思路。

 

那么我们首先要有一个固定顺序的FB1:



其中位号不关心顺序了, 只对应了设备是否投入。 比如我这里缺省值为2#00111111, 那么代表了从右向左即从低位到高位,分别为1,2,3,4,5,6投运,而7,8不投入。

 

在启动信号到来后Q1-Q8依次序按需求投入运行。即为固定顺序的轮巡。

 

调试测试完成后,进行封装,然后再造一个可变顺序的FB2:

 


 外部接口如前文所述,完全一样。 而在静态变量中多了一个多重背景,调用了固定顺序顺控的FB1。

 

通过在此FB2中的逻辑腾挪,将原本的固定顺序升级改造为了可变次序顺控。

 

上周,有一位JAVA出身的程序员因为现在也要从事一些工控方面的编程,从网上看到了我的PLC标准化编程的文章,大为赞同,瞬即参加了烟台方法的学习营。加入后就先问我, 在PORTAL里面是不是不支持面向对象的继承功能?如何实现?

 

我跟他讲,把FB外面再套一层,就可以实现利用原有对象功能,并再增加新的功能逻辑。如本节介绍所述。就是继承。 而其实我在专著《PLC标准化编程原理与方法》中也早有讲解。建议他还是要同步阅读书中内容,才更有利于学习掌握烟台方法全部技能。

 

我在前一文中提及的要举办的讲座,没能开成。 主要是响应不够热烈,那对我来说就又失去了动力。可能又是题目超前了些,超越了一些同行新手的需求。于是整理了此文, 把整体思路释放给大家,有兴趣的可以参考实现。

 

记住,真正的程序员不仅仅是做到能把逻辑功能实现,甚至只在口头上把思路描述的天花乱坠,就叫程序员了。  要真的做出来,而且要模块化的做出来,才算。 是否真正的模块化,跟别人对比一下自己内心就可以有结论。

 

我这里把这两个FB做出来了, 并分别做了调试演示。 因为我以前项目中就实现过,所以其实都没费多少力气。 我甚至都懒得去找旧的项目的代码去参考和移植,而是直接新写的了。 然而仍然一次成功,代码写完之后下载到PLC中就运行成功了。 我自己也觉得很神奇。也没再详细调教,说不定其中还有bug。

 

这个算法对我自己来说,是近些年掌握了烟台方法标准化的技能之后,才逐渐发展起来的。 或者说,是打通烟台方法所有技能路线上的关键一个环节。 以前不能模块化实现功能,以前只能在主程序中硬拼逻辑的做法,终于可以成功跨越了。所以对我来说是一个比较重要的门槛。相信对同行们也是脑子中一直绕不开的死结。

 

我这里可以把程序的源代码分享给大家。 但是我近2年来分享的代码的过程中,遇到的了太多的喷子,各种角度喷的都有。拿到我的代码,非但不能好好学习,反而各种喷, 甚至造谣污蔑我。比如拿到80模拟量的程序,就造谣我只会做模拟量, 拿到80变频器的程序,就造谣我只会变频器骗小白。 令我非常上火。

 

所以,这个代码的获得需要有门槛,以后我也会把释放的代码尽量都添加门槛,让学习者可以持续学习进步。

 

请在微信公众号中得到获取方式。当然,我认为前提是,没有我的代码, 你们看了我上面的介绍,也仍然可以自行实现。 

-------------------------

看这篇文章的编号可以知道,其实是几天前写的,发在了公众号。只不过最近比较忙,没有同步更新到专栏。 

而文章发出后,很快就有人按我的这个新的思路做出来了。而这位兄弟,也是第一篇文章后就第一时间做出了他的程序,给我看过之后我被他的程序之复杂之混乱惊讶到了,完全只是为了完成目的做事,完全没有架构思维。导致我后面更改了3的定义。 

而这位兄弟再按照我本文的思想再次做出来的 程序就整洁有条理多了。 


0707 【万泉河】更具程序员思维的U8轮巡题目答案 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

网友专栏

共有3472条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

  • 分享

  • 只看
    楼主

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