关于多个双字存储器移位的编程与解析 点击:1995 | 回复:12



wyb2866255

    
  • 精华:57帖
  • 求助:0帖
  • 帖子:148帖 | 2872回
  • 年度积分:1
  • 历史总积分:31450
  • 注册:2010年7月01日
发表于:2012-03-05 00:22:02
楼主

            关于多个双字存储器移位的编程与解析

   网上一网友求助关于多个双字存储器移位的编程:“西门子的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.1V0.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要做“与”与“或”运算处理:先是VB016#FE相与,其结果保持VB0的高7位数据不变,且使V0.0=0,将结果送入VB40,再用VB20VB40相或,送回VB0。这样的处理使VB0既保持高7位数据不变,又确保将原V1.7的数据移到V0.0里。

同理可分析将VB5VB9右移7位后,再将其或到左移一位后的VD1VD5的低字节VB4VB8里的作用原理。

下面再编写89位循环左移一位的程序,89位占据3个双字存储器地址,其最高位为V0.0,依次为:V1.7  V1.6 ……V11.1  V11.0 ,共89位位变量。其VB0中的高7位(V0.1V0.7)不在循环移位范围之内,要求移位后不改变这7位的数值。

程序解析:如果看懂前面的89位左移一位的程序,就不难看懂89位循环左移一位的程序,循环左移一位,不仅要求把这89位的数据同时向上移动一位,而且将其最高位(即V0.0)的移出数据送回最低位V11.0里,故程序里增加了将VB0与立即数1相与,送入VB41,再将左移后的VB11VB41相或,实现将其最高位(即V0.0)的移出数据送回最低位V11.0里的作用。

对于多双字的右移与循环右移的编程与此类似,这里就不一一例举了,感情趣的网友可以自己编程试试。就写到这里,如有什么不妥或疑问可以提出来,本人愿意与大家讨论与交流。谢谢!

 



楼主最近还看过



通讯网

  • 精华:11帖
  • 求助:2帖
  • 帖子:464帖 | 10265回
  • 年度积分:0
  • 历史总积分:24711
  • 注册:2004年7月09日
发表于:2012-03-05 07:53:34
1楼
你对89个位移动干嘛??吃饱了撑得??

wyb2866255

  • 精华:73帖
  • 求助:0帖
  • 帖子:218帖 | 2872回
  • 年度积分:0
  • 历史总积分:31450
  • 注册:2010年7月01日
发表于:2012-03-05 15:57:45
2楼
回1楼:本文一开始就讲明是这是为一网友的求助而编写的,具体用它做什么不知道,但对多于双字(32位)的移位操作在实际中还是有用的,也是很多初学者想要学习的。本着为人解难助人为乐我编写了这个程序,有什么不对的吗?你说:“你对89个位移动干嘛??吃饱了撑得?? ”不觉得有点过分?

quanlun

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 8回
  • 年度积分:0
  • 历史总积分:38
  • 注册:2007年1月29日
发表于:2012-03-10 19:02:05
3楼
让我们新人多了解学习,顶,辛苦了

zoppa

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 51回
  • 年度积分:0
  • 历史总积分:165
  • 注册:2010年12月01日
发表于:2012-03-10 21:54:12
4楼
LZ辛苦,对新人帮助很大,谢谢!

zoppa

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 51回
  • 年度积分:0
  • 历史总积分:165
  • 注册:2010年12月01日
发表于:2012-03-10 22:08:19
5楼
下面再编写89位循环左移一位的程序,89位占据3个双字存储器地址,其最高位为V0.0”,楼主,最高位不是V0.7  ?

wyb2866255---王者之师

  • 精华:73帖
  • 求助:0帖
  • 帖子:218帖 | 2872回
  • 年度积分:0
  • 历史总积分:31450
  • 注册:2010年7月01日
发表于:2012-03-11 00:22:09
6楼

回5楼:我们以VW0为例:它包含高字节VB0和低字节VB1,如使VW0左移一位,其VB1的最高位为V1.7的内容将移到VB0的最低位V0.0,而不是移到V0.7。89为占据VD1、VD5、VW9及VB11的全部地址共:32×2+16+8=88 位,还少一位,故最高位一定在VB0里,而且是VB0的最低位:V0.0,绝不是V0.7。见下图:

zhaodeng_2001

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 1回
  • 年度积分:0
  • 历史总积分:11
  • 注册:2012年3月21日
发表于:2012-03-21 16:39:36
7楼

谢谢帮助大家,学习了!

竹子

  • 精华:0帖
  • 求助:14帖
  • 帖子:25帖 | 606回
  • 年度积分:0
  • 历史总积分:2157
  • 注册:2009年11月26日
发表于:2012-03-29 10:07:34
8楼
让我们新人多了解学习,顶,辛苦了

叶湘伦123

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 12回
  • 年度积分:0
  • 历史总积分:0
  • 注册:1900年1月01日
发表于:2012-03-30 20:45:59
9楼
回复内容:
对:zoppa关于“下面再编写89位循环左移一位的程序,89位占据3个双字存储器地址,其最高位为V0.0”,楼主,最高位不是V0.7  ? 内容的回复:


版主真是厉害,逻辑性很强!!!佩服,学习了

二小王

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 98回
  • 年度积分:0
  • 历史总积分:383
  • 注册:2011年8月15日
发表于:2012-03-30 21:50:28
10楼
引用 叶湘伦123 的回复内容: 回复内容:对:zoppa关于“下面再编写89位循环左移一位的程序,89位占据3个双字存储器地址,其最高位为V0.0”,楼主,最高位不是V0.7  ? 内容的回复:版主真是厉害,逻辑性很强!!!佩服,学习了



felixzhang

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 35回
  • 年度积分:0
  • 历史总积分:170
  • 注册:2012年3月31日
发表于:2012-04-02 18:32:55
11楼
雷害,转来转去,我都快晕了,

时空

  • 精华:2帖
  • 求助:250帖
  • 帖子:541帖 | 4473回
  • 年度积分:0
  • 历史总积分:31341
  • 注册:2008年6月06日
发表于:2012-04-02 18:37:34
12楼
谢谢分享学习了                   

热门招聘
相关主题

官方公众号

智造工程师