技术论坛

指针3 求教

作者 主题
游侠

经验值: 375
发帖数: 163
精华帖: 1
主题:指针3 求教


只看楼主 楼主 2011-11-18 01:36:21
L P##CnvData
LAR1
TAR2
+AR1 前4句求解?
L W [AR1,P#0.0]
T #IDB_No
L D [AR1,P#2.0]
LAR1
T #tmp_StrtAdr
L W#16#1002
T LW 10
学习中————————
以下网友喜欢您的帖子:

  
重要声明:

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

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

至圣

经验值: 18406
发帖数: 6291
精华帖: 137
回复:指针3 求教


只看楼主 1楼 2011-11-18 08:05:17
感觉不应该有第4句,是正在运行的程序还是编着玩的?
追求完美
以下网友喜欢您的帖子:

  
至圣

经验值: 13058
发帖数: 4961
精华帖: 81
回复:指针3 求教


只看楼主 2楼 2011-11-18 08:33:15
L P##CnvData 装载变量CnvData的地址到累加器1
LAR1 把累加器1里的地址传送到地址寄存器AR1
TAR2 把地址寄存器AR2的内容装载到累加器1
+AR1 把累加器1中的地址偏移量加到地址寄存器AR1
此时AR1的地址就是变量CnvData的地址加上AR2里的地址偏移量

西门子关于指针和间接寻址的资料还是很多的,建议楼主仔细看下,并结合PLCSIM进行测试
 
以下网友喜欢您的帖子:

  
侠圣

经验值: 3980
发帖数: 577
精华帖: 18
回复:指针3 求教


只看楼主 3楼 2011-11-18 09:21:50
你这不是在多重背景FB里写的吧?
如果是的话,第三句后少了一句,否则会出错的。
业精于勤,行成于思
以下网友喜欢您的帖子:

  
游侠

经验值: 375
发帖数: 163
精华帖: 1
回复:指针3 求教


只看楼主 楼主 4楼 2011-11-18 18:42:23
运行的程序 我没到编程玩的时候 ,初学者,


没少语句 后边还有很多没写
学习中————————
以下网友喜欢您的帖子:

  
游侠

经验值: 375
发帖数: 163
精华帖: 1
回复:指针3 求教


只看楼主 楼主 5楼 2011-11-18 18:51:10
quote:以下是引用youhm在2011-11-18 08:33:15的发言:

L P##CnvData 装载变量CnvData的地址到累加器1
LAR1 把累加器1里的地址传送到地址寄存器AR1
TAR2 把地址寄存器AR2的内容装载到累加器1
[//color=red] 是把地址寄存器AR2的内容装载到累加器1 还是 把地址寄存器AR1的内容装 载到地址寄存器2 [//color]
+AR1 把累加器1中的地址偏移量加到地址寄存器AR1
此时AR1的地址就是变量CnvData的地址加上AR2里的地址偏移量

西门子关于指针和间接寻址的资料还是很多的,建议楼主仔细看下,并结合PLCSIM进行测试

学习中————————
以下网友喜欢您的帖子:

  
至圣

经验值: 18406
发帖数: 6291
精华帖: 137
回复:指针3 求教


只看楼主 6楼 2011-11-18 19:08:07
第4句有问题,我对前4句仿真,出现编程错误,要求调用OB121。下面是错误信息:

事件 3 / 12: 事件 ID 16# 2522
读取时发生区域长度错误
调用方的本地数据,字访问, 访问地址: 42
FC 编号: 1
模块地址: 12
所需的 OB:编程错误 OB (OB121)
在当前工作模式下,OB 未找到、或被禁用、或无法启动
内部错误, 进入的事件

没有第4句的时候,用程序状态监控第3句的AR1为V21.0(V区为调用FC1的块的局部变量)。
加上第4句,执行 +AR1指令后,AR1为V42.0,出错。
感觉第4句用得很蹊跷。

楼主的程序能发给我看看吗?
追求完美
以下网友喜欢您的帖子:

  
游侠

经验值: 375
发帖数: 163
精华帖: 1
回复:指针3 求教


只看楼主 楼主 7楼 2011-11-19 05:27:06
好的,程序打包完发你邮箱吧!好给我讲解一下 嘿嘿
学习中————————
以下网友喜欢您的帖子:

  
至圣

经验值: 18406
发帖数: 6291
精华帖: 137
回复:指针3 求教


只看楼主 8楼 2011-11-19 07:47:08
我的邮箱:liaosun@cqu.edu.cn
追求完美
以下网友喜欢您的帖子:

  
侠圣

经验值: 3980
发帖数: 577
精华帖: 18
回复:指针3 求教


只看楼主 9楼 2011-11-19 21:20:50
对不起,本帖的第一个回帖想当然了,但我觉得此程序的编写者还不是很严谨
我觉得这个程序应该是在被调用的多重背景FB里编写的,前面的4句的目的是为了得到变量#CnvData在背景数据块中的起始地址

我的解释如下:
L P##CnvData 装载变量CnvData的地址到累加器1
LAR1 把累加器1里的地址传送到地址寄存器AR1
TAR2 把地址寄存器AR2的内容装载到累加器1,多重背景FB中,AR2存储该FB第一个变量在背景DB中的起始地址
+AR1 把累加器1中的地址(注意,是累加器1中的低字地址)偏移量加到地址寄存器AR1
经过这样处理后,AR1中就得到了#CnvData在背景DB里具体地址了

因为+AR1加的是ACCU1中的低字地址,所以正好把ACCU1-H中的区域ID丢掉了,但我们知道,在32位指针中,0-18位是代表具体地址信息的,所以+AR1这条指令有可能会漏掉3位
所以,严谨点,最好这样写:
TAR2
AD DW#00FFFFFF (屏蔽掉存储区ID,具体就是16#80、16#81等啥的,只取出地址信息)
L P##CnvData
+D
LAR1
这样处理后,效果是一样的,但是更加可靠。
当然,这是我的猜测,楼主可把程序打包上来看看
业精于勤,行成于思
以下网友喜欢您的帖子:

  
至圣

经验值: 18406
发帖数: 6291
精华帖: 137
回复:指针3 求教


只看楼主 10楼 2011-11-19 23:35:31
我把第3条指令错看成LAR2了。火麒麟大侠的猜测,需要看前面程序对AR2赋值的情况。
下面是+AR1的帮助信息:
+AR1 (加到AR1)将在语句或ACCU 1-L中指定的偏移量加到AR1的内容上。首先将整数(16位)扩展为符号正确的24位,然后将其加到AR1的最低有效的24位(AR1中的相对地址的一部分)。在AR1中,区域ID的部分(位24、25和26)保持不变。
看来不会漏掉3位。
追求完美
以下网友喜欢您的帖子:

  
游侠

经验值: 375
发帖数: 163
精华帖: 1
回复:指针3 求教


只看楼主 楼主 11楼 2011-11-20 13:20:37
晚上回来仔细看看,上班去了!无奈
学习中————————
以下网友喜欢您的帖子:

  
侠圣

经验值: 3904
发帖数: 370
精华帖: 1
回复:指针3 求教


只看楼主 12楼 2011-11-20 21:26:26
请问有关于“ 多重背景FB中,AR使用”的资料吗?看了几位高手的讲解,想学习一下相关知识,很少用stl;
无法改变之前,努力改变之后
以下网友喜欢您的帖子:

  
侠圣

经验值: 3980
发帖数: 577
精华帖: 18
回复:指针3 求教


只看楼主 13楼 2011-11-22 11:17:29
今天又看了一下+AR1的指令,不能理解其处理方式,因为会连符号位扩展24位,所以会带来问题
下图是仿真的画面,2种语句的变化,程序是在多重背景FB里写的,其中,#IN2在背景DB里的实际起始地址为65523.0,如下图:



下图是采用帖子中的处理仿真:



可以看出,得出的地址早就超过了DB实际容量,而且也不正确
下图采用我提到的处理仿真:



可以得到#IN2在背景DB中的实际地址。
在+AR1中的指令说明,允许-32767到32767之间的数,但是实际的程序中超过此限制时却又不限制使用,在某种条件下,会导致程序错误。
关于我理解中存在的问题,希望有大侠能指点一下。
业精于勤,行成于思
以下网友喜欢您的帖子:

  
至圣

经验值: 13058
发帖数: 4961
精华帖: 81
回复:指针3 求教


只看楼主 14楼 2011-11-22 14:23:53
这个扩展是按补码的原则来的,应该是没有问题的
65523这个数是一个正数再乘以8,明显超出了-32767到32767的范围。
 
以下网友喜欢您的帖子:

  
侠圣

经验值: 3980
发帖数: 577
精华帖: 18
回复:指针3 求教


只看楼主 15楼 2011-11-22 15:25:22
ACCU1中如果第15位为1,即是说符号位为1的话,程序中用第一种方式肯定寻址错误,也就是说超过了限制。
反应在多重背景FB中,表现为不能对实际地址在背景DB中超过4096以后的变量用第一种方式寻址了,但是用第二种方式就没有问题。为什么+AR1非要这种处理方式呢,为什么不能将高位全补零呢?
但是实际应用中能绝对保证就用不到4096以后的地址么??
而且,对于FB的IN/OUT变量的复杂类型,如STRUCT、UDT、ARRAY等,FB本身就将其作为一个48位的指针来处理的,所以这种编程方式还相当普遍。
希望大侠来解惑
业精于勤,行成于思
以下网友喜欢您的帖子:

  
至圣

经验值: 18406
发帖数: 6291
精华帖: 137
回复:指针3 求教


只看楼主 16楼 2011-11-22 15:50:20
下面是STEP 7帮助中搜索到的信息:
DI寄存器和地址寄存器AR2均用于FB和多重背景的系统中,因此,不要在FB内对其进行修改。
命令"L P#parameter_name"将装载相对于地址寄存器AR2的FB内指定参数的地址偏移量。为了确定多重背景类型FB中的背景数据块的绝对偏移量,还必须将AR2寄存器的区域内指针(仅地址) 添加给该值。
追求完美
以下网友喜欢您的帖子:

  
侠圣

经验值: 3980
发帖数: 577
精华帖: 18
回复:指针3 求教


只看楼主 17楼 2011-11-22 16:01:19
quote:以下是引用Automann在2011-11-22 15:50:20的发言:
下面是STEP 7帮助中搜索到的信息:
DI寄存器和地址寄存器AR2均用于FB和多重背景的系统中,因此,不要在FB内对其进行修改。
命令"L P#parameter_name"将装载相对于地址寄存器AR2的FB内指定参数的地址偏移量。为了确定多重背景类型FB中的背景数据块的绝对偏移量,还必须将AR2寄存器的区域内指针(仅地址) 添加给该值。

是的,所以我认为楼主的程序是在多重背景FB中写的,否则写在别处没啥意义。
TAR2
AD DW#16#00FFFFFF (屏蔽掉存储区ID,具体就是16#80、16#81等啥的,只取出地址信息)
L P##CnvData
+D
LAR1
上述语句就是就得到了变量在背景DB中的绝对偏移量
业精于勤,行成于思
以下网友喜欢您的帖子:

  
至圣

经验值: 13058
发帖数: 4961
精华帖: 81
回复:指针3 求教


只看楼主 18楼 2011-11-22 16:18:30
一般来说偏移量不会很大吧,+AR1,偏移量可正可负,小范围的变址还是比较方便的,对于地址号比较大的可以装入地址寄存器,值比较小的偏移量做为被加数放入累加器。
既然指令是这样了,合理的使用它好了
 
以下网友喜欢您的帖子:

  
游侠

经验值: 375
发帖数: 163
精华帖: 1
回复:指针3 求教


只看楼主 楼主 19楼 2011-11-23 09:30:08
学习啦 !谢谢各位!
学习中————————
以下网友喜欢您的帖子:

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