回复:求助(解释该程序段,特别是W#16#1002的含义)

老学童

  • 帖子

    765
  • 精华

    32
  • 被关注

    64

论坛等级:奇侠

注册时间:2011-06-22

钻石 钻石 如何晋级?

发布于 2013-11-18 12:17:19

15楼

xibeiqingjie朋友,我不是什么“专家”,但我愿意与你在论坛上交流,可惜我这个人比较落后,哈哈,不好意思,博客、QQ、微信这些东西我都没有,为此经常遭到朋友们的嘲笑!
我相信这段程序论坛里很多人一看就明白了,我相信不久你也一眼就能看明白!
其实,你提供的这段程序是比较典型的,而且每条语句后面都有详细的英文注释,只要对间接寻址和ANY指针结构熟悉,那基本上就能看个八九不离十;
关于ANY类型的结构,S7帮助里有,论坛里也有很多关于ANY型结构的帖子,这里简单重复一下ANY类型结构:



从上图可以看出ANY类型由10个字节组成,廖老师将其主要作用归纳为:
...ANY的实参也可以是一片连续的地址区...
从中可以体会出ANY类型主要用于从一片连续的数据区到另外一片连续的数据区区的操作(传递、赋值等等),前面一片称之为源数据区,后一片称之为目标数据区,既然这样就必须在ANY型中给出以下信息:
1) 0字节, ANY类型标识,S7规定为B#16#10;
2.) 1字节,数据类型,即被操作的数据类型,例如:位、字节、字、双字等等:
十六进制代码 数据类型 描述
b#16#00 NIL 空指针
b#16#01 BOOL 位
b#16#02 BYTE 字节 (8位)
b#16#03 CHAR 字符 (8位)
b#16#04 WORD 字 (16位)
b#16#05 INT 整数(16位)
B#16#06 DWORD 双字(32位)
b#16#07 DINT 双整数(32位)
b#16#08 REAL 浮点数(32位)
b#16#09 DATE 日期
b#16#0A TIME_OF_DAY (TOD) Time of day
b#16#0B TIME Time
b#16#0C S5TIME Data type S5TIME
b#16#0E DATE_AND_TIME (DT) Date and time (64 bits)
b#16#13 STRING String
3) 2、3字节“repetition factor”,相当于被操作数据数量,即多少个数;
4) 4、5字节“DB number”中是DB的号码;
5) 6字节“Memory area”中是存储区域的编码;
十六进制代码 编码二进制值 存储区 描述
b#16#81 1000 0001 I 输入区
b#16#82 1000 0010 Q 输出区
b#16#83 1000 0011 M 位存储区
b#16#84 1000 0100 DB 数据块区
b#16#85 1000 0101 DI 背景数据块区
b#16#86 1000 0110 L 本地数据区
b#16#87 1000 0111 V 前一个功能的本地数据区
6) 7字节的2~0位+8字节的7~0位+9字节的7~3位是区域指针的字节地址;
7) 9字节的2~0位是区域指针的位地址;
如果以上内容你全部明白,程序就不难理解:
程序作用: 构建到驱动输出的指针
OPN #iDriveIntfcDB //打开 #iDriveIntfcDB变量(DB号)数据块(驱动接口)
L DBNO //DBNO?应该是‘#DBNO’,DB号
T #tDriveIntfcDBNum //保存至变量#tDriveIntfcDBNum
LAR1 P##tOutputsPointer //将输出指针地址存入地址寄存器AR1
从此以下这部分是构建ANY型数据源指针:
L B#16#10 //B#16#10是上述S7ANY型标识
T LB [AR1,P#0.0] //存入L区AR1地址(数据源指针)的0字节

L B#16#2 //B#16#2 = 被操作数据类型为字节
T LB [AR1,P#1.0] // 存入L区AR1地址(数据源指针)的1字节

L 24 //传递数据数量
T LW [AR1,P#2.0] // 存入L区AR1地址(数据源指针)的2、3字节

L #tDriveIntfcDBNum //DB号
T LW [AR1,P#4.0] // 存入L区AR1地址(数据源指针)的4、5字节

L 172 //数据区起始地址172 = 2#10101100
SLD 3 //左移3位得到区域指针P#172.0 = 2#10101100000
T LD [AR1,P#6.0] // 存入L区AR1地址(数据源指针)的6~9字节

L B#16#84 //B#16#84 = DB数据区
T LB [AR1,P#6.0] // 存入L区AR1地址(数据源指针)的6字节

//从驱动接口的DB将数据传递至S7内#tDriveIntfc.Output指针指向的DB数据区
CALL SFC 20 //用于传递数据的系统标准功能
SRCBLK :=#tOutputsPointer //数据源ANY型指针
RET_VAL:=#tRet //返回值(SFC执行错误代码)
DSTBLK :=#tDriveIntfc.Output //目标数据区ANY型指针

其它程序均类似,你可以参照ANY型逐一对照领会其要领。
学习体会:
ANY类型是西门子打造的一种特殊数据类型,与POINTER相比,我将其比作‘航母’型指针,它将各种信息(数据类型、被操作的数据数量、DB号、存储区标识和区域指针)打成一个数据包赋值给块的ANY型形参;
ANY类型的优点:
1. 不用ANY类型块需要多个接口才能完成的实参赋值给形参,用ANY类型仅用一个接口就完成了;
2. 实参赋值给形参时,实参表达式变得结构紧凑并且概念清晰,从而大大降低了编程的错误机率,例如:P#DB1.DBX0.0 INT 50
仔细观察会发现, 前面程序中所构建的ANY型的各个部分包含了‘P#DB1.DBX0.0 INT 50’的所有信息。
人的生命似洪水在奔流,不遇着岛屿、暗礁,难以激起美丽的浪花。
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54616条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

  • 分享

  • 只看
    楼主

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