Logo  
企业邮局QQ快速登录
浏览文档 当前位置:广州若恒 >> 支持中心 >> 找答案 >> 浏览文档
ANY指针的使用 的问题
ANY指针的使用 的问题
核心提示:示例:ANY指针的使用。编写一个计算功能的函数,输入参数“In_Data”为一个数组变量,如果数组元素为浮点数,输出所有元素的平均值“OUT_VAL”,如果数组元素为其他数据类型,不执行计算功能。OB1中调用函数的程序如下:CALL   FC13In_Data:=P#DB1.DBX0.0 REAL 8OUT_VAL:=MD20完成的计算功能相当于MD20=(DB1.DBD0+..+..+DB1.DBD28)/8

示例:ANY指针的使用。
编写一个计算功能的函数,输入参数“In_Data”为一个数组变量,如果数组元素为浮点数,输出所有元素的平均值“OUT_VAL”,如果数组元素为其他数据类型,不执行计算功能。OB1中调用函数的程序如下:
CALL   FC13
In_Data:=P#DB1.DBX0.0 REAL 8
OUT_VAL:=MD20

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

IN       In_Data       ANY    
OUT     OUT_VAL     REAL
TEMP    DATA_LEN    INT     0.0
TEMP    BLOCK_NO   INT      2.0
TEMP    ADD_TEMP    REAL    4.0
TEMP    DATA_NO     INT      8.0


FC13中的示例程序如下:

L       0    //初始化临时变量#ADD_TEMP
T       #ADD_TEMP

L       P##In_Data   //指向存储地址指针In_Data首地址,并装载到地址存储器AR1中
LAR1
L    B[AR1,P#1.0]   //如果数据类型不是REAL,跳转到END    注1
L    B#16#8
<>D
JC   END


L     0
L     W[AR1,P#4.0]  //判断OB1中赋值的地址指针是否为数据块
=I
JC   M1
T    #BLOCK_NO
OPN  DB[#BLOCK_NO]   //如果是DB块,打开指定的DB块


M1: L   W[AR1,P#2.0]  //判断ANY指针中的数据长度,本例中为REAL变量的个数
T   #DATA_LEN
L   D[AR1,P#6.0]  //找出需要计算数据区的开始地址,本例中为DB1.DBX0.0

LAR1
L#DATA_LEN
NO: T    #DATA_NO  //循环执行加指令运算,本例中循环执行的次数为8
L    D[AR1,P#0.0] //装载DB1.DBD0到累加器1中    注3
L    #ADD_TEMP  //与临时变量#ADD_TEMP相加后,将计算结果再存储到#ADD_TEMP中
+R
T    #ADD_TEMP
+AR1 P#4.0     //地址寄存器加4,地址偏移量     注2
L    #DATA_NO  //LOOP指令固定格式
LOOP   NO


L   #ADD_TEMP   //求平均值
L   #DATA_LEN
DTR    //将变量个数转变为浮点值
/R
T  #OUT_VAL   //输出运算结果

END:  NOP  0

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

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

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


 

最佳答案

注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:如果读懂了这个结构,就知道L    D[AR1,P#0.0] //装载DB1.DBD0到累加器1中是对的,因为在前面还执行了一次L   D[AR1,P#6.0] 
                                 LAR1
执行后,就相当于将DBD0地址装入到地址寄存器AR1中了

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

更多


Tags:ANY指针的使用 的问题

0% (0)
0% (10)
相关文档
发表评论
用户评论
 以下是对 [ANY指针的使用 的问题] 的评论,总共:0条评论
最新文档
·S7-200 PID 手写程序与利用自带模 
·AC0做求和校验,循环时如何确定求 
·起重机用西门子变频电机悬停 
·DI回路电流计算 
·一个触摸屏接三个PLC,是否可行? 
推荐文档
视觉焦点
S7-200 PID 手写程序与利用自带模块、向导生成PID方法的区别
AC0做求和校验,循环时如何确定求和是否正确   求解释,麻烦各位师傅了
  2880306702
  sales@gzrh.com   在线发送
微信扫一扫
  技术支持
  技术论坛
  Support@gzrh.com   在线发送
  项目洽谈
  Support@gzrh.com   在线发送
  投诉与建议
  gzrh@gzrh.com   在线发送
  订阅精彩内容
  填写您的邮件地址,订阅我们的精彩内容:
  联系我们
销售热线:020-85520027/85520287
项目洽谈:020-85533142/85533145
联系传真:020-85520030/85536394
技术热线:020-61087040
咨询邮箱:gzrh@gzrh.com
公司地址:广州市天河区黄埔大道中662号金融城绿地中心509室