技术论坛

AR2地址寄存器引发的FB问题

作者 主题
至圣

经验值: 13934
发帖数: 2007
精华帖: 43
主题:AR2地址寄存器引发的FB问题
精华帖精华帖星级2级


只看楼主 只看精华 只看精编 楼主 2014-11-04 22:25:29
前段时间,为同事编写一段通过绝对值编码器进行位置定位的程序,使用的FB,程序设计完成后,进行测试,在OB1中,以 CALL,FBx,DBx的形式进行调用。所有功能测试完毕,全部正确执行,所以就把程序的STL源文件发给他了,前几天传来信息,程序不能正确执行CPU冒红灯了,我上线一看傻眼了,肯定指针编程错误了。

由于我们公司的标准程序里,每个设备都会编写一个FB 块控制程序(比如电机,DI点,DO 点,阀门,AO,AI 等),然后再按照生产线流程把相关的设备分到一个组里面进行控制,每个组用一个FB 来完成程序控制,对于划分到该组里面的每一个设备所对应的FB ,在组控制FB里面以多重背景的方式进行调用。

举例说明某个组(Group100)的FB 控制程序为FB100,分到这个组里面的设备有2台电机(FB10),一个安全开关DI点(FB11).则FB100的STAT变量里有类型为FB10的这个变量和一个类型为FB11的变量。其实估计大家都应该明白,就是FB的多重背景调用罢了。

问题就是出在,在编写程序时,没有考虑到多重背景调用的情况,因为为了提高程序的通用性,我在编写编码器定位控制的FB块时,使用了区域内寄存器寻址,从而导致了FB块以多重背景调用方式的时候出现了问题。
请看下面我的编码器定位控制FB的STAT变量Bins为一个64的数组,数组元素类型为一个STRUCT.
Bins : ARRAY [1 .. 64 ] OF //仓数据区
STRUCT
ParPostionAbsolute : INT ; //虚拟仓位置所对应的格雷码转换为二进制的值
PostionOffset : INT ; //仓位置所允许的误差
ParPostionToOutPort : INT ; //虚拟仓转到取料口时,编码器所对应的格雷码转换为二进制的值
END_STRUCT ;
在FB 程序里面,我对此处类容进行了间接寻址 ,见下面代码:
//--Serch the selectedt bin postion
LAR1 P##Bins;
L #InTargetBinIndex;
+ -1;
ITD ;
L P#6.0;
*D ;
+AR1 ;
L DIW [AR1,P#4.0];
T #SelectedBinTarPostion;
L DIW [AR1,P#2.0];
T #SelectedBinOffset;
//--Serch the selectedt bin postion end
编写完成后,进行FB测试,没有问题。但是以多重背景方式调用时,出现问题了。原因是什么了?
让大家更明白,我们约定以多重背景方式在其他FB块里面被调用的FB块称之为“子FB块”吧,调用该“子FB块”的FB块为“父FB块”吧,呵呵,有点不专业额。
大家知道在SIMENES PLC中有2个地址寄存器,AR1和AR2,以及2个数据块寄存器DB,DI。其中AR2地址寄存器和DI数据块寄存器相对特殊,主要用在FB中进行寻址。当我们在程序里进行调用FB块时,AR2寄存器类容被初始化为16#85000000.实际上在该FB期间AR2一直保持为16#85000000,当该FB块为一个“父FB块”时,在调用到“子FB块”时,AR2类容变为什么了?答案是在调用"子FB块"过程中AR2类容变为16#85000000+"子FB块"在“父FB块”中的偏移地址。但这个问题和程序出错又有什么关系了?
:) 因为在“子FB块”我以 LAR1 P##Bins; 语句取出的Bins的起始地址仅仅是在”子FB块“中的偏移地址。如果“在FB块”在“父FB块”以多重背景方式调用时,我们应该为该偏移地址再加上“子FB块”在“父FB块”中的偏移地址。
说到这里我想大家应该也明白问题所在了。因此我将上面代码稍作修改,程序即可正确执行了。
//--Serch the selectedt bin postion
LAR1 P##Bins;
TAR2 //新增加语句,取出“子FB块"在”父FB块“中的偏移地址
+AR1 //新增语句,加上该偏移地址,从而得到BINS在“父FB块”中的偏移地址
L #InTargetBinIndex;
+ -1;
ITD ;
L P#6.0;
*D ;
+AR1 ;
L DIW [AR1,P#4.0];
T #SelectedBinTarPostion;
L DIW [AR1,P#2.0];
T #SelectedBinOffset;
//--Serch the selectedt bin postion end

SIEMENS PLC 相对于其他PLC 来说虽然性价较高,但是STEP7在编程方面做的的确没有诸如AB,GE之类的PLC 来的方便,尤其是在间接寻址编程方面,尤其复杂。不知道各位大侠们在STEP7 编程中是否也遇到一些间接寻址编程方面的问题了?
人生就像一场旅行!
以下网友喜欢您的帖子:

  
重要声明:

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

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

游侠

经验值: 317
发帖数: 23
精华帖: 0
回复:AR2地址寄存器引发的FB问题


只看楼主 只看精华 只看精编 1楼 2014-11-11 15:33:52
顶,版主相当给力 有一定功力的牛人
不学有术是天才,学而有术是庸才,不学无术就是我.....
以下网友喜欢您的帖子:

  
侠圣

经验值: 3003
发帖数: 455
精华帖: 0
回复:AR2地址寄存器引发的FB问题


只看楼主 只看精华 只看精编 2楼 2014-11-12 13:27:32
对间接寻址一点也不懂,哎 这个程序对我来说是很难的
Automation
以下网友喜欢您的帖子:

  
奇侠

经验值: 5400
发帖数: 1205
精华帖: 10
回复:AR2地址寄存器引发的FB问题


只看楼主 只看精华 只看精编 3楼 2014-11-12 14:04:57
楼主是哪家公司的?看你写的帖子怎么像柯码的程序标准啊!
 
以下网友喜欢您的帖子:

  
至圣

经验值: 13934
发帖数: 2007
精华帖: 43
回复:AR2地址寄存器引发的FB问题


只看楼主 只看精华 只看精编 楼主 4楼 2014-11-12 18:07:37
quote:以下是引用xkqxwhz在2014-11-12 14:04:57的发言:
楼主是哪家公司的?看你写的帖子怎么像柯码的程序标准啊!

我不是 柯码的,这个 是我为部门编写的 用单圈绝对值编码器进行 仓定位的程序。我们公司的标准程序 用输入点来进行定位的。
人生就像一场旅行!
以下网友喜欢您的帖子:

  
游士

经验值: 198
发帖数: 24
精华帖: 1
回复:AR2地址寄存器引发的FB问题


只看楼主 只看精华 只看精编 5楼 2014-11-21 22:44:52
我前一段也遇到你一样的问题,搞了一下午,监控地址AR1,AR2才发现。所以FB里面用到指针就先加个
LAR1 P#AAA
TAR2
+ AR1
因为以前以为FB块就不会有数据块的冲突。
 
以下网友喜欢您的帖子:

  
游侠

经验值: 498
发帖数: 88
精华帖: 0
回复:AR2地址寄存器引发的FB问题


只看楼主 只看精华 只看精编 7楼 2014-12-17 10:44:23
学习了,谢谢楼主分享,但是子程序块的偏移地址是怎么回事?自己在琢磨琢磨!
学习快乐 快乐学习
以下网友喜欢您的帖子:

  
游侠

经验值: 551
发帖数: 185
精华帖: 0
回复:AR2地址寄存器引发的FB问题


只看楼主 只看精华 只看精编 8楼 2014-12-17 12:41:26
还有很多要学的,还看不明白。
学海无涯苦作舟
以下网友喜欢您的帖子:

  
奇侠

经验值: 5889
发帖数: 796
精华帖: 1
回复:AR2地址寄存器引发的FB问题


只看楼主 只看精华 只看精编 9楼 2014-12-18 12:31:29
学习了,以往一直不太明白这个道理
 
以下网友喜欢您的帖子:

  
至圣

经验值: 13934
发帖数: 2007
精华帖: 43
回复:AR2地址寄存器引发的FB问题


只看楼主 只看精华 只看精编 楼主 10楼 2014-12-18 17:14:49
quote:以下是引用自控龙龙在2014-12-18 12:31:29的发言:
学习了,以往一直不太明白这个道理


为了 提高程序的通用性,STL的指针必须学习好。
人生就像一场旅行!
以下网友喜欢您的帖子:

  
至圣

经验值: 13934
发帖数: 2007
精华帖: 43
回复:AR2地址寄存器引发的FB问题


只看楼主 只看精华 只看精编 楼主 11楼 2014-12-18 17:27:44
quote:以下是引用0917在2014-12-17 10:44:23的发言:
学习了,谢谢楼主分享,但是子程序块的偏移地址是怎么回事?自己在琢磨琢磨!

LAR1 P#Bins
仅仅是 得到了Bins这个数组在多重背景FB块里的首地址,由于多重背景FB,在调用时,没有自己的单独的DB块,需要使用 调用多重背景FB块的背景DB,考虑到调用多重背景FB块的FB块有其他IN,STAT等类型数据,所以BINS在调用多重背景FB块的FB地址并不等于LAR1 P#BINS后 的AR1,在调用多重背景FB块时,AR2会自动定位到 被多重背景使用的FB块在 “父FB块”的偏移地址。
下面语句 就是干这个事的
LAR1 P##Bins;
TAR2 //新增加语句,取出“子FB块"在”父FB块“中的偏移地址
+AR1 //新增语句,加上该偏移地址,从而得到BINS在“父FB块”中的偏移地址

说的太拗口了 你可以把 被多重背景使用的FB块叫“子FB”,调用多重背景FB块的FB块 叫“父FB”吧。
人生就像一场旅行!
以下网友喜欢您的帖子:

  
至圣

经验值: 13934
发帖数: 2007
精华帖: 43
回复:AR2地址寄存器引发的FB问题


只看楼主 只看精华 只看精编 楼主 12楼 2014-12-18 17:29:40
quote:以下是引用自控龙龙在2014-12-18 12:31:29的发言:
学习了,以往一直不太明白这个道理


为了 提高程序的通用性,STL的指针必须学习好。
人生就像一场旅行!
以下网友喜欢您的帖子:

  
游侠

经验值: 498
发帖数: 88
精华帖: 0
回复:AR2地址寄存器引发的FB问题


只看楼主 只看精华 只看精编 13楼 2014-12-19 16:03:45
以下是引用letham在2014-12-18 17:27:44的发言 >11楼
quote:以下是引用0917在2014-12-17 10:44:23的发言:
学习了,谢谢楼主分享,但是子程序块的偏移地址是怎么回事?自己在琢磨琢磨!

LAR1 P#Bins
仅仅是 得到了Bins这个数组在多重背景FB块里的首地址,由于多重背景FB,在调用时,没有自己的单独的DB块,需要使用 调用多重背景FB块的背景DB,考虑到调用多重背景FB块的FB块有其他IN,STAT等类型数据,所以BINS在调用多重背景FB块的FB地址并不等于LAR1 P#BINS后 的AR1,在调用多重背景FB块时,AR2会自动定位到 被多重背景使用的FB块在 “父FB块”的偏移地址。
下面语句 就是干这个事的
LAR1 P##Bins;
TAR2 //新增加语句,取出“子FB块"在”父FB块“中的偏移地址
+AR1 //新增语句,加上该偏移地址,从而得到BINS在“父FB块”中的偏移地址

说的太拗口了 你可以把 被多重背景使用的FB块叫“子FB”,调用多重背景FB块的FB块 叫“父FB”吧。
谢谢楼主的回复。关于子程序块调用,我是不是可以这样理解,在FB块调用子程序块时子程序块里的变量占用了FB块的地址,所以p##bins并没有指向子程序块里的bins所占地址,这就是所谓的地址偏移。但是“在调用多重背景FB块时,AR2会自动定位到 被多重背景使用的FB块在 “父FB块”的偏移地址。”AR2为什么会自动定位为偏移地址?不是很理解。
学习快乐 快乐学习
以下网友喜欢您的帖子:

  
游侠

经验值: 498
发帖数: 88
精华帖: 0
回复:AR2地址寄存器引发的FB问题


只看楼主 只看精华 只看精编 14楼 2014-12-21 09:39:22
上面我的回复是错误的,只有FB作为多重背景时才会出现这种情况,之前没接触过多重背景的使用。AR2为什么会是偏移地址,FB和多重背景调用:
对于使用多背景的FB,STEP 7使用 AR2 作为基地址寄存器或背景数据。
当调用背景数据时,AR2 为P#DBX0.0。
所有对块参数或FB的静态本地数据的访问使用寄存器间接、内部区域寻址,由此寄存器表示其操作数区域DI。
调用本地背景数据时,用 +AR2 P#y.x 增加基地址,所以有关该地址的访问可在被调用FB中实现,它使用调用FB的背景DB。
学习快乐 快乐学习
以下网友喜欢您的帖子:

  
至圣

经验值: 13934
发帖数: 2007
精华帖: 43
回复:AR2地址寄存器引发的FB问题


只看楼主 只看精华 只看精编 楼主 15楼 2014-12-21 09:46:24
quote:以下是引用0917在2014-12-21 09:39:22的发言:
上面我的回复是错误的,只有FB作为多重背景时才会出现这种情况,之前没接触过多重背景的使用。AR2为什么会是偏移地址,FB和多重背景调用:
对于使用多背景的FB,STEP 7使用 AR2 作为基地址寄存器或背景数据。
当调用背景数据时,AR2 为P#DBX0.0。
所有对块参数或FB的静态本地数据的访问使用寄存器间接、内部区域寻址,由此寄存器表示其操作数区域DI。
调用本地背景数据时,用 +AR2 P#y.x 增加基地址,所以有关该地址的访问可在被调用FB中实现,它使用调用FB的背景DB。


理解基本是对的,但是有个地方需要注意下AR2初始化为"P#DIX0.0"
也就是16#85000000
人生就像一场旅行!
以下网友喜欢您的帖子:

  
游侠

经验值: 498
发帖数: 88
精华帖: 0
回复:AR2地址寄存器引发的FB问题


只看楼主 只看精华 只看精编 16楼 2014-12-22 21:40:56
谢谢楼主的讲解,学习很多。上面那段话是我在西门子下载的资料里搬运过来的,囫囵吞枣了。再次谢谢楼主耐心的讲解!多向你们这样的高手学习!
学习快乐 快乐学习
以下网友喜欢您的帖子:

  
游士

经验值: 272
发帖数: 50
精华帖: 0
回复:AR2地址寄存器引发的FB问题


只看楼主 只看精华 只看精编 17楼 2014-12-22 22:44:24
我是 初学指针的 。还没有你们那样做的这么灵活
以后多指点一下指针的问题
 
以下网友喜欢您的帖子:

  
侠客

经验值: 646
发帖数: 51
精华帖: 0
回复:AR2地址寄存器引发的FB问题
精编帖


只看楼主 只看精华 只看精编 18楼 2014-12-23 16:15:19
感谢楼主letham为大家做的分享和精彩讲解,但我觉得其中有点小错误:
------“当我们在程序里进行调用FB块时,AR2寄存器类容被初始化为16#85000000.实际上在该FB期间AR2一直保持为16#85000000,当该FB块为一个“父FB块”时,在调用到“子FB块”时,AR2类容变为什么了?答案是在调用"子FB块"过程中AR2类容变为16#85000000+"子FB块"在“父FB块”中的偏移地址”-------其中的AR2内容应为“16#84000000”或“16#84000000+"子FB块"”。
那么在程序中怎么能正确获得背景数据的地址呢?那是因为CPU先执行了“LAR1 P##Bins”,此后的“+AR1 ”并不影响区域ID.再说下面程序再使用变址寻址时又是区域内寻址。所以程序能如愿执行。
修德广业
以下网友喜欢您的帖子:

  
至圣

经验值: 13934
发帖数: 2007
精华帖: 43
回复:AR2地址寄存器引发的FB问题
精华帖精华帖星级2级


只看楼主 只看精华 只看精编 楼主 19楼 2014-12-23 18:50:27
quote:以下是引用*在2014-12-23 16:15:19的发言:
感谢楼主letham为大家做的分享和精彩讲解,但我觉得其中有点小错误:
------“当我们在程序里进行调用FB块时,AR2寄存器类容被初始化为16#85000000.实际上在该FB期间AR2一直保持为16#85000000,当该FB块为一个“父FB块”时,在调用到“子FB块”时,AR2类容变为什么了?答案是在调用"子FB块"过程中AR2类容变为16#85000000+"子FB块"在“父FB块”中的偏移地址”-------其中的AR2内容应为“16#84000000”或“16#84000000+"子FB块"”。
那么在程序中怎么能正确获得背景数据的地址呢?那是因为CPU先执行了“LAR1 P##Bins”,此后的“+AR1 ”并不影响区域ID.再说下面程序再使用变址寻址时又是区域内寻址。所以程序能如愿执行。


对 是有点笔误,AR2内容为16#8500开始的,FB块内调用多重背景后,AR2内容会变成多重背景在FB背景DB块的偏移地址,比如P#DIX200.0,在多重背景调用结束后AR2内容会自动回到P#DIX0.0
这个过程是由CPU操作系统来做的。
但是你的理解有误,我不是想要说明是指针的存储区域的改变与否,在我的程序中AR1,AR2内容始终是P#DIX x.y。
LAR1 P##Bins;
这个语句 仅仅得到的是BINS在被多重背景调用的FB块中的首地址,但是多重背景FB没有自己的DB块,它正确执行,需要调用多重背景的FB块的背景DB块,但是多重背景FB的偏移地址很可能 不是从0开始的,所以为了 正确定位到 多重背景FB所使用的数据区,必须 加上AR2的内容,才能正确对应到DB块的数值,这就是TAR2,后+AR1目的所在,没有这2句,FB块直接调用 不会有任何问题!但以多重背景方式调用,就不会正确执行了!

所以 整个程序讨论的重点 和32位指针的区域ID 是否改变没有任何关系。
我可以
T W[AR1,P#0.0]
来做 ,它也不会出错。
人生就像一场旅行!
以下网友喜欢您的帖子:

  
版主

经验值: 76166
发帖数: 19135
精华帖: 378
回复:AR2地址寄存器引发的FB问题


只看楼主 只看精华 只看精编 20楼 2014-12-23 21:19:47
Zane 注册自动化系统工程师 Always save before download
以下网友喜欢您的帖子:

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