适用:CP1E/CP1H、CJ2M/CJ2H、CS 系列,CX‑Programmer。 欧姆龙一共有3 种间接寻址方式:
@D二进制间接、*DBCD 间接、IR/DR 变址寄存器,工程最常用是@D与 IR 变址。
1、@D 二进制间接寻址(推荐,大部分项目用这个)
@Dn:把 Dn 里面的二进制数值当做 D 区通道号,访问对应的 D 通道。
示例:
MOV &100 D10 // &100:通道编号100,写入D10
MOV @D10 D20 // @D10 = D[100];把D100的值复制到D20
D10 里面存放
100→@D10等价于 D100D10 里面存放
200→@D10等价于 D200
只能用于 D (DM) 区;数值是二进制,范围 0‑65535,不要超出 PLC 实际 D 区范围,否则 CPU 报错。
2、*D BCD 间接寻址
*Dn:Dn 里面数值按BCD 码解析,只能 0‑9999,非 BCD 会出错。
MOV #0200 D10
MOV *D10 D20 //访问D200
现代程序优先用
@D,*D是兼容老机型。
注意:
@D与*D只针对 D 区,不能直接访问 CIO/W/H/T/C。跨区域访问要用 IR 变址寄存器。
3、IR / DR 变址寄存器(功能最强,可以访问 CIO、D、W、H、T、C 所有区域)
IR0‑IR15:变址寄存器,存放存储器绝对地址(双字)。
DR0‑DR15:偏移寄存器(单字,‑32768~+32767),给 IR 做偏移。
MOVR (560):把普通地址(D10、W20、CIO10)转换成绝对地址,存入 IR。
例子 1:MOVR 把 D50 地址放入 IR0
MOVR(560) D50 IR0 //IR0保存D50的绝对地址
MOV #1234 ,IR0 //逗号,IR0:向IR0指向的D50写入#1234
,IR0代表访问 IR 指向的地址。
例子 2:IR+DR 偏移
MOVR(560) D100 IR0
MOV #5 DR0 //偏移+5
MOV ,DR0,IR0 D200 //访问 D100+5 = D105
例子 3:基地址 [IR] 写法(CJ2 系列)
D100[IR0],D100 为基址,IR0 里面放偏移量,得到 D (100+IR0)。
三种方式对比
表格
| 方式 | 写法 | 可访问区域 | 数值格式 | 适用场景 |
|---|---|---|---|---|
| 二进制间接 | @D10 | 仅 D 区 | 二进制 0‑65535 | 配方、数组,最常用 |
| BCD 间接 | *D10 | 仅 D 区 | BCD 0‑9999 | 老程序兼容,新项目不推荐 |
| IR/DR 变址 | ,IR0;D100[IR0] | CIO/D/W/H/T/C 全部区域 | 绝对地址 | 跨区、位间接、循环处理数组 |
梯形图完整示例:@D 间接(配方读取)
需求:D20 存放通道号,读取 D [D20] 的值送到 D50。
D20 = 10 → 读取 D10;D20=20 →读取 D20。
MOV @D20 D50
ST 语言(结构化文本 CJ2/CP1E)
ST 里面直接数组下标,等价间接寻址:
VAR
Index:INT;
END_VAR
Index:=100;
D[Index]:=1234; //写D100
Temp:=D[Index]; //读D100
(重点)
@D10,D10 中数值不能超过 PLC 实际 D 区最大通道,否则 CPU 出现 I/O 存储器错误停机。程序最好增加范围判断。@D / *D只能访问 D 区,不能写@W10、@CIO10,跨区域必须用 IR 变址。IR 使用必须用
MOVR(560)获取地址,不能直接 MOV 数值给 IR,IR 存的是 PLC 内部绝对地址,不是简单通道号。逗号
,IR0,逗号不能漏,漏逗号变成操作 IR 寄存器本身,不是间接地址。
选型建议
只操作 D 区数组、配方:优先使用 @D,简单好用。
需要访问 CIO、W、H、T/C,或者位间接寻址:使用 IR/DR 变址寄存器 MOVR。

