欢迎来到天天文库
浏览记录
ID:21700797
大小:25.50 KB
页数:5页
时间:2018-10-24
《any指针的使用的问题》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、any指针的使用的问题any指针的使用的问题 示例:any指针的使用。 编写一个计算功能的函数,输入参数“in_data”为一个数组变量,如果数组元素为浮点数,输出所有元素的平均值“out_val”,如果数组元素为其他数据类型,不执行计算功能。ob1中调用函数的程序如下: callfc13 in_data:=p#db1.dbx0.0real8 out_val:=md20 完成的计算功能相当于md20=(db1.dbd0+..+..+db1.dbd28)/8。在函数(fc13)的接口参数中定义输入,输出变量及临时变量见表 inin
2、_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 l
3、w[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]//装载db
4、1.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为3
5、2位浮点,应该与其进行比较 注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时,会自动开一个
6、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
7、、将any指针的数据结构弄清楚; 2、将西门子的数据位、字节、字和双字各点所在的位的关系弄清楚。
此文档下载收益归作者所有