
在自动化项目里串口设备永远比想象中多。变频器、温控表、智能电表、称重仪表甚至很多传感器和阀门定位器现场跑的还是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后缀不同接口数量和类型完全不一样买错了很麻烦。RJ71C241个RS-232通道 1个RS-422/485通道这是最常用的型号绝大多数现场串口设备是RS-485接口选它基本覆盖。RJ71C24-R22个RS-232通道适合两路都是走RS-232的设备比如老式条码枪、某些打印机。RJ71C24-R42个RS-422/485通道适合RS-485设备特别多、需要分两条总线的情况。我在一个项目里遇到过一台设备是RS-232的仪表另一批设备是RS-485的变频器用一台RJ71C24刚好分两个通道处理CH1接仪表、CH2接变频器总线。如果当初选成RJ71C24-R4那RS-232那一路还得外接转换器白白增加一个故障点。选型的时候还要注意每个通道的通讯速率上限。RJ71C24的RS-422/485通道最高支持到230.4kbpsRS-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或者AB接对方设备的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需要与对端设备完全一致数据位8Modbus-RTU固定8位校验位无校验/偶校验/奇校验多数设备默认无校验部分仪表默认偶校验停止位1或2校验位和停止位必须和对端一致从站号1~247从站模式下设置本机站号通讯超时1000ms左右主站模式下没有收到响应的判定时间关于校验位和停止位这里有一个细节值得注意很多现场表计的出厂默认参数是“偶校验停止位1”而PLC侧的默认可能是“无校验停止位1”。如果通讯调不通先去核对仪表侧的DIP开关或参数表确认实际的校验方式。我见过太多人拿软件读仪表参数时不注意校验位结果怎么调都通讯不上。3.2 从站模式参数详解从站模式下核心是把Modbus寄存器地址映射到PLC软元件上。GX Works3里在模块参数中找到“Modbus-RTU从站设置”里面可以配置寄存器映射表。这里的逻辑是这样的外部主站发送一个Modbus请求比如读保持寄存器地址0x0001RJ71C24收到后会根据这张映射表自动去对应的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变频器频率寄存器具体以变频器手册为准点数1PLC程序里通过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通道号CH1或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的项目要接串口设备照着这篇文章的配置顺序走一遍能少走不少弯路。