恭喜,你发布的帖子
发布于 2017-02-14 10:11:16
14楼
S7-300/400 硬件平台上 熟练使用指针 可以使你编出更灵活的程序,但是要能熟练使用指针 ,必须了解指针的结构》
S7-300/400 所使用的指针,总体上可分为16位指针和32位指针
1:16 位指针
此类指针,比较简单很好理解,主要用于对定时器,计数器,程序块的寻址,16位指针就是一个无符号整数(0-65535)结构如下
举例 要对一个 定时器寻址,我们使用 MW0 来作为指针
L 1
T MW0
A I 0.0
SD T[MW0] //就是启动定时器 T1。
对DB块寻址
L 100
T MW100
OPN DB[MW100] 世纪上就是打开 DB100
好了,看上去16位指针简单吧,简单说明下[ ]里面的值是多少 就是对相应号码的 T,C,FB,FC,DB寻址。
2:32位指针
32位指针又可分为2类,一类是区域内指针,还有一种的区域间指针,什么为区域内指针,什么为区域间指针?看下面
L MD[MD100] 中的MD100就是区域内指针
L W[MD200] 中的MD200就是区域间指针,至于 语句访问的是哪个区域 是在MD200中指明的。下面看看2类指针有什么不同
2.1 区域内指针
如上图 32位区域内指针的 19-31位是未定义的,3-18位是定义字节地址,0-2是定义位地址的,这点 对于区域间 指针也是同样的。
根据上图 解释下 为什么 320 加了括号后 就变成P#40.0了。首先 P#x.y是指针常数,可以8*x+y转化为DWORD数值,比如 P#3.2 转化为DWORD 数值就是26=100110。
比如 对MD40进行寻址 指针放在MD28中 要使MD40=MD[MD28],MD28应该是多少?楼主程序中已经表明了MD28=320,我们来说明为什么是 320。那么需要看 上图32位区域内指针结构了。
320在PLC 内存中应该是 101000000 根据 指针机构 分解为 101000,000 ,101000 对应寻址的指针BYTE部分,000对应BIT部分,101000 对应10进制就是40, 所以 要使MD40=MD[MD28] MD28的值就是320,如果 MD28=40 那么 MD[MD28]就等于MD5了。各位大侠 看出什么了吗?其实 ,我们存储在DWORD内存的数值*3 就是指针了,比如 40*8=P#40.0,这也是在程序中经常看到SLD 3语句的原因了 就是左移3位,其实就是乘以8。
如果除以8 还有余数怎么办?余数就是位地址,比如 321/8=40*8+1 其实 就是对应指针 P#40.1,简单的计算方法 就是 321/8=40.125 其中小数部分 称8 就是对应的位地址。
2.2 区域间指针
区域间指针 和区域内指针 差别不大,只是 区域间指针用到了 19-31位中的 31位,和24-26位。看下面定义
32位区域间指针 除了字节和位地址还包含了 区域信息
24-31 位具体代表什么区域了,看下图
下面举例说明,还是用MD40 对区域间指针来解释吧,
L P#M40.0 注意是P#M40.0 不是P#40.0
T MD28 这个时候MD28值还是320 吗?当然不是!
MD28应该等于320 or 16#8300000000000000 对应的16进制数就是16#8300000000000140
这个时候 我们进行间接寻址的时候 就可以这样编写下面语句了
L D[MD28]了,其实大侠们 应该看明白了 ,32位区域间指针就是区域内指针或运算一个 数据区代码16#81-87 罢了,正常编程时,一般很少用。
最后 S7-300/400 的CPU中还有 AR1和AR2地址寄存器,使用AR1,AR2来存储指针的优点是可以在[]内进行指针的偏移运算。
加上MD28=320
L MD[MD28] 等同与 MD40,如果我们再想 对MD41进行指针化,那么需要将MD28+8 ,d但是MD[MD28+8]是非法的,但是使用AR1,AR2地址寄存器则是可以的。
L MD28
LAR1
L MD[AR1,P#1.0] 就相对于MD41了.P#1.0就是偏移地址
西门子有篇不错的文档建议大家看看
S7-300/400寻址
写的非常好,非常明白!给你点赞!
谢谢了!
请填写推广理由:
分享
只看
楼主