欧姆龙PLC串行链接模式全解析:LR区共享内存实现多机低成本联动

发布时间:2026/10/5 13:48:13
欧姆龙PLC串行链接模式全解析:LR区共享内存实现多机低成本联动 接手过不少用欧姆龙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接对方的RDASDA-接对方的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通信或者必须要毫秒级以下的同步速度那还是老老实实按数据量、实时性去选型现场总线。说到底没有最好的通信方案只有最合适当前场景的那一个。