回复:请教关于指针数据

冷岭

  • 帖子

    135
  • 精华

    0
  • 被关注

    5

论坛等级:侠士

注册时间:2005-02-27

普通 普通 如何晋级?

发布于 2013-08-30 22:38:24

9楼

quote:以下是引用老学童在2013-08-30 10:59:28的发言:
冷侠,我用你的问题和youhm侠的解释做了以下仿真,希望对你的问题有所帮助:
OB1:
CALL FC 1
ADDR_POINT:=DB1.DBX10.0
RESULT :=MW30
FC1:

FUNCTION FC 1 : VOID
TITLE =
VERSION : 0.1


VAR_INPUT
ADDR_POINT : POINTER ;
END_VAR
VAR_OUTPUT
RESULT : WORD ;
END_VAR
VAR_TEMP
DB_NO : INT ;
END_VAR
BEGIN
NETWORK
TITLE =

L P##ADDR_POINT //“指向指针的指针”
LAR1
L 0
L W [AR1,P#0.0] //判断是否为DB数据块
==I
SPB _001 //RLO = 1, 跳转至_001
T #DB_NO
AUF DB [#DB_NO] //= OPN DB [#DB_NO]
_001: L D [AR1,P#2.0] //将POINTER的后4个字节(区域指针)存入地址寄存器
LAR1
L W [AR1,P#0.0] //将DB1.DBW10的值加载至累加器1
L W [AR1,P#2.0] //将DB1.DBW12的值加载至累加器1
OW //“或”操作
T #RESULT //输出操作结果

DB1:
DATA_BLOCK DB 1
TITLE =
VERSION : 0.1


STRUCT
DB_VAR1 : INT ; //Temporary placeholder variable
DB_VAR2 : WORD := W#16#3;
DB_VAR3 : WORD := W#16#4;
DB_VAR4 : WORD := W#16#5;
DB_VAR5 : WORD := W#16#6;
DB_VAR6 : WORD := W#16#7;
DB_VAR7 : WORD := W#16#8;
END_STRUCT ;
BEGIN
DB_VAR1 := 0;
DB_VAR2 := W#16#3;
DB_VAR3 := W#16#4;
DB_VAR4 := W#16#5;
DB_VAR5 := W#16#6;
DB_VAR6 := W#16#7;
DB_VAR7 := W#16#8;
END_DATA_BLOCK
经过以上仿真可以帮助理解西门子POINTER类型的应用,我觉得主要是如何理解:
1. POINTER和ANY类型的格式
2. 西门子“形参”和“实参”的区别和存储方式,尤其是V(或L)区的理解,在OB1中前20个字节被系统占用,因此,上一层程序的临时变量L区(即V区)的用户数据从V区的P#21.0开始存储,因此,在本例中ADDR_POINT存放在OB1的P#21.0开始的6个字节中,前2个字节是DB号(DB10),而后4个字节为区域地址(DBX10.0).



谢谢你的程序,看明白了!
可以十年不将军,不可一日不拱卒。
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54616条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。