数据移位指令就是位操作指令,在C语言中,或者熟悉单片机编程,或者熟悉PC汇编语言的朋友都不会陌生。恰恰勇哥以上都比较熟悉。
最早的程序员们,像386计算机这种pc的时代,为了让游戏速度更快,发明右移运算代替乘法的窍门,那时候勇哥还比较崇拜他们呢。
换成在PLC里面,位操作似乎无所不在,全部指令的命令字都是以位来进行控制的。
欧姆龙的输入输出IO通道都是按位操作的。
WSFT 字移位
由实验可以看到,D0开始的数据往D10方向移动了一个字。
没有移动前
指令执行后的效果
SLD 左移一位
将从 D4 到D5 的范围以数字(4 位)为单位向高位位侧移位。此时,最低位数字(D4 的位3-0)中输入0,原
来的最高位数字(D4的位15-12)数据被清除。
同时原来D4高位数字3被循环D5的低位。
如果下面的例子1再执行一次结果是:3100 0032
另外,这条指令起始字要大于结束字,如果D4,D5换个位置,指令报错。
另外,这里所谓的一位,指的是一位数字,相当于4个位。
指令前
指令后
SRD 右移一位
将从 D4 到D5 的范围以位(4 位)为单位向低位位侧进行移位。此时,在最高位(D2 的位15-12)中输入0,
原来的最低位(D1 的位3-0)数据被清除。同时D5的最低位1被移到了D4最高位上。
注:D1>D2 时,发生错误,ER 标志为ON。
数据位移指令的例子
下面的例子把数据位移指令结合位与指令来把ASCII码转为对应的数值。
例如D4里面保存有十六进制数3100,字符1的ascii码就是31,我们希望取得数字1,而不是十六进制的3100。
程序如下:
D4内容为十六进制数3100
程序执行后为十六进制数1
如果有童鞋不清楚为什么位与0F就可以取到1,继续看:
右移后D4为0031,跟0F按位与运算后,其值就是为1
你可以试下把D4的初值赋为#3100,#3200,#3300,#3400,#3500等等,然后运行程序,结果都是正确的。
在这个演示程序里面,勇哥发现这个SRD指令不能在一根线上写两个,为什么不可以串起来写呢?给我个理由?!
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!
其它相关文章:
欧姆龙cp1h常用指令学习(十五)多重互锁指令MILH,MILC
欧姆龙cp1h常用指令学习(四)串口无协议读写指令TXD,RXD

