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、将西门子的数据位、字节、字和双字各点所在的位的关系弄清楚。