
间接寻址是西门子PLC编程中核心的寻址方式,核心定义是:不直接指定指令的操作数地址,而是通过指针(Pointer)存储目标地址的编号,再通过指针间接调用对应存储区的数据,实现“灵活调用、批量操作、动态切换”的需求,适配S7-200 SMART、S7-300/400、S7-1200/1500全系列机型,是复杂逻辑编程(如批量数据处理、多工位控制)的必备技能。
相较于直接寻址(如A I0.0、L DB1.DBW0,直接指定具体地址),间接寻址的核心优势的是“地址可动态切换”——无需修改程序,仅通过修改指针的数值,即可调用不同地址的数据,大幅简化批量操作编程,减少程序冗余,同时提升程序的灵活性和可维护性。寻址的本质是指定指令操作数的地址,间接寻址则是通过指针间接给出这一地址,而非直接标注确切地址。
指针是间接寻址的核心,本质是一个存储“目标地址编号”的存储单元,西门子PLC中指针分为两种格式,适配不同寻址场景:
双字指针(32位):最常用格式,由“字节编号(3~18位,0~65535)+ 位编号(0~2位,0~7)”组成,可精准定位到具体的位地址(如I10.2、Q5.7),适配所有存储区的寻址需求,其32位结构中,0~2位指示位编号,3~18位指示字节编号,剩余位可忽略或用于区域标识。
补充:指针的存储区域有明确限制,如S7-200 SMART中,仅V存储单元、L存储单元或累加器(AC1、AC2、AC3)可作为指针,且指针以双字形式存储目标地址。
间接寻址可适配西门子PLC所有常用存储区,不同存储区的寻址格式略有差异,核心适配如下(覆盖全机型):
输入区(I)/输出区(Q):如通过指针调用I区、Q区的位/字节/字数据,适配开关量、模拟量的动态调用。
位存储区(M):最常用的指针存储区域,也可通过指针间接调用M区数据,用于中间逻辑过渡。
数据块(DB):含共享数据块(DB)和背景数据块(DI),是间接寻址的核心应用场景(如批量调用DB块内的工艺参数),可通过指针调用DB块的字节、字、双字数据,部分机型需先打开DB块再进行寻址操作。
定时器(T)/计数器(C):通过指针调用不同编号的定时器、计数器,实现多定时器/计数器的动态切换,无需重复编写控制逻辑。
本地数据区(L):仅在功能块(FB/FC)内部使用,可通过指针调用块内本地数据,提升块内逻辑的灵活性。
西门子不同系列PLC的间接寻址方式略有差异,核心分为两大类型,对应不同机型,实操中需按需选择,避免混淆:
最基础、最常用的间接寻址方式,核心是“用存储单元作为指针”,直接存储目标地址的编号,无需专用寄存器,适配S7-200 SMART、S7-300/400、S7-1200/1500全系列,分为单字指针和双字指针两种应用场景,与直接寻址的核心区别的是通过指针间接指明操作地址,而非直接标注确切地址。
需求:用MD10(双字指针)存储目标地址编号,间接调用I区输入信号,控制Q区输出。
// 1. 给指针赋值(指定目标地址:I10.2) L P#10.2 // 加载指针,指向I10.2(字节10,位2) T MD10 // 将指针存入MD10(双字指针存储区) // 2. 间接寻址调用I10.2,控制Q0.0输出 A I(MD10) // 间接调用MD10指向的I区地址(I10.2) = Q0.0 // 若I10.2为1,Q0.0输出1
关键说明:单字指针仅适用于非位地址(如DB10.DBW0、T5),格式为“L 10;T MW10;L DB(MW10).DBW0”,即通过单字指针MW10存储DB块编号,间接调用对应DB块的字数据;双字指针可精准定位到位地址,是实操中最常用的指针格式,使用时需确保指针的位编号范围为0~7,字节编号范围符合存储区限制。
核心是使用PLC内部的地址寄存器AR1、AR2(32位)作为指针,专门用于复杂逻辑(如多数据块批量调用、跨区域寻址),需通过专用指令操作寄存器,地址寄存器AR1、AR2均为32位,可存储区域内或跨区域指针,适配S7-300/400的复杂编程场景,S7-1200/1500、S7-200 SMART无此寄存器,无需考虑。
LAR1/LAR2:将指针加载到地址寄存器(如LAR1 P#5.0,将指针P#5.0加载到AR1);
TAR1/TAR2:将地址寄存器的指针存储到目标存储区(如TAR1 MD20,将AR1的指针存入MD20);
CAR:交换AR1和AR2的指针内容,用于快速切换两个指针指向的地址。
// 1. 加载指针到AR1(指向DB10.DBW0) L P#DB10.DBW0 // 指针指向共享数据块DB10的字数据DBW0 LAR1 // 将指针加载到AR1 // 2. 间接调用DB10.DBW0,赋值给MW30 L DB[AR1,P#0.0].DBW0 // 调用AR1指向的DB块字数据(无偏移) T MW30 // 赋值给MW30 // 3. 偏移寻址(调用DB10.DBW2) L DB[AR1,P#2.0].DBW0 // 指针偏移2字节,指向DB10.DBW2 T MW32 // 赋值给MW32
关键说明:寄存器间接寻址支持“指针偏移”(如P#2.0),可实现连续地址的批量调用,大幅提升复杂逻辑的编程效率;地址寄存器的指针分为区域内指针和跨区域指针,区域内指针仅指向单一存储区,跨区域指针可指向不同存储区,需通过区域标识符区分(如I、Q、M、DB),区域标识符有对应的二进制和十六进制代码,可提前预设到指针中。
S7-1200/1500无AR1/AR2寄存器,采用“符号寻址+指针指令”结合的方式,核心通过PEEK/POKE系列指令实现间接寻址,操作更简洁,适配TIA博途软件的图形化编程,同时支持SCL语言编程,可通过专用指令实现变量和DB块的间接访问,与传统机型的寻址逻辑一致,但指令格式略有差异。
PEEK_BOOL/PEEK_BYTE/PEEK_WORD/PEEK_DWORD:读取指定指针指向的布尔值/字节/字/双字数据;
POKE_BOOL/POKE_BYTE/POKE_WORD/POKE_DWORD:向指定指针指向的地址写入对应类型数据;
POKE_BLK:批量写入数据,适用于批量间接寻址场景,可实现数据块的批量复制和调用,与S7-300/400的批量寻址逻辑一致,但指令格式更适配TIA博途环境。
// 需求:通过指针DB10.DBW0(存储DB块编号),间接读取对应DB块的DBW2数据 VAR DB_Num: WORD := 5; // 指针:目标DB块编号(DB5) Data: WORD; // 存储间接读取的数据 END_VAR // 间接读取DB5.DBW2的数据,存入Data Data := PEEK_WORD(area := 16#84, // 区域代码:DB块(16#84对应DB存储区) dbNumber := DB_Num, byteOffset := 2); // 偏移量:DBW2(字节偏移2)
补充:S7-200 SMART的间接寻址与S7-1200/1500类似,核心通过“&地址”获取指针,“*指针”调用数据,无需专用寄存器,指针仅可存储在指定区域,且不可用于访问单个位或HC、L等特殊存储区,修改指针值时需根据访问数据的大小调整指针偏移量(字节+1、字+2、双字+4)。
需求:通过间接寻址,批量读取DB1~DB5的DBW0数据,存入MW10~MW18(每块数据对应一个MW存储区),适配所有机型,核心逻辑一致,仅指令格式略有差异。
定义指针:选择对应机型的指针存储区(如S7-300用MD10,S7-1200用DB10.DBW0,S7-200 SMART用VW10),用于存储目标DB块编号(1~5)。
指针赋值:通过程序给指针赋初始值(如1),后续通过自增指令(如INC_W)实现指针递增,对应DB块编号递增,实现批量调用。
间接寻址调用:根据机型选择对应指令,调用指针指向的DB块数据,如S7-300用寄存器间接寻址,S7-1200用PEEK指令,S7-200 SMART用“*指针”调用。
循环控制:添加循环指令(如FOR循环),设置循环次数(5次),实现DB1~DB5数据的批量读取,避免重复编写调用指令,提升编程效率。
结果存储:将每次读取的数据存入对应MW存储区,循环结束后完成批量数据调用,可添加判断逻辑,确保指针不超出目标范围(如DB块编号1~5)。
关键补充:不同机型的指令格式可灵活调整,但核心逻辑一致——通过指针动态指向目标地址,批量调用数据;实操中可根据机型选择对应的指针格式和指令,无需修改核心逻辑。
上一篇:发那科换刀指令详解
下一篇:西门子FB284功能块详解