最近在网上搜索到了一道plc面试题,我先把作者的原话搬上来:- p% }- L% s. C! s# c
PLC编程-关于一道简单面试题 2011年04月25日 我给出的笔试题中,其中有一道是要求当I0.0为1时,Q7.0-Q7.7这八个灯以5s间隔依次点亮,每个亮5s,走马灯式循环,直到I0.0为0时停止。 结果很是失望,一年半时间里,面试过不知道多少个人,情况大致是这样: 70%的人用各种点的串并联加定时器来搭,结果仍然是做不出来; 约10%的人用上面的办法做成功了; 约10%的人用计数器(C)对5S脉冲计数,之后如下方式输出: LD C==0 OUT Q7.0;...........................................LD C==7 OUT Q7.7 之后C==8时清零,重复以上动作。这样也算实现了。 约10%的人用移位的方法实现,这才是我期待的答案。讨论答案的时候有人提及某些小型PLC可能会没有循环移位指令,提醒一下,再差的PLC也会支持四则运算,自动化专业总得学过单片机的吧,那怎么想不到整数乘2就相当于左移,除2就相当于右移呢?再利用上进位寄存器或余数寄存器判断复位不就可以了,就算不知道进位寄存器或余数寄存器,那么可以在这个数为H80时不做乘法而为其赋H01,或为H01时不做除法而为其赋H80就可以了。 结果就是这样,我还没要求必须完整给出程序,思路正确就行,当然能直接给出程序最好。 而我最期待的,是采用循环加寻址操作,因为移位毕竟有限制,超过32位或64位就不能直接实现了,只能自己对多寄存器移位同时控制好数据的同步。而用寻址,可以很方便的扩展这个功能。我们设计一个算法时,除了要解决当前问题外,还要考虑这个算法能不能重用,如何做到重用,这样在类似的项目中可以方便套用它,会提高不少效率。 当然这种简单的东西实际工作是用不到的,我只是需要了解对方的编程思想以及对PLC的理解。虽然最初PLC是为了代替继电接触器而生,但时至今日,这东西已经有了突飞猛进的发展,如果我们在工作两三年后,还是只会用这么简单的方式解决问题,那就有点说不过去了。这么简单的问题,都要浪费上很多时间,工作效率大打折扣,结果还要死不少脑细胞。有人做这题用一个多小时最后做不对,有人两分钟就直接写完程序了,那一个系统上万步的程序,时间上就要差多少,更不要提质量了。 有人说,怕这样用PLC,会不稳定。我说,如果担心这个,那就不要用PLC了,既然它提供了这些功能,就应该是通过了测试的。虽然我们要把有可能出现的问题都考虑周全,以保证系统的可靠性,但天灾人祸的事任谁也没有办法的。如果真发生这样的问题,你可以直接给PLC厂家发邮件报告这个BUG。 其实如果我们单片机或汇编了解得多一点,会发现PLC很容易,指令系统都差不多,基本上就照着单片机的指令来的,当然有的提供了一些更高级一些的功能,如通信类指令,数据表格类指令等,另外如ST语言还可以操作数组,甚至有的PLC如AB能搞出类似对象的数据结构,但编程思想基本上还是一致的。或许因为我是学机械的,而当初又专门学过汇编,所以在使用PLC时才喜欢套用汇编的方式吧,虽然大学也开过两门PLC课程。 发发牢骚,希望能提醒刚进入工控这个行业的同行们,多一些创新思维,眼界要放宽,多接触些新东西,不要书上说老师说网上说,自己想出来的,未必就比别人差,如果所有的人都是书上说老师说网上说的,那人类不要发展了,早点刨坑把自己埋了吧。 ————————————————分割线————— —————————分割线— _____—————————————— 见到这个题目后我也做了一遍,用三菱fx2n系列,第一次用的是定时器控制下一个灯,当下一个灯亮起的时候,同时使用复位指令对前一个灯置0.写的程序见图。(没有写完8个灯,只写了4个灯)。调试后没有问题。 第二次是按照上面那个面试官的思路写的。问题就出现了,只能运行到第三个灯,后面的不能运行。(附图是我更改了几次的程序,开始的时候还使用了触电比较指令也一样没有到达预期目的) 现在想请教一下,假如我按照面试官的思路(即使用四则运算的乘法mul)该如何修改我的这段程序?谢谢!
$ P' }4 }: h. x) L9 g |