分享

【跟着我一起来学习s7-200】25移位循环指令

 老黄兄 2015-01-14

之前有说要学习一下移位循环指令的,那么今天就开始学习一下移位循环指令的使用吧。移位指令有左移也有右移,移位指令也分有字节、字、双字类型的移位,同样的,循环指令也有左移右移,也有字节、字、双字类型的循环。除此之外,我们也可以在指令列表看到还有SHRB移位寄存器指令。这些指令我们都要灵活地掌握,掌握了这些指令,在以后编程的时候有时可以做到简化程序的效果,所以它还是比较有用的指令。


下面先学习一下移位指令,移位指令格式里面有使能输入、输入、输出和移位位数N。下面就以字节移位指令为例看一下,字节左移SHR_B和字节左移SHL_B指令是将输入字节(或字或双字)数值根据移位位数向左或向右移动,并将结果送输出字节(或字或双字)。我们要注意的是对一个数左移一位相当于乘以2,右移一位相当于除以2。

对于移位指令,我们要注意的是移位指令是对每个移出的位进行自动补0的。如果移位位数大于或等于8(或字操作16或双字操作32),那么数值最多是被移位8(或字操作16或双字操作32)次的。当移位位数大于或等于最大允许值时,其实就相当于进行清零的操作。

除此之外,我们还要注意特殊内存位的使用,对于SM1.0,如果移位结果是零,则SM1.0被置位;对于SM1.1,就是把最后一次移出位的数值被复制到SM1.1,要注意这个前提是移位位数大于0。我们要注意的是SM1.0和SM1.1是会自动复位的。

就以下面这个程序来说明一下指令的使用,这条指令是I0.0接通执行移位操作,它是接通一次移位一次的,若VW200写入的是1110 0010 1010 1101,因为移位位数是3,那么移位的最后结果是0001 0101 0110 1000的。因为移位位数是大于0的,最后一位移出位的数值是1,那么就把SM1.1置为1。

下面再学习一下循环移位指令,循环移位指令格式里面一样是有使能输入、输入、输出和移位位数N的。下面就以字节循环移位指令为例看一下,字节循环左移ROR_B和字节循环左移ROL_B指令是将输入字节(或字或双字)数值根据移位位数向左或向右旋转N位,并将结果送输出字节(或字或双字)。

对于循环移位指令,我们要注意的是如果移位位数大于或等于8(或字操作16或双字操作32),那么执行循环移位之前要先对移位位数N进行模数8(或字操作16或双字操作32)操作,使得移位位数在0~7(或字操作0~15或双字操作0~31)之间,得到一个有效的移位位数。这里说的模数8操作是什么呢?它其实也就是对移位位数N除于8再求余数,举个例子,如果移位位数是20,那么20除于8等于2余4,那么4就是实际移位数目。

我们要知道如果移位位数为0,这指令也就没有什么意义了,它是不执行循环操作的。如果执行循环操作,也就是移位位数大于0,那么旋转的最后一位数值被复制到SM1.1。对于SM1.1,还有如果移位位数不是8(或16或32)的整数倍,那么旋转出的最后一位数值也被复制到SM1.1;对于SM1.0,当需要循环的数值是零时,SM1.0被置位。
就以下面这个程序来说明一下指令的使用,这条指令是I0.0接通执行循环操作,若AC0写入的是0100 0000 0000 0001,因为移位位数是2,那么移位的最后结果是0101 0000 0000 0000的。因为移位位数是大于0的,最后一位移出位的数值是0,那么SM1.1就为0。


下面就以小程序案例的形式讲一下这几个指令。
1、编写跑马灯程序,8个灯从左往右循环点亮,即Q0.0---Q0.7每隔1秒点亮一个灯,周期循环。

2、编写8个灯先全部亮,接着8个灯从左往右依次熄灭,即Q0.0-Q0.7每隔1s熄灭一个灯。

那么这就是移位指令和循环指令了,今天主要是学习指令的基本使用,这里还有移位寄存器指令没有学习,那么明天就学习一下移位寄存器,并且后面再来学一下对这些指令的应用。


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多