跟我一起玩200 smart PLC 如何查找“字节”数据中的有效位

已锁定

WWCWWC

西门子1847工业学习平台

  • 帖子

    7980
  • 精华

    145
  • 被关注

    1328

论坛等级:至圣

注册时间:2008-07-26

钻石 钻石 如何晋级?

跟我一起玩200 smart PLC 如何查找“字节”数据中的有效位

5592

3

2017-07-07 10:39:19

跟我一起玩200 smart PLC

如何查找“字节”数据中的有效位

   今天,在“找答案”版区看到一则提问,关于在一个“字节”数据中如何查找有效“位”数据(等于1的值),即一个字节中有效“位”的个数。因为看到提问已经快到下班时间了,也就没有回复,把这个问题带到家里,准备吃过晚饭思考一下,想了想之前有过【关于字节数据转位数据的操作】文章发帖过,对此类问题稍有考虑过,晚饭后打开电脑前,心里已经有了一些大致编程方向及思路。

   编辑类似的比较数据的大小、查找某一个数据之类的程序,之前我发过比较多的帖子,其基本方式就是用循环体指令(FOR/NEXT)。但之前的数据最小单位是字节数据类型,而不是“位”数据。拿这个“位”数据如何应用“比较”指令编程?显然不符合指令应用要求,但利用循环体毕竟对于比较多个字节、字、双字的操作太过于贴切不过了,先定下用循环体指令。那这个“位”如何移动呢?首先想到了字节移位指令,同时,移位指令中的溢出标志位SM1.1作为提取数据的标志位。这样组合应该是可以完成这个控制要求了的,思路归思路,但必须经过验证才能有说服力。

编程思路:

1)  新建一个循环体指令

2)  在循环体指令之间比较移位指令,因为仅仅是取字节中的有效位,所以左、右移位均不影响取位的效果,这里用字节的左移指令

3)  移位中取出的有效位=1的值,用SM1.1读取,并存放到一个字节数据区记录

确定了思路,再确定用带功能参数的子程序编辑方式编辑该控制程序,以方便多次调用。

首先,新建一个子程序并命名子程序名称,定义子程序变量,图示:

根据既定的思路编辑子程序:



在主程序中调用该子程序:


新建“状态图表”监控、验证程序,VB0随意输入数字7(2#0000 0111),图示:


将M0.0 = 1调用一次子程序,VB1 = 3结果符合要求;再测试将VB0 = 255(2#1111 1111),再看VB1的结果,图示:


结果等于8个有效位,符合当初程序的编程思路。

小结:

1)  FOR/NEXT指令中的INDX管脚在每次调用指令时具有自动清0的功能,所以不需要清零的操作,也就不需要数据的初始化操作。

2)  因为是需要重复读取字节中的有效位,所以循环指令运行时,需要把读取到的原值数据进行清零操作。

3)  充分利用移位指令数据溢出标志位SM1.1的特性,解决字节数据中的有效“位”。

上述的程序仅仅是读取字节中有效位的一种编程方法,在实际应用中还应该把主程序中的M0.0用字节比较指令替换,目的是当cpu读取到字节VB0有变化时,立即读取该字节中的有效位,修改后的程序如下图示:



跟我一起玩200 smart PLC 如何查找“字节”数据中的有效位 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-200 SMART

共有7477条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

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