如何设置带有"any"或"pointer"数据类型的功能块
答案:1 悬赏:80 手机版
解决时间 2021-11-18 20:59
- 提问者网友:献世佛
- 2021-11-17 21:28
如何设置带有"any"或"pointer"数据类型的功能块
最佳答案
- 五星知识达人网友:有你哪都是故乡
- 2021-11-17 22:35
step7的帮助文件是这样说的:
ANY:5字
ANY引用实例 P#M50.0 BYTE 10
区域 = M (存储区位)
起始位 = 50.0
数据类型 = BYTE
数据类型单元数 = 10
此实例将数据区域MB50定义为MB59。
注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只能指定纯粹的数值,如上面例子中的★。
ANY:5字
ANY引用实例 P#M50.0 BYTE 10
区域 = M (存储区位)
起始位 = 50.0
数据类型 = BYTE
数据类型单元数 = 10
此实例将数据区域MB50定义为MB59。
注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只能指定纯粹的数值,如上面例子中的★。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯