简介:一份面向三菱Q系列PLC初学者与现场调试人员的MODBUS通信实例文档,围绕QJ71C24N串口模块展开,帮助读者理解模块配置、协议支持功能设置及G.CPRTCL指令的使用方法。压缩包内共1个doc文件,约854KB,以图文步骤、参数说明和变频器读取案例组织内容,涵盖GX WORK2工程建立、CH2通信协议与通信速度设置、软元件批量配置、模块写入及通讯接线等要点。文档结合安川A1000变频器给出输出频率与电压读取示例,并解释Un、n1、n2、(S)、(D)等指令参数含义,便于对照现场设备排查通信问题。已有6752人学习,适合需要快速上手QJ71C24N MODBUS RTU通信、查阅配置细节与案例参考的工程技术人员。
1. QJ71C24N 跑 MODBUS RTU:从一块串口模块到一条能通的链路
产线上要读一台变频器的输出频率和母线电压,PLC 侧只有一个 Q 系列 CPU 加一块 QJ71C24N 串口通信模块,边上没有网关、没有多余网口。这种活儿的常规解法就是让 QJ71C24N 直接跑 MODBUS RTU,PLC 当主站、变频器当从站,一根两线 485 把数据拉回来。
QJ71C24N MODBUS 通信实例看起来简单:组态、建协议表、调 G.CPRTCL、从 D7002 附近取数。真正让人卡住的往往是最前面半步——智能功能模块的起始 XY 地址填错一位,后面所有软元件跟着错位,程序写得再漂亮也只是对着空气发数据。这份实例的价值在于把这整条链路串起来:模块挂载、协议表、控制数据区、读写程序、接线联调,适合手上已有 Q 系列硬件、需要跟变频器或仪表做串口对接的电气与自动化从业者,也适合第一次碰通信协议支持功能、想看清楚 G.CPRTCL 到底怎么用的人。
2. GX Works2 组态:起始 XY 地址、CH2 协议与波特率三项对齐
2.1 先定槽位和起始 XY 地址,这是后面所有地址的根
打开 GX Works2,新建工程,CPU 型号按实际填(例子是 Q00UJ),工程树里右键"智能功能模块",弹出的安装位置设置要按硬件实际情况选——模块插在哪个槽就填哪个槽,不要照抄教程里的编号。设完槽位之后,软件会给模块分配一段起始 XY 地址,本例是 0090,也就是模块占 X90~X9F 十六点输入、Y90~Y9F 十六点输出。
这个号必须记牢,因为它在三个地方要完全一致:程序里 G.CPRTCL 的 Un 参数、TOP 指令的目标模块、以及模块参数窗口里显示的模块号。后面换槽位、加模块、改底板,这个号会重新分配,而程序里的 Un 不会自动跟着变,不改就是全盘错位。
提示:紧凑型 CPU 的可用槽位有限,扩展底板上的模块编号是连续排下去的,别只看 CPU 本体上插了几个。装完模块先回参数里核对一遍起始 XY,再往下走。
2.2 开关设置:CH2 的协议类型与传输速率要跟从站逐项对上
双击"开关设置",进入通道设置界面,选中 CH2。这里有个型号层面的前提:QJ71C24N 是 CH1 走 RS-232、CH2 走 RS-422/485 的组合模块,要跑两线 485 总线只能用 CH2;如果手上是 R2 型号,两路都是 RS-232,根本接不了 485 总线,这个坑最好在拆包装前就排掉。
具体设置分三块。运行设置里把 CH2 的工作方式切到"通信协议设置",让模块按通信协议支持功能里建的协议表干活,而不是走无顺序协议;通信协议设置里选 MODBUS RTU;通信速度按从站设备的参数页填,9600、19200、38400 都是常见值,必须跟变频器或仪表那一侧完全一致。
数据格式通常是 8 位数据位、1 位停止位、偶校验或者无校验,MODBUS RTU 对这三种组合都支持,但主从两侧必须一样。校验位不一致的典型表现是:能收到回包,但每个字节都错,读回来的数值是乱的。改完记得点设置结束或者应用,不点的话窗口一关就白改。
提示:波特率改完必须重新做一次模块写入,模块不会实时感知你改了参数。很多人改完速率直接去试通信,发现还是原来的速率,就是漏了这一步。
2.3 通信协议支持功能:把功能码 03 建成一张可执行的协议表
这里要说清楚为什么用通信协议支持功能,而不是无顺序协议。走无顺序协议,报文要自己拼、CRC 要自己算、回包要自己拆,CPU 侧要写一大堆字节操作;走通信协议支持功能,模块内部已经内置了 MODBUS RTU 的报文格式和 CRC 校验,CPU 只需要把站号、寄存器地址、点数这些参数丢进控制数据区,模块自己组包、自己校验、自己回填结果。开发量差一个数量级,稳定性也更好。
操作路径是:工具 → 通信协议支持功能 → 串行通信模块,出现协议列表窗口后点新建,再点添加,在协议名一栏里选 MODBUS RTU 的功能码。本例第一个协议选"读保持寄存器"功能码 03,确定后窗口里会多出一行记录,协议编号就是后面程序里要填的编号。
需要读频率和电压之外还要写给定频率的,可以继续点添加,选功能码 06(写单寄存器)或者 16(写多个寄存器)。每加一个协议都会分到一个编号,这个编号与功能码的对应关系建议直接抄在纸上或者记在工程注释里,写程序时要用。
协议添加完了还要做软元件分配:点编辑 → 软元件批量设置,输入起始软元件号,比如 D7000,软件会自动把协议执行编号区、控制数据区、接收数据区排开。设完点工具 → 设置软元件一览显示,能看到完整的软元件分配表,包括本例里 D7052 起的协议执行编号寄存器区。这张表要截图留着,后面写程序、查收数据都靠它。
2.4 模块写入:参数生效的最后一公里
参数和协议都配置好之后,点在线 → 模块写入,选择正确的模块,执行写入。写完会弹提示框,确认之后模块才会按新参数运行。这一步和"写入可编程控制器"是两码事:模块写入是把智能功能模块的参数、协议表烧进模块本身,写入 PLC 是下载梯形图程序。两件事都要做,少一件都不通。
写入完成后建议把 CPU 复位一次或者给模块断电重启,让参数彻底生效。现场遇到过改完参数提示写入成功、但实际还在跑旧波特率的情况,复位一次就正常了,这种玄学问题多数是模块没吃透新参数。
3. G.CPRTCL 与软元件分配:D7000 起这块控制区怎么排才不出错
3.1 控制数据区的排布逻辑,先看懂再抄
G.CPRTCL 是通信协议支持功能的核心指令,它做的事情是:按照你在模块里建好的协议表,拿控制数据区里的参数组一帧报文发出去,收到回包后把数据填到接收区,最后在完成标志位上报一个结果。CPU 侧全程不碰字节,只跟软元件打交道。
这份实例里的控制数据从 D7000 开始:D7000 放外部设备的 MODBUS 地址(也就是从站站号),D7001 放要访问的寄存器地址,D7002 放读取或写入的点数。三个字,对应一帧报文里最关键的三个字段。读变频器的频率和电压,就是把站号丢进 D7000,把 0024H 丢进 D7001,把 K2 丢进 D7002,然后触发指令。
接收数据紧跟在控制区之后,具体偏移以软元件一览里显示的为准,不同软件版本、不同起始软元件号会略有差异,别凭记忆写偏移量。我一般会在软元件一览窗口把接收区起始地址抄下来,标在梯形图注释里,后面读数直接按注释取。
提示:控制数据区和接收区是连续占用的,规划软元件时前后各留出几十个点的余量。后面加第二、第三个协议的时候,控制区一扩,原来挨着放的中间变量就被覆盖了,这种事故排查起来极其难受。
3.2 G.CPRTCL 的五个参数逐项拆开
指令格式是 G.CPRTCL Un n1 n2 (S) (D),五个参数每个都有明确含义,错一个就不通。
Un 是模块的起始 I/O 编号,对应智能功能模块参数里那个四位 XY 地址。本例模块分配在 0090,Un 就填 H90。换槽位、改底板之后这里必须跟着改,这是现场最高频的一类错误。
n1 是通信端口号,1 代表 CHANNEL 1,2 代表 CHANNEL 2。本例走 485 两线,所以填 2。填错端口最典型的症状是:模块上 CH2 的收发灯一闪一闪,程序却永远等不到完成,因为数据全从 CH1 出去了。
n2 是连续执行的协议个数,指从控制数据里的第一个协议编号开始,连续执行几个协议。只读一组数据就填 1;如果一次要读频率电压、再读一遍报警码,可以把两个协议编号连着排,n2 填 2,模块会按顺序执行完再统一给完成标志。
(S) 是控制数据保存的起始地址,本例是 D7000。这个地址由软元件批量设置决定,改过起始软元件号的话这里要同步改。
(D) 是通信结束时的标志位,通信正常完成置 ON。按指令说明,(D)+1 是异常完成标志,通信失败时置 ON,具体的错误代码在控制数据区里能查到。写程序时两个标志都要接,只看完成标志不看异常标志,出问题时就是纯黑匣子。
3.3 读保持寄存器 03 的完整程序段
下面这段是读变频器 0024H 起两个寄存器的实际写法,注释里标了每个值的来源:
; 读变频器 0024H(输出频率)、0025H(输出电压),CH2,协议编号 1 MOV H1 D7000 ; 从站站号,按变频器参数页里的 MODBUS 地址填 MOV H24 D7001 ; 保持寄存器起始地址 0024H MOV K2 D7002 ; 连续读 2 个寄存器 SET M100 ; 触发条件,上升沿执行一次 LD M100 G.CPRTCL H90 K2 K1 D7000 M200 ; H90 模块起始 I/O 编号(本例分配在 0090) ; K2 端口号,CH2 ; K1 连续执行 1 个协议 ; D7000 控制数据起始地址 ; M200 完成标志,M201 为异常完成标志逻辑上分两段:前三行是准备参数,把站号、寄存器地址、点数摆好;后面是触发执行,M100 置位后指令开始跑,跑完 M200 置 ON。实际用法一般是把 M200 接到复位 M100 的回路上,形成"置位—执行—完成—复位—再置位"的循环,这样才有稳定的周期刷新。
参数说明里几个容易出问题的地方:D7001 里填的是十六进制寄存器地址,H24 对应 0024H,别填成十进制 24;D7002 是点数,读两个寄存器填 K2,填多了会读到相邻的无效寄存器,从站可能直接返回异常码。
3.4 写寄存器的程序段与多协议连续执行
写功能码 06 是单寄存器写入,控制区结构跟读类似,多了一步把要写的数据放进发送数据区。数据区的起始地址同样以软元件一览为准,别和接收区混用:
; 写变频器频率给定,功能码 06,协议编号 2 MOV H1 D7010 ; 从站站号(第二组控制区起点,与读操作错开) MOV H01 D7011 ; 写入目标寄存器地址,按从站手册填 MOV K1 D7012 ; 写 1 个寄存器 MOV K5000 D7013 ; 写入值,标度按手册换算(示例为 50.00Hz 的原始码) SET M110 LD M110 G.CPRTCL H90 K2 K1 D7010 M210这里刻意把写操作的控制区从 D7010 开始,跟读操作的 D7000 分开。读写共用同一块控制区、靠切换功能码来实现的做法看着省软元件,实际上很容易在时序上打架——写还没完成,读的触发条件就把它覆盖了。
一个 G.CPRTCL 指令最多可以连续执行 8 个协议,协议编号依次放在 D7052 起的连续 8 个字里,D7052 是第一次执行的协议编号,D7053 是第二次,一直排到 D7059 对应第八次。这个区域是软元件批量设置自动分配的,改了起始软元件号会整体平移,程序里的引用要跟着改。
4. 接线与从站对齐:0024H 读频率电压这条路怎么调通
4.1 RS-485 两线接法:把四线并成两线,再把屏蔽和终端处理掉
QJ71C24N 的 CH2 出的是 RS-422/485 四线端子:SDA、SDB 是一对发送,RDA、RDB 是一对接收。两线半双工接法要把模块侧的发送和接收并起来,SDA 与 RDA 短接成 A,SDB 与 RDB 短接成 B,然后 A 接从站 A、B 接从站 B。
现场最容易翻车的是 A/B 极性。不同厂商对 A、B 的定义是反的,有的把 A 叫正端,有的叫负端。接反了通信完全不通,也不报错,收发灯该闪还是闪,就是收不到正确回包。遇到怎么调都不通的新设备,把 A、B 对调试一次,是成本最低的排查手段。
屏蔽层和接地也要处理:线缆屏蔽层单端接地,一般接在 PLC 柜这一侧,另一头悬空,两头都接会形成环流,长距离时干扰明显。总线两端各挂一只 110~150Ω 的终端电阻,中间节点不要挂;距离短、设备少的时候可以先不加,但布线超过几十米、或者现场有变频器这类干扰源,终端电阻最好老老实实装上。
站号、波特率、校验、停止位这四项,主从两侧必须完全一致。变频器侧一般在参数页里有专门一组通信参数,改完要断电重启或者执行参数保存,只在面板上改不保存是没有用的。
4.2 用 0024H 读频率和电压:地址对了,标度还得对
变频器的 MODBUS 寄存器地图里,输出频率和输出电压通常是相邻的两个保持寄存器,本例是 0024H 和 0025H。程序里就是 MOV H24 D7001、MOV K2 D7002 两行,读回来的两个数落在接收区连续两个软元件里。
数据读回来不等于活干完了,还有标度换算。多数变频器的频率寄存器标度是 0.01Hz,读到 5000 表示 50.00Hz;电压标度可能是 0.1V 或者 1V,不同厂商、不同系列都不一样。这个必须以变频器手册的数据表为准,凭经验直接除 100 很容易出现差十倍的问题,而且这种错误在数值上"看起来很合理",不容易被发现。本例对接的是某品牌 A1000 系列变频器,具体寄存器和标度以该系列手册的通信数据表为准。
如果读回来的数明显不对,先看是不是高低字节顺序的问题。有些设备返回的是高字在前,有些是低字在前,32 位数据拼接顺序反了会得到一个完全离谱的数值。用 SWAP 指令或者手动调换两个字的顺序就能验证。
4.3 联调顺序:先单点通,再上量
联调别一上来就接整条总线。先在实验台上用一个模块、一台从站、一米线,把单个寄存器的读通,确认站号、波特率、校验、寄存器地址、标度全部正确,再接现场总线。
上量之后如果出现部分设备偶尔读不到,先查终端电阻和接地,再查总线拓扑有没有星形分支——485 总线要求手拉手串下去,星形接法在分支点会产生反射,短距离看不出问题,长距离就是随机丢包。最后再查是不是轮询间隔太短,从站来不及处理下一帧。
5. 避坑与排查:五条现场翻车记录的现象、原因和解决
5.1 现象:G.CPRTCL 执行后完成标志一直不 ON
原因排下来最常见的是 Un 参数和模块实际起始 I/O 编号不一致。中途改过槽位、加过扩展模块、或者从别人的工程里拷了程序段,都会导致这个号错位。指令照样执行,只是它对着一个不存在的模块发数据,当然不会完成。
解决方式是回到参数里的智能功能模块设置,看起始 XY 到底分配成了多少,把 G.CPRTCL 的 Un 和 TOP 指令的目标一起改过来。改完记得重新做模块写入,参数和程序两边都对齐了才算完。另一个次要原因是触发条件用了电平而不是上升沿,导致指令被反复重入,这种情况把触发改成脉冲或者加个自复位回路就好。
5.2 现象:偶尔能读到数据,多数时候超时,收发灯乱闪
这是典型的回波问题。两线半双工接法下,模块自己发出去的数据会被自己的接收端听到,如果模块把这段回显当成从站的应答,协议判别就会错乱,表现就是时通时不通,或者读回来的数全是错的。
解决办法是把回波传送禁掉。实例里用一句 TOP 指令向模块的缓冲存储器写一个禁止回波的设置,目标缓冲地址是 1C2H,写一个点:
; 禁止 CH2 回波传送,模块起始 I/O 0090 ; TOP Un S1 S2 n :Un=模块起始I/O,S1=缓冲地址,S2=写入值,n=点数 TOP H90 H1C2 K1 K1这段一般放在程序的最前面,用常 ON 触点或者初始化脉冲执行一次即可。注意 Un 同样要跟模块实际起始 I/O 编号一致;有的资料里把它简写成 H9,抄之前先核对自己模块分配到的到底是 0090 还是别的号,别照抄。
5.3 现象:第一次读成功,之后再也不刷新
原因是完成标志没有参与握手。指令跑完 M200 置 ON 之后一直保持,触发条件 M100 也一直是置位状态,第二次执行的条件根本不存在,数据就停在第一次的结果上,看起来像是"卡住了"。
解决思路很简单:把完成标志接回来复位触发条件。M200 或 M201 任意一个 ON,就复位 M100,同时复位完成标志本身,下一个扫描周期重新置位触发。做成周期轮询的话,中间再加一个定时器控制轮询间隔,别让指令一个扫描周期接一个扫描周期地连发,从站扛不住这种节奏。
5.4 现象:读回来的数值差十倍或者完全离谱
数值差整十倍,基本是标度没换算。变频器频率寄存器多数是 0.01Hz 标度,读到 5000 除以 100 才是 50.00Hz,直接按 1Hz 理解就变成 5000Hz。数值离谱到不成样子,优先怀疑高低字节顺序反了,或者读的寄存器地址偏了一位、读到了相邻的其他参数。
解决方式是按从站手册的通信数据表逐项核对寄存器地址和标度,别凭经验。16 位数据用 SWAP 指令验证字节序,32 位数据要确认高字低字的拼接顺序。这类错误不会报通信异常,只能靠对数发现,所以第一次读数一定要跟变频器面板显示的实际值对一遍。
5.5 现象:参数改完、程序也下载了,通信还是按老参数跑
模块写入和 PLC 程序写入是两条独立的路径,只做了后者,模块里的协议表和通信参数还是旧的。另一种情况是模块写入时选错了模块,多模块系统里点错了目标,参数写到了隔壁模块上。
解决方式是在线 → 模块写入,看清楚目标模块的起始 I/O 编号再执行,写完按提示确认,然后给 CPU 复位一次或者模块断电重启。做完之后打开模块参数窗口回读一遍,确认波特率、协议号、软元件分配都跟预期一致,再去看程序逻辑。
6. 从跑通到复用:轮询状态机与失败重试的两段写法
单次读通只是验证链路,真正上线要的是稳定轮询。我一般不用"完成就复位、复位就再触发"这种裸写法,而是加一个小的状态机:等待 → 发送 → 等待完成 → 取数 → 冷却,五个状态各占一个软元件位,冷却用定时器控制。
; 精简轮询骨架:ST0 空闲,ST1 触发,ST2 等完成,ST3 取数,ST4 冷却 LD M8000 ; 常 ON ANI M300 ; 冷却未结束 ANI M301 ; 无异常挂起 SET M100 ; 触发一次协议执行 LD M200 ; 正常完成 SET M310 ; 置取数请求,交给后续处理 RST M100 LD M201 ; 异常完成 RST M100 INC D8000 ; 异常计数器,用于判断是否需要告警 LD M310 OUT T10 K50 ; 冷却 5 秒,按从站响应能力调整 LD T10 RST M310这段骨架的关键点有三个。一是异常分支必须接,M201 一置位就复位触发,同时累加一个计数器,连续失败超过阈值再输出告警,避免一次偶发干扰就停机。二是冷却定时器的时间要按从站的实际响应能力给,变频器这类从站处理一帧需要几十毫秒,轮询间隔压到几十毫秒会看到随机超时。三是取数请求(M310)要和数据处理逻辑解耦,取数和换算分开写,后面加第二条协议的时候直接复制这套骨架就行。
重试逻辑建议做成阶梯式的:第一次失败立即重试一次,还失败就等一个完整冷却周期再试,连续三次失败才置告警位。现场干扰大多是瞬时的,无脑重试能把大部分偶发超时吃掉,又不会因为从站真掉线而疯狂刷总线。
有一个习惯我保持了挺久:每接一个新从站,先在实验台上用最短的线、最低的波特率(9600)把单个寄存器读通,把标度对完,再上现场改速率、加节点。从那以后我每次改完模块参数都强制走一遍"模块写入 → 复位 → 回读参数核对",再去看程序跑不跑,因为血泪经验告诉我,八成的不通都出在参数没生效和 Un 填错这两件事上,而不是程序逻辑写错了。希望帮到你。
本文还有配套的精品资源,点击获取