技术论坛

 PLC中的32位指针寻址困惑

返回主题列表
作者 主题
大魔王111
游民

经验值: 98
发帖数: 7
精华帖: 0
楼主    2021-06-03 13:54:25
主题:PLC中的32位指针寻址困惑

如题:

技术手册上说的是:若把一个32位整型转换为字节指针常数,从上述指针格式可以看出,应要把该数左移3位(或是乘8)即可。

eg1

********************************************************
L         L#100            //Accu0装入32位整形100
SLD         3               //左移3位
T        LDO                //LDO得到P#100.0指针常数

********************************************************


eg2

********************************************************
L            320                   //320转换指针为P#40.0并装载到MD28中。
T         MD28

********************************************************

困惑点:

1.为什么320,变成指针就是P40.0,而不是P320.0,;

2.两个示例,都是转化为指针,为什么转化的结果不一样,区别在哪里。


附件是我看的技术资料,在此先谢谢大家了。

PLC寻址方式.pdf

冬日
奇侠

经验值: 7290
发帖数: 3286
精华帖: 51
1楼    2021-06-03 14:14:33
主题:回复:PLC中的32位指针寻址困惑

答案你自己不是都说了嘛,要左移三位或者乘8

你认真看一下指针的数据结构自然就明白了,第0-3位表示位,4-19好像(忘记了)表示字节。

320直接传到指针,表示已经左移三位,也就是已经x8了,所以实际上表示的是40.0


If anything can go wrong, it will.
大魔王111
游民

经验值: 98
发帖数: 7
精华帖: 0
2楼    2021-06-04 16:30:41
主题:回复:PLC中的32位指针寻址困惑

我意思如果按照左移的思想来理解的话。

案例2,

整数320,转化为2进制是    1 0100 0000

如果用32位表示的话,应该是

0000 0000 0000 0000 0000 0001 0100 0000

用32位指针表示:

0000 0000 0000 0000 0000 0001 0100 0000

换算成指针形式,刚好是P#40.0


对于案例1,如果按照我理解的,

整数100,转化为2进制是      0110 0100

如果用32位表示的话,应该是

0000 0000 0000 0000 0000 0000 0110 0100

用32位指针表示:

0000 0000 0000 0000 0000 0000 0110 0100

换算成指针形式,是P#12.4,不是P#100.0


困惑点在于:

为什么,整数100,如果想得到P#100.0,是换算为2进制后,整体左移3位,否则就是P#12.4

但整数320,如果按照整体左移3位的话,得到的结果是P#320.0,而不是P#40.0


求大佬解惑。谢谢啦。


kenshinguo
侠士

经验值: 1628
发帖数: 619
精华帖: 1
3楼    2021-06-04 16:40:20
主题:回复:PLC中的32位指针寻址困惑

你红色字体说的很清楚啊,整数100左移3位是P#100.0,不左移就是p#12.4;整数320左移3位是P#320.0,不左移就是P#40.0。这没毛病啊,两个例子一模一样。

zhangli0
至圣

经验值: 32145
发帖数: 13390
精华帖: 51
4楼    2021-06-06 09:40:13
主题:回复:PLC中的32位指针寻址困惑

为什么,整数100,如果想得到P#100.0,是换算为2进制后,整体左移3位,否则就是P#12.4


整数100=2#110 0100,最后的三位表示的是字节的8个位,如果要想得到指针的值100.0那么就要左移三位变成:2#11 0010 0000



但整数320,如果按照整体左移3位的话,得到的结果是P#320.0,而不是P#40.0

你的第二个没有左移,直接把320赋值给指针变量了,所以指针的值是320/8=40.0,如果你要指针的值是320.0那么就也要左移3位才行。

活到老,学到老!为了生活学习吧!
xiatianyun
侠客

经验值: 922
发帖数: 127
精华帖: 1
5楼    2021-06-06 09:54:06
主题:回复:PLC中的32位指针寻址困惑

指针这样直接使用是在哪种场景中?

大魔王111
游民

经验值: 98
发帖数: 7
精华帖: 0
6楼    2021-06-07 13:26:16
主题:回复:PLC中的32位指针寻址困惑

我对下面这些东西还是不大理解,求解惑



大魔王111
游民

经验值: 98
发帖数: 7
精华帖: 0
7楼    2021-06-07 13:27:25
主题:回复:PLC中的32位指针寻址困惑

感谢你的帮助,只是对下面描述的东西,还有点不大理解



幸福的小石头
侠士

经验值: 1342
发帖数: 181
精华帖: 1
8楼    2021-06-08 02:51:43
精华帖  主题:回复:PLC中的32位指针寻址困惑

前几年学STL时候,也是很迷惑过这个问题,其实,弄STL,你得先看看基础知识,不能自己硬搞,毕竟这个地方都是根据规则来的,以现在仅仅是对为什么左移有疑问,到时候你还会遇到Any和Pointer类型拆分的疑问,会迷惑于为什么要拆分那么细,然后各个部分比较,其实都是基础知识,仔细看一下规则和定义即可,另外,你得转换一下思路,将十进制的思路,转换到二进制来,如32位寻址,你得仔细看人家介绍的每个字,尤其是,32位怎么划分的区域,每个区域表示什么



大魔王111
游民

经验值: 98
发帖数: 7
精华帖: 0
9楼    2021-06-08 09:26:33
主题:回复:PLC中的32位指针寻址困惑

感谢你的热心帮助,只是目前资源有限,有些不懂的地方,周围没有人解惑。

比如贴中所示:


为什么整数100,用32位指针表示,需要左移3位,得到P#100.0,但为什么整数320,转化位指针的时候,不需要再左移3位,得到了P#40.0,


现在的困惑在于,整数转化为32位指针的时候,什么时候,需要左移3位,什么时候不需要。我问了一些人,都不甚了解。

幸福的小石头
侠士

经验值: 1342
发帖数: 181
精华帖: 1
10楼    2021-06-08 10:21:08
主题:回复:PLC中的32位指针寻址困惑

问题的本身就是答案啊,偏移是用于指针时候啊,这个时候相当于有个基准量AR1,然后再加上偏移地址,根据偏移地址的变化,指针就指向不同的地方,建议你仔细看看你发的那个文档,一个字一个字看,把案例抄下来,仿真监控一下,你就发现其中的含义了,另外,STL的资料,大部分是比较早的Step7的,用博途写和监控时候,有些地方会不一样,自己注意甄别;

另外,即便不是看不会,也不要太捉急,毕竟现在STL都快属于上古语言了,能大体看懂就行,自己多写写,多监控,逐个程序步的监控,慢慢就发现奥秘了,到时候你会有种恍然大悟的感觉

kenshinguo
侠士

经验值: 1628
发帖数: 619
精华帖: 1
11楼    2021-06-08 10:42:34
主题:回复:PLC中的32位指针寻址困惑

不知道该怎么解释,可能还得楼主自己琢磨下。

指针寻址就跟我们爬楼一样,一层楼就是一个byte,每层楼之间有8级台阶,一级台阶就是一个bit位。

你爬到第40层楼(地平面是0层),就得爬40*8个台阶,指针偏移是320。

P#0.1代表指针偏移1,P#0.2代表指针偏移2......P#1.0代表指针偏移8,P#2.0=2*8,P#3.0=3*8。

P#40.0代表第40层楼,他的指针值是40*8=320。

如果指针是100,100/8=12余4,代表P#12.4。


shanmin
侠圣

经验值: 2316
发帖数: 282
精华帖: 2
12楼    2021-06-09 22:09:52
主题:回复:PLC中的32位指针寻址困惑

你问的好像是应用场景啊,比如你要将M40.0后面的位逐个置1。那就可以将320装载到MD28,置1;MD28加1,再置1;MD28加1,再置1。。。。。这样M40.0后面的位就逐个置1了,目的达到。什么时候需要左移3位什么时候不需要完全是根据你的需求来的。好好理解上图的寻址规则就OK了。

冬日
奇侠

经验值: 7290
发帖数: 3286
精华帖: 51
13楼    2021-06-09 22:52:18
主题:回复:PLC中的32位指针寻址困惑

左移只是过程,不是目的,目的是得到正确的值。

比如下面的eg1,写成这样效果是一样的

L         L#800            //Accu0装入32位整形100
//SLD         3               //左移3位
T        LDO                //LDO得到P#100.0指针常数


eg1

********************************************************
L         L#100            //Accu0装入32位整形100
SLD         3               //左移3位
T        LDO                //LDO得到P#100.0指针常数

********************************************************

这个eg2,写成这样效果也是一样的:

L            40                   //320转换指针为P#40.0并装载到MD28中。

L 8(或者SLD 3)

*I
T         MD28


eg2

********************************************************
L            320                   //320转换指针为P#40.0并装载到MD28中。
T         MD28

********************************************************


If anything can go wrong, it will.
莎利文
侠士

经验值: 1238
发帖数: 80
精华帖: 3
17楼    2021-06-21 17:12:26
主题:回复:PLC中的32位指针寻址困惑

 

存储器间接寻址的地址给定格式是:地址标识符+指针。指针所指示存储单元中所包含的数值,就是地址的确切数值单元。  
  存储器间接寻址具有两个指针格式:单字和双字  [由于单字与双字的数值范围不同,则寻址空间不同,进而导致使用范围也不同]  
  单字指针是一个16bit的结构,从0-15bit,指示一个从0-65535的数值,这个数值就是被寻址的存储区域的编号。  
  双字指针是一个32bit的结构,从0-2bit,共三位,按照8进制指示被寻址的位编号,也就是0-7;而从3-18bit,共16位,指示一个从0-65535的数值,这个数值就是被寻址的字节编号。[前3位与后18位一共是21位,但是双字共32位,请诸位想想还有11位的用途] 
 指针可以存放在M、DI、DB和L区域中,也就是说,可以用这些区域的内容来做指针。  
 单字指针和双字指针在使用上有很大区别。下面举例说明:
---------------------------分割一下------------------------------程序举例部分 -----------------------------------------
  L DW#16#35       //取32位16进制数35存入ACC1  
  T MD2            //这个值再存入MD2,这是个32位的双字存储区域  
  L +10             //将16位整数10存入ACC1,32位16进制数35自动移动到ACC2  
  T MW100         //这个值再存入MW100,这是个16位的字存储区域  
 ---------------------------分割一下------------------------------主程序部分 ------------------------------------------
  OPN DBW[MW100]  //打开DBW10。这里的[MW100]就是个单字指针,存放指针的区域是M区,  
                      MW100中的值10,就是指针间接指定的地址,它是个16位的数值   
  L L#+10           //取32位形式把10放入ACC1,此时ACC2中的内容为:16位整数10
  T MD104          //这个值存入MD104,这是个32位的双位存储区域  
  A I[MD104]        //对I1.2进行与逻辑操作!
  =DIX[MD2]        //赋值背景数据位DIX6.5!  
  A DB[MW100].DBX[MD2]    //读入DB10.DBX6.5数据位状态 
  =Q[MD2]                  //赋值给Q6.5  
  A DB[MW100].DBX[MD2]   //读入DB10.DBX6.5数据位状态  
  =Q[MW100]      //错误!没有Q10这个元件,因为我们对Q 的操作属于位操作,但是地址指针[MW100]没        有提供为操作的内容。所以属于编程错误,一般没有OB122的操作PLC 会停机报警。 
---------------------------分割一下------------------------------解释部分 ----------------------------------------
  从上面系列举例我们至少看出来一点:  
  字指针只能用在地址标识符是非位的情况下。的确,单字指针前面描述过,它确定的数值是0-65535,而对于byte.bit这种具体位结构来说,只能用双字指针。这是它们的第一个区别,单字指针的另外一个限制就是,它只能对T、C、DB、FC和FB进行寻址,通俗地说,单字指针只可以用来指代这些存储区域的编号。  
  相对于单字指针,双字指针就没有这样的限制,它不仅可以对位地址进行寻址,还可以对BYTE、WORD、DWORD寻址,并且没有区域的限制。不过,有得必有失,在对非位的区域进行寻址时,必须确保其0-2bit为全0!
因为0-2bit被定义为位的指向专用部分。


  总结一下:  
  单字指针的存储器间接寻址只能用在地址标识符是非位的场合;双字指针由于有位格式存在,所以对地址标识符没有限制。也正是由于双字指针是一个具有位的指针,因此,当对字节、字或者双字存储区地址进行寻址时,必须确保双字指针的内容是8或者8的倍数。
  现在,我们来分析一下上述例子中的A I[MD104] 为什么最后是对I1.2进行与逻辑操作。  
  通过L L#+10 ,我们知道存放在MD104中的值应该是:  
  MD104:0000 0000 0000 0000 0000 0000 0000 1010 
  当作为双字指针时,就应该按照3-18bit指定byte,0-2bit指定bit来确定最终指令要操作的地址,因此:  
  0000 0000 0000 0000 0000 0000 0000 1010 = 1.2 

人情到时文章老,书读深处意气平。
n63185
游侠

经验值: 436
发帖数: 107
精华帖: 0
20楼    2021-07-09 22:29:38
主题:回复:PLC中的32位指针寻址困惑

越玩越多~越玩越複雜



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