以下是引用万泉河.在2021/7/18 21:09:10的发言:
【万泉河】OMRON PLC的字变量拆位
我在做PLC标准化编程的架构开发的时候,面对任何一个新型号的PLC, 首要关心的问题是这个系统中如何拆位。
即,如何把一个DWORD或者一个WORD拆成32个或16个BOOL变量,或者一个BOOL数组。当然同时也包含了如何聚合,把BOOL聚合为DWORD/WORD。
这是因为标准化的块在与上位机或者触摸屏通讯的时候,通常使用的控制字和状态字。所有的控制指令通过一个DWORD的多个位下发到PLC,而运行状体的多个位,聚合到一个状态字后上传到HMI。
这样既减少变量的使用,也减少块的管脚。
当然,我也不是每次都重写程序。 程序脚本都是从西门子,倍福的标准化程序,移植过来的。老的程序中既然用到了,那到了新平台,当然也想继续这个模式。尽可能的通过移植来实现,而不需要完全对程序重新编写。
这个问题,在绝对寻址的年代,其实是不存在的。比如在S7-300中, 要把1个WORD比如MW10拆位, 啥工作都不需要做。 在需要按字访问的时候,只需要访问MW10,而需要按位访问的时候,则分别对应了M10.0, M10.1………M11.7。只需要访问这些位即可。
然而到了标准化编程, 逻辑都是在FB内部实现的, 我反复说过,FB中是不可以使用全局变量M的,所以自然就不能使用那些原本基础功能的技巧了。
到了TIA PORTAL, 西门子给出的解决方案是对字变量支持切片访问,即原本的一个WORD变量VAR1, 可以直接使用VAR1.%X0的方式访问其中的位。
这一点,使用中是非常方便,但其实和IEC61131标准有些出入,像倍福TC2中, 这个语法变为了VAR1.0,没了%和X。程序直接复制使用会有错误,但也还好,只要有明确的规则, 做个查找替换也实现了。
但到了三菱, 不支持切片访问了,找啊找, 找到了一套DINT_TO_BITARR的函数,可以通过转换,转换到数组访问。 麻烦当然是增加了不少。但最终也算是解决了。
然后是OMRON, 现在搞的是CX-P,就被这个难题给难住了。 翻遍了手册,也没找到合理的函数,请教了熟悉OMRON的学员,帮忙搜索请教了好几天,给我个回复也是没找到好方法。
那我就自己动手写一个函数吧,也不用什么循环了。 用最笨的方法,直接判断32行,做比较:
随便拿其中的一行做个解释,比如BIT2:
QOUT[2]:=(IN1 AND 4)=4;
这里如果数值IN1只有BIT2=1,则数值=4, 所以先做一个字的AND, 把其它的位都过滤屏蔽掉,然后再比较下是否等于4, 如果等于,就是TRUE, 如果不等于,就是FALSE。 可能用IF语句比较容易被理解。 但其实=本身的结果就是TRUE/FALSE,可以直接使用。
明眼人肯定看出来了, 我这段逻辑这是在EXCEL生成的,所以后面的那些大数字,虽然难记,但其实我根本不会去计算它们,都是直接复制使用了。
相似的道理,位聚合成字,也用此方法实现。
然后生成的函数就叫做DINT_TO_BITARR,与三菱的函数同名,调用语法再稍微做个调整,就可以在一大批库函数中使用了!
将来再有别的品牌平台不支持拆位的,也可以直接使用这段代码。 毕竟,在数学计算的方法上,所有平台都是一样的。
最后汇报下在OMRON中做标准化移植的进展情况:
起先准备阶段的时候,是先研究了SYSMAC STUDIO, (我在某网发帖提问只说前半截SYSMAC还被鄙视懂的太少,所以还不敢简称了),基本验证了可行之后,被同行告知, OMRON竟然还在两条产品线同时使用, CX-P也并没有完全被淘汰。
所以,安装了CX-ONE之后,一边研究一边探索,索性就先搞CX-P了。 OMRON作为一个最古老的PLC品牌,我在大学中就学过它,那是快30年前的故事了。 为了向OMRON,也为了向我的大学致敬,索性就两条线都各自做吧!但愿能满足更多行业的需求。
现在CX-P已经做了过半, 和三菱一样, 也是遇到了各种问题,然而和三菱中的问题又完全不同,我原本以为他们两家有亲戚关系,基因会很接近,但现在看,脑回路完全不一样。
但凭我对PLC和计算机的理解, 也大致摸透了他的特性,基本的技术难点已经解决,现在只剩下工作量的问题了。 我需要通过对设定的重复性比较多的工作量,探索如何在OMRON系统中快速实现。
总有人问我什么叫标准化,标准化其实就是追求高效率。寻找高效率的设计工作方法,给我们的设计工作探索一个标准化的流程。
如果不能实现高效率, 那任他啥子标准都没意义,如果某些所谓国际标准非但不能帮我们提高效率,反而会给我们工作带来麻烦,那我们会毫不犹豫抛弃它。那些只有面子的东西我们不需要,我们需要的是看得到的,能实实在在带来高效率,带来效益的技术和方法。
总有一些同行, 以为自己玩日系三菱、OMRON很久了,以为自己有点水平了。 所以对俺们这种新入手摸索一个新品牌的新手有些瞧不起,鄙视咱没水平。
现在给个作业, 和我做的一样,自己把位聚合的程序写出来,秀一下水平,如何?
先能做出来,再说水平。
[此贴子已经被作者于2021/7/18 21:09:47编辑过]
取位这种基本算法不是通用的么,正常人不是先移位再与操作的么,你作为要标准化的人怎么就拿这种垃圾算法来论坛显摆呢,这有失身份啊……