在自动化项目里,串口设备永远比想象中多。变频器、温控表、智能电表、称重仪表,甚至很多传感器和阀门定位器,现场跑的还是Modbus-RTU。而CPU侧是三菱iQ-R的时候,RJ71C24就是我手里最顺手的串口通讯模块。如果你已经习惯了用iQ-R的以太网口做Modbus TCP,第一次转过来做Modbus-RTU时,多少会在模块参数和缓冲存储区那里卡一下。这篇内容,我按自己实际干活时的顺序,把RJ71C24做Modbus-RTU通讯的选型、接线、组态、程序、排错全流程拆开来讲,能直接照着操作。
1. 为什么选RJ71C24做Modbus-RTU:选型前的几个判断依据
1.1 RJ71C24系列型号差异
iQ-R系列的串行通讯模块,名字很容易搞混。RJ71C24、RJ71C24-R2、RJ71C24-R4,后缀不同,接口数量和类型完全不一样,买错了很麻烦。
- RJ71C24:1个RS-232通道 + 1个RS-422/485通道,这是最常用的型号,绝大多数现场串口设备是RS-485接口,选它基本覆盖。
- RJ71C24-R2:2个RS-232通道,适合两路都是走RS-232的设备,比如老式条码枪、某些打印机。
- RJ71C24-R4:2个RS-422/485通道,适合RS-485设备特别多、需要分两条总线的情况。
我在一个项目里遇到过一台设备是RS-232的仪表,另一批设备是RS-485的变频器,用一台RJ71C24刚好分两个通道处理,CH1接仪表、CH2接变频器总线。如果当初选成RJ71C24-R4,那RS-232那一路还得外接转换器,白白增加一个故障点。
选型的时候还要注意每个通道的通讯速率上限。RJ71C24的RS-422/485通道最高支持到230.4kbps,RS-232通道为115.2kbps。常规Modbus-RTU跑9600或19200,基本没有瓶颈。但如果现场有大量数据轮询,建议一开始就规划好波特率,尽量用38400以上,减少主站轮询周期。
1.2 明确主从角色再谈协议配置
RJ71C24支持两种Modbus-RTU工作角色:主站和从站。这一点必须在项目设计阶段就确定,因为它直接影响后面的参数设置和PLC程序写法。
- 主站模式:RJ71C24所在的PLC主动发起请求,去读取或写入现场从站设备(变频器、仪表等)的数据。这种场景最普遍,PLC作为控制核心去管理现场设备。
- 从站模式:RJ71C24所在的PLC作为Modbus从站,等待外部主站(如触摸屏、上位机SCADA、DCS系统)来读写自身的寄存器。这种场景在设备配套、OEM单机、改造项目里很多,上位机来要数据,PLC只管响应。
我遇到不少人第一次做的时候,上来就在GX Works3里找Modbus设置,结果找不到对应项。原因往往是没先把模块的智能功能模块参数和通讯协议这两层区分开。RJ71C24的Modbus-RTU功能,是在模块的“通讯协议设置”里单独选择的,不是说模块装上后默认就能用。这个细节后面第3节详细说。
判断依据很简单:你的PLC是主动方,就是主站;PLC是被动响应方,就是从站。这个不要凭感觉,先和项目工艺负责人确认上位机侧的通讯方式,再从站做起往往最稳妥。
2. 硬件接线:RS-485细节决定通讯成败
2.1 端子定义与A/B线连接
RJ71C24的RS-422/485通道通常是15针的D-sub接口,不是直接接线端子。这一点和很多国产PLC的插拔式端子不同,第一次做的人容易在接口上犯嘀咕。
实际连接时,需要配一个三菱的串口接头(型号是RJ45型还是D-sub型,看模块上的标注),把模块的通讯针脚引出来。在RS-485半双工接法下,需要关心4个信号:SDA、SDB、RDA、RDB,还有SG信号地。
半双工RS-485接线有一个固定套路:把模块的SDA和RDA短接在一起,作为A信号(通常对应D+);把SDB和RDB短接在一起,作为B信号(通常对应D-)。然后在外部,A接对方设备的D+(或者A),B接对方设备的D-(或者B)。
注意,不同厂商设备对A/B的定义并不统一。有些设备标D+/D-,有些标A/B,还有些标485+/485-。正规做法是拿万用表查一下设备端口的定义,或者看设备手册上的电平定义。一般来说,A对应反相端(B-),B对应同相端(A+),但这规则偶尔会被某些国产仪表打破。
2.2 终端电阻、SG端和屏蔽层处理
RS-485总线在长距离通讯时,终端电阻是必须考虑的。RJ71C24模块上有一个终端电阻设定开关或内建电阻跳线,位置一般在模块正面或侧面。当设备位于总线最末端时,把这个开关打到“TERM”位置,就会在模块内部并上一个120Ω的电阻;如果设备在总线中间,则必须保持“OPEN”状态。
很多人忽略的是SG信号地。RS-485看起来是两根线通讯,但背后的共模电压问题很常见。如果通讯线比较长、现场变频器又多,不接SG的话,偶发超时和乱码的概率会明显增加。我现在的习惯是:三芯屏蔽线,A、B、SG都接上,屏蔽层单端接地。这样做之后,在变频器柜旁边通讯稳定了很多。
屏蔽层接地需要讲究一点:只能单端接地,不要在两端都接。两端接地容易形成地环路,反而引入干扰。通常选择在PLC这一端接地。
如果现场设备分布非常分散,比如一个车间里好几台变频器在不同角落,建议总线上不要串太多节点。一般一条RS-485总线上挂32个节点是理论值,但实际挂到十几个之后,通讯速度会明显下降。这时候可以考虑分成两条总线,或者用带光耦隔离的RS-485中继器。
3. GX Works3中的智能功能模块参数配置
3.1 模块组态与通讯协议设定
RJ71C24的配置是在GX Works3里完成的,不是GX Works2。iQ-R系列PLC必须用GX Works3,这一步很多从Q系列转过来的人容易搞混。
在工程导航窗口里,[模块配置]中先添加CPU和RJ71C24。模块的起始I/O号可以在配置里看到,默认一般是0000或取决于插槽位置,记下这个I/O号,后面程序里要用。
接着双击[智能功能模块]节点下的RJ71C24,打开[模块参数]——[串行通信模块]——[通信设置]。在这里要设置的东西不少:
| 参数项 | 常用设置 | 说明 |
|---|---|---|
| 通信协议 | Modbus-RTU | 模块支持MC协议、无顺序协议、Modbus-RTU等,这里选Modbus-RTU |
| 主站/从站 | 主站或从站 | 按实际角色选择 |
| 波特率 | 9600/19200/38400 | 需要与对端设备完全一致 |
| 数据位 | 8 | Modbus-RTU固定8位 |
| 校验位 | 无校验/偶校验/奇校验 | 多数设备默认无校验,部分仪表默认偶校验 |
| 停止位 | 1或2 | 校验位和停止位必须和对端一致 |
| 从站号 | 1~247 | 从站模式下设置本机站号 |
| 通讯超时 | 1000ms左右 | 主站模式下没有收到响应的判定时间 |
关于校验位和停止位,这里有一个细节值得注意:很多现场表计的出厂默认参数是“偶校验,停止位1”,而PLC侧的默认可能是“无校验,停止位1”。如果通讯调不通,先去核对仪表侧的DIP开关或参数表,确认实际的校验方式。我见过太多人拿软件读仪表参数时不注意校验位,结果怎么调都通讯不上。
3.2 从站模式参数详解
从站模式下,核心是把Modbus寄存器地址映射到PLC软元件上。GX Works3里,在模块参数中找到“Modbus-RTU从站设置”,里面可以配置寄存器映射表。
这里的逻辑是这样的:外部主站发送一个Modbus请求,比如读保持寄存器地址0x0001,RJ71C24收到后,会根据这张映射表,自动去对应的PLC软元件地址读取数据,然后组织响应报文回给主站。整个过程不需要PLC写程序,模块自动处理。
映射表的配置项通常包括:
- Modbus寄存器起始地址(0x0000开始)
- 对应的PLC软元件(D、M、R等),以及起始地址
- 点数(连续多少个地址)
举个例子,把Modbus保持寄存器地址0x0000~0x0063(即0~99)映射到D0~D99,那外部主站读地址0x0001,读到就是D1里的值。写操作同理,主站写0x0002,写进去的数据就存到D2里。
这里有一个容易踩的坑:Modbus保持寄存器地址是三菱的“0000H起始”的偏移地址,但有些主站上位机软件显示的是“40001起始”的Modbus标准地址。也就是说,上位机上看到的40001,实际对应的是偏移地址0x0000。如果你在映射表里把首地址写成了1,那反而会对不上。这个映射偏移问题,联调时最常引发“数据整体错一位”的奇怪现象。
3.3 主站模式的关键参数
主站模式配置比较麻烦,需要设置轮询请求帧。GX Works3里,在主站模式下可以配置多条Modbus请求,每条请求定义一个从站号、功能码、读取起始地址和点数。
以读变频器运行频率为例,一条典型的请求配置是:
- 从站号:1
- 功能码:03(读取保持寄存器)
- 起始地址:0x1000(变频器频率寄存器,具体以变频器手册为准)
- 点数:1
PLC程序里通过MBREAD指令触发这条请求。模块收到指令后,自动组帧、发送、等待响应、校验CRC、把数据存到指定寄存器。如果超时无响应,通过指令的状态位可以判断。
在这里建议轮询数据的点数不要贪多。有些人习惯一次读几十个寄存器,觉得省时间。实际上Modbus-RTU帧太长的话,除了增加单帧传输时间,还可能触发某些设备对报文长度的限制,反而不稳定。一个合理的设计是:把连续地址的数据按功能分组,每组不超过8~16个寄存器,分多次轮询。
4. 缓冲存储区地址映射与读写程序编写
4.1 从站模式的缓冲存储区与软元件映射
从站模式下,PLC程序里要做的事情并不多,重点是把模块参数里的“自动刷新”配置弄清楚。
RJ71C24内部有一块缓冲存储区(BFM),外部主站看到的数据本质上是这个缓冲存储区的内容,或者是根据映射表实时去读PLC软元件。在GX Works3里,可以在“智能功能模块参数”中配置自动刷新,把BFM区域和CPU软元件绑定在一起。
自动刷新的配置路径一般是在模块参数里的“刷新”选项卡,把指定的BFM起始地址映射到D区。配置后,PLC每个扫描周期会自动同步数据,完全不需要写FROM/TO指令。这一点比Q系列方便很多,Q系列很多场合还得靠FROM指令去读BFM。
但要注意,自动刷新也有一个隐含的延迟:从外部主站写入数据到PLC真正看到数据,中间有一个扫描周期级别的延迟。对于一般的监控、设定值下发场景完全够用,但对于要求毫秒级响应的场合(比如快速运动控制参数的在线修改),必须考虑这个延迟。我做过一个设备,上位机要下发几十个配方参数,PLC侧每个扫描周期刷新,实测延迟在几毫秒以内,完全无感。
从站模式下,PLC程序侧通常只需要做两件事:
- 把需要上报给上位机的数据,实时写入映射的D区。
- 上位机写下来的数据,在PLC里做合法性判断后再投入使用。
这里有一个安全性的建议:上位机下发到D区的数据,不要直接拿去控制设备,先做范围判断和互锁校验,比如运行频率只能在0~50Hz之间,超限就按默认值处理。现场通讯时不时会有干扰导致偶发错误数据,这一层判断能挡住大部分风险。
4.2 主站模式用MBREAD/MBWRITE读取从站数据
主站模式的PLC程序,核心是MBREAD和MBWRITE两条指令。在GX Works3的指令列表里,路径在[指令]→[智能功能模块]→[串行通信模块]下。
MBREAD指令用于读取从站数据,参数上需要指定:
- 模块起始I/O号(Un):比如U0表示起始I/O为0000
- 通道号(CH):1或2
- 请求号或控制数据首地址
- 接收数据的软元件首地址
- 站点号及功能码等信息
实际编写时,GX Works3的指令助手会弹出向导,按向导逐项填写比手写指令方便得多。指令执行完成或超时后,通过完成标志或状态寄存器来判断通讯结果。
一个实用的做法是给每条MBREAD/MBWRITE指令配一个“执行完成”和“通讯错误”的状态位。程序中用轮询方式逐个触发:先读第1台变频器,等它执行完成后再读第2台……全部读完后再从头开始。不要在同一个扫描周期把两条MBREAD同时置ON,那样可能在通道上产生请求冲突。
实测下来的经验是:一条RS-485总线上挂5台变频器,每台读取2个寄存器(频率和电流),用9600波特率,一个完整轮询周期大概在150ms左右。如果觉得太慢,先看波特率是不是被设成了9600,改成38400后轮询周期能缩短到40ms以内,体感明显。
如果从站设备数量很多,建议分通道处理。RJ71C24有CH1和CH2两个通道,一个通道挂一路RS-485总线,主站程序里并行处理两路请求,效率会提升很多。
5. 联调时踩过的坑与排查思路
5.1 完全无响应:接线和参数的最快验证方法
联调时最常见的现象是:PLC向设备发送请求,设备一点反应都没有。RJ71C24模块面板上有通讯指示灯,CH1/CH2通道的发送(SD)和接收(RD)指示灯在通讯时会闪烁。如果发送灯亮、接收灯不亮,问题基本可以锁定在对方设备没有收到请求或者没有回复。
这时候先不要急着改程序,按这个顺序排查:
- 确认模块配置下发无误。修改模块参数后必须“参数写入”并复位CPU,让配置生效。我有一次调了半天,发现之前下发的配置被后续的PLC程序覆盖了,模块其实还在用默认参数跑。
- 核对设备侧站号。把Modbus调试工具(比如Modbus Poll)接到同一条总线上,手动发一帧,看看设备是否响应。如果工具能读到数据而PLC不行,大概率是PLC侧站号或功能码配错了。
- 用万用表量一下A/B线之间的电压。正常RS-485通讯,空闲状态时A与B之间的电压差应该在1.5V~5V左右。如果量到0V,可能是A/B接反,或者设备没有上电。
- 确认设备侧的通讯参数。很多仪表面板上能查看当前波特率、校验位。设备手册里写的“默认值”未必是设备当前的设置,被人改过的情况很常见。
一个非常实用的技巧:用USB转RS-485的调试线,加上Modbus Poll/ModScan这类软件,先把单台设备调通,再切换到PLC去通讯。这样能把“设备问题”和“PLC问题”隔离。我做过一个项目,设备厂家坚持说他们的仪表通讯没问题,结果我用调试软件一读,发现仪表被之前的人设置成了从站地址5,而PLC配置的是从站1,当然完全不通。
5.2 数据错位或大小端问题
通讯通了,但读上来的数据不对,这属于第二类高发问题。常见的有:
- 寄存器偏移:仪表手册里写频率寄存器地址是40001(相当于偏移0x0000),但你在PLC里用了地址1去读,读回来的数据其实是别的寄存器。遇到数据“看似正常但完全对不上”的情况,先把寄存器地址按偏移量重新换算一遍。
- 数据大小端:Modbus规定多字节数据是高字节在前(大端模式),但有些仪表厂商直接在寄存器里放了小端数据。如果读上来的32位浮点数出现类似“1.5读成了某个天文数字”的情况,多半是大小端问题。解决方法是在PLC程序里做字节交换,GX Works3里有现成的WOVA? 实际上用MOV和字节交换指令组合就能处理。
- 数据类型长度不对:读上来的数据是16位有符号、16位无符号、32位浮点还是32位整型,必须和设备手册严格对应。很多仪表的数据是32位浮点格式,占2个连续寄存器,如果按16位去读,数据看起来就是乱的。
排查大小端问题有个笨但可靠的方法:给设备设置一个已知的数值,比如让变频器给定频率为10.00Hz,把PLC读到的原始寄存器值转成16进制打印出来,对照设备手册里的数据格式,就能看出字节顺序了。
5.3 偶发超时与数据抖动:干扰问题
系统运行一段时间后,偶发出现通讯超时或某一次读到的数据明显错误,这是RS-485现场最常见的干扰问题。
解决思路按优先级排列:
- 检查接地:SG线有没有接?屏蔽层是否单端接地?PLC和设备的电源地是否可靠?接地问题是最隐蔽的干扰源。
- 降低波特率:如果现场干扰严重,38400跑不稳就降到19200,再不行就9600。波特率降低一半,稳定性提高的幅度是肉眼可见的。
- 检查总线的终端电阻:一条总线只在两端各需要一组120Ω终端电阻,如果中间某个设备内部也带了终端电阻,就会导致总线电平异常,偶发通讯失败。这也解释了为什么有时候“把所有设备都收了,就剩一台,反而通讯不稳”——那一台凑巧在总线中间位置却开了终端电阻。
- 通讯线尽量远离动力线:现场走线如果实在避不开变频器输出线,至少保持20cm以上间距,并采用双绞屏蔽线。
5.4 用串口调试助手做一个最小化通讯测试
最后分享一个我自己一直在用的调试流程。每次做完RJ71C24的配置,不要急着直接连设备,先用一个“最小化测试”验证模块本身工作是否正常。
具体做法是:把RJ71C24的A/B线直接短接在一起(自收自发模式),然后在PLC里触发一条MBREAD指令指向本模块的从站号。如果模块通讯链路正常,它发送的报文会直接进入自己的接收端,反馈一个正确响应。这个测试能快速确认模块的硬件、通道、波特率配置是否正常,后面再去交联外部设备时,心里就有底了。
如果没有条件做自收自发,也可以用一个RS-485转USB调试线接在电脑上,用Modbus Slave软件模拟一台从站设备,让PLC作为主站去读电脑上模拟的数据。这样可以在没有真实设备的情况下,先把整条PLC通讯程序和模块配置跑通,去现场前的调试信心会高很多。
最后再分享一个经验之谈:Modbus-RTU调试,绝大多数问题不在协议本身,而在接线和参数一致性。第一次做的时候把RJ71C24的面板指示灯当作最主要的判断工具——发送灯、接收灯各代表什么,出现什么组合说明什么阶段出了问题,看懂了它,调试思路就清晰了一半。如果你手头正好有iQ-R的项目要接串口设备,照着这篇文章的配置顺序走一遍,能少走不少弯路。