技术论坛

应用探讨——西门子指针编程使用探讨

作者 主题
总坛主
西门子官方工程师

经验值: 23712
发帖数: 3792
精华帖: 8
主题:应用探讨——西门子指针编程使用探讨


只看楼主 只看精华 楼主 2011-11-29 10:05:34
在对“Step7 各种编程语言对比及使用”进行一番深入探讨后,可能有的网友对指针编程还不太了解,下面我们就与大家再探讨一下“西门子指针编程使用”。
一个功能强大,自由性高的程序,很大部分体现在其灵活的指针运用上,通过西门子STL的指针编程可以实现很多复杂的任务,但是指针在使用上还是需要注意一些事情的,比如地址寄存器的内容被接口参数覆盖,多重背景FB的地址指针偏移,指针的指针(P##input_any)如何使用等,如何读懂指针程序,如何用好指针,如何避免指针程序出错需要工程师去注意。关于具体指针的介绍,大家可以参照下载中心的编程手册:
1、编号:F0215,S7?300和S7?400寻址
2、手册 "SIMATIC Programming with STEP 7 V5.5" 05/2010 第27.3.4章 参数类型
3、编号:1008,用于S7-300 和S7-400 的语句表(STL)编程
开设此话题,欢迎大家可以就以下几个点畅所欲言,发表自己的看法,共同提高。
1、阐述自己使用的指针的感受、分享经验及心得;
2、如何使用指针,以缩短程序开发周期,提高编程效率;
3、如何避免指针编程出错;
4、通用的指针编程的思路等等内容;

此次集中交流将持续至12月22日,其中所有精华帖作者将获得加倍精华奖励积分;最终所有有效留帖的网友将获得加倍发帖积分。更多积分带给您更多奖品兑换的自由。
对于有突出发言贡献的网友,还可以在当前的可兑换奖品中免费挑选200分(含)以下任一款奖品。
交流结束后也将专门整理重要内容,供广大网友分享参考。
预祝大家交流愉快,收获丰富!
 
以下网友喜欢您的帖子:

  
重要声明:

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

帖子链接:https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=936225&b_id=4&s_id=0&num=142

官方工程师
西门子官方工程师

经验值: 5578
发帖数: 387
精华帖: 52
回复:应用探讨——西门子指针编程使用探讨


只看楼主 只看精华 1楼 2011-11-29 10:41:34
曾经第一次独立做个大项目,个人认为,六辊可逆冷轧机,以前自己使用LAD,但是总觉得屏幕太小,因为程序块面积太大,不能一view就是全部所需的,后来改用STL,从此爱上STL,方便,有时大家说LAD的逻辑编程很有优势,我觉得不是,STL的逻辑编程更有优势,A O 用的不亦乐乎,真的很方便,想怎么变就怎么变,不想LAD真的很麻烦,尤其是改程序。编卷径计算时,由于使用背景DB,于是需要使用指针才能进行下去,于是自己查找网上的例程,经过测试一切OK,当时使用TAR2的指令,具体的程序也不是很多,不过起了很大的作用,程序工整,易读。
我想指针对于算法和程序调用起到很大的作用,如果你的工艺程序与上述有关,那么首选应使用STL和指针,这样才能编写短小精悍的程序,并且可以发挥更大的效能。
如果大家有机会接触老外的程序,你会发现经常都是STL,经常都是指针,其实除了上述的两个目的,还有一个目的就是程序可以通用,适合各种生产的工况,原因在于使用了功能强大的指针。
读万卷书 行万里路
以下网友喜欢您的帖子:

  
侠圣

经验值: 2253
发帖数: 119
精华帖: 0
回复:应用探讨——西门子指针编程使用探讨


只看楼主 只看精华 2楼 2011-11-29 12:23:49
阅读德国人的程序心得如下:
1、模板的输入,输出信号用STL;
2、要实现的算法功能,用标准的FB,FC(这些标准的FB,FC大多用STL,有的用SCL实现);
3、对于设备控制要求相同,可重复使用功能块,通过指针指向不同的实参,就能实现同样的控制功能。
所以使用指针获取操作数更灵活,要求循环使用的控制任务更方便;
知其道,用其妙
以下网友喜欢您的帖子:

  
侠圣

经验值: 4835
发帖数: 2050
精华帖: 22
回复:应用探讨——西门子指针编程使用探讨


只看楼主 只看精华 3楼 2011-11-29 14:11:16
指针应用到批量数据处理中非常有优势,比如应用到过程控制系统中对AI数据处理。
一般的过程控制系统AI点数由几十、几百到几千个不等,而对这些AI数据处理一般包括采样、滤波、标定、报警处理等环节,如果单个AI数据进行处理就显得十分不易,但借助指针处理就相当easy。
例如:
第一步,建立数据块;
分别建立DB1(采样数据)、DB2(滤波数据)、DB3(量程及标定数据)、DB4(报警数据)。
第二步,编写代码<充分利用指针>;
FC1(采样程序)、FC2(滤波程序)、FC3(标定程序)、FC4(报警程序)
第三步,在OB1中调用
Call FC1 //采样
Call FC2 //滤波
Call FC3 //标定
Call FC4 //报警
……其它程序
<使用指针可以将FB或者FC封装得更完美>
No discussion, no outcome.
以下网友喜欢您的帖子:

  
侠圣

经验值: 4835
发帖数: 2050
精华帖: 22
回复:应用探讨——西门子指针编程使用探讨


只看楼主 只看精华 4楼 2011-11-29 14:37:44
S7-300/400中的指针主要用于间接寻址方式,指针的类型包括16位指针、32位指针、Pointer指针(6Byte)和Any指针(10Byte)。
16位指针用于定时器、计数器、程序块的寻址;
32位指针用于I/Q/M/L/数据块等存储器中位、字节、字以及双字的寻址,其中第0~2位表示位地址(0~7)、第3~18位为字节地址,其余位未定义;
Pointer指针和Any指针一般应用在符合数据类型(比如Date_and_Time/Array/String等)在FB、FC之间的传递。而Any指针可以看做是对Pointer指针的延伸,因为由10Byte组成的Any指针中Byte4~Byte9就是一个Pointer指针。
PS:张工(张春)在《西门子STEP7编程语言与使用技巧》中提到“在用户程序编写的过程中,指针的使用和间接寻址方式是一对孪生兄弟,总是相伴相随”。
No discussion, no outcome.
以下网友喜欢您的帖子:

  
侠圣

经验值: 3980
发帖数: 577
精华帖: 18
回复:应用探讨——西门子指针编程使用探讨


只看楼主 只看精华 5楼 2011-11-29 15:38:12
建议:对于指针的基础知识,网上这方面的资料太丰富了,我认为这里就不要再赘述了,大家还是结合自己的应用实际谈谈用了指针编程到底带来了什么样的便利吧
业精于勤,行成于思
以下网友喜欢您的帖子:

  
至圣

经验值: 13053
发帖数: 4961
精华帖: 81
回复:应用探讨——西门子指针编程使用探讨


只看楼主 只看精华 6楼 2011-11-29 15:42:25
S 7-300/400PLC中指针是个很关键的东西,了解和掌握指针的使用是必要的
比如有朋友遇到,在功能块的参数明明显示的是一个指针,但改一下就出错了,如SFC 1的CDT参数,这个参数要求的类型是DATE_TIME,但实际上传的程序实参因为没有符号表而显示为指针类型的数据,实际上功能访问复杂数据类型都是靠指针来实现的。
关于Any类型,很多朋友对称之为指针,我觉得不太合适,指针只是指向一个地址,并不包含区域的大小,而Any类型则是包含区域大小的。
这里顺便提一下《西门子STEP7编程语言与使用技巧》里的一点笔误,第8页
TAR1 AR2 :将AR1存储的地址指针传输给ACCU2 (ACCU2应为AR2)
语句表帮助里是这样的
格式
TAR1 AR2
描述
TAR1 AR2(带有地址AR2的指令TAR1)将地址寄存器AR1的内容传送给地址寄存器AR2。
ACCU 1和ACCU 2保持不变。执行该指令时不考虑状态位,也不会影响状态位。

在一些间接寻址的资料里也看到这个错误
 
以下网友喜欢您的帖子:

  
侠圣

经验值: 3980
发帖数: 577
精华帖: 18
回复:应用探讨——西门子指针编程使用探讨


只看楼主 只看精华 7楼 2011-11-29 15:57:16
多重背景FB里变量寻址
楼上有朋友说了多重背景FB里变量寻址的问题,如何得到多重背景FB中的变量在背景DB里的绝对偏移量呢?
可以用下面的方法处理:
TAR2 (得到多重背景FB在背景DB里的偏移地址)
AD DW#16#00FFFFFF (屏蔽掉存储区ID,可参考32位指针格式)
L P##Variable (得到变量在多重背景FB里的地址)
+D (多重背景FB的偏移地址与变量在多重背景FB里地址相加,即得到实际绝对偏移量)
LAR1
上述语句就是就得到了变量在背景DB中的绝对偏移量,从而供后续程序处理。
关于这个问题的讨论,还可以参考下帖:
http://www.ad.siemens.com.cn/club/bbs/post.aspx?b_id=4&a_id=931141&s_id=23&num=20#anch
业精于勤,行成于思
以下网友喜欢您的帖子:

  
至圣

经验值: 18406
发帖数: 6291
精华帖: 137
回复:应用探讨——西门子指针编程使用探讨
精华帖精华帖星级3级


只看楼主 只看精华 9楼 2011-11-29 20:49:07
戏说存储器间接寻址
在指令中直接给出操作数(常数),称为立即寻址。在指令中给出操作数的地址(例如M5.2),称为直接寻址。
间接寻址在指令中给出的不是操作数的值或操作数的地址,而是给出一个被称为地址指针的存储单元的地址,地址指针里存放的是真正的操作数的地址。
地址指针就像收音机调台的指针,改变指针的位置,指针指向不同的电台。改变地址指针中的地址值,地址指针“指向”不同的地址。
再打一个比喻,邮递员的摩托车就好像一个地址指针。邮递员根据信封上的地址,将摩托车开到用户A的家门口,这个时候指针(摩托车)指向了这个地址,把信送给用户A,就好像将数据写入这个地址。送下一封信的时候,相当于修改了地址指针中的值,摩托车开到下一个用户的门口,地址指针指向了另外一个地址。
我们入住酒店的时候,在前台办完入住手续,酒店就会给我们一个房卡,房卡上面有房号,旅客根据房号使用宾馆的房间,每天每间房间可能住不同的旅客。在这里房卡就是指针,房间就是存储单元,旅客就是存储单元中存放的数据。
为什么需要间接寻址?间接寻址用来在程序运行期间,通过改变指针中地址的值,动态地修改指令中的地址。间接寻址常用于循环程序和查表程序。例如循环程序用来累加一片连续的存储区中的数值,每次循环累加一个数值。累加后修改地址指针的值,使它指向下一个存储单元,为下一次循环的累加运算做好准备。没有间接寻址,就不能编写循环程序。
追求完美
以下网友喜欢您的帖子:

  
H.L
侠圣

经验值: 2886
发帖数: 1774
精华帖: 9
回复:应用探讨——西门子指针编程使用探讨


只看楼主 只看精华 10楼 2011-11-29 21:34:43
指针编程在通讯程序中也很有优势,如下面这段S7-200的自由口程序。不难看出,只要将指针(VD181)指向VB100,之后的数据就会自动存入VB101、VB102...,要改变的就是指针+1.
中断
Network1
LDB= SMB2, 16#50
MOVD &VB100, VD181 //装载地址指针
Network2
//字符放入接收缓冲区
LD SM0.0
MOVB SMB2, *VD181
INCD VD181
INCW VW150
Network3
LDB= SMB2, 16#0D //当接收的字符是回车时
MOVD &VB100, VD181 //重新装载地址指针
R M2.6, 1 //如果能正确接收,则跳出异常处理
R T36, 1
S M2.0, 1 //置处理程序标志位
MOVW 0, VW150
Network4
LDW>= VW150, 30 //接收最大字符数
MOVD &VB100, VD181 //重新装载地址指针
 
以下网友喜欢您的帖子:

  
至圣

经验值: 18406
发帖数: 6291
精华帖: 137
回复:应用探讨——西门子指针编程使用探讨


只看楼主 只看精华 11楼 2011-11-30 09:42:58
对于间接寻址,想了几句口诀:
间接寻址好辨认,操作数带方括号。
括号里面是指针,地址藏在指针里。
追求完美
以下网友喜欢您的帖子:

  
侠圣

经验值: 3980
发帖数: 577
精华帖: 18
回复:应用探讨——西门子指针编程使用探讨


只看楼主 只看精华 12楼 2011-11-30 10:18:50
廖老师,不押韵啊,呵呵
间接寻址不深奥,操作数带方括号
括号怀里抱指针,指针遥指地址身
业精于勤,行成于思
以下网友喜欢您的帖子:

  
侠圣

经验值: 4835
发帖数: 2050
精华帖: 22
回复:应用探讨——西门子指针编程使用探讨


只看楼主 只看精华 13楼 2011-11-30 11:35:26
<转自剑思庭——“白话工业控制控的指针”一文>
所谓的指针,是一种为了方便对存储空间直接访问而提供一种语言机制,这就好比大家生活中去旅游时去住宾馆,如果想要住宾馆,在前台办完入住手续后,宾馆就会提供一个房卡上边会有房号,房客根据房号使用宾馆房间。而且每天每间房间房客可能都不一样。在这里房卡就是指针、房间就是内存空间、房客就是内存中存放数据、前台就是指针管理和访问。同样,在内存空间是由顺序排列的以字节为存储单位,将这些存储单元从0开始顺序编号,就构成每个存储单元的地址。每个数据都存放从某个特定的地址开始若干个单元中,这个特定的地址就被认定为该数据的存储地址,对数据存取是通过这个地址来实现。而存储地址也被作为一种数据对象来进行操作,通过加1减1操作可以对存储空间中的数据快速访问。
网络链接:http://blog.gkong.com/more.asp?name=jiansiting&id=145080
No discussion, no outcome.
以下网友喜欢您的帖子:

  
至圣

经验值: 18406
发帖数: 6291
精华帖: 137
回复:应用探讨——西门子指针编程使用探讨


只看楼主 只看精华 14楼 2011-11-30 11:41:07
quote:以下是引用火麒麟在2011-11-30 10:18:50的发言:
廖老师,不押韵啊,呵呵
间接寻址不深奥,操作数带方括号
括号怀里抱指针,指针遥指地址身

我一直为不押韵苦恼,改得好,有诗意,佩服!
追求完美
以下网友喜欢您的帖子:

  
侠圣

经验值: 3980
发帖数: 577
精华帖: 18
回复:应用探讨——西门子指针编程使用探讨


只看楼主 只看精华 15楼 2011-11-30 11:58:43
FB里IN_OUT参数为复杂数据类型时寻址
STE7 V5.5编程手册第27.3.4.8节: FB的IN_OUT参数
当FB的IN_OUT参数为复杂数据类型时,比如ARRAY、STRUCT、UDT等,实际传送的是变量的地址,由6字节的Pointer类型来表示:
如下图,FB2中有2个IN_OUT变量,FB2的背景数据块为DB5



现在打开背景数据块DB5,如下图:



我们可以看到,在背景数据块中,ARRAY类型的变量是用6个字节的POINTER指针形式来表示的,这与基本数据类型不同,所以如果试图在程序中对其赋值,肯定是错误的
现在我们在OB1中调用FB2,并赋给实际地址:





运行仿真后,我们在变量表中观察背景数据块中DB5中的地址



可以清晰的看到其中所存的地址和DB块号信息,从而在程序中可以这么处理:



如果是在多重背景FB里编写程序,只需要在头一句后加上下面2句即可:
TAR2
+AR1
业精于勤,行成于思
以下网友喜欢您的帖子:

  
侠客

经验值: 925
发帖数: 425
精华帖: 3
回复:应用探讨——西门子指针编程使用探讨


只看楼主 只看精华 16楼 2011-11-30 12:01:51
如果要编写通用的程序,并且程序的输入或者输出是指针格式(pointer或者any)就需要使用
P##input(pointer /any),我觉得这个应用很能体现指针的强大,就是对指针所在的地址进行指针寻址:

L P##Input //指向存储地址指针Input首地址,并
LAR1 //装载到地址寄存器AR1中。
L W [AR1,P#4.0] //打开DB块
T #BLOCK_NO
OPN DB [#BLOCK_NO] //如果是DB块,打开指定的DB块。
L W [AR1,P#2.0] //判断ANY指针中数据长度
_001:T #DATA_LEN //通常此处做loop循环!!
L D [AR1,P#6.0] //找出需要计算数据区的开始地址
// do you job here....



因此,需要把any或者pointer的地址结构做必要的了解,这是正确使用其功能的前提。
手册 "SIMATIC Programming with STEP 7 V5.5" 05/2010 第27.3.4章 参数类型中有。。。
 
以下网友喜欢您的帖子:

  
侠圣

经验值: 4835
发帖数: 2050
精华帖: 22
回复:应用探讨——西门子指针编程使用探讨


只看楼主 只看精华 17楼 2011-11-30 13:20:03
使用指针时的注意事项(一) 重视某些寻址指令引起指针内容改变对程序的影响。
比如如下指令:
L P#0.0
LAR1
L 20
next: T LW 20
OPN DB 1 //DB寄存器的地址为1
L DBD [AR1,P#0.0]
L DBD [AR1,P#4.0]
+R
T LD 22
A DB10.DBX 0.0 //DB寄存器的地址变为10
JC _001
OPN DB 2
L LD 22
T DBD [AR1,P#8.0]
JU _002
_001: L LD 22
T DBD [AR1,P#12.0]
_002: NOP 0
+AR1 P#16.0
L LW 20
LOOP next
程序设计的目的能实现,根据DB10.DBX0.0的状态将DB1.DBD[X]+DB1.DBD[X+4]结果赋给DB1.DBD[X+8]或者DB1.DBD[X+12];但是很明显不能实现了,原因就是DB寄存器内容发生了变化,DB寄存器就是一个16位指针。
一篇名为“详解西门子间接寻址”的帖子,初学者可以多参考。链接http://www.ad.siemens.com.cn/club/bbs/post.aspx?b_id=4&a_id=333582&s_id=0&num=0
No discussion, no outcome.
以下网友喜欢您的帖子:

  
侠圣

经验值: 4835
发帖数: 2050
精华帖: 22
回复:应用探讨——西门子指针编程使用探讨


只看楼主 只看精华 18楼 2011-11-30 14:23:51
使用指针时的注意事项(二) 进行程序设计,任何时候都要注意对变量进行赋初值,指针也不例外,尤其注意对指针的保护
一种常见的地址寄存器(指针)的保护措施如下:
在FC中第一个网络里代码
TAR1 #dwSAVE_Ar1 //AR1—>#dwSAVE_Ar1
TAR2 #dwSAVE_AR2 //AR2—>#dwSAVE_AR2
在最后一个网络里代码
LAR1 #dwSAVE_Ar1 // #dwSAVE_AR1—> AR1
LAR2 #dwSAVE_AR2 //#dwSAVE_AR2——>AR2
建议:OB中不宜使用影响地址寄存器内容变化的指令,最好将带指针的循环操作放在FC中,FB是功能模块,不建议在FB中使用AR2(或者是不建议使用指针)。
添加两个有关AR1和AR2的帖子:
1、http://www.ad.siemens.com.cn/club/bbs/post.aspx?b_id=4&a_id=899196&s_id=0&num=18#anch;
2、http://www.ad.siemens.com.cn/club/bbs/post.aspx?b_id=4&a_id=905660&s_id=23&num=20#anch
No discussion, no outcome.
以下网友喜欢您的帖子:

  
至圣

经验值: 13053
发帖数: 4961
精华帖: 81
回复:应用探讨——西门子指针编程使用探讨


只看楼主 只看精华 19楼 2011-11-30 15:09:14
quote:以下是引用划痕在2011-11-30 14:23:51的发言:
使用指针时的注意事项(二) 进行程序设计,任何时候都要注意对变量进行赋初值,指针也不例外,尤其注意对指针的保护
一种常见的地址寄存器(指针)的保护措施如下:
在FC中第一个网络里代码
AR1 #dwSAVE_Ar1 //AR1—>#dwSAVE_Ar1
TAR2 #dwSAVE_AR2 //AR2—>#dwSAVE_AR2
在最后一个网络里代码
LAR1 #dwSAVE_Ar1 // #dwSAVE_AR1—> AR1
LAR2 #dwSAVE_AR2 //#dwSAVE_AR2——>AR2
建议:OB中不宜使用影响地址寄存器内容变化的指令,最好将带指针的循环操作放在FC中,FB是功能模块,不建议在FB中使用AR2(或者是不建议使用指针)。
添加两个有关AR1和AR2的帖子:
1、http://www.ad.siemens.com.cn/club/bbs/post.aspx?b_id=4&a_id=899196&s_id=0&num=18#anch;
2、http://www.ad.siemens.com.cn/club/bbs/post.aspx?b_id=4&a_id=905660&s_id=23&num=20#anch

关于这个,技术支持的帖子里说的很清楚了
http://www.ad.siemens.com.cn/club/bbs/post.aspx?b_id=4&a_id=758363
不同系列的PLC可能因允许堆栈空间的不同,有的调用FC会自动保存和恢复DB寄存器和地址寄存器,有的又不能,所以推荐自己进行保存和恢复。

指针间接寻址中经常用到两个地址寄存器和DB寄存器,所以影响到地址寄存器和DB寄存器的情况都要注意了
17楼划痕大侠提到了完整引用DB块数据会改变DB寄存器的值,实际测试发现CALL调用FB也会改变DB寄存器的值,在FC中参数使用复杂数据类型时,实际是以指针的形式来处理的,复杂数据类型都是在DB块里定义的,在FC里直接引用复杂数据类型变量时,DB寄存器和地址寄存器AR1将会用于访问复杂数据类型变量,在FB里IN_OUT类型使用了复杂数据类型也是一样的情况。
 
以下网友喜欢您的帖子:

  
侠客

经验值: 925
发帖数: 425
精华帖: 3
回复:应用探讨——西门子指针编程使用探讨


只看楼主 只看精华 20楼 2011-11-30 15:16:55
quote:以下是引用youhm在2011-11-30 15:09:14的发言:
[quote]以下是引用划痕在2011-11-30 14:23:51的发言:
[color=blue][b]实际测试发现CALL调用FB也会改变DB寄存器的值,在FC中参数使用复杂数据类型时,实际是以指针的形式来处理的,复杂数据类型都是在DB块里定义的,在FC里直接引用复杂数据类型变量时,DB寄存器和地址寄存器AR1将会用于访问复杂数据类型变量,在FB里IN_OUT类型使用了复杂数据类型也是一样的情况。


哎,就是这个地方麻烦,需要编程的时候脑子一直记得我的AR1是不是会被破坏,什么接口数组访问啊,结构成员访问啊,要一直记得才能编程的时候不出错。
 
以下网友喜欢您的帖子:

  
收起
应用探讨——西门子指针编程使用探讨
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。