我想实现多个数据在一个区域里按顺序存储的功能,也就是"ATT"功能,但我不想用西门子现成的块。我也是用存储区域的第二个字来保存可以存储的数据的数量。用第一个字来存储现有的数量。在块里声明了一个临时变量TEMP0来计算下一个存储进来的数据要存储的位置。具体编程见下图,可是指针编程的偏移量只能用地址常数来表示,但我的现有数据个数的值是变化的,那我这个功能应该怎么实现呢?
图片说明:
最佳答案
1:你上个问题还没确认了老兄,不确认会扣分的。你这个程序问题很大。
2:ANY用法不是这样来用的,请见图ANY的结构.用ANY类型之前必须对ANY进行分析(得出实参所指向的存储区域)。你没有这个过程。分析过程参考下面
LP##AlarmBit//any类型
LAR1//gettheSTaRTaddressoftheanypointer
LB[AR1,P#0.0]//headforS7serialb#16#10
T#AnyAlarmBit.HeadS7
LB[AR1,P#1.0]//DataType(01=bool;02=byte;04=word;06=dword)
T#AnyAlarmBit.DataType
LW[AR1,P#2.0]//cyclicfactor
T#AnyAlarmBit.RepetitionFactor
LW[AR1,P#4.0]//DataBlockNumber,ifsourCEisnotaDBarea,loadthe0forthisarea
T#AnyAlarmBit.DBNO
LD[AR1,P#6.0]//指针地址
T#AnyAlarmBit.AddrPointer
看看你程序里的W[AR1,p#0.0]是什么东西了?数值可能是W#16#1004
W[AR1,P#2.0]是什么?比如是P#DB1.DBX1.0WORD10中的10
2个比较有什么意义了?
比如你的SAVEED_AREA调用时实参为P#DB1.DBX10.0WORD10
那么经过分析后
LP#SAVEED_AREA
LAR1
B[AR1,P#0.0]=b#16#10
B[AR1,P#1.0]=B#16#04
W[AR1,P#2.0]=10
W[AR1,P#4.0]=1
D[AR1,P#6.0]=P#10.0=DW#16#15=80
你的指针是放在D[AR1,P#6.0]里面的,并不是方在AR1里面的。
3:对于你的问题,比如你知道指针地址后,你可以把
LD[AR1,P#6.0]
LAR1//把地址存放在AR1中
然后可以把偏移地址就是你的TEMP0
LTEMP0//加上AR1前转换成指针地址。如果把地址存到起始地址下一字中则TEMP必须是16,而不是2(非常重要)
+AR1
后面你就可以使用
LW[AR1,P#0.0]
L1
+I
TW[AR1,P#0.0]
通过改变AR1数值来实现地址偏移功能。不要死脑筋只想改变[AR1,P#0.0]偏移地址P#0.0,这个是行不通的。
要不你直接使用存储器寻址比如LW[MD0],地址在MD0里面。
最后好好学学SIEMENS的间接寻址的知识。SIEMENS编程水平的高低就看你的间接寻址水平了。当然你如果使用SCL语言除外。
图片说明:
提问者对于答案的评价:
感谢指导!