找答案的高端用户(找答案钻石及双钻级别的用户)将尽可能从此问题下的所有回
答中,为您推荐最佳答案。届时您可以根据推荐数采纳答案。
如果自提问时间起7天内您仍无法选出最佳答案,您可以选择“无满意答案”关闭此问题。
sld 3,就是左移3位,4的二进制100左移3位是100000,对于32位指针而言,第0位到第2位表示寻址的位,第3位到第18位表示寻址的字节。100000前面的100是字节后面的000是位,明白了吗。
同样的道理320转成指针就是40.0
注1:在使用ANY指针指向目标区域时,只允许BYTE或WORD型的目标区域
注2:某些型号PLC的一些指令只允许byte,比如s7-400中使用SFB12——“BSEND”,SD_I参数只能是byte类型,输入word类型在编程时不会报错误,程序执行时会出错。
以上说明ANY型数据是一种指针,它的信息很丰富,有区域、区域内地址、数据类型,还有POINTER类型所没有的长度。可以通过解析any型指针,即指针的指针来实现更加强大的功能。比如,编一个求和功能块。
pointer参考<详解西门子间接寻址>如下:
P#中的P是Pointer,是个32位的直接指针。所谓的直接,是指P#中的#后面所跟的数值或者存储单元,是P直接给定的。这样P#XXX这种指针,就可以被用来在指令寻址中,作为一个“常数”来对待,这个“常数”可以包含或不包含存储区域。例如:
● L P#Q1.0 //把Q1.0这个指针存入ACC1,此时ACC1的内容=82000008(hex)=Q1.0
★ L P#1.0 //把1.0这个指针存入ACC1,此时ACC1的内容=00000008(hex)=1.0
● L P#MB100 //错误!必须按照byte.bit结构给定指针。
● L P#M100.0 //把M100.0这个指针存入ACC1,此时ACC1的内容=83000320(hex)=M100.0
● L P#DB100.DBX26.4 //错误!DBX已经提供了存储区域,不能重复指定。
● L P#DBX26.4 //把DBX26.4这个指针存入ACC1,此时ACC1的内容=840000D4(hex)=DBX26.4
我们发现,当对P#只是指定数值时,累加器中的值和区域内寻址指针规定的格式相同(也和存储器间接寻址双字指针格式相同);而当对P#指定带有存储区域时,累加器中的内容和区域间寻址指针内容完全相同。事实上,把什么样的值传给AR,就决定了是以什么样的方式来进行寄存器间接寻址。在实际应用中,我们正是利用P#的这种特点,根据不同的需要,指定P#指针,然后,再传递给AR,以确定最终的寻址方式。
在寄存器寻址中,P#XXX作为寄存器AR指针的偏移量,用来和AR指针进行相加运算,运算的结果,才是指令真正要操作的确切地址数值单元!
无论是区域内还是区域间寻址,地址所在的存储区域都有了指定,因此,这里的P#XXX只能指定纯粹的数值,如上面例子中的★。
http://www.ad.siemens.com.cn/service/answer/solution.asp?Q_id=21572&cid=1029
顺便附上资料一份!
详解西门子间接寻址
http://group.ednchina.com/225/1328.aspx
关于S7-300和S7-400指针寻址的说明与例程(更新版)
http://www.ad.siemens.com.cn/download/searchResult.aspx?searchText=F0215
http://www.gkbk.com/more.asp?name=fanxt&id=46684
http://www.jdzj.com/PLC/article/2009-8-14/9924-1.htm
希望我的回答能够帮助到你!
首次回答问题,获得
双倍西币积分!
立即成为技术知识分享的一员!
找答案微信小程序
提问
搜索
欢迎您访问支持中心!
丰富的视频,全方位的文档,大量的网友交流精华……
为了更好的完善这些内容,我们诚邀您在浏览结束后,花20秒左右的时间,完成一个用户在线调查!
感谢您的支持!