您现在所在的是:

PLC论坛

回帖:2个,阅读:1699 [上一页] [1] [下一页]
6047
liaosun
文章数:1398
年度积分:50
历史总积分:6047
注册时间:2003/5/4
发站内信
2015论坛贡献奖
2014论坛贡献奖
2013论坛贡献奖
2012论坛贡献奖
2011博客贡献奖
2010博客杰出贡献奖
发表于:2011/3/11 8:23:54
#0楼

   图1中第一条指令的P#表示指针,第2个#号表示局部变量。P##Start_Addr就是调用FC1时,用输入参数Start_Addr传送给FC1的指针P#DB2.DBX0.0(16#0002 8400 0000)存放的地址。P##Start_Addr(16#8700 00a8)最低字节16#a8对应的二进制数为2#10101000,其字节部分为2#10101,即十进制数21,最高字节16#87(2#1000 0111)表示存储区为V区。
   第一条指令将P##Start_Addr送给累加器1,第二条指令将累加器1中的数据传送到AR1,传送后AR1中的地址为V21.0(即16#8700 00a8)。
   那么V区到底是什么呢?根据帮助中的解释“先前的本地数据”(Previous local data),猜想与局部数据堆栈有关。执行每个块时,它都有自己的临时局部数据。在OB1调用FC1时,OB1的临时局部数据被保存到局部数据堆栈,FC1则使用它自己的临时局部数据区,OB1的局部数据成为“Previous local data”(以前的局部变量)。根据上述分析,V区很有可能是调用FC1的OB1的局部数据区。
   怎样才能证实这个猜想呢?最好能看到AR1中的地址为V21.0时,OB1的局部数据。好在STEP 7的监控功能可以查看块调用时保存在堆栈中的数据。为了能看到某条指令执行后OB1的局部数据,在FC1的第2条指令处设置一个断点。执行完第2条指令后,CPU进入HOLD模式,此时打开CPU模块信息对话框的“堆栈”选项卡,选中B堆栈中的OB1,点击“L堆栈”按钮,打开L堆栈对话框,OB1的局部数据堆栈如图2所示。
图 [/URL]
由图1可知,因为指针常数P#V21.0(16#8700 00a8)被送给AR1,监控区中的AR1列显示V21.0。此时OB1调用FC1的POINTER格式的实参P#DB2.DBX0.0(16#0002 8400 0000),存放在从OB1的局部变量LB21开始的6个字节中(见图2)。因此AR1中的P#V21.0表示指针常数P#DB2.DBX0.0的值存放在OB1的局部变量区中的地址,换句话说,V区就是调用FC1时OB1的局部数据区。
   难怪“没见有谁用这个区域编程”,V区用于监控,在编程时没有使用它。
   最后我们来总结一下块调用时的参数传递过程。如果输入参数为简单数据类型,例如字节、字、整数和双整数,可以通过32位(4个字节)的累加器1直接传递参数。而ANY和POINTER分别为10个和6个字节,不能用累加器1直接传递。因此将这些参数的实参(例如16#0002 8400 0000)暂时保存在OB1从V21.0开始的局部变量中。在被调用的FC1中, P##Start_Addr提供了保存参数Start_Addr的实参的地址V21.0,在FC1中用寄存器间接寻址指令“L  W [AR1,P#0.0]”来读取POINTER实参的第一个字(数据块编号),用指令“L  D [AR1,P#2.0]”来读取POINTER实参的2~5号字节(数据块内的变量地址P# DBX0.0)。间接寻址的操作数地址等于方括号中AR1的地址值加上逗号后面的地址偏移量。
   说到这里,我们可以看到传递POINTER参数类型的思路是非常清晰的,“Previous local data”用词是准确的,只不过所用的笔墨太少,背后的复杂过程需要我们猜想和验证。
   解决了这个问题后,有一些感触:
   1.由于语言和思维方式的差异,老外写的用户手册有的地方很难理解,这并不奇怪。奇怪的是网上有一些高手的“用户手册万能论”。用户手册肯定不是万能的,不可能回答所有的问题,有的问题还需要我们设法去探索和发现,包括用程序来验证我们的假设。
   2.这个问题的解决使我惊叹STEP 7强大的功能,如果没有断点和监控堆栈的功能,是不可能搞清楚这个问题的。还有别的PLC有这些功能吗?
   文中所用的例程将在我的《S7-300/400 PLC应用技术》第3版介绍。
此帖来自中华工控网工控博客
原文件地址:http://blog.gkong.com/more.asp?id=134233&Name=liaochangchu
我是廖常初,是一个高校的老师,曾在企业从事机械、电气技术工作,长期从事工业控制和PLC应用的教学、科研和工程应用工作。博客中的日志除注明外均为原创。愿意在此与大家探讨工控的问题!
廖常初工控博客地址:http://blog.gkong.com/blog.asp?name=liaochangchu
我曾写过几本小书: 《PLC编程及应用》第3版(S7-200)、《S7-300/400 PLC应用技术》第3版、《FX系列PLC编程及应用》第2版、《S7-200 PLC编程及应用》、《PLC基础及应用》第2版(FX系列大专教材)、《西门子人机界面(触摸屏)组态与应用技术》、《西门子工业通信网络组态编程与故障诊断》、《S7-1200 PLC编程及应用》第2版、《跟我动手学S7-300/400 PLC》、《跟我动手学FX系列PLC》
机械工业出版社廖常初图书专题:http://www.gkong.com/zt/liaochangchu/
37891
cvlsam 版主
文章数:12470
年度积分:502
历史总积分:37891
注册时间:2001/12/22
发站内信
2018论坛贡献奖
2017论坛贡献奖
2016论坛贡献奖
2015论坛贡献奖
2013论坛贡献奖
2012论坛贡献奖
2011论坛贡献奖
2011国庆活动
2010论坛杰出贡献奖
发表于:2011/3/11 9:37:00
#1楼
我就是用户手册万能论的伪高手……表情

习惯于看用户手册的人,无论什么品牌的都可以,而不局限于品牌。就像我们在实际参与工作前,总需要受党教育多年,虽然实践是检验真理的唯一标准,但是不可忽视的是,连真理都得不出用实践在检验什么呢?

还有别的PLC像西门子这样一遍声明支持IEC61131标准一边极力的与标准不和么?

表情
39663
jint 管理员
文章数:20782
年度积分:283
历史总积分:39663
注册时间:2007/8/30
发站内信
发表于:2011/3/14 10:55:46
#2楼
S7-300的V区的探索与发现(1)
http://bbs.gkong.com/Dispbbs.asp?id=276887
温馨提示:
电话:0755-26546361
邮箱:blog@gkong.com
微信公众号:工控论坛;微信号gkongbbs;
不定期修改账号密码;不要在多个网站用同一账号密码
可随时站内信联系,工作日可拨打电话或发邮件咨询相关问题

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2025 Gkong.com, All Rights Reserved

46.8003