☰
欧姆龙PLC内部资源地址详解:IR/SR区与扩展单元通道分配避坑指南
2026/10/23 3:16:47 网站建设 项目流程

简介:这份欧姆龙PLC指令专题培训课件面向工业自动化领域的电气工程师、PLC编程初学者及自动化专业师生,用于系统梳理欧姆龙PLC的机型分类与内部资源组织方式,解决内部继电器区地址分配与I/O扩展配置理解困难的问题。资源包内含1个PPT文件,压缩包约1.43MB,以幻灯片形式呈现,便于课堂讲授与自学查阅。课件围绕微型机、小型机、中型机、大型机四类机型展开,重点讲解CPM1A系列内部继电器区(IR)的5位地址结构、输入/输出继电器区通道分配规则,以及CPU单元与I/O扩展单元的连接编号方法,并延伸至内部辅助继电器区与特殊辅助继电器区的功能划分。通过CPM1A-40CDR-A与CPM1A-20EDR组合实例,读者可掌握通道号与位地址的对应关系,理解I/O点数扩展的地址编排逻辑,为PLC程序编写与控制系统硬件设计打下基础。目前已有95人学习。

1. 欧姆龙PLC内部资源:为什么一个地址能决定程序跑不跑得起来

很多人第一次写欧姆龙PLC程序时,觉得地址就是个编号,随便填一个能编译通过就行。但实际调试时经常遇到一种情况:程序逻辑完全正确,下载进去就是不动,输入信号也接了,输出灯就是不亮。翻遍梯形图找不到问题,最后发现是把输入通道000当成了内部辅助继电器用,或者把扩展单元的输入通道号写错了。这类问题的根源不在指令,而在对内部资源地址空间的理解。

欧姆龙CPM1A这类小型机的内部资源,本质上是一块被严格划分的存储地图。IR区、SR区、LR区、HR区、DM区各有各的用途,地址不是随便分配的,而是和硬件通道、扩展单元顺序、系统功能绑定死的。你写的每一个00000、20004、23200,背后都对应着具体的物理输入点、内部逻辑位或者系统标志。搞懂这套地址机制,才能从“照着例子抄”变成“知道为什么这么写”。

2. 内部继电器区IR:输入输出和内部辅助为什么共用一套地址

2.1 IR区的两段式划分逻辑

CPM1A的内部继电器区(IR)被分成两段:输入/输出继电器区和内部辅助继电器区。输入/输出继电器区占用通道000~019,其中000~009是输入通道,010~019是输出通道。内部辅助继电器区占用通道200~231,共32个通道、512个位。

为什么要把这两类放在同一个IR区里?从PLC的扫描机制来看,输入继电器区在每个扫描周期的开始阶段被刷新,把外部输入信号的状态映射进来;输出继电器区在扫描周期的末尾被刷新,把程序运算结果送到外部输出端子。而内部辅助继电器区不参与这个刷新过程,它只是程序运行过程中的中间状态存储。三者共用IR区,是因为CPU内部对IR区的访问用的是同一套地址译码逻辑,读写速度一致,不需要区分指令。对程序员来说,用20000和用00000在指令层面没有区别,但运行时行为完全不同。

2.2 五位数地址的编码规则

CPM1A的IR区地址用5位数字表示,前3位是通道号,后2位是通道内的位地址。一个通道有16个位,位地址从00到15。比如20004,200是通道号,04是位地址,表示第200通道的第4位。

这种编码方式的好处是地址和硬件通道直接对应。输入通道000的00000~00015对应CPU单元上的16个输入点,输出通道010的01000~01015对应CPU单元上的16个输出点。写程序时看到00000,就知道这是CPU单元的第一个输入点,不需要查表。

# 地址解析示例 # 20004 → 通道号: 200, 位地址: 04 # 00015 → 通道号: 000, 位地址: 15 # 01007 → 通道号: 010, 位地址: 07 # 通道号范围: 000-019 (I/O), 200-231 (内部辅助) # 位地址范围: 00-15

这里有个容易翻车的点:位地址是两位数字,但实际值是0到15。写00015是对的,写000016就错了,因为位地址只有两位。有些编程软件会自动补零,但手写地址表时容易多写一位。

2.3 输入输出通道的分配规则

输入继电器区有10个通道000~009,输出继电器区有10个通道010~019。CPU单元固定占用000、001作为输入,010、011作为输出。扩展单元从002开始按顺序分配输入通道,从012开始按顺序分配输出通道。

以CPM1A-40CDR-A CPU单元为例,它本身有24个输入点和16个输出点。24个输入点占用000通道的16个位和001通道的8个位,即00000~00015和00100~00107。16个输出点占用010通道的16个位,即01000~01015。

当连接一个CPM1A-20EDR扩展单元时,这个扩展单元有12个输入点和8个输出点。它的输入点占用002通道的00200~00211,输出点占用012通道的01200~01207。如果再连接第二个扩展单元,输入占用003通道,输出占用013通道,以此类推。

# CPM1A-40CDR-A + 3个CPM1A-20EDR扩展单元 # CPU单元输入: 00000-00015, 00100-00107 (24点) # CPU单元输出: 01000-01015 (16点) # 扩展单元1输入: 00200-00211 (12点) # 扩展单元1输出: 01200-01207 (8点) # 扩展单元2输入: 00300-00311 (12点) # 扩展单元2输出: 01300-01307 (8点) # 扩展单元3输入: 00400-00411 (12点) # 扩展单元3输出: 01400-01407 (8点)

这里的关键机制是:扩展单元的通道号不是随便设的,而是由CPU单元在初始化时根据扩展单元的连接顺序自动分配的。第一个扩展单元永远占002和012,第二个永远占003和013。如果中间某个扩展单元没接好,后面的通道号会错位,程序里写的00300可能实际对应的是第二个扩展单元而不是第三个。

2.4 内部辅助继电器区的使用边界

内部辅助继电器区有32个通道200~231,共512个位。这些位不直接对应外部端子,纯粹用于程序内部的逻辑运算。比如用一个20000表示“系统运行中”的状态,用20001表示“故障标志”,在梯形图里当中间继电器用。

但要注意,输入/输出继电器区中未被使用的通道也可以当内部辅助继电器用。比如CPU单元只用了000和001两个输入通道,那么002~009这些通道如果没有扩展单元占用,就可以在程序里当内部辅助位用。这种做法的风险是:一旦以后加了扩展单元,这些通道会被硬件占用,程序里原来的逻辑就会出错。所以正规做法还是用200~231,不要占用I/O区的空闲通道。

3. 特殊辅助继电器区SR:系统标志和用户程序的边界在哪里

3.1 SR区与IR区的地址连续性

特殊辅助继电器区(SR)占用通道232~255,共24个通道、384个位。SR区和IR区在地址空间上是连续的,232紧跟在231之后。这意味着从地址编码角度看,IR和SR是同一块数据区,CPU访问它们用的是同一套指令。

但功能上,IR区供用户程序使用,SR区由系统使用。SR区存放的是PLC运行过程中的各种标志位、功能设定值和当前值。比如高速计数器的当前值、中断计数器的设定值、模拟电位器的设定值,都放在SR区。

3.2 SR区前半部分的通道功能

SR区的前半部分232~251通常以通道为单位使用,每个通道有特定的系统功能。240~243是中断0~中断3的计数器设定值通道,244~247是中断0~中断3的计数器当前值通道,248~249是高速计数器的当前值通道。

这些通道的分配是固定的,不能随便改。比如你要用高速计数器,就必须去读248和249通道的值,不能自己另找一个通道来存。系统在初始化时已经把高速计数器的硬件逻辑绑定到了248和249,程序里只能通过这两个通道来访问。

# SR区通道功能分配 # 232-239: 系统标志位和状态信息 # 240-243: 中断0-3计数器设定值 # 244-247: 中断0-3计数器当前值 # 248-249: 高速计数器当前值 # 250-251: 模拟电位器0/1设定值

232~249这些通道在未使用指定功能时,可以作为内部辅助继电器使用。比如你没用中断功能,那么240~247就可以当普通的内部辅助位用。但250和251不行,这两个通道是模拟电位器的设定值通道,即使你不用模拟电位器,也不能当内部辅助继电器用。这是硬性约束,编程软件可能会允许你写25000,但运行时行为不可预期。

3.3 SR区后半部分的位功能

SR区后半部分252~255通常以位为单位使用,每个位有特定的系统功能。比如25200是高速计数器复位标志,25201是高速计数器启动标志,25300是强制输入刷新标志,等等。

这些位的特点是:有些是系统写、用户读,有些是用户写、系统读。比如25200高速计数器复位标志,用户程序可以把它置1来复位高速计数器,系统在下一个扫描周期会读取这个位并执行复位操作。而25300强制输入刷新标志,用户程序置1后,系统会在下一个扫描周期强制刷新输入。

理解这些位的读写方向很重要。如果你把一个系统写的位当成用户写的位来用,程序逻辑就会乱。比如25200是用户写系统读,你在程序里读25200的状态来判断高速计数器是否复位,读到的可能是你上次写的值,而不是系统实际的状态。

3.4 SR区使用的常见误区

最常见的误区是把SR区当成普通的内部辅助继电器区来用。比如用25200当中间继电器,程序里写“25200置1表示电机启动”。这样写编译能过,下载也能跑,但25200实际上是高速计数器复位标志,你置1的同时也复位了高速计数器。如果系统里正好用了高速计数器,就会出现莫名其妙的计数错误。

另一个误区是忽略SR区的通道功能分配。比如240~243是中断计数器设定值通道,你在程序里往240通道写了一个值,以为是在给某个内部辅助通道赋值,实际上是在修改中断0的计数器设定值。如果中断功能被启用了,这个值会直接影响中断行为。

4. 扩展单元的通道分配:为什么插槽顺序决定了地址

4.1 扩展单元的类型和I/O点数

CPM1A系列支持多种I/O扩展单元,常见的有20点、30点、40点等规格。以CPM1A-20EDR为例,它有12个输入点和8个输出点。输入点占用一个输入通道的12个位,输出点占用一个输出通道的8个位。

扩展单元的I/O点数决定了它占用多少个通道。20点单元占用1个输入通道和1个输出通道,40点单元占用2个输入通道和2个输出通道。CPU单元在初始化时会根据扩展单元的类型和数量,自动分配通道号。

4.2 通道分配的顺序规则

扩展单元的通道分配遵循“先输入后输出、按插槽顺序”的规则。第一个扩展单元的输入通道是002,输出通道是012;第二个扩展单元的输入通道是003,输出通道是013;第三个扩展单元的输入通道是004,输出通道是014。

这个规则看起来简单,但实际接线时容易搞混。比如你有一个40点的CPU单元和两个20点的扩展单元,CPU单元本身占用000、001输入和010、011输出。第一个扩展单元占用002输入和012输出,第二个扩展单元占用003输入和013输出。程序里写00200,对应的是第一个扩展单元的第一个输入点,不是CPU单元的第二个输入通道。

# 扩展单元通道分配示例 # CPU单元: 输入000,001 输出010,011 # 扩展单元1: 输入002 输出012 # 扩展单元2: 输入003 输出013 # 扩展单元3: 输入004 输出014 # 注意: 输入通道和输出通道是分开编号的 # 输入通道从000开始连续分配 # 输出通道从010开始连续分配

4.3 扩展单元未连接时的地址空洞

如果CPU单元和扩展单元之间没有连接好,或者某个扩展单元故障,CPU单元在初始化时可能检测不到这个扩展单元。这时候通道分配会出现空洞。比如第一个扩展单元没接好,第二个扩展单元被检测到了,那么第二个扩展单元会占用002和012,而不是003和013。

这种地址空洞会导致程序里的地址和实际硬件不对应。程序里写00300,以为对应的是第二个扩展单元,实际上第二个扩展单元占的是002通道,003通道是空的。这种问题在调试时很难发现,因为程序能跑,只是输入输出不对。

4.4 扩展单元的热插拔问题

CPM1A系列不支持热插拔。在PLC通电运行时插拔扩展单元,会导致CPU单元重新初始化通道分配,正在运行的程序可能会出错。正确的做法是断电后插拔扩展单元,上电后让CPU单元重新检测并分配通道。

有些工程师在调试时图方便,带电插拔扩展单元,结果程序跑飞了,查了半天以为是程序逻辑问题,最后发现是通道分配变了。这种坑踩过一次就记住了。

5. 避坑与排查:地址写错时程序会怎么表现

5.1 输入通道当输出通道用

现象:程序里写01000作为输入条件,下载后输入信号接了,但程序不动作。

原因:01000是输出通道010的第0位,不是输入通道。输入通道是000~009,输出通道是010~019。把输出通道的地址当输入条件用,程序读到的永远是输出刷新后的值,而不是外部输入信号。

解决:检查地址表,确认输入用000~009,输出用010~019。如果不确定某个地址是输入还是输出,看通道号的前三位:000~009是输入,010~019是输出。

5.2 扩展单元通道号错位

现象:程序里写00200作为第一个扩展单元的输入,但实际接在第一个扩展单元上的信号不响应,接在第二个扩展单元上的信号反而响应了。

原因:扩展单元的通道分配是按插槽顺序自动分配的,不是按物理位置固定的。如果第一个扩展单元没接好或者型号不对,第二个扩展单元会占用002通道。

解决:上电后检查CPU单元上的扩展单元检测指示灯,确认所有扩展单元都被正确识别。如果某个扩展单元没被识别,检查连接电缆和扩展单元电源。

5.3 SR区地址当普通中间继电器用

现象:程序里用25200当中间继电器,逻辑上应该只在某个条件下置1,但实际运行时25200经常自己变0。

原因:25200是高速计数器复位标志,系统会在特定条件下自动清零。你把它当普通中间继电器用,系统会覆盖你的写入值。

解决:查SR区地址表,确认哪些地址是系统专用的。232~249在未使用指定功能时可以用,250~251不能用,252~255是系统标志位,尽量不要当普通中间继电器用。

5.4 位地址超出范围

现象:程序里写00016,编译报错或者下载后行为异常。

原因:一个通道只有16个位,位地址范围是00~15。00016超出了位地址范围,实际上会被解释为001通道的第6位,或者直接报错。

解决:写地址时确认位地址在00~15之间。如果需要在通道之间跳转,用通道号加位地址的方式,比如00015之后是00100,不是00016。

5.5 内部辅助继电器区地址冲突

现象:程序里用20000表示一个状态,用20001表示另一个状态,但两个状态经常同时变化。

原因:20000和20001在同一个通道200里,如果程序里对200通道做了通道级操作(比如用MOV指令写200通道),会同时覆盖20000和20001。

解决:对内部辅助继电器区做通道级操作时要小心,确认不会覆盖到其他位。如果只需要操作单个位,用位指令(比如OUT 20000)而不是通道指令。

6. 从地址映射到扫描周期:内部资源设计的取舍

欧姆龙CPM1A的内部资源设计,核心取舍是“固定地址映射”和“灵活扩展”之间的平衡。输入输出通道固定从000和010开始,扩展单元按顺序占用后续通道,这种设计让地址和硬件有确定的对应关系,程序员不需要查表就知道00000是CPU单元的第一个输入点。但代价是扩展单元的通道号依赖于插槽顺序,一旦某个扩展单元没接好,后面的通道号会错位。

SR区的设计也是类似的取舍。系统功能(中断、高速计数器、模拟电位器)占用固定通道,用户程序只能通过指定地址访问这些功能。好处是系统功能的访问方式统一,不需要额外的配置指令。坏处是这些通道在未使用时虽然可以当内部辅助继电器用,但一旦启用系统功能,原来的程序逻辑就会出错。

从扫描周期的角度看,IR区的输入刷新和输出刷新是每个扫描周期自动执行的,而SR区的系统标志位是在特定条件下由系统更新的。这意味着程序里读SR区的位,读到的可能是上一个扫描周期的值,而不是当前周期的实时值。这种延迟在大多数应用里没问题,但在高速计数或者中断处理里,需要特别注意。

我一般会这么理解:CPM1A的内部资源地址表就像一张地图,每个地址都有明确的功能标注。写程序时先查地图,确认地址的用途和读写方向,再写逻辑。不要凭记忆写地址,也不要觉得“反正编译能过就行”。编译能过只说明语法正确,不代表运行时行为符合预期。

从那以后我每次写欧姆龙PLC程序,都会先把用到的地址列一张表,标注通道号、位地址、功能、读写方向,然后再写梯形图。这张表看起来麻烦,但能避免大部分地址相关的翻车。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询