//Copy pointers to areas in standard drives datablock
CALL "PIA_FC_GET_ANY_PTR" //fc129
pIN :="DRVCBP_FIRSTDRIVE".OUT_SPEED //db1250.dbd8
pOUT:=#P_out_speed //临时变量 地址 L220.0
// Copy data from DataBlock
OPN #TL_EN_BRD_R1_DB // read data of bridle before TL/SCBR roll 1
// get pointer into data block
LAR1 P##P_out_speed
L LD [AR1,P#6.0] //这个语句 为什么,没有将累加器1中偏移量6.0地址指针 //内容装载到AR1中。
LAR1 //用ACCU 1的内容(32位指针)装载地址寄存器AR1
// uses pointer to data in actual data block
L DBD [AR1,P#0.0] //dbd8
T #en_tl_brd_speed1
L DBD [AR1,P#14.0] //dbd22
T #en_tl_brd_diameter1
L DBD [AR1,P#18.0] //dbd26
T #en_tl_brd_gear1
//--------------------------------------------------------------------------
fc129
定义 输入管脚pIN Any
输出管脚pOUT Any
L P##pIN
LAR1
L P##pOUT
LAR2
L D [AR1,P#0.0]
T D [AR2,P#0.0]
L D [AR1,P#4.0]
T D [AR2,P#4.0]
L W [AR1,P#8.0]
T W [AR2,P#8.0]
//-----------------------------------------------------------------------------------------
个人理解
get pointer into data block
LAR1 P##P_out_speed //取 地址dbd8首地址8.0
L LD [AR1,P#6.0] //8.0+6.0=12.0
LAR1 //12.0,但是监控地址好像还是8.0,不是很懂。
//--------------------------------------------
请教大家。描述的不是很好,不知道能说清楚问题了吗。
图片说明:
最佳答案
利用any指针进行寻址
LAR1 P##P_out_speed //把P_out_speed的地址赋值到地址寄存器1里面
L LD [AR1,P#6.0] //地址寄存器便宜6个字节,P_out_speed any类型里面的存储类型和地址。如果P_out_speed 输入的参数是p# db1.dbx100.0 byte 10,这句话寻址之后就相当于L LD100
关于any类型的数据格式,参考:
SIMATIC 用STEP 7 V5.5 编程 手册
https://support.industry.siemens.com/cs/cn/zh/view/45531107
610页 27.3.4.5 参数类型 ANY 的格式 介绍
还可以参考下面的文档;
FC中如何传递ANY指针
https://support.industry.siemens.com/cs/cn/zh/view/76779257
如何计算ANY 型指针的偏移量或改变指针?
https://support.industry.siemens.com/cs/cn/zh/view/22422028
西门子STL间接寻址常问问题集
https://support.industry.siemens.com/cs/cn/zh/view/76492353
提问者对于答案的评价:
谢谢 RENHQ和 宁ゐ玉碎的解答,我学习了any指针 的数据结构 6-9才是存放的地址信息。
原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc158258.html