登录
首页 PLC论坛 欧姆龙OMRON
回帖 发帖
正文

主题:【万泉河】OMRON PLC的字变量拆位

点击:5029 回复:30

【万泉河】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行,做比较:
附件 6.jpg
随便拿其中的一行做个解释,比如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
21-07-18 21:09

引用 万泉河. 在 2021/7/18 21:09:10 发言【内容省略】

你写的太复杂了.
附件 workpicture2.jpg
附件 workpicture3.jpg
还是那句话,你的编程水平还有很大的提升空间.
Good Luck~
21-07-19 09:09
可能楼主不是用在PLC里?
以前一条指令解决不好拆分的数据位
比如要D100/D101的某个位状态(现在有专用指令解决)
MOV/MOVL D100 W100
在W100.00~W10.15 /W101.00~W101.15 就能得到你要的位状态
如果你是要D区以外的就更简单啦,直接调用那一位。
21-07-19 09:26
CJ CP 功能块慢。
21-07-19 09:37
这不就是我说的绝对地址的那部分内容吗!
21-07-21 20:46
你这好像也没简单到哪里去。
而且, 固死在OMRON里面, 换个品牌又不能用了。 像这样的水平啊, 俺情愿不要有。
我那程序将来任何PLC,只要支持ST, 都能用。
因为是基于基本的计算机数据原理的。
21-07-21 20:49

引用 万泉河. 在 2021/7/21 20:46:05 发言【内容省略】

开始就问你,这个程序是放在PLC里运行吗?
如果是的话,你能脱离所为的绝对地址运行?
非要在欧姆龙的PLC里用个Y,Q也不是不可以,有意思吗?
或许你是像自动生成下面这个梯形图程序,最后在完成变量表的【分配到】
如果是这样,就不要再研究CXP,它最后只能依赖绝对地址
SYSMAC STUDIO 应该是你要的目标
附件 image.jpg
附件 image.jpg
使用功能块
所有变量都可以后确定具体对象,不像CXP要先建立IO表分配资源才好动手编程,只要变量名起的成功就好办事
具体你要的“切片”技术,自己看手册,我觉得应该有对应指令,我是没精力琢磨了
CXP也好,STUDIO也罢,都是适应各自对应的机型,机器还在用为啥要淘汰,你淘汰它遇到需要时只能眼看着钱进别人的口袋。
只提 SYSMAC 是很容易被误解,对于新人可能是唯一,对于老人,SSS/LSS在早的GPS200/500(记得是)都是SYSMAC 麾下PLC编程工具。
2周前还用LSS复活一批在用C20的设备,用cxp改造几台CPM 控制的设备,没有这几样工具,再甜活也不是我的。
你说玩 STUDIO 的很溜, 在被鄙视懂的太少表情
祝你成功
21-07-21 23:46

引用 万泉河. 在 2021/7/21 20:49:51 发言【内容省略】

要换品牌就能用,那么就要放弃西门子的编程思维以及你那倍福的Codesys的编程思维,且完全放弃日系的简便指令思维。
即使是使用同样软件的菲尼克斯,研华以及富士,由于其对应的硬件不同,其支持的编程方式也有所不同,因此,你要取得完整的移植,那么你需要放弃字节这种欧美系普遍支持的数据长度而改用以字为最小单位的数据长度,所以以你现在的水平都没有看透这些,你老是纠结于编程语言从西门子去直接翻译而不是针对于厂商进行优化的标准是毫无意义的,因此希望你能静下心来好好研读各个厂商的手册,总结各个厂商的产品特点,勿以西门子先入为主,这样你才能真正的跨越品牌。
就目前看来,即使使用同一种编程工具,例如Codesys,只要允许二次开发,那么各个厂商不同,就不会那么简单的兼容,只能兼容不涉及硬件的指令,为了取得更大的兼容,就必须将功能简单化,所以标准是设计方法而不是你所谓的编程方法。
21-07-22 05:25
你压根不懂标准化设计怎么做, 只停留在做垃圾程序的水准的人, 有什么资格评价?我提到了移植,又赶紧理解成我要做的是跨平台的程序移植了。
算了,相当于对牛弹琴。 不跟牛解释了。
最后修改:2021/7/25 16:16:13
21-07-25 16:07
日系里面的那些所谓的简便使用的指令,普遍都是不支持封装重复使用的。 只适合在梯形图中罗列一千遍的使用,每一个实例都需要单独调试单独编写。
这种在我看来,都是垃圾。
21-07-25 16:09

上一页下一页

工控新闻

更多新闻资讯