技成培训网 技成学习APP 技成工具箱 技成企业服务

欢迎回到技成培训网

技成培训网

电工题库宝典

技成电工课堂

PLC练习题

技成PLC课堂

变频器故障查询

技成PLC学吧

伺服驱动故障查询

技成PLC网校

当前位置:技成首页 > 文章中心 > 技成百科 > any指针的使用的问题

any指针的使用的问题

郑志武 发布于2013-02-28 23:22 4 0 标签:

示例:any指针的使用。
编写一个计算功能的函数,输入参数“in_data”为一个数组变量,如果数组元素为浮点数,输出所有元素的平均值“out_val”,如果数组元素为其他数据类型,不执行计算功能。ob1中调用函数的程序如下:
callfc13
in_data:=p#db1.dbx0.0real8
out_val:=md20

完成的计算功能相当于md20=(db1.dbd0+..+..+db1.dbd28)/8。在函数(fc13)的接口参数中定义输入,输出变量及临时变量见表

inin_dataany
outout_valreal
tempdata_lenint0.0
tempblock_noint2.0
tempadd_tempreal4.0
tempdata_noint8.0


fc13中的示例程序如下:

l0//初始化临时变量#add_temp
t#add_temp

lp##in_data//指向存储地址指针in_data首地址,并装载到地址存储器ar1中
lar1
lb[ar1,p#1.0]//如果数据类型不是real,跳转到end注1
lb#16#8
<>d
jcend


l0
lw[ar1,p#4.0]//判断ob1中赋值的地址指针是否为数据块
=i
jcm1
t#block_no
opndb[#block_no]//如果是db块,打开指定的db块


m1:lw[ar1,p#2.0]//判断any指针中的数据长度,本例中为real变量的个数
t#data_len
ld[ar1,p#6.0]//找出需要计算数据区的开始地址,本例中为db1.dbx0.0

lar1
l#data_len
no:t#data_no//循环执行加指令运算,本例中循环执行的次数为8
ld[ar1,p#0.0]//装载db1.dbd0到累加器1中注3
l#add_temp//与临时变量#add_temp相加后,将计算结果再存储到#add_temp中
+r
t#add_temp
+ar1p#4.0//地址寄存器加4,地址偏移量注2
l#data_no//loop指令固定格式
loopno


l#add_temp//求平均值
l#data_len
dtr//将变量个数转变为浮点值
/r
t#out_val//输出运算结果

end:nop0

问题:
注1:我认为此处应该为[ar1,p#0.0],根据下图得知,b0应为数据类型,8为32位浮点,应该与其进行比较

注2:db1的声明视图是不是如下图所示,否则就不能解释为何+4.0了

注3:这里注释应该为装载db1.dbd6到累加器1中


图片说明: 1,数据长度 2,db1的声明视图格式

佳答案

注1:[ar1,p#0.0]是默认的10h,就是保留的那个。8为32为浮点数,比较应该是<>r;这是西门子的数据格式高位在前,低位在后。也就是mb0为第0-7位,而mw0中mb0和mb1分别占8—15和0—7,是反的。
注2:db1的声明视图格式不是这样的,还是从dbd0开始,而程序在调用fc13时,会自动开一个10字节的l区域,来存储调用的any指针信息,也就是如果从l20.0开始,则lb20=10,lb21=08(数据类型),lw22=8(数据长度,也就是+2.0),lw24=1(数据块块号,也就是+4.0),ld26=dbd0(数据块的起始地址,也就是+6.0),然后再通过这个临时变量找到db块中的实际值。
注3:如果读懂了这个结构,就知道ld[ar1,p#0.0]//装载db1.dbd0到累加器1中是对的,因为在前面还执行了一次ld[ar1,p#6.0]
lar1
执行后,就相当于将dbd0地址装入到地址寄存器ar1中了

看来你需要1、将any指针的数据结构弄清楚;
2、将西门子的数据位、字节、字和双字各点所在的位的关系弄清楚。

若有收获,就点个赞吧!

文章来源于网络及文献如有侵权请联系站长
分享到:

微信扫一扫分享

阅读与本文标签相同的文章

相关推荐

最新文章 热门文章
最新课程 免费课程
PLC资料下载 电工电气资料下载
应用新秀
变频器故障代码查询APP
伺服故障代码查询APP
技成
手机APP
热门标签