☰
欧姆龙PLC串行链接模式全解析:LR区共享内存实现多机低成本联动
2026/10/5 13:47:58 网站建设 项目流程

接手过不少用欧姆龙PLC做分布控制的现场,几乎每次都会遇到同一个问题:几台PLC各自运行得好好的,但彼此之间不沟通,数据要么靠硬接线传几个开关量,要么就干脆靠人工记录再录入。后来我在一个小型水处理项目里第一次认真用上欧姆龙的串行链接模式(Serial PLC Link),才发现欧姆龙CP1系列里藏着这么省事的功能——不需要写任何通信协议程序,几条设置加上梯形图直接读写,多台PLC之间就像共享了一块内存条。这篇文章把串行链接模式从底层机制、硬件接线、软件配置到实战坑点一次讲透,适合正在做多PLC联网项目、或者打算给老旧设备做简单数据互通的工程师参考。

1. 多台PLC联动的常规解法,为什么最后都绕回串行链接

1.1 硬接线、Modbus-RTU、无协议通信各自的问题

在没有串行链接这个概念之前,让欧姆龙两台PLC互相知道状态,通常只有三条路。

第一条路是硬接线。把A机的输出点接到B机的输入点,一个启动信号占一个点,一个故障信号再占一个点。如果只是传两三个开关量,这办法完全够用,但一旦状态量超过十个,柜子里的线就会乱成一团,PLC的I/O点数也被白白消耗掉。而且硬接线只能传ON/OFF,传不了温度、压力、频率这类数值,想传数据只能外加模拟量模块,成本一下子就上去了。

第二条路是Modbus-RTU通信。用触摸屏或者上位机做主站,轮询读取各台PLC,或者让其中一台PLC做主站,去读其他的从站。Modbus-RTU在跨品牌设备联网时几乎是标配方案,但在纯欧姆龙环境里有个隐形工作量:主站要自己写轮询指令,从站要把数据整理到保持寄存器区,指令超时、通信错误还要逐个处理。如果项目里有三台以上PLC,这套轮询逻辑写完测完,通常已经花掉大半个工作日。

第三条路是无协议串口通信,也就是欧姆龙著名的TXD/RXD指令。自由度最高,想怎么发就怎么发,但那等于从零开始设计一套帧格式、解析逻辑、重发机制,调试周期完全不可控。对绝大多数中小型项目来说,属于“会但是没必要”的方案。

1.2 串行链接模式省掉的是哪部分工作

串行链接模式和前面三条路的本质区别在于:它把“通信”这件事本身给隐藏了。

你不需要在主站程序里写任何发送指令,不需要在从站程序里写任何接收中断处理,只需要在PLC设置里把串口模式改为“串行PLC链接(主站/从站)”,然后像使用普通继电器区和数据区一样使用LR区(链接继电器区)。这些LR区会自动在每台PLC之间同步,A机写到LR区的内容,经过一个刷新周期就会出现在B机的LR区里。

我第一次用的时候觉得这东西有点像三菱的N:N网络,也有点像西门子的全局数据包通信,都是“自动交换内存区”的思路。但欧姆龙的串行链接模式更贴近小型PLC场景:一个主站最多带9台从站,主站轮询从站,每台从站不需要编程,只要开机上电就会自动加入链接。整个过程中你唯一要规划的事情就是:节点号怎么分配,以及每台PLC分到哪一段LR字。

下表是几条路的直观对比:

方案编程工作量传输内容典型刷新周期劣势
硬接线低开关量实时占I/O、线多、传不了数值
Modbus-RTU中高位/字100ms级(轮询)主站要写轮询逻辑、从站要整理寄存器
无协议TXD/RXD高任意帧取决于程序自研协议调试周期不可控
串行链接极低LR区位/字、DM字区一般10~60ms仅限欧姆龙PLC、刷新周期不如高速总线

所以如果你手里全是欧姆龙CP1H、CP1L、CP1E这一代PLC,又没有跨品牌通信需求,串行链接模式应该是第一优先级去考虑的方案,而不是绕到Modbus-RTU上面去做重复劳动。

2. 串行链接的底层逻辑:LR区就是一块共享内存

2.1 链接字的自动均分规则

串行链接模式里最核心的资源是LR区,也就是链接继电器区。CP1系列在串行链接模式下,LR区会被当作“共享内存”来使用,但这个共享是分段的:总链接字数除以节点数,每台PLC分到一段,段内地址由节点号决定。

举个例子:假设整条链接一共使用16个字的LR区,链路里有1个主站加3个从站,共4个节点。那么每个节点分到的字数就是16 ÷ 4 = 4个字。主站(通常节点号设0)使用LR00~LR03,从站1(节点号1)使用LR04~LR07,从站2(节点号2)使用LR08~LR11,从站3(节点号3)使用LR12~LR15。如果总字数除以节点数除不尽,余下的字就空置不分配,宁空也不重复分配。

这里有一个很关键的设计:每个节点只能修改自己分到的那一段,但可以读取整段LR区。也就是说,所有PLC都能看到全链路的数据,但只有数据的主人有权写入。这个规则不需要程序约束,硬件刷新机制本身就保证了这一点。

我当时在配置界面里看到这个分配规则时,第一反应是“这不就是一个多主站共享内存总线吗”。实际使用中你完全可以用这种思维去规划:每台PLC把自己的运行状态、关键参数、报警信息写进自己的段落,其他人要什么直接读对应段位就行。

2.2 写入权限与读取权限的不对等设计

很多人第一次用串行链接时会犯一个低级错误:在从站里直接往主站对应的LR地址写数据,以为这样就能把数据“送过去”。实际上在LR区里,你只能合法写入属于自己节点号的那一段;如果写了别的段,写入的内容会在下一个刷新周期被主站轮询下来的真实数据覆盖掉。

刚接触这个功能时,我在一台从站上试着往LR00(主站的段)MOV了一个数,结果在线监视LR区发现,数据保持了一瞬间就被冲掉了,一度以为链接不稳定。后来查了手册才明白,这个“只能写自己段位”的规则正是串行链接能保持数据一致性的根本原因——如果每个节点都能随意写全区,那共享内存在没有仲裁机制的情况下,必然出现数据互相踩踏。

正确做法是:从站有数据要给主站,就把数据写入从站自己的段位,比如从站1写LR04~LR07;主站有命令要给从站,就写主站自己的段位LR00~LR03,从站去读这一段。所有数据流都遵循“数据跟着节点号走”的原则,程序逻辑一下就清晰了。

2.3 刷新周期由什么决定

串行链接的数据同步不是实时的,而是主站以固定顺序轮询各个从站。主站发出轮询帧,从站响应,主站再把响应数据广播到所有节点,这个过程循环往复。刷新周期主要由三部分组成:链接总字数、节点数量、波特率。

链接字越多、节点越多,一轮完整轮询需要的时间就越长。实际体感上,16个链接字带4个节点,刷新周期大概在十几毫秒到几十毫秒这个量级,具体数值可以在CX-Programmer在线监视时通过观察LR区数据的变化跳动频率来估算。对水泵启停、阀门开关、温度压力采集这类工控场景,这个速度完全够用。但它不是为高速运动控制准备的,后面我会专门讲这个问题。

3. 接线层面对比:RS-232C与RS-422A选型、CIF01适配器、终端电阻

3.1 什么距离用什么物理层

串行链接模式可以通过RS-232C或RS-422A两个物理层来跑,选型逻辑很简单:看距离和台数。

RS-232C方案适合两台PLC近距离直连,比如同一个控制柜里主站和从站相距两三米,直接用串口线连起来就能跑。RS-232C的抗干扰能力和传输距离都有限,线长超过15米容易出问题,而且RS-232C本质是一对一的接口,虽然理论上用多口转换也能扩展,但实际项目中基本没人这么干。

RS-422A方案才是串行链接的主力场景。RS-422A是四线制差分信号,传输距离可以达到500米,抗共模干扰能力强,支持一主多从的拓扑结构,和串行链接模式“一个主站带多个从站”的需求天然匹配。CP1H和CP1L本体上带的是RS-232C口,要走RS-422A需要加一个欧姆龙的CP1W-CIF01适配器,拧在RS-232C口上就能把信号转成RS-422A差分信号。

我做那个水处理项目时,主站和两台从站分在两个电柜里,直线距离大概80米,中间还经过变频器附近,果断用了RS-422A方案,跑了两年没出过一次通信故障。如果当初图省事用RS-232C拉长线,估计早就被变频器干扰搞崩溃了。

3.2 四线制接线与终端电阻,最容易翻车的地方

RS-422A接线看起来简单,实际翻车率极高。CP1W-CIF01适配器上有一排接线端子,标注着RDA+、RDA-、SDA+、SDA-、SG这种信号名。接线逻辑是A机的发送端接到B机的接收端,B机的发送端接回A机的接收端,也就是SDA+接对方的RDA+,SDA-接对方的RDA-,四根线交叉成环。

真正容易出问题的是终端电阻。RS-422A链路两端(且只有两端)必须把终端电阻拨码开关拨到ON,中间节点必须保持OFF。终端电阻的作用是吸收信号在电缆末端产生的反射,防止波形畸变导致误码。

我见过一个现场,五台PLC做串行链接,总有一台从站不定时掉线,换了线缆换了适配器都没解决。最后用万用表量了每一个节点的终端电阻开关状态,发现有两台中间从站也把终端电阻拨到了ON,相当于链路里出现了三个终端电阻,信号反射点从一个变成了三个。把中间站的开关拨回OFF之后,问题彻底消失。这个坑在手册里只写了小小一行字,但实际项目中是最常见的故障源之一。

3.3 上电顺序、屏蔽线接地这类“小细节”

串行链接还有一个和硬件相关的软性要求:主站先上电启动后,轮询不到还没上电的从站,不会自动在从站上电后再补上,必须把主站重启一次或者重新进入运行状态,从站才会被纳入轮询。所以在设计设备送电流程时,尽量让所有从站先上电,主站最后上电;如果主站和从站共用一个总电源,那这个问题基本不存在,但分开供电的设备就要注意这个启动顺序。

屏蔽线接地也必须按规定做。RS-422A通信线要使用屏蔽双绞线,屏蔽层在电柜端单端接地,不能两端都接,更不能悬空。悬空的屏蔽层等于没屏蔽,变频器启动时通信误码率会肉眼可见地上升。我印象比较深的一个案例:现场反映通信偶尔中断,检查程序、节点设置都没问题,最后发现是RS-422A线缆的屏蔽层松脱悬空,一经重新接地焊牢,通信立刻恢复稳定。

4. 软件配置的完整步骤:CX-Programmer里的五处设置

4.1 主站配置流程,一个串口做两种用途

打开CX-Programmer,在工程树里双击目标PLC的“设置”,弹出PLC设置窗口。如果主站用的是CP1H本体上的RS-232C口,就进入“串口选项”标签页。把“通信设置”里的模式从默认的“上位机链接”改成“串行PLC链接(主站)”。

这里有一个很多新手会忽略的点:改成串行PLC链接模式之后,这个串口就不再响应上位机链接协议了。如果触摸屏原本是接在主站这个RS-232C口上的,改成串行链接后触摸屏会直接失联。所以规划时要提前确认:主站有几个串口、哪个口给触摸屏、哪个口走串行链接。如果只有一个RS-232C口,触摸屏就得改接到外设口,或者用带两个串口的型号,或者干脆把触摸屏降级为只走串行链接从站的LR区数据。

主站侧的“串行PLC链接”设置里需要指定本节点号,通常设0号。还要设置链接字数,一般选16字或32字。链接字数直接决定每台PLC能分配到多少共享数据空间,按项目实际需要来,不是越多越好,因为字越多刷新周期越长。

4.2 从站配置流程与节点号规划的关键

从站的设置同样是进入PLC设置里的串口选项,模式选择“串行PLC链接(从站)”。每个从站都要设置一个唯一的节点号,从1开始依次排下去,不允许重复。节点号一旦重复,主站轮询时就会出现数据错乱,而且这种错乱在程序里极难发现,因为它不是报错的错乱,是数据张冠李戴的错乱。

我在项目里习惯做一张节点号分配表,贴在电柜门内侧。哪怕只有三台PLC,也照样贴。因为调试周期一长,很容易忘掉哪台从站设的是几号节点,到时候拿笔记本往柜子前一蹲,翻设置翻得满头大汗。

从站的链接字数设置必须和主站保持一致,如果不一致,主站按照自己的字数规划去轮询,从站按自己的字数去解析,分配段位就会错位,读出来的数据完全是乱的。这是配置类问题里排查成本最高的一个,因为没有任何报错提示。

4.3 设置生效的关键:必须断电重启

串行链接模式相关的PLC设置,在CX-Programmer里下载到PLC之后,不会像梯形图程序那样立刻生效。PLC设置里的串口模式属于系统级参数,修改之后必须把PLC断电再重新上电,或者至少执行一次“将设置转化为运行模式”的操作,具体看PLC型号和软件版本。最保险的做法是:下载完设置后直接给PLC断电重启,然后在线看CX-P的串口监控确认模式已经切换。

很多人下载完设置发现通信没反应,第一反应是检查接线,其实往往只是没重启。我在最早调试时也犯过这个毛病,设置改了好几次,PLC一直没断电,所有修改都是“已下载但未生效”的状态,白白花费了半个多小时排查硬件。

下面是一个典型配置表,1主3从,4个节点,LR区16字:

节点PLC角色节点号占用的LR区段用途
主站CP1H0LR00~LR03下发命令、汇总状态
从站1CP1L1LR04~LR07加药泵状态、故障码
从站2CP1L2LR08~LR11阀门位置、流量值
从站3CP1L3LR12~LR15风机频率、手自动模式

5. 梯形图里收发数据的套路:谁写谁读、怎么写才不会被覆盖

5.1 基本读写:MOV指令直接面向LR区

串行链接模式下,梯形图里用到的读写指令和普通数据区操作完全一样。主站要把D100里的数据发给从站1,直接写一条MOV指令,把D100传送到LR04即可。因为LR04属于从站1的分配段,主站虽然没有写入LR04的“实际数据权”,但主站的写入会被自动同步到从站1的LR04里?

这里需要澄清一下:主站的程序实际上是可以写整个LR区的,但写入非本节点段位的内容会被刷新机制覆盖,也就是“能写但写不持久”。所以在正规用法里,主站永远只往自己的段位LR00~LR03里写数据,从站读了这段,就等于收到了主站的数据。同理,从站1往自己的LR04~LR07里写数据,主站从LR04~LR07读取,就完成了从站1到主站的上传。

梯形图助记符看起来就是这样:

主站侧——把命令字写入自己的LR段,从站会看到:

MOV D200 LR00 ; 把主站的命令字写到LR00,从站读LR00即可

从站1侧——把运行状态写到自己的LR段,主站会看到:

MOV D50 LR04 ; 从站1的运行状态/故障码写到LR04

然后主站侧随时可以读LR04、LR05这些地址,数据就是从站1上送上来的最新值。

位数据更直观,主站程序要判断从站1有没有“运行中”信号,直接写:

LD LR04.00 ; 读取从站1LR04的第0位 OUT W0.00 ; 映射到主站内部继电器

你会发现整个过程里没有任何通信指令,没有TXD,没有RXD,没有Modbus读写的轮询逻辑,数据就像PLC内部数据区一样直接被梯形图使用。这是串行链接最大的魅力。

5.2 主站汇总触摸屏的架构示例

实际项目里,我最常用的架构是“主站承担通信枢纽”模式。整个系统里所有PLC通过串行链接组网,但只有主站和触摸屏(或上位机)建立上位机链接或者以太网通信。触摸屏只面对主站,主站程序负责把各从站的LR区数据搬运到主站的CIO区或DM区,供触摸屏组态画面直接使用。

比如从站1的LR04~LR07里,LR04.00是运行状态,LR04.01是故障状态,LR05~LR06是流量值(双字)。主站梯形图每隔几十毫秒扫描周期,把这些位和值搬到主站的W区和D区:

LD LR04.00 OUT W0.00 ; 运行状态映射到主站W0.00 LD LR04.01 OUT W0.01 ; 故障状态映射到主站W0.01 MOVL LR05 D100 ; 流量值搬运到主站D100

触摸屏组态直接绑定W0.00、W0.01、D100这些主站地址,想要监控哪台从站的数据,只需要在主站程序里做类似的“数据搬运”梯形图,再刷新触摸屏画面。这样做的好处是后续加从站时,触摸屏侧几乎不需要改动,所有地址规划都在主站梯形图里完成。

5.3 数据更新的时序陷阱:程序写入与自动刷新的冲突

用LR区最隐蔽的坑是“程序写入的频率”与“串行链接刷新频率”之间互相打架。

举个例子:主站每一扫描周期都无条件执行MOV D200 LR00,如果D200的值本身有变化,这种写法没问题。但如果你是想把主站的某个状态一直保持某个值,等外部条件改变时再更新,那就要小心了——每一周期执行MOV,和串行刷新机制叠加,不会产生什么冲突,但这种写法掩盖了一个问题:如果哪天你把两条MOV的顺序写反了,本来想“先读取再修改”,结果变成“先覆盖再读取”,数据就会在每次扫描周期里被自己的程序覆盖。LR区的刷新是独立于扫描周期进行的,程序对它做的任何写操作,都会被下一轮刷新周期广播出去,而外部节点改写本节点段位的内容,又会在刷新周期里被真实所有者的数据覆盖回来。

所以有一条铁律:每个节点在自己的LR段位上的写入动作一定要有明确的触发条件,不要无脑每周期无条件写入。我的习惯是给每个需要下发的数据配一个“更新允许”位,只有更新允许位为ON的那一拍才执行MOV,平时一律不写。这样即使调试时出现了覆盖问题,排查范围也小得多。

6. 实测中的延迟、失联与排查:三个一定要提前知道的坑

6.1 刷新周期到底有多快?别拿它当高速总线

串行链接模式在欧姆龙官方手册里描述的是“用于PLC之间的远距离I/O数据交换”,这句话翻译成人话就是:它不是高速现场总线。16个链接字、4个节点的配置下,一轮完整轮询在二三十毫秒的级别是正常的,这个数字会随链接字数和节点数增加而变大。

我做过一次实测:1主4从,LR区32字,在线观察LR区一个字的数值跳变时间,大概在四十多毫秒到六十毫秒之间抖动。对这个刷新速度,水处理、暖通、环境监控这类过程量系统完全没有压力,但如果你打算用串行链接在两台PLC之间做快速联锁或者轴同步控制,那想都不要想,必须考虑CC-Link或者EtherCAT这类真正的高速总线。

判断标准很简单:如果两台PLC之间的数据交换周期要求小于10毫秒,就不要用串行链接。要是大于20毫秒,串行链接的性价比和易用性几乎吊打同级别的其他方案。

6.2 从站失联为什么查了一天,最后发现是终端电阻

前面提到了终端电阻导致的不定时掉线问题,这里把完整的排查链路拆开讲。那个现场是5台CP1H做串行链接,报修说从站4每隔一两个小时掉一次线,主站收不到它的数据。一开始以为是程序问题,在线看主站轮询帧,发现轮到从站4时偶尔无响应,然后整个轮询周期会暂停大概几百毫秒,恢复正常后又继续跑。

按照经验,第一个怀疑对象是通信线缆的接头,检查了所有接线端子,紧固了一遍,问题依旧。然后怀疑从站4的串口硬件,把从站4和从站5互换节点号试机,结果掉线问题跟着从站4的物理位置走,说明问题出在那个位置,不是PLC本身。互换之后依然掉线,说明也不是单台PLC坏了。

后来用示波器看RS-422A差分管脚上的波形,发现在发往从站4的波形尾部有明显的振铃,幅度还不小。顺着这条线查下去,才发现从站4这个中间节点的终端电阻拨码不知道什么时候被拨到了ON——很可能是有维护人员清理柜子时碰到了。链路两端加中间共3个终端电阻,信号反射叠加在一起,数据波形畸变,导致偶发误码掉线。

把从站4的终端电阻拨回OFF之后,连续跑了72小时没再掉过线。这次排查让我对“终端电阻只允许两端ON”这句话有了极其深刻的体会。调试任何RS-422A链路时,先花两分钟用万用表或者目视检查所有节点的终端电阻状态,能省掉后面一整天的痛苦排查。

6.3 数据一致性的保护技巧:批次号和字内打包

由于刷新周期不是瞬时完成的,不同段位的数据在不同时刻被更新,如果主站需要一次性读取从站上报的多个数据(比如一个温度值再加一个对应的报警标志),就要注意数据一致性——可能主站读到温度值已经更新到最新,但报警标志还是上一轮的旧值,两个数据来自不同批次。

对于精度要求不高的场景,这种跨周期的不一致几乎无感,但某些关键联锁逻辑就不能接受。我提供两个最简单的保护办法。

第一个办法:字内打包。把一个从站需要联动上报的若干状态全部打包进一个字里,比如LR04的低8位存8个状态位,高8位留给后续扩展。由于一个字(16位)在同一个刷新周期内整体更新,主站读取这个字时不会发生“半新半旧”的情况。这个方法最常用,也最容易实现。

第二个办法:批次号。从站每更新一组数据,就同时把一个递增的计数器值写到LR区的某个固定字里。主站先读取批次号,再读取数据,如果发现批次号变了,说明数据正在更新中,等下一轮再取;如果批次号连续两次读到相同值,说明数据已经是稳定状态,可以放心使用。这个方法实现略复杂,但能彻底解决一致性顾虑。

我个人的习惯是:位状态尽量用字内打包,数值类数据本身不追求和其他数据的绝对同步,非关键联锁不引入批次号,保持程序简洁。

6.4 调试阶段的一个高效做法

最后分享一个调试技巧:CX-Programmer在线状态下,打开视图里的“内存”窗口,切换到LR区,直接在线监视各个分配段位的变化。我一直用这个办法查看主站是否收到从站的数据、从站是否执行了主站的命令,比在梯形图里到处放监视变量快得多。

另外,如果从站程序里有LR区相关的写入指令,我会在调试时暂时把它们全部禁能,改为在内存窗口里手动写入测试值,用来确认通信链路本身是否正常。当链路的数据通道确认无误后,再开放程序写入。这样把“通信问题”和“程序问题”彻底分开排查,能大幅缩短调试时间。

我们实际调试串行链接时还有个从站失联的场景很典型:某台从站断电检修后再上电,主站就再也收不到它的数据了,必须把主站也重启一次才能恢复。后来我在主站程序里加了一个“通信超时复位”逻辑:利用系统定时器监控LR区各从站段位的心跳位,如果超过设定时间没有翻转,就通过程序自动重启主站串口或者提示操作员断电重启主站,把这个偶发问题从“现场故障”变成了“可自愈事件”。

用到现在,串行链接模式在我心里就是欧姆龙CP1系列里性价比最高的通信功能之一。它的适用边界很清晰:纯欧姆龙环境、数据量不大、刷新要求不高、希望省掉通信编程工作量。在这条边界内,它比Modbus-RTU省心得多,比无协议通信稳定得多。但要是项目里出现了跨品牌PLC通信,或者必须要毫秒级以下的同步速度,那还是老老实实按数据量、实时性去选型现场总线。说到底,没有最好的通信方案,只有最合适当前场景的那一个。

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

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

立即咨询