关于多个双字存储器移位的编程与解析
网上一网友求助关于多个双字存储器移位的编程:“西门子的plc最大存储单位是一个双字 即32位 移位指令可以对这32个位进行左移右移或者循环移位 但是现在我想对89个位进行操作 就是我想对89个位进行左移右移或者循环移位 苦思冥想 竟是没想出来什么方法 所以请教一下高人指点 这个能不能实现 要怎么实现”
要想编写多个双字(即32位)以上的存储器的移位编程,应事先对字节、字及双字的移位指令的定义多做了解,只有真正理解它,就可按移位的定义进行编程。比如字节的左移指令:
I0.0每置1一次,其前沿使MB4左移一位,即MB4的各位的数据移到上一位,其最低位(M4.0)的值移到上一位(M4.1),由于没有其它数值移给它,故其位值=0。最高位M4.7的原值移出,而M4.6的值移给它(M4.7)。见下图:
字节的循环左移一位,也是将字节的各位数移到上一位,与字节左移的不同的地方就是其最高位移出的数送回该字节的最低位里,见下图:
字节的右移及循环右移与字节的左移及循环左移类似,不同点就是移位方向相反,即字节的各位数据向下移动一位:右移指令右移一位后,字节的最高位=0,循环右移指令右移一位后,字节的最低位的数移送到字节的最高位。
这里还要说明的是:如字节执行左(或右)移位(或循环移位)将移位结果送回本字节,该字节移位后的内容与移位前不一样,如字节执行左(或右)移位(或循环移位)将移位结果送到另一字节,该字节移位后的内容仍保持移位前状态不变。而移位后的结果存入另一字节中。
对于字或双字存储器的移位原理与字节相同,要注意的是它们的最低位与最高为的地址不要弄错,比如:字MW4,其最高位为M4.7,其最低位为M5.0。双字MD4,其最高位为M4.7,其最低位为M7.0。知道这些,就可以进行多字节(或多双字)的移位编程。
下面是89位左移一位的程序,89位占据3个双字存储器地址,本程序最高位为V0.0,依次为:V1.7 V1.6 ……V11.1 V11.0 ,共89位位变量。其VB0中的高7位(V0.1~V0.7)不在移位范围之内,要求移位时不能改变这7位的数值。
对程序的解析:VD1左移一位,其最低位V4.0=0,而最高位(V1.7)的值将丢失,为此先将VB1右移7位,送入VB20里,即保留了VB1的原V1.7的数据,且将其存入VB20的最低位(V20.0=原V1.7),而VB20的高7位(V20.1~V20.7)皆为0。其目的是将VB20或到VB0中,以达到将V1.7左移到V1.0里的目的。为使VB0的不参予移位的高7位的数据不变,且确保最低位V0.0移位后的数据正确,对VB0要做“与”与“或”运算处理:先是VB0与16#FE相与,其结果保持VB0的高7位数据不变,且使V0.0=0,将结果送入VB40,再用VB20与VB40相或,送回VB0。这样的处理使VB0既保持高7位数据不变,又确保将原V1.7的数据移到V0.0里。
同理可分析将VB5与VB9右移7位后,再将其或到左移一位后的VD1与VD5的低字节VB4与VB8里的作用原理。
下面再编写89位循环左移一位的程序,89位占据3个双字存储器地址,其最高位为V0.0,依次为:V1.7 V1.6 ……V11.1 V11.0 ,共89位位变量。其VB0中的高7位(V0.1~V0.7)不在循环移位范围之内,要求移位后不改变这7位的数值。
程序解析:如果看懂前面的89位左移一位的程序,就不难看懂89位循环左移一位的程序,循环左移一位,不仅要求把这89位的数据同时向上移动一位,而且将其最高位(即V0.0)的移出数据送回最低位V11.0里,故程序里增加了将VB0与立即数1相与,送入VB41,再将左移后的VB11与VB41相或,实现将其最高位(即V0.0)的移出数据送回最低位V11.0里的作用。
对于多双字的右移与循环右移的编程与此类似,这里就不一一例举了,感情趣的网友可以自己编程试试。就写到这里,如有什么不妥或疑问可以提出来,本人愿意与大家讨论与交流。谢谢!
楼主最近还看过